diff --git a/docker/daytona-runner/Dockerfile b/docker/daytona-runner/Dockerfile index 67e88e6fa0..788d145326 100644 --- a/docker/daytona-runner/Dockerfile +++ b/docker/daytona-runner/Dockerfile @@ -134,7 +134,7 @@ RUN /bin/sh -lc 'set -eu; \ command -v "$command_name" >/dev/null || { echo "FATAL: $command_name not on PATH for daytona user" >&2; exit 1; }; \ done; \ test "$(acpx --version)" = "0.13.1"; \ - test "$(claude-agent-acp --version)" = "0.70.0"; \ + test "$(claude-agent-acp --version)" = "0.73.0"; \ test "$(codex-acp --version)" = "@agentclientprotocol/codex-acp 1.6.2"' LABEL io.paperclip.runner.content-id="${PAPERCLIP_RUNNER_CONTENT_ID}" \ diff --git a/package.json b/package.json index ecd59d6783..40fc577d2c 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,6 @@ "embedded-postgres@18.1.0-beta.16": "patches/embedded-postgres@18.1.0-beta.16.patch", "acpx@0.12.0": "patches/acpx@0.12.0.patch", "acpx@0.13.1": "patches/acpx@0.13.1.patch", - "@agentclientprotocol/claude-agent-acp@0.70.0": "patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch", "@agentclientprotocol/claude-agent-acp@0.73.0": "patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch", "@agentclientprotocol/codex-acp@1.6.2": "patches/@agentclientprotocol__codex-acp@1.6.2.patch", "@chat-adapter/telegram@4.39.0": "patches/@chat-adapter__telegram@4.39.0.patch", @@ -114,7 +113,7 @@ }, "overrides": { "@agentclientprotocol/codex-acp@1.6.2>@openai/codex": "0.153.4", - "@agentclientprotocol/claude-agent-acp@0.70.0>@anthropic-ai/claude-agent-sdk": "0.3.263", + "@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk": "0.3.263", "rollup": ">=4.59.0", "react": "^19.2.8", "react-dom": "^19.2.8" diff --git a/packages/paperclip-runner/package.json b/packages/paperclip-runner/package.json index 2a92f8850d..7aa8d1b264 100644 --- a/packages/paperclip-runner/package.json +++ b/packages/paperclip-runner/package.json @@ -157,7 +157,7 @@ "verify:rootless": "bash scripts/verify-rootless-linux.sh" }, "dependencies": { - "@agentclientprotocol/claude-agent-acp": "0.70.0", + "@agentclientprotocol/claude-agent-acp": "0.73.0", "@agentclientprotocol/codex-acp": "1.6.2", "@openai/codex": "0.153.4", "acpx": "0.13.1", diff --git a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs index 79fa00941c..3b0b63cbed 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs @@ -145,7 +145,7 @@ impl AcpxProviderDescriptor { "claude" => ( "claude-sonnet-5", "@agentclientprotocol/claude-agent-acp", - "0.70.0", + "0.73.0", Some("@anthropic-ai/claude-agent-sdk"), Some("0.3.263"), "sha256:9d73d1f0f121fb96cc8badb28c22d5bff02d8582eb2e40360a81c189e1b9422a", @@ -1764,7 +1764,7 @@ mod tests { ( "claude-sonnet-5", "@agentclientprotocol/claude-agent-acp", - "0.70.0", + "0.73.0", json!("@anthropic-ai/claude-agent-sdk"), json!("0.3.263"), "sha256:9d73d1f0f121fb96cc8badb28c22d5bff02d8582eb2e40360a81c189e1b9422a", diff --git a/packages/paperclip-runner/scripts/build-provider-pack.mjs b/packages/paperclip-runner/scripts/build-provider-pack.mjs index 396c44d01d..3b5e3fb18a 100644 --- a/packages/paperclip-runner/scripts/build-provider-pack.mjs +++ b/packages/paperclip-runner/scripts/build-provider-pack.mjs @@ -293,7 +293,7 @@ try { codex: "0.153.4", opencode: "1.18.29", acpx: "0.13.1", - claudeAcp: "0.70.0", + claudeAcp: "0.73.0", codexAcp: "1.6.2", }, target: { platform: process.platform, architecture: process.arch }, diff --git a/packages/paperclip-runner/src/backends/native-backend-factory.test.ts b/packages/paperclip-runner/src/backends/native-backend-factory.test.ts index 83cd717ac4..7671cfc7f0 100644 --- a/packages/paperclip-runner/src/backends/native-backend-factory.test.ts +++ b/packages/paperclip-runner/src/backends/native-backend-factory.test.ts @@ -93,7 +93,7 @@ function acpxExecution( ? "pi-acp" : "@agentclientprotocol/claude-agent-acp", agentServerVersion: - agent === "codex" ? "1.6.2" : agent === "pi" ? "0.0.33" : "0.70.0", + agent === "codex" ? "1.6.2" : agent === "pi" ? "0.0.33" : "0.73.0", agentRuntimePackage: agent === "pi" ? "@earendil-works/pi-coding-agent" diff --git a/packages/paperclip-runner/src/conformance/local-provider-fault-matrix.test.ts b/packages/paperclip-runner/src/conformance/local-provider-fault-matrix.test.ts index 5a21d6bd8d..74419455b0 100644 --- a/packages/paperclip-runner/src/conformance/local-provider-fault-matrix.test.ts +++ b/packages/paperclip-runner/src/conformance/local-provider-fault-matrix.test.ts @@ -70,7 +70,7 @@ const RUNNERD_FACADE_PROFILES = [ agent: "claude", agentProfileVersion: 1, agentServerPackage: "@agentclientprotocol/claude-agent-acp", - agentServerVersion: "0.70.0", + agentServerVersion: "0.73.0", agentRuntimePackage: null, agentRuntimeVersion: null, commandDigest: `sha256:${"a".repeat(64)}`, diff --git a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts index ba6edb6c57..03639aab7a 100644 --- a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts +++ b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.test.ts @@ -440,7 +440,7 @@ describe("ACPX installation integrity", () => { const dependencyFixtures = [ { name: "@agentclientprotocol/sdk", - version: "1.3.0", + version: "1.4.0", directory: join(dependencyRoot, "agentclient-sdk"), }, { @@ -468,13 +468,13 @@ describe("ACPX installation integrity", () => { fixture.serverPackageJsonPath, JSON.stringify({ name: "@agentclientprotocol/claude-agent-acp", - version: "0.70.0", + version: "0.73.0", type: "module", bin: "bin/server.js", dependencies: { - "@agentclientprotocol/sdk": "1.3.0", - "@anthropic-ai/claude-agent-sdk": "0.3.263", - zod: "^3.25.0 || ^4.0.0", + "@agentclientprotocol/sdk": "1.4.0", + "@anthropic-ai/claude-agent-sdk": "0.3.257", + zod: "^4.0.0", }, }), ), @@ -539,13 +539,13 @@ describe("ACPX installation integrity", () => { await writeFile( fixture.serverPackageJsonPath, JSON.stringify({ - version: "0.70.0", + version: "0.73.0", type: "module", bin: "bin/server.js", dependencies: { - "@agentclientprotocol/sdk": "1.3.0", - "@anthropic-ai/claude-agent-sdk": "0.3.263", - zod: "^3.25.0 || ^4.0.0", + "@agentclientprotocol/sdk": "1.4.0", + "@anthropic-ai/claude-agent-sdk": "0.3.257", + zod: "^4.0.0", }, }), ); diff --git a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts index 48df9eacdf..e65d90c947 100644 --- a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts +++ b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts @@ -87,18 +87,23 @@ const QUALIFIED_CODEX_LINUX_X64_RUNTIME = Object.freeze({ const QUALIFIED_CLAUDE_PROVIDER_DEPENDENCIES = Object.freeze([ Object.freeze({ packageName: "@agentclientprotocol/sdk", - packageVersion: "1.3.0", - dependencyDeclaration: "1.3.0", + packageVersion: "1.4.0", + dependencyDeclaration: "1.4.0", }), Object.freeze({ packageName: "@anthropic-ai/claude-agent-sdk", packageVersion: "0.3.263", - dependencyDeclaration: "0.3.263", + // The package's own package.json still declares 0.3.257 — 0.3.263 is + // only what pnpm resolves, forced by the + // "claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk" override in + // the workspace root. This field binds the declared string, not the + // resolved one; packageVersion above binds the resolved install. + dependencyDeclaration: "0.3.257", }), Object.freeze({ packageName: "zod", packageVersion: "4.4.3", - dependencyDeclaration: "^3.25.0 || ^4.0.0", + dependencyDeclaration: "^4.0.0", }), ]); diff --git a/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts b/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts index 05f7bb2233..ee54598b11 100644 --- a/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts +++ b/packages/paperclip-runner/src/drivers/acpx/qualified-profiles.ts @@ -54,7 +54,7 @@ export const QUALIFIED_ACPX_PROFILES: Readonly< agent: "claude", agentProfileVersion: 1, agentServerPackage: "@agentclientprotocol/claude-agent-acp", - agentServerVersion: "0.70.0", + agentServerVersion: "0.73.0", agentRuntimePackage: "@anthropic-ai/claude-agent-sdk", agentRuntimeVersion: "0.3.263", commandDigest: diff --git a/packages/paperclip-runner/src/protocol/provider-descriptor.test.ts b/packages/paperclip-runner/src/protocol/provider-descriptor.test.ts index e8a0836868..a4f1be6acd 100644 --- a/packages/paperclip-runner/src/protocol/provider-descriptor.test.ts +++ b/packages/paperclip-runner/src/protocol/provider-descriptor.test.ts @@ -20,7 +20,7 @@ describe("provider runtime descriptor", () => { agentProcessId: 41002, acpProtocolVersion: 1, agentServerPackage: "@agentclientprotocol/claude-agent-acp", - agentServerVersion: "0.70.0", + agentServerVersion: "0.73.0", agentRuntimePackage: null, agentRuntimeVersion: null, acpxRecordId: "acpx-record-1", diff --git a/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs b/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs index ba76786d85..ab9e5ad6f7 100644 --- a/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs +++ b/packages/paperclip-runner/test/acpx-codex-package-contract.test.mjs @@ -28,7 +28,7 @@ const codexPatch = await readFile( ); const claudePatch = await readFile( new URL( - "../../../patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch", + "../../../patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch", import.meta.url, ), "utf8", @@ -60,7 +60,7 @@ test("the runner pins every qualified ACPX production dependency", () => { assert.equal(runnerPackage.dependencies["@openai/codex"], "0.153.4"); assert.equal(runnerPackage.dependencies["@anthropic-ai/claude-agent-sdk"], undefined); assert.equal(rootPackage.pnpm.overrides["@agentclientprotocol/codex-acp@1.6.2>@openai/codex"], runnerPackage.dependencies["@openai/codex"]); - assert.equal(rootPackage.pnpm.overrides["@agentclientprotocol/claude-agent-acp@0.70.0>@anthropic-ai/claude-agent-sdk"], "0.3.263"); + assert.equal(rootPackage.pnpm.overrides["@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk"], "0.3.263"); assert.equal(runnerPackage.optionalDependencies, undefined); assert.equal(runnerPackage.dependencies.node, undefined); assert.equal(runnerPackage.dependencies.acpx, "0.13.1"); @@ -70,7 +70,7 @@ test("the runner pins every qualified ACPX production dependency", () => { ); assert.equal( runnerPackage.dependencies["@agentclientprotocol/claude-agent-acp"], - "0.70.0", + "0.73.0", ); }); @@ -117,9 +117,9 @@ test("old and new pnpm configuration both apply the exact runtime patches", () = ); assert.equal( rootPackage.pnpm.patchedDependencies[ - "@agentclientprotocol/claude-agent-acp@0.70.0" + "@agentclientprotocol/claude-agent-acp@0.73.0" ], - "patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch", + "patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch", ); assert.equal( rootPackage.pnpm.patchedDependencies[ @@ -134,7 +134,7 @@ test("old and new pnpm configuration both apply the exact runtime patches", () = ); assert.match( workspace, - /claude-agent-acp@0\.70\.0["']: patches\/@agentclientprotocol__claude-agent-acp@0\.70\.0\.patch/, + /claude-agent-acp@0\.73\.0["']: patches\/@agentclientprotocol__claude-agent-acp@0\.73\.0\.patch/, ); assert.equal(rootPackage.pnpm.patchedDependencies["node@24.11.0"], undefined); assert.doesNotMatch(workspace, /node@24\.11\.0:/); diff --git a/patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch b/patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch deleted file mode 100644 index 61e20c5692..0000000000 --- a/patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch +++ /dev/null @@ -1,73 +0,0 @@ -diff --git a/dist/acp-agent.js b/dist/acp-agent.js ---- a/dist/acp-agent.js -+++ b/dist/acp-agent.js -@@ -2681,10 +2681,20 @@ - cost: { - amount: message.total_cost_usd, - currency: "USD", - }, -- ...(message.origin && { -- _meta: { "_claude/origin": message.origin }, -- }), -+ _meta: { -+ ...(message.origin && { "_claude/origin": message.origin }), -+ // ACP's core Usage shape exposes context occupancy and -+ // cost, but not the billable input/output split. Keep the -+ // SDK's bounded aggregate in extension metadata so ACPX can -+ // normalize it without persisting a raw provider message. -+ usage: { -+ input_tokens: message.usage.input_tokens, -+ output_tokens: message.usage.output_tokens, -+ cache_read_input_tokens: message.usage.cache_read_input_tokens, -+ cache_creation_input_tokens: message.usage.cache_creation_input_tokens, -+ }, -+ }, - }, - }); - } -@@ -4866,8 +4876,12 @@ - const options = { - systemPrompt, - settingSources: ["user", "project", "local"], - ...(thinking !== undefined && { thinking }), - ...userProvidedOptions, -+ // Paperclip Runner owns the complete session context. Its isolated -+ // user root contains only assigned skills; project/local settings -+ // would reintroduce host prompts, plugins, skills, and MCP servers. -+ ...(process.env.PAPERCLIP_ACPX_ISOLATED_CONTEXT === "1" && { settingSources: ["user"] }), - ...(settings && { settings }), - env, - // Override certain fields that must be controlled by ACP -@@ -4875,7 +4889,9 @@ - includePartialMessages: true, - forwardSubagentText, - mcpServers: { -- ...(userProvidedOptions?.mcpServers || {}), -+ ...(process.env.PAPERCLIP_ACPX_ISOLATED_CONTEXT === "1" -+ ? {} -+ : (userProvidedOptions?.mcpServers || {})), - ...mcpServers, - ...(fileChangeAuditSupport - ? { [FILE_CHANGE_AUDIT_SERVER_NAME]: fileChangeAuditSupport.mcpServer } -@@ -3776,6 +3776,11 @@ - ? option.options.flatMap((o) => ("options" in o ? o.options : [o])) - : []; - let validValue = allValues.find((o) => o.value === params.value); -+ // Paperclip's model field is an exact provider request, not a fuzzy picker -+ // search. Forward custom IDs to the SDK and let the provider reject them. -+ if (params.configId === MODEL_CONFIG_ID && process.env.PAPERCLIP_ACPX_ISOLATED_CONTEXT === "1" && params.value.trim()) { -+ validValue = { value: params.value, name: params.value }; -+ } - // The option's reported currentValue is always a valid target, even when - // it has no options entry: a session running an out-of-picker model - // (resumed onto an allowlist-excluded model, or a refusal fallback) -diff --git a/package.json b/package.json ---- a/package.json -+++ b/package.json -@@ -65,5 +65,5 @@ - "dependencies": { - "@agentclientprotocol/sdk": "1.3.0", -- "@anthropic-ai/claude-agent-sdk": "0.3.232", -+ "@anthropic-ai/claude-agent-sdk": "0.3.263", - "zod": "^3.25.0 || ^4.0.0" - }, diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 127c36850f..bec2de453b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,7 +19,6 @@ patchedDependencies: embedded-postgres@18.1.0-beta.16: patches/embedded-postgres@18.1.0-beta.16.patch acpx@0.12.0: patches/acpx@0.12.0.patch acpx@0.13.1: patches/acpx@0.13.1.patch - "@agentclientprotocol/claude-agent-acp@0.70.0": patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch "@agentclientprotocol/claude-agent-acp@0.73.0": patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch "@agentclientprotocol/codex-acp@1.6.2": patches/@agentclientprotocol__codex-acp@1.6.2.patch "@chat-adapter/slack@4.39.0": patches/@chat-adapter__slack@4.39.0.patch @@ -33,7 +32,7 @@ patchedDependencies: # pnpm patches change package files, but overrides control dependency resolution. overrides: "@agentclientprotocol/codex-acp@1.6.2>@openai/codex": "0.153.4" - "@agentclientprotocol/claude-agent-acp@0.70.0>@anthropic-ai/claude-agent-sdk": "0.3.263" + "@agentclientprotocol/claude-agent-acp@0.73.0>@anthropic-ai/claude-agent-sdk": "0.3.263" rollup: ">=4.59.0" react: "^19.2.8" react-dom: "^19.2.8" diff --git a/scripts/acpx-patch-packaging.test.mjs b/scripts/acpx-patch-packaging.test.mjs index fe9a9f7008..7502350e16 100644 --- a/scripts/acpx-patch-packaging.test.mjs +++ b/scripts/acpx-patch-packaging.test.mjs @@ -45,7 +45,7 @@ const acpxRuntimePatch = await readFile( "utf8", ); const claudeAcpPatch = await readFile( - new URL("../patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch", import.meta.url), + new URL("../patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch", import.meta.url), "utf8", ); @@ -127,11 +127,11 @@ test("published packages preserve the patched ACPX runtime", () => { test("Paperclip Runner pins the qualified ACPX host callbacks", () => { assert.equal(rootPackage.pnpm.patchedDependencies["acpx@0.13.1"], "patches/acpx@0.13.1.patch"); assert.equal( - rootPackage.pnpm.patchedDependencies["@agentclientprotocol/claude-agent-acp@0.70.0"], - "patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch", + rootPackage.pnpm.patchedDependencies["@agentclientprotocol/claude-agent-acp@0.73.0"], + "patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch", ); assert.equal(runnerPackage.dependencies.acpx, "0.13.1"); - assert.equal(runnerPackage.dependencies["@agentclientprotocol/claude-agent-acp"], "0.70.0"); + assert.equal(runnerPackage.dependencies["@agentclientprotocol/claude-agent-acp"], "0.73.0"); assert.equal(runnerPackage.dependencies["@agentclientprotocol/codex-acp"], "1.6.2"); for (const callback of [ "spawnEnvironment", "spawnCwd", "spawnAgent", "isPlainStringEnvironment", diff --git a/server/src/services/native-runtime/native-session-executor.test.ts b/server/src/services/native-runtime/native-session-executor.test.ts index 279b9acfab..4fca662229 100644 --- a/server/src/services/native-runtime/native-session-executor.test.ts +++ b/server/src/services/native-runtime/native-session-executor.test.ts @@ -700,7 +700,7 @@ describe("remote provider pack manifest", () => { codex: "0.153.4", opencode: "1.18.29", acpx: "0.13.1", - claudeAcp: "0.70.0", + claudeAcp: "0.73.0", codexAcp: "1.6.2", }, target: { platform: "linux", architecture: "x64" }, diff --git a/server/src/services/native-runtime/native-session-executor.ts b/server/src/services/native-runtime/native-session-executor.ts index f980613437..e06074db2f 100644 --- a/server/src/services/native-runtime/native-session-executor.ts +++ b/server/src/services/native-runtime/native-session-executor.ts @@ -8472,7 +8472,7 @@ const REMOTE_PROVIDER_PACK_PINS = { codex: "0.153.4", opencode: "1.18.29", acpx: "0.13.1", - claudeAcp: "0.70.0", + claudeAcp: "0.73.0", codexAcp: "1.6.2", } as const; const REMOTE_PROVIDER_PACK_PROFILE_DIGESTS = {