Skip to content

Commit 5014285

Browse files
authored
Fix Codex manual reset refresh (#2710)
1 parent b1b80a9 commit 5014285

2 files changed

Lines changed: 94 additions & 4 deletions

File tree

Sources/CodexBar/Providers/Codex/CodexWeeklyResetConfirmation.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,12 @@ struct CodexWeeklyResetConfirmation: Sendable {
143143
previousWeekly,
144144
capturedAt: previous.updatedAt)
145145
{
146-
if confirmation.updatedAt < previousBoundary.addingTimeInterval(-2 * 60) {
146+
let confirmsManualReset = Self.confirmsManualResetCreditRedemption(
147+
previous: previous,
148+
confirmation: confirmation)
149+
if confirmation.updatedAt < previousBoundary.addingTimeInterval(-2 * 60),
150+
!confirmsManualReset
151+
{
147152
return .preservePrevious
148153
}
149154
guard initialBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds,
@@ -155,6 +160,27 @@ struct CodexWeeklyResetConfirmation: Sendable {
155160
return .publishConfirmation
156161
}
157162

163+
private static func confirmsManualResetCreditRedemption(
164+
previous: UsageSnapshot,
165+
confirmation: UsageSnapshot) -> Bool
166+
{
167+
guard let previousCredits = previous.codexResetCredits,
168+
let confirmationCredits = confirmation.codexResetCredits,
169+
self.isFinite(previousCredits.updatedAt),
170+
self.isFinite(confirmationCredits.updatedAt),
171+
confirmationCredits.updatedAt >= previousCredits.updatedAt
172+
else {
173+
return false
174+
}
175+
let previouslyAvailableIDs = Set(previousCredits.credits.lazy
176+
.filter { $0.status == .available }
177+
.map(\.id))
178+
guard !previouslyAvailableIDs.isEmpty else { return false }
179+
return confirmationCredits.credits.contains { credit in
180+
previouslyAvailableIDs.contains(credit.id) && credit.status == .redeemed
181+
}
182+
}
183+
158184
private static func initialDecisionWithoutWeeklyBaseline(
159185
initialWeekly: RateWindow,
160186
capturedAt: Date) -> InitialDecision

Tests/CodexBarTests/CodexWeeklyResetConfirmationTests.swift

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,47 @@ struct CodexWeeklyResetConfirmationTests {
270270
== .preservePrevious)
271271
}
272272

273+
@Test
274+
func `redeemed reset credit confirms an early manual weekly reset`() throws {
275+
let formatter = ISO8601DateFormatter()
276+
let previousCapturedAt = try #require(formatter.date(from: "2026-07-28T03:09:20Z"))
277+
let previousReset = try #require(formatter.date(from: "2026-08-02T10:17:56Z"))
278+
let initialCapturedAt = try #require(formatter.date(from: "2026-07-28T03:59:23Z"))
279+
let initialReset = try #require(formatter.date(from: "2026-08-04T03:59:21Z"))
280+
let previous = self.snapshot(
281+
capturedAt: previousCapturedAt,
282+
weeklyUsed: 100,
283+
weeklyReset: previousReset,
284+
resetCredits: self.resetCredits(
285+
status: .available,
286+
capturedAt: previousCapturedAt))
287+
let initial = self.snapshot(
288+
capturedAt: initialCapturedAt,
289+
weeklyUsed: 0,
290+
weeklyReset: initialReset,
291+
resetCredits: self.resetCredits(
292+
status: .redeeming,
293+
capturedAt: initialCapturedAt))
294+
let confirmationCapturedAt = initialCapturedAt.addingTimeInterval(30)
295+
let confirmation = self.snapshot(
296+
capturedAt: confirmationCapturedAt,
297+
weeklyUsed: 0,
298+
weeklyReset: initialReset.addingTimeInterval(30),
299+
resetCredits: self.resetCredits(
300+
status: .redeemed,
301+
capturedAt: confirmationCapturedAt))
302+
303+
#expect(
304+
CodexWeeklyResetConfirmation.initialDecision(previous: previous, initial: initial)
305+
== .requiresConfirmation)
306+
#expect(
307+
CodexWeeklyResetConfirmation.confirmationDecision(
308+
previous: previous,
309+
initial: initial,
310+
confirmation: confirmation)
311+
== .publishConfirmation)
312+
}
313+
273314
@Test
274315
func `prior boundary due tolerance includes the exact two minute edge`() {
275316
let previousBoundary = self.resetAt
@@ -442,20 +483,23 @@ struct CodexWeeklyResetConfirmationTests {
442483
offset: TimeInterval,
443484
weeklyUsed: Double?,
444485
weeklyReset: Date?,
445-
weeklyInPrimary: Bool = false) -> UsageSnapshot
486+
weeklyInPrimary: Bool = false,
487+
resetCredits: CodexRateLimitResetCreditsSnapshot? = nil) -> UsageSnapshot
446488
{
447489
self.snapshot(
448490
capturedAt: self.capturedAt.addingTimeInterval(offset),
449491
weeklyUsed: weeklyUsed,
450492
weeklyReset: weeklyReset,
451-
weeklyInPrimary: weeklyInPrimary)
493+
weeklyInPrimary: weeklyInPrimary,
494+
resetCredits: resetCredits)
452495
}
453496

454497
private func snapshot(
455498
capturedAt: Date,
456499
weeklyUsed: Double?,
457500
weeklyReset: Date?,
458-
weeklyInPrimary: Bool = false) -> UsageSnapshot
501+
weeklyInPrimary: Bool = false,
502+
resetCredits: CodexRateLimitResetCreditsSnapshot? = nil) -> UsageSnapshot
459503
{
460504
let weekly = weeklyUsed.map {
461505
RateWindow(
@@ -472,6 +516,26 @@ struct CodexWeeklyResetConfirmationTests {
472516
return UsageSnapshot(
473517
primary: weeklyInPrimary ? weekly : session,
474518
secondary: weeklyInPrimary ? session : weekly,
519+
codexResetCredits: resetCredits,
520+
updatedAt: capturedAt)
521+
}
522+
523+
private func resetCredits(
524+
status: CodexRateLimitResetCreditStatus,
525+
capturedAt: Date) -> CodexRateLimitResetCreditsSnapshot
526+
{
527+
CodexRateLimitResetCreditsSnapshot(
528+
credits: [CodexRateLimitResetCredit(
529+
id: "manual-reset-credit",
530+
resetType: "codex_rate_limits",
531+
status: status,
532+
grantedAt: capturedAt.addingTimeInterval(-24 * 60 * 60),
533+
expiresAt: capturedAt.addingTimeInterval(24 * 60 * 60),
534+
redeemStartedAt: status == .available ? nil : capturedAt,
535+
redeemedAt: status == .redeemed ? capturedAt : nil,
536+
title: nil,
537+
description: nil)],
538+
availableCount: status == .available ? 1 : 0,
475539
updatedAt: capturedAt)
476540
}
477541
}

0 commit comments

Comments
 (0)