From 2cd0c8b515d83bc838b1df5089859cf28eb461f3 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 29 May 2026 08:05:05 -0400 Subject: [PATCH] fix(agents): centralize failover status parsing --- src/agents/failover-error.test.ts | 2 ++ src/agents/failover-error.ts | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/agents/failover-error.test.ts b/src/agents/failover-error.test.ts index 3ee83d7c877..854ef1eaafc 100644 --- a/src/agents/failover-error.test.ts +++ b/src/agents/failover-error.test.ts @@ -77,6 +77,8 @@ describe("failover-error", () => { }), ).toBe("billing"); expect(resolveFailoverReasonFromError({ statusCode: "429" })).toBe("rate_limit"); + expect(resolveFailoverReasonFromError({ statusCode: "+429" })).toBe("rate_limit"); + expect(resolveFailoverReasonFromError({ statusCode: "0x1ad" })).toBeNull(); expect(resolveFailoverReasonFromError({ status: 403 })).toBe("auth"); expect(resolveFailoverReasonFromError({ status: 408 })).toBe("timeout"); expect(resolveFailoverReasonFromError({ status: 410 })).toBe("timeout"); diff --git a/src/agents/failover-error.ts b/src/agents/failover-error.ts index 6a1e5a95a93..66b31554a5d 100644 --- a/src/agents/failover-error.ts +++ b/src/agents/failover-error.ts @@ -1,4 +1,5 @@ import { readErrorName } from "../infra/errors.js"; +import { parseStrictNonNegativeInteger } from "../shared/number-coercion.js"; import { classifyFailoverSignal, inferSignalStatus, @@ -132,8 +133,8 @@ function readDirectStatusCode(err: unknown): number | undefined { if (typeof candidate === "number") { return candidate; } - if (typeof candidate === "string" && /^\d+$/.test(candidate)) { - return Number(candidate); + if (typeof candidate === "string") { + return parseStrictNonNegativeInteger(candidate); } return undefined; }