

























@@ -1,6 +1,8 @@
11import { afterEach, describe, expect, it, vi } from "vitest";
22import * as loggingConfigModule from "../logging/config.js";
33import {
4+buildToolLifecycleErrorResult,
5+extractToolErrorCode,
46extractToolErrorMessage,
57sanitizeToolArgs,
68sanitizeToolResult,
@@ -34,13 +36,88 @@ describe("extractToolErrorMessage", () => {
3436).toBe("SYSTEM_RUN_DENIED: approval required");
3537});
363837-it("uses result text before generic failed status when details omit aggregated output", () => {
39+it("does not promote prose-only denial output ahead of generic failed status", () => {
3840expect(
3941extractToolErrorMessage({
4042content: [{ type: "text", text: "SYSTEM_RUN_DENIED: approval required" }],
4143details: { status: "failed" },
4244}),
43-).toBe("SYSTEM_RUN_DENIED: approval required");
45+).toBe("failed");
46+});
47+48+it("extracts structured tool error codes", () => {
49+expect(
50+extractToolErrorCode({
51+details: {
52+status: "failed",
53+error: {
54+code: "SYSTEM_RUN_DENIED",
55+message: "approval required",
56+},
57+},
58+}),
59+).toBe("SYSTEM_RUN_DENIED");
60+expect(
61+extractToolErrorCode({
62+details: {
63+status: "failed",
64+gatewayCode: "UNAVAILABLE",
65+nodeError: {
66+code: "UNAVAILABLE",
67+message: "SYSTEM_RUN_DENIED: approval required",
68+},
69+},
70+}),
71+).toBe("SYSTEM_RUN_DENIED");
72+expect(
73+extractToolErrorCode({
74+details: {
75+status: "failed",
76+nodeError: {
77+code: "INVALID_REQUEST",
78+message: "approval expired",
79+},
80+},
81+}),
82+).toBe("INVALID_REQUEST");
83+});
84+85+it("does not extract error codes from prose-only tool output", () => {
86+expect(
87+extractToolErrorCode({
88+content: [{ type: "text", text: "SYSTEM_RUN_DENIED: approval required" }],
89+details: { status: "failed" },
90+}),
91+).toBeUndefined();
92+expect(
93+extractToolErrorCode({
94+details: {
95+status: "failed",
96+error: "SYSTEM_RUN_DENIED: approval required",
97+},
98+}),
99+).toBeUndefined();
100+});
101+102+it("preserves structured codes from thrown gateway errors", () => {
103+const error = new Error("UNAVAILABLE: SYSTEM_RUN_DENIED: approval required") as Error & {
104+gatewayCode?: string;
105+details?: unknown;
106+};
107+error.gatewayCode = "UNAVAILABLE";
108+error.details = {
109+nodeError: {
110+code: "UNAVAILABLE",
111+message: "SYSTEM_RUN_DENIED: approval required",
112+},
113+};
114+115+const result = buildToolLifecycleErrorResult(error);
116+117+expect(extractToolErrorCode(result)).toBe("SYSTEM_RUN_DENIED");
118+expect(extractToolErrorMessage(result)).toBe(
119+"UNAVAILABLE: SYSTEM_RUN_DENIED: approval required",
120+);
44121});
45122});
46123此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。