From 156c9137798ca9f8de4e7c4392d204f580374f23 Mon Sep 17 00:00:00 2001 From: Dotta Date: Wed, 2 Sep 2026 23:00:28 -0500 Subject: [PATCH] fix(runner): read ACPX output error codes --- .../src/cli/acpx-sidecar-input.test.ts | 6 +++++- .../paperclip-runner/src/cli/acpx-sidecar-input.ts | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/paperclip-runner/src/cli/acpx-sidecar-input.test.ts b/packages/paperclip-runner/src/cli/acpx-sidecar-input.test.ts index 85e9ee4d22..4ce9ef20a2 100644 --- a/packages/paperclip-runner/src/cli/acpx-sidecar-input.test.ts +++ b/packages/paperclip-runner/src/cli/acpx-sidecar-input.test.ts @@ -131,11 +131,14 @@ describe("ACPX sidecar input sequencing", () => { detailCode: "AGENT_STARTUP_FAILED", }); const genericStartup = Object.assign(new Error("provider exited"), { - code: "RUNTIME", + outputCode: "RUNTIME", detailCode: "AGENT_STARTUP_FAILED", stderrSummary: "Error [ERR_MODULE_NOT_FOUND]: package was not found", exitCode: 1, }); + const genericRuntime = Object.assign(new Error("provider rejected"), { + outputCode: "RUNTIME", + }); const nestedHandshake = new AggregateError( [ Object.assign(new Error("admission deadline"), { @@ -162,6 +165,7 @@ describe("ACPX sidecar input sequencing", () => { expect(acpxSidecarErrorCode(genericStartup)).toBe( "AGENT_STARTUP_FAILED.MODULE_NOT_FOUND", ); + expect(acpxSidecarErrorCode(genericRuntime)).toBe("RUNTIME"); expect(acpxSidecarErrorCode(codedWrapper)).toBe( "AGENT_STARTUP_FAILED.MODULE_NOT_FOUND", ); diff --git a/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts b/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts index 9376ee37f9..9f508bb289 100644 --- a/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts +++ b/packages/paperclip-runner/src/cli/acpx-sidecar-input.ts @@ -57,7 +57,15 @@ export function acpxSidecarErrorCode(error: Error): string { function directAcpxSidecarErrorCode(error: Error): string | null { const details = error as Error & Record; - const outputCode = typeof details.code === "string" ? details.code : null; + // AcpxOperationalError publishes its presentation category as outputCode; + // Node/system errors conventionally use code. Accept the ACPX field first + // while retaining the latter for closed launch failures. + const outputCode = + typeof details.outputCode === "string" + ? details.outputCode + : typeof details.code === "string" + ? details.code + : null; const detailCode = typeof details.detailCode === "string" ? details.detailCode : null; // ACPX output errors may carry both a broad presentation code (for example,