From b0643a6eaff1d4bfc568a19cde3691f3d40e87f9 Mon Sep 17 00:00:00 2001 From: Yuxin Qiao <104957188+Yuxin-Qiao@users.noreply.github.com> Date: Thu, 2 Jul 2026 12:20:37 +0800 Subject: [PATCH 1/3] Fix Cursor pace detail when quota is depleted --- .../CodexBar/MenuCardView+ModelHelpers.swift | 3 +- .../CursorMenuCardModelTests.swift | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Sources/CodexBar/MenuCardView+ModelHelpers.swift b/Sources/CodexBar/MenuCardView+ModelHelpers.swift index 33c9f014be..f785c33105 100644 --- a/Sources/CodexBar/MenuCardView+ModelHelpers.swift +++ b/Sources/CodexBar/MenuCardView+ModelHelpers.swift @@ -414,7 +414,8 @@ extension UsageMenuCardView.Model { pace: UsagePace? = nil) -> PaceDetail? { guard input.provider == .cursor, - window.windowMinutes != nil + window.windowMinutes != nil, + window.remainingPercent > 0 else { return nil } let resolved = pace ?? UsagePace.weekly( window: window, diff --git a/Tests/CodexBarTests/CursorMenuCardModelTests.swift b/Tests/CodexBarTests/CursorMenuCardModelTests.swift index 0ecb5c9ea9..528e5e2e0f 100644 --- a/Tests/CodexBarTests/CursorMenuCardModelTests.swift +++ b/Tests/CodexBarTests/CursorMenuCardModelTests.swift @@ -99,6 +99,52 @@ struct CursorMenuCardModelTests { } } + @Test + func `cursor billing cycle metrics hide pace when quota is depleted`() throws { + let now = Date(timeIntervalSince1970: 0) + let reset = now.addingTimeInterval(6 * 24 * 3600) + let cycleMinutes = 30 * 24 * 60 + let snapshot = UsageSnapshot( + primary: RateWindow(usedPercent: 100, windowMinutes: cycleMinutes, resetsAt: reset, resetDescription: nil), + secondary: RateWindow( + usedPercent: 100, + windowMinutes: cycleMinutes, + resetsAt: reset, + resetDescription: nil), + tertiary: RateWindow(usedPercent: 100, windowMinutes: cycleMinutes, resetsAt: reset, resetDescription: nil), + updatedAt: now, + identity: nil) + let metadata = try #require(ProviderDefaults.metadata[.cursor]) + + let model = UsageMenuCardView.Model.make(.init( + provider: .cursor, + metadata: metadata, + snapshot: snapshot, + credits: nil, + creditsError: nil, + dashboard: nil, + dashboardError: nil, + tokenSnapshot: nil, + tokenError: nil, + account: AccountInfo(email: nil, plan: nil), + isRefreshing: false, + lastError: nil, + usageBarsShowUsed: false, + resetTimeDisplayStyle: .countdown, + tokenCostUsageEnabled: false, + showOptionalCreditsAndExtraUsage: true, + hidePersonalInfo: false, + now: now)) + + #expect(model.metrics.map(\.title) == ["Total", "Auto", "API"]) + for metric in model.metrics { + #expect(metric.percentLabel == "0% left") + #expect(metric.detailLeftText == nil) + #expect(metric.detailRightText == nil) + #expect(metric.pacePercent == nil) + } + } + @Test func `legacy request plan shows single requests bar with count`() throws { let now = Date(timeIntervalSince1970: 0) @@ -142,4 +188,5 @@ struct CursorMenuCardModelTests { #expect(model.metrics.map(\.title) == ["Requests"]) #expect(model.metrics.first?.detailText == "Request quota: 347 / 500") } + } From b5bb03219dbe96070681edf2a6ed316cd867fef4 Mon Sep 17 00:00:00 2001 From: Yuxin Qiao <104957188+Yuxin-Qiao@users.noreply.github.com> Date: Thu, 2 Jul 2026 13:00:01 +0800 Subject: [PATCH 2/3] Fix SwiftFormat trailing blank line in Cursor menu card tests. Co-authored-by: Cursor --- Tests/CodexBarTests/CursorMenuCardModelTests.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/CodexBarTests/CursorMenuCardModelTests.swift b/Tests/CodexBarTests/CursorMenuCardModelTests.swift index 528e5e2e0f..bb0c4b8293 100644 --- a/Tests/CodexBarTests/CursorMenuCardModelTests.swift +++ b/Tests/CodexBarTests/CursorMenuCardModelTests.swift @@ -188,5 +188,4 @@ struct CursorMenuCardModelTests { #expect(model.metrics.map(\.title) == ["Requests"]) #expect(model.metrics.first?.detailText == "Request quota: 347 / 500") } - } From 6850e41fac311aac4f5cb9360368e24b9b7df95a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 2 Jul 2026 02:42:35 -0700 Subject: [PATCH 3/3] docs: note depleted Cursor pace fix --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f91e0cd42..d6c5ed21c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Quota warnings: add an optional centered on-screen text alert that stays click-through and does not steal focus. Thanks @SAASEmpiree! ### Fixed +- Cursor: hide misleading pace and run-out details once a billing-cycle quota is fully depleted. Thanks @Yuxin-Qiao! - Claude Education: treat subscription-only CLI responses as unavailable quotas, keep local cost data in menus and widgets, and suppress expected refresh cancellations (#1808). - Claude web usage: bound stale requests so Auto can reach CLI fallback instead of hanging indefinitely. - Claude history: keep OAuth utilization separate across account switches while preserving continuity through token refreshes.