From 9e6cce6358c01807e7abf810b9cc902c5a810983 Mon Sep 17 00:00:00 2001
From: Miorbnli
Date: Wed, 15 Jul 2026 16:15:36 +0800
Subject: [PATCH] fix(ui): show <1m for sub-minute quota reset windows instead
of 0m (#108009)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix(ui): show <1m for sub-minute quota reset windows instead of 0m
formatQuotaReset computed Math.floor(diffMs / 60_000) for the minute branch.
When a provider quota window resets in under 60 seconds (common for 5h Anthropic
or 3h Codex windows near rollover), the floor is 0 and the UI rendered
"Resets in 0m" — nonsensical and indistinguishable from "already reset".
Add a sub-minute guard returning "<1m", matching the convention already used
by formatRemainingShort and formatRelativeTimestamp elsewhere in the codebase.
Co-Authored-By: Claude
* test(ui): cover quota reset display boundary
Co-Authored-By: ZCode
* test(ui): cover elapsed quota reset boundary
Co-Authored-By: ZCode
---------
Co-authored-by: Claude
Co-authored-by: ZCode
---
ui/src/lib/provider-quota-summary.test.ts | 10 ++++++++++
ui/src/lib/provider-quota-summary.ts | 3 +++
2 files changed, 13 insertions(+)
diff --git a/ui/src/lib/provider-quota-summary.test.ts b/ui/src/lib/provider-quota-summary.test.ts
index d038ab1d1ac3..3cd9c17902b6 100644
--- a/ui/src/lib/provider-quota-summary.test.ts
+++ b/ui/src/lib/provider-quota-summary.test.ts
@@ -15,6 +15,16 @@ describe("formatQuotaReset", () => {
expect(formatQuotaReset(Date.now() + 2 * 60 * 60_000 + 15 * 60_000)).toBe("2h 15m");
});
+ it("returns <1m for sub-minute reset windows instead of 0m", () => {
+ vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-05-30T12:00:00.000Z"));
+
+ expect(formatQuotaReset(Date.now() - 1)).toBe("now");
+ expect(formatQuotaReset(Date.now())).toBe("now");
+ expect(formatQuotaReset(Date.now() + 1)).toBe("<1m");
+ expect(formatQuotaReset(Date.now() + 59_999)).toBe("<1m");
+ expect(formatQuotaReset(Date.now() + 60_000)).toBe("1m");
+ });
+
it("ignores Date-invalid reset timestamps", () => {
expect(formatQuotaReset(8_640_000_000_000_001)).toBeNull();
expect(formatQuotaReset(Number.POSITIVE_INFINITY)).toBeNull();
diff --git a/ui/src/lib/provider-quota-summary.ts b/ui/src/lib/provider-quota-summary.ts
index 14e29606f79a..310109318bbb 100644
--- a/ui/src/lib/provider-quota-summary.ts
+++ b/ui/src/lib/provider-quota-summary.ts
@@ -12,6 +12,9 @@ export function formatQuotaReset(resetAt?: number): string | null {
return "now";
}
const minutes = Math.floor(diffMs / 60_000);
+ if (minutes < 1) {
+ return "<1m";
+ }
if (minutes < 60) {
return `${minutes}m`;
}