Skip to content

Commit 0c362ff

Browse files
committed
Merge branch 'main' into rat-110-claude-source-planner-consolidation
# Conflicts: # Sources/CodexBar/UsageStore.swift
2 parents 468950d + 9d56dfd commit 0c362ff

32 files changed

+2421
-235
lines changed

Sources/CodexBar/HistoricalUsagePace.swift

Lines changed: 852 additions & 0 deletions
Large diffs are not rendered by default.

Sources/CodexBar/MenuBarDisplayText.swift

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,29 @@ enum MenuBarDisplayText {
99
return String(format: "%.0f%%", clamped)
1010
}
1111

12-
static func paceText(provider: UsageProvider, window: RateWindow?, now: Date = .init()) -> String? {
13-
guard let window else { return nil }
14-
guard let pace = UsagePaceText.weeklyPace(provider: provider, window: window, now: now) else { return nil }
12+
static func paceText(pace: UsagePace?) -> String? {
13+
guard let pace else { return nil }
1514
let deltaValue = Int(abs(pace.deltaPercent).rounded())
1615
let sign = pace.deltaPercent >= 0 ? "+" : "-"
1716
return "\(sign)\(deltaValue)%"
1817
}
1918

2019
static func displayText(
2120
mode: MenuBarDisplayMode,
22-
provider: UsageProvider,
2321
percentWindow: RateWindow?,
24-
paceWindow: RateWindow?,
25-
showUsed: Bool,
26-
now: Date = .init()) -> String?
22+
pace: UsagePace? = nil,
23+
showUsed: Bool) -> String?
2724
{
2825
switch mode {
2926
case .percent:
3027
return self.percentText(window: percentWindow, showUsed: showUsed)
3128
case .pace:
32-
return self.paceText(provider: provider, window: paceWindow, now: now)
29+
return self.paceText(pace: pace)
3330
case .both:
3431
guard let percent = percentText(window: percentWindow, showUsed: showUsed) else { return nil }
35-
guard let pace = Self.paceText(provider: provider, window: paceWindow, now: now) else { return nil }
36-
return "\(percent) · \(pace)"
32+
let paceText: String? = Self.paceText(pace: pace)
33+
guard let paceText else { return nil }
34+
return "\(percent) · \(paceText)"
3735
}
3836
}
3937
}

