


























@@ -3,6 +3,7 @@ import {
33AcpRuntimeError,
44formatAcpErrorChain,
55isAcpRuntimeError,
6+toAcpRuntimeError,
67withAcpRuntimeErrorBoundary,
78} from "./errors.js";
89@@ -72,6 +73,65 @@ describe("withAcpRuntimeErrorBoundary", () => {
7273expect(error.cause).toBe(foreignError);
7374expect(isAcpRuntimeError(foreignError)).toBe(true);
7475});
76+77+it("preserves redacted RequestError details from numeric ACP errors", () => {
78+const token = "sk-abcdefghijklmnopqrstuvwxyz123456";
79+const requestError = Object.assign(new Error("Internal error"), {
80+name: "RequestError",
81+code: -32603,
82+data: {
83+details: `unknown config option: timeout; token=${token}`,
84+},
85+});
86+87+const error = toAcpRuntimeError({
88+error: requestError,
89+fallbackCode: "ACP_TURN_FAILED",
90+fallbackMessage: "fallback",
91+});
92+93+expect(error.code).toBe("ACP_TURN_FAILED");
94+expect(error.message).toContain("Internal error: unknown config option: timeout");
95+expect(error.message).not.toContain(token);
96+expect(error.cause).toBe(requestError);
97+});
98+99+it("keeps foreign OpenClaw ACP string code behavior unchanged", () => {
100+const foreignError = Object.assign(new Error("backend missing"), {
101+code: "ACP_BACKEND_MISSING",
102+data: {
103+details: "extra backend diagnostic",
104+},
105+});
106+107+const error = toAcpRuntimeError({
108+error: foreignError,
109+fallbackCode: "ACP_TURN_FAILED",
110+fallbackMessage: "fallback",
111+});
112+113+expect(error.code).toBe("ACP_BACKEND_MISSING");
114+expect(error.message).toBe("backend missing");
115+expect(error.cause).toBe(foreignError);
116+});
117+118+it("keeps generic non-RequestError messages unchanged", () => {
119+const sourceError = Object.assign(new Error("boom"), {
120+data: {
121+details: "extra diagnostic",
122+},
123+});
124+125+const error = toAcpRuntimeError({
126+error: sourceError,
127+fallbackCode: "ACP_TURN_FAILED",
128+fallbackMessage: "fallback",
129+});
130+131+expect(error.code).toBe("ACP_TURN_FAILED");
132+expect(error.message).toBe("boom");
133+expect(error.cause).toBe(sourceError);
134+});
75135});
7613677137describe("formatAcpErrorChain redaction", () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。