fix(runner): traverse ACPX error causes safely

This commit is contained in:
Dotta 2026-09-02 22:44:48 -05:00
parent 4ac656e8d4
commit b4e83ab3cc
2 changed files with 43 additions and 0 deletions

View File

@ -144,6 +144,10 @@ describe("ACPX sidecar input sequencing", () => {
],
"runtime initialization cleanup failed",
);
const codedWrapper = Object.assign(new Error("opaque wrapper"), {
code: "ERR_UNCLASSIFIED_WRAPPER",
cause: missingModule,
});
expect(acpxSidecarErrorCode(missingModule)).toBe(
"AGENT_STARTUP_FAILED.MODULE_NOT_FOUND",
@ -158,6 +162,9 @@ describe("ACPX sidecar input sequencing", () => {
expect(acpxSidecarErrorCode(genericStartup)).toBe(
"AGENT_STARTUP_FAILED.MODULE_NOT_FOUND",
);
expect(acpxSidecarErrorCode(codedWrapper)).toBe(
"AGENT_STARTUP_FAILED.MODULE_NOT_FOUND",
);
expect(acpxSidecarErrorCode(nestedHandshake)).toBe(
"ACPX_SESSION_HANDSHAKE_TIMEOUT",
);

View File

@ -75,6 +75,7 @@ function directAcpxSidecarErrorCode(error: Error): string | null {
? "ACPX_SESSION_HANDSHAKE_TIMEOUT"
: null;
}
if (!STABLE_ACPX_SIDECAR_CODES.has(code)) return null;
if (code !== "AGENT_STARTUP_FAILED") return code;
const stderr =
@ -119,3 +120,38 @@ const GENERIC_ACPX_OUTPUT_CODES = new Set([
"RUNTIME",
"USAGE",
]);
const STABLE_ACPX_SIDECAR_CODES = new Set([
"ACP_MODEL_UNSUPPORTED",
"ACP_SESSION_INIT_FAILED",
"AGENT_DISCONNECTED",
"AGENT_STARTUP_FAILED",
"AGENT_STARTUP_FAILED.EXIT_NONZERO",
"AGENT_STARTUP_FAILED.FILE_NOT_FOUND",
"AGENT_STARTUP_FAILED.INVALID_ARGUMENT",
"AGENT_STARTUP_FAILED.MODULE_NOT_FOUND",
"AGENT_STARTUP_FAILED.NO_STDERR",
"AGENT_STARTUP_FAILED.OTHER",
"AGENT_STARTUP_FAILED.PERMISSION_DENIED",
"AGENT_STARTUP_FAILED.SIGNAL",
"AGENT_STARTUP_FAILED.SYNTAX_ERROR",
"AGENT_STARTUP_FAILED.UNVERIFIED_MODULE",
"AUTH_REQUIRED",
"CLAUDE_ACP_SESSION_CREATE_TIMEOUT",
"SESSION_CONFIG_OPTION_REPLAY_FAILED",
"SESSION_MODEL_REPLAY_FAILED",
"SESSION_MODE_REPLAY_FAILED",
"SESSION_RESUME_REQUIRED",
"ACPX_EFFECTIVE_MODEL_MISMATCH",
"ACPX_MODEL_SELECTION_UNAVAILABLE",
"ACPX_MODEL_STATUS_UNAVAILABLE",
"ACPX_PERSISTED_SESSION_IDENTITY_MISMATCH",
"ACPX_PERSISTED_SESSION_MISSING",
"ACPX_RUNTIME_ADMISSION_VERIFICATION_TIMEOUT",
"ACPX_SESSION_ENSURE_FAILED",
"ACPX_SESSION_ENSURE_NON_ERROR",
"ACPX_SESSION_ENSURE_TYPE_ERROR",
"ACPX_SESSION_HANDSHAKE_TIMEOUT",
"ACPX_SIDECAR_STATUS_READ_TIMEOUT",
...GENERIC_ACPX_OUTPUT_CODES,
]);