





















@@ -206,28 +206,44 @@ describe("handleAgentEnd", () => {
206206expect(meta.httpCode).toBe("401");
207207});
208208209-it("omits raw HTML auth bodies from consoleMessage for HTML 403 auth failures", async () => {
210-const ctx = createContext({
211-role: "assistant",
212-stopReason: "error",
213-provider: "openai-codex",
214-model: "gpt-5.4",
209+it.each([
210+{
215211errorMessage: "403 <!DOCTYPE html><html><body>Access denied</body></html>",
216-content: [{ type: "text", text: "" }],
217-});
212+expectedError:
213+"Authentication failed at the provider. Re-authenticate and verify your provider credentials and account access.",
214+expectedKind: "auth_html",
215+expectedPreview: "403 <!DOCTYPE html><html><body>Access denied</body></html>",
216+},
217+{
218+errorMessage: "401 <!DOCTYPE html><html><body>Unauthorized</body></html>",
219+expectedError:
220+"Authentication failed at the provider. Re-authenticate and verify your provider credentials and account access.",
221+expectedKind: "auth_html",
222+expectedPreview: "401 <!DOCTYPE html><html><body>Unauthorized</body></html>",
223+},
224+])(
225+"omits raw HTML auth bodies from consoleMessage for $expectedKind failures",
226+async ({ errorMessage, expectedError, expectedKind, expectedPreview }) => {
227+const ctx = createContext({
228+role: "assistant",
229+stopReason: "error",
230+provider: "openai-codex",
231+model: "gpt-5.4",
232+ errorMessage,
233+content: [{ type: "text", text: "" }],
234+});
218235219-await handleAgentEnd(ctx);
236+ await handleAgentEnd(ctx);
220237221-const meta = firstWarnMeta(ctx);
222-expect(meta.providerRuntimeFailureKind).toBe("auth_html_403");
223-expect(meta.rawErrorPreview).toBe("403 <!DOCTYPE html><html><body>Access denied</body></html>");
224-expect(meta.error).toBe(
225-"Authentication failed with an HTML 403 response from the provider. Re-authenticate and verify your provider account access.",
226-);
227-const consoleMsg = typeof meta.consoleMessage === "string" ? meta.consoleMessage : "";
228-expect(consoleMsg).not.toContain("rawError=");
229-expect(consoleMsg).not.toContain("<html>");
230-});
238+const meta = firstWarnMeta(ctx);
239+expect(meta.providerRuntimeFailureKind).toBe(expectedKind);
240+expect(meta.rawErrorPreview).toBe(expectedPreview);
241+expect(meta.error).toBe(expectedError);
242+const consoleMsg = typeof meta.consoleMessage === "string" ? meta.consoleMessage : "";
243+expect(consoleMsg).not.toContain("rawError=");
244+expect(consoleMsg).not.toContain("<html>");
245+},
246+);
231247232248it("keeps non-error run-end logging on debug only", async () => {
233249const ctx = createContext(undefined);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。