Sources/CodexBar/MenuCardView.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ extension UsageMenuCardView.Model {
635635
let sourceLabel: String?
636636
let kiloAutoMode: Bool
637637
let hidePersonalInfo: Bool
638+
let weeklyPace: UsagePace?
638639
let now: Date
639640

640641
init(
@@ -657,6 +658,7 @@ extension UsageMenuCardView.Model {
657658
sourceLabel: String? = nil,
658659
kiloAutoMode: Bool = false,
659660
hidePersonalInfo: Bool,
661+
weeklyPace: UsagePace? = nil,
660662
now: Date)
661663
{
662664
self.provider = provider
@@ -678,6 +680,7 @@ extension UsageMenuCardView.Model {
678680
self.sourceLabel = sourceLabel
679681
self.kiloAutoMode = kiloAutoMode
680682
self.hidePersonalInfo = hidePersonalInfo
683+
self.weeklyPace = weeklyPace
681684
self.now = now
682685
}
683686
}
@@ -933,9 +936,9 @@ extension UsageMenuCardView.Model {
933936
}
934937
if let weekly = snapshot.secondary {
935938
let paceDetail = Self.weeklyPaceDetail(
936-
provider: input.provider,
937939
window: weekly,
938940
now: input.now,
941+
pace: input.weeklyPace,
939942
showUsed: input.usageBarsShowUsed)
940943
var weeklyResetText = Self.resetText(for: weekly, style: input.resetTimeDisplayStyle, now: input.now)
941944
var weeklyDetailText: String? = input.provider == .zai ? zaiTimeDetail : nil
@@ -1049,12 +1052,13 @@ extension UsageMenuCardView.Model {
10491052
}
10501053

10511054
private static func weeklyPaceDetail(
1052-
provider: UsageProvider,
10531055
window: RateWindow,
10541056
now: Date,
1057+
pace: UsagePace?,
10551058
showUsed: Bool) -> PaceDetail?
10561059
{
1057-
guard let detail = UsagePaceText.weeklyDetail(provider: provider, window: window, now: now) else { return nil }
1060+
guard let pace else { return nil }
1061+
let detail = UsagePaceText.weeklyDetail(pace: pace, now: now)
10581062
let expectedUsed = detail.expectedUsedPercent
10591063
let actualUsed = window.usedPercent
10601064
let expectedPercent = showUsed ? expectedUsed : (100 - expectedUsed)

Sources/CodexBar/MenuDescriptor.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ struct MenuDescriptor {
166166
{
167167
entries.append(.text(detail, .secondary))
168168
}
169-
if let paceSummary = UsagePaceText.weeklySummary(provider: provider, window: weekly) {
169+
if let pace = store.weeklyPace(provider: provider, window: weekly) {
170+
let paceSummary = UsagePaceText.weeklySummary(pace: pace)
170171
entries.append(.text(paceSummary, .secondary))
171172
}
172173
}

Sources/CodexBar/PreferencesProvidersPane.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,10 @@ struct ProvidersPane: View {
338338
tokenError = nil
339339
}
340340

341+
let now = Date()
342+
let weeklyPace = snapshot?.secondary.flatMap { window in
343+
self.store.weeklyPace(provider: provider, window: window, now: now)
344+
}
341345
let input = UsageMenuCardView.Model.Input(
342346
provider: provider,
343347
metadata: metadata,
@@ -356,7 +360,8 @@ struct ProvidersPane: View {
356360
tokenCostUsageEnabled: self.settings.isCostUsageEffectivelyEnabled(for: provider),
357361
showOptionalCreditsAndExtraUsage: self.settings.showOptionalCreditsAndExtraUsage,
358362
hidePersonalInfo: self.settings.hidePersonalInfo,
359-
now: Date())
363+
weeklyPace: weeklyPace,
364+
now: now)
360365
return UsageMenuCardView.Model.make(input)
361366
}
362367

Sources/CodexBar/Providers/Codex/CodexProviderImplementation.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ struct CodexProviderImplementation: ProviderImplementation {
7171
})
7272

7373
return [
74+
ProviderSettingsToggleDescriptor(
75+
id: "codex-historical-tracking",
76+
title: "Historical tracking",
77+
subtitle: "Stores local Codex usage history (8 weeks) to personalize Pace predictions.",
78+
binding: context.boolBinding(\.historicalTrackingEnabled),
79+
statusText: nil,
80+
actions: [],
81+
isVisible: nil,
82+
onChange: nil,
83+
onAppDidBecomeActive: nil,
84+
onAppearWhenEnabled: nil),
7485
ProviderSettingsToggleDescriptor(
7586
id: "codex-openai-web-extras",
7687
title: "OpenAI web extras",

Sources/CodexBar/SettingsStore+Defaults.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ extension SettingsStore {
150150
}
151151
}
152152

153+
var historicalTrackingEnabled: Bool {
154+
get { self.defaultsState.historicalTrackingEnabled }
155+
set {
156+
self.defaultsState.historicalTrackingEnabled = newValue
157+
self.userDefaults.set(newValue, forKey: "historicalTrackingEnabled")
158+
}
159+
}
160+
153161
var menuBarMetricPreferencesRaw: [String: String] {
154162
get { self.defaultsState.menuBarMetricPreferencesRaw }
155163
set {

Sources/CodexBar/SettingsStore+MenuObservation.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ extension SettingsStore {
1616
_ = self.menuBarShowsBrandIconWithPercent
1717
_ = self.menuBarShowsHighestUsage
1818
_ = self.menuBarDisplayMode
19+
_ = self.historicalTrackingEnabled
1920
_ = self.showAllTokenAccountsInMenu
2021
_ = self.menuBarMetricPreferencesRaw
2122
_ = self.costUsageEnabled

Sources/CodexBar/SettingsStore.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ extension SettingsStore {
190190
forKey: "menuBarShowsBrandIconWithPercent") as? Bool ?? false
191191
let menuBarDisplayModeRaw = userDefaults.string(forKey: "menuBarDisplayMode")
192192
?? MenuBarDisplayMode.percent.rawValue
193+
let historicalTrackingEnabled = userDefaults.object(forKey: "historicalTrackingEnabled") as? Bool ?? false
193194
let showAllTokenAccountsInMenu = userDefaults.object(forKey: "showAllTokenAccountsInMenu") as? Bool ?? false
194195
let storedPreferences = userDefaults.dictionary(forKey: "menuBarMetricPreferences") as? [String: String] ?? [:]
195196
var resolvedPreferences = storedPreferences
@@ -238,6 +239,7 @@ extension SettingsStore {
238239
resetTimesShowAbsolute: resetTimesShowAbsolute,
239240
menuBarShowsBrandIconWithPercent: menuBarShowsBrandIconWithPercent,
240241
menuBarDisplayModeRaw: menuBarDisplayModeRaw,
242+
historicalTrackingEnabled: historicalTrackingEnabled,
241243
showAllTokenAccountsInMenu: showAllTokenAccountsInMenu,
242244
menuBarMetricPreferencesRaw: resolvedPreferences,
243245
costUsageEnabled: costUsageEnabled,

Sources/CodexBar/SettingsStoreState.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct SettingsDefaultsState: Sendable {
1515
var resetTimesShowAbsolute: Bool
1616
var menuBarShowsBrandIconWithPercent: Bool
1717
var menuBarDisplayModeRaw: String?
18+
var historicalTrackingEnabled: Bool
1819
var showAllTokenAccountsInMenu: Bool
1920
var menuBarMetricPreferencesRaw: [String: String]
2021
var costUsageEnabled: Bool

0 commit comments

Comments
 (0)