From ce1a53e5f8dde9abdf77df3ef302fc3a4c9f1049 Mon Sep 17 00:00:00 2001 From: KooshaPari <42529354+KooshaPari@users.noreply.github.com> Date: Mon, 22 Jun 2026 13:13:45 -0700 Subject: [PATCH] fix: reject invalid provider cooldown bounds (#4589) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Integrated into release/v3.8.34 (rebuilt — bundled commits stripped) --- src/shared/validation/schemas/settings.ts | 15 ++++++++++++++- .../resilience-provider-cooldown-api-3556.test.ts | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/shared/validation/schemas/settings.ts b/src/shared/validation/schemas/settings.ts index a57b349cc8..75e813c93b 100644 --- a/src/shared/validation/schemas/settings.ts +++ b/src/shared/validation/schemas/settings.ts @@ -101,7 +101,20 @@ export const providerCooldownSettingsSchema = z minRetryCooldownMs: z.number().int().min(0).max(300000).optional(), maxRetryCooldownMs: z.number().int().min(0).max(3600000).optional(), }) - .strict(); + .strict() + .superRefine((value, ctx) => { + if ( + typeof value.minRetryCooldownMs === "number" && + typeof value.maxRetryCooldownMs === "number" && + value.maxRetryCooldownMs < value.minRetryCooldownMs + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "maxRetryCooldownMs must be greater than or equal to minRetryCooldownMs", + path: ["maxRetryCooldownMs"], + }); + } + }); export const updateResilienceSchema = z .object({ diff --git a/tests/unit/resilience-provider-cooldown-api-3556.test.ts b/tests/unit/resilience-provider-cooldown-api-3556.test.ts index 7de0718772..88b08a07c3 100644 --- a/tests/unit/resilience-provider-cooldown-api-3556.test.ts +++ b/tests/unit/resilience-provider-cooldown-api-3556.test.ts @@ -41,6 +41,16 @@ describe("providerCooldown in updateResilienceSchema", () => { }); assert.equal(result.success, false, "Schema should reject unknown keys"); }); + + it("rejects providerCooldown max below min", () => { + const result = updateResilienceSchema.safeParse({ + providerCooldown: { + minRetryCooldownMs: 120000, + maxRetryCooldownMs: 30000, + }, + }); + assert.equal(result.success, false, "Schema should reject contradictory cooldown bounds"); + }); }); describe("providerCooldown roundtrip through mergeResilienceSettings", () => {