diff --git a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_sidecar_transport.rs b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_sidecar_transport.rs index 8a0d8ddcdb1..55f7b253350 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_sidecar_transport.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_sidecar_transport.rs @@ -277,13 +277,14 @@ impl AcpxSidecarTransport { )); } let error = response.error.expect("failed response has validated error"); - return Ok(CommandOutcome::Rejected(LocalRunnerError::invalid(format!( - "ACPX sidecar command {} was rejected (retryable={}, classification={}){}", - command.as_str(), - error.retryable, - response_error_classification(&error), - self.diagnostic_suffix(), - )))); + return Ok(CommandOutcome::Rejected(LocalRunnerError::invalid( + format!( + "ACPX sidecar command {} was rejected (retryable={}, classification={})", + command.as_str(), + error.retryable, + response_error_classification(&error), + ), + ))); } } } @@ -590,13 +591,7 @@ fn nullable_identifier( } fn redact_diagnostic(value: &str) -> String { - if value.starts_with("[paperclip-acpx-launch] ") - && value - .chars() - .all(|character| character.is_ascii_alphanumeric() || "[]-_ ".contains(character)) - { - value.to_owned() - } else if value.is_empty() { + if value.is_empty() { String::new() } else { "[REDACTED]".to_owned() @@ -644,15 +639,6 @@ fn response_error_classification(error: &ResponseError) -> &'static str { "ACPX_MODEL_STATUS_UNAVAILABLE" => return "model_status_unavailable", "ACPX_MODEL_SELECTION_UNAVAILABLE" => return "model_selection_unavailable", "ACPX_EFFECTIVE_MODEL_MISMATCH" => return "effective_model_mismatch", - "PAPERCLIP_ACPX_ADMISSION_RECOVERY_BINDING" => return "admission_recovery_binding", - "PAPERCLIP_ACPX_ADMISSION_INSTALLATION" => return "admission_installation", - "PAPERCLIP_ACPX_ADMISSION_SANDBOX" => return "admission_sandbox", - "PAPERCLIP_ACPX_ADMISSION_CREDENTIAL" => return "admission_credential", - "PAPERCLIP_ACPX_ADMISSION_PROVIDER_LIFETIME" => return "admission_provider_lifetime", - "PAPERCLIP_ACPX_ADMISSION_COMMAND" => return "admission_command", - "PAPERCLIP_ACPX_ADMISSION_TOOL_BRIDGE" => return "admission_tool_bridge", - "PAPERCLIP_ACPX_ADMISSION_RUNTIME" => return "admission_runtime", - "PAPERCLIP_ACPX_ADMISSION_VERIFICATION" => return "admission_verification", _ => {} } match error.message.as_str() { diff --git a/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts b/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts index 83e81101a57..9f508bb2898 100644 --- a/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts +++ b/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts @@ -37,7 +37,6 @@ export function acpxBootstrapBlockedError( export function acpxSidecarErrorCode(error: Error): string { const pending: Error[] = [error]; const observed = new Set(); - let admissionStageCode: string | null = null; while (pending.length > 0 && observed.size < 16) { const current = pending.shift()!; if (observed.has(current)) continue; @@ -46,9 +45,6 @@ export function acpxSidecarErrorCode(error: Error): string { if (code !== null) return code; const details = current as Error & Record; - admissionStageCode ??= acpxAdmissionStageCode( - details.paperclipAcpxAdmissionStage, - ); if (current instanceof AggregateError) { for (const nested of current.errors) { if (nested instanceof Error) pending.push(nested); @@ -56,14 +52,7 @@ export function acpxSidecarErrorCode(error: Error): string { } if (details.cause instanceof Error) pending.push(details.cause); } - return admissionStageCode ?? "acpx_sidecar_command_failed"; -} - -function acpxAdmissionStageCode(value: unknown): string | null { - if (typeof value !== "string" || !ACPX_ADMISSION_STAGES.has(value)) { - return null; - } - return `PAPERCLIP_ACPX_ADMISSION_${value.toUpperCase()}`; + return "acpx_sidecar_command_failed"; } function directAcpxSidecarErrorCode(error: Error): string | null { @@ -140,18 +129,6 @@ const GENERIC_ACPX_OUTPUT_CODES = new Set([ "USAGE", ]); -const ACPX_ADMISSION_STAGES = new Set([ - "recovery_binding", - "installation", - "sandbox", - "credential", - "provider_lifetime", - "command", - "tool_bridge", - "runtime", - "verification", -]); - const STABLE_ACPX_SIDECAR_CODES = new Set([ "ACP_MODEL_UNSUPPORTED", "ACP_SESSION_INIT_FAILED", @@ -184,14 +161,5 @@ const STABLE_ACPX_SIDECAR_CODES = new Set([ "ACPX_SESSION_ENSURE_TYPE_ERROR", "ACPX_SESSION_HANDSHAKE_TIMEOUT", "ACPX_SIDECAR_STATUS_READ_TIMEOUT", - "PAPERCLIP_ACPX_ADMISSION_RECOVERY_BINDING", - "PAPERCLIP_ACPX_ADMISSION_INSTALLATION", - "PAPERCLIP_ACPX_ADMISSION_SANDBOX", - "PAPERCLIP_ACPX_ADMISSION_CREDENTIAL", - "PAPERCLIP_ACPX_ADMISSION_PROVIDER_LIFETIME", - "PAPERCLIP_ACPX_ADMISSION_COMMAND", - "PAPERCLIP_ACPX_ADMISSION_TOOL_BRIDGE", - "PAPERCLIP_ACPX_ADMISSION_RUNTIME", - "PAPERCLIP_ACPX_ADMISSION_VERIFICATION", ...GENERIC_ACPX_OUTPUT_CODES, ]); diff --git a/packages/paperclip-runner/src/drivers/acpx/codex-runtime-adapter.ts b/packages/paperclip-runner/src/drivers/acpx/codex-runtime-adapter.ts index ebb3397de7c..0c9834f94a0 100644 --- a/packages/paperclip-runner/src/drivers/acpx/codex-runtime-adapter.ts +++ b/packages/paperclip-runner/src/drivers/acpx/codex-runtime-adapter.ts @@ -54,7 +54,7 @@ const activeCodexRuntimeCleanupOwners = new Set>(); // Provider initialization may include a cold native app-server start on a // minimally provisioned runner. Keep admission finite while allowing the // qualified runtime enough time to complete that local handshake. -const SESSION_HANDSHAKE_TIMEOUT_MS = 12_000; +const SESSION_HANDSHAKE_TIMEOUT_MS = 30_000; class AcpxRuntimeCloseTimeoutError extends Error { constructor() { @@ -268,13 +268,6 @@ export async function openQualifiedAcpxRuntime( : {}), }), spawnCwd: options.cwd, - onAgentStderr: (chunk) => { - for (const line of chunk.split(/\r?\n/)) { - if (line.startsWith("[paperclip-acpx-launch] ")) { - process.stderr.write(`${line}\n`); - } - } - }, spawnAgent: (input) => { // ACPX can invoke this callback after its handshake caller has already // been cancelled. Check at the last host-owned boundary so a late diff --git a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts index 371f738ec01..27b44203024 100644 --- a/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts +++ b/packages/paperclip-runner/src/drivers/acpx/installation-integrity.ts @@ -121,7 +121,6 @@ try { export const PROVIDER_LIFETIME_GUARDIAN_SOURCE = ` const fs = require("node:fs"); const { spawn } = require("node:child_process"); -const diagnose = (stage) => { try { fs.writeSync(2, "[paperclip-acpx-launch] " + stage + "\\n"); } catch {} }; const WATCHDOG_SOURCE = ${JSON.stringify(PROVIDER_LIFETIME_WATCHDOG_SOURCE)}; const runtimeExecutable = process.env.${VERIFIED_RUNTIME_EXECUTABLE_ENV} || process.execPath; const dependencyAncestorCount = Number.parseInt(process.argv[4], 10); @@ -134,7 +133,6 @@ const OWNERSHIP_FD = OWNER_FD + 1; const PROVIDER_EXIT_FD = OWNERSHIP_FD + 1; const CREDENTIAL_FENCE_FD_START = PROVIDER_EXIT_FD + 1; const dependencyAncestorFds = Array.from({ length: dependencyAncestorCount }, (_, index) => ${DEPENDENCY_ANCESTOR_FD_START} + index); -diagnose("guardian_started"); let provider; let watchdog; let reaped = false; @@ -170,7 +168,6 @@ process.on("SIGHUP", shutdown); const startProvider = () => { if (provider || reaped || shutdownStarted) return; try { - diagnose("provider_spawn_requested"); provider = spawn( runtimeExecutable, ["--eval", process.argv[1], ...process.argv.slice(2)], @@ -186,11 +183,10 @@ const startProvider = () => { windowsHide: true, }, ); - provider.once("error", () => { diagnose("provider_error"); reap(); }); - provider.once("exit", () => { diagnose("provider_exit"); reap(); }); + provider.once("error", reap); + provider.once("exit", reap); provider.once("spawn", () => { try { - diagnose("provider_spawned"); if (reaped || shutdownStarted) { reap(); return; @@ -221,7 +217,6 @@ try { stdio: ["ignore", "ignore", "ignore", "pipe", "pipe"], windowsHide: true, }); - diagnose("watchdog_spawned"); const watchdogOwnerPipe = watchdog.stdio[3]; const watchdogReady = watchdog.stdio[4]; if (watchdogOwnerPipe == null) throw new Error("ACPX provider lifetime watchdog omitted its owner pipe"); @@ -246,7 +241,6 @@ try { } if (!watchdogOutput.includes("armed\\n")) return; watchdogArmed = true; - diagnose("watchdog_armed"); clearTimeout(watchdogReadyTimeout); watchdogReady.removeAllListeners("data"); startProvider(); @@ -1595,8 +1589,6 @@ export function sanitizedNodeEnvironment( function snapshotBootstrap(format: AcpxCommandFormat, guarded = false): string { return [ 'const fs = require("node:fs");', - 'const diagnose = (stage) => { try { fs.writeSync(2, "[paperclip-acpx-launch] " + stage + "\\n"); } catch {} };', - 'diagnose("bootstrap_started");', 'const { isBuiltin, registerHooks } = require("node:module");', 'const { dirname, extname, join, normalize, relative, resolve } = require("node:path");', 'const { fileURLToPath, pathToFileURL } = require("node:url");', @@ -1654,7 +1646,6 @@ function snapshotBootstrap(format: AcpxCommandFormat, guarded = false): string { 'const canonicalizeDescriptorResolution = (url) => { if (typeof url !== "string" || !url.startsWith("file:") || snapshotDescriptorAncestorIndex(url, directoryUrl, dependencyDirectoryUrls) < 0) return url; try { return pathToFileURL(fs.realpathSync(fileURLToPath(url))).href; } catch { const error = new Error("ACPX provider module could not be canonicalized through its retained descriptor"); error.code = "ERR_ACPX_UNVERIFIED_MODULE"; throw error; } };', 'const rememberDependencyAncestor = (specifier, resolution) => { const canonicalUrl = canonicalizeDescriptorResolution(resolution?.url); const pinned = snapshotDescriptorResolution(canonicalUrl, directoryUrl, dependencyDirectoryUrls, canonicalDirectoryUrl, canonicalDependencyDirectoryUrls); guardSnapshotModuleResolution(isBuiltin(specifier), resolution?.url, pinned !== null); if (pinned !== null && typeof resolution?.url === "string") { for (const rememberedUrl of [resolution.url, canonicalUrl, pinned.url]) { if (typeof rememberedUrl !== "string") continue; dependencyAncestorByUrl.set(rememberedUrl, pinned.ancestorIndex); if (typeof resolution.format === "string") descriptorFormatByUrl.set(rememberedUrl, resolution.format); } } return pinned === null || pinned.url === resolution?.url ? resolution : { ...resolution, url: pinned.url }; };', `const source = fs.readFileSync(${COMMAND_SOURCE_FD});`, - 'diagnose("source_loaded");', "let resolvingDescriptorBare = false;", "const resolveBareFromDescriptor = (specifier, dependencyDirectoryUrl) => { resolvingDescriptorBare = true; try { return require.resolve(specifier, { paths: [fileURLToPath(dependencyDirectoryUrl)] }); } finally { resolvingDescriptorBare = false; } };", "registerHooks({ resolve(specifier, context, nextResolve) {", @@ -1730,8 +1721,7 @@ function snapshotBootstrap(format: AcpxCommandFormat, guarded = false): string { "} finally { fs.closeSync(moduleFd); }", "});", "} });", - 'diagnose("import_started");', - 'import(target).then(() => diagnose("import_resolved"), (error) => { const code = String(error?.code || error?.name || "unknown").replace(/[^A-Za-z0-9_-]/g, "_").slice(0, 64); diagnose("import_rejected_" + code); console.error(error); process.exitCode = 1; });', + "import(target).catch((error) => { console.error(error); process.exitCode = 1; });", ].join(""); } diff --git a/packages/paperclip-runner/src/drivers/acpx/runtime-host.ts b/packages/paperclip-runner/src/drivers/acpx/runtime-host.ts index 4afbb85ac1c..0345ffcf44b 100644 --- a/packages/paperclip-runner/src/drivers/acpx/runtime-host.ts +++ b/packages/paperclip-runner/src/drivers/acpx/runtime-host.ts @@ -249,18 +249,15 @@ export class AcpxRuntimeHost { ); } const profile = resolveQualifiedAcpxProfile(options.agent, options.model); - const binding = await runAbortableAdmissionStage( - options.signal, - () => - createAcpxRecoveryBinding({ - runtimeDirectory: options.runtimeDirectory, - normalizedSessionId: options.normalizedSessionId, - workingDirectory: options.workingDirectory, - profile, - requestedModel: options.model, - permissionMode: options.permissionMode, - }), - "recovery_binding", + const binding = await runAbortableAdmissionStage(options.signal, () => + createAcpxRecoveryBinding({ + runtimeDirectory: options.runtimeDirectory, + normalizedSessionId: options.normalizedSessionId, + workingDirectory: options.workingDirectory, + profile, + requestedModel: options.model, + permissionMode: options.permissionMode, + }), ); if (options.expectedIdentity) { verifyExpectedAcpxIdentity(options.expectedIdentity, binding, null); @@ -275,13 +272,10 @@ export class AcpxRuntimeHost { ); } - const installation = await runAbortableAdmissionStage( - options.signal, - () => - (dependencies.verifyInstallation ?? verifyQualifiedAcpxInstallation)( - profile, - ), - "installation", + const installation = await runAbortableAdmissionStage(options.signal, () => + (dependencies.verifyInstallation ?? verifyQualifiedAcpxInstallation)( + profile, + ), ); if (installation.commandDigest !== profile.commandDigest) { throw new Error("Verified ACPX installation does not match its profile"); @@ -328,15 +322,12 @@ export class AcpxRuntimeHost { retainRuntimeHostCleanup(ownedCleanup); }; try { - const sandbox = await runAbortableAdmissionStage( - options.signal, - () => - prepareAcpxRuntimeSandbox({ - binding, - agent: options.agent, - environment: options.environment, - }), - "sandbox", + const sandbox = await runAbortableAdmissionStage(options.signal, () => + prepareAcpxRuntimeSandbox({ + binding, + agent: options.agent, + environment: options.environment, + }), ); if (options.agent === "codex") { credential = await acquireAbortableAdmissionResource({ @@ -452,7 +443,6 @@ export class AcpxRuntimeHost { profile, admissionVerificationTimeoutMs, ), - "verification", ); const observedIdentity: AcpxExpectedSessionIdentity = { kind: "acpx", @@ -639,16 +629,11 @@ export class AcpxRuntimeHost { async function runAbortableAdmissionStage( signal: AbortSignal | undefined, operation: () => Promise, - stage: string, ): Promise { - try { - if (signal === undefined) return await operation(); - signal.throwIfAborted(); - const pending = Promise.resolve().then(operation); - return await raceAdmissionWithAbort(pending, signal); - } catch (error) { - throw attachAcpxAdmissionStage(error, stage); - } + if (signal === undefined) return await operation(); + signal.throwIfAborted(); + const pending = Promise.resolve().then(operation); + return await raceAdmissionWithAbort(pending, signal); } async function acquireAbortableAdmissionResource(input: { @@ -659,13 +644,7 @@ async function acquireAbortableAdmissionResource(input: { onAbortedPending?: (pending: Promise) => void; reportFailure: (failure: AcpxRetainedCleanupFailure) => void; }): Promise { - if (input.signal === undefined) { - try { - return await input.acquire(); - } catch (error) { - throw attachAcpxAdmissionStage(error, input.resource); - } - } + if (input.signal === undefined) return await input.acquire(); input.signal.throwIfAborted(); const pending = Promise.resolve().then(input.acquire); try { @@ -687,29 +666,7 @@ async function acquireAbortableAdmissionResource(input: { ); } } - throw attachAcpxAdmissionStage(error, input.resource); - } -} - -function attachAcpxAdmissionStage(error: unknown, stage: string): Error { - const normalized = - error instanceof Error - ? error - : new Error("ACPX admission rejected a non-error"); - try { - Object.defineProperty(normalized, "paperclipAcpxAdmissionStage", { - configurable: true, - enumerable: false, - value: stage, - }); - return normalized; - } catch { - return Object.assign( - new Error("ACPX admission stage failed", { cause: normalized }), - { - paperclipAcpxAdmissionStage: stage, - }, - ); + throw error; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1beb5c3d99a..8a292199bad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,11 +13,8 @@ patchedDependencies: '@agentclientprotocol/claude-agent-acp@0.70.0': hash: fymctidcjqjhi4cj72qtivlxry path: patches/@agentclientprotocol__claude-agent-acp@0.70.0.patch - '@agentclientprotocol/claude-agent-acp@0.73.0': - hash: axsvv3fhdlmmbmnhpi2cywic6q - path: patches/@agentclientprotocol__claude-agent-acp@0.73.0.patch '@agentclientprotocol/codex-acp@1.6.2': - hash: elxjibratyxkrkkxxyoqtz36pe + hash: grbydorkxatbzksnwwfuawwtim path: patches/@agentclientprotocol__codex-acp@1.6.2.patch acpx@0.12.0: hash: b2ggqg6aj4hdob4whk6vq6jmc4 @@ -28,9 +25,6 @@ patchedDependencies: embedded-postgres@18.1.0-beta.16: hash: 55uhvnotpqyiy37rn3pqpukhei path: patches/embedded-postgres@18.1.0-beta.16.patch - node@24.11.0: - hash: v5qkq5xhqy2tsyfb3ac3vqpw7e - path: patches/node@24.11.0.patch importers: @@ -153,8 +147,8 @@ importers: packages/adapters/claude-local: dependencies: '@agentclientprotocol/claude-agent-acp': - specifier: ^0.73.0 - version: 0.73.0(patch_hash=axsvv3fhdlmmbmnhpi2cywic6q)(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)) + specifier: ^0.70.0 + version: 0.70.0(patch_hash=fymctidcjqjhi4cj72qtivlxry)(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)) '@anthropic-ai/sdk': specifier: 0.121.0 version: 0.121.0(zod@4.4.3) @@ -179,7 +173,7 @@ importers: dependencies: '@agentclientprotocol/codex-acp': specifier: ^1.6.2 - version: 1.6.2(patch_hash=elxjibratyxkrkkxxyoqtz36pe) + version: 1.6.2(patch_hash=grbydorkxatbzksnwwfuawwtim) '@paperclipai/adapter-utils': specifier: workspace:* version: link:../../adapter-utils @@ -482,10 +476,7 @@ importers: version: 0.70.0(patch_hash=fymctidcjqjhi4cj72qtivlxry)(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)) '@agentclientprotocol/codex-acp': specifier: 1.6.2 - version: 1.6.2(patch_hash=elxjibratyxkrkkxxyoqtz36pe) - '@openai/codex': - specifier: 0.148.0 - version: 0.148.0 + version: 1.6.2(patch_hash=grbydorkxatbzksnwwfuawwtim) acpx: specifier: 0.13.1 version: 0.13.1(patch_hash=lzpwjtiaybzoijy455dfycwavu) @@ -495,9 +486,6 @@ importers: json-schema-to-ts: specifier: ^3.1.1 version: 3.1.1 - node: - specifier: 24.11.0 - version: 24.11.0(patch_hash=v5qkq5xhqy2tsyfb3ac3vqpw7e) opencode-ai: specifier: 1.18.17 version: 1.18.17 @@ -507,10 +495,6 @@ importers: remark-gfm: specifier: ^4.0.1 version: 4.0.1 - optionalDependencies: - '@openai/codex-linux-x64': - specifier: npm:@openai/codex@0.148.0-linux-x64 - version: '@openai/codex@0.148.0-linux-x64' devDependencies: '@paperclipai/paperclip-eval-kernel': specifier: workspace:* @@ -1204,11 +1188,6 @@ packages: engines: {node: '>=22'} hasBin: true - '@agentclientprotocol/claude-agent-acp@0.73.0': - resolution: {integrity: sha512-xKnGIntdBbr2dDS2NEsVGdjoLH62EaWjfYlp/U7TYdxUJzERlApe2gliYW3rVFTeWGjG0dUyPszhG9TWhsqGlA==} - engines: {node: '>=22'} - hasBin: true - '@agentclientprotocol/codex-acp@1.6.2': resolution: {integrity: sha512-2eF1mbs1gTqkZJSLYOun/pFDx37sYa7W63HOPezC37b/R8AYms5O1nfQu8lrqFSGDrwDZkASVORymLcqjCNqyA==} hasBin: true @@ -1236,81 +1215,41 @@ packages: cpu: [arm64] os: [darwin] - '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.257': - resolution: {integrity: sha512-ITjFPYB8riu9tbxbrWArokiZ/90w/NDrYbtEvyr3ScilVtu1iupkComxkhvbUxoyT4JRDpKsdw/ZOfwSl/pkpA==} - cpu: [arm64] - os: [darwin] - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.232': resolution: {integrity: sha512-EHZ1Y3aGyZ2mFZ6QLR1bM3/HiIn2cLrPjU+k3/oCIW6omJFodfzf410aWjDPSnMj7CE4d6t7MSjBWekMUbcv0g==} cpu: [x64] os: [darwin] - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.257': - resolution: {integrity: sha512-0s7QoLRnopbMvCqVpgCnvBWg4UNxPUybMZTknkn3HLBMvUjUdHs1QXb77c/yrT1WAPqDTw1Ju+H0esXwWa8/Kg==} - cpu: [x64] - os: [darwin] - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.232': resolution: {integrity: sha512-XkLcb9UT/l42Rtw7KBApzgxUe/kwoWJ9KCPcVEnYojzIvVR+AwBCl/QReNU5+6c72w48dYBMmLebI64gQbN0tg==} cpu: [arm64] os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.257': - resolution: {integrity: sha512-t2WHfKjY4Jjgzfk0lbBUt6EVPQe+wXvXvRmYnK7ICfzZ1jS8CrpDajwBQErKFSMiUqGAutZy3vwDwGziW32cpw==} - cpu: [arm64] - os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.232': resolution: {integrity: sha512-wW2opwA5s7gLghjU6B2ADMAtoc7bAZMevUzi4g+1PXMJ8MGcPvbnx92EDYJrVDcZmAl1+fz19XyPsaShlisTzw==} cpu: [arm64] os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.257': - resolution: {integrity: sha512-38tv1s1CaIE6CyEBmJpfKtvwPzrasxPiRT079BEs5aaiLPQ+pmSGF0+Lwy7ot9i6xqr7v5/91TVo5JXHI8Pkpg==} - cpu: [arm64] - os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.232': resolution: {integrity: sha512-L1x2ge9NpXMLTczmT44TKPQ88PHE+gsCakQMVEOa8rXFvfBoqvcpxM0DT8wrqYWUHhQEYR8NXxQTP9a1NVRj8Q==} cpu: [x64] os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.257': - resolution: {integrity: sha512-qSlgAUEpj2JAA+YqMD222iv2W3x8xBDSYwdoaOx20VbaJRjFq8feViI7kcr1C6wVN+ApX4Rxl7YX6gekiBkA2g==} - cpu: [x64] - os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.232': resolution: {integrity: sha512-6Px1xDiwQyLkSxwRQ34/kPA8WMXQ2rHYGkwockND7+9yMw+ShI3AfLkyi9G7JtJHObWFT6B82eSHjDS/Fy+9hQ==} cpu: [x64] os: [linux] - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.257': - resolution: {integrity: sha512-0FRyIwV4jEJErdDDoYMC0v9lzuFNz5y0lK2340H5fP02eNXsP3U0htKW/bfRP8Ppei+xc4QUZgdCI6rVzkhXGg==} - cpu: [x64] - os: [linux] - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.232': resolution: {integrity: sha512-fDiuwL5dm1elOy7fNp4Qmdor8so4R8npj2pUGQA1G/xKfJhaK236aTWezvZid3L/O7cRdFeN9IVofOAlWLQcsw==} cpu: [arm64] os: [win32] - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.257': - resolution: {integrity: sha512-7iEwy14lSqaAWvNR3KucBusQs5+hG6uoliYWZ2M2FyaCk5PHYymVf9mrRPtWhaYfNwum/YY13acYIIvnAbz0kA==} - cpu: [arm64] - os: [win32] - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.232': resolution: {integrity: sha512-Hc/9uy1BI9mqKVyB1b/zoUnm3MFgtVNzQY6p5zgaq9DaIjCKDpR4a4L1aDZM4lMqUcWFMZM+u7juOhh+m39NBQ==} cpu: [x64] os: [win32] - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.257': - resolution: {integrity: sha512-NW0zMjHXFBdu2TcjT9Zo5o/1tJaDy6A7v4Gt/vLVJgaipV/RzAbyRGXZzH37hswyiKrSLGaSoYYP1vUfncbkUQ==} - cpu: [x64] - os: [win32] - '@anthropic-ai/claude-agent-sdk@0.3.232': resolution: {integrity: sha512-8od7hJk9fZnF1/oYYiR9PvroGbZRQrpmNgKirjHNGoj5ur5YcAZLohI70XVUAUe3KvjB1msLxtkvmlAT9sqFAg==} engines: {node: '>=18.0.0'} @@ -1319,14 +1258,6 @@ packages: '@modelcontextprotocol/sdk': ^1.29.0 zod: ^4.0.0 - '@anthropic-ai/claude-agent-sdk@0.3.257': - resolution: {integrity: sha512-Se55zXv48IYLg/WzoXzpbPLcq86suwDSbRUoNb69l4dkovorqS/47Xuy7MUo/gPNwwcPB4a+aqbXbshU33dcdQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@anthropic-ai/sdk': '>=0.93.0' - '@modelcontextprotocol/sdk': ^1.29.0 - zod: ^4.0.0 - '@anthropic-ai/sdk@0.121.0': resolution: {integrity: sha512-WFzwcH8l49CZHv0vQ9QQT51VJ1/DLDQfNSs9awpGlnKBdaSnqtdZa+tw/3cxxosTPIgK8uw1GqsJ2dSbCBD1Lg==} hasBin: true @@ -7157,9 +7088,6 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - node-bin-setup@1.1.4: - resolution: {integrity: sha512-vWNHOne0ZUavArqPP5LJta50+S8R261Fr5SvGul37HbEDcowvLjwdvd0ZeSr0r2lTSrPxl6okq9QUw8BFGiAxA==} - node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -7173,11 +7101,6 @@ packages: resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} engines: {node: '>=18'} - node@24.11.0: - resolution: {integrity: sha512-pGLc7hd4xh0doDpnHC5+PL09WLUDKFoBFsC28341AYhHjzTDbNSwY+2615tYY6YFO2WQUKit4yqTwzIHaaityg==} - engines: {npm: '>=5.0.0'} - hasBin: true - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -8550,16 +8473,7 @@ snapshots: - '@anthropic-ai/sdk' - '@modelcontextprotocol/sdk' - '@agentclientprotocol/claude-agent-acp@0.73.0(patch_hash=axsvv3fhdlmmbmnhpi2cywic6q)(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))': - dependencies: - '@agentclientprotocol/sdk': 1.4.0(zod@4.4.3) - '@anthropic-ai/claude-agent-sdk': 0.3.257(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(zod@4.4.3) - zod: 4.4.3 - transitivePeerDependencies: - - '@anthropic-ai/sdk' - - '@modelcontextprotocol/sdk' - - '@agentclientprotocol/codex-acp@1.6.2(patch_hash=elxjibratyxkrkkxxyoqtz36pe)': + '@agentclientprotocol/codex-acp@1.6.2(patch_hash=grbydorkxatbzksnwwfuawwtim)': dependencies: '@agentclientprotocol/sdk': 1.4.0(zod@4.4.3) '@openai/codex': 0.148.0 @@ -8588,51 +8502,27 @@ snapshots: '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.232': optional: true - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.257': - optional: true - '@anthropic-ai/claude-agent-sdk@0.3.232(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(zod@4.4.3)': dependencies: '@anthropic-ai/sdk': 0.121.0(zod@4.4.3) @@ -8648,21 +8538,6 @@ snapshots: '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.232 '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.232 - '@anthropic-ai/claude-agent-sdk@0.3.257(@anthropic-ai/sdk@0.121.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.30.0(zod@4.4.3))(zod@4.4.3)': - dependencies: - '@anthropic-ai/sdk': 0.121.0(zod@4.4.3) - '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) - zod: 4.4.3 - optionalDependencies: - '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-x64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.3.257 - '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.257 - '@anthropic-ai/sdk@0.121.0(zod@4.4.3)': dependencies: json-schema-to-ts: 3.1.1 @@ -14702,8 +14577,6 @@ snapshots: negotiator@1.0.0: {} - node-bin-setup@1.1.4: {} - node-domexception@1.0.0: {} node-fetch@3.3.2: @@ -14714,10 +14587,6 @@ snapshots: node-releases@2.0.53: {} - node@24.11.0(patch_hash=v5qkq5xhqy2tsyfb3ac3vqpw7e): - dependencies: - node-bin-setup: 1.1.4 - npm-run-path@4.0.1: dependencies: path-key: 3.1.1