ci(runner): remove validation diagnostics

This commit is contained in:
Dotta committed 2026-09-03 03:12:44 -05:00
1 parent 82d0ddff5f
commit 31b97c09eb
6 files changed
+45 -282

No files matched your search

@@ -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() {
@@ -37,7 +37,6 @@ export function acpxBootstrapBlockedError(
export function acpxSidecarErrorCode(error: Error): string {
const pending: Error[] = [error];
const observed = new Set<Error>();
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<string, unknown>;
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,
]);
@@ -54,7 +54,7 @@ const activeCodexRuntimeCleanupOwners = new Set<Promise<unknown>>();
// 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
@@ -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("");
}
@@ -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<T>(
signal: AbortSignal | undefined,
operation: () => Promise<T>,
stage: string,
): Promise<T> {
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<T>(input: {
@@ -659,13 +644,7 @@ async function acquireAbortableAdmissionResource<T>(input: {
onAbortedPending?: (pending: Promise<T>) => void;
reportFailure: (failure: AcpxRetainedCleanupFailure) => void;
}): Promise<T> {
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<T>(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;
}
}
+6 -137
View File
@@ -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