diff --git a/packages/adapters/claude-local/src/server/execute.acp-fallback.test.ts b/packages/adapters/claude-local/src/server/execute.acp-fallback.test.ts index a096d91372..bf7baafcbe 100644 --- a/packages/adapters/claude-local/src/server/execute.acp-fallback.test.ts +++ b/packages/adapters/claude-local/src/server/execute.acp-fallback.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const { ensureAdapterExecutionTargetCommandResolvable, @@ -89,6 +89,10 @@ describe("claude_local ACP startup fallback", () => { vi.clearAllMocks(); }); + afterEach(() => { + vi.unstubAllEnvs(); + }); + it("falls back to Claude CLI when auto-selected ACP fails before execution starts", async () => { const ctx = buildContext(); @@ -107,6 +111,28 @@ describe("claude_local ACP startup fallback", () => { ); }); + it("trusts the Paperclip API URL when network access is allowlisted", async () => { + const paperclipApiUrl = "http://127.0.0.1:4310"; + vi.stubEnv("PAPERCLIP_RUNTIME_API_URL", paperclipApiUrl); + const ctx = buildContext({ networkScope: "allowlist" }); + + await execute(ctx as never); + + expect(runAdapterExecutionTargetProcess).toHaveBeenCalledTimes(1); + expect(runAdapterExecutionTargetProcess).toHaveBeenCalledWith( + expect.any(String), + null, + expect.any(String), + expect.any(Array), + expect.objectContaining({ + localProcessSandbox: expect.objectContaining({ + networkScope: "allowlist", + networkTrustedUrls: [paperclipApiUrl], + }), + }), + ); + }); + it("keeps explicit ACP strict when startup fails", async () => { const ctx = buildContext({ engine: "acp" }); diff --git a/packages/adapters/claude-local/src/server/execute.ts b/packages/adapters/claude-local/src/server/execute.ts index 0b5cf697f7..72fdde9545 100644 --- a/packages/adapters/claude-local/src/server/execute.ts +++ b/packages/adapters/claude-local/src/server/execute.ts @@ -543,6 +543,10 @@ export async function execute(ctx: AdapterExecutionContext): Promise server.url), + ].filter((value): value is string => typeof value === "string" && value.length > 0), command: asString(config.filesystemSandboxCommand, "bwrap"), } : null;