From 63af84d54d96aaaa71e206032b37322d91f75fdb Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:23:56 -0500 Subject: [PATCH 01/21] feat(history): unified calendar with intensity levels, hover day card and streaks --- .../Resources/en.lproj/Localizable.strings | 6 + .../Resources/es.lproj/Localizable.strings | 6 + .../Services/HistoryDashboardModel.swift | 64 +++++++- .../Support/HistoryIntensity.swift | 22 +++ .../Views/HistoryCalendarView.swift | 121 ++++++++++++--- .../Views/HistoryDayCardView.swift | 126 ++++++++++++++++ .../Views/HistoryPanelView.swift | 142 ++++++++++++++++-- Sources/TokenGaugeCore/HistoryAnalytics.swift | 28 ++++ .../TokenGaugeCore/UsageHistoryStore.swift | 20 +++ .../HistoryCalendarRenderingTests.swift | 37 +++++ .../HistoryDashboardTests.swift | 36 +++++ .../HistoryDayCardTests.swift | 73 +++++++++ .../HistoryAnalyticsTests.swift | 37 +++++ .../UsageHistoryStoreTests.swift | 19 +++ 14 files changed, 697 insertions(+), 40 deletions(-) create mode 100644 Sources/TokenGaugeApp/Support/HistoryIntensity.swift create mode 100644 Sources/TokenGaugeApp/Views/HistoryDayCardView.swift create mode 100644 Tests/TokenGaugeAppTests/HistoryDayCardTests.swift diff --git a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings index 7292df0..5bd4481 100644 --- a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings @@ -166,6 +166,12 @@ "history.equal_use" = "Equal recorded usage for both providers"; "history.weekends" = "Saturdays and Sundays"; "history.period" = "History period"; +"history.streak" = "Streak %1$@ d · best %2$@ d"; +"history.streak_current" = "Current streak: %@ d"; +"history.streak_longest" = "Longest streak: %@ d"; +"history.share" = "%@ of the day's total"; +"history.no_activity" = "No recorded activity"; +"history.close" = "Close"; "pace.last_value" = "Last ≈ %@ pp/h"; "pace.info_title" = "Weekly usage pace"; "pace.info_explanation" = "Estimates how quickly you use this allowance. For example, 5 pp/h means going from 80% to 75% remaining in one hour."; diff --git a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings index 19bae90..ed3dd2a 100644 --- a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings @@ -166,6 +166,12 @@ "history.equal_use" = "Mismo uso registrado en ambos proveedores"; "history.weekends" = "Sábados y domingos"; "history.period" = "Periodo del historial"; +"history.streak" = "Racha %1$@ d · mejor %2$@ d"; +"history.streak_current" = "Racha actual: %@ d"; +"history.streak_longest" = "Mejor racha: %@ d"; +"history.share" = "%@ del total del día"; +"history.no_activity" = "Sin actividad registrada"; +"history.close" = "Cerrar"; "pace.last_value" = "Último ≈ %@ pp/h"; "pace.info_title" = "Ritmo de uso semanal"; "pace.info_explanation" = "Estima qué tan rápido consumes esta cuota. Por ejemplo, 5 pp/h equivale a pasar de 80% a 75% libre en una hora."; diff --git a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift index d0b8b23..f87d44b 100644 --- a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift +++ b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift @@ -34,10 +34,30 @@ struct HistoryCalendarDay: Identifiable, Equatable, Sendable { } } +struct HistoryDaySelection: Equatable, Sendable { + var dayKey: String + var isPinned: Bool + var anchor: CGRect? +} + +struct HistoryUsageDays: Equatable, Sendable { + var claude: Set = [] + var codex: Set = [] + var any: Set = [] + + func days(for providers: [UsageProvider]) -> Set { + if providers == [.claude] { return claude } + if providers == [.codex] { return codex } + return any + } +} + @MainActor final class HistoryDashboardModel: ObservableObject { @Published var offset = 0 @Published var selectedDayKey: String? + @Published var daySelection: HistoryDaySelection? + @Published private(set) var usageDays = HistoryUsageDays() @Published private(set) var days: [HistoryCalendarDay] = [] @Published private(set) var isLoading = false @Published private(set) var loadedMode: HistoryMode? @@ -67,6 +87,7 @@ final class HistoryDashboardModel: ObservableObject { } } days = Self.makeDays(interval: interval, tokens: rows, efforts: previewEfforts) + usageDays = Self.usageDays(tokens: rows) loadedMode = mode periodStart = interval.start periodEnd = interval.end @@ -92,6 +113,32 @@ final class HistoryDashboardModel: ObservableObject { selectedDayKey = nil } + func streak(for providers: [UsageProvider]) -> (current: Int, longest: Int) { + HistoryAnalytics.streaks(usageDays: usageDays.days(for: providers), today: Self.dayKey(Date())) + } + + func showDayCard(_ dayKey: String, anchor: CGRect?) { + guard daySelection?.isPinned != true else { return } + daySelection = HistoryDaySelection(dayKey: dayKey, isPinned: false, anchor: anchor) + } + + func hideDayCard() { + guard daySelection?.isPinned != true else { return } + daySelection = nil + } + + func pinDayCard(_ dayKey: String, anchor: CGRect?) { + if let current = daySelection, current.isPinned, current.dayKey == dayKey { + daySelection = nil + return + } + daySelection = HistoryDaySelection(dayKey: dayKey, isPinned: true, anchor: anchor) + } + + func dismissDayCard() { + daySelection = nil + } + func pace(provider: UsageProvider, window: QuotaWindow, capturedAt: Date?) -> QuotaPace? { let key = provider.rawValue + ":" + window.id guard let current = Self.usablePace(paces[key], for: window, capturedAt: capturedAt) @@ -151,7 +198,7 @@ final class HistoryDashboardModel: ObservableObject { } result = ReadResult( days: Self.makeDays(interval: interval, tokens: rows, efforts: previewEfforts), - latest: [], retained: [], first: rows.map(\.day).min()) + latest: [], retained: [], first: rows.map(\.day).min(), usage: Self.usageDays(tokens: rows)) } else { result = try await Task.detached(priority: .utility) { let tokens = try UsageHistoryStore.tokenRows(since: first, through: last) @@ -163,7 +210,11 @@ final class HistoryDashboardModel: ObservableObject { accountFingerprint: accountFingerprint), retained: try UsageHistoryStore.recentPaces( for: paceKeys, activeOnly: true, before: now, accountFingerprint: accountFingerprint), - first: try UsageHistoryStore.bounds().firstDay) + first: try UsageHistoryStore.bounds().firstDay, + usage: HistoryUsageDays( + claude: try UsageHistoryStore.usageDays(provider: .claude), + codex: try UsageHistoryStore.usageDays(provider: .codex), + any: try UsageHistoryStore.usageDays())) }.value } guard !Task.isCancelled, generation == request else { return } @@ -176,6 +227,7 @@ final class HistoryDashboardModel: ObservableObject { periodEnd = interval.end firstRecordedDay = result.first days = result.days + usageDays = result.usage loadedMode = mode paces = Dictionary(uniqueKeysWithValues: result.latest.map { ($0.key.id, $0.pace) }) paceActivity = Dictionary(uniqueKeysWithValues: result.latest.map { ($0.key.id, $0.isActive) }) @@ -251,6 +303,13 @@ final class HistoryDashboardModel: ObservableObject { return result } + nonisolated static func usageDays(tokens: [HistoryTokenRow]) -> HistoryUsageDays { + let used = tokens.filter { $0.tokens > 0 } + let claude = Set(used.filter { $0.provider == .claude }.map(\.day)) + let codex = Set(used.filter { $0.provider == .codex }.map(\.day)) + return HistoryUsageDays(claude: claude, codex: codex, any: claude.union(codex)) + } + nonisolated private static func sum(_ values: [Int]) -> Int { values.reduce(0) { partial, value in let addition = partial.addingReportingOverflow(value) @@ -263,5 +322,6 @@ final class HistoryDashboardModel: ObservableObject { let latest: [HistoryPaceRow] let retained: [HistoryPaceRow] let first: String? + let usage: HistoryUsageDays } } diff --git a/Sources/TokenGaugeApp/Support/HistoryIntensity.swift b/Sources/TokenGaugeApp/Support/HistoryIntensity.swift new file mode 100644 index 0000000..cb03fc1 --- /dev/null +++ b/Sources/TokenGaugeApp/Support/HistoryIntensity.swift @@ -0,0 +1,22 @@ +import Foundation + +enum HistoryIntensity { + static let opacities: [Double] = [0.30, 0.48, 0.66, 0.84, 1.0] + static let minorityShare = 0.25 + + static func thresholds(totals: [Int]) -> [Int] { + let sorted = totals.filter { $0 > 0 }.sorted() + guard !sorted.isEmpty else { return [] } + return [0.2, 0.4, 0.6, 0.8].map { quantile in + sorted[min(sorted.count - 1, Int(Double(sorted.count - 1) * quantile))] + } + } + + static func level(total: Int, thresholds: [Int]) -> Int { + thresholds.filter { total > $0 }.count + } + + static func opacity(total: Int, thresholds: [Int]) -> Double { + opacities[min(opacities.count - 1, level(total: total, thresholds: thresholds))] + } +} diff --git a/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift b/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift index b3f26df..740ec18 100644 --- a/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift @@ -8,6 +8,11 @@ struct HistoryCalendarView: NSViewRepresentable { let selectedDayKey: String? let focusID: String var hoverEnabled = true + var accent: Color = Color(nsColor: .labelColor) + var pinnedDayKey: String? + var onHoverCard: @MainActor (String?, CGRect?) -> Void = { _, _ in } + var onPinCard: @MainActor (String, CGRect?) -> Void = { _, _ in } + var onExitCalendar: @MainActor () -> Void = {} let onSelect: @MainActor (String) -> Void func makeNSView(context: Context) -> HistoryCalendarScrollView { @@ -57,7 +62,6 @@ final class HistoryCalendarScrollView: NSScrollView { } else if oldPadding != calendar.sidePadding { contentView.scroll(to: NSPoint(x: contentView.bounds.minX + calendar.sidePadding - oldPadding, y: 0)) } - calendar.updateTooltips() reflectScrolledClipView(contentView) } @@ -77,11 +81,16 @@ final class HistoryCalendarCanvas: NSView { private var days: [HistoryCalendarDay] = [] private var providers: [UsageProvider] = [] private var selected: String? + private var pinned: String? private var hoverEnabled = true private var onSelect: (@MainActor (String) -> Void)? + private var onHoverCard: (@MainActor (String?, CGRect?) -> Void)? + private var onPinCard: (@MainActor (String, CGRect?) -> Void)? + private var onExitCalendar: (@MainActor () -> Void)? + private var hoverIndex: Int? + private var hoverWork: DispatchWorkItem? private var locale = Locale.current private var today = Calendar.current.startOfDay(for: Date()) - private var maximum = 1 private var tracking: NSTrackingArea? private var lastMousePosition: NSPoint? private var elements: [HistoryCalendarAccessibilityDay] = [] @@ -89,11 +98,12 @@ final class HistoryCalendarCanvas: NSView { private var monthLayout = HistoryMonthLayout(days: []) private var months: [(HistoryMonthLayout.Section, String)] = [] private var fills: [[NSColor]] = [] - var sidePadding: CGFloat = 0 { didSet { if sidePadding != oldValue { tooltipsDirty = true; needsDisplay = true } } } - private var tooltipsDirty = true + private var minorities: [NSColor?] = [] + var sidePadding: CGFloat = 0 { didSet { if sidePadding != oldValue { needsDisplay = true } } } var gridWidth: CGFloat { max(9, monthLayout.gridWidth) } override var isFlipped: Bool { true } - private var accent: NSColor { NSColor(providers == [.claude] ? Theme.claude : Theme.codex) } + private var accentColor = Color(nsColor: .labelColor) + private var accent: NSColor { NSColor(accentColor) } var focusIndex: Int? { days.firstIndex { Calendar.current.isDate($0.date, inSameDayAs: today) } ?? days.lastIndex { $0.date <= today && $0.total(for: providers) != nil } @@ -102,11 +112,16 @@ final class HistoryCalendarCanvas: NSView { func update(_ value: HistoryCalendarView) { onSelect = value.onSelect + onHoverCard = value.onHoverCard + onPinCard = value.onPinCard + onExitCalendar = value.onExitCalendar hoverEnabled = value.hoverEnabled + pinned = value.pinnedDayKey let language = Locale(identifier: LocalizationManager.shared.language.rawValue) let newToday = Calendar.current.startOfDay(for: Date()) let changed = providers != value.providers || locale != language || today != newToday + || accentColor != value.accent || days.count != value.days.count || !zip(days, value.days).allSatisfy { $0.id == $1.id && $0.date == $1.date && $0.totals == $1.totals } let selectionChanged = selected != value.selectedDayKey @@ -115,24 +130,33 @@ final class HistoryCalendarCanvas: NSView { if changed { days = value.days providers = value.providers + accentColor = value.accent locale = language today = newToday - maximum = max(1, days.compactMap { $0.total(for: providers) }.max() ?? 0) monthLayout = HistoryMonthLayout(days: days) descriptions = days.map(description) months = monthLayout.sections.map { ($0, $0.date.formatted(.dateTime.month(.wide).locale(locale)).capitalized(with: locale)) } + let thresholds = HistoryIntensity.thresholds(totals: days.compactMap { $0.total(for: providers) }) fills = days.map { day in - let opacity = 0.25 + 0.75 * Double(day.total(for: providers) ?? 0) / Double(maximum) + let opacity = HistoryIntensity.opacity(total: day.total(for: providers) ?? 0, thresholds: thresholds) return day.dominantProviders(for: providers).map { provider in - NSColor(provider == .codex ? Theme.codex : Theme.claude).withAlphaComponent(opacity) + color(provider).withAlphaComponent(opacity) } } + minorities = days.map { day in + let leaders = day.dominantProviders(for: providers) + guard leaders.count == 1, let leader = leaders.first, let total = day.total(for: providers), total > 0, + let minority = providers.first(where: { $0 != leader }), + Double(day.tokens(for: minority) ?? 0) >= HistoryIntensity.minorityShare * Double(total) + else { return nil } + return color(minority).withAlphaComponent( + HistoryIntensity.opacity(total: total, thresholds: thresholds)) + } elements = days.indices.map { HistoryCalendarAccessibilityDay(canvas: self, index: $0) } setAccessibilityElement(false) setAccessibilityChildren(elements) - tooltipsDirty = true } needsDisplay = true } @@ -141,6 +165,18 @@ final class HistoryCalendarCanvas: NSView { monthLayout.cellRect(index).offsetBy(dx: sidePadding, dy: 0) } + func panelRect(_ index: Int) -> CGRect? { + guard let root = window?.contentView else { return nil } + let rect = convert(cellRect(index), to: root) + return root.isFlipped + ? rect + : CGRect(x: rect.minX, y: root.bounds.height - rect.maxY, width: rect.width, height: rect.height) + } + + private func color(_ provider: UsageProvider) -> NSColor { + NSColor(provider == .codex ? Theme.codex : Theme.claude) + } + override func draw(_ dirtyRect: NSRect) { for (section, label) in months { let frame = NSRect( @@ -191,6 +227,15 @@ final class HistoryCalendarCanvas: NSView { width: rect.width / CGFloat(colors.count), height: rect.height ).fill() } + if let minority = minorities[index] { + minority.setFill() + let corner = NSBezierPath() + corner.move(to: NSPoint(x: rect.maxX, y: rect.maxY - rect.height * 0.4)) + corner.line(to: NSPoint(x: rect.maxX, y: rect.maxY)) + corner.line(to: NSPoint(x: rect.maxX - rect.width * 0.4, y: rect.maxY)) + corner.close() + corner.fill() + } NSGraphicsContext.restoreGraphicsState() } else { NSColor.labelColor.withAlphaComponent(0.08).setFill() @@ -231,22 +276,61 @@ final class HistoryCalendarCanvas: NSView { override func updateTrackingAreas() { super.updateTrackingAreas() if let tracking { removeTrackingArea(tracking) } - let area = NSTrackingArea(rect: .zero, options: [.mouseMoved, .activeAlways, .inVisibleRect], owner: self) + let area = NSTrackingArea( + rect: .zero, options: [.mouseMoved, .mouseEnteredAndExited, .activeAlways, .inVisibleRect], owner: self) addTrackingArea(area) tracking = area } + var trackingOptions: NSTrackingArea.Options { tracking?.options ?? [] } + override func mouseMoved(with event: NSEvent) { let position = window?.convertPoint(toScreen: event.locationInWindow) ?? event.locationInWindow defer { lastMousePosition = position } - guard hoverEnabled, position != lastMousePosition, + guard hoverEnabled, position != lastMousePosition, pinned == nil, let index = index(at: convert(event.locationInWindow, from: nil)) else { return } + scheduleHoverCard(index) select(index) } + override func mouseExited(with event: NSEvent) { + cancelHoverCard() + guard pinned == nil else { return } + onExitCalendar?() + } + override func mouseDown(with event: NSEvent) { - if let index = index(at: convert(event.locationInWindow, from: nil)) { select(index) } + guard let index = index(at: convert(event.locationInWindow, from: nil)), days.indices.contains(index), + days[index].date <= today + else { return } + cancelHoverCard() + hoverIndex = index + select(index) + onPinCard?(days[index].id, panelRect(index)) + } + + private func scheduleHoverCard(_ index: Int) { + guard hoverIndex != index else { return } + cancelHoverCard() + hoverIndex = index + guard days.indices.contains(index), days[index].date <= today else { return } + let key = days[index].id + let work = DispatchWorkItem { [weak self] in + MainActor.assumeIsolated { + guard let self, self.hoverIndex == index else { return } + self.onHoverCard?(key, self.panelRect(index)) + } + } + hoverWork = work + DispatchQueue.main.asyncAfter(deadline: .now() + 0.45, execute: work) + } + + private func cancelHoverCard() { + hoverWork?.cancel() + hoverWork = nil + hoverIndex = nil + onHoverCard?(nil, nil) } private func index(at point: NSPoint) -> Int? { @@ -258,19 +342,6 @@ final class HistoryCalendarCanvas: NSView { onSelect?(days[index].id) } - @objc func view( - _ view: NSView, stringForToolTip tag: NSView.ToolTipTag, point: NSPoint, userData data: UnsafeMutableRawPointer? - ) -> String { - index(at: point).map { descriptions[$0] } ?? "" - } - - func updateTooltips() { - guard tooltipsDirty else { return } - removeAllToolTips() - for index in days.indices { addToolTip(cellRect(index), owner: self, userData: nil) } - tooltipsDirty = false - } - private func description(_ day: HistoryCalendarDay) -> String { let prefix = Calendar.current.isDate(day.date, inSameDayAs: today) ? "history.today".localized + " · " : "" let date = day.date.formatted(.dateTime.weekday(.wide).day().month(.wide).year().locale(locale)) diff --git a/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift b/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift new file mode 100644 index 0000000..f4a3a6c --- /dev/null +++ b/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift @@ -0,0 +1,126 @@ +import SwiftUI +import TokenGaugeCore + +enum HistoryDayCardPlacement { + static let width: CGFloat = 248 + static let spacing: CGFloat = 6 + + static func origin(anchor: CGRect, cardSize: CGSize, bounds: CGRect) -> CGPoint { + let below = anchor.maxY + spacing + let above = anchor.minY - spacing - cardSize.height + let y = below + cardSize.height <= bounds.maxY ? below : max(bounds.minY, above) + let trailing = max(bounds.minX, bounds.maxX - cardSize.width) + return CGPoint(x: min(max(bounds.minX, anchor.midX - cardSize.width / 2), trailing), y: y) + } +} + +struct HistoryDayCardView: View { + let day: HistoryCalendarDay + let providers: [UsageProvider] + let isToday: Bool + let isPinned: Bool + let currentStreak: Int + let longestStreak: Int + let onClose: () -> Void + + private var locale: Locale { Locale(identifier: LocalizationManager.shared.language.rawValue) } + private var rows: [UsageProvider] { providers.filter { (day.tokens(for: $0) ?? 0) > 0 } } + private var total: Int { rows.compactMap { day.tokens(for: $0) }.reduce(0, +) } + + var body: some View { + VStack(alignment: .leading, spacing: 8) { + header + if rows.isEmpty { + Text("history.no_activity".localized).font(.system(size: 10)).foregroundStyle(.secondary) + } else { + VStack(alignment: .leading, spacing: 8) { + ForEach(rows, id: \.self) { provider in + providerRow(provider) + } + } + } + Divider() + Text( + "history.streak_current".localized(String(currentStreak)) + " · " + + "history.streak_longest".localized(String(longestStreak)) + ) + .font(.system(size: 10)).foregroundStyle(.secondary) + } + .padding(11) + .frame(width: HistoryDayCardPlacement.width, alignment: .leading) + .background(RoundedRectangle(cornerRadius: Theme.Layout.cardRadius).fill(.regularMaterial)) + .overlay( + RoundedRectangle(cornerRadius: Theme.Layout.cardRadius).stroke(Theme.Layout.cardStroke, lineWidth: 1) + ) + .shadow(color: Color.black.opacity(0.18), radius: 8, y: 3) + } + + private var header: some View { + HStack(spacing: 6) { + Text(day.date.formatted(.dateTime.weekday(.wide).day().month(.wide).year().locale(locale))) + .font(.system(size: 11, weight: .semibold)).lineLimit(2).fixedSize(horizontal: false, vertical: true) + if isToday { + Text("history.today".localized) + .font(.system(size: 9, weight: .medium)) + .padding(.horizontal, 5).padding(.vertical, 2) + .background(Capsule().fill(Color.primary.opacity(0.08))) + } + Spacer(minLength: 0) + if isPinned { + Button(action: onClose) { + Image(systemName: "xmark").font(.system(size: 9, weight: .semibold)) + .padding(4).background(Circle().fill(Color.primary.opacity(0.06))) + } + .buttonStyle(.plain).accessibilityLabel("history.close".localized) + } + } + } + + private func providerRow(_ provider: UsageProvider) -> some View { + let tokens = day.tokens(for: provider) ?? 0 + let share = total > 0 ? Double(tokens) / Double(total) : 0 + let percentage = (share * 100).rounded().formatted(.number.locale(locale)) + " %" + return VStack(alignment: .leading, spacing: 5) { + HStack(spacing: 6) { + ProviderLogo(provider: provider, size: 16) + Text(name(provider)).font(.system(size: 11, weight: .medium)) + Spacer(minLength: 6) + Text(UsageFormatters.tokens(tokens)).font(.system(size: 11, weight: .semibold)).monospacedDigit() + if rows.count > 1 { + Text(percentage).font(.system(size: 10)).foregroundStyle(.secondary).monospacedDigit() + .accessibilityLabel("history.share".localized(percentage)) + } + } + if rows.count > 1 { + GeometryReader { proxy in + ZStack(alignment: .leading) { + Capsule().fill(Color.primary.opacity(0.08)) + Capsule().fill(color(provider)).frame(width: max(2, proxy.size.width * share)) + } + } + .frame(height: Theme.Layout.barHeight) + } + let chips = models(provider) + if !chips.isEmpty { + HStack(spacing: 4) { + ForEach(chips, id: \.self) { model in + Text(model).font(.system(size: 9)).lineLimit(1) + .padding(.horizontal, 5).padding(.vertical, 2) + .background(Capsule().fill(color(provider).opacity(0.12))) + } + } + } + } + } + + private func models(_ provider: UsageProvider) -> [String] { + let rows = day.efforts.filter { $0.provider == provider } + let totals = Dictionary(grouping: rows, by: \.model).mapValues { $0.map(\.tokens).reduce(0, +) } + return totals.sorted { $0.value == $1.value ? $0.key < $1.key : $0.value > $1.value }.prefix(3).map(\.key) + } + + private func color(_ provider: UsageProvider) -> Color { provider == .claude ? Theme.claude : Theme.codex } + private func name(_ provider: UsageProvider) -> String { + (provider == .claude ? "provider.claude_short" : "provider.codex").localized + } +} diff --git a/Sources/TokenGaugeApp/Views/HistoryPanelView.swift b/Sources/TokenGaugeApp/Views/HistoryPanelView.swift index 5d83631..811f170 100644 --- a/Sources/TokenGaugeApp/Views/HistoryPanelView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryPanelView.swift @@ -10,18 +10,50 @@ struct HistoryPanelView: View { @State private var calendarFocusRequest = 0 @State private var showingDetails = false @State private var lastPointerLocation = NSEvent.mouseLocation + @State private var panelFrame = CGRect.zero + @State private var cardHeight: CGFloat = 0 @Environment(\.accessibilityReduceMotion) private var reduceMotion @Environment(\.quotaAnimationsEnabled) private var animateChanges @Namespace private var daySelection private var locale: Locale { Locale(identifier: LocalizationManager.shared.language.rawValue) } private var today: Date { Calendar.current.startOfDay(for: Date()) } - private var accent: Color { providers == [.claude] ? Theme.claude : Theme.codex } + private var accent: Color { + if providers == [.claude] { return Theme.claude } + if providers == [.codex] { return Theme.codex } + return Color(nsColor: .labelColor) + } + + private var calendarProviders: [UsageProvider] { + let recorded = [UsageProvider.codex, .claude].filter { provider in + model.days.contains { $0.tokens(for: provider) != nil } + } + return recorded.isEmpty ? [.codex, .claude] : recorded + } private var motion: Animation? { animateChanges && !reduceMotion ? .easeInOut(duration: 0.18) : nil } + private var cardMotion: Animation? { + animateChanges && !reduceMotion ? .easeOut(duration: 0.12) : nil + } + + private var cardTransition: AnyTransition { + animateChanges && !reduceMotion ? .opacity.combined(with: .scale(scale: 0.97)) : .identity + } + + private var pinnedDayKey: String? { + model.daySelection.flatMap { $0.isPinned ? $0.dayKey : nil } + } + + private var cardFrame: CGRect? { + guard let anchor = model.daySelection?.anchor, panelFrame != .zero else { return nil } + let size = CGSize(width: HistoryDayCardPlacement.width, height: max(cardHeight, 1)) + return CGRect( + origin: HistoryDayCardPlacement.origin(anchor: anchor, cardSize: size, bounds: panelFrame), size: size) + } + var body: some View { VStack(alignment: .leading, spacing: 6) { HStack(spacing: 8) { @@ -51,22 +83,69 @@ struct HistoryPanelView: View { selectionSummary } } + .background( + GeometryReader { proxy in + Color.clear.preference(key: HistoryPanelFrameKey.self, value: proxy.frame(in: .global)) + } + ) + .onPreferenceChange(HistoryPanelFrameKey.self) { panelFrame = $0 } + .onPreferenceChange(HistoryDayCardHeightKey.self) { cardHeight = $0 } + .overlay(alignment: .topLeading) { dayCard.animation(cardMotion, value: model.daySelection) } + .onTapGesture(coordinateSpace: .global) { location in + guard cardFrame?.contains(location) != true else { return } + dismissDayCard() + } + .onExitCommand { dismissDayCard() } .onChange(of: mode) { _, newValue in model.offset = 0 model.selectedDayKey = nil + model.dismissDayCard() lastPointerLocation = NSEvent.mouseLocation if newValue == .calendar { model.selectedDayKey = HistoryDashboardModel.dayKey(today) } } .onChange(of: model.periodStart) { _, _ in lastPointerLocation = NSEvent.mouseLocation + model.dismissDayCard() if mode == .calendar { model.selectedDayKey = (model.days.first(where: { $0.date == today }) - ?? model.days.last(where: { $0.total(for: providers) != nil }) ?? model.days.last)?.id + ?? model.days.last(where: { $0.total(for: calendarProviders) != nil }) ?? model.days.last)?.id } } } + @ViewBuilder private var dayCard: some View { + if let selection = model.daySelection, let frame = cardFrame, + let day = model.days.first(where: { $0.id == selection.dayKey }) + { + let streak = model.streak(for: providers) + HistoryDayCardView( + day: day, providers: calendarProviders, + isToday: Calendar.current.isDate(day.date, inSameDayAs: today), + isPinned: selection.isPinned, currentStreak: streak.current, longestStreak: streak.longest, + onClose: dismissDayCard + ) + .background( + GeometryReader { proxy in + Color.clear.preference(key: HistoryDayCardHeightKey.self, value: proxy.size.height) + } + ) + .offset(x: frame.minX - panelFrame.minX, y: frame.minY - panelFrame.minY) + .transition(cardTransition) + } + } + + private func dismissDayCard() { + guard model.daySelection != nil else { return } + model.dismissDayCard() + selectToday() + } + + private func selectToday() { + guard mode == .calendar else { return } + model.selectedDayKey = HistoryDashboardModel.dayKey(today) + } + private var modePicker: some View { HistoryModeControl(mode: $mode) .frame( @@ -109,7 +188,8 @@ struct HistoryPanelView: View { } private var bars: some View { - let maximum = max(1, model.days.flatMap { day in providers.compactMap { day.tokens(for: $0) } }.max() ?? 0) + let maximum = max( + 1, model.days.flatMap { day in calendarProviders.compactMap { day.tokens(for: $0) } }.max() ?? 0) let selectedID = model.selectedDay?.id return HStack(alignment: .bottom, spacing: 6) { ForEach(model.days) { day in @@ -118,7 +198,7 @@ struct HistoryPanelView: View { } label: { VStack(spacing: 4) { HStack(alignment: .bottom, spacing: 2) { - ForEach(providers, id: \.self) { provider in + ForEach(calendarProviders, id: \.self) { provider in if let tokens = day.tokens(for: provider) { RoundedRectangle(cornerRadius: 2) .fill(color(provider).opacity(tokens == 0 ? 0.2 : 1)) @@ -187,9 +267,26 @@ struct HistoryPanelView: View { } .padding(.top, Theme.Layout.historyCalendarGridTop) HistoryCalendarView( - days: model.days, providers: providers, selectedDayKey: model.selectedDay?.id, + days: model.days, providers: calendarProviders, selectedDayKey: model.selectedDay?.id, focusID: "\(model.periodStart.timeIntervalSince1970):\(calendarFocusRequest)", - hoverEnabled: !showingDetails && !model.isLoading + hoverEnabled: !showingDetails && !model.isLoading, + accent: accent, pinnedDayKey: pinnedDayKey, + onHoverCard: { key, anchor in + guard let key else { + model.hideDayCard() + return + } + model.showDayCard(key, anchor: anchor) + }, + onPinCard: { key, anchor in + model.pinDayCard(key, anchor: anchor) + if model.daySelection == nil { selectToday() } + }, + onExitCalendar: { + guard model.daySelection?.isPinned != true else { return } + model.hideDayCard() + selectToday() + } ) { key in if let day = model.days.first(where: { $0.id == key }) { select(day) } } @@ -207,9 +304,13 @@ struct HistoryPanelView: View { if let day = model.selectedDay { VStack(alignment: .leading, spacing: 7) { HStack { - Text(day.date.formatted(.dateTime.weekday(.wide).day().month(.abbreviated).locale(locale))) - .font(.system(size: 10)).foregroundStyle(.secondary) - .contentTransition(.opacity) + VStack(alignment: .leading, spacing: 2) { + Text(day.date.formatted(.dateTime.weekday(.wide).day().month(.abbreviated).locale(locale))) + .font(.system(size: 10)).foregroundStyle(.secondary) + .contentTransition(.opacity) + Text(streakLine) + .font(.system(size: 10)).foregroundStyle(.secondary) + } todayBadge .opacity(Calendar.current.isDate(day.date, inSameDayAs: today) ? 1 : 0) .accessibilityHidden(!Calendar.current.isDate(day.date, inSameDayAs: today)) @@ -223,13 +324,13 @@ struct HistoryPanelView: View { }.font(.system(size: 10)) } .buttonStyle(.plain).foregroundStyle(.secondary) - .disabled(day.efforts.filter { providers.contains($0.provider) }.isEmpty) + .disabled(day.efforts.filter { calendarProviders.contains($0.provider) }.isEmpty) .popover(isPresented: $showingDetails, arrowEdge: .bottom) { effortDetails(day) } } HStack(spacing: 10) { - ForEach(providers, id: \.self) { provider in + ForEach(calendarProviders, id: \.self) { provider in providerTotal(provider, day: day) } } @@ -256,7 +357,7 @@ struct HistoryPanelView: View { } private func effortDetails(_ day: HistoryCalendarDay) -> some View { - let rows = day.efforts.filter { providers.contains($0.provider) }.sorted { $0.tokens > $1.tokens } + let rows = day.efforts.filter { calendarProviders.contains($0.provider) }.sorted { $0.tokens > $1.tokens } return VStack(alignment: .leading, spacing: 12) { HStack { VStack(alignment: .leading, spacing: 3) { @@ -312,15 +413,30 @@ struct HistoryPanelView: View { private func summary(_ day: HistoryCalendarDay) -> String { let date = day.date.formatted(.dateTime.weekday(.abbreviated).day().month(.abbreviated).year().locale(locale)) - let totals = providers.map { provider in + let totals = calendarProviders.map { provider in name(provider) + " " + (day.tokens(for: provider).map(exact) ?? "history.unknown".localized) }.joined(separator: " · ") return date + ": " + totals } + private var streakLine: String { + let streak = model.streak(for: providers) + return "history.streak".localized(String(streak.current), String(streak.longest)) + } + private func exact(_ tokens: Int) -> String { tokens.formatted(.number.locale(locale)) } private func color(_ provider: UsageProvider) -> Color { provider == .claude ? Theme.claude : Theme.codex } private func name(_ provider: UsageProvider) -> String { (provider == .claude ? "provider.claude_short" : "provider.codex").localized } } + +private struct HistoryPanelFrameKey: PreferenceKey { + static let defaultValue = CGRect.zero + static func reduce(value: inout CGRect, nextValue: () -> CGRect) { value = nextValue() } +} + +private struct HistoryDayCardHeightKey: PreferenceKey { + static let defaultValue: CGFloat = 0 + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { value = max(value, nextValue()) } +} diff --git a/Sources/TokenGaugeCore/HistoryAnalytics.swift b/Sources/TokenGaugeCore/HistoryAnalytics.swift index 8afcf30..76732fe 100644 --- a/Sources/TokenGaugeCore/HistoryAnalytics.swift +++ b/Sources/TokenGaugeCore/HistoryAnalytics.swift @@ -35,6 +35,34 @@ public enum HistoryAnalytics { return abs(left.timeIntervalSince(right)) <= 1 } + public static func streaks(usageDays: Set, today: String, calendar: Calendar = .current) + -> (current: Int, longest: Int) + { + let formatter = DateFormatter() + formatter.calendar = calendar + formatter.timeZone = calendar.timeZone + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.dateFormat = "yyyy-MM-dd" + let ordinals = Set( + usageDays.compactMap { formatter.date(from: $0) } + .compactMap { calendar.ordinality(of: .day, in: .era, for: $0) }) + var longest = 0 + for start in ordinals where !ordinals.contains(start - 1) { + var length = 1 + while ordinals.contains(start + length) { length += 1 } + longest = max(longest, length) + } + var current = 0 + if let reference = formatter.date(from: today).flatMap({ calendar.ordinality(of: .day, in: .era, for: $0) }) { + var cursor = ordinals.contains(reference) ? reference : reference - 1 + while ordinals.contains(cursor) { + current += 1 + cursor -= 1 + } + } + return (current, longest) + } + public static func pace( rows: [HistoryQuotaRow], provider: UsageProvider, diff --git a/Sources/TokenGaugeCore/UsageHistoryStore.swift b/Sources/TokenGaugeCore/UsageHistoryStore.swift index 02a5e04..51f80ef 100644 --- a/Sources/TokenGaugeCore/UsageHistoryStore.swift +++ b/Sources/TokenGaugeCore/UsageHistoryStore.swift @@ -166,6 +166,26 @@ public enum UsageHistoryStore { return rows } + public static func usageDays( + provider: UsageProvider? = nil, + at url: URL = UsagePaths.history() + ) throws -> Set { + let handle = try open(url) + defer { sqlite3_close(handle) } + try prepareSchema(handle) + let sql = """ + SELECT day FROM daily_totals + WHERE tokens > 0 AND (?1 IS NULL OR provider = ?1); + """ + var days: Set = [] + try query(handle, sql) { statement in + bind(statement, 1, provider?.rawValue) + } each: { statement in + days.insert(text(statement, 0)) + } + return days + } + public static func quotaRows( provider: UsageProvider? = nil, since: Date? = nil, diff --git a/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift b/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift index 84a4166..d043fae 100644 --- a/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift @@ -81,4 +81,41 @@ final class HistoryCalendarRenderingTests: XCTestCase { XCTAssertEqual(selected.count, 1) } } + + func testExitResetsToTodayOnlyWhileNothingIsPinned() throws { + let now = Date() + let interval = HistoryDashboardModel.interval(mode: .calendar, offset: 0, now: now) + let days = HistoryDashboardModel.makeDays(interval: interval, tokens: [], efforts: []) + let view = HistoryCalendarScrollView() + view.frame = NSRect(x: 0, y: 0, width: 440, height: Theme.Layout.historyCalendarHeight) + var exits = 0 + var hovers: [String?] = [] + view.calendar.update( + HistoryCalendarView( + days: days, providers: [.codex, .claude], selectedDayKey: nil, focusID: "year", + onHoverCard: { key, _ in hovers.append(key) }, onExitCalendar: { exits += 1 } + ) { _ in }) + view.layout() + view.calendar.updateTrackingAreas() + XCTAssertTrue(view.calendar.trackingOptions.contains(.mouseEnteredAndExited)) + XCTAssertTrue(view.calendar.trackingOptions.contains(.mouseMoved)) + view.calendar.mouseExited(with: try exitEvent()) + XCTAssertEqual(exits, 1) + XCTAssertEqual(hovers, [nil]) + view.calendar.update( + HistoryCalendarView( + days: days, providers: [.codex, .claude], selectedDayKey: days[0].id, focusID: "year", + pinnedDayKey: days[0].id, onHoverCard: { key, _ in hovers.append(key) }, + onExitCalendar: { exits += 1 } + ) { _ in }) + view.calendar.mouseExited(with: try exitEvent()) + XCTAssertEqual(exits, 1) + } + + private func exitEvent() throws -> NSEvent { + try XCTUnwrap( + NSEvent.enterExitEvent( + with: .mouseExited, location: .zero, modifierFlags: [], timestamp: 0, windowNumber: 0, context: nil, + eventNumber: 0, trackingNumber: 0, userData: nil)) + } } diff --git a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift index 07d308d..8e8975d 100644 --- a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift @@ -170,6 +170,42 @@ final class HistoryDashboardTests: XCTestCase { XCTAssertEqual(model.days.last?.tokens(for: .codex), 20) } + func testPinnedDayCardSurvivesHoverAndUnpinsOnTheSameCell() { + let model = HistoryDashboardModel() + model.showDayCard("2026-09-16", anchor: CGRect(x: 10, y: 10, width: 9, height: 9)) + XCTAssertEqual(model.daySelection?.dayKey, "2026-09-16") + XCTAssertEqual(model.daySelection?.isPinned, false) + model.pinDayCard("2026-09-17", anchor: CGRect(x: 20, y: 10, width: 9, height: 9)) + XCTAssertEqual(model.daySelection?.isPinned, true) + model.showDayCard("2026-09-15", anchor: nil) + model.hideDayCard() + XCTAssertEqual(model.daySelection?.dayKey, "2026-09-17") + model.pinDayCard("2026-09-17", anchor: CGRect(x: 20, y: 10, width: 9, height: 9)) + XCTAssertNil(model.daySelection) + } + + func testStreakFollowsTheDisplayedProviders() async { + let model = HistoryDashboardModel() + let today = HistoryDashboardModel.dayKey(Date()) + let yesterday = HistoryDashboardModel.dayKey(Date().addingTimeInterval(-86_400)) + await model.load( + mode: .recent, revision: 1, + previewSnapshots: [ + ProviderUsageSnapshot( + provider: .codex, windows: [], + dailyUsage: [DailyTokenUsage(day: today, tokens: 10), DailyTokenUsage(day: yesterday, tokens: 10)], + summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: Date()), + ProviderUsageSnapshot( + provider: .claude, windows: [], + dailyUsage: [DailyTokenUsage(day: today, tokens: 5)], + summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: Date()), + ]) + XCTAssertEqual(model.streak(for: [.codex]).current, 2) + XCTAssertEqual(model.streak(for: [.claude]).current, 1) + XCTAssertEqual(model.streak(for: [.codex, .claude]).current, 2) + XCTAssertEqual(model.streak(for: [.codex, .claude]).longest, 2) + } + func testCalendarDominanceUsesOnlyVisibleRecordedProviders() { func day(_ totals: [UsageProvider: Int]) -> HistoryCalendarDay { HistoryCalendarDay(id: "2026-09-12", date: Date(), totals: totals, efforts: []) diff --git a/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift b/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift new file mode 100644 index 0000000..523f1ed --- /dev/null +++ b/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift @@ -0,0 +1,73 @@ +import AppKit +import SwiftUI +import TokenGaugeCore +import XCTest + +@testable import TokenGaugeApp + +@MainActor +final class HistoryDayCardTests: XCTestCase { + func testIntensityLevelsFollowTheQuantilesOfTheLoadedRange() { + let thresholds = HistoryIntensity.thresholds(totals: [0, 10, 20, 30, 40, 50]) + XCTAssertEqual(thresholds, [10, 20, 30, 40]) + XCTAssertEqual(HistoryIntensity.level(total: 5, thresholds: thresholds), 0) + XCTAssertEqual(HistoryIntensity.level(total: 15, thresholds: thresholds), 1) + XCTAssertEqual(HistoryIntensity.level(total: 35, thresholds: thresholds), 3) + XCTAssertEqual(HistoryIntensity.level(total: 50, thresholds: thresholds), 4) + XCTAssertEqual(HistoryIntensity.opacity(total: 50, thresholds: thresholds), 1) + XCTAssertEqual(HistoryIntensity.opacity(total: 1, thresholds: []), HistoryIntensity.opacities[0]) + } + + func testCardIsPlacedBelowThenAboveAndClampedToThePanel() { + let bounds = CGRect(x: 0, y: 0, width: 560, height: 400) + let size = CGSize(width: HistoryDayCardPlacement.width, height: 120) + let below = HistoryDayCardPlacement.origin( + anchor: CGRect(x: 280, y: 100, width: 9, height: 9), cardSize: size, bounds: bounds) + XCTAssertEqual(below.y, 109 + HistoryDayCardPlacement.spacing) + XCTAssertEqual(below.x, 284.5 - size.width / 2) + let above = HistoryDayCardPlacement.origin( + anchor: CGRect(x: 280, y: 330, width: 9, height: 9), cardSize: size, bounds: bounds) + XCTAssertEqual(above.y, 330 - HistoryDayCardPlacement.spacing - size.height) + let trailing = HistoryDayCardPlacement.origin( + anchor: CGRect(x: 550, y: 100, width: 9, height: 9), cardSize: size, bounds: bounds) + XCTAssertEqual(trailing.x, bounds.maxX - size.width) + let leading = HistoryDayCardPlacement.origin( + anchor: CGRect(x: 2, y: 100, width: 9, height: 9), cardSize: size, bounds: bounds) + XCTAssertEqual(leading.x, bounds.minX) + } + + func testCardRendersBothProvidersInEveryLanguage() { + let language = LocalizationManager.shared.language + defer { LocalizationManager.shared.language = language } + for value in AppLanguage.allCases { + LocalizationManager.shared.language = value + let view = NSHostingView( + rootView: HistoryDayCardView( + day: day, providers: [.codex, .claude], isToday: true, isPinned: true, currentStreak: 3, + longestStreak: 12, onClose: {})) + XCTAssertEqual(view.fittingSize.width, HistoryDayCardPlacement.width) + XCTAssertGreaterThan(view.fittingSize.height, 80) + } + } + + func testCardWithoutDataAnnouncesTheAbsenceOfActivity() { + let empty = HistoryCalendarDay( + id: "2026-09-16", date: Date(timeIntervalSince1970: 1_789_000_000), totals: [:], efforts: []) + let view = NSHostingView( + rootView: HistoryDayCardView( + day: empty, providers: [.codex, .claude], isToday: false, isPinned: false, currentStreak: 0, + longestStreak: 0, onClose: {})) + XCTAssertEqual(view.fittingSize.width, HistoryDayCardPlacement.width) + XCTAssertGreaterThan(view.fittingSize.height, 40) + } + + private var day: HistoryCalendarDay { + HistoryCalendarDay( + id: "2026-09-17", date: Date(timeIntervalSince1970: 1_789_000_000), + totals: [.codex: 800, .claude: 200], + efforts: [ + HistoryEffortRow( + day: "2026-09-17", provider: .codex, model: "gpt-6-astra", effort: "medium", tokens: 800) + ]) + } +} diff --git a/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift b/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift index ba6bfaa..980b583 100644 --- a/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift +++ b/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift @@ -5,6 +5,11 @@ import XCTest final class HistoryAnalyticsTests: XCTestCase { private let now = Date(timeIntervalSince1970: 1_789_000_000) + private var calendar: Calendar { + var value = Calendar(identifier: .gregorian) + value.timeZone = TimeZone(secondsFromGMT: -5 * 3600)! + return value + } func testPaceUsesActualElapsedTimeAndDistinctSamples() throws { let rows = [row(-50, 10), row(-30, 11), row(-5, 13)] @@ -57,6 +62,38 @@ final class HistoryAnalyticsTests: XCTestCase { XCTAssertNil(pace(valid + [row(-15, 13)])) } + func testStreaksCountBackFromTodayAndKeepTheLongestRun() { + let days: Set = ["2026-09-14", "2026-09-15", "2026-09-16", "2026-09-17"] + let result = HistoryAnalytics.streaks(usageDays: days, today: "2026-09-17", calendar: calendar) + XCTAssertEqual(result.current, 4) + XCTAssertEqual(result.longest, 4) + } + + func testStreaksIgnoreGapsAndReportTheLongestPastRun() { + let days: Set = [ + "2026-08-01", "2026-08-02", "2026-08-03", "2026-08-04", "2026-08-05", "2026-09-16", "2026-09-17", + ] + let result = HistoryAnalytics.streaks(usageDays: days, today: "2026-09-17", calendar: calendar) + XCTAssertEqual(result.current, 2) + XCTAssertEqual(result.longest, 5) + } + + func testCurrentStreakSurvivesATodayWithoutUsageButNotTwoIdleDays() { + let days: Set = ["2026-09-15", "2026-09-16"] + XCTAssertEqual( + HistoryAnalytics.streaks(usageDays: days, today: "2026-09-17", calendar: calendar).current, 2) + XCTAssertEqual( + HistoryAnalytics.streaks(usageDays: days, today: "2026-09-18", calendar: calendar).current, 0) + } + + func testEmptyAndSingleDayHistories() { + XCTAssertEqual(HistoryAnalytics.streaks(usageDays: [], today: "2026-09-17", calendar: calendar).current, 0) + XCTAssertEqual(HistoryAnalytics.streaks(usageDays: [], today: "2026-09-17", calendar: calendar).longest, 0) + let single = HistoryAnalytics.streaks(usageDays: ["2026-09-17"], today: "2026-09-17", calendar: calendar) + XCTAssertEqual(single.current, 1) + XCTAssertEqual(single.longest, 1) + } + private func pace(_ rows: [HistoryQuotaRow]) -> QuotaPace? { HistoryAnalytics.pace(rows: rows, provider: .claude, windowID: "weekly", now: now) } diff --git a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift index be5feea..46ae643 100644 --- a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift +++ b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift @@ -191,6 +191,25 @@ final class UsageHistoryStoreTests: XCTestCase { XCTAssertEqual(sqlite3_exec(db, sql, nil, nil, nil), SQLITE_OK) } + func testUsageDaysReportOnlyDaysWithRecordedTokens() throws { + try UsageHistoryStore.record( + ProviderUsageSnapshot( + provider: .codex, windows: [], + dailyUsage: [ + DailyTokenUsage(day: "2026-09-15", tokens: 120), DailyTokenUsage(day: "2026-09-16", tokens: 0), + ], + summary: nil, availableResetCredits: nil, creditBalance: nil, + capturedAt: Date(timeIntervalSince1970: 1_787_000_000)), + at: database) + try UsageHistoryStore.record( + claudeSnapshot(buckets: [bucket(day: "2026-09-17", hour: 0, model: "claude-fable-5", tokens: 40)]), + at: database) + + XCTAssertEqual(try UsageHistoryStore.usageDays(provider: .codex, at: database), ["2026-09-15"]) + XCTAssertEqual(try UsageHistoryStore.usageDays(provider: .claude, at: database), ["2026-09-17"]) + XCTAssertEqual(try UsageHistoryStore.usageDays(at: database), ["2026-09-15", "2026-09-17"]) + } + private func claudeSnapshot( used: Double = 44, capturedAt: Date = Date(timeIntervalSince1970: 1_787_000_400), From 659b66983c4f86919581e5440f7ea37296450275 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:23:56 -0500 Subject: [PATCH 02/21] feat(updates): in-panel update banner with download progress and deferred install --- .../Resources/en.lproj/Localizable.strings | 15 +- .../Resources/es.lproj/Localizable.strings | 15 +- .../Services/UpdateManager.swift | 194 +++++++++++++++--- Sources/TokenGaugeApp/Views/AboutView.swift | 17 +- Sources/TokenGaugeApp/Views/PopoverView.swift | 11 +- .../Views/UpdateBannerView.swift | 162 +++++++++++++++ .../UpdateBannerRenderingTests.swift | 85 ++++++++ .../UpdateManagerTests.swift | 169 +++++++++++---- docs/RELEASING.md | 4 + 9 files changed, 578 insertions(+), 94 deletions(-) create mode 100644 Sources/TokenGaugeApp/Views/UpdateBannerView.swift create mode 100644 Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift diff --git a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings index 7292df0..ae6e1ca 100644 --- a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings @@ -73,10 +73,19 @@ "updates.checking" = "Checking for updates…"; "updates.current" = "You’re up to date"; "updates.check_failed" = "Could not check. Try again"; -"updates.install" = "Install update · %@"; -"updates.downloading" = "Downloading update…"; "updates.installing" = "Installing and restarting…"; -"updates.retry" = "Update failed. Retry"; +"updates.banner_available" = "TokenGauge %@ available"; +"updates.download" = "Download"; +"updates.banner_downloading" = "Downloading %1$@ · %2$d%%"; +"updates.banner_downloading_pending" = "Downloading %@…"; +"updates.banner_extracting" = "Preparing %1$@ · %2$d%%"; +"updates.banner_extracting_pending" = "Preparing %@…"; +"updates.banner_ready" = "%@ is ready to install"; +"updates.install_now" = "Install now"; +"updates.later" = "Later"; +"updates.install_version" = "Install %@"; +"updates.failed" = "The update could not be installed"; +"updates.retry_action" = "Retry"; "about.description" = "Your Claude Code and Codex usage, at a glance. Quotas, reset times and activity from the menu bar."; "about.local" = "Local history"; "about.private" = "Private by design"; diff --git a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings index 19bae90..51fc68f 100644 --- a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings @@ -73,10 +73,19 @@ "updates.checking" = "Buscando actualizaciones…"; "updates.current" = "Tienes la última versión"; "updates.check_failed" = "No se pudo comprobar. Reintentar"; -"updates.install" = "Instalar actualización · %@"; -"updates.downloading" = "Descargando actualización…"; "updates.installing" = "Instalando y reiniciando…"; -"updates.retry" = "La actualización falló. Reintentar"; +"updates.banner_available" = "TokenGauge %@ disponible"; +"updates.download" = "Descargar"; +"updates.banner_downloading" = "Descargando %1$@ · %2$d %%"; +"updates.banner_downloading_pending" = "Descargando %@…"; +"updates.banner_extracting" = "Preparando %1$@ · %2$d %%"; +"updates.banner_extracting_pending" = "Preparando %@…"; +"updates.banner_ready" = "%@ lista para instalar"; +"updates.install_now" = "Instalar ahora"; +"updates.later" = "Después"; +"updates.install_version" = "Instalar %@"; +"updates.failed" = "No se pudo instalar la actualización"; +"updates.retry_action" = "Reintentar"; "about.description" = "Tu uso de Claude Code y Codex, de un vistazo. Cuotas, reinicios y actividad desde la barra de menú."; "about.local" = "Historial local"; "about.private" = "Privado por diseño"; diff --git a/Sources/TokenGaugeApp/Services/UpdateManager.swift b/Sources/TokenGaugeApp/Services/UpdateManager.swift index 45048f5..9d09827 100644 --- a/Sources/TokenGaugeApp/Services/UpdateManager.swift +++ b/Sources/TokenGaugeApp/Services/UpdateManager.swift @@ -11,10 +11,24 @@ final class UpdateManager: ObservableObject { enum Phase: Equatable { case idle + case checking case available(version: String) - case downloading(fraction: Double?) + case downloading(version: String, fraction: Double?) + case extracting(version: String, fraction: Double?) + case readyToInstall(version: String, deferred: Bool) + case installing(version: String) + case failed(message: String) + } + + enum Stage: Equatable { + case notDownloaded + case downloaded case installing - case failed(version: String) + } + + struct FoundDecision: Equatable { + let choice: SPUUserUpdateChoice + let phase: Phase } enum ManualCheckStatus: Equatable { @@ -25,6 +39,9 @@ final class UpdateManager: ObservableObject { } static let autoCheckDefaultsKey = "autoUpdateCheckEnabled" + nonisolated static let feedOverrideDefaultsKey = "updateFeedURLOverride" + static let progressPublishInterval: TimeInterval = 0.05 + static let failureMessageKey = "updates.failed" @Published private(set) var phase: Phase = .idle @Published private(set) var releasePageURL: URL? @@ -34,9 +51,15 @@ final class UpdateManager: ObservableObject { let isDevelopmentBuild = Bundle.main.object(forInfoDictionaryKey: "TokenGaugeDevelopmentBuild") as? Bool ?? true var available: Bool { - !isDevelopmentBuild || Self.qaFeedURL(environment: ProcessInfo.processInfo.environment) != nil + !isDevelopmentBuild + || Self.feedURL( + environment: ProcessInfo.processInfo.environment, + override: defaults.string(forKey: Self.feedOverrideDefaultsKey), + isDevelopmentBuild: isDevelopmentBuild + ) != nil } private let defaults: UserDefaults + private let now: () -> Date private let log = Logger(subsystem: "com.stevenacz.TokenGauge", category: "updates") private var updater: SPUUpdater? @@ -44,15 +67,19 @@ final class UpdateManager: ObservableObject { private var updaterDelegate: UpdaterDelegate? private var installRequested = false + private var resumeInstallRequested = false + private var readyReply: ((SPUUserUpdateChoice) -> Void)? private var pendingVersion: String? private var pendingIsInformationOnly = false private var expectedDownloadBytes: UInt64 = 0 private var receivedDownloadBytes: UInt64 = 0 + private var lastProgressPublish = Date.distantPast private var manualCheckPending = false private var manualCheckResetTask: Task? - init(defaults: UserDefaults = .standard) { + init(defaults: UserDefaults = .standard, now: @escaping () -> Date = Date.init) { self.defaults = defaults + self.now = now if defaults.object(forKey: Self.autoCheckDefaultsKey) == nil { autoCheckEnabled = true } else { @@ -70,6 +97,39 @@ final class UpdateManager: ObservableObject { return raw } + nonisolated static func feedURL( + environment: [String: String], + override: String?, + isDevelopmentBuild: Bool + ) -> String? { + if isDevelopmentBuild, let qa = qaFeedURL(environment: environment) { return qa } + if let override, let url = URL(string: override), url.scheme == "http" || url.scheme == "https" { + return override + } + return nil + } + + nonisolated static func decideUpdateFound( + version: String, + stage: Stage, + installRequested: Bool, + informationOnly: Bool + ) -> FoundDecision { + if informationOnly { + return FoundDecision(choice: .dismiss, phase: .available(version: version)) + } + if installRequested { + let phase: Phase = + stage == .notDownloaded + ? .downloading(version: version, fraction: nil) : .installing(version: version) + return FoundDecision(choice: .install, phase: phase) + } + if stage == .downloaded { + return FoundDecision(choice: .dismiss, phase: .readyToInstall(version: version, deferred: true)) + } + return FoundDecision(choice: .dismiss, phase: .available(version: version)) + } + func start() { guard updater == nil, available else { return } @@ -115,6 +175,39 @@ final class UpdateManager: ObservableObject { updater.checkForUpdates() } + func installReadyUpdate() { + guard case .readyToInstall(let version, let deferred) = phase else { return } + guard !deferred else { + resumeDeferredInstall() + return + } + installRequested = false + resumeInstallRequested = false + phase = .installing(version: version) + let reply = readyReply + readyReply = nil + reply?(.install) + } + + func deferReadyUpdate() { + guard case .readyToInstall(let version, false) = phase else { return } + installRequested = false + resumeInstallRequested = false + let reply = readyReply + readyReply = nil + reply?(.dismiss) + phase = .readyToInstall(version: version, deferred: true) + } + + func resumeDeferredInstall() { + guard case .readyToInstall(let version, true) = phase else { return } + resumeInstallRequested = true + installRequested = true + phase = .installing(version: version) + guard let updater, updater.sessionInProgress == false else { return } + updater.checkForUpdates() + } + func checkForUpdatesManually() { guard available else { return } guard let updater else { @@ -131,6 +224,7 @@ final class UpdateManager: ObservableObject { manualCheckResetTask?.cancel() manualCheckPending = true manualCheckStatus = .checking + if phase == .idle { phase = .checking } } func openReleasePage() { @@ -140,31 +234,32 @@ final class UpdateManager: ObservableObject { func handleInstallRequested() { installRequested = true - phase = .downloading(fraction: nil) + phase = .downloading(version: pendingVersion ?? "", fraction: nil) } func handleUpdateFound( version: String, releasePage: URL?, - informationOnly: Bool + informationOnly: Bool, + stage: Stage = .notDownloaded ) -> SPUUserUpdateChoice { pendingVersion = version pendingIsInformationOnly = informationOnly releasePageURL = releasePage finishManualCheck(status: .idle) - if installRequested && !informationOnly { - return .install - } - installRequested = false - phase = .available(version: version) - return .dismiss + let decision = Self.decideUpdateFound( + version: version, stage: stage, installRequested: installRequested, informationOnly: informationOnly) + installRequested = decision.choice == .install + phase = decision.phase + return decision.choice } func handleDownloadInitiated() { expectedDownloadBytes = 0 receivedDownloadBytes = 0 - phase = .downloading(fraction: nil) + lastProgressPublish = .distantPast + phase = .downloading(version: pendingVersion ?? "", fraction: nil) } func handleDownloadExpectedLength(_ length: UInt64) { @@ -175,24 +270,40 @@ final class UpdateManager: ObservableObject { receivedDownloadBytes += bytes guard expectedDownloadBytes > 0 else { return } let fraction = min(1.0, Double(receivedDownloadBytes) / Double(expectedDownloadBytes)) - phase = .downloading(fraction: fraction) + publish(.downloading(version: pendingVersion ?? "", fraction: fraction), force: fraction >= 1) } func handleExtractionStarted() { - phase = .installing + lastProgressPublish = .distantPast + phase = .extracting(version: pendingVersion ?? "", fraction: nil) } - func handleReadyToInstall() -> SPUUserUpdateChoice { - phase = .installing - return .install + func handleExtractionProgress(_ progress: Double) { + let fraction = min(1.0, max(0.0, progress)) + publish(.extracting(version: pendingVersion ?? "", fraction: fraction), force: fraction >= 1) + } + + func handleReadyToInstall(reply: @escaping (SPUUserUpdateChoice) -> Void) { + let version = pendingVersion ?? "" + if resumeInstallRequested || installRequested { + installRequested = false + resumeInstallRequested = false + phase = .installing(version: version) + reply(.install) + return + } + readyReply = reply + phase = .readyToInstall(version: version, deferred: false) } func handleInstalling() { - phase = .installing + phase = .installing(version: pendingVersion ?? "") } func handleNotFound() { installRequested = false + resumeInstallRequested = false + readyReply = nil pendingVersion = nil pendingIsInformationOnly = false releasePageURL = nil @@ -202,26 +313,37 @@ final class UpdateManager: ObservableObject { func handleError(_ message: String) { finishManualCheck(status: .failed) - if installRequested, let pendingVersion { + readyReply = nil + if installRequested || resumeInstallRequested { log.error("Update install failed") - phase = .failed(version: pendingVersion) + phase = .failed(message: Self.failureMessageKey) } else { log.debug("Update check failed silently") phase = pendingVersion.map { .available(version: $0) } ?? .idle } installRequested = false + resumeInstallRequested = false } func handleDismissInstallation() { installRequested = false + resumeInstallRequested = false + readyReply = nil switch phase { - case .downloading, .installing: + case .downloading, .extracting, .installing: phase = pendingVersion.map { .available(version: $0) } ?? .idle - case .idle, .available, .failed: + case .idle, .checking, .available, .readyToInstall, .failed: break } } + private func publish(_ next: Phase, force: Bool) { + let instant = now() + guard force || instant.timeIntervalSince(lastProgressPublish) >= Self.progressPublishInterval else { return } + lastProgressPublish = instant + phase = next + } + private func finishManualCheck(status: ManualCheckStatus) { guard manualCheckPending else { return } manualCheckPending = false @@ -261,7 +383,8 @@ private final class Driver: NSObject, SPUUserDriver { let choice = manager.handleUpdateFound( version: appcastItem.displayVersionString, releasePage: appcastItem.infoURL, - informationOnly: appcastItem.isInformationOnlyUpdate + informationOnly: appcastItem.isInformationOnlyUpdate, + stage: Self.stage(state.stage) ) reply(choice) } @@ -296,10 +419,12 @@ private final class Driver: NSObject, SPUUserDriver { manager.handleExtractionStarted() } - func showExtractionReceivedProgress(_ progress: Double) {} + func showExtractionReceivedProgress(_ progress: Double) { + manager.handleExtractionProgress(progress) + } func showReady(toInstallAndRelaunch reply: @escaping (SPUUserUpdateChoice) -> Void) { - reply(manager.handleReadyToInstall()) + manager.handleReadyToInstall(reply: reply) } func showInstallingUpdate( @@ -316,14 +441,23 @@ private final class Driver: NSObject, SPUUserDriver { func dismissUpdateInstallation() { manager.handleDismissInstallation() } + + private static func stage(_ stage: SPUUserUpdateStage) -> UpdateManager.Stage { + switch stage { + case .downloaded: return .downloaded + case .installing: return .installing + default: return .notDownloaded + } + } } private final class UpdaterDelegate: NSObject, SPUUpdaterDelegate { nonisolated func feedURLString(for updater: SPUUpdater) -> String? { - guard Bundle.main.object(forInfoDictionaryKey: "TokenGaugeDevelopmentBuild") as? Bool == true else { - return nil - } - return UpdateManager.qaFeedURL(environment: ProcessInfo.processInfo.environment) + UpdateManager.feedURL( + environment: ProcessInfo.processInfo.environment, + override: UserDefaults.standard.string(forKey: UpdateManager.feedOverrideDefaultsKey), + isDevelopmentBuild: Bundle.main.object(forInfoDictionaryKey: "TokenGaugeDevelopmentBuild") as? Bool ?? true + ) } } diff --git a/Sources/TokenGaugeApp/Views/AboutView.swift b/Sources/TokenGaugeApp/Views/AboutView.swift index a59b405..187a0d1 100644 --- a/Sources/TokenGaugeApp/Views/AboutView.swift +++ b/Sources/TokenGaugeApp/Views/AboutView.swift @@ -78,21 +78,8 @@ struct UpdateActionView: View { case .idle: Button("updates.check".localized) { updates.checkForUpdatesManually() } } - case .available(let version): - Button("updates.install".localized(version)) { updates.installPendingUpdate() } - case .downloading(let fraction): - VStack(alignment: .leading, spacing: 5) { - Text("updates.downloading".localized) - if let fraction { - ProgressView(value: fraction) - } else { - ProgressView().controlSize(.small) - } - } - case .installing: - Label("updates.installing".localized, systemImage: "arrow.down.circle") - case .failed: - Button("updates.retry".localized) { updates.installPendingUpdate() } + default: + UpdateBannerView(updates: updates) } }.font(.callout).frame(maxWidth: .infinity, alignment: .center) } diff --git a/Sources/TokenGaugeApp/Views/PopoverView.swift b/Sources/TokenGaugeApp/Views/PopoverView.swift index f572de3..a93dceb 100644 --- a/Sources/TokenGaugeApp/Views/PopoverView.swift +++ b/Sources/TokenGaugeApp/Views/PopoverView.swift @@ -28,7 +28,7 @@ struct PopoverView: View { store.panelStyle == .rings ? Theme.Layout.ringProviderMaxHeight : store.panelStyle == .compact ? Theme.Layout.compactProviderMaxHeight : Theme.Layout.providerMaxHeight - return height - (updates.phase == .idle ? 0 : 44) + return height - (updates.phase == .idle ? 0 : UpdateBannerView.height(for: updates.phase)) } private var panelWidth: CGFloat { @@ -61,6 +61,9 @@ struct PopoverView: View { private var content: some View { VStack(alignment: .leading, spacing: Theme.Layout.sectionSpacing) { header + if updates.phase != .idle { + UpdateBannerView(updates: updates) + } providerPicker ViewThatFits(in: .vertical) { @@ -79,9 +82,6 @@ struct PopoverView: View { if store.panelStyle == .standard { Divider().padding(.top, 1) footer - } else if updates.phase != .idle { - Divider() - UpdateActionView().padding(5) } } .padding(.horizontal, Theme.Layout.panelPadding) @@ -282,9 +282,6 @@ struct PopoverView: View { private var footer: some View { VStack(spacing: 0) { - if updates.phase != .idle { - UpdateActionView().padding(5) - } FooterActionRow(icon: "gearshape", title: "settings.title".localized, action: showSettings) FooterActionRow(icon: "info.circle", title: "about.title".localized, action: showAbout) FooterActionRow(icon: "power", title: "action.quit".localized) { diff --git a/Sources/TokenGaugeApp/Views/UpdateBannerView.swift b/Sources/TokenGaugeApp/Views/UpdateBannerView.swift new file mode 100644 index 0000000..8078a44 --- /dev/null +++ b/Sources/TokenGaugeApp/Views/UpdateBannerView.swift @@ -0,0 +1,162 @@ +import SwiftUI + +struct UpdateBannerView: View { + @ObservedObject var updates: UpdateManager + @ObservedObject private var localization = LocalizationManager.shared + @Environment(\.accessibilityReduceMotion) private var reduceMotion + + static let compactHeight: CGFloat = 38 + static let progressHeight: CGFloat = 46 + static let cornerRadius: CGFloat = 9 + + init(updates: UpdateManager = .shared) { + self.updates = updates + } + + static func height(for phase: UpdateManager.Phase) -> CGFloat { + switch phase { + case .idle: return 0 + case .downloading, .extracting: return progressHeight + case .checking, .available, .readyToInstall, .installing, .failed: return compactHeight + } + } + + var body: some View { + Group { + switch updates.phase { + case .idle: + EmptyView() + case .checking: + row(title: "updates.checking".localized, icon: "arrow.triangle.2.circlepath") + case .available(let version): + row(title: "updates.banner_available".localized(version), icon: "arrow.down.circle.fill") { + action("updates.download".localized) { updates.installPendingUpdate() } + } + case .downloading(let version, let fraction): + progress( + title: text( + "updates.banner_downloading", pending: "updates.banner_downloading_pending", + version: version, fraction: fraction), + fraction: fraction) + case .extracting(let version, let fraction): + progress( + title: text( + "updates.banner_extracting", pending: "updates.banner_extracting_pending", + version: version, fraction: fraction), + fraction: fraction) + case .readyToInstall(let version, let deferred): + if deferred { + row(title: nil, icon: "arrow.down.circle.fill") { + action("updates.install_version".localized(version)) { updates.resumeDeferredInstall() } + } + } else { + row(title: "updates.banner_ready".localized(version), icon: "arrow.down.circle.fill") { + HStack(spacing: 6) { + action("updates.install_now".localized) { updates.installReadyUpdate() } + Button("updates.later".localized) { updates.deferReadyUpdate() } + .buttonStyle(.bordered).controlSize(.small) + } + } + } + case .installing: + row(title: "updates.installing".localized, icon: "arrow.down.circle.fill") + case .failed(let message): + row(title: message.localized, icon: "exclamationmark.triangle.fill") { + action("updates.retry_action".localized) { updates.installPendingUpdate() } + } + } + } + .id(localization.language) + } + + private func row(title: String?, icon: String) -> some View { + row(title: title, icon: icon) { EmptyView() } + } + + private func row( + title: String?, + icon: String, + @ViewBuilder trailing: () -> some View + ) -> some View { + HStack(spacing: 8) { + Image(systemName: icon) + .font(.system(size: 13)) + .foregroundStyle(Color.accentColor) + .accessibilityHidden(true) + if let title { + Text(title).font(.system(size: 11, weight: .medium)).lineLimit(1) + } + Spacer(minLength: 4) + trailing() + } + .frame(height: Self.compactHeight) + .modifier(BannerChrome()) + } + + private func progress(title: String, fraction: Double?) -> some View { + VStack(alignment: .leading, spacing: 5) { + Text(title).font(.system(size: 11, weight: .medium)).lineLimit(1) + UpdateProgressBar(fraction: fraction, reduceMotion: reduceMotion) + } + .frame(height: Self.progressHeight) + .modifier(BannerChrome()) + } + + private func action(_ title: String, perform: @escaping () -> Void) -> some View { + Button(title, action: perform) + .buttonStyle(.borderedProminent) + .controlSize(.small) + } + + private func text(_ key: String, pending: String, version: String, fraction: Double?) -> String { + guard let fraction else { return pending.localized(version) } + return key.localized(version, Int((fraction * 100).rounded())) + } +} + +private struct BannerChrome: ViewModifier { + func body(content: Content) -> some View { + content + .padding(.horizontal, 10) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + RoundedRectangle(cornerRadius: UpdateBannerView.cornerRadius, style: .continuous) + .fill(Color.accentColor.opacity(0.10)) + ) + } +} + +private struct UpdateProgressBar: View { + let fraction: Double? + let reduceMotion: Bool + + @State private var sliding = false + + var body: some View { + GeometryReader { geometry in + ZStack(alignment: .leading) { + Capsule().fill(Color.primary.opacity(0.10)) + if let fraction { + Capsule() + .fill(Color.accentColor) + .frame(width: max(0, min(1, fraction)) * geometry.size.width) + .animation(reduceMotion ? nil : .linear(duration: 0.2), value: fraction) + } else if reduceMotion { + Capsule().fill(Color.accentColor.opacity(0.35)) + } else { + Capsule() + .fill(Color.accentColor) + .frame(width: geometry.size.width * 0.3) + .offset(x: sliding ? geometry.size.width * 0.7 : 0) + .onAppear { + withAnimation(.easeInOut(duration: 0.9).repeatForever(autoreverses: true)) { + sliding = true + } + } + } + } + } + .frame(height: 6) + .accessibilityHidden(true) + } +} diff --git a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift new file mode 100644 index 0000000..069fb9d --- /dev/null +++ b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift @@ -0,0 +1,85 @@ +import AppKit +import SwiftUI +import XCTest + +@testable import TokenGaugeApp + +@MainActor +final class UpdateBannerRenderingTests: XCTestCase { + + private let phases: [UpdateManager.Phase] = [ + .checking, + .available(version: "1.4.0"), + .downloading(version: "1.4.0", fraction: nil), + .downloading(version: "1.4.0", fraction: 0.43), + .extracting(version: "1.4.0", fraction: 0.6), + .readyToInstall(version: "1.4.0", deferred: false), + .readyToInstall(version: "1.4.0", deferred: true), + .installing(version: "1.4.0"), + .failed(message: UpdateManager.failureMessageKey), + ] + + func testEveryBannerStateKeepsItsDeclaredHeight() throws { + let language = LocalizationManager.shared.language + defer { LocalizationManager.shared.language = language } + for language in AppLanguage.allCases { + LocalizationManager.shared.language = language + for phase in phases { + let manager = try makeManager(phase: phase) + let view = NSHostingView( + rootView: UpdateBannerView(updates: manager).frame(width: Theme.Layout.panelWidth)) + XCTAssertEqual( + view.fittingSize.height, UpdateBannerView.height(for: phase), accuracy: 1, + "\(language.rawValue) / \(phase)") + XCTAssertEqual(view.fittingSize.width, Theme.Layout.panelWidth, accuracy: 1) + } + } + } + + func testIdleBannerRendersNothing() throws { + let manager = try makeManager(phase: .idle) + let view = NSHostingView(rootView: UpdateBannerView(updates: manager)) + + XCTAssertEqual(UpdateBannerView.height(for: .idle), 0) + XCTAssertEqual(view.fittingSize.height, 0, accuracy: 1) + } + + private func makeManager(phase: UpdateManager.Phase) throws -> UpdateManager { + let suite = "TokenGauge.banner.\(UUID().uuidString)" + let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) + addTeardownBlock { defaults.removePersistentDomain(forName: suite) } + let manager = UpdateManager(defaults: defaults) + switch phase { + case .idle: + break + case .checking: + manager.handleManualCheckStarted() + case .available(let version): + _ = manager.handleUpdateFound(version: version, releasePage: nil, informationOnly: false) + case .downloading(let version, let fraction): + _ = manager.handleUpdateFound(version: version, releasePage: nil, informationOnly: false) + manager.handleDownloadInitiated() + if let fraction { + manager.handleDownloadExpectedLength(1_000) + manager.handleDownloadReceived(bytes: UInt64(fraction * 1_000)) + } + case .extracting(let version, let fraction): + _ = manager.handleUpdateFound(version: version, releasePage: nil, informationOnly: false) + manager.handleExtractionStarted() + if let fraction { manager.handleExtractionProgress(fraction) } + case .readyToInstall(let version, let deferred): + _ = manager.handleUpdateFound(version: version, releasePage: nil, informationOnly: false) + manager.handleReadyToInstall { _ in } + if deferred { manager.deferReadyUpdate() } + case .installing(let version): + _ = manager.handleUpdateFound(version: version, releasePage: nil, informationOnly: false) + manager.handleInstalling() + case .failed: + _ = manager.handleUpdateFound(version: "1.4.0", releasePage: nil, informationOnly: false) + manager.handleInstallRequested() + manager.handleError("failure") + } + XCTAssertEqual(manager.phase, phase) + return manager + } +} diff --git a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift index e211b34..25a8db0 100644 --- a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift @@ -1,3 +1,4 @@ +import Sparkle import XCTest @testable import TokenGaugeApp @@ -5,8 +6,20 @@ import XCTest @MainActor final class UpdateManagerTests: XCTestCase { + private var clock = Date(timeIntervalSince1970: 1_000) + private func makeManager() -> UpdateManager { - UpdateManager(defaults: UserDefaults(suiteName: "TokenGauge.UpdaterTests." + UUID().uuidString)!) + UpdateManager( + defaults: UserDefaults(suiteName: "TokenGauge.UpdaterTests." + UUID().uuidString)!, + now: { [unowned self] in self.clock }) + } + + private func found( + _ manager: UpdateManager, version: String = "9.9.9", informationOnly: Bool = false, + stage: UpdateManager.Stage = .notDownloaded + ) -> SPUUserUpdateChoice { + manager.handleUpdateFound( + version: version, releasePage: nil, informationOnly: informationOnly, stage: stage) } func testScheduledFoundUpdateIsDismissedAndSurfaced() { @@ -26,24 +39,22 @@ final class UpdateManagerTests: XCTestCase { let manager = makeManager() manager.handleInstallRequested() - let choice = manager.handleUpdateFound( - version: "9.9.9", releasePage: nil, informationOnly: true) - - XCTAssertEqual(choice, .dismiss) + XCTAssertEqual(found(manager, informationOnly: true), .dismiss) XCTAssertEqual(manager.phase, .available(version: "9.9.9")) } func testDownloadProgressIsFractionOfExpectedLength() { let manager = makeManager() + _ = found(manager) manager.handleDownloadInitiated() - XCTAssertEqual(manager.phase, .downloading(fraction: nil)) + XCTAssertEqual(manager.phase, .downloading(version: "9.9.9", fraction: nil)) manager.handleDownloadExpectedLength(1_000) manager.handleDownloadReceived(bytes: 250) - XCTAssertEqual(manager.phase, .downloading(fraction: 0.25)) + XCTAssertEqual(manager.phase, .downloading(version: "9.9.9", fraction: 0.25)) manager.handleDownloadReceived(bytes: 750) - XCTAssertEqual(manager.phase, .downloading(fraction: 1.0)) + XCTAssertEqual(manager.phase, .downloading(version: "9.9.9", fraction: 1.0)) } func testUnknownContentLengthStaysIndeterminate() { @@ -51,7 +62,7 @@ final class UpdateManagerTests: XCTestCase { manager.handleDownloadInitiated() manager.handleDownloadReceived(bytes: 4_096) - XCTAssertEqual(manager.phase, .downloading(fraction: nil)) + XCTAssertEqual(manager.phase, .downloading(version: "", fraction: nil)) } func testDownloadFractionIsCappedAtOne() { @@ -60,23 +71,100 @@ final class UpdateManagerTests: XCTestCase { manager.handleDownloadExpectedLength(100) manager.handleDownloadReceived(bytes: 250) - XCTAssertEqual(manager.phase, .downloading(fraction: 1.0)) + XCTAssertEqual(manager.phase, .downloading(version: "", fraction: 1.0)) + } + + func testProgressPublishesAtMostTwentyTimesPerSecond() { + let manager = makeManager() + _ = found(manager) + manager.handleDownloadInitiated() + manager.handleDownloadExpectedLength(1_000) + + manager.handleDownloadReceived(bytes: 100) + XCTAssertEqual(manager.phase, .downloading(version: "9.9.9", fraction: 0.1)) + + manager.handleDownloadReceived(bytes: 100) + XCTAssertEqual(manager.phase, .downloading(version: "9.9.9", fraction: 0.1)) + + clock.addTimeInterval(UpdateManager.progressPublishInterval * 2) + manager.handleDownloadReceived(bytes: 100) + XCTAssertEqual(manager.phase, .downloading(version: "9.9.9", fraction: 0.3)) } - func testExtractionAndReadyToInstallShowInstalling() { + func testExtractionProgressIsReported() { let manager = makeManager() + _ = found(manager) manager.handleExtractionStarted() - XCTAssertEqual(manager.phase, .installing) + XCTAssertEqual(manager.phase, .extracting(version: "9.9.9", fraction: nil)) + + manager.handleExtractionProgress(0.5) + XCTAssertEqual(manager.phase, .extracting(version: "9.9.9", fraction: 0.5)) + + manager.handleExtractionProgress(1.0) + XCTAssertEqual(manager.phase, .extracting(version: "9.9.9", fraction: 1.0)) + } + + func testReadyToInstallWaitsForTheUserChoice() { + let manager = makeManager() + _ = found(manager) + var choices: [SPUUserUpdateChoice] = [] + manager.handleReadyToInstall { choices.append($0) } + + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: false)) + XCTAssertTrue(choices.isEmpty) + + manager.installReadyUpdate() + + XCTAssertEqual(choices, [.install]) + XCTAssertEqual(manager.phase, .installing(version: "9.9.9")) + } + + func testDeferredReadyUpdateStaysVisibleAndResumesWithInstall() { + let manager = makeManager() + _ = found(manager) + var choices: [SPUUserUpdateChoice] = [] + manager.handleReadyToInstall { choices.append($0) } + + manager.deferReadyUpdate() + XCTAssertEqual(choices, [.dismiss]) + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: true)) + + manager.handleDismissInstallation() + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: true)) + + manager.resumeDeferredInstall() + XCTAssertEqual(manager.phase, .installing(version: "9.9.9")) + XCTAssertEqual(found(manager, stage: .downloaded), .install) + + manager.handleReadyToInstall { choices.append($0) } + XCTAssertEqual(choices, [.dismiss, .install]) + XCTAssertEqual(manager.phase, .installing(version: "9.9.9")) + } - XCTAssertEqual(manager.handleReadyToInstall(), .install) - XCTAssertEqual(manager.phase, .installing) + func testDownloadedStageWithoutInstallIntentSurfacesTheDeferredRow() { + XCTAssertEqual( + UpdateManager.decideUpdateFound( + version: "1.4.0", stage: .downloaded, installRequested: false, informationOnly: false), + UpdateManager.FoundDecision( + choice: .dismiss, phase: .readyToInstall(version: "1.4.0", deferred: true))) + XCTAssertEqual( + UpdateManager.decideUpdateFound( + version: "1.4.0", stage: .downloaded, installRequested: true, informationOnly: false), + UpdateManager.FoundDecision(choice: .install, phase: .installing(version: "1.4.0"))) + XCTAssertEqual( + UpdateManager.decideUpdateFound( + version: "1.4.0", stage: .notDownloaded, installRequested: true, informationOnly: false), + UpdateManager.FoundDecision( + choice: .install, phase: .downloading(version: "1.4.0", fraction: nil))) + XCTAssertEqual( + UpdateManager.decideUpdateFound( + version: "1.4.0", stage: .downloaded, installRequested: true, informationOnly: true), + UpdateManager.FoundDecision(choice: .dismiss, phase: .available(version: "1.4.0"))) } func testScheduledCheckErrorStaysSilent() { let manager = makeManager() - let choice = manager.handleUpdateFound( - version: "9.9.9", releasePage: nil, informationOnly: false) - XCTAssertEqual(choice, .dismiss) + XCTAssertEqual(found(manager), .dismiss) manager.handleError("network down") @@ -92,8 +180,7 @@ final class UpdateManagerTests: XCTestCase { func testDismissDuringDownloadRollsBackToAvailable() { let manager = makeManager() - _ = manager.handleUpdateFound( - version: "9.9.9", releasePage: nil, informationOnly: false) + _ = found(manager) manager.handleDownloadInitiated() manager.handleDismissInstallation() @@ -103,8 +190,7 @@ final class UpdateManagerTests: XCTestCase { func testDismissKeepsPendingRowAlive() { let manager = makeManager() - _ = manager.handleUpdateFound( - version: "9.9.9", releasePage: nil, informationOnly: false) + _ = found(manager) manager.handleDismissInstallation() @@ -113,29 +199,23 @@ final class UpdateManagerTests: XCTestCase { func testNotFoundClearsPendingState() { let manager = makeManager() - _ = manager.handleUpdateFound( - version: "9.9.9", releasePage: nil, informationOnly: false) + _ = found(manager) manager.handleNotFound() XCTAssertEqual(manager.phase, .idle) XCTAssertNil(manager.releasePageURL) } + func testCancelledInstallationCannotAuthorizeTheNextCheck() { let manager = makeManager() - _ = manager.handleUpdateFound(version: "1.0.1", releasePage: nil, informationOnly: false) + _ = found(manager, version: "1.0.1") manager.handleInstallRequested() - XCTAssertEqual( - manager.handleUpdateFound(version: "1.0.1", releasePage: nil, informationOnly: false), - .install) + XCTAssertEqual(found(manager, version: "1.0.1"), .install) manager.handleDismissInstallation() - XCTAssertEqual( - manager.handleUpdateFound(version: "1.0.1", releasePage: nil, informationOnly: false), - .dismiss) + XCTAssertEqual(found(manager, version: "1.0.1"), .dismiss) manager.handleInstallRequested() - XCTAssertEqual( - manager.handleUpdateFound(version: "1.0.1", releasePage: nil, informationOnly: false), - .install) + XCTAssertEqual(found(manager, version: "1.0.1"), .install) } func testQAFeedRequiresExplicitOptInAndLoopback() { @@ -155,10 +235,27 @@ final class UpdateManagerTests: XCTestCase { raw) } } + + func testFeedOverridePrecedence() { + let qa = ["TOKENGAUGE_QA_UPDATES": "1", "TOKENGAUGE_UPDATE_FEED_URL": "http://127.0.0.1:18764/appcast.xml"] + let override = "http://127.0.0.1:8000/override.xml" + + XCTAssertEqual( + UpdateManager.feedURL(environment: qa, override: override, isDevelopmentBuild: true), + qa["TOKENGAUGE_UPDATE_FEED_URL"]) + XCTAssertEqual( + UpdateManager.feedURL(environment: [:], override: override, isDevelopmentBuild: true), override) + XCTAssertEqual( + UpdateManager.feedURL(environment: qa, override: override, isDevelopmentBuild: false), override) + XCTAssertNil(UpdateManager.feedURL(environment: [:], override: nil, isDevelopmentBuild: false)) + XCTAssertNil(UpdateManager.feedURL(environment: [:], override: "not a url", isDevelopmentBuild: false)) + } + func testManualCheckFailureIsVisibleWithoutPublishingErrorDetails() { let manager = makeManager() manager.handleManualCheckStarted() XCTAssertEqual(manager.manualCheckStatus, .checking) + XCTAssertEqual(manager.phase, .checking) manager.handleError("private network error detail") XCTAssertEqual(manager.manualCheckStatus, .failed) XCTAssertEqual(manager.phase, .idle) @@ -173,10 +270,10 @@ final class UpdateManagerTests: XCTestCase { func testInstallationErrorRequiresExplicitRetry() { let manager = makeManager() - _ = manager.handleUpdateFound(version: "1.0.1", releasePage: nil, informationOnly: false) + _ = found(manager, version: "1.0.1") manager.handleInstallRequested() manager.handleError("download failed") - XCTAssertEqual(manager.phase, .failed(version: "1.0.1")) - XCTAssertEqual(manager.handleUpdateFound(version: "1.0.1", releasePage: nil, informationOnly: false), .dismiss) + XCTAssertEqual(manager.phase, .failed(message: UpdateManager.failureMessageKey)) + XCTAssertEqual(found(manager, version: "1.0.1"), .dismiss) } } diff --git a/docs/RELEASING.md b/docs/RELEASING.md index b3a6b00..bd25933 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -47,6 +47,10 @@ TOKENGAUGE_UPDATE_FEED_URL=http://127.0.0.1:8000/appcast.xml Only a loopback HTTP feed is accepted for this explicit QA override. Normal development launches disable updates. Test through About using real input, verify the higher build relaunches with the same Apple Development signing identity, then restore the real version and remove task-owned QA artifacts/server. Do not copy production credentials or user usage history to a test Mac. +## Feed override + +`defaults write com.stevenacz.TokenGauge updateFeedURLOverride ` points any build, including a notarized distribution build, at another appcast; `defaults delete com.stevenacz.TokenGauge updateFeedURLOverride` restores the feed from `Info.plist`. EdDSA signatures still gate every install, so an override cannot install an unsigned update. The precedence is `TOKENGAUGE_QA_UPDATES` plus `TOKENGAUGE_UPDATE_FEED_URL` (development builds, loopback only), then `updateFeedURLOverride`, then `SUFeedURL`. Remove the override after QA. + ## Repository visibility Review the entire history before changing a private repository to public. Permission to prepare a release does not by itself prove that publication has occurred. Record the live visibility and release URL after the owner-authorized publication step. Keep generated artifacts and signing material out of Git. From 578b6d0a827b654e95fc1fe5fc7505119b456da0 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:24:24 -0500 Subject: [PATCH 03/21] feat(quota): adaptive ring layout with legible single, grid and row variants --- .../Resources/en.lproj/Localizable.strings | 1 + .../Resources/es.lproj/Localizable.strings | 1 + Sources/TokenGaugeApp/Support/Theme.swift | 18 +++- Sources/TokenGaugeApp/Views/PopoverView.swift | 4 +- .../TokenGaugeApp/Views/ProviderCard.swift | 35 +++++-- .../TokenGaugeApp/Views/QuotaPaceLabel.swift | 8 +- Sources/TokenGaugeApp/Views/QuotaRing.swift | 90 ++++++++++++++---- .../TokenGaugeApp/Views/QuotaRingGrid.swift | 2 +- .../TokenGaugeApp/Views/QuotaRingLayout.swift | 70 ++++++++++++++ .../QuotaPanelRenderingTests.swift | 91 ++++++++++++++++++- .../QuotaRingLayoutTests.swift | 59 ++++++++++++ 11 files changed, 340 insertions(+), 39 deletions(-) create mode 100644 Sources/TokenGaugeApp/Views/QuotaRingLayout.swift create mode 100644 Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift diff --git a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings index 7292df0..fca9763 100644 --- a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings @@ -114,6 +114,7 @@ "status.credential_expired" = "Connection pending"; "message.credential_expired" = "The shared session expired. Enable automatic reconnection in Settings or open Claude Code."; "quota.last_remaining" = "last remaining"; +"quota.last_remaining_value" = "%@ last remaining"; "settings.claude_recovery" = "Automatic reconnection"; "settings.claude_recovery_help" = "Allow Claude Code to start briefly in the background when its session expires. No messages or model tokens. Requires an existing Claude Code login."; "setup.claude_recovery_title" = "Allow automatic Claude reconnection?"; diff --git a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings index 19bae90..7695d6e 100644 --- a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings @@ -114,6 +114,7 @@ "status.credential_expired" = "Conexión pendiente"; "message.credential_expired" = "La sesión compartida caducó. Activa la reconexión automática en Configuración o abre Claude Code."; "quota.last_remaining" = "último saldo"; +"quota.last_remaining_value" = "%@ último saldo"; "settings.claude_recovery" = "Reconexión automática"; "settings.claude_recovery_help" = "Permite iniciar Claude Code brevemente en segundo plano si su sesión caduca. Sin enviar mensajes ni consumir tokens. Requiere haber iniciado sesión en Claude Code."; "setup.claude_recovery_title" = "¿Permitir la reconexión automática de Claude?"; diff --git a/Sources/TokenGaugeApp/Support/Theme.swift b/Sources/TokenGaugeApp/Support/Theme.swift index de02f8d..824dd1c 100644 --- a/Sources/TokenGaugeApp/Support/Theme.swift +++ b/Sources/TokenGaugeApp/Support/Theme.swift @@ -13,26 +13,34 @@ enum Theme { static let unifiedPanelWidth: CGFloat = 560 static let providerMaxHeight: CGFloat = 182 static let compactProviderMaxHeight: CGFloat = 230 - static let ringProviderMaxHeight: CGFloat = 250 + static let ringProviderMaxHeight: CGFloat = 264 static let compactPanelWidth: CGFloat = 320 static let compactUnifiedWidth: CGFloat = 360 static let ringPanelWidth: CGFloat = 360 - static let ringUnifiedWidth: CGFloat = 520 + static let ringUnifiedWidth: CGFloat = 560 static let activityChartHeight: CGFloat = 64 static let historyCalendarGridTop: CGFloat = 22 static let historyCalendarHeight: CGFloat = historyCalendarGridTop + 87 static let historyMonthWidth: CGFloat = 69 static let historyMonthGap: CGFloat = 8 static let minimumRingUnifiedWidth: CGFloat = 440 - static let quotaRingCellWidth: CGFloat = 80 + static let quotaRingCellWidth: CGFloat = 118 static let quotaRingSpacing: CGFloat = 10 static let ringSectionSpacing: CGFloat = 10 static let ringHeaderSpacing: CGFloat = 14 - static let ringTitleHeight: CGFloat = 26 - static let minimumRingCardWidth: CGFloat = 155 + static let ringRowSpacing: CGFloat = 8 + static let ringTitleHeight: CGFloat = 28 + static let minimumRingCardWidth: CGFloat = 170 static let cardPadding: CGFloat = 12 static let quotaRingDiameter: CGFloat = 68 static let quotaRingLineWidth: CGFloat = 5 + static let quotaRingPercentageSize: CGFloat = 17 + static let quotaRingSingleDiameter: CGFloat = 84 + static let quotaRingSingleLineWidth: CGFloat = 6 + static let quotaRingSinglePercentageSize: CGFloat = 20 + static let quotaRingRowDiameter: CGFloat = 44 + static let quotaRingRowLineWidth: CGFloat = 4 + static let quotaRingRowPercentageSize: CGFloat = 12 static let panelPadding: CGFloat = 13 static let panelBottomPadding: CGFloat = 14 static let historyModeSegmentWidth: CGFloat = 48 diff --git a/Sources/TokenGaugeApp/Views/PopoverView.swift b/Sources/TokenGaugeApp/Views/PopoverView.swift index f572de3..3c39022 100644 --- a/Sources/TokenGaugeApp/Views/PopoverView.swift +++ b/Sources/TokenGaugeApp/Views/PopoverView.swift @@ -150,6 +150,7 @@ struct PopoverView: View { claudeMenuBarSource: store.claudeMenuBarSource, claudeAutomaticRecovery: store.claudeAutomaticRecovery, showHourlyPace: store.showHourlyPace, + stretchesHeight: store.displayMode == .unified && store.panelStyle == .rings, accountLabel: store.claudeAccountLabel, paces: paces(for: provider), previousPaces: previousPaces(for: provider) ) @@ -193,8 +194,7 @@ struct PopoverView: View { let cells = min(count, 3) return max( Theme.Layout.minimumRingCardWidth, - cells * Theme.Layout.quotaRingCellWidth + (cells - 1) * Theme.Layout.quotaRingSpacing - + Theme.Layout.cardPadding * 2) + cells * Theme.Layout.quotaRingCellWidth + Theme.Layout.cardPadding * 2) } private var ringUnifiedWidth: CGFloat { diff --git a/Sources/TokenGaugeApp/Views/ProviderCard.swift b/Sources/TokenGaugeApp/Views/ProviderCard.swift index 497d654..18632ae 100644 --- a/Sources/TokenGaugeApp/Views/ProviderCard.swift +++ b/Sources/TokenGaugeApp/Views/ProviderCard.swift @@ -12,6 +12,7 @@ struct ProviderCard: View { var claudeMenuBarSource: ClaudeMenuBarSource = .automatic var claudeAutomaticRecovery = false var showHourlyPace = false + var stretchesHeight = false var accountLabel: String? var paces: [String: QuotaPace] = [:] var previousPaces: [String: QuotaPace] = [:] @@ -63,6 +64,7 @@ struct ProviderCard: View { } .padding(compact ? 9 : (panelStyle == .compact ? 8 : 12)) .frame(maxWidth: .infinity, alignment: .leading) + .frame(maxHeight: stretchesHeight ? .infinity : nil, alignment: .top) .providerCard() } @@ -73,15 +75,11 @@ struct ProviderCard: View { QuotaRingWindow( window: window, tint: tint, chips: chips(for: window), historical: showsLastKnown, showPace: canShowPace(window), pace: paces[window.id], previousPace: previousPaces[window.id], - alignsTitleRows: false) + metrics: .single, alignsTitleRows: false) } else { - QuotaRingGrid { - ForEach(visibleWindows) { window in - QuotaRingWindow( - window: window, tint: tint, chips: chips(for: window), historical: showsLastKnown, - showPace: canShowPace(window), pace: paces[window.id], - previousPace: previousPaces[window.id]) - } + QuotaRingModeLayout(windows: visibleWindows.count) { + ringGrid.quotaRingVariant() + ringRows.quotaRingVariant() } } } else { @@ -105,6 +103,27 @@ struct ProviderCard: View { } } + private var ringGrid: some View { + QuotaRingGrid { + ForEach(visibleWindows) { window in + QuotaRingWindow( + window: window, tint: tint, chips: chips(for: window), historical: showsLastKnown, + showPace: canShowPace(window), pace: paces[window.id], previousPace: previousPaces[window.id]) + } + } + } + + private var ringRows: some View { + VStack(spacing: Theme.Layout.ringRowSpacing) { + ForEach(Array(visibleWindows.enumerated()), id: \.element.id) { index, window in + if index > 0 { Divider() } + QuotaRingRow( + window: window, tint: tint, chips: chips(for: window), historical: showsLastKnown, + showPace: canShowPace(window), pace: paces[window.id], previousPace: previousPaces[window.id]) + } + } + } + private func canShowPace(_ window: QuotaWindow) -> Bool { showHourlyPace && (state.status == .ready || showsLastKnown) && window.durationMinutes == 10080 } diff --git a/Sources/TokenGaugeApp/Views/QuotaPaceLabel.swift b/Sources/TokenGaugeApp/Views/QuotaPaceLabel.swift index 69c3585..831cb48 100644 --- a/Sources/TokenGaugeApp/Views/QuotaPaceLabel.swift +++ b/Sources/TokenGaugeApp/Views/QuotaPaceLabel.swift @@ -37,7 +37,7 @@ struct QuotaPaceLabel: View { QuotaPaceDetailsView(display: display) } } - .font(.system(size: 9)).foregroundStyle(.secondary) + .font(.system(size: 10)).foregroundStyle(.secondary) } } @@ -60,9 +60,9 @@ struct QuotaPaceDetailsView: View { if let previous = display.previous { reading(previous, title: "pace.previous".localized) } - Text("pace.info_method".localized).font(.system(size: 9)).foregroundStyle(.secondary) + Text("pace.info_method".localized).font(.system(size: 10)).foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) - Text("pace.info_retention".localized).font(.system(size: 9)).foregroundStyle(.secondary) + Text("pace.info_retention".localized).font(.system(size: 10)).foregroundStyle(.secondary) .fixedSize(horizontal: false, vertical: true) } .padding(14).frame(width: 285) @@ -77,7 +77,7 @@ struct QuotaPaceDetailsView: View { .font(.system(size: 12, weight: .semibold)).monospacedDigit() } Text(pace.sampledAt.formatted(.dateTime.day().month(.abbreviated).year().hour().minute().locale(locale))) - .font(.system(size: 9)).foregroundStyle(.secondary) + .font(.system(size: 10)).foregroundStyle(.secondary) } } diff --git a/Sources/TokenGaugeApp/Views/QuotaRing.swift b/Sources/TokenGaugeApp/Views/QuotaRing.swift index d6becc6..5870ca0 100644 --- a/Sources/TokenGaugeApp/Views/QuotaRing.swift +++ b/Sources/TokenGaugeApp/Views/QuotaRing.swift @@ -7,30 +7,33 @@ struct QuotaRing: View { let remainingPercentage: Double let tint: Color var historical = false + var metrics: QuotaRingMetrics = .grid var body: some View { ZStack { - Circle().stroke(Color.primary.opacity(0.09), lineWidth: Theme.Layout.quotaRingLineWidth) + Circle().stroke(Color.primary.opacity(0.09), lineWidth: metrics.lineWidth) Circle() .trim(from: 0, to: min(max(remainingPercentage / 100, 0), 1)) - .stroke(tint, style: StrokeStyle(lineWidth: Theme.Layout.quotaRingLineWidth, lineCap: .round)) + .stroke(tint, style: StrokeStyle(lineWidth: metrics.lineWidth, lineCap: .round)) .rotationEffect(.degrees(-90)) .animation(animateChanges && !reduceMotion ? Theme.Motion.value : nil, value: remainingPercentage) VStack(spacing: 1) { Text(UsageFormatters.percentage(remainingPercentage)) - .font(.system(size: 17, weight: .semibold, design: .rounded)) + .font(.system(size: metrics.percentageSize, weight: .semibold, design: .rounded)) .monospacedDigit() .foregroundStyle(Theme.severity(remaining: remainingPercentage) ?? .primary) - Text((historical ? "quota.last_remaining" : "quota.remaining").localized) - .font(.system(size: 8)) - .foregroundStyle(.secondary) - .lineLimit(2) - .multilineTextAlignment(.center) + if metrics.showsLabel { + Text((historical ? "quota.last_remaining" : "quota.remaining").localized) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .lineLimit(2) + .multilineTextAlignment(.center) + } } - .padding(5) + .padding(metrics.contentPadding) } - .padding(Theme.Layout.quotaRingLineWidth / 2) - .frame(width: Theme.Layout.quotaRingDiameter, height: Theme.Layout.quotaRingDiameter) + .padding(metrics.lineWidth / 2) + .frame(width: metrics.diameter, height: metrics.diameter) .accessibilityElement(children: .combine) } } @@ -43,12 +46,13 @@ struct QuotaRingWindow: View { var showPace = false var pace: QuotaPace? var previousPace: QuotaPace? + var metrics: QuotaRingMetrics = .grid var alignsTitleRows = true var body: some View { VStack(spacing: Theme.Layout.ringSectionSpacing) { Text(UsageFormatters.windowName(window)) - .font(.system(size: 10, weight: .medium)) + .font(.system(size: 11, weight: .medium)) .lineLimit(2) .multilineTextAlignment(.center) .frame(height: alignsTitleRows ? Theme.Layout.ringTitleHeight : nil, alignment: .bottom) @@ -56,20 +60,22 @@ struct QuotaRingWindow: View { QuotaRing( remainingPercentage: window.remainingPercentage, tint: Theme.severity(remaining: window.remainingPercentage) ?? tint, - historical: historical) + historical: historical, + metrics: metrics) VStack(spacing: 4) { Text(UsageFormatters.reset(window.resetsAt)) - .font(.system(size: 9)) + .font(.system(size: 10)) .foregroundStyle(.secondary) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) if showPace { QuotaPaceLabel(pace: pace, previousPace: previousPace) } if let summary = UsageFormatters.modelChips(chips) { Text(summary) - .font(.system(size: 9)) + .font(.system(size: 10)) .foregroundStyle(.secondary) - .lineLimit(1) - .truncationMode(.middle) + .lineLimit(2) + .truncationMode(.tail) + .multilineTextAlignment(.center) .help(summary) .monospacedDigit() } @@ -79,3 +85,53 @@ struct QuotaRingWindow: View { .accessibilityElement(children: showPace ? .contain : .combine) } } + +struct QuotaRingRow: View { + let window: QuotaWindow + let tint: Color + let chips: [ModelUsageChip] + var historical = false + var showPace = false + var pace: QuotaPace? + var previousPace: QuotaPace? + + var body: some View { + HStack(spacing: Theme.Layout.quotaRingSpacing) { + QuotaRing( + remainingPercentage: window.remainingPercentage, + tint: Theme.severity(remaining: window.remainingPercentage) ?? tint, + historical: historical, + metrics: .row) + VStack(alignment: .leading, spacing: 3) { + Text(UsageFormatters.windowName(window)) + .font(.system(size: 11, weight: .medium)) + .lineLimit(1) + .help(UsageFormatters.windowHelp(window)) + Text( + (historical ? "quota.last_remaining_value" : "quota.remaining_value").localized( + UsageFormatters.percentage(window.remainingPercentage)) + ) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .lineLimit(1) + .monospacedDigit() + Text(UsageFormatters.reset(window.resetsAt)) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .lineLimit(1) + if showPace { QuotaPaceLabel(pace: pace, previousPace: previousPace) } + if let summary = UsageFormatters.modelChips(chips) { + Text(summary) + .font(.system(size: 10)) + .foregroundStyle(.secondary) + .lineLimit(1) + .truncationMode(.tail) + .help(summary) + .monospacedDigit() + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + .accessibilityElement(children: showPace ? .contain : .combine) + } +} diff --git a/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift b/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift index 395fdc3..0b0155c 100644 --- a/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift +++ b/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift @@ -22,7 +22,7 @@ struct QuotaRingGrid: Layout { private func geometry(width: CGFloat, subviews: Subviews) -> (size: CGSize, frames: [CGRect]) { guard !subviews.isEmpty else { return (.zero, []) } let spacing = Theme.Layout.quotaRingSpacing - let columns = min(subviews.count, max(1, Int((width + spacing) / (Theme.Layout.quotaRingCellWidth + spacing)))) + let columns = QuotaRingLayout.columns(availableWidth: width, windows: subviews.count) var frames: [CGRect] = [] var y: CGFloat = 0 for start in stride(from: 0, to: subviews.count, by: columns) { diff --git a/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift b/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift new file mode 100644 index 0000000..8675895 --- /dev/null +++ b/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift @@ -0,0 +1,70 @@ +import SwiftUI + +enum QuotaRingLayout { + enum Mode: Equatable { + case single + case grid(columns: Int) + case rows + } + + static func choose(availableWidth: CGFloat, windows: Int) -> Mode { + guard windows > 1 else { return .single } + guard availableWidth / CGFloat(windows) >= Theme.Layout.quotaRingCellWidth else { return .rows } + return .grid(columns: windows) + } + + static func columns(availableWidth: CGFloat, windows: Int) -> Int { + max(1, min(windows, Int(availableWidth / Theme.Layout.quotaRingCellWidth))) + } +} + +struct QuotaRingMetrics { + let diameter: CGFloat + let lineWidth: CGFloat + let percentageSize: CGFloat + let contentPadding: CGFloat + let showsLabel: Bool + + static let single = QuotaRingMetrics( + diameter: Theme.Layout.quotaRingSingleDiameter, lineWidth: Theme.Layout.quotaRingSingleLineWidth, + percentageSize: Theme.Layout.quotaRingSinglePercentageSize, contentPadding: 5, showsLabel: true) + static let grid = QuotaRingMetrics( + diameter: Theme.Layout.quotaRingDiameter, lineWidth: Theme.Layout.quotaRingLineWidth, + percentageSize: Theme.Layout.quotaRingPercentageSize, contentPadding: 5, showsLabel: true) + static let row = QuotaRingMetrics( + diameter: Theme.Layout.quotaRingRowDiameter, lineWidth: Theme.Layout.quotaRingRowLineWidth, + percentageSize: Theme.Layout.quotaRingRowPercentageSize, contentPadding: 2, showsLabel: false) +} + +struct QuotaRingModeLayout: Layout { + let windows: Int + + func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { + let width = + proposal.width.flatMap { $0.isFinite ? max(0, $0) : nil } + ?? subviews[0].sizeThatFits(.unspecified).width + let height = subviews[index(for: width)].sizeThatFits(ProposedViewSize(width: width, height: nil)).height + return CGSize(width: width, height: height) + } + + func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { + let chosen = index(for: bounds.width) + for (offset, subview) in subviews.enumerated() { + let visible = offset == chosen + subview.place( + at: visible ? CGPoint(x: bounds.minX, y: bounds.minY) : CGPoint(x: bounds.maxX, y: bounds.maxY), + anchor: .topLeading, + proposal: visible ? ProposedViewSize(width: bounds.width, height: bounds.height) : .zero) + } + } + + private func index(for width: CGFloat) -> Int { + QuotaRingLayout.choose(availableWidth: width, windows: windows) == .rows ? 1 : 0 + } +} + +extension View { + func quotaRingVariant() -> some View { + frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading).clipped() + } +} diff --git a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift index 1136219..4cfb8a7 100644 --- a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift @@ -58,7 +58,8 @@ final class QuotaPanelRenderingTests: XCTestCase { defer { LocalizationManager.shared.language = originalLanguage } for language in AppLanguage.allCases { LocalizationManager.shared.language = language - for (count, width) in [(2, CGFloat(194)), (3, CGFloat(290))] { + for count in [2, 3] { + let width = CGFloat(count) * Theme.Layout.quotaRingCellWidth + Theme.Layout.cardPadding * 2 let card = ProviderCard( provider: .claude, state: state(count: count), panelStyle: .rings, showProviderTitle: true) let bitmap = try render(card.frame(width: width), maximumHeight: 220) @@ -87,7 +88,7 @@ final class QuotaPanelRenderingTests: XCTestCase { let all = try render(card.frame(width: 240), maximumHeight: 320) card.hiddenClaudeWindows = [.weekly] let filtered = try render(card.frame(width: 240), maximumHeight: 190) - XCTAssertLessThan(filtered.size.height, all.size.height - 100) + XCTAssertLessThan(filtered.size.height, all.size.height - 50) } func testZeroAndFullRingsHaveDistinctRenderedBalances() throws { @@ -98,6 +99,77 @@ final class QuotaPanelRenderingTests: XCTestCase { XCTAssertGreaterThan(bluePixelCount(full), bluePixelCount(empty) + 100) } + func testAdaptiveRingCardsRenderEveryWindowCountWithinThePanelHeight() throws { + let originalLanguage = LocalizationManager.shared.language + defer { LocalizationManager.shared.language = originalLanguage } + let width = Theme.Layout.ringPanelWidth - Theme.Layout.panelPadding * 2 + for language in AppLanguage.allCases { + LocalizationManager.shared.language = language + for count in 1...3 { + let claude = ProviderCard( + provider: .claude, state: state(count: count), panelStyle: .rings, showProviderTitle: true, + showHourlyPace: true) + let bitmap = try render(claude.frame(width: width), maximumHeight: Theme.Layout.maximumPanelHeight) + XCTAssertEqual(bitmap.size.width, width, accuracy: 1) + } + for count in 1...2 { + let codex = ProviderCard( + provider: .codex, state: codexState(count: count), panelStyle: .rings, showProviderTitle: true) + let bitmap = try render(codex.frame(width: width), maximumHeight: Theme.Layout.maximumPanelHeight) + XCTAssertEqual(bitmap.size.width, width, accuracy: 1) + } + } + } + + func testThreeWindowIndividualCardFallsBackToRowsAndStaysOnOneColumn() throws { + let cardWidth = Theme.Layout.ringPanelWidth - Theme.Layout.panelPadding * 2 + let available = cardWidth - Theme.Layout.cardPadding * 2 + XCTAssertEqual(QuotaRingLayout.choose(availableWidth: available, windows: 3), .rows) + XCTAssertEqual(QuotaRingLayout.choose(availableWidth: available, windows: 2), .grid(columns: 2)) + let card = ProviderCard( + provider: .claude, state: state(count: 3), panelStyle: .rings, showProviderTitle: true) + let rows = try render(card.frame(width: cardWidth), maximumHeight: Theme.Layout.maximumPanelHeight) + let grid = try render( + card.frame(width: Theme.Layout.quotaRingCellWidth * 3 + Theme.Layout.cardPadding * 2), + maximumHeight: Theme.Layout.maximumPanelHeight) + XCTAssertGreaterThan(rows.size.height, grid.size.height) + } + + func testUnifiedRingCardsShareOneHeight() throws { + let available = Theme.Layout.ringUnifiedWidth - Theme.Layout.panelPadding * 2 - Theme.Layout.quotaRingSpacing + let balanced = Theme.Layout.quotaRingCellWidth * 4 + Theme.Layout.cardPadding * 4 + let matrix: [(Int, Int, CGFloat, CGFloat)] = [ + (1, 3, Theme.Layout.minimumRingCardWidth, available - Theme.Layout.minimumRingCardWidth), + (2, 2, balanced / 2, balanced / 2), + ] + for (codexWindows, claudeWindows, codexWidth, claudeWidth) in matrix { + let codex = ProviderCard( + provider: .codex, state: codexState(count: codexWindows), panelStyle: .rings, + showProviderTitle: true, stretchesHeight: true) + let claude = ProviderCard( + provider: .claude, state: state(count: claudeWindows), panelStyle: .rings, + showProviderTitle: true, stretchesHeight: true) + let row = HStack(alignment: .top, spacing: Theme.Layout.quotaRingSpacing) { + codex.frame(width: codexWidth) + claude.frame(width: claudeWidth) + } + .fixedSize(horizontal: false, vertical: true) + .environment(\.colorScheme, .light) + .background(Color.white) + let bitmap = try render(row, maximumHeight: Theme.Layout.maximumPanelHeight) + let tall = try render(claude.frame(width: claudeWidth), maximumHeight: Theme.Layout.maximumPanelHeight) + XCTAssertEqual(bitmap.size.height, max(bitmap.size.height, tall.size.height), accuracy: 1) + let scale = CGFloat(bitmap.pixelsWide) / bitmap.size.width + let bottom = bitmap.pixelsHigh - Int(4 * scale) + let card = try XCTUnwrap( + bitmap.colorAt(x: Int(codexWidth / 2 * scale), y: bottom)?.usingColorSpace(.deviceRGB)) + let gap = try XCTUnwrap( + bitmap.colorAt(x: Int((codexWidth + Theme.Layout.quotaRingSpacing / 2) * scale), y: bottom)? + .usingColorSpace(.deviceRGB)) + XCTAssertLessThan(card.redComponent, gap.redComponent - 0.005, "\(codexWindows) vs \(claudeWindows)") + } + } + private func bluePixelCount(_ bitmap: NSBitmapImageRep) -> Int { var count = 0 for y in 0.. ProviderViewState { + let windows = [ + QuotaWindow( + id: "codex.weekly", usedPercentage: 41, resetsAt: Date().addingTimeInterval(172800), + durationMinutes: 10080, displayName: nil), + QuotaWindow( + id: "base_model_inference.weekly", usedPercentage: 12, + resetsAt: Date().addingTimeInterval(172800), durationMinutes: 10080, displayName: "gpt-reserve"), + ] + let snapshot = ProviderUsageSnapshot( + provider: .codex, windows: Array(windows.prefix(count)), dailyUsage: [], summary: nil, + availableResetCredits: nil, creditBalance: nil, capturedAt: Date().addingTimeInterval(-600)) + return ProviderViewState(snapshot: snapshot, status: status, isRefreshing: false) + } + private func render(_ content: some View, maximumHeight: CGFloat) throws -> NSBitmapImageRep { let view = NSHostingView(rootView: content.environment(\.quotaAnimationsEnabled, false)) let size = view.fittingSize diff --git a/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift b/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift new file mode 100644 index 0000000..61c9bd6 --- /dev/null +++ b/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift @@ -0,0 +1,59 @@ +import CoreGraphics +import XCTest + +@testable import TokenGaugeApp + +final class QuotaRingLayoutTests: XCTestCase { + private let cell = Theme.Layout.quotaRingCellWidth + + func testOneWindowAlwaysChoosesTheSingleRing() { + for width: CGFloat in [0, 90, 146, 170, 310, 560] { + XCTAssertEqual(QuotaRingLayout.choose(availableWidth: width, windows: 1), .single, "width \(width)") + } + } + + func testGridIsChosenOnlyWhenEveryCellReachesTheMinimumCellWidth() { + for windows in 2...5 { + let exact = cell * CGFloat(windows) + XCTAssertEqual( + QuotaRingLayout.choose(availableWidth: exact, windows: windows), .grid(columns: windows), + "windows \(windows)") + XCTAssertEqual( + QuotaRingLayout.choose(availableWidth: exact + 40, windows: windows), .grid(columns: windows), + "windows \(windows)") + XCTAssertEqual( + QuotaRingLayout.choose(availableWidth: exact - 1, windows: windows), .rows, "windows \(windows)") + XCTAssertEqual(QuotaRingLayout.choose(availableWidth: 0, windows: windows), .rows, "windows \(windows)") + } + } + + func testPanelWidthsMapToTheExpectedModes() { + let individual = + Theme.Layout.ringPanelWidth - Theme.Layout.panelPadding * 2 - Theme.Layout.cardPadding * 2 + let unified = Theme.Layout.ringUnifiedWidth - Theme.Layout.panelPadding * 2 - Theme.Layout.quotaRingSpacing + let narrowCard = Theme.Layout.minimumRingCardWidth - Theme.Layout.cardPadding * 2 + let wideCard = unified - Theme.Layout.minimumRingCardWidth - Theme.Layout.cardPadding * 2 + let halfCard = unified / 2 - Theme.Layout.cardPadding * 2 + let matrix: [(CGFloat, Int, QuotaRingLayout.Mode)] = [ + (individual, 1, .single), + (individual, 2, .grid(columns: 2)), + (individual, 3, .rows), + (narrowCard, 1, .single), + (narrowCard, 2, .rows), + (halfCard, 2, .grid(columns: 2)), + (wideCard, 3, .rows), + (wideCard, 2, .grid(columns: 2)), + ] + for (width, windows, mode) in matrix { + XCTAssertEqual( + QuotaRingLayout.choose(availableWidth: width, windows: windows), mode, "\(width) / \(windows)") + } + } + + func testColumnsNeverExceedTheWindowCountAndStayAtLeastOne() { + XCTAssertEqual(QuotaRingLayout.columns(availableWidth: 600, windows: 2), 2) + XCTAssertEqual(QuotaRingLayout.columns(availableWidth: cell * 3, windows: 3), 3) + XCTAssertEqual(QuotaRingLayout.columns(availableWidth: cell * 2, windows: 3), 2) + XCTAssertEqual(QuotaRingLayout.columns(availableWidth: 0, windows: 3), 1) + } +} From 6ae96cd75cb7dda83264e32a6ad90099b3bad882 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:44:12 -0500 Subject: [PATCH 04/21] refactor(history): split UsageHistoryStore, prepare schema once per path and open reads read-only --- Sources/TokenGaugeCore/SQLiteConnection.swift | 172 +++++ .../UsageHistoryStore+Effort.swift | 48 ++ .../UsageHistoryStore+Pace.swift | 109 +++ .../UsageHistoryStore+Quota.swift | 137 ++++ .../UsageHistoryStore+Schema.swift | 115 +++ .../UsageHistoryStore+Tokens.swift | 97 +++ .../TokenGaugeCore/UsageHistoryStore.swift | 687 ++---------------- .../UsageHistoryStoreTests.swift | 31 + 8 files changed, 786 insertions(+), 610 deletions(-) create mode 100644 Sources/TokenGaugeCore/SQLiteConnection.swift create mode 100644 Sources/TokenGaugeCore/UsageHistoryStore+Effort.swift create mode 100644 Sources/TokenGaugeCore/UsageHistoryStore+Pace.swift create mode 100644 Sources/TokenGaugeCore/UsageHistoryStore+Quota.swift create mode 100644 Sources/TokenGaugeCore/UsageHistoryStore+Schema.swift create mode 100644 Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift diff --git a/Sources/TokenGaugeCore/SQLiteConnection.swift b/Sources/TokenGaugeCore/SQLiteConnection.swift new file mode 100644 index 0000000..e91e459 --- /dev/null +++ b/Sources/TokenGaugeCore/SQLiteConnection.swift @@ -0,0 +1,172 @@ +import Darwin +import Foundation +import SQLite3 + +struct SQLiteStatement { + let handle: OpaquePointer + + private static var transientDestructor: sqlite3_destructor_type { + unsafeBitCast(Int(-1), to: sqlite3_destructor_type.self) + } + + func bind(_ index: Int32, _ value: String?) { + guard let value else { + sqlite3_bind_null(handle, index) + return + } + sqlite3_bind_text(handle, index, value, -1, Self.transientDestructor) + } + + func bind(_ index: Int32, _ value: Int64?) { + guard let value else { + sqlite3_bind_null(handle, index) + return + } + sqlite3_bind_int64(handle, index, value) + } + + func bind(_ index: Int32, _ value: Double) { + sqlite3_bind_double(handle, index, value) + } + + func bind(_ index: Int32, _ value: Bool) { + sqlite3_bind_int(handle, index, value ? 1 : 0) + } + + func bind(_ index: Int32, _ value: Date?) { + guard let value else { + sqlite3_bind_null(handle, index) + return + } + sqlite3_bind_double(handle, index, value.timeIntervalSince1970) + } + + func text(_ index: Int32) -> String { + optionalText(index) ?? "" + } + + func optionalText(_ index: Int32) -> String? { + guard let raw = sqlite3_column_text(handle, index) else { return nil } + return String(cString: raw) + } + + func int(_ index: Int32) -> Int { + Int(sqlite3_column_int64(handle, index)) + } + + func optionalInt(_ index: Int32) -> Int? { + guard sqlite3_column_type(handle, index) != SQLITE_NULL else { return nil } + return Int(sqlite3_column_int64(handle, index)) + } + + func double(_ index: Int32) -> Double { + sqlite3_column_double(handle, index) + } + + func flag(_ index: Int32) -> Bool { + sqlite3_column_int(handle, index) == 1 + } + + func date(_ index: Int32) -> Date? { + guard sqlite3_column_type(handle, index) != SQLITE_NULL else { return nil } + return Date(timeIntervalSince1970: sqlite3_column_double(handle, index)) + } + + func instant(_ index: Int32) -> Date { + Date(timeIntervalSince1970: sqlite3_column_double(handle, index)) + } +} + +final class SQLiteConnection { + private let handle: OpaquePointer + + private init(handle: OpaquePointer) { + self.handle = handle + } + + var isReadOnly: Bool { + sqlite3_db_readonly(handle, "main") == 1 + } + + static func open(_ url: URL, readOnly: Bool) throws -> SQLiteConnection { + if !readOnly { + try FileManager.default.createDirectory( + at: url.deletingLastPathComponent(), + withIntermediateDirectories: true, + attributes: [.posixPermissions: 0o700] + ) + } + var handle: OpaquePointer? + let flags = + readOnly + ? SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX + : SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX + guard sqlite3_open_v2(url.path, &handle, flags, nil) == SQLITE_OK, let handle else { + let message = handle.map { String(cString: sqlite3_errmsg($0)) } ?? url.path + if let handle { sqlite3_close(handle) } + throw UsageHistoryError.openFailed(message) + } + sqlite3_busy_timeout(handle, 3_000) + if !readOnly { chmod(url.path, S_IRUSR | S_IWUSR) } + return SQLiteConnection(handle: handle) + } + + func close() { + sqlite3_close(handle) + } + + func exec(_ sql: String) throws { + var error: UnsafeMutablePointer? + guard sqlite3_exec(handle, sql, nil, nil, &error) == SQLITE_OK else { + let message = error.map { String(cString: $0) } ?? sql + sqlite3_free(error) + throw UsageHistoryError.statementFailed(message) + } + } + + func transaction(_ body: () throws -> T) throws -> T { + try exec("BEGIN IMMEDIATE;") + do { + let result = try body() + try exec("COMMIT;") + return result + } catch { + try? exec("ROLLBACK;") + throw error + } + } + + func run(_ sql: String, bindings: (SQLiteStatement) -> Void) throws { + let statement = try prepare(sql) + defer { sqlite3_finalize(statement.handle) } + bindings(statement) + guard sqlite3_step(statement.handle) == SQLITE_DONE else { + throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) + } + } + + func query( + _ sql: String, + bindings: (SQLiteStatement) -> Void, + each: (SQLiteStatement) -> Void + ) throws { + let statement = try prepare(sql) + defer { sqlite3_finalize(statement.handle) } + bindings(statement) + while true { + switch sqlite3_step(statement.handle) { + case SQLITE_ROW: each(statement) + case SQLITE_DONE: return + default: throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) + } + } + } + + private func prepare(_ sql: String) throws -> SQLiteStatement { + var statement: OpaquePointer? + guard sqlite3_prepare_v2(handle, sql, -1, &statement, nil) == SQLITE_OK, let statement else { + throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) + } + return SQLiteStatement(handle: statement) + } +} diff --git a/Sources/TokenGaugeCore/UsageHistoryStore+Effort.swift b/Sources/TokenGaugeCore/UsageHistoryStore+Effort.swift new file mode 100644 index 0000000..92d347a --- /dev/null +++ b/Sources/TokenGaugeCore/UsageHistoryStore+Effort.swift @@ -0,0 +1,48 @@ +import Foundation + +extension UsageHistoryStore { + static func readEffortRows( + _ connection: SQLiteConnection, since day: String?, through lastDay: String? + ) throws -> [HistoryEffortRow] { + let sql = """ + SELECT day, provider, model, effort, SUM(tokens) FROM effort_events + WHERE day >= ?1 AND day <= ?2 + GROUP BY day, provider, model, effort ORDER BY day, provider, model, effort; + """ + var rows: [HistoryEffortRow] = [] + try connection.query(sql) { statement in + statement.bind(1, day ?? "0000-01-01") + statement.bind(2, lastDay ?? "9999-12-31") + } each: { statement in + guard let provider = UsageProvider(rawValue: statement.text(1)) else { return } + rows.append( + HistoryEffortRow( + day: statement.text(0), provider: provider, model: statement.text(2), effort: statement.text(3), + tokens: statement.int(4))) + } + return rows + } + + static func writeEffort(_ connection: SQLiteConnection, record: EffortUsageRecord) throws { + let sql = """ + INSERT INTO effort_events (id, provider, occurred_at, day, model, effort, tokens) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7) + ON CONFLICT(id) DO UPDATE SET + day = CASE WHEN excluded.occurred_at < effort_events.occurred_at THEN excluded.day ELSE effort_events.day END, + occurred_at = MIN(effort_events.occurred_at, excluded.occurred_at), + model = CASE WHEN effort_events.model = 'unknown' THEN excluded.model ELSE effort_events.model END, + effort = CASE WHEN effort_events.effort = 'unknown' THEN excluded.effort ELSE effort_events.effort END, + tokens = MAX(effort_events.tokens, excluded.tokens) + WHERE effort_events.provider = excluded.provider; + """ + try connection.run(sql) { statement in + statement.bind(1, record.id.lowercased()) + statement.bind(2, record.provider.rawValue) + statement.bind(3, record.recordedAt.timeIntervalSince1970) + statement.bind(4, record.day) + statement.bind(5, record.model) + statement.bind(6, record.effort) + statement.bind(7, Int64(record.tokens)) + } + } +} diff --git a/Sources/TokenGaugeCore/UsageHistoryStore+Pace.swift b/Sources/TokenGaugeCore/UsageHistoryStore+Pace.swift new file mode 100644 index 0000000..144be57 --- /dev/null +++ b/Sources/TokenGaugeCore/UsageHistoryStore+Pace.swift @@ -0,0 +1,109 @@ +import Foundation + +extension UsageHistoryStore { + static func readPaceRows( + _ connection: SQLiteConnection, provider: UsageProvider?, windowID: String?, since: Date?, until: Date?, + accountFingerprint: String? + ) throws -> [HistoryPaceRow] { + try readPaces( + connection, + suffix: """ + WHERE sampled_at >= ?1 AND sampled_at <= ?2 + AND (?3 IS NULL OR provider = ?3) AND (?4 IS NULL OR window_id = ?4) + AND account_fingerprint IS ?5 + ORDER BY sampled_at, provider, window_id + """ + ) { statement in + statement.bind(1, since?.timeIntervalSince1970 ?? -Double.greatestFiniteMagnitude) + statement.bind(2, until?.timeIntervalSince1970 ?? Double.greatestFiniteMagnitude) + statement.bind(3, provider?.rawValue) + statement.bind(4, windowID) + statement.bind(5, accountFingerprint) + } + } + + static func readRecentPaces( + _ connection: SQLiteConnection, key: HistoryPaceKey, activeOnly: Bool, limit: Int, before: Date?, + accountFingerprint: String? = nil + ) throws -> [HistoryPaceRow] { + let active = activeOnly ? "AND is_active = 1" : "" + return try readPaces( + connection, + suffix: """ + WHERE provider = ?1 AND window_id = ?2 AND sampled_at < ?3 \(active) + AND account_fingerprint IS ?5 + ORDER BY sampled_at DESC LIMIT ?4 + """ + ) { statement in + statement.bind(1, key.provider.rawValue) + statement.bind(2, key.windowID) + statement.bind(3, before?.timeIntervalSince1970 ?? Double.greatestFiniteMagnitude) + statement.bind(4, Int64(limit)) + statement.bind(5, accountFingerprint) + } + } + + private static func readPaces( + _ connection: SQLiteConnection, suffix: String, bindings: (SQLiteStatement) -> Void + ) throws -> [HistoryPaceRow] { + var rows: [HistoryPaceRow] = [] + try connection.query( + """ + SELECT provider, window_id, sampled_at, display_name, points_per_hour, observed_minutes, + resets_at, last_used_percentage, is_active FROM pace_samples + \(suffix); + """, bindings: bindings + ) { statement in + guard let provider = UsageProvider(rawValue: statement.text(0)) else { return } + rows.append( + HistoryPaceRow( + key: HistoryPaceKey(provider: provider, windowID: statement.text(1)), + displayName: statement.optionalText(3), + pace: QuotaPace( + pointsPerHour: statement.double(4), + observedMinutes: statement.double(5), + sampledAt: statement.instant(2), + resetsAt: statement.date(6), lastUsedPercentage: statement.double(7)), + isActive: statement.flag(8))) + } + return rows + } + + static func archivePace( + _ connection: SQLiteConnection, snapshot: ProviderUsageSnapshot, window: QuotaWindow, + previous: HistoryQuotaRow?, rows: [HistoryQuotaRow], now: Date, accountFingerprint: String? + ) throws { + guard window.durationMinutes == 10_080 else { return } + guard let pace = HistoryAnalytics.pace(rows: rows, provider: snapshot.provider, windowID: window.id, now: now) + else { return } + let key = HistoryPaceKey(provider: snapshot.provider, windowID: window.id) + let increased = + previous.map { + $0.isVerified && $0.durationMinutes == window.durationMinutes + && HistoryAnalytics.sameReset($0.resetsAt, window.resetsAt) + && window.usedPercentage > $0.usedPercentage + } ?? false + let activeHistory = try readRecentPaces( + connection, key: key, activeOnly: true, limit: 1, before: nil, accountFingerprint: accountFingerprint) + let seed = pace.pointsPerHour > 0 && activeHistory.isEmpty + try connection.run( + """ + INSERT OR IGNORE INTO pace_samples + (provider, window_id, sampled_at, display_name, points_per_hour, observed_minutes, + resets_at, last_used_percentage, is_active, account_fingerprint) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10); + """ + ) { statement in + statement.bind(1, snapshot.provider.rawValue) + statement.bind(2, window.id) + statement.bind(3, pace.sampledAt.timeIntervalSince1970) + statement.bind(4, window.displayName) + statement.bind(5, pace.pointsPerHour) + statement.bind(6, pace.observedMinutes) + statement.bind(7, pace.resetsAt) + statement.bind(8, window.usedPercentage) + statement.bind(9, increased || seed) + statement.bind(10, accountFingerprint) + } + } +} diff --git a/Sources/TokenGaugeCore/UsageHistoryStore+Quota.swift b/Sources/TokenGaugeCore/UsageHistoryStore+Quota.swift new file mode 100644 index 0000000..74e42b8 --- /dev/null +++ b/Sources/TokenGaugeCore/UsageHistoryStore+Quota.swift @@ -0,0 +1,137 @@ +import Foundation + +extension UsageHistoryStore { + static func readQuotaRows( + _ connection: SQLiteConnection, provider: UsageProvider? = nil, since: Date? = nil, until: Date? = nil + ) throws -> [HistoryQuotaRow] { + let sql = """ + SELECT COALESCE(observed_at, sampled_at), provider, window_id, display_name, used_percentage, resets_at, + duration_minutes, verified, continuity_started_at, continuity_reset_at, account_fingerprint + FROM quota_samples + WHERE sampled_at >= ?2 AND sampled_at <= ?3 AND (?1 IS NULL OR provider = ?1) + AND COALESCE(observed_at, sampled_at) >= ?4 AND COALESCE(observed_at, sampled_at) <= ?5 + ORDER BY sampled_at, provider, window_id; + """ + var rows: [HistoryQuotaRow] = [] + try connection.query(sql) { statement in + statement.bind(1, provider?.rawValue) + statement.bind(2, since.map { bucket($0) } ?? Int64.min) + statement.bind(3, until.map { bucket($0) } ?? Int64.max) + statement.bind(4, since?.timeIntervalSince1970 ?? -Double.greatestFiniteMagnitude) + statement.bind(5, until?.timeIntervalSince1970 ?? Double.greatestFiniteMagnitude) + } each: { statement in + guard let provider = UsageProvider(rawValue: statement.text(1)) else { return } + rows.append( + HistoryQuotaRow( + sampledAt: statement.instant(0), + provider: provider, + windowID: statement.text(2), + displayName: statement.optionalText(3), + usedPercentage: statement.double(4), + resetsAt: statement.date(5), + durationMinutes: statement.optionalInt(6), + isVerified: statement.flag(7), + continuityStartedAt: statement.date(8), continuityResetAt: statement.date(9), + accountFingerprint: statement.optionalText(10) + ) + ) + } + return rows + } + + static func writeQuota( + _ connection: SQLiteConnection, snapshot: ProviderUsageSnapshot, accountFingerprint: String? + ) throws { + guard let capturedAt = snapshot.capturedAt else { return } + let sampledAt = bucket(capturedAt) + let sql = """ + INSERT INTO quota_samples + (provider, window_id, sampled_at, display_name, duration_minutes, used_percentage, resets_at, verified, observed_at, continuity_started_at, continuity_reset_at, account_fingerprint) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?10, ?8, ?9, ?11, ?12) + ON CONFLICT(provider, window_id, sampled_at) DO UPDATE SET + display_name = excluded.display_name, + duration_minutes = excluded.duration_minutes, + used_percentage = excluded.used_percentage, + resets_at = excluded.resets_at, + verified = excluded.verified, + observed_at = excluded.observed_at, + continuity_started_at = excluded.continuity_started_at, + continuity_reset_at = excluded.continuity_reset_at, + account_fingerprint = excluded.account_fingerprint + WHERE excluded.observed_at >= COALESCE(quota_samples.observed_at, quota_samples.sampled_at); + """ + var archived: [(window: QuotaWindow, previous: HistoryQuotaRow?)] = [] + for window in snapshot.windows { + let previous = try latestQuota(connection, provider: snapshot.provider, windowID: window.id) + guard previous.map({ capturedAt > $0.sampledAt }) ?? true else { continue } + let valid = window.usedPercentage.isFinite && (0...100).contains(window.usedPercentage) + var continuityStartedAt = capturedAt + var continuityResetAt = window.resetsAt + if let previous, previous.isVerified, valid, + previous.usedPercentage <= window.usedPercentage, + previous.accountFingerprint == accountFingerprint, + HistoryAnalytics.sameReset(previous.continuityResetAt ?? previous.resetsAt, window.resetsAt), + previous.durationMinutes == window.durationMinutes, + capturedAt.timeIntervalSince(previous.sampledAt) <= 1800, + let boundary = previous.continuityStartedAt + { + continuityStartedAt = boundary + continuityResetAt = previous.continuityResetAt ?? previous.resetsAt + } + try connection.run(sql) { statement in + statement.bind(1, snapshot.provider.rawValue) + statement.bind(2, window.id) + statement.bind(3, sampledAt) + statement.bind(4, window.displayName) + statement.bind(5, window.durationMinutes.map(Int64.init)) + statement.bind(6, window.usedPercentage.isFinite ? window.usedPercentage : 0) + statement.bind(7, window.resetsAt) + statement.bind(8, capturedAt) + statement.bind(9, continuityStartedAt) + statement.bind(10, valid) + statement.bind(11, continuityResetAt) + statement.bind(12, accountFingerprint) + } + archived.append((window, previous)) + } + guard archived.contains(where: { $0.window.durationMinutes == 10_080 }) else { return } + let recent = try readQuotaRows( + connection, provider: snapshot.provider, since: capturedAt.addingTimeInterval(-3600), until: capturedAt) + for entry in archived { + try archivePace( + connection, snapshot: snapshot, window: entry.window, previous: entry.previous, rows: recent, + now: capturedAt, accountFingerprint: accountFingerprint) + } + } + + static func latestQuota( + _ connection: SQLiteConnection, provider: UsageProvider, windowID: String + ) throws -> HistoryQuotaRow? { + let sql = """ + SELECT COALESCE(observed_at, sampled_at), used_percentage, resets_at, duration_minutes, + verified, continuity_started_at, continuity_reset_at, account_fingerprint + FROM quota_samples WHERE provider = ?1 AND window_id = ?2 ORDER BY sampled_at DESC LIMIT 1; + """ + var row: HistoryQuotaRow? + try connection.query(sql) { statement in + statement.bind(1, provider.rawValue) + statement.bind(2, windowID) + } each: { statement in + row = HistoryQuotaRow( + sampledAt: statement.instant(0), provider: provider, + windowID: windowID, displayName: nil, usedPercentage: statement.double(1), + resetsAt: statement.date(2), + durationMinutes: statement.optionalInt(3), + isVerified: statement.flag(4), continuityStartedAt: statement.date(5), + continuityResetAt: statement.date(6), accountFingerprint: statement.optionalText(7)) + } + return row + } + + static func prune(_ connection: SQLiteConnection, now: Date) throws { + let cutoff = Int64(now.addingTimeInterval(-Double(quotaRetentionDays) * 86_400).timeIntervalSince1970) + try connection.run("DELETE FROM quota_samples WHERE sampled_at < ?1;") { statement in + statement.bind(1, cutoff) + } + } +} diff --git a/Sources/TokenGaugeCore/UsageHistoryStore+Schema.swift b/Sources/TokenGaugeCore/UsageHistoryStore+Schema.swift new file mode 100644 index 0000000..167b6f8 --- /dev/null +++ b/Sources/TokenGaugeCore/UsageHistoryStore+Schema.swift @@ -0,0 +1,115 @@ +import Foundation +import SQLite3 + +extension UsageHistoryStore { + enum Schema { + static let version: Int32 = 1 + + static let statements = """ + CREATE TABLE IF NOT EXISTS quota_samples ( + provider TEXT NOT NULL, + window_id TEXT NOT NULL, + sampled_at INTEGER NOT NULL, + display_name TEXT, + duration_minutes INTEGER, + used_percentage REAL NOT NULL, + resets_at INTEGER, + PRIMARY KEY (provider, window_id, sampled_at) + ) WITHOUT ROWID; + CREATE INDEX IF NOT EXISTS quota_samples_sampled_at ON quota_samples(sampled_at); + CREATE TABLE IF NOT EXISTS daily_tokens ( + day TEXT NOT NULL, + provider TEXT NOT NULL, + model TEXT NOT NULL, + tokens INTEGER NOT NULL, + updated_at INTEGER NOT NULL, + PRIMARY KEY (day, provider, model) + ) WITHOUT ROWID; + CREATE TABLE IF NOT EXISTS pace_samples ( + provider TEXT NOT NULL, window_id TEXT NOT NULL, sampled_at REAL NOT NULL, + display_name TEXT, points_per_hour REAL NOT NULL, observed_minutes REAL NOT NULL, + resets_at REAL, last_used_percentage REAL, is_active INTEGER NOT NULL, + PRIMARY KEY(provider, window_id, sampled_at) + ) WITHOUT ROWID; + CREATE INDEX IF NOT EXISTS pace_samples_sampled_at ON pace_samples(sampled_at); + CREATE INDEX IF NOT EXISTS pace_samples_active ON pace_samples(provider, window_id, is_active, sampled_at); + CREATE TABLE IF NOT EXISTS effort_events ( + id TEXT NOT NULL PRIMARY KEY, + provider TEXT NOT NULL, + occurred_at REAL NOT NULL, + day TEXT NOT NULL, + model TEXT NOT NULL, + effort TEXT NOT NULL, + tokens INTEGER NOT NULL + ) WITHOUT ROWID; + CREATE INDEX IF NOT EXISTS effort_events_day_provider ON effort_events(day, provider); + """ + + static let observedTotalsViews = """ + DROP VIEW IF EXISTS monthly_totals; + DROP VIEW IF EXISTS weekly_totals; + DROP VIEW IF EXISTS daily_totals; + CREATE VIEW daily_totals AS + SELECT day, provider, MAX(tokens) AS tokens FROM ( + SELECT day, provider, + MAX(COALESCE(MAX(CASE WHEN model = 'all' THEN tokens END), 0), + COALESCE(SUM(CASE WHEN model != 'all' THEN tokens END), 0)) AS tokens + FROM daily_tokens GROUP BY day, provider + UNION ALL + SELECT day, provider, SUM(tokens) AS tokens + FROM effort_events GROUP BY day, provider + ) GROUP BY day, provider; + CREATE VIEW weekly_totals AS + SELECT date(day, 'weekday 0', '-6 days') AS week_start, provider, SUM(tokens) AS tokens + FROM daily_totals GROUP BY week_start, provider; + CREATE VIEW monthly_totals AS + SELECT substr(day, 1, 7) AS month, provider, SUM(tokens) AS tokens + FROM daily_totals GROUP BY month, provider; + """ + + } + + static func schemaVersion(_ connection: SQLiteConnection) throws -> Int32 { + var version: Int32 = 0 + try connection.query("PRAGMA user_version;", bindings: { _ in }) { statement in + version = sqlite3_column_int(statement.handle, 0) + } + return version + } + + static func prepareSchema(_ connection: SQLiteConnection) throws { + try connection.transaction { + try connection.exec(Schema.statements) + var columns = Set() + try connection.query("PRAGMA table_info(quota_samples);", bindings: { _ in }) { statement in + columns.insert(statement.text(1)) + } + if !columns.contains("verified") { + try connection.exec("ALTER TABLE quota_samples ADD COLUMN verified INTEGER NOT NULL DEFAULT 0;") + } + if !columns.contains("observed_at") { + try connection.exec("ALTER TABLE quota_samples ADD COLUMN observed_at REAL;") + } + if !columns.contains("continuity_started_at") { + try connection.exec("ALTER TABLE quota_samples ADD COLUMN continuity_started_at REAL;") + } + if !columns.contains("continuity_reset_at") { + try connection.exec("ALTER TABLE quota_samples ADD COLUMN continuity_reset_at REAL;") + } + if !columns.contains("account_fingerprint") { + try connection.exec("ALTER TABLE quota_samples ADD COLUMN account_fingerprint TEXT;") + } + var paceColumns = Set() + try connection.query("PRAGMA table_info(pace_samples);", bindings: { _ in }) { statement in + paceColumns.insert(statement.text(1)) + } + if !paceColumns.contains("account_fingerprint") { + try connection.exec("ALTER TABLE pace_samples ADD COLUMN account_fingerprint TEXT;") + } + if try schemaVersion(connection) < Schema.version { + try connection.exec(Schema.observedTotalsViews) + try connection.exec("PRAGMA user_version = \(Schema.version);") + } + } + } +} diff --git a/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift b/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift new file mode 100644 index 0000000..f5e8344 --- /dev/null +++ b/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift @@ -0,0 +1,97 @@ +import Foundation + +extension UsageHistoryStore { + static func readTokenRows( + _ connection: SQLiteConnection, since day: String?, through lastDay: String? + ) throws -> [HistoryTokenRow] { + let sql = """ + SELECT day, provider, model, tokens FROM daily_tokens + WHERE day >= ?1 AND day <= ?2 + ORDER BY day, provider, model; + """ + var rows: [HistoryTokenRow] = [] + try connection.query(sql) { statement in + statement.bind(1, day ?? "0000-01-01") + statement.bind(2, lastDay ?? "9999-12-31") + } each: { statement in + guard let provider = UsageProvider(rawValue: statement.text(1)) else { return } + rows.append( + HistoryTokenRow( + day: statement.text(0), + provider: provider, + model: statement.text(2), + tokens: statement.int(3) + ) + ) + } + return rows + } + + static func readUsageDays(_ connection: SQLiteConnection, provider: UsageProvider?) throws -> Set { + let sql = """ + SELECT day FROM daily_totals + WHERE tokens > 0 AND (?1 IS NULL OR provider = ?1); + """ + var days: Set = [] + try connection.query(sql) { statement in + statement.bind(1, provider?.rawValue) + } each: { statement in + days.insert(statement.text(0)) + } + return days + } + + static func readBounds(_ connection: SQLiteConnection) throws -> HistoryBounds { + var result = HistoryBounds(firstDay: nil, lastDay: nil) + let sql = """ + SELECT (SELECT MIN(day) FROM daily_tokens), (SELECT MAX(day) FROM daily_tokens), + (SELECT MIN(day) FROM effort_events), (SELECT MAX(day) FROM effort_events); + """ + try connection.query(sql, bindings: { _ in }) { statement in + let firstDays = [statement.optionalText(0), statement.optionalText(2)].compactMap { $0 } + let lastDays = [statement.optionalText(1), statement.optionalText(3)].compactMap { $0 } + result = HistoryBounds(firstDay: firstDays.min(), lastDay: lastDays.max()) + } + return result + } + + static func writeTokens(_ connection: SQLiteConnection, snapshot: ProviderUsageSnapshot, now: Date) throws { + let sql = """ + INSERT INTO daily_tokens (day, provider, model, tokens, updated_at) + VALUES (?1, ?2, ?3, ?4, ?5) + ON CONFLICT(day, provider, model) DO UPDATE SET + tokens = MAX(daily_tokens.tokens, excluded.tokens), + updated_at = excluded.updated_at; + """ + for row in tokenRows(for: snapshot) { + try connection.run(sql) { statement in + statement.bind(1, row.day) + statement.bind(2, row.provider.rawValue) + statement.bind(3, row.model) + statement.bind(4, Int64(row.tokens)) + statement.bind(5, Int64(now.timeIntervalSince1970)) + } + } + } + + static func tokenRows(for snapshot: ProviderUsageSnapshot) -> [HistoryTokenRow] { + if snapshot.modelBuckets.isEmpty { + return snapshot.dailyUsage + .filter { $0.tokens >= 0 } + .map { HistoryTokenRow(day: $0.day, provider: snapshot.provider, model: "all", tokens: $0.tokens) } + } + var totals: [String: [String: Int]] = [:] + for item in snapshot.modelBuckets where item.tokens >= 0 { + totals[item.day, default: [:]][item.model, default: 0] += item.tokens + } + return + totals + .flatMap { day, models in + models.map { HistoryTokenRow(day: day, provider: snapshot.provider, model: $0.key, tokens: $0.value) } + } + .sorted { left, right in + if left.day != right.day { return left.day < right.day } + return left.model < right.model + } + } +} diff --git a/Sources/TokenGaugeCore/UsageHistoryStore.swift b/Sources/TokenGaugeCore/UsageHistoryStore.swift index 51f80ef..7448dea 100644 --- a/Sources/TokenGaugeCore/UsageHistoryStore.swift +++ b/Sources/TokenGaugeCore/UsageHistoryStore.swift @@ -1,6 +1,5 @@ -import Darwin import Foundation -import SQLite3 +import os public enum UsageHistoryError: Error, Equatable, Sendable { case openFailed(String) @@ -73,22 +72,16 @@ public enum UsageHistoryStore { recordTokens: Bool = true, accountFingerprint: String? = nil ) throws { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - try exec(handle, "BEGIN IMMEDIATE;") - do { - if recordQuota { - try writeQuota(handle, snapshot: snapshot, accountFingerprint: accountFingerprint) - } - if recordTokens && snapshot.activityReadSucceeded { - try writeTokens(handle, snapshot: snapshot, now: now) + try write(url) { connection in + try connection.transaction { + if recordQuota { + try writeQuota(connection, snapshot: snapshot, accountFingerprint: accountFingerprint) + } + if recordTokens && snapshot.activityReadSucceeded { + try writeTokens(connection, snapshot: snapshot, now: now) + } + try prune(connection, now: now) } - try prune(handle, now: now) - try exec(handle, "COMMIT;") - } catch { - try? exec(handle, "ROLLBACK;") - throw error } } @@ -97,42 +90,19 @@ public enum UsageHistoryStore { ) throws { let valid = records.filter(\.isValid) guard !valid.isEmpty else { return } - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - try exec(handle, "BEGIN IMMEDIATE;") - do { - for record in valid { try writeEffort(handle, record: record) } - try exec(handle, "COMMIT;") - } catch { - try? exec(handle, "ROLLBACK;") - throw error + try write(url) { connection in + try connection.transaction { + for record in valid { try writeEffort(connection, record: record) } + } } } public static func effortRows( since day: String? = nil, through lastDay: String? = nil, at url: URL = UsagePaths.history() ) throws -> [HistoryEffortRow] { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - let sql = """ - SELECT day, provider, model, effort, SUM(tokens) FROM effort_events - WHERE day >= ?1 AND day <= ?2 - GROUP BY day, provider, model, effort ORDER BY day, provider, model, effort; - """ - var rows: [HistoryEffortRow] = [] - try query(handle, sql) { statement in - bind(statement, 1, day ?? "0000-01-01") - bind(statement, 2, lastDay ?? "9999-12-31") - } each: { statement in - guard let provider = UsageProvider(rawValue: text(statement, 1)) else { return } - rows.append( - HistoryEffortRow( - day: text(statement, 0), provider: provider, model: text(statement, 2), effort: text(statement, 3), - tokens: Int(sqlite3_column_int64(statement, 4)))) + try read(url) { connection in + try readEffortRows(connection, since: day, through: lastDay) } - return rows } public static func tokenRows( @@ -140,50 +110,18 @@ public enum UsageHistoryStore { through lastDay: String? = nil, at url: URL = UsagePaths.history() ) throws -> [HistoryTokenRow] { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - let sql = """ - SELECT day, provider, model, tokens FROM daily_tokens - WHERE day >= ?1 AND day <= ?2 - ORDER BY day, provider, model; - """ - var rows: [HistoryTokenRow] = [] - try query(handle, sql) { statement in - bind(statement, 1, day ?? "0000-01-01") - bind(statement, 2, lastDay ?? "9999-12-31") - } each: { statement in - guard let provider = UsageProvider(rawValue: text(statement, 1)) else { return } - rows.append( - HistoryTokenRow( - day: text(statement, 0), - provider: provider, - model: text(statement, 2), - tokens: Int(sqlite3_column_int64(statement, 3)) - ) - ) + try read(url) { connection in + try readTokenRows(connection, since: day, through: lastDay) } - return rows } public static func usageDays( provider: UsageProvider? = nil, at url: URL = UsagePaths.history() ) throws -> Set { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - let sql = """ - SELECT day FROM daily_totals - WHERE tokens > 0 AND (?1 IS NULL OR provider = ?1); - """ - var days: Set = [] - try query(handle, sql) { statement in - bind(statement, 1, provider?.rawValue) - } each: { statement in - days.insert(text(statement, 0)) + try read(url) { connection in + try readUsageDays(connection, provider: provider) } - return days } public static func quotaRows( @@ -192,72 +130,19 @@ public enum UsageHistoryStore { until: Date? = nil, at url: URL = UsagePaths.history() ) throws -> [HistoryQuotaRow] { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - return try readQuotaRows(handle, provider: provider, since: since, until: until) - } - - private static func readQuotaRows( - _ handle: OpaquePointer, provider: UsageProvider? = nil, since: Date? = nil, until: Date? = nil - ) throws -> [HistoryQuotaRow] { - let sql = """ - SELECT COALESCE(observed_at, sampled_at), provider, window_id, display_name, used_percentage, resets_at, - duration_minutes, verified, continuity_started_at, continuity_reset_at, account_fingerprint - FROM quota_samples - WHERE sampled_at >= ?2 AND sampled_at <= ?3 AND (?1 IS NULL OR provider = ?1) - AND COALESCE(observed_at, sampled_at) >= ?4 AND COALESCE(observed_at, sampled_at) <= ?5 - ORDER BY sampled_at, provider, window_id; - """ - var rows: [HistoryQuotaRow] = [] - try query(handle, sql) { statement in - bind(statement, 1, provider?.rawValue) - sqlite3_bind_int64(statement, 2, since.map { bucket($0) } ?? Int64.min) - sqlite3_bind_int64(statement, 3, until.map { bucket($0) } ?? Int64.max) - sqlite3_bind_double(statement, 4, since?.timeIntervalSince1970 ?? -Double.greatestFiniteMagnitude) - sqlite3_bind_double(statement, 5, until?.timeIntervalSince1970 ?? Double.greatestFiniteMagnitude) - } each: { statement in - guard let provider = UsageProvider(rawValue: text(statement, 1)) else { return } - rows.append( - HistoryQuotaRow( - sampledAt: Date(timeIntervalSince1970: sqlite3_column_double(statement, 0)), - provider: provider, - windowID: text(statement, 2), - displayName: optionalText(statement, 3), - usedPercentage: sqlite3_column_double(statement, 4), - resetsAt: date(statement, 5), - durationMinutes: sqlite3_column_type(statement, 6) == SQLITE_NULL - ? nil : Int(sqlite3_column_int64(statement, 6)), - isVerified: sqlite3_column_int(statement, 7) == 1, - continuityStartedAt: date(statement, 8), continuityResetAt: date(statement, 9), - accountFingerprint: optionalText(statement, 10) - ) - ) + try read(url) { connection in + try readQuotaRows(connection, provider: provider, since: since, until: until) } - return rows } public static func paceRows( provider: UsageProvider? = nil, windowID: String? = nil, since: Date? = nil, until: Date? = nil, accountFingerprint: String? = nil, at url: URL = UsagePaths.history() ) throws -> [HistoryPaceRow] { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - return try readPaces( - handle, - suffix: """ - WHERE sampled_at >= ?1 AND sampled_at <= ?2 - AND (?3 IS NULL OR provider = ?3) AND (?4 IS NULL OR window_id = ?4) - AND account_fingerprint IS ?5 - ORDER BY sampled_at, provider, window_id - """ - ) { statement in - sqlite3_bind_double(statement, 1, since?.timeIntervalSince1970 ?? -Double.greatestFiniteMagnitude) - sqlite3_bind_double(statement, 2, until?.timeIntervalSince1970 ?? Double.greatestFiniteMagnitude) - bind(statement, 3, provider?.rawValue) - bind(statement, 4, windowID) - bind(statement, 5, accountFingerprint) + try read(url) { connection in + try readPaceRows( + connection, provider: provider, windowID: windowID, since: since, until: until, + accountFingerprint: accountFingerprint) } } @@ -267,132 +152,27 @@ public enum UsageHistoryStore { at url: URL = UsagePaths.history() ) throws -> [HistoryPaceRow] { guard !keys.isEmpty, limitPerWindow > 0 else { return [] } - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - var rows: [HistoryPaceRow] = [] - for key in Set(keys).sorted(by: { $0.id < $1.id }) { - let candidates = try readRecentPaces( - handle, key: key, activeOnly: activeOnly, limit: limitPerWindow, before: before, - accountFingerprint: accountFingerprint) - if matchingLatestQuota { - let quota = try latestQuota(handle, provider: key.provider, windowID: key.windowID) - rows += candidates.filter { quota?.isVerified == true && $0.pace.sampledAt == quota?.sampledAt } - } else { - rows += candidates - } - } - return rows - } - - private static func readRecentPaces( - _ handle: OpaquePointer, key: HistoryPaceKey, activeOnly: Bool, limit: Int, before: Date?, - accountFingerprint: String? = nil - ) throws -> [HistoryPaceRow] { - let active = activeOnly ? "AND is_active = 1" : "" - return try readPaces( - handle, - suffix: """ - WHERE provider = ?1 AND window_id = ?2 AND sampled_at < ?3 \(active) - AND account_fingerprint IS ?5 - ORDER BY sampled_at DESC LIMIT ?4 - """ - ) { statement in - bind(statement, 1, key.provider.rawValue) - bind(statement, 2, key.windowID) - sqlite3_bind_double(statement, 3, before?.timeIntervalSince1970 ?? Double.greatestFiniteMagnitude) - sqlite3_bind_int64(statement, 4, Int64(limit)) - bind(statement, 5, accountFingerprint) - } - } - - private static func readPaces( - _ handle: OpaquePointer, suffix: String, bindings: (OpaquePointer) -> Void - ) throws -> [HistoryPaceRow] { - var rows: [HistoryPaceRow] = [] - try query( - handle, - """ - SELECT provider, window_id, sampled_at, display_name, points_per_hour, observed_minutes, - resets_at, last_used_percentage, is_active FROM pace_samples - \(suffix); - """, bindings: bindings - ) { statement in - guard let provider = UsageProvider(rawValue: text(statement, 0)) else { return } - rows.append( - HistoryPaceRow( - key: HistoryPaceKey(provider: provider, windowID: text(statement, 1)), - displayName: optionalText(statement, 3), - pace: QuotaPace( - pointsPerHour: sqlite3_column_double(statement, 4), - observedMinutes: sqlite3_column_double(statement, 5), - sampledAt: Date(timeIntervalSince1970: sqlite3_column_double(statement, 2)), - resetsAt: date(statement, 6), lastUsedPercentage: sqlite3_column_double(statement, 7)), - isActive: sqlite3_column_int(statement, 8) == 1)) - } - return rows - } - - private static func archivePace( - _ handle: OpaquePointer, snapshot: ProviderUsageSnapshot, window: QuotaWindow, - previous: HistoryQuotaRow?, now: Date, accountFingerprint: String? - ) throws { - guard window.durationMinutes == 10_080 else { return } - let rows = try readQuotaRows( - handle, provider: snapshot.provider, since: now.addingTimeInterval(-3600), until: now) - guard let pace = HistoryAnalytics.pace(rows: rows, provider: snapshot.provider, windowID: window.id, now: now) - else { return } - let key = HistoryPaceKey(provider: snapshot.provider, windowID: window.id) - let increased = - previous.map { - $0.isVerified && $0.durationMinutes == window.durationMinutes - && HistoryAnalytics.sameReset($0.resetsAt, window.resetsAt) - && window.usedPercentage > $0.usedPercentage - } ?? false - let activeHistory = try readRecentPaces( - handle, key: key, activeOnly: true, limit: 1, before: nil, accountFingerprint: accountFingerprint) - let seed = pace.pointsPerHour > 0 && activeHistory.isEmpty - try run( - handle, - """ - INSERT OR IGNORE INTO pace_samples - (provider, window_id, sampled_at, display_name, points_per_hour, observed_minutes, - resets_at, last_used_percentage, is_active, account_fingerprint) - VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10); - """ - ) { statement in - bind(statement, 1, snapshot.provider.rawValue) - bind(statement, 2, window.id) - sqlite3_bind_double(statement, 3, pace.sampledAt.timeIntervalSince1970) - bind(statement, 4, window.displayName) - sqlite3_bind_double(statement, 5, pace.pointsPerHour) - sqlite3_bind_double(statement, 6, pace.observedMinutes) - if let reset = pace.resetsAt { - sqlite3_bind_double(statement, 7, reset.timeIntervalSince1970) - } else { - sqlite3_bind_null(statement, 7) + return try read(url) { connection in + var rows: [HistoryPaceRow] = [] + for key in Set(keys).sorted(by: { $0.id < $1.id }) { + let candidates = try readRecentPaces( + connection, key: key, activeOnly: activeOnly, limit: limitPerWindow, before: before, + accountFingerprint: accountFingerprint) + if matchingLatestQuota { + let quota = try latestQuota(connection, provider: key.provider, windowID: key.windowID) + rows += candidates.filter { quota?.isVerified == true && $0.pace.sampledAt == quota?.sampledAt } + } else { + rows += candidates + } } - sqlite3_bind_double(statement, 8, window.usedPercentage) - sqlite3_bind_int(statement, 9, increased || seed ? 1 : 0) - bind(statement, 10, accountFingerprint) + return rows } } public static func bounds(at url: URL = UsagePaths.history()) throws -> HistoryBounds { - let handle = try open(url) - defer { sqlite3_close(handle) } - try prepareSchema(handle) - var result = HistoryBounds(firstDay: nil, lastDay: nil) - let sql = """ - SELECT (SELECT MIN(day) FROM daily_tokens), (SELECT MAX(day) FROM daily_tokens), - (SELECT MIN(day) FROM effort_events), (SELECT MAX(day) FROM effort_events); - """ - try query(handle, sql, bindings: { _ in }) { statement in - let firstDays = [optionalText(statement, 0), optionalText(statement, 2)].compactMap { $0 } - let lastDays = [optionalText(statement, 1), optionalText(statement, 3)].compactMap { $0 } - result = HistoryBounds(firstDay: firstDays.min(), lastDay: lastDays.max()) + try read(url) { connection in + try readBounds(connection) } - return result } static func bucket(_ date: Date, interval: TimeInterval = sampleInterval) -> Int64 { @@ -402,375 +182,62 @@ public enum UsageHistoryStore { } extension UsageHistoryStore { - private enum Schema { - static let statements = """ - CREATE TABLE IF NOT EXISTS quota_samples ( - provider TEXT NOT NULL, - window_id TEXT NOT NULL, - sampled_at INTEGER NOT NULL, - display_name TEXT, - duration_minutes INTEGER, - used_percentage REAL NOT NULL, - resets_at INTEGER, - PRIMARY KEY (provider, window_id, sampled_at) - ) WITHOUT ROWID; - CREATE INDEX IF NOT EXISTS quota_samples_sampled_at ON quota_samples(sampled_at); - CREATE TABLE IF NOT EXISTS daily_tokens ( - day TEXT NOT NULL, - provider TEXT NOT NULL, - model TEXT NOT NULL, - tokens INTEGER NOT NULL, - updated_at INTEGER NOT NULL, - PRIMARY KEY (day, provider, model) - ) WITHOUT ROWID; - CREATE TABLE IF NOT EXISTS pace_samples ( - provider TEXT NOT NULL, window_id TEXT NOT NULL, sampled_at REAL NOT NULL, - display_name TEXT, points_per_hour REAL NOT NULL, observed_minutes REAL NOT NULL, - resets_at REAL, last_used_percentage REAL, is_active INTEGER NOT NULL, - PRIMARY KEY(provider, window_id, sampled_at) - ) WITHOUT ROWID; - CREATE INDEX IF NOT EXISTS pace_samples_sampled_at ON pace_samples(sampled_at); - CREATE INDEX IF NOT EXISTS pace_samples_active ON pace_samples(provider, window_id, is_active, sampled_at); - CREATE TABLE IF NOT EXISTS effort_events ( - id TEXT NOT NULL PRIMARY KEY, - provider TEXT NOT NULL, - occurred_at REAL NOT NULL, - day TEXT NOT NULL, - model TEXT NOT NULL, - effort TEXT NOT NULL, - tokens INTEGER NOT NULL - ) WITHOUT ROWID; - CREATE INDEX IF NOT EXISTS effort_events_day_provider ON effort_events(day, provider); - """ - - static let observedTotalsViews = """ - DROP VIEW IF EXISTS monthly_totals; - DROP VIEW IF EXISTS weekly_totals; - DROP VIEW IF EXISTS daily_totals; - CREATE VIEW daily_totals AS - SELECT day, provider, MAX(tokens) AS tokens FROM ( - SELECT day, provider, - MAX(COALESCE(MAX(CASE WHEN model = 'all' THEN tokens END), 0), - COALESCE(SUM(CASE WHEN model != 'all' THEN tokens END), 0)) AS tokens - FROM daily_tokens GROUP BY day, provider - UNION ALL - SELECT day, provider, SUM(tokens) AS tokens - FROM effort_events GROUP BY day, provider - ) GROUP BY day, provider; - CREATE VIEW weekly_totals AS - SELECT date(day, 'weekday 0', '-6 days') AS week_start, provider, SUM(tokens) AS tokens - FROM daily_totals GROUP BY week_start, provider; - CREATE VIEW monthly_totals AS - SELECT substr(day, 1, 7) AS month, provider, SUM(tokens) AS tokens - FROM daily_totals GROUP BY month, provider; - """ - - } - - private static func prepareSchema(_ handle: OpaquePointer) throws { - try exec(handle, "BEGIN IMMEDIATE;") - do { - try exec(handle, Schema.statements) - var columns = Set() - try query(handle, "PRAGMA table_info(quota_samples);", bindings: { _ in }) { statement in - columns.insert(text(statement, 1)) - } - if !columns.contains("verified") { - try exec(handle, "ALTER TABLE quota_samples ADD COLUMN verified INTEGER NOT NULL DEFAULT 0;") - } - if !columns.contains("observed_at") { - try exec(handle, "ALTER TABLE quota_samples ADD COLUMN observed_at REAL;") - } - if !columns.contains("continuity_started_at") { - try exec(handle, "ALTER TABLE quota_samples ADD COLUMN continuity_started_at REAL;") - } - if !columns.contains("continuity_reset_at") { - try exec(handle, "ALTER TABLE quota_samples ADD COLUMN continuity_reset_at REAL;") - } - if !columns.contains("account_fingerprint") { - try exec(handle, "ALTER TABLE quota_samples ADD COLUMN account_fingerprint TEXT;") - } - var paceColumns = Set() - try query(handle, "PRAGMA table_info(pace_samples);", bindings: { _ in }) { statement in - paceColumns.insert(text(statement, 1)) - } - if !paceColumns.contains("account_fingerprint") { - try exec(handle, "ALTER TABLE pace_samples ADD COLUMN account_fingerprint TEXT;") - } - var version: Int32 = 0 - try query(handle, "PRAGMA user_version;", bindings: { _ in }) { statement in - version = sqlite3_column_int(statement, 0) - } - if version < 1 { - try exec(handle, Schema.observedTotalsViews) - try exec(handle, "PRAGMA user_version = 1;") - } - try exec(handle, "COMMIT;") - } catch { - try? exec(handle, "ROLLBACK;") - throw error - } - } - - private static func writeEffort(_ handle: OpaquePointer, record: EffortUsageRecord) throws { - let sql = """ - INSERT INTO effort_events (id, provider, occurred_at, day, model, effort, tokens) - VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7) - ON CONFLICT(id) DO UPDATE SET - day = CASE WHEN excluded.occurred_at < effort_events.occurred_at THEN excluded.day ELSE effort_events.day END, - occurred_at = MIN(effort_events.occurred_at, excluded.occurred_at), - model = CASE WHEN effort_events.model = 'unknown' THEN excluded.model ELSE effort_events.model END, - effort = CASE WHEN effort_events.effort = 'unknown' THEN excluded.effort ELSE effort_events.effort END, - tokens = MAX(effort_events.tokens, excluded.tokens) - WHERE effort_events.provider = excluded.provider; - """ - try run(handle, sql) { statement in - bind(statement, 1, record.id.lowercased()) - bind(statement, 2, record.provider.rawValue) - sqlite3_bind_double(statement, 3, record.recordedAt.timeIntervalSince1970) - bind(statement, 4, record.day) - bind(statement, 5, record.model) - bind(statement, 6, record.effort) - sqlite3_bind_int64(statement, 7, Int64(record.tokens)) - } + struct Registry { + var preparations: [String: Int] = [:] + var lastEntryWasReadOnly: Bool? } - private static func writeQuota( - _ handle: OpaquePointer, snapshot: ProviderUsageSnapshot, accountFingerprint: String? - ) throws { - guard let capturedAt = snapshot.capturedAt else { return } - let sampledAt = bucket(capturedAt) - let sql = """ - INSERT INTO quota_samples - (provider, window_id, sampled_at, display_name, duration_minutes, used_percentage, resets_at, verified, observed_at, continuity_started_at, continuity_reset_at, account_fingerprint) - VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?10, ?8, ?9, ?11, ?12) - ON CONFLICT(provider, window_id, sampled_at) DO UPDATE SET - display_name = excluded.display_name, - duration_minutes = excluded.duration_minutes, - used_percentage = excluded.used_percentage, - resets_at = excluded.resets_at, - verified = excluded.verified, - observed_at = excluded.observed_at, - continuity_started_at = excluded.continuity_started_at, - continuity_reset_at = excluded.continuity_reset_at, - account_fingerprint = excluded.account_fingerprint - WHERE excluded.observed_at >= COALESCE(quota_samples.observed_at, quota_samples.sampled_at); - """ - for window in snapshot.windows { - let previous = try latestQuota(handle, provider: snapshot.provider, windowID: window.id) - guard previous.map({ capturedAt > $0.sampledAt }) ?? true else { continue } - let valid = window.usedPercentage.isFinite && (0...100).contains(window.usedPercentage) - var continuityStartedAt = capturedAt - var continuityResetAt = window.resetsAt - if let previous, previous.isVerified, valid, - previous.usedPercentage <= window.usedPercentage, - previous.accountFingerprint == accountFingerprint, - HistoryAnalytics.sameReset(previous.continuityResetAt ?? previous.resetsAt, window.resetsAt), - previous.durationMinutes == window.durationMinutes, - capturedAt.timeIntervalSince(previous.sampledAt) <= 1800, - let boundary = previous.continuityStartedAt - { - continuityStartedAt = boundary - continuityResetAt = previous.continuityResetAt ?? previous.resetsAt - } - try run(handle, sql) { statement in - bind(statement, 1, snapshot.provider.rawValue) - bind(statement, 2, window.id) - sqlite3_bind_int64(statement, 3, sampledAt) - bind(statement, 4, window.displayName) - bind(statement, 5, window.durationMinutes.map(Int64.init)) - sqlite3_bind_double(statement, 6, window.usedPercentage.isFinite ? window.usedPercentage : 0) - if let reset = window.resetsAt { - sqlite3_bind_double(statement, 7, reset.timeIntervalSince1970) - } else { - sqlite3_bind_null(statement, 7) - } - sqlite3_bind_double(statement, 8, capturedAt.timeIntervalSince1970) - sqlite3_bind_double(statement, 9, continuityStartedAt.timeIntervalSince1970) - sqlite3_bind_int(statement, 10, valid ? 1 : 0) - if let reset = continuityResetAt { - sqlite3_bind_double(statement, 11, reset.timeIntervalSince1970) - } else { - sqlite3_bind_null(statement, 11) - } - bind(statement, 12, accountFingerprint) - } - try archivePace( - handle, snapshot: snapshot, window: window, previous: previous, now: capturedAt, - accountFingerprint: accountFingerprint) - } - } + private static let registry = OSAllocatedUnfairLock(initialState: Registry()) - private static func latestQuota( - _ handle: OpaquePointer, provider: UsageProvider, windowID: String - ) throws -> HistoryQuotaRow? { - let sql = """ - SELECT COALESCE(observed_at, sampled_at), used_percentage, resets_at, duration_minutes, - verified, continuity_started_at, continuity_reset_at, account_fingerprint - FROM quota_samples WHERE provider = ?1 AND window_id = ?2 ORDER BY sampled_at DESC LIMIT 1; - """ - var row: HistoryQuotaRow? - try query(handle, sql) { statement in - bind(statement, 1, provider.rawValue) - bind(statement, 2, windowID) - } each: { statement in - row = HistoryQuotaRow( - sampledAt: Date(timeIntervalSince1970: sqlite3_column_double(statement, 0)), provider: provider, - windowID: windowID, displayName: nil, usedPercentage: sqlite3_column_double(statement, 1), - resetsAt: date(statement, 2), - durationMinutes: sqlite3_column_type(statement, 3) == SQLITE_NULL - ? nil : Int(sqlite3_column_int64(statement, 3)), - isVerified: sqlite3_column_int(statement, 4) == 1, continuityStartedAt: date(statement, 5), - continuityResetAt: date(statement, 6), accountFingerprint: optionalText(statement, 7)) - } - return row + static var preparedPaths: Set { + registry.withLock { Set($0.preparations.keys) } } - private static func writeTokens(_ handle: OpaquePointer, snapshot: ProviderUsageSnapshot, now: Date) throws { - let sql = """ - INSERT INTO daily_tokens (day, provider, model, tokens, updated_at) - VALUES (?1, ?2, ?3, ?4, ?5) - ON CONFLICT(day, provider, model) DO UPDATE SET - tokens = MAX(daily_tokens.tokens, excluded.tokens), - updated_at = excluded.updated_at; - """ - for row in tokenRows(for: snapshot) { - try run(handle, sql) { statement in - bind(statement, 1, row.day) - bind(statement, 2, row.provider.rawValue) - bind(statement, 3, row.model) - sqlite3_bind_int64(statement, 4, Int64(row.tokens)) - sqlite3_bind_int64(statement, 5, Int64(now.timeIntervalSince1970)) - } - } + static func schemaPreparations(for path: String) -> Int { + registry.withLock { $0.preparations[path] ?? 0 } } - static func tokenRows(for snapshot: ProviderUsageSnapshot) -> [HistoryTokenRow] { - if snapshot.modelBuckets.isEmpty { - return snapshot.dailyUsage - .filter { $0.tokens >= 0 } - .map { HistoryTokenRow(day: $0.day, provider: snapshot.provider, model: "all", tokens: $0.tokens) } - } - var totals: [String: [String: Int]] = [:] - for item in snapshot.modelBuckets where item.tokens >= 0 { - totals[item.day, default: [:]][item.model, default: 0] += item.tokens - } - return - totals - .flatMap { day, models in - models.map { HistoryTokenRow(day: day, provider: snapshot.provider, model: $0.key, tokens: $0.value) } - } - .sorted { left, right in - if left.day != right.day { return left.day < right.day } - return left.model < right.model - } + static var lastEntryWasReadOnly: Bool? { + registry.withLock { $0.lastEntryWasReadOnly } } - private static func prune(_ handle: OpaquePointer, now: Date) throws { - let cutoff = Int64(now.addingTimeInterval(-Double(quotaRetentionDays) * 86_400).timeIntervalSince1970) - try run(handle, "DELETE FROM quota_samples WHERE sampled_at < ?1;") { statement in - sqlite3_bind_int64(statement, 1, cutoff) - } + static func write(_ url: URL, _ body: (SQLiteConnection) throws -> T) throws -> T { + let connection = try SQLiteConnection.open(url, readOnly: false) + defer { connection.close() } + recordEntry(readOnly: connection.isReadOnly) + try prepareIfNeeded(connection, path: url.path) + return try body(connection) } -} -extension UsageHistoryStore { - private static var transientDestructor: sqlite3_destructor_type { - unsafeBitCast(Int(-1), to: sqlite3_destructor_type.self) - } - - private static func open(_ url: URL) throws -> OpaquePointer { - let directory = url.deletingLastPathComponent() - try FileManager.default.createDirectory( - at: directory, - withIntermediateDirectories: true, - attributes: [.posixPermissions: 0o700] - ) - var handle: OpaquePointer? - let flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX - guard sqlite3_open_v2(url.path, &handle, flags, nil) == SQLITE_OK, let handle else { - let message = handle.map { String(cString: sqlite3_errmsg($0)) } ?? url.path - if let handle { sqlite3_close(handle) } - throw UsageHistoryError.openFailed(message) - } - sqlite3_busy_timeout(handle, 3_000) - chmod(url.path, S_IRUSR | S_IWUSR) - return handle - } - - private static func exec(_ handle: OpaquePointer, _ sql: String) throws { - var error: UnsafeMutablePointer? - guard sqlite3_exec(handle, sql, nil, nil, &error) == SQLITE_OK else { - let message = error.map { String(cString: $0) } ?? sql - sqlite3_free(error) - throw UsageHistoryError.statementFailed(message) - } - } - - private static func run( - _ handle: OpaquePointer, - _ sql: String, - bindings: (OpaquePointer) -> Void - ) throws { - var statement: OpaquePointer? - guard sqlite3_prepare_v2(handle, sql, -1, &statement, nil) == SQLITE_OK, let statement else { - throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) + static func read(_ url: URL, _ body: (SQLiteConnection) throws -> T) throws -> T { + guard isPrepared(url.path), FileManager.default.fileExists(atPath: url.path) else { + return try write(url, body) } - defer { sqlite3_finalize(statement) } - bindings(statement) - guard sqlite3_step(statement) == SQLITE_DONE else { - throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) + let connection = try SQLiteConnection.open(url, readOnly: true) + recordEntry(readOnly: connection.isReadOnly) + if try schemaVersion(connection) < Schema.version { + connection.close() + return try write(url, body) } + defer { connection.close() } + return try body(connection) } - private static func query( - _ handle: OpaquePointer, - _ sql: String, - bindings: (OpaquePointer) -> Void, - each: (OpaquePointer) -> Void - ) throws { - var statement: OpaquePointer? - guard sqlite3_prepare_v2(handle, sql, -1, &statement, nil) == SQLITE_OK, let statement else { - throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) - } - defer { sqlite3_finalize(statement) } - bindings(statement) - while true { - switch sqlite3_step(statement) { - case SQLITE_ROW: each(statement) - case SQLITE_DONE: return - default: throw UsageHistoryError.statementFailed(String(cString: sqlite3_errmsg(handle))) - } - } - } - - private static func bind(_ statement: OpaquePointer, _ index: Int32, _ value: String?) { - guard let value else { - sqlite3_bind_null(statement, index) - return - } - sqlite3_bind_text(statement, index, value, -1, transientDestructor) - } - - private static func bind(_ statement: OpaquePointer, _ index: Int32, _ value: Int64?) { - guard let value else { - sqlite3_bind_null(statement, index) - return - } - sqlite3_bind_int64(statement, index, value) + private static func recordEntry(readOnly: Bool) { + registry.withLock { $0.lastEntryWasReadOnly = readOnly } } - private static func text(_ statement: OpaquePointer, _ index: Int32) -> String { - optionalText(statement, index) ?? "" + private static func isPrepared(_ path: String) -> Bool { + registry.withLock { $0.preparations[path] != nil } } - private static func optionalText(_ statement: OpaquePointer, _ index: Int32) -> String? { - guard let raw = sqlite3_column_text(statement, index) else { return nil } - return String(cString: raw) + private static func markPrepared(_ path: String) { + registry.withLock { $0.preparations[path, default: 0] += 1 } } - private static func date(_ statement: OpaquePointer, _ index: Int32) -> Date? { - guard sqlite3_column_type(statement, index) != SQLITE_NULL else { return nil } - return Date(timeIntervalSince1970: sqlite3_column_double(statement, index)) + private static func prepareIfNeeded(_ connection: SQLiteConnection, path: String) throws { + if isPrepared(path), try schemaVersion(connection) >= Schema.version { return } + try prepareSchema(connection) + markPrepared(path) } } diff --git a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift index 46ae643..7a36aaa 100644 --- a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift +++ b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift @@ -210,6 +210,37 @@ final class UsageHistoryStoreTests: XCTestCase { XCTAssertEqual(try UsageHistoryStore.usageDays(at: database), ["2026-09-15", "2026-09-17"]) } + func testSchemaIsPreparedOncePerProcessAndPath() throws { + try UsageHistoryStore.record(claudeSnapshot(), at: database) + try UsageHistoryStore.record(claudeSnapshot(used: 60), at: database) + _ = try UsageHistoryStore.tokenRows(at: database) + _ = try UsageHistoryStore.quotaRows(at: database) + + XCTAssertTrue(UsageHistoryStore.preparedPaths.contains(database.path)) + XCTAssertEqual(UsageHistoryStore.schemaPreparations(for: database.path), 1) + + let other = root.appending(path: "other-history.sqlite") + _ = try UsageHistoryStore.bounds(at: other) + _ = try UsageHistoryStore.bounds(at: other) + XCTAssertEqual(UsageHistoryStore.schemaPreparations(for: other.path), 1) + XCTAssertEqual(UsageHistoryStore.schemaPreparations(for: database.path), 1) + } + + func testReadEntriesOpenReadOnly() throws { + try UsageHistoryStore.record(claudeSnapshot(), at: database) + XCTAssertEqual(UsageHistoryStore.lastEntryWasReadOnly, false) + + _ = try UsageHistoryStore.quotaRows(at: database) + XCTAssertEqual(UsageHistoryStore.lastEntryWasReadOnly, true) + _ = try UsageHistoryStore.tokenRows(at: database) + XCTAssertEqual(UsageHistoryStore.lastEntryWasReadOnly, true) + _ = try UsageHistoryStore.bounds(at: database) + XCTAssertEqual(UsageHistoryStore.lastEntryWasReadOnly, true) + + try UsageHistoryStore.record(claudeSnapshot(used: 70), at: database) + XCTAssertEqual(UsageHistoryStore.lastEntryWasReadOnly, false) + } + private func claudeSnapshot( used: Double = 44, capturedAt: Date = Date(timeIntervalSince1970: 1_787_000_400), From 6bd6381a48db4e5863c5496aa427bfb35685043c Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:44:12 -0500 Subject: [PATCH 05/21] refactor(clients): async account client over BlockingWork, incremental app-server parsing and empty-limits marker --- .../TokenGaugeApp/Services/BlockingWork.swift | 44 +++++++++++++ .../Services/ClaudeAccountUsageClient.swift | 64 +++++++++++-------- .../Services/CodexAppServerClient.swift | 35 +++++++--- .../ClaudeAccountUsageParser.swift | 39 +++++++---- .../BlockingWorkTests.swift | 63 ++++++++++++++++++ .../ProcessRunnerParsingTests.swift | 46 +++++++++++++ .../ClaudeAccountUsageParserTests.swift | 26 ++++++++ 7 files changed, 269 insertions(+), 48 deletions(-) create mode 100644 Sources/TokenGaugeApp/Services/BlockingWork.swift create mode 100644 Tests/TokenGaugeAppTests/BlockingWorkTests.swift create mode 100644 Tests/TokenGaugeAppTests/ProcessRunnerParsingTests.swift diff --git a/Sources/TokenGaugeApp/Services/BlockingWork.swift b/Sources/TokenGaugeApp/Services/BlockingWork.swift new file mode 100644 index 0000000..2dcaf73 --- /dev/null +++ b/Sources/TokenGaugeApp/Services/BlockingWork.swift @@ -0,0 +1,44 @@ +import Foundation +import os + +enum BlockingWork { + struct TimedOut: Error {} + + private static let queue = DispatchQueue( + label: "com.stevenacz.TokenGauge.blocking-work", qos: .utility, attributes: .concurrent) + + static func run(_ work: @escaping @Sendable () throws -> Value) async throws -> Value { + try await withCheckedThrowingContinuation { continuation in + queue.async { + do { + continuation.resume(returning: try work()) + } catch { + continuation.resume(throwing: error) + } + } + } + } + + static func waitForResult( + timeout: TimeInterval, + _ operation: @escaping @Sendable () async throws -> Value + ) throws -> Value { + let outcome = OSAllocatedUnfairLock?>(initialState: nil) + let semaphore = DispatchSemaphore(value: 0) + let task = Task.detached(priority: .utility) { + do { + let value = try await operation() + outcome.withLock { $0 = .success(value) } + } catch { + outcome.withLock { $0 = .failure(error) } + } + semaphore.signal() + } + guard semaphore.wait(timeout: .now() + timeout) == .success else { + task.cancel() + throw TimedOut() + } + guard let result = outcome.withLock({ $0 }) else { throw TimedOut() } + return try result.get() + } +} diff --git a/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift b/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift index 0ebdb15..e89eadd 100644 --- a/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift +++ b/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift @@ -1,5 +1,6 @@ import Foundation import TokenGaugeCore +import os enum ClaudeAccountUsageError: Error, Equatable { case authenticationRequired @@ -29,11 +30,24 @@ struct ClaudeAccountUsageClient: Sendable { let configuration = URLSessionConfiguration.ephemeral configuration.urlCache = nil configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData + configuration.timeoutIntervalForResource = 12 return URLSession(configuration: configuration) }() + private static let log = Logger(subsystem: "com.stevenacz.TokenGauge", category: "claude-account") func fetch(now: Date = Date(), identity: ClaudeAccountIdentity?) throws -> ClaudeAccountSnapshot { - guard let token = ClaudeOAuthTokenReader.read(accountUuid: identity?.accountUuid) else { + do { + return try BlockingWork.waitForResult(timeout: 25) { try await fetch(now: now, identity: identity) } + } catch is BlockingWork.TimedOut { + Self.log.error("Claude usage request did not complete within its bound") + throw ClaudeAccountUsageError.unavailable + } + } + + func fetch(now: Date = Date(), identity: ClaudeAccountIdentity?) async throws -> ClaudeAccountSnapshot { + let accountUuid = identity?.accountUuid + guard let token = try await BlockingWork.run({ ClaudeOAuthTokenReader.read(accountUuid: accountUuid) }) + else { throw ClaudeAccountUsageError.authenticationRequired } guard !token.isExpired else { throw ClaudeAccountUsageError.credentialExpired } @@ -46,34 +60,36 @@ struct ClaudeAccountUsageClient: Sendable { let outcome: Data do { - outcome = try send(request) + outcome = try await Self.send(request) } catch ClaudeAccountUsageError.authenticationRequired { ClaudeOAuthTokenReader.invalidate() - guard let fresh = ClaudeOAuthTokenReader.read(accountUuid: identity?.accountUuid), !fresh.isExpired, - fresh.value != token.value - else { + let refreshed = try await BlockingWork.run({ ClaudeOAuthTokenReader.read(accountUuid: accountUuid) }) + guard let fresh = refreshed, !fresh.isExpired, fresh.value != token.value else { throw ClaudeAccountUsageError.authenticationRequired } request.setValue("Bearer \(fresh.value)", forHTTPHeaderField: "Authorization") - outcome = try send(request) + outcome = try await Self.send(request) } let windows = try Self.parseWindows(outcome) let snapshot = ClaudeAccountSnapshot( capturedAt: now, windows: windows, accountFingerprint: identity?.fingerprint) if !windows.isEmpty { - try? SecureMetricStore.write(snapshot, to: UsagePaths.claudeAccountCache(homeDirectory: homeDirectory)) + let url = UsagePaths.claudeAccountCache(homeDirectory: homeDirectory) + do { + try SecureMetricStore.write(snapshot, to: url) + } catch { + Self.log.error("Could not write the Claude account cache at \(url.path, privacy: .public)") + } } return snapshot } static func parseWindows(_ data: Data) throws -> [QuotaWindow] { do { - if let root = try JSONSerialization.jsonObject(with: data) as? [String: Any], - let limits = root["limits"] as? [Any], limits.isEmpty - { - return [] + switch try ClaudeAccountUsageParser.parseLimits(data) { + case .empty: return [] + case .windows(let windows): return windows } - return try ClaudeAccountUsageParser.parse(data) } catch { throw ClaudeAccountUsageError.unavailable } @@ -88,26 +104,20 @@ struct ClaudeAccountUsageClient: Sendable { return snapshot } - private func send(_ request: URLRequest) throws -> Data { - let semaphore = DispatchSemaphore(value: 0) - nonisolated(unsafe) var payload: Data? - nonisolated(unsafe) var status = 0 - let task = Self.session.dataTask(with: request) { data, response, _ in - payload = data - status = (response as? HTTPURLResponse)?.statusCode ?? 0 - semaphore.signal() - } - task.resume() - guard semaphore.wait(timeout: .now() + 12) == .success else { - task.cancel() + private static func send(_ request: URLRequest) async throws -> Data { + let payload: Data + let response: URLResponse + do { + (payload, response) = try await session.data(for: request) + } catch { + log.error("Claude usage request failed before a response arrived") throw ClaudeAccountUsageError.unavailable } + let status = (response as? HTTPURLResponse)?.statusCode ?? 0 guard status == 200 else { + log.error("Claude usage endpoint returned status \(status, privacy: .public)") throw ClaudeAccountUsageError.httpStatus(status) } - guard let payload else { - throw ClaudeAccountUsageError.unavailable - } return payload } } diff --git a/Sources/TokenGaugeApp/Services/CodexAppServerClient.swift b/Sources/TokenGaugeApp/Services/CodexAppServerClient.swift index 3d39278..05007b5 100644 --- a/Sources/TokenGaugeApp/Services/CodexAppServerClient.swift +++ b/Sources/TokenGaugeApp/Services/CodexAppServerClient.swift @@ -1,10 +1,13 @@ import Darwin import Foundation import TokenGaugeCore +import os struct CodexAppServerClient: Sendable { let homeDirectory: URL + private static let log = Logger(subsystem: "com.stevenacz.TokenGauge", category: "codex") + init(homeDirectory: URL = FileManager.default.homeDirectoryForCurrentUser) { self.homeDirectory = homeDirectory } @@ -32,7 +35,12 @@ struct CodexAppServerClient: Sendable { throw UsageDataError.processFailed("Codex app-server exited with status \(result.exitCode)") } let snapshot = try CodexUsageParser.parse(result.standardOutput, capturedAt: capturedAt) - try? SecureMetricStore.write(snapshot, to: UsagePaths.codexCache(homeDirectory: homeDirectory)) + let cache = UsagePaths.codexCache(homeDirectory: homeDirectory) + do { + try SecureMetricStore.write(snapshot, to: cache) + } catch { + Self.log.error("Could not write the Codex cache at \(cache.path, privacy: .public)") + } return snapshot } @@ -110,8 +118,10 @@ enum ProcessRunner { let deadline = ProcessInfo.processInfo.systemUptime + timeout var output = Data() var responseIDs: Set = [] + var scanned = 0 var inputClosed = false var outputClosed = false + var buffer = [UInt8](repeating: 0, count: 65_536) let outputHandle = outputPipe.fileHandleForReading while ProcessInfo.processInfo.systemUptime < deadline { @@ -131,15 +141,16 @@ enum ProcessRunner { throw UsageDataError.processFailed("Could not read Codex app-server output") } guard ready > 0 else { continue } - if let chunk = readAvailableData(from: outputHandle.fileDescriptor) { + if let chunk = readAvailableData(from: outputHandle.fileDescriptor, into: &buffer) { if chunk.isEmpty { outputClosed = true + responseIDs.formUnion(responseIdentifiers(in: output, from: &scanned, includingTail: true)) } else { guard output.count + chunk.count <= 4 * 1024 * 1024 else { throw UsageDataError.processFailed("Codex app-server response exceeded the size limit") } output.append(chunk) - responseIDs.formUnion(responseIdentifiers(in: output)) + responseIDs.formUnion(responseIdentifiers(in: output, from: &scanned)) } } } @@ -157,9 +168,14 @@ enum ProcessRunner { ) } - private static func responseIdentifiers(in data: Data) -> Set { - Set( - data.split(separator: 0x0A).compactMap { line in + static func responseIdentifiers(in data: Data, from offset: inout Int, includingTail: Bool = false) -> Set { + let start = data.startIndex + offset + let end = includingTail ? data.endIndex : data[start...].lastIndex(of: 0x0A).map { $0 + 1 } ?? start + guard end > start else { return [] } + let lines = data[start.. Data? { - var bytes = [UInt8](repeating: 0, count: 65_536) - let count = Darwin.read(descriptor, &bytes, bytes.count) + private static func readAvailableData(from descriptor: Int32, into buffer: inout [UInt8]) -> Data? { + let count = Darwin.read(descriptor, &buffer, buffer.count) guard count >= 0 else { return nil } - return Data(bytes.prefix(count)) + return Data(buffer.prefix(count)) } private static func stop(_ process: Process) { diff --git a/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift b/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift index c66798e..d4c1b66 100644 --- a/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift +++ b/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift @@ -16,19 +16,35 @@ public struct ClaudeAccountSnapshot: Codable, Equatable, Sendable { } } +public enum ClaudeAccountLimits: Equatable, Sendable { + case empty + case windows([QuotaWindow]) +} + public enum ClaudeAccountUsageParser { public static func parse(_ data: Data) throws -> [QuotaWindow] { - guard let root = try JSONSerialization.jsonObject(with: data) as? [String: Any] else { + switch try parseLimits(data) { + case .empty: throw UsageDataError.invalidPayload + case .windows(let windows): return windows + } + } + + public static func parseLimits(_ data: Data) throws -> ClaudeAccountLimits { + guard let root = try JSONSerialization.jsonObject(with: data) as? [String: Any], + let entries = JSONValue.array(root["limits"]) + else { throw UsageDataError.invalidPayload } - let windows = JSONValue.array(root["limits"]).map(limits(from:)) ?? [] + guard !entries.isEmpty else { return .empty } + let windows = limits(from: entries) guard !windows.isEmpty else { throw UsageDataError.invalidPayload } - return windows.sorted { left, right in - let leftDuration = left.durationMinutes ?? Int.max - let rightDuration = right.durationMinutes ?? Int.max - if leftDuration != rightDuration { return leftDuration < rightDuration } - return left.id < right.id - } + return .windows( + windows.sorted { left, right in + let leftDuration = left.durationMinutes ?? Int.max + let rightDuration = right.durationMinutes ?? Int.max + if leftDuration != rightDuration { return leftDuration < rightDuration } + return left.id < right.id + }) } private static func limits(from entries: [Any]) -> [QuotaWindow] { @@ -76,9 +92,10 @@ public enum ClaudeAccountUsageParser { } } + private static let fractionalInstant = Date.ISO8601FormatStyle(includingFractionalSeconds: true) + private static let instant = Date.ISO8601FormatStyle() + private static func date(from text: String) -> Date? { - let fractional = ISO8601DateFormatter() - fractional.formatOptions = [.withInternetDateTime, .withFractionalSeconds] - return fractional.date(from: text) ?? ISO8601DateFormatter().date(from: text) + (try? fractionalInstant.parse(text)) ?? (try? instant.parse(text)) } } diff --git a/Tests/TokenGaugeAppTests/BlockingWorkTests.swift b/Tests/TokenGaugeAppTests/BlockingWorkTests.swift new file mode 100644 index 0000000..e1ba0f6 --- /dev/null +++ b/Tests/TokenGaugeAppTests/BlockingWorkTests.swift @@ -0,0 +1,63 @@ +import Foundation +import XCTest +import os + +@testable import TokenGaugeApp + +final class BlockingWorkTests: XCTestCase { + private struct Failure: Error {} + + func testBlockingWorkRunsOffCooperativePool() async throws { + let started = ProcessInfo.processInfo.systemUptime + let values = try await withThrowingTaskGroup(of: Int.self) { group in + for index in 0..<8 { + group.addTask { + try await BlockingWork.run { + usleep(150_000) + return index + } + } + } + var seen: Set = [] + for try await value in group { seen.insert(value) } + return seen + } + + XCTAssertEqual(values, Set(0..<8)) + XCTAssertLessThan(ProcessInfo.processInfo.systemUptime - started, 0.9) + } + + func testRunPropagatesThrownErrors() async { + do { + _ = try await BlockingWork.run { () -> Int in throw Failure() } + XCTFail("Expected the blocking work to rethrow") + } catch { + XCTAssertTrue(error is Failure) + } + } + + func testWaitForResultReturnsTheValueAndPropagatesErrors() throws { + XCTAssertEqual(try BlockingWork.waitForResult(timeout: 5) { 42 }, 42) + XCTAssertThrowsError(try BlockingWork.waitForResult(timeout: 5) { () -> Int in throw Failure() }) { error in + XCTAssertTrue(error is Failure) + } + } + + func testWaitForResultTimesOutAndCancelsTheOperation() { + let cancelled = expectation(description: "operation cancelled") + XCTAssertThrowsError( + try BlockingWork.waitForResult(timeout: 0.2) { () -> Int in + do { + try await Task.sleep(for: .seconds(5)) + } catch { + cancelled.fulfill() + throw error + } + return 1 + } + ) { error in + XCTAssertTrue(error is BlockingWork.TimedOut) + } + wait(for: [cancelled], timeout: 2) + } +} diff --git a/Tests/TokenGaugeAppTests/ProcessRunnerParsingTests.swift b/Tests/TokenGaugeAppTests/ProcessRunnerParsingTests.swift new file mode 100644 index 0000000..275a399 --- /dev/null +++ b/Tests/TokenGaugeAppTests/ProcessRunnerParsingTests.swift @@ -0,0 +1,46 @@ +import Foundation +import XCTest + +@testable import TokenGaugeApp + +final class ProcessRunnerParsingTests: XCTestCase { + func testResponseIdentifiersParseOnlyNewBytes() { + let lines = (1...4).map { "{\"id\":\($0),\"result\":{}}\n" } + var output = Data() + var scanned = 0 + var identifiers: Set = [] + var scannedPerChunk: [Int] = [] + + for line in lines { + let before = scanned + output.append(Data(line.utf8)) + identifiers.formUnion(ProcessRunner.responseIdentifiers(in: output, from: &scanned)) + scannedPerChunk.append(scanned - before) + } + + XCTAssertEqual(identifiers, [1, 2, 3, 4]) + XCTAssertEqual(scannedPerChunk, lines.map(\.utf8.count)) + XCTAssertEqual(scanned, output.count) + } + + func testIncompleteLineIsScannedOnlyOnceItIsComplete() { + var output = Data("{\"id\":7,\"res".utf8) + var scanned = 0 + + XCTAssertTrue(ProcessRunner.responseIdentifiers(in: output, from: &scanned).isEmpty) + XCTAssertEqual(scanned, 0) + + output.append(Data("ult\":{}}\n".utf8)) + XCTAssertEqual(ProcessRunner.responseIdentifiers(in: output, from: &scanned), [7]) + XCTAssertEqual(scanned, output.count) + } + + func testFinalLineWithoutNewlineIsScannedAtEndOfOutput() { + let output = Data("{\"id\":2}\n{\"id\":3}".utf8) + var scanned = 0 + + XCTAssertEqual(ProcessRunner.responseIdentifiers(in: output, from: &scanned), [2]) + XCTAssertEqual(ProcessRunner.responseIdentifiers(in: output, from: &scanned, includingTail: true), [3]) + XCTAssertEqual(scanned, output.count) + } +} diff --git a/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift b/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift index e5c5f47..1b9396d 100644 --- a/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift +++ b/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift @@ -49,4 +49,30 @@ final class ClaudeAccountUsageParserTests: XCTestCase { func testRejectsPayloadWithoutLimits() { XCTAssertThrowsError(try ClaudeAccountUsageParser.parse(Data("{\"limits\":[]}".utf8))) } + + func testReportsEmptyLimitsSeparatelyFromMalformedPayloads() throws { + XCTAssertEqual(try ClaudeAccountUsageParser.parseLimits(Data("{\"limits\":[]}".utf8)), .empty) + for payload in ["invalid", "{}", "{\"limits\":[{}]}", "{\"limits\":{}}"] { + XCTAssertThrowsError(try ClaudeAccountUsageParser.parseLimits(Data(payload.utf8))) + } + } + + func testParsesResetInstantsWithAndWithoutFractionalSeconds() throws { + let input = Data( + """ + {"limits": [ + {"kind": "session", "percent": 10, "resets_at": "2026-08-25T22:59:59.535623+00:00", "scope": null}, + {"kind": "weekly_all", "percent": 20, "resets_at": "2026-08-31T07:59:59Z", "scope": null} + ]} + """.utf8 + ) + let windows = try ClaudeAccountUsageParser.parse(input) + let expected = [ + ISO8601DateFormatter().date(from: "2026-08-25T22:59:59+00:00")!, + ISO8601DateFormatter().date(from: "2026-08-31T07:59:59Z")!, + ] + for (window, instant) in zip(windows, expected) { + XCTAssertEqual(window.resetsAt?.timeIntervalSince1970 ?? 0, instant.timeIntervalSince1970, accuracy: 1) + } + } } From 5b146fb461af065fbc32e7959e047d16c7818148 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:44:12 -0500 Subject: [PATCH 06/21] refactor(core): drop dead activity chart, share test fixtures and hex helper, order quota windows by display order --- .../Views/ActivityChartView.swift | 173 ------------------ .../ClaudeAccountIdentity.swift | 10 +- .../TokenGaugeCore/ClaudeUsageParser.swift | 7 +- Sources/TokenGaugeCore/CodexUsageParser.swift | 7 +- Sources/TokenGaugeCore/Hex.swift | 9 + .../TokenGaugeCore/SecureMetricStore.swift | 8 +- Sources/TokenGaugeCore/UsageModels.swift | 14 +- .../ActivityChartScopeTests.swift | 82 --------- .../ClaudeAccountHeaderRenderingTests.swift | 49 ++--- .../HistoryDashboardTests.swift | 18 ++ .../MenuBarPresentationTests.swift | 8 +- .../QuotaPanelRenderingTests.swift | 61 ++---- .../TokenGaugeAppTests/ScreenshotTests.swift | 66 ++----- .../TokenGaugeAppTests/Support/Fixtures.swift | 53 ++++++ .../Support/Rendering.swift | 62 +++++++ .../WindowVisibilityTests.swift | 19 +- .../UsageModelsTests.swift | 28 +++ 17 files changed, 248 insertions(+), 426 deletions(-) delete mode 100644 Sources/TokenGaugeApp/Views/ActivityChartView.swift create mode 100644 Sources/TokenGaugeCore/Hex.swift delete mode 100644 Tests/TokenGaugeAppTests/ActivityChartScopeTests.swift create mode 100644 Tests/TokenGaugeAppTests/Support/Fixtures.swift create mode 100644 Tests/TokenGaugeAppTests/Support/Rendering.swift create mode 100644 Tests/TokenGaugeCoreTests/UsageModelsTests.swift diff --git a/Sources/TokenGaugeApp/Views/ActivityChartView.swift b/Sources/TokenGaugeApp/Views/ActivityChartView.swift deleted file mode 100644 index 4165ac7..0000000 --- a/Sources/TokenGaugeApp/Views/ActivityChartView.swift +++ /dev/null @@ -1,173 +0,0 @@ -import SwiftUI -import TokenGaugeCore - -struct ActivityDay: Identifiable { - let id: String - let date: Date - let claudeTokens: Int - let codexTokens: Int - - func tokens(for provider: UsageProvider) -> Int { - provider == .claude ? claudeTokens : codexTokens - } -} - -struct ActivityChartData { - let days: [ActivityDay] - let providers: [UsageProvider] - let maximumTokens: Int - - init( - claude: ProviderUsageSnapshot?, codex: ProviderUsageSnapshot?, - providers: [UsageProvider] = [.claude, .codex], now: Date = Date(), calendar: Calendar = .current - ) { - var seen: Set = [] - self.providers = providers.filter { seen.insert($0).inserted } - let today = calendar.startOfDay(for: now) - let formatter = DateFormatter() - formatter.calendar = Calendar(identifier: .gregorian) - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.timeZone = calendar.timeZone - formatter.dateFormat = "yyyy-MM-dd" - let claudeTotals = Dictionary((claude?.dailyUsage ?? []).map { ($0.day, $0.tokens) }, uniquingKeysWith: max) - let codexTotals = Dictionary((codex?.dailyUsage ?? []).map { ($0.day, $0.tokens) }, uniquingKeysWith: max) - days = (0..<7).compactMap { offset in - guard let date = calendar.date(byAdding: .day, value: offset - 6, to: today) else { return nil } - let key = formatter.string(from: date) - return ActivityDay( - id: key, date: date, claudeTokens: claudeTotals[key] ?? 0, codexTokens: codexTotals[key] ?? 0) - } - maximumTokens = max(days.flatMap { day in providers.map { day.tokens(for: $0) } }.max() ?? 0, 1) - } - - func selectedDay(key: String) -> ActivityDay? { - days.first { $0.id == key } ?? days.last - } - - @MainActor func summary(for day: ActivityDay, locale: Locale) -> String { - let label = day.date.formatted(.dateTime.weekday(.abbreviated).day().locale(locale)) - let totals = providers.map { provider in - let name = (provider == .claude ? "provider.claude_short" : "provider.codex").localized - return "\(name) \(UsageFormatters.tokens(day.tokens(for: provider)))" - }.joined(separator: " · ") - return "activity.selected_scoped".localized(label, totals) - } -} - -struct ActivityChartView: View { - private let data: ActivityChartData - @State private var selectedKey: String - private let compact: Bool - private var barHeight: CGFloat { Theme.Layout.activityChartHeight } - - init( - claude: ProviderUsageSnapshot?, codex: ProviderUsageSnapshot?, - providers: [UsageProvider] = [.claude, .codex], compact: Bool = false - ) { - self.compact = compact - let data = ActivityChartData(claude: claude, codex: codex, providers: providers) - self.data = data - _selectedKey = State(initialValue: data.days.last?.id ?? "") - } - - var body: some View { - let selectedDay = data.selectedDay(key: selectedKey) - VStack(alignment: .leading, spacing: 6) { - HStack(spacing: 6) { - Text("activity.title".localized) - .font(.caption.weight(.semibold)) - Spacer(minLength: 4) - legend - } - - HStack(alignment: .bottom, spacing: 8) { - ForEach(data.days) { day in - let isToday = day.id == data.days.last?.id - Button { - select(day) - } label: { - VStack(spacing: 5) { - HStack(alignment: .bottom, spacing: 3) { - ForEach(data.providers.filter { day.tokens(for: $0) > 0 }, id: \.self) { provider in - bar( - tokens: day.tokens(for: provider), - tint: provider == .claude ? Theme.claude : Theme.codex) - } - } - .frame(height: barHeight, alignment: .bottom) - .frame(maxWidth: .infinity) - .overlay(alignment: .bottom) { - Rectangle().fill(Color.primary.opacity(0.09)).frame(height: 1) - } - Text(day.date.formatted(.dateTime.weekday(.narrow).locale(locale))) - .font(.system(size: 9, weight: isToday || day.id == selectedDay?.id ? .bold : .regular)) - .foregroundStyle( - isToday ? .white : day.id == selectedDay?.id ? Color.primary : Color.secondary - ) - .frame(width: 22, height: 16) - .background { - if isToday { - Capsule().fill(data.providers == [.claude] ? Theme.claude : Theme.codex) - } - } - } - .frame(maxWidth: .infinity) - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - .onHover { inside in - if inside { select(day) } - } - .accessibilityLabel(summary(for: day)) - .accessibilityAddTraits(day.id == selectedDay?.id ? [.isSelected] : []) - } - } - - Text(selectedDay.map(summary) ?? "") - .font(.system(size: 10)) - .foregroundStyle(.secondary) - .monospacedDigit() - .lineLimit(1) - } - } - - private var locale: Locale { - Locale(identifier: LocalizationManager.shared.language.rawValue) - } - - private func select(_ day: ActivityDay) { - guard selectedKey != day.id else { return } - selectedKey = day.id - } - - private func bar(tokens: Int, tint: Color) -> some View { - RoundedRectangle(cornerRadius: 2) - .fill(tint) - .frame(width: compact ? 7 : 9, height: barHeight * Double(tokens) / Double(data.maximumTokens)) - .accessibilityHidden(true) - } - - private func summary(for day: ActivityDay) -> String { - data.summary(for: day, locale: locale) - } - - private var legend: some View { - HStack(spacing: 8) { - ForEach(data.providers, id: \.self) { provider in - legendItem( - color: provider == .claude ? Theme.claude : Theme.codex, - title: (provider == .claude ? "provider.claude_short" : "provider.codex").localized) - } - } - .font(.system(size: 10)) - .foregroundStyle(.secondary) - } - - private func legendItem(color: Color, title: String) -> some View { - HStack(spacing: 4) { - RoundedRectangle(cornerRadius: 1.5).fill(color).frame(width: 7, height: 7) - Text(title) - } - } - -} diff --git a/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift b/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift index 8372416..9aa05d8 100644 --- a/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift +++ b/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift @@ -7,6 +7,7 @@ public struct ClaudeAccountIdentity: Equatable, Sendable { public let emailAddress: String? public let displayName: String? public let organizationName: String? + public let fingerprint: String public init( accountUuid: String, @@ -18,14 +19,7 @@ public struct ClaudeAccountIdentity: Equatable, Sendable { self.emailAddress = emailAddress self.displayName = displayName self.organizationName = organizationName - } - - public var fingerprint: String { - let hex = Array("0123456789abcdef".utf8) - return String( - decoding: SHA256.hash(data: Data(accountUuid.utf8)).flatMap { - [hex[Int($0 >> 4)], hex[Int($0 & 15)]] - }, as: UTF8.self) + fingerprint = Hex.string(SHA256.hash(data: Data(accountUuid.utf8))) } public static func isCompatible(stored: String?, current: String?) -> Bool { diff --git a/Sources/TokenGaugeCore/ClaudeUsageParser.swift b/Sources/TokenGaugeCore/ClaudeUsageParser.swift index 5d4d43b..4ba2f7a 100644 --- a/Sources/TokenGaugeCore/ClaudeUsageParser.swift +++ b/Sources/TokenGaugeCore/ClaudeUsageParser.swift @@ -63,12 +63,7 @@ public enum ClaudeUsageParser { durationMinutes: duration(for: key), displayName: nil ) - }.sorted { left, right in - let leftDuration = left.durationMinutes ?? Int.max - let rightDuration = right.durationMinutes ?? Int.max - if leftDuration != rightDuration { return leftDuration < rightDuration } - return left.id < right.id - } + }.sorted(by: QuotaWindow.displayOrder) return ProviderUsageSnapshot( provider: .claude, windows: windows, diff --git a/Sources/TokenGaugeCore/CodexUsageParser.swift b/Sources/TokenGaugeCore/CodexUsageParser.swift index 4c6bba6..b596319 100644 --- a/Sources/TokenGaugeCore/CodexUsageParser.swift +++ b/Sources/TokenGaugeCore/CodexUsageParser.swift @@ -61,12 +61,7 @@ public enum CodexUsageParser { unique[window.id] = window } } - return unique.values.sorted { left, right in - let leftDuration = left.durationMinutes ?? Int.max - let rightDuration = right.durationMinutes ?? Int.max - if leftDuration != rightDuration { return leftDuration < rightDuration } - return left.id < right.id - } + return unique.values.sorted(by: QuotaWindow.displayOrder) } private static func windows(from bucket: [String: Any], bucketID: String) -> [QuotaWindow] { diff --git a/Sources/TokenGaugeCore/Hex.swift b/Sources/TokenGaugeCore/Hex.swift new file mode 100644 index 0000000..ea18aaa --- /dev/null +++ b/Sources/TokenGaugeCore/Hex.swift @@ -0,0 +1,9 @@ +import Foundation + +enum Hex { + private static let digits = Array("0123456789abcdef".utf8) + + static func string(_ bytes: some Sequence) -> String { + String(decoding: bytes.flatMap { [digits[Int($0 >> 4)], digits[Int($0 & 15)]] }, as: UTF8.self) + } +} diff --git a/Sources/TokenGaugeCore/SecureMetricStore.swift b/Sources/TokenGaugeCore/SecureMetricStore.swift index 5af91c7..f006916 100644 --- a/Sources/TokenGaugeCore/SecureMetricStore.swift +++ b/Sources/TokenGaugeCore/SecureMetricStore.swift @@ -23,18 +23,18 @@ public enum SecureMetricStore { } extension JSONEncoder { - static var tokenGauge: JSONEncoder { + static let tokenGauge: JSONEncoder = { let encoder = JSONEncoder() encoder.dateEncodingStrategy = .secondsSince1970 encoder.outputFormatting = [.sortedKeys] return encoder - } + }() } extension JSONDecoder { - static var tokenGauge: JSONDecoder { + static let tokenGauge: JSONDecoder = { let decoder = JSONDecoder() decoder.dateDecodingStrategy = .secondsSince1970 return decoder - } + }() } diff --git a/Sources/TokenGaugeCore/UsageModels.swift b/Sources/TokenGaugeCore/UsageModels.swift index d0c70ba..2cb7a81 100644 --- a/Sources/TokenGaugeCore/UsageModels.swift +++ b/Sources/TokenGaugeCore/UsageModels.swift @@ -30,6 +30,13 @@ public struct QuotaWindow: Codable, Equatable, Identifiable, Sendable { 100 - usedPercentage } + public static func displayOrder(_ left: QuotaWindow, _ right: QuotaWindow) -> Bool { + let leftDuration = left.durationMinutes ?? Int.max + let rightDuration = right.durationMinutes ?? Int.max + if leftDuration != rightDuration { return leftDuration < rightDuration } + return left.id < right.id + } + public var startsAt: Date? { guard let resetsAt, let durationMinutes else { return nil } return resetsAt.addingTimeInterval(-Double(durationMinutes) * 60) @@ -156,12 +163,7 @@ public struct ProviderUsageSnapshot: Codable, Equatable, Sendable { } public var longestWindow: QuotaWindow? { - windows.max { left, right in - let leftDuration = left.durationMinutes ?? 0 - let rightDuration = right.durationMinutes ?? 0 - if leftDuration != rightDuration { return leftDuration < rightDuration } - return left.usedPercentage < right.usedPercentage - } + windows.max(by: QuotaWindow.displayOrder) } } diff --git a/Tests/TokenGaugeAppTests/ActivityChartScopeTests.swift b/Tests/TokenGaugeAppTests/ActivityChartScopeTests.swift deleted file mode 100644 index e744d63..0000000 --- a/Tests/TokenGaugeAppTests/ActivityChartScopeTests.swift +++ /dev/null @@ -1,82 +0,0 @@ -import Foundation -import TokenGaugeCore -import XCTest - -@testable import TokenGaugeApp - -@MainActor -final class ActivityChartScopeTests: XCTestCase { - private var calendar: Calendar { - var calendar = Calendar(identifier: .gregorian) - calendar.timeZone = TimeZone(secondsFromGMT: 0)! - return calendar - } - - private var today: Date { - calendar.date(from: DateComponents(year: 2026, month: 9, day: 7))! - } - - func testHiddenProviderCannotAffectScaleOrSummary() { - for provider in UsageProvider.allCases { - let other: UsageProvider = provider == .claude ? .codex : .claude - let small = snapshot(provider, tokens: 50) - let huge = snapshot(other, tokens: 9_000_000) - let data = ActivityChartData( - claude: provider == .claude ? small : huge, - codex: provider == .codex ? small : huge, - providers: [provider], now: today, calendar: calendar) - XCTAssertEqual(data.providers, [provider]) - XCTAssertEqual(data.maximumTokens, 50) - let day = data.days.last! - let summary = data.summary(for: day, locale: Locale(identifier: "en_US")) - XCTAssertTrue(summary.contains(provider == .claude ? "Claude" : "Codex")) - XCTAssertFalse(summary.contains(provider == .claude ? "Codex" : "Claude")) - XCTAssertTrue(summary.contains("50")) - XCTAssertFalse(summary.contains("9M")) - XCTAssertEqual(Double(day.tokens(for: provider)) / Double(data.maximumTokens), 1) - } - } - - func testUnifiedIncludesBothAndDeduplicatesDaysAndProviders() { - let data = ActivityChartData( - claude: snapshot(.claude, tokens: 50, duplicateTokens: 25), - codex: snapshot(.codex, tokens: 100), providers: [.claude, .codex, .claude], - now: today, calendar: calendar) - XCTAssertEqual(data.providers, [.claude, .codex]) - XCTAssertEqual(data.days.count, 7) - XCTAssertEqual(Set(data.days.map(\.id)).count, 7) - XCTAssertEqual(data.days.first?.id, "2026-09-01") - XCTAssertEqual(data.days.last?.id, "2026-09-07") - XCTAssertEqual(data.maximumTokens, 100) - let day = data.days.last! - XCTAssertEqual(Double(day.claudeTokens) / Double(data.maximumTokens), 0.5) - let summary = data.summary(for: day, locale: Locale(identifier: "en_US")) - XCTAssertTrue(summary.contains("Claude 50")) - XCTAssertTrue(summary.contains("Codex 100")) - } - - func testSelectionSurvivesInputChangeAndFallsBackWhenDayLeavesWindow() { - let first = ActivityChartData(claude: nil, codex: nil, now: today, calendar: calendar) - let selectedKey = first.days.first!.id - let changed = ActivityChartData( - claude: snapshot(.claude, tokens: 10), codex: nil, providers: [.claude], - now: today, calendar: calendar) - XCTAssertEqual(changed.selectedDay(key: selectedKey)?.id, selectedKey) - let tomorrow = ActivityChartData( - claude: nil, codex: nil, now: calendar.date(byAdding: .day, value: 1, to: today)!, calendar: calendar) - XCTAssertEqual(tomorrow.selectedDay(key: selectedKey)?.id, "2026-09-08") - XCTAssertEqual(tomorrow.selectedDay(key: "2026-09-07")?.id, "2026-09-07") - XCTAssertEqual(tomorrow.maximumTokens, 1) - XCTAssertEqual(tomorrow.providers, [.claude, .codex]) - } - - private func snapshot( - _ provider: UsageProvider, tokens: Int, duplicateTokens: Int? = nil - ) -> ProviderUsageSnapshot { - var daily = [DailyTokenUsage(day: "2026-09-07", tokens: tokens)] - if let duplicateTokens { daily.append(DailyTokenUsage(day: "2026-09-07", tokens: duplicateTokens)) } - return ProviderUsageSnapshot( - provider: provider, windows: [], dailyUsage: daily, summary: nil, - availableResetCredits: nil, creditBalance: nil, capturedAt: today) - } -} diff --git a/Tests/TokenGaugeAppTests/ClaudeAccountHeaderRenderingTests.swift b/Tests/TokenGaugeAppTests/ClaudeAccountHeaderRenderingTests.swift index b4d7a0c..85cc973 100644 --- a/Tests/TokenGaugeAppTests/ClaudeAccountHeaderRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/ClaudeAccountHeaderRenderingTests.swift @@ -10,10 +10,7 @@ final class ClaudeAccountHeaderRenderingTests: XCTestCase { private let label = "very.long.account.name.for.layout@example.com" func testLongAccountLabelKeepsTheHeaderOnOneRowAndTruncatesOnlyItself() throws { - let language = LocalizationManager.shared.language - defer { LocalizationManager.shared.language = language } - for language in AppLanguage.allCases { - LocalizationManager.shared.language = language + try withEachLanguage { _ in let plain = try render(card(accountLabel: nil)) let labelled = try render(card(accountLabel: label)) let longer = try render(card(accountLabel: label + label)) @@ -25,17 +22,16 @@ final class ClaudeAccountHeaderRenderingTests: XCTestCase { } func testPreviewStoresExposeTheAccountLabelWithoutReadingTheRealConfiguration() throws { - let suite = "TokenGauge.account.\(UUID().uuidString)" - let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) - defer { defaults.removePersistentDomain(forName: suite) } - let store = UsageStore(defaults: defaults, initialSnapshots: [snapshot()], historyReadsEnabled: false) - - XCTAssertNil(store.claudeAccountLabel) - store.setPreviewAccountLabel(label) - XCTAssertEqual(store.claudeAccountLabel, label) - XCTAssertNil(store.claudeAccountFingerprint) - let view = NSHostingView(rootView: PopoverView(store: store, showSettings: {}, showAbout: {})) - XCTAssertLessThanOrEqual(view.fittingSize.height, Theme.Layout.maximumPanelHeight) + try withDefaults { defaults in + let store = Fixture.store(defaults: defaults, snapshots: [snapshot()]) + + XCTAssertNil(store.claudeAccountLabel) + store.setPreviewAccountLabel(label) + XCTAssertEqual(store.claudeAccountLabel, label) + XCTAssertNil(store.claudeAccountFingerprint) + let size = fittingSize(PopoverView(store: store, showSettings: {}, showAbout: {})) + XCTAssertLessThanOrEqual(size.height, Theme.Layout.maximumPanelHeight) + } } private func card(accountLabel: String?) -> some View { @@ -47,25 +43,12 @@ final class ClaudeAccountHeaderRenderingTests: XCTestCase { } private func snapshot() -> ProviderUsageSnapshot { - ProviderUsageSnapshot( - provider: .claude, + Fixture.snapshot( + .claude, windows: [ - QuotaWindow( + Fixture.window( id: "seven_day", usedPercentage: 30, resetsAt: Date().addingTimeInterval(86_400), - durationMinutes: 10_080, displayName: nil) - ], dailyUsage: [], summary: nil, availableResetCredits: nil, creditBalance: nil, - capturedAt: Date().addingTimeInterval(-600)) - } - - private func render(_ content: some View) throws -> NSBitmapImageRep { - let view = NSHostingView(rootView: content.environment(\.quotaAnimationsEnabled, false)) - view.frame = NSRect(origin: .zero, size: view.fittingSize) - let window = NSWindow(contentRect: view.frame, styleMask: [.borderless], backing: .buffered, defer: false) - window.contentView = view - defer { window.contentView = nil } - view.layoutSubtreeIfNeeded() - let bitmap = try XCTUnwrap(view.bitmapImageRepForCachingDisplay(in: view.bounds)) - view.cacheDisplay(in: view.bounds, to: bitmap) - return bitmap + durationMinutes: 10_080) + ], capturedAt: Date().addingTimeInterval(-600)) } } diff --git a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift index 8e8975d..a74d9f8 100644 --- a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift @@ -50,6 +50,24 @@ final class HistoryDashboardTests: XCTestCase { XCTAssertNil(days.first { $0.id == "2026-09-10" }?.tokens(for: .codex)) } + func testHiddenProviderCannotAffectScopedTotalsOrDominance() throws { + let now = calendar.date(from: DateComponents(year: 2026, month: 9, day: 7))! + let interval = HistoryDashboardModel.interval(mode: .recent, offset: 0, now: now, calendar: calendar) + let days = HistoryDashboardModel.makeDays( + interval: interval, + tokens: [ + HistoryTokenRow(day: "2026-09-07", provider: .claude, model: "all", tokens: 50), + HistoryTokenRow(day: "2026-09-07", provider: .codex, model: "all", tokens: 9_000_000), + ], efforts: [], calendar: calendar) + let day = try XCTUnwrap(days.last) + XCTAssertEqual(day.id, "2026-09-07") + XCTAssertEqual(day.total(for: [.claude]), 50) + XCTAssertEqual(day.total(for: [.codex]), 9_000_000) + XCTAssertEqual(day.total(for: [.claude, .codex]), 9_000_050) + XCTAssertEqual(day.dominantProviders(for: [.claude]), [.claude]) + XCTAssertEqual(day.dominantProviders(for: [.codex, .claude]), [.codex]) + } + func testEffortOnlyHistoryHasAUsableObservedTotal() { let now = calendar.date(from: DateComponents(year: 2026, month: 9, day: 12))! let interval = HistoryDashboardModel.interval(mode: .recent, offset: 0, now: now, calendar: calendar) diff --git a/Tests/TokenGaugeAppTests/MenuBarPresentationTests.swift b/Tests/TokenGaugeAppTests/MenuBarPresentationTests.swift index ebc4fee..f19c219 100644 --- a/Tests/TokenGaugeAppTests/MenuBarPresentationTests.swift +++ b/Tests/TokenGaugeAppTests/MenuBarPresentationTests.swift @@ -211,13 +211,11 @@ final class MenuBarPresentationTests: XCTestCase { private func state(provider: UsageProvider, status: ProviderStatus, usedPercentage: Double? = nil) -> ProviderViewState { - let window = QuotaWindow( + let window = Fixture.window( id: provider == .codex ? "codex.primary" : "seven_day", usedPercentage: usedPercentage ?? (provider == .codex ? 80 : 40), - resetsAt: Date().addingTimeInterval(86_400), durationMinutes: 10_080, displayName: nil) - let snapshot = ProviderUsageSnapshot( - provider: provider, windows: [window], dailyUsage: [], summary: nil, - availableResetCredits: nil, creditBalance: nil, capturedAt: Date()) + resetsAt: Date().addingTimeInterval(86_400), durationMinutes: 10_080) + let snapshot = Fixture.snapshot(provider, windows: [window]) return ProviderViewState(snapshot: snapshot, status: status, isRefreshing: false) } } diff --git a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift index 4cfb8a7..55506c2 100644 --- a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift @@ -8,10 +8,7 @@ import XCTest @MainActor final class QuotaPanelRenderingTests: XCTestCase { func testNewStylesRenderOneTwoAndThreeWindowsAtSupportedWidths() throws { - let originalLanguage = LocalizationManager.shared.language - defer { LocalizationManager.shared.language = originalLanguage } - for language in AppLanguage.allCases { - LocalizationManager.shared.language = language + try withEachLanguage { _ in for style in [QuotaPanelStyle.compact, .rings] { for count in 1...3 { for width: CGFloat in style == .rings ? [240, 334] : [334, 414] { @@ -27,10 +24,7 @@ final class QuotaPanelRenderingTests: XCTestCase { } func testCompactOneAndTwoWindowCardsStayBelowCombinedHeightBudget() throws { - let originalLanguage = LocalizationManager.shared.language - defer { LocalizationManager.shared.language = originalLanguage } - for language in AppLanguage.allCases { - LocalizationManager.shared.language = language + try withEachLanguage { _ in var combinedHeight: CGFloat = Theme.Layout.sectionSpacing for count in 1...2 { let card = ProviderCard( @@ -54,10 +48,7 @@ final class QuotaPanelRenderingTests: XCTestCase { } func testProportionalRingWidthsKeepTwoAndThreeWindowsOnOneRow() throws { - let originalLanguage = LocalizationManager.shared.language - defer { LocalizationManager.shared.language = originalLanguage } - for language in AppLanguage.allCases { - LocalizationManager.shared.language = language + try withEachLanguage { _ in for count in [2, 3] { let width = CGFloat(count) * Theme.Layout.quotaRingCellWidth + Theme.Layout.cardPadding * 2 let card = ProviderCard( @@ -100,11 +91,8 @@ final class QuotaPanelRenderingTests: XCTestCase { } func testAdaptiveRingCardsRenderEveryWindowCountWithinThePanelHeight() throws { - let originalLanguage = LocalizationManager.shared.language - defer { LocalizationManager.shared.language = originalLanguage } let width = Theme.Layout.ringPanelWidth - Theme.Layout.panelPadding * 2 - for language in AppLanguage.allCases { - LocalizationManager.shared.language = language + try withEachLanguage { _ in for count in 1...3 { let claude = ProviderCard( provider: .claude, state: state(count: count), panelStyle: .rings, showProviderTitle: true, @@ -183,48 +171,33 @@ final class QuotaPanelRenderingTests: XCTestCase { private func state(count: Int, status: ProviderStatus = .ready) -> ProviderViewState { let windows = [ - QuotaWindow( + Fixture.window( id: "five_hour", usedPercentage: 2, resetsAt: Date().addingTimeInterval(7200), - durationMinutes: 300, displayName: nil), - QuotaWindow( + durationMinutes: 300), + Fixture.window( id: "seven_day", usedPercentage: 25, resetsAt: Date().addingTimeInterval(172800), - durationMinutes: 10080, displayName: nil), - QuotaWindow( + durationMinutes: 10080), + Fixture.window( id: "seven_day_fable", usedPercentage: 88, resetsAt: Date().addingTimeInterval(172800), durationMinutes: 10080, displayName: "Fable"), ] - let snapshot = ProviderUsageSnapshot( - provider: .claude, windows: Array(windows.prefix(count)), dailyUsage: [], summary: nil, - availableResetCredits: 2, creditBalance: nil, capturedAt: Date().addingTimeInterval(-600)) + let snapshot = Fixture.snapshot( + .claude, windows: Array(windows.prefix(count)), availableResetCredits: 2, + capturedAt: Date().addingTimeInterval(-600)) return ProviderViewState(snapshot: snapshot, status: status, isRefreshing: false) } private func codexState(count: Int, status: ProviderStatus = .ready) -> ProviderViewState { let windows = [ - QuotaWindow( + Fixture.window( id: "codex.weekly", usedPercentage: 41, resetsAt: Date().addingTimeInterval(172800), - durationMinutes: 10080, displayName: nil), - QuotaWindow( + durationMinutes: 10080), + Fixture.window( id: "base_model_inference.weekly", usedPercentage: 12, resetsAt: Date().addingTimeInterval(172800), durationMinutes: 10080, displayName: "gpt-reserve"), ] - let snapshot = ProviderUsageSnapshot( - provider: .codex, windows: Array(windows.prefix(count)), dailyUsage: [], summary: nil, - availableResetCredits: nil, creditBalance: nil, capturedAt: Date().addingTimeInterval(-600)) + let snapshot = Fixture.snapshot( + .codex, windows: Array(windows.prefix(count)), capturedAt: Date().addingTimeInterval(-600)) return ProviderViewState(snapshot: snapshot, status: status, isRefreshing: false) } - - private func render(_ content: some View, maximumHeight: CGFloat) throws -> NSBitmapImageRep { - let view = NSHostingView(rootView: content.environment(\.quotaAnimationsEnabled, false)) - let size = view.fittingSize - XCTAssertLessThanOrEqual(size.height, maximumHeight) - view.frame = NSRect(origin: .zero, size: size) - let window = NSWindow(contentRect: view.frame, styleMask: [.borderless], backing: .buffered, defer: false) - window.contentView = view - defer { window.contentView = nil } - view.layoutSubtreeIfNeeded() - let bitmap = try XCTUnwrap(view.bitmapImageRepForCachingDisplay(in: view.bounds)) - view.cacheDisplay(in: view.bounds, to: bitmap) - return bitmap - } } diff --git a/Tests/TokenGaugeAppTests/ScreenshotTests.swift b/Tests/TokenGaugeAppTests/ScreenshotTests.swift index 667f5f9..bc51c7a 100644 --- a/Tests/TokenGaugeAppTests/ScreenshotTests.swift +++ b/Tests/TokenGaugeAppTests/ScreenshotTests.swift @@ -35,27 +35,27 @@ final class ScreenshotTests: XCTestCase { } let snapshots = UsageProvider.allCases.map { provider in var windows = [ - QuotaWindow( + Fixture.window( id: "\(provider.rawValue).primary", usedPercentage: provider == .codex ? 28 : 42, - resetsAt: now.addingTimeInterval(4 * 86400), durationMinutes: 10080, displayName: nil) + resetsAt: now.addingTimeInterval(4 * 86400), durationMinutes: 10080) ] if provider == .codex { windows.append( - QuotaWindow( + Fixture.window( id: "base_model_inference.primary", usedPercentage: 0, - resetsAt: now.addingTimeInterval(6 * 86400), durationMinutes: 10080, displayName: "gpt-reserve") + resetsAt: now.addingTimeInterval(6 * 86400), durationMinutes: 10080, + displayName: "gpt-reserve") ) } - return ProviderUsageSnapshot( - provider: provider, + return Fixture.snapshot( + provider, windows: windows, dailyUsage: activity.enumerated().map { index, usage in let tokens = provider == .codex ? usage.tokens : (index >= 3 && index <= 5 ? 0 : usage.tokens / 3) return DailyTokenUsage(day: usage.day, tokens: tokens) - }, - summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: now) + }, capturedAt: now) } - let store = UsageStore(defaults: defaults, initialSnapshots: snapshots, historyReadsEnabled: false) + let store = Fixture.store(defaults: defaults, snapshots: snapshots) try render( PopoverView(store: store, showSettings: {}, showAbout: {}), to: output.appendingPathComponent("panel.png")) store.displayMode = .claude @@ -70,20 +70,19 @@ final class ScreenshotTests: XCTestCase { SettingsView(store: store, launchAtLogin: LaunchAtLoginManager()).defaultAppStorage(defaults) }.frame(width: 600, height: 750), to: output.appendingPathComponent("settings.png"), maximumHeight: 750) - let historical = ProviderUsageSnapshot( - provider: .claude, + let historical = Fixture.snapshot( + .claude, windows: [ - QuotaWindow( - id: "five_hour", usedPercentage: 2, resetsAt: now.addingTimeInterval(10_800), durationMinutes: 300, - displayName: nil), - QuotaWindow( + Fixture.window( + id: "five_hour", usedPercentage: 2, resetsAt: now.addingTimeInterval(10_800), + durationMinutes: 300), + Fixture.window( id: "seven_day", usedPercentage: 60, resetsAt: now.addingTimeInterval(172_800), - durationMinutes: 10_080, displayName: nil), - QuotaWindow( + durationMinutes: 10_080), + Fixture.window( id: "seven_day_fable", usedPercentage: 88, resetsAt: now.addingTimeInterval(172_800), durationMinutes: 10_080, displayName: "Fable"), - ], dailyUsage: [], summary: nil, availableResetCredits: nil, creditBalance: nil, - capturedAt: now.addingTimeInterval(-3600)) + ], capturedAt: now.addingTimeInterval(-3600)) store.claudeAutomaticRecovery = true store.applyRefreshResults( claudeResult: ClaudeUsageResult(snapshot: historical, access: .credentialExpired, lastActivityAt: nil), @@ -175,33 +174,4 @@ final class ScreenshotTests: XCTestCase { XCTAssertEqual(fitted.width, Theme.Layout.minimumRingUnifiedWidth) } - - @discardableResult - private func render(_ content: some View, to output: URL, maximumHeight: CGFloat = Theme.Layout.maximumPanelHeight) - throws -> NSSize - { - let application = NSApplication.shared - let previousAppearance = application.appearance - application.appearance = NSAppearance(named: .darkAqua) - defer { application.appearance = previousAppearance } - let view = NSHostingView( - rootView: content.background(Color(nsColor: .windowBackgroundColor)).environment(\.colorScheme, .dark)) - view.appearance = NSAppearance(named: .darkAqua) - let size = view.fittingSize - XCTAssertGreaterThan(size.width, 200) - XCTAssertLessThanOrEqual(size.height, maximumHeight) - view.frame = NSRect(origin: .zero, size: size) - let window = NSWindow(contentRect: view.frame, styleMask: [.borderless], backing: .buffered, defer: false) - window.backgroundColor = .windowBackgroundColor - window.contentView = view - view.layoutSubtreeIfNeeded() - let bitmap = try XCTUnwrap(view.bitmapImageRepForCachingDisplay(in: view.bounds)) - view.appearance?.performAsCurrentDrawingAppearance { - view.cacheDisplay(in: view.bounds, to: bitmap) - } - let png = try XCTUnwrap(bitmap.representation(using: .png, properties: [:])) - try png.write(to: output) - window.contentView = nil - return size - } } diff --git a/Tests/TokenGaugeAppTests/Support/Fixtures.swift b/Tests/TokenGaugeAppTests/Support/Fixtures.swift new file mode 100644 index 0000000..2b69059 --- /dev/null +++ b/Tests/TokenGaugeAppTests/Support/Fixtures.swift @@ -0,0 +1,53 @@ +import Foundation +import TokenGaugeCore +import XCTest + +@testable import TokenGaugeApp + +enum Fixture { + static func window( + id: String, + usedPercentage: Double = 10, + resetsAt: Date? = nil, + durationMinutes: Int? = nil, + displayName: String? = nil + ) -> QuotaWindow { + QuotaWindow( + id: id, usedPercentage: usedPercentage, resetsAt: resetsAt, durationMinutes: durationMinutes, + displayName: displayName) + } + + static func snapshot( + _ provider: UsageProvider, + windows: [QuotaWindow] = [], + dailyUsage: [DailyTokenUsage] = [], + availableResetCredits: Int? = nil, + capturedAt: Date? = Date() + ) -> ProviderUsageSnapshot { + ProviderUsageSnapshot( + provider: provider, windows: windows, dailyUsage: dailyUsage, summary: nil, + availableResetCredits: availableResetCredits, creditBalance: nil, capturedAt: capturedAt) + } + + @MainActor + static func store(defaults: UserDefaults, snapshots: [ProviderUsageSnapshot] = []) -> UsageStore { + UsageStore(defaults: defaults, initialSnapshots: snapshots, historyReadsEnabled: false) + } +} + +func withDefaults(_ body: (UserDefaults) throws -> Void) throws { + let suite = "TokenGauge.tests.\(UUID().uuidString)" + let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) + defer { defaults.removePersistentDomain(forName: suite) } + try body(defaults) +} + +@MainActor +func withEachLanguage(_ body: (AppLanguage) throws -> Void) rethrows { + try withCurrentLanguage { + for language in AppLanguage.allCases { + LocalizationManager.shared.language = language + try body(language) + } + } +} diff --git a/Tests/TokenGaugeAppTests/Support/Rendering.swift b/Tests/TokenGaugeAppTests/Support/Rendering.swift new file mode 100644 index 0000000..1df94cf --- /dev/null +++ b/Tests/TokenGaugeAppTests/Support/Rendering.swift @@ -0,0 +1,62 @@ +import AppKit +import SwiftUI +import XCTest + +@testable import TokenGaugeApp + +@MainActor +func withCurrentLanguage(_ body: () throws -> Void) rethrows { + let language = LocalizationManager.shared.language + defer { LocalizationManager.shared.language = language } + try body() +} + +@MainActor +func fittingSize(_ content: some View) -> NSSize { + NSHostingView(rootView: content.environment(\.quotaAnimationsEnabled, false)).fittingSize +} + +@MainActor +func render(_ content: some View, maximumHeight: CGFloat? = nil) throws -> NSBitmapImageRep { + let view = NSHostingView(rootView: content.environment(\.quotaAnimationsEnabled, false)) + let size = view.fittingSize + if let maximumHeight { XCTAssertLessThanOrEqual(size.height, maximumHeight) } + view.frame = NSRect(origin: .zero, size: size) + let window = NSWindow(contentRect: view.frame, styleMask: [.borderless], backing: .buffered, defer: false) + window.contentView = view + defer { window.contentView = nil } + view.layoutSubtreeIfNeeded() + let bitmap = try XCTUnwrap(view.bitmapImageRepForCachingDisplay(in: view.bounds)) + view.cacheDisplay(in: view.bounds, to: bitmap) + return bitmap +} + +@MainActor +@discardableResult +func render(_ content: some View, to output: URL, maximumHeight: CGFloat = Theme.Layout.maximumPanelHeight) throws + -> NSSize +{ + let application = NSApplication.shared + let previousAppearance = application.appearance + application.appearance = NSAppearance(named: .darkAqua) + defer { application.appearance = previousAppearance } + let view = NSHostingView( + rootView: content.background(Color(nsColor: .windowBackgroundColor)).environment(\.colorScheme, .dark)) + view.appearance = NSAppearance(named: .darkAqua) + let size = view.fittingSize + XCTAssertGreaterThan(size.width, 200) + XCTAssertLessThanOrEqual(size.height, maximumHeight) + view.frame = NSRect(origin: .zero, size: size) + let window = NSWindow(contentRect: view.frame, styleMask: [.borderless], backing: .buffered, defer: false) + window.backgroundColor = .windowBackgroundColor + window.contentView = view + view.layoutSubtreeIfNeeded() + let bitmap = try XCTUnwrap(view.bitmapImageRepForCachingDisplay(in: view.bounds)) + view.appearance?.performAsCurrentDrawingAppearance { + view.cacheDisplay(in: view.bounds, to: bitmap) + } + let png = try XCTUnwrap(bitmap.representation(using: .png, properties: [:])) + try png.write(to: output) + window.contentView = nil + return size +} diff --git a/Tests/TokenGaugeAppTests/WindowVisibilityTests.swift b/Tests/TokenGaugeAppTests/WindowVisibilityTests.swift index 969c377..cb85753 100644 --- a/Tests/TokenGaugeAppTests/WindowVisibilityTests.swift +++ b/Tests/TokenGaugeAppTests/WindowVisibilityTests.swift @@ -7,9 +7,10 @@ import XCTest final class WindowVisibilityTests: XCTestCase { func testCodexKeepsOnlyTheWeeklyMainlineWindow() { let windows = [ - window(id: "codex_bengalfox.primary", duration: 300, name: "GPT-5.3-Codex-Spark"), - window(id: "codex.primary", duration: 10_080, name: nil), - window(id: "codex_bengalfox.secondary", duration: 10_080, name: "GPT-5.3-Codex-Spark"), + Fixture.window(id: "codex_bengalfox.primary", durationMinutes: 300, displayName: "GPT-5.3-Codex-Spark"), + Fixture.window(id: "codex.primary", durationMinutes: 10_080), + Fixture.window( + id: "codex_bengalfox.secondary", durationMinutes: 10_080, displayName: "GPT-5.3-Codex-Spark"), ] let visible = WindowVisibility.visible(windows, provider: .codex) @@ -19,8 +20,8 @@ final class WindowVisibilityTests: XCTestCase { func testCodexFallsBackToMainlineWindowsWhenNoWeeklyExists() { let windows = [ - window(id: "codex.primary", duration: 300, name: nil), - window(id: "codex_spark.primary", duration: 300, name: "Spark"), + Fixture.window(id: "codex.primary", durationMinutes: 300), + Fixture.window(id: "codex_spark.primary", durationMinutes: 300, displayName: "Spark"), ] XCTAssertEqual(WindowVisibility.visible(windows, provider: .codex).map(\.id), ["codex.primary"]) @@ -28,8 +29,8 @@ final class WindowVisibilityTests: XCTestCase { func testClaudeKeepsEveryOfficialWindow() { let windows = [ - window(id: "five_hour", duration: 300, name: nil), - window(id: "seven_day", duration: 10_080, name: nil), + Fixture.window(id: "five_hour", durationMinutes: 300), + Fixture.window(id: "seven_day", durationMinutes: 10_080), ] XCTAssertEqual(WindowVisibility.visible(windows, provider: .claude).map(\.id), ["five_hour", "seven_day"]) @@ -57,10 +58,6 @@ final class WindowVisibilityTests: XCTestCase { XCTAssertEqual(chips.map(\.tokens), [400, 100]) } - private func window(id: String, duration: Int, name: String?) -> QuotaWindow { - QuotaWindow(id: id, usedPercentage: 10, resetsAt: nil, durationMinutes: duration, displayName: name) - } - private func bucket(hour: Date, model: String, tokens: Int) -> ModelTokenBucket { ModelTokenBucket(day: "2033-05-18", hourStart: hour, model: model, tokens: tokens) } diff --git a/Tests/TokenGaugeCoreTests/UsageModelsTests.swift b/Tests/TokenGaugeCoreTests/UsageModelsTests.swift new file mode 100644 index 0000000..fb2e782 --- /dev/null +++ b/Tests/TokenGaugeCoreTests/UsageModelsTests.swift @@ -0,0 +1,28 @@ +import Foundation +import XCTest + +@testable import TokenGaugeCore + +final class UsageModelsTests: XCTestCase { + func testDisplayOrderSortsUnknownDurationsLastAndBreaksTiesByIdentifier() { + let windows = [ + window(id: "seven_day", duration: 10_080), + window(id: "unknown", duration: nil), + window(id: "five_hour", duration: 300), + window(id: "all_weekly", duration: 10_080), + ] + + let sorted = windows.sorted(by: QuotaWindow.displayOrder) + + XCTAssertEqual(sorted.map(\.id), ["five_hour", "all_weekly", "seven_day", "unknown"]) + XCTAssertEqual( + ProviderUsageSnapshot( + provider: .claude, windows: windows, dailyUsage: [], summary: nil, + availableResetCredits: nil, creditBalance: nil, capturedAt: nil + ).longestWindow?.id, "unknown") + } + + private func window(id: String, duration: Int?) -> QuotaWindow { + QuotaWindow(id: id, usedPercentage: 10, resetsAt: nil, durationMinutes: duration, displayName: nil) + } +} From e5fc5d6dafe6b3654e035121aacd532ac2366608 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:53:25 -0500 Subject: [PATCH 07/21] fix(quota,updates): shared ring width formula, ViewThatFits cards, persisted deferred update and idle-safe update phases --- .../Services/UpdateManager.swift | 37 ++++- Sources/TokenGaugeApp/Views/AboutView.swift | 40 +++-- Sources/TokenGaugeApp/Views/PopoverView.swift | 11 +- .../TokenGaugeApp/Views/ProviderCard.swift | 8 +- Sources/TokenGaugeApp/Views/QuotaRing.swift | 4 +- .../TokenGaugeApp/Views/QuotaRingGrid.swift | 6 +- .../TokenGaugeApp/Views/QuotaRingLayout.swift | 69 +++++---- .../QuotaPanelRenderingTests.swift | 6 +- .../QuotaRingLayoutTests.swift | 38 ++++- .../TokenGaugeAppTests/ScreenshotTests.swift | 13 +- .../UpdateBannerRenderingTests.swift | 21 +++ .../UpdateManagerTests.swift | 140 +++++++++++++++++- 12 files changed, 312 insertions(+), 81 deletions(-) diff --git a/Sources/TokenGaugeApp/Services/UpdateManager.swift b/Sources/TokenGaugeApp/Services/UpdateManager.swift index 9d09827..6be1077 100644 --- a/Sources/TokenGaugeApp/Services/UpdateManager.swift +++ b/Sources/TokenGaugeApp/Services/UpdateManager.swift @@ -40,6 +40,7 @@ final class UpdateManager: ObservableObject { static let autoCheckDefaultsKey = "autoUpdateCheckEnabled" nonisolated static let feedOverrideDefaultsKey = "updateFeedURLOverride" + static let deferredVersionDefaultsKey = "deferredUpdateVersion" static let progressPublishInterval: TimeInterval = 0.05 static let failureMessageKey = "updates.failed" @@ -103,7 +104,7 @@ final class UpdateManager: ObservableObject { isDevelopmentBuild: Bool ) -> String? { if isDevelopmentBuild, let qa = qaFeedURL(environment: environment) { return qa } - if let override, let url = URL(string: override), url.scheme == "http" || url.scheme == "https" { + if let override, let url = URL(string: override), url.scheme == "https" { return override } return nil @@ -156,6 +157,8 @@ final class UpdateManager: ObservableObject { self.driver = driver self.updaterDelegate = updaterDelegate self.updater = updater + + if deferredVersion != nil { updater.checkForUpdatesInBackground() } } func setAutoCheckEnabled(_ enabled: Bool) { @@ -183,6 +186,7 @@ final class UpdateManager: ObservableObject { } installRequested = false resumeInstallRequested = false + deferredVersion = nil phase = .installing(version: version) let reply = readyReply readyReply = nil @@ -196,6 +200,7 @@ final class UpdateManager: ObservableObject { let reply = readyReply readyReply = nil reply?(.dismiss) + deferredVersion = version phase = .readyToInstall(version: version, deferred: true) } @@ -213,6 +218,7 @@ final class UpdateManager: ObservableObject { guard let updater else { handleManualCheckStarted() finishManualCheck(status: .failed) + phase = idleOrPendingPhase return } guard updater.sessionInProgress == false else { return } @@ -251,6 +257,7 @@ final class UpdateManager: ObservableObject { let decision = Self.decideUpdateFound( version: version, stage: stage, installRequested: installRequested, informationOnly: informationOnly) installRequested = decision.choice == .install + deferredVersion = decision.phase == .readyToInstall(version: version, deferred: true) ? version : nil phase = decision.phase return decision.choice } @@ -275,6 +282,9 @@ final class UpdateManager: ObservableObject { func handleExtractionStarted() { lastProgressPublish = .distantPast + if case .downloading(let version, let fraction) = phase, fraction != 1 { + phase = .downloading(version: version, fraction: 1) + } phase = .extracting(version: pendingVersion ?? "", fraction: nil) } @@ -288,6 +298,7 @@ final class UpdateManager: ObservableObject { if resumeInstallRequested || installRequested { installRequested = false resumeInstallRequested = false + deferredVersion = nil phase = .installing(version: version) reply(.install) return @@ -307,6 +318,7 @@ final class UpdateManager: ObservableObject { pendingVersion = nil pendingIsInformationOnly = false releasePageURL = nil + deferredVersion = nil phase = .idle finishManualCheck(status: .upToDate) } @@ -319,7 +331,7 @@ final class UpdateManager: ObservableObject { phase = .failed(message: Self.failureMessageKey) } else { log.debug("Update check failed silently") - phase = pendingVersion.map { .available(version: $0) } ?? .idle + phase = idleOrPendingPhase } installRequested = false resumeInstallRequested = false @@ -330,13 +342,28 @@ final class UpdateManager: ObservableObject { resumeInstallRequested = false readyReply = nil switch phase { - case .downloading, .extracting, .installing: - phase = pendingVersion.map { .available(version: $0) } ?? .idle - case .idle, .checking, .available, .readyToInstall, .failed: + case .checking, .downloading, .extracting, .installing: + phase = idleOrPendingPhase + case .idle, .available, .readyToInstall, .failed: break } } + private var idleOrPendingPhase: Phase { + pendingVersion.map { .available(version: $0) } ?? .idle + } + + private var deferredVersion: String? { + get { defaults.string(forKey: Self.deferredVersionDefaultsKey) } + set { + if let newValue { + defaults.set(newValue, forKey: Self.deferredVersionDefaultsKey) + } else { + defaults.removeObject(forKey: Self.deferredVersionDefaultsKey) + } + } + } + private func publish(_ next: Phase, force: Bool) { let instant = now() guard force || instant.timeIntervalSince(lastProgressPublish) >= Self.progressPublishInterval else { return } diff --git a/Sources/TokenGaugeApp/Views/AboutView.swift b/Sources/TokenGaugeApp/Views/AboutView.swift index 187a0d1..ceaaa12 100644 --- a/Sources/TokenGaugeApp/Views/AboutView.swift +++ b/Sources/TokenGaugeApp/Views/AboutView.swift @@ -62,25 +62,43 @@ struct AboutView: View { } struct UpdateActionView: View { - @ObservedObject private var updates = UpdateManager.shared + @ObservedObject var updates: UpdateManager + + init(updates: UpdateManager = .shared) { + self.updates = updates + } var body: some View { Group { switch updates.phase { case .idle: - switch updates.manualCheckStatus { - case .checking: - Label("updates.checking".localized, systemImage: "clock") - case .upToDate: - Label("updates.current".localized, systemImage: "checkmark.circle") - case .failed: - Button("updates.check_failed".localized) { updates.checkForUpdatesManually() } - case .idle: - Button("updates.check".localized) { updates.checkForUpdatesManually() } + checkControl + case .available: + Button("updates.download".localized) { updates.installPendingUpdate() } + .buttonStyle(.borderedProminent) + case .readyToInstall(let version, true): + VStack(spacing: 8) { + Button("updates.install_version".localized(version)) { updates.resumeDeferredInstall() } + .buttonStyle(.borderedProminent) + checkControl } - default: + case .checking, .downloading, .extracting, .installing, .readyToInstall, .failed: UpdateBannerView(updates: updates) } }.font(.callout).frame(maxWidth: .infinity, alignment: .center) } + + @ViewBuilder + private var checkControl: some View { + switch updates.manualCheckStatus { + case .checking: + Label("updates.checking".localized, systemImage: "clock") + case .upToDate: + Label("updates.current".localized, systemImage: "checkmark.circle") + case .failed: + Button("updates.check_failed".localized) { updates.checkForUpdatesManually() } + case .idle: + Button("updates.check".localized) { updates.checkForUpdatesManually() } + } + } } diff --git a/Sources/TokenGaugeApp/Views/PopoverView.swift b/Sources/TokenGaugeApp/Views/PopoverView.swift index b918e52..9bb454f 100644 --- a/Sources/TokenGaugeApp/Views/PopoverView.swift +++ b/Sources/TokenGaugeApp/Views/PopoverView.swift @@ -191,17 +191,12 @@ struct PopoverView: View { } private func minimumRingWidth(_ count: CGFloat) -> CGFloat { - let cells = min(count, 3) - return max( - Theme.Layout.minimumRingCardWidth, - cells * Theme.Layout.quotaRingCellWidth + Theme.Layout.cardPadding * 2) + QuotaRingLayout.minimumCardWidth(cells: Int(count)) } private var ringUnifiedWidth: CGFloat { - let content = - minimumRingWidth(ringWindowCount(.codex)) + minimumRingWidth(ringWindowCount(.claude)) - + Theme.Layout.panelPadding * 2 + Theme.Layout.quotaRingSpacing - return min(max(content, Theme.Layout.minimumRingUnifiedWidth), Theme.Layout.ringUnifiedWidth) + QuotaRingLayout.unifiedPanelWidth( + codexCells: Int(ringWindowCount(.codex)), claudeCells: Int(ringWindowCount(.claude))) } private func ringCardWidth(for provider: UsageProvider) -> CGFloat? { diff --git a/Sources/TokenGaugeApp/Views/ProviderCard.swift b/Sources/TokenGaugeApp/Views/ProviderCard.swift index 18632ae..4cb0806 100644 --- a/Sources/TokenGaugeApp/Views/ProviderCard.swift +++ b/Sources/TokenGaugeApp/Views/ProviderCard.swift @@ -77,9 +77,9 @@ struct ProviderCard: View { showPace: canShowPace(window), pace: paces[window.id], previousPace: previousPaces[window.id], metrics: .single, alignsTitleRows: false) } else { - QuotaRingModeLayout(windows: visibleWindows.count) { - ringGrid.quotaRingVariant() - ringRows.quotaRingVariant() + ViewThatFits(in: .horizontal) { + ringGrid.frame(minWidth: QuotaRingLayout.minimumGridWidth(windows: visibleWindows.count)) + ringRows } } } else { @@ -178,7 +178,7 @@ struct ProviderCard: View { if !showsTitle { Spacer(minLength: 4) } if state.status == .ready, let credits = state.snapshot?.availableResetCredits, credits > 0 { Text(UsageFormatters.resetCredits(credits)) - .font(.system(size: 9, weight: .medium)) + .font(.system(size: 10, weight: .medium)) .foregroundStyle(.secondary) .padding(.horizontal, 6) .padding(.vertical, 2) diff --git a/Sources/TokenGaugeApp/Views/QuotaRing.swift b/Sources/TokenGaugeApp/Views/QuotaRing.swift index 5870ca0..dfb54d9 100644 --- a/Sources/TokenGaugeApp/Views/QuotaRing.swift +++ b/Sources/TokenGaugeApp/Views/QuotaRing.swift @@ -66,8 +66,9 @@ struct QuotaRingWindow: View { Text(UsageFormatters.reset(window.resetsAt)) .font(.system(size: 10)) .foregroundStyle(.secondary) + .lineLimit(1) + .truncationMode(.tail) .multilineTextAlignment(.center) - .fixedSize(horizontal: false, vertical: true) if showPace { QuotaPaceLabel(pace: pace, previousPace: previousPace) } if let summary = UsageFormatters.modelChips(chips) { Text(summary) @@ -119,6 +120,7 @@ struct QuotaRingRow: View { .font(.system(size: 10)) .foregroundStyle(.secondary) .lineLimit(1) + .truncationMode(.tail) if showPace { QuotaPaceLabel(pace: pace, previousPace: previousPace) } if let summary = UsageFormatters.modelChips(chips) { Text(summary) diff --git a/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift b/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift index 0b0155c..0e00828 100644 --- a/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift +++ b/Sources/TokenGaugeApp/Views/QuotaRingGrid.swift @@ -3,9 +3,7 @@ import SwiftUI struct QuotaRingGrid: Layout { func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { let cells = min(max(subviews.count, 1), 3) - let idealWidth = - CGFloat(cells) * Theme.Layout.quotaRingCellWidth - + CGFloat(cells - 1) * Theme.Layout.quotaRingSpacing + let idealWidth = QuotaRingLayout.minimumGridWidth(windows: cells) let width = proposal.width.flatMap { $0.isFinite ? max(0, $0) : nil } ?? idealWidth return geometry(width: width, subviews: subviews).size } @@ -27,7 +25,7 @@ struct QuotaRingGrid: Layout { var y: CGFloat = 0 for start in stride(from: 0, to: subviews.count, by: columns) { let count = min(columns, subviews.count - start) - let cellWidth = max(0, (width - CGFloat(count - 1) * spacing) / CGFloat(count)) + let cellWidth = max(0, QuotaRingLayout.cellWidth(availableWidth: width, columns: count)) let rowHeight = (start..<(start + count)).map { subviews[$0].sizeThatFits(ProposedViewSize(width: cellWidth, height: nil)).height diff --git a/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift b/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift index 8675895..a9e6a10 100644 --- a/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift +++ b/Sources/TokenGaugeApp/Views/QuotaRingLayout.swift @@ -9,12 +9,44 @@ enum QuotaRingLayout { static func choose(availableWidth: CGFloat, windows: Int) -> Mode { guard windows > 1 else { return .single } - guard availableWidth / CGFloat(windows) >= Theme.Layout.quotaRingCellWidth else { return .rows } + guard cellWidth(availableWidth: availableWidth, columns: windows) >= Theme.Layout.quotaRingCellWidth else { + return .rows + } return .grid(columns: windows) } + static func cellWidth(availableWidth: CGFloat, columns: Int) -> CGFloat { + let columns = max(1, columns) + return (availableWidth - CGFloat(columns - 1) * Theme.Layout.quotaRingSpacing) / CGFloat(columns) + } + + static func minimumGridWidth(windows: Int) -> CGFloat { + let columns = max(1, windows) + return CGFloat(columns) * Theme.Layout.quotaRingCellWidth + + CGFloat(columns - 1) * Theme.Layout.quotaRingSpacing + } + + static func minimumCardWidth(cells: Int) -> CGFloat { + max( + Theme.Layout.minimumRingCardWidth, + minimumGridWidth(windows: min(max(cells, 1), 3)) + Theme.Layout.cardPadding * 2) + } + + static func unifiedPanelWidth(codexCells: Int, claudeCells: Int) -> CGFloat { + let content = + minimumCardWidth(cells: codexCells) + minimumCardWidth(cells: claudeCells) + + Theme.Layout.panelPadding * 2 + Theme.Layout.quotaRingSpacing + return min(max(content, Theme.Layout.minimumRingUnifiedWidth), Theme.Layout.ringUnifiedWidth) + } + static func columns(availableWidth: CGFloat, windows: Int) -> Int { - max(1, min(windows, Int(availableWidth / Theme.Layout.quotaRingCellWidth))) + var columns = max(1, windows) + while columns > 1, + cellWidth(availableWidth: availableWidth, columns: columns) < Theme.Layout.quotaRingCellWidth + { + columns -= 1 + } + return columns } } @@ -35,36 +67,3 @@ struct QuotaRingMetrics { diameter: Theme.Layout.quotaRingRowDiameter, lineWidth: Theme.Layout.quotaRingRowLineWidth, percentageSize: Theme.Layout.quotaRingRowPercentageSize, contentPadding: 2, showsLabel: false) } - -struct QuotaRingModeLayout: Layout { - let windows: Int - - func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { - let width = - proposal.width.flatMap { $0.isFinite ? max(0, $0) : nil } - ?? subviews[0].sizeThatFits(.unspecified).width - let height = subviews[index(for: width)].sizeThatFits(ProposedViewSize(width: width, height: nil)).height - return CGSize(width: width, height: height) - } - - func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { - let chosen = index(for: bounds.width) - for (offset, subview) in subviews.enumerated() { - let visible = offset == chosen - subview.place( - at: visible ? CGPoint(x: bounds.minX, y: bounds.minY) : CGPoint(x: bounds.maxX, y: bounds.maxY), - anchor: .topLeading, - proposal: visible ? ProposedViewSize(width: bounds.width, height: bounds.height) : .zero) - } - } - - private func index(for width: CGFloat) -> Int { - QuotaRingLayout.choose(availableWidth: width, windows: windows) == .rows ? 1 : 0 - } -} - -extension View { - func quotaRingVariant() -> some View { - frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading).clipped() - } -} diff --git a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift index 4cfb8a7..eb4d183 100644 --- a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift @@ -59,7 +59,7 @@ final class QuotaPanelRenderingTests: XCTestCase { for language in AppLanguage.allCases { LocalizationManager.shared.language = language for count in [2, 3] { - let width = CGFloat(count) * Theme.Layout.quotaRingCellWidth + Theme.Layout.cardPadding * 2 + let width = QuotaRingLayout.minimumGridWidth(windows: count) + Theme.Layout.cardPadding * 2 let card = ProviderCard( provider: .claude, state: state(count: count), panelStyle: .rings, showProviderTitle: true) let bitmap = try render(card.frame(width: width), maximumHeight: 220) @@ -130,14 +130,14 @@ final class QuotaPanelRenderingTests: XCTestCase { provider: .claude, state: state(count: 3), panelStyle: .rings, showProviderTitle: true) let rows = try render(card.frame(width: cardWidth), maximumHeight: Theme.Layout.maximumPanelHeight) let grid = try render( - card.frame(width: Theme.Layout.quotaRingCellWidth * 3 + Theme.Layout.cardPadding * 2), + card.frame(width: QuotaRingLayout.minimumGridWidth(windows: 3) + Theme.Layout.cardPadding * 2), maximumHeight: Theme.Layout.maximumPanelHeight) XCTAssertGreaterThan(rows.size.height, grid.size.height) } func testUnifiedRingCardsShareOneHeight() throws { let available = Theme.Layout.ringUnifiedWidth - Theme.Layout.panelPadding * 2 - Theme.Layout.quotaRingSpacing - let balanced = Theme.Layout.quotaRingCellWidth * 4 + Theme.Layout.cardPadding * 4 + let balanced = QuotaRingLayout.minimumGridWidth(windows: 2) * 2 + Theme.Layout.cardPadding * 4 let matrix: [(Int, Int, CGFloat, CGFloat)] = [ (1, 3, Theme.Layout.minimumRingCardWidth, available - Theme.Layout.minimumRingCardWidth), (2, 2, balanced / 2, balanced / 2), diff --git a/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift b/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift index 61c9bd6..c94885d 100644 --- a/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift +++ b/Tests/TokenGaugeAppTests/QuotaRingLayoutTests.swift @@ -5,6 +5,7 @@ import XCTest final class QuotaRingLayoutTests: XCTestCase { private let cell = Theme.Layout.quotaRingCellWidth + private let spacing = Theme.Layout.quotaRingSpacing func testOneWindowAlwaysChoosesTheSingleRing() { for width: CGFloat in [0, 90, 146, 170, 310, 560] { @@ -14,7 +15,8 @@ final class QuotaRingLayoutTests: XCTestCase { func testGridIsChosenOnlyWhenEveryCellReachesTheMinimumCellWidth() { for windows in 2...5 { - let exact = cell * CGFloat(windows) + let exact = QuotaRingLayout.minimumGridWidth(windows: windows) + XCTAssertEqual(exact, cell * CGFloat(windows) + spacing * CGFloat(windows - 1), "windows \(windows)") XCTAssertEqual( QuotaRingLayout.choose(availableWidth: exact, windows: windows), .grid(columns: windows), "windows \(windows)") @@ -40,7 +42,7 @@ final class QuotaRingLayoutTests: XCTestCase { (individual, 3, .rows), (narrowCard, 1, .single), (narrowCard, 2, .rows), - (halfCard, 2, .grid(columns: 2)), + (halfCard, 2, .rows), (wideCard, 3, .rows), (wideCard, 2, .grid(columns: 2)), ] @@ -52,8 +54,36 @@ final class QuotaRingLayoutTests: XCTestCase { func testColumnsNeverExceedTheWindowCountAndStayAtLeastOne() { XCTAssertEqual(QuotaRingLayout.columns(availableWidth: 600, windows: 2), 2) - XCTAssertEqual(QuotaRingLayout.columns(availableWidth: cell * 3, windows: 3), 3) - XCTAssertEqual(QuotaRingLayout.columns(availableWidth: cell * 2, windows: 3), 2) + XCTAssertEqual( + QuotaRingLayout.columns(availableWidth: QuotaRingLayout.minimumGridWidth(windows: 3), windows: 3), 3) + XCTAssertEqual(QuotaRingLayout.columns(availableWidth: cell * 3, windows: 3), 2) + XCTAssertEqual(QuotaRingLayout.columns(availableWidth: cell * 2, windows: 3), 1) XCTAssertEqual(QuotaRingLayout.columns(availableWidth: 0, windows: 3), 1) } + + func testTheGridThresholdIsTheCellFormulaSharedWithTheGridLayout() { + for windows in 2...4 { + let minimum = QuotaRingLayout.minimumGridWidth(windows: windows) + XCTAssertEqual( + QuotaRingLayout.cellWidth(availableWidth: minimum, columns: windows), cell, accuracy: 0.001, + "windows \(windows)") + XCTAssertEqual( + QuotaRingLayout.choose(availableWidth: minimum, windows: windows), .grid(columns: windows), + "windows \(windows)") + XCTAssertEqual( + QuotaRingLayout.choose(availableWidth: minimum - 1, windows: windows), .rows, "windows \(windows)") + } + } + + func testUnifiedPanelWidthStaysWithinItsBounds() { + XCTAssertEqual( + QuotaRingLayout.unifiedPanelWidth(codexCells: 1, claudeCells: 1), Theme.Layout.minimumRingUnifiedWidth) + XCTAssertEqual( + QuotaRingLayout.unifiedPanelWidth(codexCells: 3, claudeCells: 3), Theme.Layout.ringUnifiedWidth) + let wideCard = QuotaRingLayout.minimumGridWidth(windows: 2) + Theme.Layout.cardPadding * 2 + let chrome: CGFloat = Theme.Layout.panelPadding * 2 + spacing + XCTAssertEqual( + QuotaRingLayout.unifiedPanelWidth(codexCells: 1, claudeCells: 2), + Theme.Layout.minimumRingCardWidth + wideCard + chrome) + } } diff --git a/Tests/TokenGaugeAppTests/ScreenshotTests.swift b/Tests/TokenGaugeAppTests/ScreenshotTests.swift index 667f5f9..9f92cae 100644 --- a/Tests/TokenGaugeAppTests/ScreenshotTests.swift +++ b/Tests/TokenGaugeAppTests/ScreenshotTests.swift @@ -172,7 +172,18 @@ final class ScreenshotTests: XCTestCase { let fitted = try render( PopoverView(store: store, showSettings: {}, showAbout: {}), to: output.appendingPathComponent("rings-current.png")) - XCTAssertEqual(fitted.width, Theme.Layout.minimumRingUnifiedWidth) + let visibleWindows = { (provider: UsageProvider) -> Int in + max( + 1, + WindowVisibility.visible( + store.state(for: provider).snapshot?.windows ?? [], provider: provider, + showLunaReserve: store.showLunaReserve, hiddenClaudeWindows: store.hiddenClaudeWindows + ).count) + } + XCTAssertEqual( + fitted.width, + QuotaRingLayout.unifiedPanelWidth( + codexCells: visibleWindows(.codex), claudeCells: visibleWindows(.claude))) } diff --git a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift index 069fb9d..22f8ee5 100644 --- a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift @@ -44,6 +44,27 @@ final class UpdateBannerRenderingTests: XCTestCase { XCTAssertEqual(view.fittingSize.height, 0, accuracy: 1) } + func testAboutKeepsTheManualCheckReachableOutsideARunningUpdate() throws { + let idle = try actionHeight(phase: .idle) + let available = try actionHeight(phase: .available(version: "1.4.0")) + let deferred = try actionHeight(phase: .readyToInstall(version: "1.4.0", deferred: true)) + let installing = try actionHeight(phase: .installing(version: "1.4.0")) + + XCTAssertGreaterThan(idle, 0) + XCTAssertLessThan(idle, UpdateBannerView.compactHeight) + XCTAssertGreaterThan(available, 0) + XCTAssertLessThan(available, UpdateBannerView.compactHeight) + XCTAssertGreaterThan(deferred, max(idle, available)) + XCTAssertEqual(installing, UpdateBannerView.compactHeight, accuracy: 1) + } + + private func actionHeight(phase: UpdateManager.Phase) throws -> CGFloat { + let manager = try makeManager(phase: phase) + let view = NSHostingView( + rootView: UpdateActionView(updates: manager).frame(width: Theme.Layout.panelWidth)) + return view.fittingSize.height + } + private func makeManager(phase: UpdateManager.Phase) throws -> UpdateManager { let suite = "TokenGauge.banner.\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) diff --git a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift index 25a8db0..e16d830 100644 --- a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift @@ -1,3 +1,4 @@ +import Combine import Sparkle import XCTest @@ -8,10 +9,15 @@ final class UpdateManagerTests: XCTestCase { private var clock = Date(timeIntervalSince1970: 1_000) - private func makeManager() -> UpdateManager { - UpdateManager( - defaults: UserDefaults(suiteName: "TokenGauge.UpdaterTests." + UUID().uuidString)!, - now: { [unowned self] in self.clock }) + private func makeDefaults() -> UserDefaults { + let suite = "TokenGauge.UpdaterTests." + UUID().uuidString + let defaults = UserDefaults(suiteName: suite)! + addTeardownBlock { defaults.removePersistentDomain(forName: suite) } + return defaults + } + + private func makeManager(defaults: UserDefaults? = nil) -> UpdateManager { + UpdateManager(defaults: defaults ?? makeDefaults(), now: { [unowned self] in self.clock }) } private func found( @@ -238,7 +244,7 @@ final class UpdateManagerTests: XCTestCase { func testFeedOverridePrecedence() { let qa = ["TOKENGAUGE_QA_UPDATES": "1", "TOKENGAUGE_UPDATE_FEED_URL": "http://127.0.0.1:18764/appcast.xml"] - let override = "http://127.0.0.1:8000/override.xml" + let override = "https://updates.example.com/override.xml" XCTAssertEqual( UpdateManager.feedURL(environment: qa, override: override, isDevelopmentBuild: true), @@ -251,6 +257,130 @@ final class UpdateManagerTests: XCTestCase { XCTAssertNil(UpdateManager.feedURL(environment: [:], override: "not a url", isDevelopmentBuild: false)) } + func testFeedOverrideIsHonouredOnlyOverHTTPS() { + for raw in ["http://127.0.0.1:8000/override.xml", "http://updates.example.com/appcast.xml"] { + XCTAssertNil(UpdateManager.feedURL(environment: [:], override: raw, isDevelopmentBuild: false)) + XCTAssertNil(UpdateManager.feedURL(environment: [:], override: raw, isDevelopmentBuild: true)) + } + XCTAssertEqual( + UpdateManager.feedURL( + environment: [:], override: "https://updates.example.com/appcast.xml", isDevelopmentBuild: false), + "https://updates.example.com/appcast.xml") + let qa = ["TOKENGAUGE_QA_UPDATES": "1", "TOKENGAUGE_UPDATE_FEED_URL": "http://127.0.0.1:18764/appcast.xml"] + XCTAssertEqual( + UpdateManager.feedURL(environment: qa, override: nil, isDevelopmentBuild: true), + qa["TOKENGAUGE_UPDATE_FEED_URL"]) + } + + func testManualCheckWithoutAnUpdaterReturnsToIdle() { + let defaults = makeDefaults() + defaults.set("https://updates.example.com/appcast.xml", forKey: UpdateManager.feedOverrideDefaultsKey) + let manager = makeManager(defaults: defaults) + + manager.checkForUpdatesManually() + + XCTAssertEqual(manager.manualCheckStatus, .failed) + XCTAssertEqual(manager.phase, .idle) + } + + func testDismissedCheckReturnsToIdle() { + let manager = makeManager() + manager.handleManualCheckStarted() + XCTAssertEqual(manager.phase, .checking) + + manager.handleDismissInstallation() + + XCTAssertEqual(manager.phase, .idle) + } + + func testScheduledCheckNeverShowsTheCheckingPhase() { + let manager = makeManager() + var phases: [UpdateManager.Phase] = [] + let subscription = manager.$phase.sink { phases.append($0) } + + _ = found(manager) + manager.handleNotFound() + subscription.cancel() + + XCTAssertFalse(phases.contains(.checking)) + XCTAssertEqual(manager.phase, .idle) + } + + func testDownloadBarCompletesBeforeExtractionStarts() { + let manager = makeManager() + _ = found(manager) + manager.handleDownloadInitiated() + manager.handleDownloadExpectedLength(1_000) + manager.handleDownloadReceived(bytes: 400) + var phases: [UpdateManager.Phase] = [] + let subscription = manager.$phase.sink { phases.append($0) } + + manager.handleExtractionStarted() + subscription.cancel() + + XCTAssertEqual( + phases, + [ + .downloading(version: "9.9.9", fraction: 0.4), + .downloading(version: "9.9.9", fraction: 1), + .extracting(version: "9.9.9", fraction: nil), + ]) + } + + func testDeferredVersionIsPersistedUntilTheUpdateInstalls() { + let defaults = makeDefaults() + let manager = makeManager(defaults: defaults) + _ = found(manager) + manager.handleReadyToInstall { _ in } + + manager.deferReadyUpdate() + XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "9.9.9") + + manager.resumeDeferredInstall() + XCTAssertEqual(found(manager, stage: .downloaded), .install) + XCTAssertNil(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey)) + } + + func testDownloadedStageRestoresTheDeferredVersionAfterRelaunch() { + let defaults = makeDefaults() + let manager = makeManager(defaults: defaults) + + XCTAssertEqual(found(manager, stage: .downloaded), .dismiss) + + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: true)) + XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "9.9.9") + } + + func testDeferredVersionIsClearedByAnotherVersionAndByNoUpdate() { + let defaults = makeDefaults() + let manager = makeManager(defaults: defaults) + _ = found(manager, stage: .downloaded) + + _ = found(manager, version: "9.9.10") + XCTAssertNil(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey)) + + _ = found(manager, stage: .downloaded) + XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "9.9.9") + + manager.handleNotFound() + XCTAssertNil(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey)) + } + + func testInstallingAReadyUpdateClearsTheDeferredVersion() { + let defaults = makeDefaults() + let manager = makeManager(defaults: defaults) + _ = found(manager, stage: .downloaded) + manager.handleReadyToInstall { _ in } + manager.deferReadyUpdate() + XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "9.9.9") + + manager.handleReadyToInstall { _ in } + manager.installReadyUpdate() + + XCTAssertEqual(manager.phase, .installing(version: "9.9.9")) + XCTAssertNil(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey)) + } + func testManualCheckFailureIsVisibleWithoutPublishingErrorDetails() { let manager = makeManager() manager.handleManualCheckStarted() From 609b6844a82100d3f2da9ce6a996a54fd2791650 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:54:32 -0500 Subject: [PATCH 08/21] refactor(store): split UsageStore into AppPreferences, RefreshScheduler and a streaming UsageRefresher with one publish per provider --- Sources/TokenGaugeApp/App/AppDelegate.swift | 7 +- .../Services/AppPreferences.swift | 143 ++++++++++ .../Services/ClaudeSessionRecovery.swift | 60 ++--- .../Services/LocalizationManager.swift | 4 +- .../Services/RefreshScheduler.swift | 39 +++ .../Services/UsageRefresher.swift | 63 +++++ .../TokenGaugeApp/Services/UsageStore.swift | 255 +++++++++--------- .../Support/UsageFormatters.swift | 62 +++-- .../TokenGaugeApp/Views/SettingsView.swift | 2 +- .../AppPreferencesTests.swift | 115 ++++++++ .../UsageStoreRefreshTests.swift | 174 ++++++++++++ 11 files changed, 729 insertions(+), 195 deletions(-) create mode 100644 Sources/TokenGaugeApp/Services/AppPreferences.swift create mode 100644 Sources/TokenGaugeApp/Services/RefreshScheduler.swift create mode 100644 Sources/TokenGaugeApp/Services/UsageRefresher.swift create mode 100644 Tests/TokenGaugeAppTests/AppPreferencesTests.swift create mode 100644 Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift diff --git a/Sources/TokenGaugeApp/App/AppDelegate.swift b/Sources/TokenGaugeApp/App/AppDelegate.swift index c976937..1d8d294 100644 --- a/Sources/TokenGaugeApp/App/AppDelegate.swift +++ b/Sources/TokenGaugeApp/App/AppDelegate.swift @@ -7,6 +7,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate { private var statusController: StatusItemController? func applicationDidFinishLaunching(_ notification: Notification) { + signal(SIGPIPE, SIG_IGN) NSApp.setActivationPolicy(.accessory) statusController = StatusItemController(store: store, launchAtLogin: launchAtLogin) requestClaudeRecoveryConsent() @@ -27,9 +28,9 @@ final class AppDelegate: NSObject, NSApplicationDelegate { } private func requestClaudeRecoveryConsent() { - guard UserDefaults.standard.object(forKey: "claudeAutomaticRecovery") == nil, - ClaudeSessionRecovery.executable() != nil - else { return } + guard !AppPreferences().claudeAutomaticRecoveryDecided, ClaudeSessionRecovery.executable() != nil else { + return + } let alert = NSAlert() alert.messageText = "setup.claude_recovery_title".localized alert.informativeText = "setup.claude_recovery_message".localized diff --git a/Sources/TokenGaugeApp/Services/AppPreferences.swift b/Sources/TokenGaugeApp/Services/AppPreferences.swift new file mode 100644 index 0000000..aea92b0 --- /dev/null +++ b/Sources/TokenGaugeApp/Services/AppPreferences.swift @@ -0,0 +1,143 @@ +import Foundation +import TokenGaugeCore + +struct AppPreferences { + enum Key { + static let primaryProvider = "primaryProvider" + static let displayMode = "displayMode" + static let menuBarSize = "menuBarSize" + static let quotaPanelStyle = "quotaPanelStyle" + static let quotaMenuBarStyle = "quotaMenuBarStyle" + static let quotaAnimateChanges = "quotaAnimateChanges" + static let historyMode = "historyMode" + static let showHourlyPace = "showHourlyPace" + static let showLunaReserve = "showLunaReserve" + static let hiddenClaudeWindows = "hiddenClaudeWindows" + static let claudeMenuBarSource = "claudeMenuBarSource" + static let claudeAutomaticRecovery = "claudeAutomaticRecovery" + static let claudeRecoveryNextAttempt = "claudeRecoveryNextAttempt" + static let claudeRecoveryFailures = "claudeRecoveryFailures" + static let appLanguage = "appLanguage" + static let codexExecutablePath = "codexExecutablePath" + + static func cancelledAt(_ provider: UsageProvider) -> String { + "\(provider.rawValue)CancelledAt" + } + + static func cancellationDailyBaseline(_ provider: UsageProvider) -> String { + "\(provider.rawValue)CancellationDailyBaseline" + } + } + + let defaults: UserDefaults + + init(defaults: UserDefaults = .standard) { + self.defaults = defaults + } + + var primaryProvider: UsageProvider { + get { value(Key.primaryProvider) ?? .codex } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.primaryProvider) } + } + + var displayMode: UsageDisplayMode { + get { + let provider = primaryProvider + return UsageDisplayMode(rawValue: defaults.string(forKey: Key.displayMode) ?? provider.rawValue) + ?? (provider == .codex ? .codex : .claude) + } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.displayMode) } + } + + var menuBarSize: MenuBarSize { + get { value(Key.menuBarSize) ?? .large } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.menuBarSize) } + } + + var panelStyle: QuotaPanelStyle { + get { value(Key.quotaPanelStyle) ?? .standard } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.quotaPanelStyle) } + } + + var menuBarStyle: QuotaMenuBarStyle { + get { value(Key.quotaMenuBarStyle) ?? .numbers } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.quotaMenuBarStyle) } + } + + var animateChanges: Bool { + get { bool(Key.quotaAnimateChanges, default: true) } + nonmutating set { defaults.set(newValue, forKey: Key.quotaAnimateChanges) } + } + + var historyMode: HistoryMode { + get { value(Key.historyMode) ?? .recent } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.historyMode) } + } + + var showHourlyPace: Bool { + get { bool(Key.showHourlyPace, default: true) } + nonmutating set { defaults.set(newValue, forKey: Key.showHourlyPace) } + } + + var showLunaReserve: Bool { + get { bool(Key.showLunaReserve, default: true) } + nonmutating set { defaults.set(newValue, forKey: Key.showLunaReserve) } + } + + var hiddenClaudeWindows: Set { + get { ClaudeWindowKind.decode(defaults.stringArray(forKey: Key.hiddenClaudeWindows)) } + nonmutating set { defaults.set(newValue.map(\.rawValue).sorted(), forKey: Key.hiddenClaudeWindows) } + } + + var claudeMenuBarSource: ClaudeMenuBarSource { + get { value(Key.claudeMenuBarSource) ?? .automatic } + nonmutating set { defaults.set(newValue.rawValue, forKey: Key.claudeMenuBarSource) } + } + + var claudeAutomaticRecovery: Bool { + get { bool(Key.claudeAutomaticRecovery, default: false) } + nonmutating set { defaults.set(newValue, forKey: Key.claudeAutomaticRecovery) } + } + + var claudeAutomaticRecoveryDecided: Bool { + defaults.object(forKey: Key.claudeAutomaticRecovery) != nil + } + + var claudeRecoveryNextAttempt: Date? { + get { defaults.object(forKey: Key.claudeRecoveryNextAttempt) as? Date } + nonmutating set { replace(newValue, forKey: Key.claudeRecoveryNextAttempt) } + } + + var claudeRecoveryFailures: Int { + get { defaults.integer(forKey: Key.claudeRecoveryFailures) } + nonmutating set { defaults.set(newValue, forKey: Key.claudeRecoveryFailures) } + } + + func cancelledAt(_ provider: UsageProvider) -> Date? { + defaults.object(forKey: Key.cancelledAt(provider)) as? Date + } + + func setCancelledAt(_ date: Date?, for provider: UsageProvider) { + replace(date, forKey: Key.cancelledAt(provider)) + } + + func cancellationDailyBaseline(_ provider: UsageProvider) -> [String: Int]? { + defaults.dictionary(forKey: Key.cancellationDailyBaseline(provider)) as? [String: Int] + } + + func setCancellationDailyBaseline(_ totals: [String: Int]?, for provider: UsageProvider) { + replace(totals, forKey: Key.cancellationDailyBaseline(provider)) + } + + private func value(_ key: String) -> Value? where Value.RawValue == String { + defaults.string(forKey: key).flatMap(Value.init(rawValue:)) + } + + private func bool(_ key: String, default fallback: Bool) -> Bool { + defaults.object(forKey: key) == nil ? fallback : defaults.bool(forKey: key) + } + + private func replace(_ value: Any?, forKey key: String) { + if let value { defaults.set(value, forKey: key) } else { defaults.removeObject(forKey: key) } + } +} diff --git a/Sources/TokenGaugeApp/Services/ClaudeSessionRecovery.swift b/Sources/TokenGaugeApp/Services/ClaudeSessionRecovery.swift index 4ddbe99..8010d72 100644 --- a/Sources/TokenGaugeApp/Services/ClaudeSessionRecovery.swift +++ b/Sources/TokenGaugeApp/Services/ClaudeSessionRecovery.swift @@ -1,21 +1,23 @@ import Foundation import TokenGaugeCore +import os -final class ClaudeSessionRecovery: @unchecked Sendable { +final class ClaudeSessionRecovery: Sendable { static let shared = ClaudeSessionRecovery() - private let lock = NSLock() - private let defaults: UserDefaults - private var running = false + private struct State { + var running = false + let preferences: AppPreferences + } + + private let state: OSAllocatedUnfairLock init(defaults: UserDefaults = .standard) { - self.defaults = defaults + state = OSAllocatedUnfairLock(uncheckedState: State(preferences: AppPreferences(defaults: defaults))) } var isRunning: Bool { - lock.lock() - defer { lock.unlock() } - return running + state.withLock { $0.running } } func attempt(homeDirectory: URL, authorization: ClaudeRecoveryAuthorization) -> Bool { @@ -34,23 +36,22 @@ final class ClaudeSessionRecovery: @unchecked Sendable { } func attempt(now: Date, run: () -> Bool) -> Bool { - lock.lock() - let nextAttempt = defaults.object(forKey: "claudeRecoveryNextAttempt") as? Date ?? .distantPast - guard !running, now >= nextAttempt else { - lock.unlock() - return false + let failures: Int? = state.withLock { state in + let nextAttempt = state.preferences.claudeRecoveryNextAttempt ?? .distantPast + guard !state.running, now >= nextAttempt else { return nil } + state.running = true + let failures = min(max(state.preferences.claudeRecoveryFailures, 0), 2) + let delay: TimeInterval = [300, 900, 3600][failures] + state.preferences.claudeRecoveryNextAttempt = now.addingTimeInterval(delay) + return failures } - running = true - let failures = min(max(defaults.integer(forKey: "claudeRecoveryFailures"), 0), 2) - let delay: TimeInterval = [300, 900, 3600][failures] - defaults.set(now.addingTimeInterval(delay), forKey: "claudeRecoveryNextAttempt") - lock.unlock() + guard let failures else { return false } let recovered = run() - lock.lock() - defaults.set(recovered ? 0 : failures + 1, forKey: "claudeRecoveryFailures") - running = false - lock.unlock() + state.withLock { state in + state.preferences.claudeRecoveryFailures = recovered ? 0 : failures + 1 + state.running = false + } return recovered } @@ -65,23 +66,18 @@ final class ClaudeSessionRecovery: @unchecked Sendable { } } -final class ClaudeRecoveryAuthorization: @unchecked Sendable { - private let lock = NSLock() - private var allowed: Bool +final class ClaudeRecoveryAuthorization: Sendable { + private let allowed: OSAllocatedUnfairLock init(allowed: Bool = false) { - self.allowed = allowed + self.allowed = OSAllocatedUnfairLock(initialState: allowed) } var isAllowed: Bool { - lock.lock() - defer { lock.unlock() } - return allowed + allowed.withLock { $0 } } func setAllowed(_ value: Bool) { - lock.lock() - allowed = value - lock.unlock() + allowed.withLock { $0 = value } } } diff --git a/Sources/TokenGaugeApp/Services/LocalizationManager.swift b/Sources/TokenGaugeApp/Services/LocalizationManager.swift index 6ffb26f..a2eac28 100644 --- a/Sources/TokenGaugeApp/Services/LocalizationManager.swift +++ b/Sources/TokenGaugeApp/Services/LocalizationManager.swift @@ -21,7 +21,7 @@ final class LocalizationManager: ObservableObject { @Published var language: AppLanguage { didSet { - UserDefaults.standard.set(language.rawValue, forKey: "appLanguage") + UserDefaults.standard.set(language.rawValue, forKey: AppPreferences.Key.appLanguage) bundle = Self.bundle(for: language) } } @@ -29,7 +29,7 @@ final class LocalizationManager: ObservableObject { @Published private(set) var bundle: Bundle private init() { - let stored = UserDefaults.standard.string(forKey: "appLanguage") + let stored = UserDefaults.standard.string(forKey: AppPreferences.Key.appLanguage) let language = AppLanguage(rawValue: stored ?? "") ?? AppLanguage.preferred(from: Locale.preferredLanguages) self.language = language bundle = Self.bundle(for: language) diff --git a/Sources/TokenGaugeApp/Services/RefreshScheduler.swift b/Sources/TokenGaugeApp/Services/RefreshScheduler.swift new file mode 100644 index 0000000..623f2b0 --- /dev/null +++ b/Sources/TokenGaugeApp/Services/RefreshScheduler.swift @@ -0,0 +1,39 @@ +import Foundation + +@MainActor +final class RefreshScheduler { + private let interval: TimeInterval + private let fire: @MainActor () -> Void + private var periodicTimer: Timer? + private var resetTimer: Timer? + + init(interval: TimeInterval = 300, fire: @escaping @MainActor () -> Void) { + self.interval = interval + self.fire = fire + } + + func start() { + periodicTimer?.invalidate() + periodicTimer = timer(after: interval, repeats: true) + } + + func scheduleResetRefresh(at reset: Date?, now: Date = Date()) { + resetTimer?.invalidate() + resetTimer = reset.map { timer(after: max($0.timeIntervalSince(now) + 5, 1), repeats: false) } + } + + func stop() { + periodicTimer?.invalidate() + resetTimer?.invalidate() + periodicTimer = nil + resetTimer = nil + } + + private func timer(after delay: TimeInterval, repeats: Bool) -> Timer { + Timer.scheduledTimer(withTimeInterval: delay, repeats: repeats) { [weak self] _ in + Task { @MainActor in + self?.fire() + } + } + } +} diff --git a/Sources/TokenGaugeApp/Services/UsageRefresher.swift b/Sources/TokenGaugeApp/Services/UsageRefresher.swift new file mode 100644 index 0000000..8f68626 --- /dev/null +++ b/Sources/TokenGaugeApp/Services/UsageRefresher.swift @@ -0,0 +1,63 @@ +import Foundation +import TokenGaugeCore + +enum ProviderOutcome: Sendable { + case claude(ClaudeUsageResult?) + case codex(ProviderViewState) +} + +struct UsageRefresher: Sendable { + let homeDirectory: URL + private let fetchClaude: @Sendable (ClaudeRecoveryAuthorization) -> ClaudeUsageResult? + private let fetchCodex: @Sendable () -> ProviderViewState + + init(claudeClient: ClaudeUsageClient, codexClient: CodexAppServerClient) { + self.init( + homeDirectory: claudeClient.homeDirectory, + fetchClaude: { try? claudeClient.fetch(recoveryAuthorization: $0) }, + fetchCodex: { Self.codexState(client: codexClient) }) + } + + init( + homeDirectory: URL, + fetchClaude: @escaping @Sendable (ClaudeRecoveryAuthorization) -> ClaudeUsageResult?, + fetchCodex: @escaping @Sendable () -> ProviderViewState + ) { + self.homeDirectory = homeDirectory + self.fetchClaude = fetchClaude + self.fetchCodex = fetchCodex + } + + func outcomes(recoveryAuthorization: ClaudeRecoveryAuthorization) -> AsyncStream { + let fetchClaude = fetchClaude + let fetchCodex = fetchCodex + return AsyncStream { continuation in + Task.detached(priority: .utility) { + await withTaskGroup(of: ProviderOutcome.self) { group in + group.addTask { .claude(fetchClaude(recoveryAuthorization)) } + group.addTask { .codex(fetchCodex()) } + for await outcome in group { continuation.yield(outcome) } + } + continuation.finish() + } + } + } + + private static func codexState(client: CodexAppServerClient) -> ProviderViewState { + do { + let snapshot = try client.fetch() + return ProviderViewState( + snapshot: snapshot, + status: ProviderStateResolver.codexStatus(snapshot: snapshot), + isRefreshing: false + ) + } catch UsageDataError.authenticationRequired { + return ProviderViewState( + snapshot: client.cached(), status: .authenticationRequired, isRefreshing: false) + } catch { + let cached = client.cached() + return ProviderViewState( + snapshot: cached, status: cached == nil ? .unavailable : .stale, isRefreshing: false) + } + } +} diff --git a/Sources/TokenGaugeApp/Services/UsageStore.swift b/Sources/TokenGaugeApp/Services/UsageStore.swift index 8f3370b..456932b 100644 --- a/Sources/TokenGaugeApp/Services/UsageStore.swift +++ b/Sources/TokenGaugeApp/Services/UsageStore.swift @@ -30,49 +30,49 @@ final class UsageStore: ObservableObject { @Published private(set) var isRefreshing = false @Published var primaryProvider: UsageProvider { didSet { - defaults.set(primaryProvider.rawValue, forKey: "primaryProvider") + preferences.primaryProvider = primaryProvider let mode = primaryProvider == .codex ? UsageDisplayMode.codex : .claude if displayMode != mode { displayMode = mode } } } @Published var displayMode: UsageDisplayMode { didSet { - defaults.set(displayMode.rawValue, forKey: "displayMode") + preferences.displayMode = displayMode if let provider = displayMode.singleProvider, primaryProvider != provider { primaryProvider = provider } } } @Published var menuBarSize: MenuBarSize { - didSet { defaults.set(menuBarSize.rawValue, forKey: "menuBarSize") } + didSet { preferences.menuBarSize = menuBarSize } } @Published var panelStyle: QuotaPanelStyle { - didSet { defaults.set(panelStyle.rawValue, forKey: "quotaPanelStyle") } + didSet { preferences.panelStyle = panelStyle } } @Published var menuBarStyle: QuotaMenuBarStyle { - didSet { defaults.set(menuBarStyle.rawValue, forKey: "quotaMenuBarStyle") } + didSet { preferences.menuBarStyle = menuBarStyle } } @Published var animateChanges: Bool { - didSet { defaults.set(animateChanges, forKey: "quotaAnimateChanges") } + didSet { preferences.animateChanges = animateChanges } } @Published var historyMode: HistoryMode { - didSet { defaults.set(historyMode.rawValue, forKey: "historyMode") } + didSet { preferences.historyMode = historyMode } } @Published var showHourlyPace: Bool { - didSet { defaults.set(showHourlyPace, forKey: "showHourlyPace") } + didSet { preferences.showHourlyPace = showHourlyPace } } @Published private(set) var historyRevision = 0 let historyReadsEnabled: Bool @Published var showLunaReserve: Bool { - didSet { defaults.set(showLunaReserve, forKey: "showLunaReserve") } + didSet { preferences.showLunaReserve = showLunaReserve } } @Published private(set) var hiddenClaudeWindows: Set { - didSet { defaults.set(hiddenClaudeWindows.map(\.rawValue).sorted(), forKey: "hiddenClaudeWindows") } + didSet { preferences.hiddenClaudeWindows = hiddenClaudeWindows } } @Published var claudeMenuBarSource: ClaudeMenuBarSource { - didSet { defaults.set(claudeMenuBarSource.rawValue, forKey: "claudeMenuBarSource") } + didSet { preferences.claudeMenuBarSource = claudeMenuBarSource } } @Published var claudeAutomaticRecovery: Bool { didSet { - defaults.set(claudeAutomaticRecovery, forKey: "claudeAutomaticRecovery") + preferences.claudeAutomaticRecovery = claudeAutomaticRecovery recoveryAuthorization.setAllowed(claudeAutomaticRecovery && claudeCancelledAt == nil) } } @@ -82,48 +82,51 @@ final class UsageStore: ObservableObject { @Published private(set) var codexCancelledAt: Date? let recoveryAuthorization: ClaudeRecoveryAuthorization - private let defaults: UserDefaults + private let preferences: AppPreferences + private let refresher: UsageRefresher + private lazy var scheduler = RefreshScheduler { [weak self] in self?.refresh(force: true) } - private let claudeClient: ClaudeUsageClient - private let codexClient: CodexAppServerClient - private var timer: Timer? - private var resetTimer: Timer? - - init( + convenience init( claudeClient: ClaudeUsageClient = ClaudeUsageClient(), codexClient: CodexAppServerClient = CodexAppServerClient(), defaults: UserDefaults = .standard, initialSnapshots: [ProviderUsageSnapshot] = [], historyReadsEnabled: Bool? = nil ) { - self.claudeClient = claudeClient - self.codexClient = codexClient - self.defaults = defaults + self.init( + refresher: UsageRefresher(claudeClient: claudeClient, codexClient: codexClient), + defaults: defaults, initialSnapshots: initialSnapshots, historyReadsEnabled: historyReadsEnabled) + } + + init( + refresher: UsageRefresher, + defaults: UserDefaults = .standard, + initialSnapshots: [ProviderUsageSnapshot] = [], + historyReadsEnabled: Bool? = nil + ) { + let preferences = AppPreferences(defaults: defaults) + self.refresher = refresher + self.preferences = preferences self.historyReadsEnabled = historyReadsEnabled ?? (defaults === UserDefaults.standard && initialSnapshots.isEmpty) + let claudeCancelledAt = preferences.cancelledAt(.claude) recoveryAuthorization = ClaudeRecoveryAuthorization( - allowed: defaults.bool(forKey: "claudeAutomaticRecovery") - && defaults.object(forKey: "claudeCancelledAt") == nil) - let savedProvider = UsageProvider(rawValue: defaults.string(forKey: "primaryProvider") ?? "") ?? .codex - let mode = - UsageDisplayMode(rawValue: defaults.string(forKey: "displayMode") ?? savedProvider.rawValue) - ?? (savedProvider == .codex ? .codex : .claude) - primaryProvider = mode.singleProvider ?? savedProvider + allowed: preferences.claudeAutomaticRecovery && claudeCancelledAt == nil) + let mode = preferences.displayMode + primaryProvider = mode.singleProvider ?? preferences.primaryProvider displayMode = mode - menuBarSize = MenuBarSize(rawValue: defaults.string(forKey: "menuBarSize") ?? "") ?? .large - historyMode = HistoryMode(rawValue: defaults.string(forKey: "historyMode") ?? "") ?? .recent - showHourlyPace = defaults.object(forKey: "showHourlyPace") == nil || defaults.bool(forKey: "showHourlyPace") - panelStyle = QuotaPanelStyle(rawValue: defaults.string(forKey: "quotaPanelStyle") ?? "") ?? .standard - menuBarStyle = QuotaMenuBarStyle(rawValue: defaults.string(forKey: "quotaMenuBarStyle") ?? "") ?? .numbers - animateChanges = - defaults.object(forKey: "quotaAnimateChanges") == nil || defaults.bool(forKey: "quotaAnimateChanges") - showLunaReserve = defaults.object(forKey: "showLunaReserve") == nil || defaults.bool(forKey: "showLunaReserve") - hiddenClaudeWindows = ClaudeWindowKind.decode(defaults.stringArray(forKey: "hiddenClaudeWindows")) - claudeMenuBarSource = - ClaudeMenuBarSource(rawValue: defaults.string(forKey: "claudeMenuBarSource") ?? "") ?? .automatic - claudeAutomaticRecovery = defaults.bool(forKey: "claudeAutomaticRecovery") - claudeCancelledAt = defaults.object(forKey: "claudeCancelledAt") as? Date - codexCancelledAt = defaults.object(forKey: "codexCancelledAt") as? Date + menuBarSize = preferences.menuBarSize + historyMode = preferences.historyMode + showHourlyPace = preferences.showHourlyPace + panelStyle = preferences.panelStyle + menuBarStyle = preferences.menuBarStyle + animateChanges = preferences.animateChanges + showLunaReserve = preferences.showLunaReserve + hiddenClaudeWindows = preferences.hiddenClaudeWindows + claudeMenuBarSource = preferences.claudeMenuBarSource + claudeAutomaticRecovery = preferences.claudeAutomaticRecovery + self.claudeCancelledAt = claudeCancelledAt + codexCancelledAt = preferences.cancelledAt(.codex) for snapshot in initialSnapshots { let state = ProviderViewState( snapshot: snapshot, status: isCancelled(provider: snapshot.provider) ? .cancelled : .ready, @@ -132,11 +135,6 @@ final class UsageStore: ObservableObject { } if claudeCancelledAt != nil { claude.status = .cancelled } if codexCancelledAt != nil { codex.status = .cancelled } - if self.historyReadsEnabled { - let identity = ClaudeAccountIdentityReader.current(homeDirectory: claudeClient.homeDirectory) - claudeAccountLabel = identity?.label - claudeAccountFingerprint = identity?.fingerprint - } } func setPreviewAccountLabel(_ label: String?) { @@ -145,16 +143,11 @@ final class UsageStore: ObservableObject { func start() { refresh(force: true) - timer = Timer.scheduledTimer(withTimeInterval: 300, repeats: true) { [weak self] _ in - Task { @MainActor in - self?.refresh(force: true) - } - } + scheduler.start() } func stop() { - timer?.invalidate() - resetTimer?.invalidate() + scheduler.stop() recoveryAuthorization.setAllowed(false) } @@ -162,45 +155,51 @@ final class UsageStore: ObservableObject { guard !isRefreshing else { return } if !force, let lastRefresh, Date().timeIntervalSince(lastRefresh) < 60 { return } isRefreshing = true - claude.isRefreshing = true - codex.isRefreshing = true - let claudeClient = self.claudeClient - let codexClient = self.codexClient + if !claude.isRefreshing { claude.isRefreshing = true } + if !codex.isRefreshing { codex.isRefreshing = true } + let refresher = self.refresher let recoveryAuthorization = self.recoveryAuthorization - let effortHome = claudeClient.homeDirectory Task { - async let claudeOutcome = Task.detached(priority: .utility) { - try? claudeClient.fetch(recoveryAuthorization: recoveryAuthorization) - }.value - async let codexOutcome = Task.detached(priority: .utility) { - Self.fetchCodex(client: codexClient) - }.value - let codexState = await codexOutcome - applyCodexState(codexState) - let claudeResult = await claudeOutcome - applyRefreshResults(claudeResult: claudeResult, codexState: codexState) - if historyReadsEnabled { - claudeAccountLabel = claudeResult?.accountLabel - claudeAccountFingerprint = claudeResult?.accountFingerprint + var claudeResult: ClaudeUsageResult? + var codexState = ProviderViewState.loading + for await outcome in refresher.outcomes(recoveryAuthorization: recoveryAuthorization) { + switch outcome { + case .claude(let result): claudeResult = result + case .codex(let state): codexState = state + } + receive(outcome) } lastRefresh = Date() isRefreshing = false scheduleResetRefresh() - if historyReadsEnabled { - await Task.detached(priority: .background) { - Self.archive( - claudeResult: claudeResult, codexState: codexState, - accountFingerprint: claudeResult?.accountFingerprint) - try? EffortHistoryClient.collect(homeDirectory: effortHome) - }.value - historyRevision &+= 1 - } + guard historyReadsEnabled else { return } + let archived = (claude: claudeResult, codex: codexState) + await Task.detached(priority: .background) { + Self.archive( + claudeResult: archived.claude, codexState: archived.codex, + accountFingerprint: archived.claude?.accountFingerprint) + try? EffortHistoryClient.collect(homeDirectory: refresher.homeDirectory) + }.value + historyRevision &+= 1 + } + } + + private func receive(_ outcome: ProviderOutcome) { + switch outcome { + case .claude(let result): + applyClaudeResult(result) + guard historyReadsEnabled else { return } + let label = result?.accountLabel + let fingerprint = result?.accountFingerprint + if claudeAccountLabel != label { claudeAccountLabel = label } + if claudeAccountFingerprint != fingerprint { claudeAccountFingerprint = fingerprint } + case .codex(let state): + applyCodexState(state) } } private func scheduleResetRefresh() { - resetTimer?.invalidate() let now = Date() let nextReset = [claude.snapshot, codex.snapshot] .compactMap { $0 } @@ -208,13 +207,7 @@ final class UsageStore: ObservableObject { .compactMap(\.resetsAt) .filter { $0 > now } .min() - guard let nextReset else { return } - let delay = max(nextReset.timeIntervalSince(now) + 5, 1) - resetTimer = Timer.scheduledTimer(withTimeInterval: delay, repeats: false) { [weak self] _ in - Task { @MainActor in - self?.refresh(force: true) - } - } + scheduler.scheduleResetRefresh(at: nextReset, now: now) } nonisolated static func archive( @@ -278,35 +271,32 @@ final class UsageStore: ObservableObject { } else { codexCancelledAt = date } - let key = "\(provider.rawValue)CancelledAt" - if let date { defaults.set(date, forKey: key) } else { defaults.removeObject(forKey: key) } - defaults.removeObject(forKey: baselineKey(for: provider)) + preferences.setCancelledAt(date, for: provider) + preferences.setCancellationDailyBaseline(nil, for: provider) } - private func baselineKey(for provider: UsageProvider) -> String { - "\(provider.rawValue)CancellationDailyBaseline" + func applyRefreshResults(claudeResult: ClaudeUsageResult?, codexState: ProviderViewState) { + applyClaudeResult(claudeResult) + applyCodexState(codexState) } - func applyRefreshResults(claudeResult: ClaudeUsageResult?, codexState: ProviderViewState) { - if ProviderStateResolver.shouldResumeClaude(result: claudeResult, cancelledAt: claudeCancelledAt) { + private func applyClaudeResult(_ result: ClaudeUsageResult?) { + if ProviderStateResolver.shouldResumeClaude(result: result, cancelledAt: claudeCancelledAt) { persistCancellation(nil, for: .claude) } else { - resumeIfActivityIncreased( - provider: .claude, snapshot: claudeResult?.snapshot, live: claudeResult?.access == .live) + resumeIfActivityIncreased(provider: .claude, snapshot: result?.snapshot, live: result?.access == .live) } - resumeIfActivityIncreased( - provider: .codex, snapshot: codexState.snapshot, live: codexState.status == .ready) - let previousClaudeSnapshot = claude.snapshot - claude = ProviderStateResolver.claudeState(result: claudeResult, cancelled: isCancelled(provider: .claude)) - if claude.snapshot == nil { claude.snapshot = previousClaudeSnapshot } - applyCodexState(codexState) + var next = ProviderStateResolver.claudeState(result: result, cancelled: isCancelled(provider: .claude)) + if next.snapshot == nil { next.snapshot = claude.snapshot } + claude = next } private func applyCodexState(_ state: ProviderViewState) { - let previous = codex.snapshot - codex = state - if codex.snapshot == nil { codex.snapshot = previous } - if isCancelled(provider: .codex) { codex.status = .cancelled } + resumeIfActivityIncreased(provider: .codex, snapshot: state.snapshot, live: state.status == .ready) + var next = state + if next.snapshot == nil { next.snapshot = codex.snapshot } + if isCancelled(provider: .codex) { next.status = .cancelled } + codex = next } private func resumeIfActivityIncreased(provider: UsageProvider, snapshot: ProviderUsageSnapshot?, live: Bool) { @@ -314,21 +304,17 @@ final class UsageStore: ObservableObject { live, let snapshot, !snapshot.windows.isEmpty, snapshot.activityReadSucceeded, let capturedAt = snapshot.capturedAt, capturedAt > cancelledAt else { return } - let formatter = DateFormatter() - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.calendar = Calendar(identifier: .gregorian) - formatter.dateFormat = "yyyy-MM-dd" - let cancelledDay = formatter.string(from: cancelledAt) + let calendar = Self.dayCalendar + let cancelledDay = Self.dayKey(for: cancelledAt, calendar: calendar) var totals: [String: Int] = [:] for usage in snapshot.dailyUsage { - guard usage.day >= cancelledDay, let day = formatter.date(from: usage.day), - formatter.string(from: day) == usage.day + guard usage.day >= cancelledDay, let day = Self.date(fromDayKey: usage.day, calendar: calendar), + Self.dayKey(for: day, calendar: calendar) == usage.day else { continue } totals[usage.day] = max(totals[usage.day, default: 0], usage.tokens) } - let key = baselineKey(for: provider) - guard let baseline = defaults.dictionary(forKey: key) as? [String: Int] else { - defaults.set(totals, forKey: key) + guard let baseline = preferences.cancellationDailyBaseline(provider) else { + preferences.setCancellationDailyBaseline(totals, for: provider) return } if totals.contains(where: { $0.value > baseline[$0.key, default: 0] }) { @@ -340,22 +326,21 @@ final class UsageStore: ObservableObject { ProviderStateResolver.menuBarWindow(state: state(for: primaryProvider), claudeSource: claudeMenuBarSource) } - private nonisolated static func fetchCodex(client: CodexAppServerClient) -> ProviderViewState { - do { - let snapshot = try client.fetch() - return ProviderViewState( - snapshot: snapshot, - status: ProviderStateResolver.codexStatus(snapshot: snapshot), - isRefreshing: false - ) - } catch UsageDataError.authenticationRequired { - return ProviderViewState( - snapshot: client.cached(), status: .authenticationRequired, isRefreshing: false) - } catch { - let cached = client.cached() - return ProviderViewState( - snapshot: cached, status: cached == nil ? .unavailable : .stale, isRefreshing: false) - } + private nonisolated static var dayCalendar: Calendar { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = .current + return calendar + } + + nonisolated static func dayKey(for date: Date, calendar: Calendar = dayCalendar) -> String { + let parts = calendar.dateComponents([.year, .month, .day], from: date) + return String(format: "%04ld-%02ld-%02ld", parts.year ?? 0, parts.month ?? 0, parts.day ?? 0) + } + + private nonisolated static func date(fromDayKey key: String, calendar: Calendar) -> Date? { + let parts = key.split(separator: "-", omittingEmptySubsequences: false).compactMap { Int($0) } + guard parts.count == 3 else { return nil } + return calendar.date(from: DateComponents(year: parts[0], month: parts[1], day: parts[2])) } } diff --git a/Sources/TokenGaugeApp/Support/UsageFormatters.swift b/Sources/TokenGaugeApp/Support/UsageFormatters.swift index 50cf378..06f0022 100644 --- a/Sources/TokenGaugeApp/Support/UsageFormatters.swift +++ b/Sources/TokenGaugeApp/Support/UsageFormatters.swift @@ -2,14 +2,15 @@ import Foundation import TokenGaugeCore enum UsageFormatters { + private static let integer = IntegerFormatStyle.number + private static let smallDecimal = FloatingPointFormatStyle.number.precision(.fractionLength(1)) + private static let largeDecimal = FloatingPointFormatStyle.number.precision(.fractionLength(0...1)) + static func percentage(_ value: Double) -> String { "\(Int(value.rounded()))%" } static func tokens(_ value: Int) -> String { - let formatter = NumberFormatter() - formatter.numberStyle = .decimal - formatter.maximumFractionDigits = 1 if value >= 1_000_000_000 { return "\(decimal(Double(value) / 1_000_000_000))B" } @@ -19,7 +20,7 @@ enum UsageFormatters { if value >= 1_000 { return "\(decimal(Double(value) / 1_000))K" } - return formatter.string(from: NSNumber(value: value)) ?? "\(value)" + return value.formatted(integer) } @MainActor static func reset( @@ -53,20 +54,13 @@ enum UsageFormatters { } @MainActor private static func span(_ interval: TimeInterval, units: NSCalendar.Unit) -> String? { - let formatter = DateComponentsFormatter() - formatter.calendar?.locale = Locale(identifier: LocalizationManager.shared.language.rawValue) - formatter.unitsStyle = .abbreviated - formatter.maximumUnitCount = 1 + let formatter = LocalizedFormatters.current.span formatter.allowedUnits = units return formatter.string(from: max(interval, 60)) } @MainActor private static func clock(_ date: Date) -> String { - let formatter = DateFormatter() - formatter.locale = Locale(identifier: LocalizationManager.shared.language.rawValue) - formatter.dateStyle = .none - formatter.timeStyle = .short - return formatter.string(from: date) + LocalizedFormatters.current.clock.string(from: date) } @MainActor static func resetCredits(_ count: Int) -> String { @@ -77,10 +71,7 @@ enum UsageFormatters { guard let date else { return "updated.never".localized } let age = Date().timeIntervalSince(date) guard age >= 10 else { return "updated.now".localized } - let formatter = RelativeDateTimeFormatter() - formatter.locale = Locale(identifier: LocalizationManager.shared.language.rawValue) - formatter.unitsStyle = .short - return formatter.localizedString(for: date, relativeTo: Date()) + return LocalizedFormatters.current.relative.localizedString(for: date, relativeTo: Date()) } @MainActor static func windowName(_ window: QuotaWindow) -> String { @@ -119,10 +110,37 @@ enum UsageFormatters { } private static func decimal(_ value: Double) -> String { - let formatter = NumberFormatter() - formatter.numberStyle = .decimal - formatter.maximumFractionDigits = 1 - formatter.minimumFractionDigits = value < 10 ? 1 : 0 - return formatter.string(from: NSNumber(value: value)) ?? String(format: "%.1f", value) + value.formatted(value < 10 ? smallDecimal : largeDecimal) + } +} + +@MainActor +private struct LocalizedFormatters { + let span: DateComponentsFormatter + let clock: DateFormatter + let relative: RelativeDateTimeFormatter + + private static var cache: [AppLanguage: LocalizedFormatters] = [:] + + static var current: LocalizedFormatters { + let language = LocalizationManager.shared.language + if let formatters = cache[language] { return formatters } + let formatters = LocalizedFormatters(locale: Locale(identifier: language.rawValue)) + cache[language] = formatters + return formatters + } + + private init(locale: Locale) { + span = DateComponentsFormatter() + span.calendar?.locale = locale + span.unitsStyle = .abbreviated + span.maximumUnitCount = 1 + clock = DateFormatter() + clock.locale = locale + clock.dateStyle = .none + clock.timeStyle = .short + relative = RelativeDateTimeFormatter() + relative.locale = locale + relative.unitsStyle = .short } } diff --git a/Sources/TokenGaugeApp/Views/SettingsView.swift b/Sources/TokenGaugeApp/Views/SettingsView.swift index c131050..01bd78e 100644 --- a/Sources/TokenGaugeApp/Views/SettingsView.swift +++ b/Sources/TokenGaugeApp/Views/SettingsView.swift @@ -7,7 +7,7 @@ struct SettingsView: View { @ObservedObject var launchAtLogin: LaunchAtLoginManager @ObservedObject private var localization = LocalizationManager.shared @ObservedObject private var updates = UpdateManager.shared - @AppStorage("codexExecutablePath") private var codexExecutablePath = "" + @AppStorage(AppPreferences.Key.codexExecutablePath) private var codexExecutablePath = "" var body: some View { VStack(alignment: .leading, spacing: 18) { diff --git a/Tests/TokenGaugeAppTests/AppPreferencesTests.swift b/Tests/TokenGaugeAppTests/AppPreferencesTests.swift new file mode 100644 index 0000000..02b24e7 --- /dev/null +++ b/Tests/TokenGaugeAppTests/AppPreferencesTests.swift @@ -0,0 +1,115 @@ +import Foundation +import TokenGaugeCore +import XCTest + +@testable import TokenGaugeApp + +@MainActor +final class AppPreferencesTests: XCTestCase { + func testPreferenceKeysAreUnchanged() { + XCTAssertEqual(AppPreferences.Key.primaryProvider, "primaryProvider") + XCTAssertEqual(AppPreferences.Key.displayMode, "displayMode") + XCTAssertEqual(AppPreferences.Key.menuBarSize, "menuBarSize") + XCTAssertEqual(AppPreferences.Key.quotaPanelStyle, "quotaPanelStyle") + XCTAssertEqual(AppPreferences.Key.quotaMenuBarStyle, "quotaMenuBarStyle") + XCTAssertEqual(AppPreferences.Key.quotaAnimateChanges, "quotaAnimateChanges") + XCTAssertEqual(AppPreferences.Key.historyMode, "historyMode") + XCTAssertEqual(AppPreferences.Key.showHourlyPace, "showHourlyPace") + XCTAssertEqual(AppPreferences.Key.showLunaReserve, "showLunaReserve") + XCTAssertEqual(AppPreferences.Key.hiddenClaudeWindows, "hiddenClaudeWindows") + XCTAssertEqual(AppPreferences.Key.claudeMenuBarSource, "claudeMenuBarSource") + XCTAssertEqual(AppPreferences.Key.claudeAutomaticRecovery, "claudeAutomaticRecovery") + XCTAssertEqual(AppPreferences.Key.claudeRecoveryNextAttempt, "claudeRecoveryNextAttempt") + XCTAssertEqual(AppPreferences.Key.claudeRecoveryFailures, "claudeRecoveryFailures") + XCTAssertEqual(AppPreferences.Key.appLanguage, "appLanguage") + XCTAssertEqual(AppPreferences.Key.codexExecutablePath, "codexExecutablePath") + XCTAssertEqual(AppPreferences.Key.cancelledAt(.claude), "claudeCancelledAt") + XCTAssertEqual(AppPreferences.Key.cancelledAt(.codex), "codexCancelledAt") + XCTAssertEqual(AppPreferences.Key.cancellationDailyBaseline(.claude), "claudeCancellationDailyBaseline") + XCTAssertEqual(AppPreferences.Key.cancellationDailyBaseline(.codex), "codexCancellationDailyBaseline") + } + + func testLegacyDefaultsAreReadAndWrittenWithTheSameShapes() { + withDefaults { defaults in + let cancelledAt = Date(timeIntervalSince1970: 1_800_000_000) + defaults.set("claude", forKey: "primaryProvider") + defaults.set("unified", forKey: "displayMode") + defaults.set("small", forKey: "menuBarSize") + defaults.set("compact", forKey: "quotaPanelStyle") + defaults.set("bars", forKey: "quotaMenuBarStyle") + defaults.set(false, forKey: "quotaAnimateChanges") + defaults.set("calendar", forKey: "historyMode") + defaults.set(false, forKey: "showHourlyPace") + defaults.set(false, forKey: "showLunaReserve") + defaults.set(["modelWeekly", "session"], forKey: "hiddenClaudeWindows") + defaults.set("weekly", forKey: "claudeMenuBarSource") + defaults.set(true, forKey: "claudeAutomaticRecovery") + defaults.set(cancelledAt, forKey: "codexCancelledAt") + defaults.set(["2026-09-17": 12], forKey: "codexCancellationDailyBaseline") + + let store = UsageStore(defaults: defaults) + XCTAssertEqual(store.primaryProvider, .claude) + XCTAssertEqual(store.displayMode, .unified) + XCTAssertEqual(store.menuBarSize, .small) + XCTAssertEqual(store.panelStyle, .compact) + XCTAssertEqual(store.menuBarStyle, .bars) + XCTAssertFalse(store.animateChanges) + XCTAssertEqual(store.historyMode, .calendar) + XCTAssertFalse(store.showHourlyPace) + XCTAssertFalse(store.showLunaReserve) + XCTAssertEqual(store.hiddenClaudeWindows, [.modelWeekly, .session]) + XCTAssertEqual(store.claudeMenuBarSource, .weekly) + XCTAssertTrue(store.claudeAutomaticRecovery) + XCTAssertEqual(store.codexCancelledAt, cancelledAt) + XCTAssertEqual(store.codex.status, .cancelled) + XCTAssertTrue(store.recoveryAuthorization.isAllowed) + + store.menuBarSize = .medium + store.setClaudeWindow(.session, visible: true) + store.claudeAutomaticRecovery = false + store.setCancelled(true, for: .claude) + XCTAssertEqual(defaults.string(forKey: "menuBarSize"), "medium") + XCTAssertEqual(defaults.stringArray(forKey: "hiddenClaudeWindows"), ["modelWeekly"]) + XCTAssertFalse(defaults.bool(forKey: "claudeAutomaticRecovery")) + XCTAssertNotNil(defaults.object(forKey: "claudeCancelledAt") as? Date) + XCTAssertNil(defaults.object(forKey: "claudeCancellationDailyBaseline")) + XCTAssertEqual( + defaults.dictionary(forKey: "codexCancellationDailyBaseline") as? [String: Int], ["2026-09-17": 12]) + } + } + + func testFreshDefaultsKeepTheShippedFallbacks() { + withDefaults { defaults in + let preferences = AppPreferences(defaults: defaults) + XCTAssertEqual(preferences.primaryProvider, .codex) + XCTAssertEqual(preferences.displayMode, .codex) + XCTAssertEqual(preferences.menuBarSize, .large) + XCTAssertEqual(preferences.panelStyle, .standard) + XCTAssertEqual(preferences.menuBarStyle, .numbers) + XCTAssertTrue(preferences.animateChanges) + XCTAssertEqual(preferences.historyMode, .recent) + XCTAssertTrue(preferences.showHourlyPace) + XCTAssertTrue(preferences.showLunaReserve) + XCTAssertTrue(preferences.hiddenClaudeWindows.isEmpty) + XCTAssertEqual(preferences.claudeMenuBarSource, .automatic) + XCTAssertFalse(preferences.claudeAutomaticRecovery) + XCTAssertFalse(preferences.claudeAutomaticRecoveryDecided) + XCTAssertNil(preferences.claudeRecoveryNextAttempt) + XCTAssertEqual(preferences.claudeRecoveryFailures, 0) + XCTAssertNil(preferences.cancelledAt(.claude)) + XCTAssertNil(preferences.cancellationDailyBaseline(.codex)) + + preferences.claudeAutomaticRecovery = false + XCTAssertTrue(preferences.claudeAutomaticRecoveryDecided) + preferences.claudeRecoveryNextAttempt = nil + XCTAssertNil(defaults.object(forKey: "claudeRecoveryNextAttempt")) + } + } + + private func withDefaults(_ body: (UserDefaults) -> Void) { + let suite = "TokenGauge.preferences-tests.\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defer { defaults.removePersistentDomain(forName: suite) } + body(defaults) + } +} diff --git a/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift b/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift new file mode 100644 index 0000000..e8f4a82 --- /dev/null +++ b/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift @@ -0,0 +1,174 @@ +import Combine +import Foundation +import TokenGaugeCore +import XCTest +import os + +@testable import TokenGaugeApp + +@MainActor +final class UsageStoreRefreshTests: XCTestCase { + func testRefreshPublishesEachProviderOnce() async throws { + try await withDefaults { defaults in + let now = Date() + let claudeSnapshot = snapshot(.claude, now: now) + let codexSnapshot = snapshot(.codex, now: now) + let refresher = UsageRefresher( + homeDirectory: FileManager.default.temporaryDirectory, + fetchClaude: { _ in ClaudeUsageResult(snapshot: claudeSnapshot, access: .live, lastActivityAt: now) }, + fetchCodex: { ProviderViewState(snapshot: codexSnapshot, status: .ready, isRefreshing: false) }) + let store = UsageStore( + refresher: refresher, defaults: defaults, initialSnapshots: [claudeSnapshot, codexSnapshot], + historyReadsEnabled: false) + var claudePublishes: [ProviderViewState] = [] + var codexPublishes: [ProviderViewState] = [] + let subscriptions = [ + store.$claude.dropFirst().sink { claudePublishes.append($0) }, + store.$codex.dropFirst().sink { codexPublishes.append($0) }, + ] + + store.refresh(force: true) + try await waitUntilIdle(store) + + XCTAssertEqual(claudePublishes.map(\.isRefreshing), [true, false]) + XCTAssertEqual(codexPublishes.map(\.isRefreshing), [true, false]) + XCTAssertEqual(store.claude.status, .ready) + XCTAssertEqual(store.codex.status, .ready) + XCTAssertEqual(store.claude.snapshot, claudeSnapshot) + XCTAssertEqual(store.codex.snapshot, codexSnapshot) + XCTAssertNotNil(store.lastRefresh) + withExtendedLifetime(subscriptions) {} + } + } + + func testUnforcedRefreshWaitsAMinuteAndForcedRefreshFetchesAgain() async throws { + try await withDefaults { defaults in + let fetches = OSAllocatedUnfairLock(initialState: 0) + let refresher = UsageRefresher( + homeDirectory: FileManager.default.temporaryDirectory, + fetchClaude: { _ in + fetches.withLock { $0 += 1 } + return nil + }, + fetchCodex: { ProviderViewState(snapshot: nil, status: .unavailable, isRefreshing: false) }) + let store = UsageStore(refresher: refresher, defaults: defaults, historyReadsEnabled: false) + + store.refresh(force: true) + try await waitUntilIdle(store) + XCTAssertEqual(fetches.withLock { $0 }, 1) + XCTAssertEqual(store.claude.status, .unavailable) + + store.refresh() + XCTAssertFalse(store.isRefreshing) + XCTAssertEqual(fetches.withLock { $0 }, 1) + + store.refresh(force: true) + try await waitUntilIdle(store) + XCTAssertEqual(fetches.withLock { $0 }, 2) + } + } + + func testCodexOutcomeIsPublishedBeforeClaudeResolves() async throws { + try await withDefaults { defaults in + let now = Date() + let claudeSnapshot = snapshot(.claude, now: now) + let codexSnapshot = snapshot(.codex, now: now) + let releaseClaude = DispatchSemaphore(value: 0) + let refresher = UsageRefresher( + homeDirectory: FileManager.default.temporaryDirectory, + fetchClaude: { _ in + releaseClaude.wait() + return ClaudeUsageResult(snapshot: claudeSnapshot, access: .live, lastActivityAt: now) + }, + fetchCodex: { ProviderViewState(snapshot: codexSnapshot, status: .ready, isRefreshing: false) }) + let store = UsageStore( + refresher: refresher, defaults: defaults, initialSnapshots: [claudeSnapshot, codexSnapshot], + historyReadsEnabled: false) + let codexPublished = expectation(description: "codex result published") + var claudePublishes: [ProviderViewState] = [] + var codexPublishes: [ProviderViewState] = [] + let subscriptions = [ + store.$claude.dropFirst().sink { claudePublishes.append($0) }, + store.$codex.dropFirst().sink { + codexPublishes.append($0) + if !$0.isRefreshing { codexPublished.fulfill() } + }, + ] + + store.refresh(force: true) + await fulfillment(of: [codexPublished], timeout: 2) + + XCTAssertEqual(codexPublishes.map(\.isRefreshing), [true, false]) + XCTAssertEqual(store.codex.status, .ready) + XCTAssertEqual(store.codex.snapshot, codexSnapshot) + XCTAssertEqual(claudePublishes.map(\.isRefreshing), [true]) + XCTAssertTrue(store.claude.isRefreshing) + XCTAssertTrue(store.isRefreshing) + + releaseClaude.signal() + try await waitUntilIdle(store) + + XCTAssertEqual(claudePublishes.map(\.isRefreshing), [true, false]) + XCTAssertEqual(codexPublishes.map(\.isRefreshing), [true, false]) + XCTAssertEqual(store.claude.status, .ready) + XCTAssertNotNil(store.lastRefresh) + withExtendedLifetime(subscriptions) {} + } + } + + func testDayKeyMatchesTheLegacyFormatterAndFollowsTheCalendarTimeZone() { + let utc = calendar("UTC") + let tokyo = calendar("Asia/Tokyo") + let lima = calendar("America/Lima") + let date = utc.date(from: DateComponents(year: 2026, month: 9, day: 17, hour: 23, minute: 30))! + + XCTAssertEqual(UsageStore.dayKey(for: date, calendar: utc), "2026-09-17") + XCTAssertEqual(UsageStore.dayKey(for: date, calendar: tokyo), "2026-09-18") + XCTAssertEqual(UsageStore.dayKey(for: date, calendar: lima), "2026-09-17") + + for calendar in [utc, tokyo, lima] { + let legacy = DateFormatter() + legacy.locale = Locale(identifier: "en_US_POSIX") + legacy.calendar = Calendar(identifier: .gregorian) + legacy.timeZone = calendar.timeZone + legacy.dateFormat = "yyyy-MM-dd" + for offset: TimeInterval in [0, 1_800, 86_400 * 100, -86_400 * 400, 86_400 * 3_650] { + let probe = date.addingTimeInterval(offset) + XCTAssertEqual(UsageStore.dayKey(for: probe, calendar: calendar), legacy.string(from: probe)) + } + } + } + + private func calendar(_ timeZone: String) -> Calendar { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = TimeZone(identifier: timeZone)! + return calendar + } + + private func waitUntilIdle(_ store: UsageStore) async throws { + for _ in 0..<400 where store.isRefreshing { + try await Task.sleep(for: .milliseconds(5)) + } + XCTAssertFalse(store.isRefreshing) + } + + private func snapshot(_ provider: UsageProvider, now: Date) -> ProviderUsageSnapshot { + ProviderUsageSnapshot( + provider: provider, + windows: [ + QuotaWindow( + id: "\(provider.rawValue).weekly", usedPercentage: 20, resetsAt: now.addingTimeInterval(86_400), + durationMinutes: 10_080, displayName: nil) + ], + dailyUsage: [DailyTokenUsage(day: "2026-09-17", tokens: 100)], + summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: now, + activityReadSucceeded: true) + } + + private func withDefaults(_ body: (UserDefaults) async throws -> Void) async rethrows { + let suite = "TokenGauge.refresh-tests.\(UUID().uuidString)" + let defaults = UserDefaults(suiteName: suite)! + defer { defaults.removePersistentDomain(forName: suite) } + try await body(defaults) + } +} From f58630f4d94e4253f73e37983d8b5f608017eb92 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:56:38 -0500 Subject: [PATCH 09/21] perf(capture): single-pass incremental transcript scan with persisted offsets and one collect spawn --- .../Services/ClaudeUsageClient.swift | 7 +- .../Services/EffortHistoryClient.swift | 23 +- Sources/TokenGaugeCapture/main.swift | 26 +- .../TokenGaugeCore/ClaudeHistoryScanner.swift | 178 ++------ .../EffortTranscriptMetadata.swift | 16 +- .../TokenGaugeCore/EffortUsageRecord.swift | 42 +- .../TokenGaugeCore/EffortUsageScanner.swift | 134 ++---- ...ortJSONLReader.swift => JSONLReader.swift} | 25 +- Sources/TokenGaugeCore/ScanState.swift | 326 ++++++++++++++ .../ClaudeHistoryProcessTests.swift | 21 +- .../TranscriptScannerTests.swift | 413 ++++++++++++++++++ 11 files changed, 934 insertions(+), 277 deletions(-) rename Sources/TokenGaugeCore/{EffortJSONLReader.swift => JSONLReader.swift} (62%) create mode 100644 Sources/TokenGaugeCore/ScanState.swift create mode 100644 Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift diff --git a/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift b/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift index 0ab8390..4c1edc5 100644 --- a/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift +++ b/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift @@ -178,7 +178,7 @@ struct ClaudeUsageClient: Sendable { static func historyBuckets( executable: URL, - arguments: [String] = ["--history"], + arguments: [String] = ["--collect"], timeout: TimeInterval = 20, workingDirectory: URL ) throws -> [ModelTokenBucket] { @@ -196,11 +196,14 @@ struct ClaudeUsageClient: Sendable { guard result.exitCode == 0 else { throw UsageDataError.processFailed("History helper exited with status \(result.exitCode)") } + let collection: CaptureCollection do { - return try JSONDecoder().decode([ModelTokenBucket].self, from: result.standardOutput) + collection = try JSONDecoder().decode(CaptureCollection.self, from: result.standardOutput) } catch { throw UsageDataError.invalidPayload } + EffortHistoryClient.markRecorded(by: collection) + return collection.buckets } private func resolveCaptureExecutable() -> URL? { diff --git a/Sources/TokenGaugeApp/Services/EffortHistoryClient.swift b/Sources/TokenGaugeApp/Services/EffortHistoryClient.swift index d7986a0..205f038 100644 --- a/Sources/TokenGaugeApp/Services/EffortHistoryClient.swift +++ b/Sources/TokenGaugeApp/Services/EffortHistoryClient.swift @@ -3,16 +3,29 @@ import TokenGaugeCore import os enum EffortHistoryClient { - private static let collecting = OSAllocatedUnfairLock(initialState: false) + private struct State { + var collecting = false + var recordedByCapture = false + } + + private static let state = OSAllocatedUnfairLock(initialState: State()) + + static func markRecorded(by collection: CaptureCollection) { + state.withLock { $0.recordedByCapture = collection.effortRecords != nil } + } static func collect(homeDirectory: URL = FileManager.default.homeDirectoryForCurrentUser) throws { - let acquired = collecting.withLock { active in - guard !active else { return false } - active = true + let acquired = state.withLock { state in + if state.recordedByCapture { + state.recordedByCapture = false + return false + } + guard !state.collecting else { return false } + state.collecting = true return true } guard acquired else { return } - defer { collecting.withLock { $0 = false } } + defer { state.withLock { $0.collecting = false } } guard let directory = Bundle.main.executableURL?.deletingLastPathComponent() else { throw UsageDataError.executableNotFound } diff --git a/Sources/TokenGaugeCapture/main.swift b/Sources/TokenGaugeCapture/main.swift index 4949e4d..da86b14 100644 --- a/Sources/TokenGaugeCapture/main.swift +++ b/Sources/TokenGaugeCapture/main.swift @@ -4,24 +4,30 @@ import TokenGaugeCore @main enum TokenGaugeCapture { static func main() throws { - let recordEffort = CommandLine.arguments.contains("--record-effort-history") - if recordEffort || CommandLine.arguments.contains("--effort-history") { + let arguments = Set(CommandLine.arguments.dropFirst()) + if arguments.contains("--collect") { + let scan = try TranscriptScanner.scan(stateURL: TranscriptScanner.stateURL()) + let recorded = (try? UsageHistoryStore.recordEffort(scan.effortRecords)) != nil + try emit(CaptureCollection(buckets: scan.buckets, effortRecords: recorded ? scan.effortRecords.count : nil)) + return + } + let recordEffort = arguments.contains("--record-effort-history") + if recordEffort || arguments.contains("--effort-history") { do { - let records = try EffortUsageScanner.scan() + let records = try TranscriptScanner.scan(stateURL: TranscriptScanner.stateURL()).effortRecords if recordEffort { try UsageHistoryStore.recordEffort(records) - FileHandle.standardOutput.write(try JSONEncoder().encode(["records": records.count])) + try emit(["records": records.count]) } else { - FileHandle.standardOutput.write(try JSONEncoder().encode(records)) + try emit(records) } } catch { exit(1) } return } - if CommandLine.arguments.contains("--history") { - let usage = try ClaudeHistoryScanner.scan() - FileHandle.standardOutput.write(try JSONEncoder().encode(usage)) + if arguments.contains("--history") { + try emit(try TranscriptScanner.scan(stateURL: TranscriptScanner.stateURL()).buckets) return } let data = FileHandle.standardInput.readDataToEndOfFile() @@ -31,4 +37,8 @@ enum TokenGaugeCapture { else { return } try SecureMetricStore.write(snapshot, to: UsagePaths.claudeCapture()) } + + private static func emit(_ value: T) throws { + FileHandle.standardOutput.write(try JSONEncoder().encode(value)) + } } diff --git a/Sources/TokenGaugeCore/ClaudeHistoryScanner.swift b/Sources/TokenGaugeCore/ClaudeHistoryScanner.swift index cea6ecb..98c1660 100644 --- a/Sources/TokenGaugeCore/ClaudeHistoryScanner.swift +++ b/Sources/TokenGaugeCore/ClaudeHistoryScanner.swift @@ -7,70 +7,44 @@ public enum ClaudeHistoryScanner { now: Date = Date(), calendar: Calendar = .current ) throws -> [ModelTokenBucket] { - guard days > 0 else { return [] } - let start = calendar.startOfDay(for: calendar.date(byAdding: .day, value: -(days - 1), to: now) ?? now) - let keys: [URLResourceKey] = [.isRegularFileKey, .contentModificationDateKey] - guard - let enumerator = FileManager.default.enumerator( - at: projectsRoot, - includingPropertiesForKeys: keys, - options: [.skipsHiddenFiles] - ) - else { return [] } - - let fractionalFormatter = ISO8601DateFormatter() - fractionalFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] - let standardFormatter = ISO8601DateFormatter() - let decoder = JSONDecoder() - var messages: [String: (day: String, hour: Date, model: String, tokens: Int)] = [:] - - for case let fileURL as URL in enumerator { - guard fileURL.pathExtension == "jsonl" else { continue } - let values = try fileURL.resourceValues(forKeys: Set(keys)) - guard values.isRegularFile == true, (values.contentModificationDate ?? .distantPast) >= start else { - continue - } + try TranscriptScanner.scan( + claudeProjects: projectsRoot, codexSessions: nil, stateURL: nil, now: now, calendar: calendar, + historyDays: days, effortDays: 0 + ).buckets + } - try JSONLReader.read(fileURL) { line in - autoreleasepool { - guard - let record = try? decoder.decode(ClaudeTranscriptRecord.self, from: line), - record.type == "assistant", - let message = record.message, - let usage = message.usage, - let timestamp = record.timestamp, - let date = fractionalFormatter.date(from: timestamp) ?? standardFormatter.date(from: timestamp), - date >= start, - date <= now.addingTimeInterval(300), - let messageID = message.id ?? record.uuid - else { return } + static func entry(from metadata: EffortTranscriptMetadata, at date: Date) -> ScanEntry? { + guard metadata.type == "assistant", let message = metadata.message, let usage = message.usage, + let key = message.id ?? metadata.uuid, let tokens = usage.claudeTotal, tokens > 0 + else { return nil } + let time = date.timeIntervalSince1970 + return ScanEntry( + id: EffortUsageScanner.hash(provider: .claude, identifier: key), firstAt: time, peakAt: time, + tokens: tokens, model: normalizedModel(message.model), + effortModel: EffortTranscriptMetadata.normalizedModel(message.model), + effort: EffortTranscriptMetadata.normalizedEffort(metadata.perTurnEffort ?? metadata.effort), + eligible: message.id?.isEmpty == false) + } - let tokens = - max(usage.inputTokens ?? 0, 0) - + max(usage.outputTokens ?? 0, 0) - + max(usage.cacheCreationInputTokens ?? 0, 0) - + max(usage.cacheReadInputTokens ?? 0, 0) - guard tokens > 0 else { return } - let model = normalizedModel(message.model) - let day = dayString(date, calendar: calendar) - let hour = hourStart(date) - if let current = messages[messageID], current.tokens >= tokens { - return - } - messages[messageID] = (day, hour, model, tokens) - } - } + static func buckets( + _ entries: some Sequence, start: Date, now: Date, calendar: Calendar + ) -> [ModelTokenBucket] { + let earliest = start.timeIntervalSince1970 + let latest = now.timeIntervalSince1970 + 300 + var totals: [String: ModelTokenBucket] = [:] + let ordered = entries.filter { $0.peakAt >= earliest && $0.peakAt <= latest }.sorted { + $0.peakAt == $1.peakAt ? $0.id < $1.id : $0.peakAt < $1.peakAt } - - var totals: [ModelTokenBucket.ID: ModelTokenBucket] = [:] - for message in messages.values { - let key = "\(message.model)-\(message.hour.timeIntervalSince1970)" - let merged = (totals[key]?.tokens ?? 0) + message.tokens + for entry in ordered { + let hour = hourStart(entry.peakAt) + let key = "\(entry.model)-\(hour.timeIntervalSince1970)" + let current = totals[key] totals[key] = ModelTokenBucket( - day: message.day, - hourStart: message.hour, - model: message.model, - tokens: merged + day: current?.day + ?? TranscriptScanner.dayString(Date(timeIntervalSince1970: entry.peakAt), calendar: calendar), + hourStart: hour, + model: entry.model, + tokens: (current?.tokens ?? 0) + entry.tokens ) } return totals.values.sorted { left, right in @@ -84,87 +58,7 @@ public enum ClaudeHistoryScanner { return raw } - private static func hourStart(_ date: Date) -> Date { - Date(timeIntervalSince1970: (date.timeIntervalSince1970 / 3600).rounded(.down) * 3600) - } - - private static func dayString(_ date: Date, calendar: Calendar) -> String { - let components = calendar.dateComponents([.year, .month, .day], from: date) - return String( - format: "%04d-%02d-%02d", - components.year ?? 0, - components.month ?? 0, - components.day ?? 0 - ) - } -} - -private struct ClaudeTranscriptRecord: Decodable { - let type: String? - let timestamp: String? - let uuid: String? - let message: ClaudeTranscriptMessage? -} - -private struct ClaudeTranscriptMessage: Decodable { - let id: String? - let model: String? - let usage: ClaudeTranscriptUsage? -} - -private struct ClaudeTranscriptUsage: Decodable { - let inputTokens: Int? - let outputTokens: Int? - let cacheCreationInputTokens: Int? - let cacheReadInputTokens: Int? - - enum CodingKeys: String, CodingKey { - case inputTokens = "input_tokens" - case outputTokens = "output_tokens" - case cacheCreationInputTokens = "cache_creation_input_tokens" - case cacheReadInputTokens = "cache_read_input_tokens" - } -} - -private enum JSONLReader { - private static let maximumLineBytes = 1_048_576 - - static func read(_ url: URL, lineHandler: (Data) -> Void) throws { - let handle = try FileHandle(forReadingFrom: url) - defer { try? handle.close() } - var buffer = Data() - var discardingLongLine = false - - while true { - let chunk = try handle.read(upToCount: 65_536) ?? Data() - if chunk.isEmpty { - if !discardingLongLine, !buffer.isEmpty { lineHandler(buffer) } - return - } - - var segmentStart = chunk.startIndex - while segmentStart < chunk.endIndex, - let newline = chunk[segmentStart...].firstIndex(of: 0x0A) - { - let segment = chunk[segmentStart.. maximumLineBytes { - buffer.removeAll(keepingCapacity: false) - discardingLongLine = true - } else { - buffer.append(contentsOf: tail) - } - } + private static func hourStart(_ time: TimeInterval) -> Date { + Date(timeIntervalSince1970: (time / 3600).rounded(.down) * 3600) } } diff --git a/Sources/TokenGaugeCore/EffortTranscriptMetadata.swift b/Sources/TokenGaugeCore/EffortTranscriptMetadata.swift index 44f935c..4ae3e75 100644 --- a/Sources/TokenGaugeCore/EffortTranscriptMetadata.swift +++ b/Sources/TokenGaugeCore/EffortTranscriptMetadata.swift @@ -3,6 +3,7 @@ import Foundation struct EffortTranscriptMetadata: Decodable { let type: String? let timestamp: String? + let uuid: String? let perTurnEffort: String? let effort: String? let payload: Payload? @@ -40,18 +41,19 @@ struct EffortTranscriptMetadata: Decodable { } } + private static let efforts: Set = [ + "none", "minimal", "low", "medium", "high", "xhigh", "max", "ultra", "auto", + ] + private static let modelCharacters = CharacterSet( + charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.") + static func normalizedEffort(_ raw: String?) -> String { let value = raw?.lowercased() ?? "unknown" - return ["none", "minimal", "low", "medium", "high", "xhigh", "max", "ultra", "auto"].contains(value) - ? value : "unknown" + return efforts.contains(value) ? value : "unknown" } static func normalizedModel(_ raw: String?) -> String { - guard let raw, !raw.isEmpty, raw.count <= 100, - raw.unicodeScalars.allSatisfy({ - CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.") - .contains($0) - }) + guard let raw, !raw.isEmpty, raw.count <= 100, raw.unicodeScalars.allSatisfy(modelCharacters.contains) else { return "unknown" } return raw } diff --git a/Sources/TokenGaugeCore/EffortUsageRecord.swift b/Sources/TokenGaugeCore/EffortUsageRecord.swift index fee2371..a685f98 100644 --- a/Sources/TokenGaugeCore/EffortUsageRecord.swift +++ b/Sources/TokenGaugeCore/EffortUsageRecord.swift @@ -21,26 +21,42 @@ public struct EffortUsageRecord: Codable, Equatable, Sendable { self.tokens = tokens } + private static let hexCharacters = CharacterSet(charactersIn: "0123456789abcdefABCDEF") + private static let identifierCharacters = CharacterSet( + charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-") + private static let efforts: Set = [ + "unknown", "minimal", "low", "medium", "high", "xhigh", "max", "ultra", "none", "auto", + ] + private static let utcCalendar: Calendar = { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = TimeZone(secondsFromGMT: 0)! + return calendar + }() + var isValid: Bool { - let hex = CharacterSet(charactersIn: "0123456789abcdefABCDEF") - let identifier = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-") - let efforts: Set = [ - "unknown", "minimal", "low", "medium", "high", "xhigh", "max", "ultra", "none", "auto", - ] - guard id.utf8.count == 64, id.unicodeScalars.allSatisfy(hex.contains), - !model.isEmpty, model.utf8.count <= 128, model.unicodeScalars.allSatisfy(identifier.contains), - efforts.contains(effort), tokens >= 0, + guard id.utf8.count == 64, id.unicodeScalars.allSatisfy(Self.hexCharacters.contains), + !model.isEmpty, model.utf8.count <= 128, + model.unicodeScalars.allSatisfy(Self.identifierCharacters.contains), + Self.efforts.contains(effort), tokens >= 0, recordedAt.timeIntervalSince1970.isFinite, (0...253_402_300_799).contains(recordedAt.timeIntervalSince1970), - day.utf8.count == 10, day.range(of: #"^\d{4}-\d{2}-\d{2}$"#, options: .regularExpression) != nil + Self.isDayFormat(day) else { return false } let parts = day.split(separator: "-").compactMap { Int($0) } guard parts.count == 3, (1970...9999).contains(parts[0]) else { return false } - var calendar = Calendar(identifier: .gregorian) - calendar.timeZone = TimeZone(secondsFromGMT: 0)! let components = DateComponents(year: parts[0], month: parts[1], day: parts[2]) - guard let date = calendar.date(from: components) else { return false } - return calendar.dateComponents([.year, .month, .day], from: date) == components + guard let date = Self.utcCalendar.date(from: components) else { return false } + return Self.utcCalendar.dateComponents([.year, .month, .day], from: date) == components + } + + private static func isDayFormat(_ day: String) -> Bool { + let bytes = Array(day.utf8) + guard bytes.count == 10 else { return false } + for (index, byte) in bytes.enumerated() { + let expected: ClosedRange = index == 4 || index == 7 ? 0x2D...0x2D : 0x30...0x39 + guard expected.contains(byte) else { return false } + } + return true } } diff --git a/Sources/TokenGaugeCore/EffortUsageScanner.swift b/Sources/TokenGaugeCore/EffortUsageScanner.swift index a1792db..bf65725 100644 --- a/Sources/TokenGaugeCore/EffortUsageScanner.swift +++ b/Sources/TokenGaugeCore/EffortUsageScanner.swift @@ -7,109 +7,51 @@ public enum EffortUsageScanner { now: Date = Date(), lookbackDays: Int = 7 ) throws -> [EffortUsageRecord] { - guard lookbackDays > 0 else { return [] } - let calendar = Calendar.current - let cutoff = calendar.startOfDay(for: calendar.date(byAdding: .day, value: 1 - lookbackDays, to: now) ?? now) - let fractional = ISO8601DateFormatter() - fractional.formatOptions = [.withInternetDateTime, .withFractionalSeconds] - let standard = ISO8601DateFormatter() - let decoder = JSONDecoder() - var records: [String: EffortUsageRecord] = [:] - let roots: [(UsageProvider, URL)] = [ - (.codex, homeDirectory.appending(path: ".codex/sessions")), - (.claude, homeDirectory.appending(path: ".claude/projects")), - ] - for (provider, root) in roots { - guard safePath(root, home: homeDirectory) else { continue } - let recentDirectories = Set( - provider == .codex ? codexDirectories(root: root, cutoff: cutoff, now: now).map(\.path) : []) - let keys: Set = [.isRegularFileKey, .isSymbolicLinkKey, .contentModificationDateKey] - guard - let files = FileManager.default.enumerator( - at: root, includingPropertiesForKeys: Array(keys), options: [.skipsHiddenFiles] - ) - else { continue } - for case let file as URL in files { - guard let info = try? file.resourceValues(forKeys: keys), info.isSymbolicLink != true else { - files.skipDescendants() - continue - } - guard info.isRegularFile == true, file.pathExtension == "jsonl", - recentDirectories.contains(file.deletingLastPathComponent().path) - || (info.contentModificationDate ?? .distantPast) >= cutoff - else { continue } - var context: EffortTranscriptMetadata.Payload? - try EffortJSONLReader.read(file) { line in - autoreleasepool { - guard let metadata = try? decoder.decode(EffortTranscriptMetadata.self, from: line) else { - return - } - if provider == .codex, metadata.type == "turn_context" { - context = metadata.payload - return - } - guard metadata.type == (provider == .codex ? "token_usage_record" : "assistant"), - let timestamp = metadata.timestamp, - let date = fractional.date(from: timestamp) ?? standard.date(from: timestamp), - date >= cutoff, date <= now, - let record = makeRecord( - metadata, provider: provider, context: context, date: date, calendar: calendar) - else { return } - records[record.id] = merge(records[record.id], record) - } - } - } - } - return records.values.sorted { $0.recordedAt == $1.recordedAt ? $0.id < $1.id : $0.recordedAt < $1.recordedAt } + try TranscriptScanner.scan( + homeDirectory: homeDirectory, stateURL: nil, now: now, calendar: .current, historyDays: 0, + effortDays: lookbackDays + ).effortRecords } - private static func makeRecord( - _ metadata: EffortTranscriptMetadata, provider: UsageProvider, - context: EffortTranscriptMetadata.Payload?, date: Date, calendar: Calendar - ) -> EffortUsageRecord? { - let identifier: String? - let model: String? - let effort: String? - let tokens: Int? - if provider == .codex { - guard metadata.type == "token_usage_record", let payload = metadata.payload else { return nil } - identifier = payload.response_id - let matching = context?.turn_id != nil && context?.turn_id == payload.turn_id ? context : nil - model = matching?.model - effort = matching?.effort - tokens = payload.usage?.total_tokens - } else { - guard metadata.type == "assistant", let message = metadata.message else { return nil } - identifier = message.id - model = message.model - effort = metadata.perTurnEffort ?? metadata.effort - tokens = message.usage?.claudeTotal - } - guard let identifier, !identifier.isEmpty, let tokens, tokens > 0 else { return nil } + static func entry(from metadata: EffortTranscriptMetadata, at date: Date, context: CodexTurnContext?) -> ScanEntry? + { + guard metadata.type == "token_usage_record", let payload = metadata.payload, + let identifier = payload.response_id, !identifier.isEmpty, + let tokens = payload.usage?.total_tokens, tokens > 0 + else { return nil } + let matching = context?.turnID != nil && context?.turnID == payload.turn_id ? context : nil + let model = matching?.model ?? "unknown" + let time = date.timeIntervalSince1970 + return ScanEntry( + id: hash(provider: .codex, identifier: identifier), firstAt: time, peakAt: time, tokens: tokens, + model: model, effortModel: model, effort: matching?.effort ?? "unknown", eligible: true) + } + + static func records( + _ entries: some Sequence<(provider: UsageProvider, entry: ScanEntry)>, cutoff: Date, now: Date, + calendar: Calendar + ) -> [EffortUsageRecord] { + let earliest = cutoff.timeIntervalSince1970 + let latest = now.timeIntervalSince1970 + return entries.compactMap { provider, entry -> EffortUsageRecord? in + guard entry.eligible, entry.firstAt >= earliest, entry.firstAt <= latest else { return nil } + let recordedAt = Date(timeIntervalSince1970: entry.firstAt) + return EffortUsageRecord( + id: entry.id, provider: provider, recordedAt: recordedAt, + day: TranscriptScanner.dayString(recordedAt, calendar: calendar), + model: entry.effortModel, effort: entry.effort, tokens: entry.tokens) + }.sorted { $0.recordedAt == $1.recordedAt ? $0.id < $1.id : $0.recordedAt < $1.recordedAt } + } + + static func hash(provider: UsageProvider, identifier: String) -> String { let hex = Array("0123456789abcdef".utf8) - let hash = String( + return String( decoding: SHA256.hash(data: Data("\(provider.rawValue):\(identifier)".utf8)).flatMap { [hex[Int($0 >> 4)], hex[Int($0 & 15)]] }, as: UTF8.self) - let components = calendar.dateComponents([.year, .month, .day], from: date) - let day = String(format: "%04d-%02d-%02d", components.year ?? 0, components.month ?? 0, components.day ?? 0) - return EffortUsageRecord( - id: hash, provider: provider, recordedAt: date, day: day, - model: EffortTranscriptMetadata.normalizedModel(model), - effort: EffortTranscriptMetadata.normalizedEffort(effort), tokens: tokens) - } - - private static func merge(_ existing: EffortUsageRecord?, _ incoming: EffortUsageRecord) -> EffortUsageRecord { - guard let existing else { return incoming } - let earliest = existing.recordedAt <= incoming.recordedAt ? existing : incoming - return EffortUsageRecord( - id: existing.id, provider: existing.provider, recordedAt: earliest.recordedAt, day: earliest.day, - model: existing.model == "unknown" ? incoming.model : existing.model, - effort: existing.effort == "unknown" ? incoming.effort : existing.effort, - tokens: max(existing.tokens, incoming.tokens)) } - private static func codexDirectories(root: URL, cutoff: Date, now: Date) -> [URL] { + static func codexDirectories(root: URL, cutoff: Date, now: Date) -> [URL] { var utc = Calendar(identifier: .gregorian) utc.timeZone = TimeZone(secondsFromGMT: 0)! var date = utc.startOfDay(for: cutoff.addingTimeInterval(-86_400)) @@ -124,7 +66,7 @@ public enum EffortUsageScanner { return directories } - private static func safePath(_ url: URL, home: URL) -> Bool { + static func safePath(_ url: URL, home: URL) -> Bool { var current = url.standardizedFileURL while current.path != "/" { guard let values = try? current.resourceValues(forKeys: [.isSymbolicLinkKey]), values.isSymbolicLink != true diff --git a/Sources/TokenGaugeCore/EffortJSONLReader.swift b/Sources/TokenGaugeCore/JSONLReader.swift similarity index 62% rename from Sources/TokenGaugeCore/EffortJSONLReader.swift rename to Sources/TokenGaugeCore/JSONLReader.swift index 83aa364..a9f1a67 100644 --- a/Sources/TokenGaugeCore/EffortJSONLReader.swift +++ b/Sources/TokenGaugeCore/JSONLReader.swift @@ -1,19 +1,37 @@ import Foundation -enum EffortJSONLReader { +enum JSONLReader { static let maximumLineBytes = 1_048_576 - static func read(_ url: URL, lineHandler: (Data) -> Void) throws { + struct Progress { + let bytesRead: Int + let committedOffset: Int + } + + enum ReadError: Error { + case offsetNotAtLineBoundary + } + + @discardableResult + static func read(_ url: URL, from offset: Int = 0, lineHandler: (Data) -> Void) throws -> Progress { let handle = try FileHandle(forReadingFrom: url) defer { try? handle.close() } + if offset > 0 { + try handle.seek(toOffset: UInt64(offset - 1)) + guard try handle.read(upToCount: 1) == Data([0x0A]) else { throw ReadError.offsetNotAtLineBoundary } + } var buffer = Data() var discarding = false + var bytesRead = 0 + var committed = offset while true { let chunk = try handle.read(upToCount: 65_536) ?? Data() if chunk.isEmpty { if !discarding, !buffer.isEmpty { lineHandler(buffer) } - return + return Progress(bytesRead: bytesRead, committedOffset: committed) } + let chunkOffset = offset + bytesRead + bytesRead += chunk.count var start = chunk.startIndex while start < chunk.endIndex, let newline = chunk[start...].firstIndex(of: 0x0A) { let segment = chunk[start.. URL { + UsagePaths.supportDirectory(homeDirectory: homeDirectory).appending(path: "scan-state.json") + } + + public static func scan( + homeDirectory: URL = FileManager.default.homeDirectoryForCurrentUser, + stateURL: URL? = nil, + now: Date = Date(), + calendar: Calendar = .current, + historyDays: Int = 8, + effortDays: Int = 7 + ) throws -> Result { + let claude = homeDirectory.appending(path: ".claude/projects") + let codex = homeDirectory.appending(path: ".codex/sessions") + return try scan( + claudeProjects: EffortUsageScanner.safePath(claude, home: homeDirectory) ? claude : nil, + codexSessions: EffortUsageScanner.safePath(codex, home: homeDirectory) ? codex : nil, + stateURL: stateURL, now: now, calendar: calendar, historyDays: historyDays, effortDays: effortDays) + } + + public static func scan( + claudeProjects: URL?, + codexSessions: URL?, + stateURL: URL?, + now: Date = Date(), + calendar: Calendar = .current, + historyDays: Int = 8, + effortDays: Int = 7 + ) throws -> Result { + let historyStart = windowStart(days: historyDays, now: now, calendar: calendar) + let effortStart = windowStart(days: effortDays, now: now, calendar: calendar) + guard let readStart = [historyStart, effortStart].compactMap({ $0?.timeIntervalSince1970 }).min() else { + return Result(buckets: [], effortRecords: [], bytesRead: 0) + } + let previous = stateURL.flatMap { ScanState.load(from: $0, windowStart: readStart) } + var state = ScanState(version: ScanState.currentVersion, windowStart: readStart, files: [:]) + var recentCodexDirectories: Set = [] + var roots: [(provider: UsageProvider, url: URL, wanted: (URL, TimeInterval) -> Bool)] = [] + if let claudeProjects { + roots.append((.claude, claudeProjects, { _, modified in modified >= readStart })) + } + if let codexSessions, let effortStart { + let cutoff = effortStart.timeIntervalSince1970 + recentCodexDirectories = Set( + EffortUsageScanner.codexDirectories(root: codexSessions, cutoff: effortStart, now: now).map( + dayDirectory)) + roots.append( + ( + .codex, codexSessions, + { file, modified in + modified >= cutoff + || recentCodexDirectories.contains(dayDirectory(file.deletingLastPathComponent())) + } + )) + } + + let parser = TranscriptLineParser() + var bytesRead = 0 + for root in roots { + for (file, attributes) in candidateFiles(root: root.url, wanted: root.wanted) { + let key = file.path + let scanned = try scanFile( + file, attributes: attributes, provider: root.provider, previous: previous?.files[key], + parser: parser, prune: readStart) + bytesRead += scanned.bytesRead + state.files[key] = scanned.file + } + } + + let historyCutoff = historyStart?.timeIntervalSince1970 + let effortCutoff = effortStart?.timeIntervalSince1970 + var historyEntries: [String: ScanEntry] = [:] + var effortEntries: [String: (provider: UsageProvider, entry: ScanEntry)] = [:] + for key in state.files.keys.sorted() { + guard let file = state.files[key] else { continue } + let recent = recentCodexDirectories.contains(dayDirectory(URL(filePath: key).deletingLastPathComponent())) + let includeHistory = historyCutoff.map { file.provider == .claude && file.modified >= $0 } ?? false + let includeEffort = effortCutoff.map { file.modified >= $0 || (file.provider == .codex && recent) } ?? false + guard includeHistory || includeEffort else { continue } + for entry in file.entries { + if includeHistory { + historyEntries[entry.id] = historyEntries[entry.id]?.merging(entry) ?? entry + } + if includeEffort { + let merged = effortEntries[entry.id]?.entry.merging(entry) ?? entry + effortEntries[entry.id] = (file.provider, merged) + } + } + } + + if let stateURL { + try? SecureMetricStore.write(state, to: stateURL) + } + return Result( + buckets: historyStart.map { + ClaudeHistoryScanner.buckets(historyEntries.values, start: $0, now: now, calendar: calendar) + } ?? [], + effortRecords: effortStart.map { + EffortUsageScanner.records(effortEntries.values, cutoff: $0, now: now, calendar: calendar) + } ?? [], + bytesRead: bytesRead) + } + + private static func dayDirectory(_ url: URL) -> String { + url.pathComponents.suffix(3).joined(separator: "/") + } + + static func dayString(_ date: Date, calendar: Calendar) -> String { + let components = calendar.dateComponents([.year, .month, .day], from: date) + return String(format: "%04d-%02d-%02d", components.year ?? 0, components.month ?? 0, components.day ?? 0) + } + + private static func windowStart(days: Int, now: Date, calendar: Calendar) -> Date? { + guard days > 0 else { return nil } + return calendar.startOfDay(for: calendar.date(byAdding: .day, value: 1 - days, to: now) ?? now) + } + + private static let resourceKeys: Set = [ + .isRegularFileKey, .isSymbolicLinkKey, .contentModificationDateKey, .creationDateKey, .fileSizeKey, + ] + + private struct FileAttributes { + let size: Int + let modified: TimeInterval + let created: TimeInterval + } + + private static func candidateFiles(root: URL, wanted: (URL, TimeInterval) -> Bool) -> [(URL, FileAttributes)] { + guard + let enumerator = FileManager.default.enumerator( + at: root, includingPropertiesForKeys: Array(resourceKeys), options: [.skipsHiddenFiles]) + else { return [] } + var files: [(URL, FileAttributes)] = [] + for case let file as URL in enumerator { + guard let values = try? file.resourceValues(forKeys: resourceKeys), values.isSymbolicLink != true else { + enumerator.skipDescendants() + continue + } + let modified = (values.contentModificationDate ?? .distantPast).timeIntervalSince1970 + guard values.isRegularFile == true, file.pathExtension == "jsonl", wanted(file, modified) else { continue } + let created = (values.creationDate ?? .distantPast).timeIntervalSince1970 + files.append((file, FileAttributes(size: values.fileSize ?? 0, modified: modified, created: created))) + } + return files + } + + private static func scanFile( + _ url: URL, attributes: FileAttributes, provider: UsageProvider, previous: ScanFile?, + parser: TranscriptLineParser, prune: TimeInterval + ) throws -> (file: ScanFile, bytesRead: Int) { + let reusable = previous.flatMap { $0.provider == provider && $0.created == attributes.created ? $0 : nil } + if let reusable, reusable.size == attributes.size, reusable.modified == attributes.modified { + return (reusable, 0) + } + var entries: [String: ScanEntry] = [:] + var context: CodexTurnContext? + var offset = 0 + if let reusable, attributes.size > reusable.size, attributes.modified >= reusable.modified { + entries = Dictionary(reusable.entries.map { ($0.id, $0) }, uniquingKeysWith: { first, _ in first }) + context = reusable.context + offset = reusable.offset + } + let handler: (Data) -> Void = { line in + autoreleasepool { + guard let metadata = parser.metadata(line) else { return } + let entry: ScanEntry? + switch provider { + case .claude: + guard let date = parser.date(metadata.timestamp) else { return } + entry = ClaudeHistoryScanner.entry(from: metadata, at: date) + case .codex: + if metadata.type == "turn_context" { + context = metadata.payload.map(CodexTurnContext.init) + return + } + guard let date = parser.date(metadata.timestamp) else { return } + entry = EffortUsageScanner.entry(from: metadata, at: date, context: context) + } + guard let entry else { return } + entries[entry.id] = entries[entry.id]?.merging(entry) ?? entry + } + } + let progress: JSONLReader.Progress + do { + progress = try JSONLReader.read(url, from: offset, lineHandler: handler) + } catch JSONLReader.ReadError.offsetNotAtLineBoundary { + entries = [:] + context = nil + progress = try JSONLReader.read(url, lineHandler: handler) + } + let kept = entries.values.filter { $0.peakAt >= prune }.sorted { + $0.firstAt == $1.firstAt ? $0.id < $1.id : $0.firstAt < $1.firstAt + } + let file = ScanFile( + provider: provider, size: attributes.size, modified: attributes.modified, created: attributes.created, + offset: progress.committedOffset, context: context, entries: kept) + return (file, progress.bytesRead) + } +} + +struct TranscriptLineParser { + private let decoder = JSONDecoder() + private let fractional: ISO8601DateFormatter + private let standard = ISO8601DateFormatter() + + init() { + fractional = ISO8601DateFormatter() + fractional.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + } + + func metadata(_ line: Data) -> EffortTranscriptMetadata? { + try? decoder.decode(EffortTranscriptMetadata.self, from: line) + } + + func date(_ timestamp: String?) -> Date? { + guard let timestamp else { return nil } + return fractional.date(from: timestamp) ?? standard.date(from: timestamp) + } +} + +struct ScanState: Codable { + static let currentVersion = 1 + + var version: Int + var windowStart: TimeInterval + var files: [String: ScanFile] + + static func load(from url: URL, windowStart: TimeInterval) -> ScanState? { + guard let state = try? SecureMetricStore.read(ScanState.self, from: url), state.version == currentVersion, + state.windowStart <= windowStart + else { return nil } + return state + } +} + +struct ScanFile: Codable { + var provider: UsageProvider + var size: Int + var modified: TimeInterval + var created: TimeInterval + var offset: Int + var context: CodexTurnContext? + var entries: [ScanEntry] +} + +struct CodexTurnContext: Codable, Equatable { + var turnID: String? + var model: String + var effort: String + + init(payload: EffortTranscriptMetadata.Payload) { + turnID = payload.turn_id + model = EffortTranscriptMetadata.normalizedModel(payload.model) + effort = EffortTranscriptMetadata.normalizedEffort(payload.effort) + } +} + +struct ScanEntry: Equatable { + var id: String + var firstAt: TimeInterval + var peakAt: TimeInterval + var tokens: Int + var model: String + var effortModel: String + var effort: String + var eligible: Bool + + func merging(_ incoming: ScanEntry) -> ScanEntry { + var merged = self + if incoming.tokens > tokens { + merged.tokens = incoming.tokens + merged.peakAt = incoming.peakAt + merged.model = incoming.model + } + merged.firstAt = min(firstAt, incoming.firstAt) + if effortModel == "unknown" { merged.effortModel = incoming.effortModel } + if effort == "unknown" { merged.effort = incoming.effort } + merged.eligible = eligible || incoming.eligible + return merged + } +} + +extension ScanEntry: Codable { + init(from decoder: Decoder) throws { + var container = try decoder.unkeyedContainer() + id = try container.decode(String.self) + firstAt = try container.decode(TimeInterval.self) + peakAt = try container.decode(TimeInterval.self) + tokens = try container.decode(Int.self) + model = try container.decode(String.self) + effortModel = try container.decode(String.self) + effort = try container.decode(String.self) + eligible = try container.decode(Bool.self) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.unkeyedContainer() + try container.encode(id) + try container.encode(firstAt) + try container.encode(peakAt) + try container.encode(tokens) + try container.encode(model) + try container.encode(effortModel) + try container.encode(effort) + try container.encode(eligible) + } +} diff --git a/Tests/TokenGaugeAppTests/ClaudeHistoryProcessTests.swift b/Tests/TokenGaugeAppTests/ClaudeHistoryProcessTests.swift index 0700117..7db1445 100644 --- a/Tests/TokenGaugeAppTests/ClaudeHistoryProcessTests.swift +++ b/Tests/TokenGaugeAppTests/ClaudeHistoryProcessTests.swift @@ -13,7 +13,7 @@ final class ClaudeHistoryProcessTests: XCTestCase { model: "claude-synthetic", tokens: index + 1 ) } - let payload = try JSONEncoder().encode(buckets) + let payload = try JSONEncoder().encode(CaptureCollection(buckets: buckets, effortRecords: 2000)) XCTAssertGreaterThan(payload.count, 131_072) let file = temporaryFile() defer { try? FileManager.default.removeItem(at: file) } @@ -27,6 +27,25 @@ final class ClaudeHistoryProcessTests: XCTestCase { XCTAssertEqual(actual, buckets) } + func testCollectReceiptSkipsTheEffortHelperOnce() throws { + let sibling = try XCTUnwrap(Bundle.main.executableURL).deletingLastPathComponent() + .appending(path: "TokenGaugeCapture") + try XCTSkipIf(FileManager.default.isExecutableFile(atPath: sibling.path)) + let home = workingDirectory() + _ = try? EffortHistoryClient.collect(homeDirectory: home) + + XCTAssertEqual(try run(#"printf '{"buckets":[],"effortRecords":3}'"#), []) + XCTAssertNoThrow(try EffortHistoryClient.collect(homeDirectory: home)) + XCTAssertThrowsError(try EffortHistoryClient.collect(homeDirectory: home)) { error in + XCTAssertEqual(error as? UsageDataError, .executableNotFound) + } + + XCTAssertEqual(try run(#"printf '{"buckets":[]}'"#), []) + XCTAssertThrowsError(try EffortHistoryClient.collect(homeDirectory: home)) { error in + XCTAssertEqual(error as? UsageDataError, .executableNotFound) + } + } + func testFailedHelperDoesNotExposeStderr() { XCTAssertThrowsError(try run("printf 'synthetic-private-diagnostic' >&2; exit 9")) { error in XCTAssertEqual(error as? UsageDataError, .processFailed("History helper exited with status 9")) diff --git a/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift b/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift new file mode 100644 index 0000000..d04d394 --- /dev/null +++ b/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift @@ -0,0 +1,413 @@ +import CryptoKit +import Foundation +import XCTest + +@testable import TokenGaugeCore + +final class TranscriptScannerTests: XCTestCase { + private let now = ISO8601DateFormatter().date(from: "2026-09-12T18:00:00Z")! + + func testIncrementalRescanReadsOnlyAppendedBytes() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let claudeFile = home.appending(path: ".claude/projects/project/a.jsonl") + let codexFile = home.appending(path: ".codex/sessions/2026/09/12/a.jsonl") + try write( + claudeFile, + [ + claude("m1", time: "12:00:00", output: 3), claude("m1", time: "12:00:01", output: 3), + claude("m2", time: "12:05:00", output: 5), + ]) + try write( + codexFile, + [turnContext("turn-a", effort: "xhigh"), codex("r1", turn: "turn-a", time: "12:30:00", tokens: 40)]) + + let cold = try scan(home, state: state) + XCTAssertEqual(cold.bytesRead, try size(claudeFile) + size(codexFile)) + XCTAssertEqual(cold.buckets.map(\.tokens), [128]) + XCTAssertEqual(cold.effortRecords.map(\.tokens), [63, 65, 40]) + + let warm = try scan(home, state: state) + XCTAssertEqual(warm.bytesRead, 0) + XCTAssertEqual(warm.buckets, cold.buckets) + XCTAssertEqual(warm.effortRecords, cold.effortRecords) + + let appended = try append( + claudeFile, + [ + claude("m2", time: "12:05:01", output: 9), claude("m3", time: "13:00:00", output: 7), + claude("m4", time: "13:10:00", output: 1), + ]) + let incremental = try scan(home, state: state) + XCTAssertEqual(incremental.bytesRead, appended) + XCTAssertEqual(incremental.buckets.map(\.tokens), [132, 128]) + XCTAssertEqual(incremental.buckets, try fullBuckets(home)) + XCTAssertEqual(incremental.effortRecords, try fullRecords(home)) + + let grownSize = try size(claudeFile) + try truncate(claudeFile, to: grownSize - 10) + try append(claudeFile, [claude("m5", time: "14:00:00", output: 2)]) + XCTAssertGreaterThan(try size(claudeFile), grownSize) + let rewritten = try scan(home, state: state) + XCTAssertEqual(rewritten.bytesRead, try size(claudeFile)) + XCTAssertEqual(rewritten.buckets, try fullBuckets(home)) + XCTAssertEqual(rewritten.effortRecords, try fullRecords(home)) + + try truncate(claudeFile, to: Data((claude("m1", time: "12:00:00", output: 3) + "\n").utf8).count) + let truncated = try scan(home, state: state) + XCTAssertEqual(truncated.bytesRead, try size(claudeFile)) + XCTAssertEqual(truncated.buckets.map(\.tokens), [63]) + XCTAssertEqual(truncated.effortRecords.map(\.tokens), [63, 40]) + + try FileManager.default.removeItem(at: codexFile) + let removed = try scan(home, state: state) + XCTAssertEqual(removed.bytesRead, 0) + XCTAssertEqual(removed.effortRecords.map(\.provider), [.claude]) + + let permissions = try FileManager.default.attributesOfItem(atPath: state.path)[.posixPermissions] as? Int + XCTAssertEqual(permissions, 0o600) + } + } + + func testSinglePassMatchesTwoPassOutputs() throws { + try withHome { home in + let projects = home.appending(path: ".claude/projects") + try write( + projects.appending(path: "p1/a.jsonl"), + [ + claude("m1", time: "12:00:00", output: 3), claude("m1", time: "12:00:01", output: 3), + claude("m2", time: "12:20:00", output: 4) + .replacingOccurrences(of: "claude-fable-5-1", with: ""), + claude("m3", time: "12:59:58", output: 1), claude("m3", time: "13:00:02", output: 30), + """ + {"type":"assistant","timestamp":"2026-09-12T14:00:00.000Z","uuid":"uuid-only","message":{"model":"claude-opus-5","usage":{"input_tokens":5,"output_tokens":5}}} + """, + """ + {"type":"user","timestamp":"2026-09-12T14:01:00.000Z","uuid":"u1","message":{"role":"user"}} + """, + "not json", + claude("old", time: "12:00:00", output: 2).replacingOccurrences( + of: "2026-09-12", with: "2026-08-20"), + ]) + try write( + projects.appending(path: "p2/b.jsonl"), + [ + claude("m3", time: "13:00:03", output: 30), + claude("m5", time: "15:00:00", output: 8).replacingOccurrences( + of: "\"perTurnEffort\":\"medium\",", with: ""), + ]) + let stale = projects.appending(path: "p3/stale.jsonl") + try write(stale, [claude("stale", time: "12:00:00", output: 3)]) + try setModified(stale, Date(timeIntervalSince1970: 0)) + let aged = projects.appending(path: "p4/aged.jsonl") + try write( + aged, + [claude("aged", time: "12:00:00", output: 6).replacingOccurrences(of: "2026-09-12", with: "2026-09-05")] + ) + try setModified(aged, ISO8601DateFormatter().date(from: "2026-09-05T12:00:00Z")!) + + let sessions = home.appending(path: ".codex/sessions") + try write( + sessions.appending(path: "2026/09/12/a.jsonl"), + [ + turnContext("turn-a", effort: "xhigh"), + codex("r1", turn: "turn-a", time: "12:30:00", tokens: 40), + codex("r1", turn: "turn-a", time: "12:30:01", tokens: 40), + """ + {"type":"event_msg","timestamp":"2026-09-12T12:00:00Z","payload":{"type":"token_count","info":{"total_token_usage":{"total_tokens":9999}}}} + """, + codex("r2", turn: "absent", time: "12:31:00", tokens: 20), + turnContext("turn-b", effort: "high"), + codex("r3", turn: "turn-b", time: "12:32:00", tokens: 7), + ]) + let resumed = sessions.appending(path: "2026/01/01/resumed.jsonl") + try write( + resumed, + [ + turnContext("turn-r", effort: "low"), + codex("r-old", turn: "turn-r", time: "12:00:00", tokens: 90) + .replacingOccurrences(of: "2026-09-12", with: "2026-01-01"), + codex("r-new", turn: "turn-r", time: "12:40:00", tokens: 40), + ]) + try setModified(resumed, now) + let recentDirectory = sessions.appending(path: "2026/09/11/b.jsonl") + try write( + recentDirectory, + [ + codex("r-yesterday", time: "12:00:00", tokens: 5).replacingOccurrences( + of: "2026-09-12", with: "2026-09-11") + ]) + try setModified(recentDirectory, Date(timeIntervalSince1970: 0)) + + let expectedBuckets = try ReferenceScanners.history(projectsRoot: projects, days: 8, now: now) + let expectedRecords = try ReferenceScanners.effort(home: home, lookbackDays: 7, now: now) + XCTAssertEqual(expectedBuckets.map(\.tokens), [66, 63, 64, 90, 10, 68]) + XCTAssertEqual(expectedRecords.map(\.tokens), [5, 63, 64, 40, 20, 7, 40, 90, 68]) + + let state = home.appending(path: "support/scan-state.json") + let single = try TranscriptScanner.scan(homeDirectory: home, stateURL: state, now: now) + XCTAssertEqual(single.buckets, expectedBuckets) + XCTAssertEqual(single.effortRecords, expectedRecords) + XCTAssertEqual(try fullBuckets(home), expectedBuckets) + XCTAssertEqual(try fullRecords(home), expectedRecords) + + let warm = try TranscriptScanner.scan(homeDirectory: home, stateURL: state, now: now) + XCTAssertEqual(warm.bytesRead, 0) + XCTAssertEqual(warm.buckets, expectedBuckets) + XCTAssertEqual(warm.effortRecords, expectedRecords) + } + } + + func testCorruptOrRegressedStateFallsBackToFullScan() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let file = home.appending(path: ".claude/projects/project/a.jsonl") + try write(file, [claude("m1", time: "12:00:00", output: 3), claude("m2", time: "12:05:00", output: 5)]) + let total = try size(file) + XCTAssertEqual(try scan(home, state: state).bytesRead, total) + XCTAssertEqual(try scan(home, state: state).bytesRead, 0) + + try Data("{not json".utf8).write(to: state) + let recovered = try scan(home, state: state) + XCTAssertEqual(recovered.bytesRead, total) + XCTAssertEqual(recovered.buckets.map(\.tokens), [128]) + + XCTAssertEqual(try scan(home, state: state, now: now.addingTimeInterval(-86_400)).bytesRead, total) + XCTAssertEqual(try scan(home, state: state).bytesRead, 0) + } + } + + private func scan(_ home: URL, state: URL, now: Date? = nil) throws -> TranscriptScanner.Result { + try TranscriptScanner.scan(homeDirectory: home, stateURL: state, now: now ?? self.now) + } + + private func fullBuckets(_ home: URL) throws -> [ModelTokenBucket] { + try ClaudeHistoryScanner.scan(projectsRoot: home.appending(path: ".claude/projects"), now: now) + } + + private func fullRecords(_ home: URL) throws -> [EffortUsageRecord] { + try EffortUsageScanner.scan(homeDirectory: home, now: now) + } + + private func withHome(_ body: (URL) throws -> Void) throws { + let home = FileManager.default.temporaryDirectory.resolvingSymlinksInPath().appending(path: UUID().uuidString) + try FileManager.default.createDirectory(at: home, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: home) } + try body(home) + } + + private func write(_ file: URL, _ lines: [String]) throws { + try FileManager.default.createDirectory(at: file.deletingLastPathComponent(), withIntermediateDirectories: true) + try Data((lines.joined(separator: "\n") + "\n").utf8).write(to: file) + } + + @discardableResult + private func append(_ file: URL, _ lines: [String]) throws -> Int { + let data = Data((lines.joined(separator: "\n") + "\n").utf8) + let handle = try FileHandle(forWritingTo: file) + defer { try? handle.close() } + try handle.seekToEnd() + try handle.write(contentsOf: data) + return data.count + } + + private func truncate(_ file: URL, to length: Int) throws { + let handle = try FileHandle(forWritingTo: file) + defer { try? handle.close() } + try handle.truncate(atOffset: UInt64(length)) + } + + private func size(_ file: URL) throws -> Int { + try XCTUnwrap(FileManager.default.attributesOfItem(atPath: file.path)[.size] as? Int) + } + + private func setModified(_ file: URL, _ date: Date) throws { + try FileManager.default.setAttributes([.modificationDate: date], ofItemAtPath: file.path) + } + + private func claude(_ id: String, time: String, output: Int) -> String { + """ + {"type":"assistant","timestamp":"2026-09-12T\(time).000Z","uuid":"uuid-\(id)","perTurnEffort":"medium","effort":"high","message":{"id":"\(id)","model":"claude-fable-5-1","usage":{"input_tokens":10,"cache_creation_input_tokens":20,"cache_read_input_tokens":30,"output_tokens":\(output)},"content":[{"type":"text","text":"synthetic ignored content"}]}} + """ + } + + private func codex(_ id: String, turn: String = "unknown", time: String, tokens: Int) -> String { + """ + {"type":"token_usage_record","timestamp":"2026-09-12T\(time)Z","payload":{"turn_id":"\(turn)","response_id":"\(id)","usage":{"total_tokens":\(tokens)}}} + """ + } + + private func turnContext(_ turn: String, effort: String) -> String { + """ + {"type":"turn_context","payload":{"turn_id":"\(turn)","model":"gpt-6-astra","effort":"\(effort)"}} + """ + } +} + +private enum ReferenceScanners { + private static let usageKeys = [ + "input_tokens", "output_tokens", "cache_creation_input_tokens", "cache_read_input_tokens", + ] + + static func history(projectsRoot: URL, days: Int, now: Date, calendar: Calendar = .current) throws + -> [ModelTokenBucket] + { + let start = calendar.startOfDay(for: calendar.date(byAdding: .day, value: -(days - 1), to: now)!) + var messages: [String: (date: Date, model: String, tokens: Int)] = [:] + for file in try files(under: projectsRoot) where try modified(file) >= start { + for object in try lines(file) { + guard object["type"] as? String == "assistant", let message = object["message"] as? [String: Any], + let usage = message["usage"] as? [String: Any], let timestamp = object["timestamp"] as? String, + let date = parse(timestamp), date >= start, date <= now.addingTimeInterval(300), + let id = message["id"] as? String ?? object["uuid"] as? String + else { continue } + let tokens = total(usage) + guard tokens > 0 else { continue } + let raw = message["model"] as? String + let model = raw.map { $0.isEmpty || $0.hasPrefix("<") ? "unknown" : $0 } ?? "unknown" + if let current = messages[id], current.tokens >= tokens { continue } + messages[id] = (date, model, tokens) + } + } + var totals: [String: ModelTokenBucket] = [:] + for message in messages.values { + let hour = Date(timeIntervalSince1970: (message.date.timeIntervalSince1970 / 3600).rounded(.down) * 3600) + let key = "\(message.model)-\(hour.timeIntervalSince1970)" + totals[key] = ModelTokenBucket( + day: day(message.date, calendar), hourStart: hour, model: message.model, + tokens: (totals[key]?.tokens ?? 0) + message.tokens) + } + return totals.values.sorted { + $0.hourStart != $1.hourStart ? $0.hourStart < $1.hourStart : $0.model < $1.model + } + } + + static func effort(home: URL, lookbackDays: Int, now: Date, calendar: Calendar = .current) throws + -> [EffortUsageRecord] + { + let cutoff = calendar.startOfDay(for: calendar.date(byAdding: .day, value: 1 - lookbackDays, to: now)!) + let codexRoot = home.appending(path: ".codex/sessions") + let recent = Set(recentDirectories(cutoff: cutoff, now: now)) + var records: [String: EffortUsageRecord] = [:] + for (provider, root) in [(UsageProvider.codex, codexRoot), (.claude, home.appending(path: ".claude/projects"))] + { + for file in try files(under: root) + where try modified(file) >= cutoff + || recent.contains(file.deletingLastPathComponent().pathComponents.suffix(3).joined(separator: "/")) + { + var context: [String: Any]? + for object in try lines(file) { + let type = object["type"] as? String + if provider == .codex, type == "turn_context" { + context = object["payload"] as? [String: Any] + continue + } + guard let timestamp = object["timestamp"] as? String, let date = parse(timestamp), date >= cutoff, + date <= now + else { continue } + let identifier: String? + let model: String? + let effort: String? + let tokens: Int? + if provider == .codex { + guard type == "token_usage_record", let payload = object["payload"] as? [String: Any] else { + continue + } + identifier = payload["response_id"] as? String + let turn = context?["turn_id"] as? String + let matching = turn != nil && turn == payload["turn_id"] as? String ? context : nil + model = matching?["model"] as? String + effort = matching?["effort"] as? String + tokens = (payload["usage"] as? [String: Any])?["total_tokens"] as? Int + } else { + guard type == "assistant", let message = object["message"] as? [String: Any] else { continue } + identifier = message["id"] as? String + model = message["model"] as? String + effort = object["perTurnEffort"] as? String ?? object["effort"] as? String + tokens = (message["usage"] as? [String: Any]).map(total) + } + guard let identifier, !identifier.isEmpty, let tokens, tokens > 0 else { continue } + let id = SHA256.hash(data: Data("\(provider.rawValue):\(identifier)".utf8)) + .map { String(format: "%02x", $0) }.joined() + let record = EffortUsageRecord( + id: id, provider: provider, recordedAt: date, day: day(date, calendar), + model: normalizedModel(model), effort: normalizedEffort(effort), tokens: tokens) + records[id] = merge(records[id], record) + } + } + } + return records.values.sorted { $0.recordedAt == $1.recordedAt ? $0.id < $1.id : $0.recordedAt < $1.recordedAt } + } + + private static func merge(_ existing: EffortUsageRecord?, _ incoming: EffortUsageRecord) -> EffortUsageRecord { + guard let existing else { return incoming } + let earliest = existing.recordedAt <= incoming.recordedAt ? existing : incoming + return EffortUsageRecord( + id: existing.id, provider: existing.provider, recordedAt: earliest.recordedAt, day: earliest.day, + model: existing.model == "unknown" ? incoming.model : existing.model, + effort: existing.effort == "unknown" ? incoming.effort : existing.effort, + tokens: max(existing.tokens, incoming.tokens)) + } + + private static func normalizedModel(_ raw: String?) -> String { + let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.") + guard let raw, !raw.isEmpty, raw.count <= 100, raw.unicodeScalars.allSatisfy(allowed.contains) else { + return "unknown" + } + return raw + } + + private static func normalizedEffort(_ raw: String?) -> String { + let value = raw?.lowercased() ?? "unknown" + return ["none", "minimal", "low", "medium", "high", "xhigh", "max", "ultra", "auto"].contains(value) + ? value : "unknown" + } + + private static func recentDirectories(cutoff: Date, now: Date) -> [String] { + var utc = Calendar(identifier: .gregorian) + utc.timeZone = TimeZone(secondsFromGMT: 0)! + var date = utc.startOfDay(for: cutoff.addingTimeInterval(-86_400)) + var directories: [String] = [] + while date <= now { + let components = utc.dateComponents([.year, .month, .day], from: date) + directories.append(String(format: "%04d/%02d/%02d", components.year!, components.month!, components.day!)) + date = date.addingTimeInterval(86_400) + } + return directories + } + + private static func total(_ usage: [String: Any]) -> Int { + usageKeys.reduce(0) { $0 + max(usage[$1] as? Int ?? 0, 0) } + } + + private static func files(under root: URL) throws -> [URL] { + guard + let enumerator = FileManager.default.enumerator( + at: root, includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles]) + else { return [] } + return enumerator.compactMap { $0 as? URL }.filter { + $0.pathExtension == "jsonl" && (try? $0.resourceValues(forKeys: [.isRegularFileKey]))?.isRegularFile == true + } + } + + private static func modified(_ file: URL) throws -> Date { + try file.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate ?? .distantPast + } + + private static func lines(_ file: URL) throws -> [[String: Any]] { + try Data(contentsOf: file).split(separator: 0x0A).compactMap { + (try? JSONSerialization.jsonObject(with: $0)) as? [String: Any] + } + } + + private static func parse(_ timestamp: String) -> Date? { + let fractional = ISO8601DateFormatter() + fractional.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + return fractional.date(from: timestamp) ?? ISO8601DateFormatter().date(from: timestamp) + } + + private static func day(_ date: Date, _ calendar: Calendar) -> String { + let components = calendar.dateComponents([.year, .month, .day], from: date) + return String(format: "%04d-%02d-%02d", components.year ?? 0, components.month ?? 0, components.day ?? 0) + } +} From 969ce803a783adba080128ecb5f215cd4a3ad097 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 00:59:40 -0500 Subject: [PATCH 10/21] fix(history): calendar-only unified scope, pinned card event monitor, cached streaks and clamped card placement --- .../Services/HistoryDashboardModel.swift | 99 +++++++++++++---- .../Views/HistoryCalendarView.swift | 103 +++++++++++++++--- .../Views/HistoryDayCardView.swift | 32 +++++- .../Views/HistoryPanelView.swift | 87 +++++++++------ Sources/TokenGaugeCore/HistoryAnalytics.swift | 20 ++-- .../HistoryCalendarRenderingTests.swift | 99 +++++++++++++++++ .../HistoryDashboardTests.swift | 67 +++++++++++- .../HistoryDayCardTests.swift | 32 ++++++ .../HistoryAnalyticsTests.swift | 8 ++ 9 files changed, 462 insertions(+), 85 deletions(-) diff --git a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift index f87d44b..a17be19 100644 --- a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift +++ b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift @@ -34,16 +34,22 @@ struct HistoryCalendarDay: Identifiable, Equatable, Sendable { } } +// Rects relative to the calendar view's top-left corner; `bounds` is the popover root, so it may start negative. +struct HistoryDayCardAnchor: Equatable, Sendable { + var cell: CGRect + var bounds: CGRect +} + struct HistoryDaySelection: Equatable, Sendable { var dayKey: String var isPinned: Bool - var anchor: CGRect? + var anchor: HistoryDayCardAnchor? } struct HistoryUsageDays: Equatable, Sendable { var claude: Set = [] var codex: Set = [] - var any: Set = [] + var any: Set { claude.union(codex) } func days(for providers: [UsageProvider]) -> Set { if providers == [.claude] { return claude } @@ -52,12 +58,43 @@ struct HistoryUsageDays: Equatable, Sendable { } } +struct HistoryStreak: Equatable, Sendable { + var current = 0 + var longest = 0 +} + +struct HistoryStreaks: Equatable, Sendable { + var claude = HistoryStreak() + var codex = HistoryStreak() + var unified = HistoryStreak() + + init() {} + + init(usageDays: HistoryUsageDays, today: String, calendar: Calendar = .current) { + claude = Self.streak(usageDays.claude, today: today, calendar: calendar) + codex = Self.streak(usageDays.codex, today: today, calendar: calendar) + unified = Self.streak(usageDays.any, today: today, calendar: calendar) + } + + func streak(for providers: [UsageProvider]) -> HistoryStreak { + if providers == [.claude] { return claude } + if providers == [.codex] { return codex } + return unified + } + + private static func streak(_ days: Set, today: String, calendar: Calendar) -> HistoryStreak { + let value = HistoryAnalytics.streaks(usageDays: days, today: today, calendar: calendar) + return HistoryStreak(current: value.current, longest: value.longest) + } +} + @MainActor final class HistoryDashboardModel: ObservableObject { @Published var offset = 0 @Published var selectedDayKey: String? @Published var daySelection: HistoryDaySelection? @Published private(set) var usageDays = HistoryUsageDays() + @Published private(set) var streaks = HistoryStreaks() @Published private(set) var days: [HistoryCalendarDay] = [] @Published private(set) var isLoading = false @Published private(set) var loadedMode: HistoryMode? @@ -70,15 +107,17 @@ final class HistoryDashboardModel: ObservableObject { private var savedPaces: [String: [QuotaPace]] = [:] private var paceActivity: [String: Bool] = [:] private let previewEfforts: [HistoryEffortRow] + private let historyURL: URL private var cachedReads: [String: ReadResult] = [:] private var cacheOrder: [String] = [] private var cacheRevision: Int? init( previewSnapshots: [ProviderUsageSnapshot]? = nil, mode: HistoryMode = .recent, - previewEfforts: [HistoryEffortRow] = [], now: Date = Date() + previewEfforts: [HistoryEffortRow] = [], now: Date = Date(), historyURL: URL = UsagePaths.history() ) { self.previewEfforts = previewEfforts + self.historyURL = historyURL if let snapshots = previewSnapshots { let interval = Self.interval(mode: mode, offset: 0, now: now) let rows = snapshots.flatMap { snapshot in @@ -88,6 +127,7 @@ final class HistoryDashboardModel: ObservableObject { } days = Self.makeDays(interval: interval, tokens: rows, efforts: previewEfforts) usageDays = Self.usageDays(tokens: rows) + streaks = HistoryStreaks(usageDays: usageDays, today: Self.dayKey(now)) loadedMode = mode periodStart = interval.start periodEnd = interval.end @@ -113,21 +153,21 @@ final class HistoryDashboardModel: ObservableObject { selectedDayKey = nil } - func streak(for providers: [UsageProvider]) -> (current: Int, longest: Int) { - HistoryAnalytics.streaks(usageDays: usageDays.days(for: providers), today: Self.dayKey(Date())) + func streak(for providers: [UsageProvider]) -> HistoryStreak { + streaks.streak(for: providers) } - func showDayCard(_ dayKey: String, anchor: CGRect?) { + func showDayCard(_ dayKey: String, anchor: HistoryDayCardAnchor?) { guard daySelection?.isPinned != true else { return } daySelection = HistoryDaySelection(dayKey: dayKey, isPinned: false, anchor: anchor) } func hideDayCard() { - guard daySelection?.isPinned != true else { return } + guard let selection = daySelection, !selection.isPinned else { return } daySelection = nil } - func pinDayCard(_ dayKey: String, anchor: CGRect?) { + func pinDayCard(_ dayKey: String, anchor: HistoryDayCardAnchor?) { if let current = daySelection, current.isPinned, current.dayKey == dayKey { daySelection = nil return @@ -136,6 +176,7 @@ final class HistoryDashboardModel: ObservableObject { } func dismissDayCard() { + guard daySelection != nil else { return } daySelection = nil } @@ -178,13 +219,14 @@ final class HistoryDashboardModel: ObservableObject { let interval = Self.interval(mode: mode, offset: offset, now: now) let first = Self.dayKey(interval.start) let last = Self.dayKey(interval.end.addingTimeInterval(-1)) + let today = Self.dayKey(now) if cacheRevision != revision { cachedReads.removeAll(keepingCapacity: true) cacheOrder.removeAll(keepingCapacity: true) cacheRevision = revision } let cacheKey = - first + ":" + last + ":" + (accountFingerprint ?? "") + first + ":" + last + ":" + today + ":" + (accountFingerprint ?? "") + ":" + paceKeys.map(\.id).sorted().joined(separator: "|") do { let result: ReadResult @@ -198,23 +240,26 @@ final class HistoryDashboardModel: ObservableObject { } result = ReadResult( days: Self.makeDays(interval: interval, tokens: rows, efforts: previewEfforts), - latest: [], retained: [], first: rows.map(\.day).min(), usage: Self.usageDays(tokens: rows)) + latest: [], retained: [], first: rows.map(\.day).min(), usage: Self.usageDays(tokens: rows), + today: today) } else { + let url = historyURL result = try await Task.detached(priority: .utility) { - let tokens = try UsageHistoryStore.tokenRows(since: first, through: last) - let efforts = try UsageHistoryStore.effortRows(since: first, through: last) + let tokens = try UsageHistoryStore.tokenRows(since: first, through: last, at: url) + let efforts = try UsageHistoryStore.effortRows(since: first, through: last, at: url) return ReadResult( days: Self.makeDays(interval: interval, tokens: tokens, efforts: efforts), latest: try UsageHistoryStore.recentPaces( for: paceKeys, limitPerWindow: 1, before: now, matchingLatestQuota: true, - accountFingerprint: accountFingerprint), + accountFingerprint: accountFingerprint, at: url), retained: try UsageHistoryStore.recentPaces( - for: paceKeys, activeOnly: true, before: now, accountFingerprint: accountFingerprint), - first: try UsageHistoryStore.bounds().firstDay, + for: paceKeys, activeOnly: true, before: now, accountFingerprint: accountFingerprint, + at: url), + first: try UsageHistoryStore.bounds(at: url).firstDay, usage: HistoryUsageDays( - claude: try UsageHistoryStore.usageDays(provider: .claude), - codex: try UsageHistoryStore.usageDays(provider: .codex), - any: try UsageHistoryStore.usageDays())) + claude: try UsageHistoryStore.usageDays(provider: .claude, at: url), + codex: try UsageHistoryStore.usageDays(provider: .codex, at: url)), + today: today) }.value } guard !Task.isCancelled, generation == request else { return } @@ -228,6 +273,7 @@ final class HistoryDashboardModel: ObservableObject { firstRecordedDay = result.first days = result.days usageDays = result.usage + streaks = result.streaks loadedMode = mode paces = Dictionary(uniqueKeysWithValues: result.latest.map { ($0.key.id, $0.pace) }) paceActivity = Dictionary(uniqueKeysWithValues: result.latest.map { ($0.key.id, $0.isActive) }) @@ -240,6 +286,8 @@ final class HistoryDashboardModel: ObservableObject { isLoading = false paces = [:] days = [] + usageDays = HistoryUsageDays() + streaks = HistoryStreaks() } } @@ -307,7 +355,7 @@ final class HistoryDashboardModel: ObservableObject { let used = tokens.filter { $0.tokens > 0 } let claude = Set(used.filter { $0.provider == .claude }.map(\.day)) let codex = Set(used.filter { $0.provider == .codex }.map(\.day)) - return HistoryUsageDays(claude: claude, codex: codex, any: claude.union(codex)) + return HistoryUsageDays(claude: claude, codex: codex) } nonisolated private static func sum(_ values: [Int]) -> Int { @@ -323,5 +371,18 @@ final class HistoryDashboardModel: ObservableObject { let retained: [HistoryPaceRow] let first: String? let usage: HistoryUsageDays + let streaks: HistoryStreaks + + init( + days: [HistoryCalendarDay], latest: [HistoryPaceRow], retained: [HistoryPaceRow], first: String?, + usage: HistoryUsageDays, today: String + ) { + self.days = days + self.latest = latest + self.retained = retained + self.first = first + self.usage = usage + streaks = HistoryStreaks(usageDays: usage, today: today) + } } } diff --git a/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift b/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift index 740ec18..8bbf9ba 100644 --- a/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift @@ -10,9 +10,11 @@ struct HistoryCalendarView: NSViewRepresentable { var hoverEnabled = true var accent: Color = Color(nsColor: .labelColor) var pinnedDayKey: String? - var onHoverCard: @MainActor (String?, CGRect?) -> Void = { _, _ in } - var onPinCard: @MainActor (String, CGRect?) -> Void = { _, _ in } + var pinSafeFrames: [CGRect] = [] + var onHoverCard: @MainActor (String?, HistoryDayCardAnchor?) -> Void = { _, _ in } + var onPinCard: @MainActor (String, HistoryDayCardAnchor?) -> Void = { _, _ in } var onExitCalendar: @MainActor () -> Void = {} + var onDismissCard: @MainActor () -> Void = {} let onSelect: @MainActor (String) -> Void func makeNSView(context: Context) -> HistoryCalendarScrollView { @@ -66,6 +68,7 @@ final class HistoryCalendarScrollView: NSScrollView { } override func scrollWheel(with event: NSEvent) { + calendar.scrollDidMove() let delta = abs(event.scrollingDeltaX) >= abs(event.scrollingDeltaY) ? event.scrollingDeltaX : event.scrollingDeltaY @@ -84,11 +87,14 @@ final class HistoryCalendarCanvas: NSView { private var pinned: String? private var hoverEnabled = true private var onSelect: (@MainActor (String) -> Void)? - private var onHoverCard: (@MainActor (String?, CGRect?) -> Void)? - private var onPinCard: (@MainActor (String, CGRect?) -> Void)? + private var onHoverCard: (@MainActor (String?, HistoryDayCardAnchor?) -> Void)? + private var onPinCard: (@MainActor (String, HistoryDayCardAnchor?) -> Void)? private var onExitCalendar: (@MainActor () -> Void)? + private var onDismissCard: (@MainActor () -> Void)? private var hoverIndex: Int? private var hoverWork: DispatchWorkItem? + private var pinSafeFrames: [CGRect] = [] + private var pinMonitor: Any? private var locale = Locale.current private var today = Calendar.current.startOfDay(for: Date()) private var tracking: NSTrackingArea? @@ -110,13 +116,23 @@ final class HistoryCalendarCanvas: NSView { ?? days.lastIndex { $0.date <= today } } + deinit { + MainActor.assumeIsolated { + hoverWork?.cancel() + if let pinMonitor { NSEvent.removeMonitor(pinMonitor) } + } + } + func update(_ value: HistoryCalendarView) { onSelect = value.onSelect onHoverCard = value.onHoverCard onPinCard = value.onPinCard onExitCalendar = value.onExitCalendar + onDismissCard = value.onDismissCard hoverEnabled = value.hoverEnabled pinned = value.pinnedDayKey + pinSafeFrames = value.pinSafeFrames + updatePinMonitor() let language = Locale(identifier: LocalizationManager.shared.language.rawValue) let newToday = Calendar.current.startOfDay(for: Date()) let changed = @@ -165,12 +181,22 @@ final class HistoryCalendarCanvas: NSView { monthLayout.cellRect(index).offsetBy(dx: sidePadding, dy: 0) } - func panelRect(_ index: Int) -> CGRect? { - guard let root = window?.contentView else { return nil } - let rect = convert(cellRect(index), to: root) - return root.isFlipped + func cardAnchor(_ index: Int) -> HistoryDayCardAnchor? { + guard let scroll = enclosingScrollView, let root = window?.contentView else { return nil } + return HistoryDayCardAnchor( + cell: localRect(convert(cellRect(index), to: scroll), in: scroll), + bounds: localRect(scroll.convert(root.bounds, from: root), in: scroll)) + } + + private func localRect(_ rect: NSRect, in view: NSView) -> CGRect { + view.isFlipped ? rect - : CGRect(x: rect.minX, y: root.bounds.height - rect.maxY, width: rect.width, height: rect.height) + : CGRect(x: rect.minX, y: view.bounds.height - rect.maxY, width: rect.width, height: rect.height) + } + + private func localPoint(_ locationInWindow: NSPoint, in view: NSView) -> CGPoint { + let point = view.convert(locationInWindow, from: nil) + return view.isFlipped ? point : CGPoint(x: point.x, y: view.bounds.height - point.y) } private func color(_ provider: UsageProvider) -> NSColor { @@ -271,6 +297,8 @@ final class HistoryCalendarCanvas: NSView { override func viewDidMoveToWindow() { super.viewDidMoveToWindow() lastMousePosition = NSEvent.mouseLocation + if window == nil { cancelHoverTimer() } + updatePinMonitor() } override func updateTrackingAreas() { @@ -287,9 +315,11 @@ final class HistoryCalendarCanvas: NSView { override func mouseMoved(with event: NSEvent) { let position = window?.convertPoint(toScreen: event.locationInWindow) ?? event.locationInWindow defer { lastMousePosition = position } - guard hoverEnabled, position != lastMousePosition, pinned == nil, - let index = index(at: convert(event.locationInWindow, from: nil)) - else { return } + guard hoverEnabled, position != lastMousePosition, pinned == nil else { return } + guard let index = index(at: convert(event.locationInWindow, from: nil)) else { + if hoverIndex != nil { cancelHoverCard() } + return + } scheduleHoverCard(index) select(index) } @@ -303,11 +333,48 @@ final class HistoryCalendarCanvas: NSView { override func mouseDown(with event: NSEvent) { guard let index = index(at: convert(event.locationInWindow, from: nil)), days.indices.contains(index), days[index].date <= today - else { return } + else { + onDismissCard?() + cancelHoverCard() + return + } cancelHoverCard() hoverIndex = index select(index) - onPinCard?(days[index].id, panelRect(index)) + onPinCard?(days[index].id, cardAnchor(index)) + } + + func scrollDidMove() { + onDismissCard?() + cancelHoverCard() + } + + private func updatePinMonitor() { + guard pinned != nil, window != nil else { + if let pinMonitor { NSEvent.removeMonitor(pinMonitor) } + pinMonitor = nil + return + } + guard pinMonitor == nil else { return } + pinMonitor = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDown, .keyDown]) { [weak self] event in + MainActor.assumeIsolated { self?.passesPinnedEvent(event) ?? true } ? event : nil + } + } + + func passesPinnedEvent(_ event: NSEvent) -> Bool { + if event.type == .keyDown { + guard event.keyCode == 53 else { return true } + onDismissCard?() + return false + } + if event.window === window, let scroll = enclosingScrollView { + let point = localPoint(event.locationInWindow, in: scroll) + if scroll.bounds.contains(point) || pinSafeFrames.contains(where: { $0.contains(point) }) { + return true + } + } + onDismissCard?() + return true } private func scheduleHoverCard(_ index: Int) { @@ -319,17 +386,21 @@ final class HistoryCalendarCanvas: NSView { let work = DispatchWorkItem { [weak self] in MainActor.assumeIsolated { guard let self, self.hoverIndex == index else { return } - self.onHoverCard?(key, self.panelRect(index)) + self.onHoverCard?(key, self.cardAnchor(index)) } } hoverWork = work DispatchQueue.main.asyncAfter(deadline: .now() + 0.45, execute: work) } - private func cancelHoverCard() { + private func cancelHoverTimer() { hoverWork?.cancel() hoverWork = nil hoverIndex = nil + } + + private func cancelHoverCard() { + cancelHoverTimer() onHoverCard?(nil, nil) } diff --git a/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift b/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift index f4a3a6c..69295ee 100644 --- a/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift @@ -8,10 +8,31 @@ enum HistoryDayCardPlacement { static func origin(anchor: CGRect, cardSize: CGSize, bounds: CGRect) -> CGPoint { let below = anchor.maxY + spacing let above = anchor.minY - spacing - cardSize.height - let y = below + cardSize.height <= bounds.maxY ? below : max(bounds.minY, above) + let y: CGFloat + if below + cardSize.height <= bounds.maxY { + y = below + } else if above >= bounds.minY { + y = above + } else { + y = max(bounds.minY, min(below, bounds.maxY - cardSize.height)) + } let trailing = max(bounds.minX, bounds.maxX - cardSize.width) return CGPoint(x: min(max(bounds.minX, anchor.midX - cardSize.width / 2), trailing), y: y) } + + static func percentages(_ values: [Int]) -> [Int] { + let total = values.reduce(0) { $0 &+ $1 } + guard total > 0 else { return values.map { _ in 0 } } + let exact = values.map { Double($0) * 100 / Double(total) } + var result = exact.map { Int($0.rounded(.down)) } + let order = exact.indices.sorted { left, right in + let leftRemainder = exact[left] - Double(result[left]) + let rightRemainder = exact[right] - Double(result[right]) + return leftRemainder == rightRemainder ? left < right : leftRemainder > rightRemainder + } + for index in order.prefix(max(0, 100 - result.reduce(0, +))) { result[index] += 1 } + return result + } } struct HistoryDayCardView: View { @@ -33,9 +54,10 @@ struct HistoryDayCardView: View { if rows.isEmpty { Text("history.no_activity".localized).font(.system(size: 10)).foregroundStyle(.secondary) } else { + let percentages = HistoryDayCardPlacement.percentages(rows.map { day.tokens(for: $0) ?? 0 }) VStack(alignment: .leading, spacing: 8) { - ForEach(rows, id: \.self) { provider in - providerRow(provider) + ForEach(Array(rows.enumerated()), id: \.element) { index, provider in + providerRow(provider, percentage: percentages[index]) } } } @@ -76,10 +98,10 @@ struct HistoryDayCardView: View { } } - private func providerRow(_ provider: UsageProvider) -> some View { + private func providerRow(_ provider: UsageProvider, percentage: Int) -> some View { let tokens = day.tokens(for: provider) ?? 0 let share = total > 0 ? Double(tokens) / Double(total) : 0 - let percentage = (share * 100).rounded().formatted(.number.locale(locale)) + " %" + let percentage = percentage.formatted(.number.locale(locale)) + " %" return VStack(alignment: .leading, spacing: 5) { HStack(spacing: 6) { ProviderLogo(provider: provider, size: 16) diff --git a/Sources/TokenGaugeApp/Views/HistoryPanelView.swift b/Sources/TokenGaugeApp/Views/HistoryPanelView.swift index 811f170..5df66aa 100644 --- a/Sources/TokenGaugeApp/Views/HistoryPanelView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryPanelView.swift @@ -10,8 +10,8 @@ struct HistoryPanelView: View { @State private var calendarFocusRequest = 0 @State private var showingDetails = false @State private var lastPointerLocation = NSEvent.mouseLocation - @State private var panelFrame = CGRect.zero - @State private var cardHeight: CGFloat = 0 + @State private var frames: [HistoryFrame: CGRect] = [:] + @State private var cardHeight: CGFloat = 150 @Environment(\.accessibilityReduceMotion) private var reduceMotion @Environment(\.quotaAnimationsEnabled) private var animateChanges @Namespace private var daySelection @@ -31,6 +31,10 @@ struct HistoryPanelView: View { return recorded.isEmpty ? [.codex, .claude] : recorded } + private var stripProviders: [UsageProvider] { + model.loadedMode == .calendar ? calendarProviders : providers + } + private var motion: Animation? { animateChanges && !reduceMotion ? .easeInOut(duration: 0.18) : nil } @@ -48,10 +52,17 @@ struct HistoryPanelView: View { } private var cardFrame: CGRect? { - guard let anchor = model.daySelection?.anchor, panelFrame != .zero else { return nil } - let size = CGSize(width: HistoryDayCardPlacement.width, height: max(cardHeight, 1)) - return CGRect( - origin: HistoryDayCardPlacement.origin(anchor: anchor, cardSize: size, bounds: panelFrame), size: size) + guard let anchor = model.daySelection?.anchor, let calendar = frames[.calendar] else { return nil } + let size = CGSize(width: HistoryDayCardPlacement.width, height: cardHeight) + let origin = HistoryDayCardPlacement.origin( + anchor: anchor.cell.offsetBy(dx: calendar.minX, dy: calendar.minY), cardSize: size, + bounds: anchor.bounds.offsetBy(dx: calendar.minX, dy: calendar.minY)) + return CGRect(origin: origin, size: size) + } + + private var pinSafeFrames: [CGRect] { + guard let calendar = frames[.calendar] else { return [] } + return [cardFrame, frames[.summary]].compactMap { $0?.offsetBy(dx: -calendar.minX, dy: -calendar.minY) } } var body: some View { @@ -83,19 +94,12 @@ struct HistoryPanelView: View { selectionSummary } } - .background( - GeometryReader { proxy in - Color.clear.preference(key: HistoryPanelFrameKey.self, value: proxy.frame(in: .global)) - } - ) - .onPreferenceChange(HistoryPanelFrameKey.self) { panelFrame = $0 } - .onPreferenceChange(HistoryDayCardHeightKey.self) { cardHeight = $0 } - .overlay(alignment: .topLeading) { dayCard.animation(cardMotion, value: model.daySelection) } - .onTapGesture(coordinateSpace: .global) { location in - guard cardFrame?.contains(location) != true else { return } - dismissDayCard() - } - .onExitCommand { dismissDayCard() } + .background(frameReporter(.panel)) + .overlay(alignment: .topLeading) { dayCard.animation(cardMotion, value: model.daySelection != nil) } + .zIndex(1) + .onPreferenceChange(HistoryFrameKey.self) { frames = $0 } + .onPreferenceChange(HistoryDayCardHeightKey.self) { if $0 > 0 { cardHeight = $0 } } + .onChange(of: providers) { _, _ in dismissDayCard() } .onChange(of: mode) { _, newValue in model.offset = 0 model.selectedDayKey = nil @@ -115,7 +119,7 @@ struct HistoryPanelView: View { } @ViewBuilder private var dayCard: some View { - if let selection = model.daySelection, let frame = cardFrame, + if let selection = model.daySelection, let frame = cardFrame, let panel = frames[.panel], let day = model.days.first(where: { $0.id == selection.dayKey }) { let streak = model.streak(for: providers) @@ -130,11 +134,18 @@ struct HistoryPanelView: View { Color.clear.preference(key: HistoryDayCardHeightKey.self, value: proxy.size.height) } ) - .offset(x: frame.minX - panelFrame.minX, y: frame.minY - panelFrame.minY) + .allowsHitTesting(selection.isPinned) + .offset(x: frame.minX - panel.minX, y: frame.minY - panel.minY) .transition(cardTransition) } } + private func frameReporter(_ kind: HistoryFrame) -> some View { + GeometryReader { proxy in + Color.clear.preference(key: HistoryFrameKey.self, value: [kind: proxy.frame(in: .global)]) + } + } + private func dismissDayCard() { guard model.daySelection != nil else { return } model.dismissDayCard() @@ -188,8 +199,7 @@ struct HistoryPanelView: View { } private var bars: some View { - let maximum = max( - 1, model.days.flatMap { day in calendarProviders.compactMap { day.tokens(for: $0) } }.max() ?? 0) + let maximum = max(1, model.days.flatMap { day in providers.compactMap { day.tokens(for: $0) } }.max() ?? 0) let selectedID = model.selectedDay?.id return HStack(alignment: .bottom, spacing: 6) { ForEach(model.days) { day in @@ -198,7 +208,7 @@ struct HistoryPanelView: View { } label: { VStack(spacing: 4) { HStack(alignment: .bottom, spacing: 2) { - ForEach(calendarProviders, id: \.self) { provider in + ForEach(providers, id: \.self) { provider in if let tokens = day.tokens(for: provider) { RoundedRectangle(cornerRadius: 2) .fill(color(provider).opacity(tokens == 0 ? 0.2 : 1)) @@ -270,7 +280,7 @@ struct HistoryPanelView: View { days: model.days, providers: calendarProviders, selectedDayKey: model.selectedDay?.id, focusID: "\(model.periodStart.timeIntervalSince1970):\(calendarFocusRequest)", hoverEnabled: !showingDetails && !model.isLoading, - accent: accent, pinnedDayKey: pinnedDayKey, + accent: accent, pinnedDayKey: pinnedDayKey, pinSafeFrames: pinSafeFrames, onHoverCard: { key, anchor in guard let key else { model.hideDayCard() @@ -286,10 +296,12 @@ struct HistoryPanelView: View { guard model.daySelection?.isPinned != true else { return } model.hideDayCard() selectToday() - } + }, + onDismissCard: dismissDayCard ) { key in if let day = model.days.first(where: { $0.id == key }) { select(day) } } + .background(frameReporter(.calendar)) } .frame(height: Theme.Layout.historyCalendarHeight) } @@ -324,19 +336,20 @@ struct HistoryPanelView: View { }.font(.system(size: 10)) } .buttonStyle(.plain).foregroundStyle(.secondary) - .disabled(day.efforts.filter { calendarProviders.contains($0.provider) }.isEmpty) + .disabled(day.efforts.filter { stripProviders.contains($0.provider) }.isEmpty) .popover(isPresented: $showingDetails, arrowEdge: .bottom) { effortDetails(day) } } HStack(spacing: 10) { - ForEach(calendarProviders, id: \.self) { provider in + ForEach(stripProviders, id: \.self) { provider in providerTotal(provider, day: day) } } } .padding(10) .background(RoundedRectangle(cornerRadius: 9).fill(Color.primary.opacity(0.035))) + .background(frameReporter(.summary)) .animation(motion, value: day.id) } } @@ -357,7 +370,7 @@ struct HistoryPanelView: View { } private func effortDetails(_ day: HistoryCalendarDay) -> some View { - let rows = day.efforts.filter { calendarProviders.contains($0.provider) }.sorted { $0.tokens > $1.tokens } + let rows = day.efforts.filter { stripProviders.contains($0.provider) }.sorted { $0.tokens > $1.tokens } return VStack(alignment: .leading, spacing: 12) { HStack { VStack(alignment: .leading, spacing: 3) { @@ -413,7 +426,7 @@ struct HistoryPanelView: View { private func summary(_ day: HistoryCalendarDay) -> String { let date = day.date.formatted(.dateTime.weekday(.abbreviated).day().month(.abbreviated).year().locale(locale)) - let totals = calendarProviders.map { provider in + let totals = providers.map { provider in name(provider) + " " + (day.tokens(for: provider).map(exact) ?? "history.unknown".localized) }.joined(separator: " · ") return date + ": " + totals @@ -431,9 +444,17 @@ struct HistoryPanelView: View { } } -private struct HistoryPanelFrameKey: PreferenceKey { - static let defaultValue = CGRect.zero - static func reduce(value: inout CGRect, nextValue: () -> CGRect) { value = nextValue() } +private enum HistoryFrame { + case panel + case calendar + case summary +} + +private struct HistoryFrameKey: PreferenceKey { + static let defaultValue: [HistoryFrame: CGRect] = [:] + static func reduce(value: inout [HistoryFrame: CGRect], nextValue: () -> [HistoryFrame: CGRect]) { + value.merge(nextValue()) { $1 } + } } private struct HistoryDayCardHeightKey: PreferenceKey { diff --git a/Sources/TokenGaugeCore/HistoryAnalytics.swift b/Sources/TokenGaugeCore/HistoryAnalytics.swift index 76732fe..167f2fe 100644 --- a/Sources/TokenGaugeCore/HistoryAnalytics.swift +++ b/Sources/TokenGaugeCore/HistoryAnalytics.swift @@ -38,14 +38,7 @@ public enum HistoryAnalytics { public static func streaks(usageDays: Set, today: String, calendar: Calendar = .current) -> (current: Int, longest: Int) { - let formatter = DateFormatter() - formatter.calendar = calendar - formatter.timeZone = calendar.timeZone - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.dateFormat = "yyyy-MM-dd" - let ordinals = Set( - usageDays.compactMap { formatter.date(from: $0) } - .compactMap { calendar.ordinality(of: .day, in: .era, for: $0) }) + let ordinals = Set(usageDays.compactMap { ordinalDay($0, calendar: calendar) }) var longest = 0 for start in ordinals where !ordinals.contains(start - 1) { var length = 1 @@ -53,7 +46,7 @@ public enum HistoryAnalytics { longest = max(longest, length) } var current = 0 - if let reference = formatter.date(from: today).flatMap({ calendar.ordinality(of: .day, in: .era, for: $0) }) { + if let reference = ordinalDay(today, calendar: calendar) { var cursor = ordinals.contains(reference) ? reference : reference - 1 while ordinals.contains(cursor) { current += 1 @@ -63,6 +56,15 @@ public enum HistoryAnalytics { return (current, longest) } + private static func ordinalDay(_ key: String, calendar: Calendar) -> Int? { + let parts = key.split(separator: "-", omittingEmptySubsequences: false) + guard parts.count == 3, let year = Int(parts[0]), let month = Int(parts[1]), let day = Int(parts[2]), + (1...12).contains(month), (1...31).contains(day), + let date = calendar.date(from: DateComponents(year: year, month: month, day: day)) + else { return nil } + return calendar.ordinality(of: .day, in: .era, for: date) + } + public static func pace( rows: [HistoryQuotaRow], provider: UsageProvider, diff --git a/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift b/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift index d043fae..196d3ec 100644 --- a/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift @@ -112,6 +112,105 @@ final class HistoryCalendarRenderingTests: XCTestCase { XCTAssertEqual(exits, 1) } + func testCardAnchorIsRelativeToTheCalendarAndCarriesTheRootBounds() throws { + let now = Date() + let interval = HistoryDashboardModel.interval(mode: .calendar, offset: 0, now: now) + let days = HistoryDashboardModel.makeDays(interval: interval, tokens: [], efforts: []) + let today = try XCTUnwrap(days.firstIndex { Calendar.current.isDate($0.date, inSameDayAs: now) }) + let view = HistoryCalendarScrollView() + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 440, height: Theme.Layout.historyCalendarHeight), + styleMask: [.borderless], backing: .buffered, defer: false) + window.contentView = view + defer { window.contentView = nil } + view.calendar.update( + HistoryCalendarView(days: days, providers: [.codex], selectedDayKey: days[today].id, focusID: "year") { + _ in + }) + view.layout() + let anchor = try XCTUnwrap(view.calendar.cardAnchor(today)) + let cell = view.calendar.cellRect(today) + XCTAssertEqual(anchor.bounds, CGRect(x: 0, y: 0, width: 440, height: Theme.Layout.historyCalendarHeight)) + XCTAssertEqual(anchor.cell.minX, cell.minX - view.contentView.bounds.minX, accuracy: 0.5) + XCTAssertEqual(anchor.cell.minY, cell.minY, accuracy: 0.5) + XCTAssertEqual(anchor.cell.size, cell.size) + XCTAssertTrue(anchor.bounds.contains(anchor.cell)) + window.contentView = nil + XCTAssertNil(view.calendar.cardAnchor(today)) + } + + func testScrollAndEmptyAreaClicksDismissTheCard() throws { + let now = Date() + let interval = HistoryDashboardModel.interval(mode: .calendar, offset: 0, now: now) + let days = HistoryDashboardModel.makeDays(interval: interval, tokens: [], efforts: []) + let view = HistoryCalendarScrollView() + view.frame = NSRect(x: 0, y: 0, width: 440, height: Theme.Layout.historyCalendarHeight) + var dismissals = 0 + var hovers: [String?] = [] + var pins: [String] = [] + view.calendar.update( + HistoryCalendarView( + days: days, providers: [.codex], selectedDayKey: nil, focusID: "year", + onHoverCard: { key, _ in hovers.append(key) }, onPinCard: { key, _ in pins.append(key) }, + onDismissCard: { dismissals += 1 } + ) { _ in }) + view.layout() + view.calendar.scrollDidMove() + XCTAssertEqual(dismissals, 1) + XCTAssertEqual(hovers, [nil]) + view.calendar.mouseDown(with: try mouseDown(at: NSPoint(x: -1000, y: 0), windowNumber: 0)) + XCTAssertEqual(dismissals, 2) + XCTAssertTrue(pins.isEmpty) + } + + func testPinnedEventFilterDismissesOutsideClicksAndSwallowsEscape() throws { + let now = Date() + let interval = HistoryDashboardModel.interval(mode: .calendar, offset: 0, now: now) + let days = HistoryDashboardModel.makeDays(interval: interval, tokens: [], efforts: []) + let view = HistoryCalendarScrollView() + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 440, height: 600), styleMask: [.borderless], backing: .buffered, + defer: false) + let root = NSView(frame: NSRect(x: 0, y: 0, width: 440, height: 600)) + window.contentView = root + defer { window.contentView = nil } + view.frame = NSRect(x: 0, y: 200, width: 440, height: Theme.Layout.historyCalendarHeight) + root.addSubview(view) + var dismissals = 0 + view.calendar.update( + HistoryCalendarView( + days: days, providers: [.codex], selectedDayKey: days[0].id, focusID: "year", + pinnedDayKey: days[0].id, pinSafeFrames: [CGRect(x: 0, y: -100, width: 440, height: 60)], + onDismissCard: { dismissals += 1 } + ) { _ in }) + view.layout() + let number = window.windowNumber + XCTAssertTrue(view.calendar.passesPinnedEvent(try mouseDown(at: NSPoint(x: 220, y: 250), windowNumber: number))) + XCTAssertEqual(dismissals, 0) + XCTAssertTrue(view.calendar.passesPinnedEvent(try mouseDown(at: NSPoint(x: 220, y: 380), windowNumber: number))) + XCTAssertEqual(dismissals, 0) + XCTAssertTrue(view.calendar.passesPinnedEvent(try mouseDown(at: NSPoint(x: 220, y: 100), windowNumber: number))) + XCTAssertEqual(dismissals, 1) + XCTAssertFalse(view.calendar.passesPinnedEvent(try key(53, windowNumber: number))) + XCTAssertEqual(dismissals, 2) + XCTAssertTrue(view.calendar.passesPinnedEvent(try key(36, windowNumber: number))) + XCTAssertEqual(dismissals, 2) + } + + private func mouseDown(at location: NSPoint, windowNumber: Int) throws -> NSEvent { + try XCTUnwrap( + NSEvent.mouseEvent( + with: .leftMouseDown, location: location, modifierFlags: [], timestamp: 0, windowNumber: windowNumber, + context: nil, eventNumber: 0, clickCount: 1, pressure: 1)) + } + + private func key(_ code: UInt16, windowNumber: Int) throws -> NSEvent { + try XCTUnwrap( + NSEvent.keyEvent( + with: .keyDown, location: .zero, modifierFlags: [], timestamp: 0, windowNumber: windowNumber, + context: nil, characters: "", charactersIgnoringModifiers: "", isARepeat: false, keyCode: code)) + } + private func exitEvent() throws -> NSEvent { try XCTUnwrap( NSEvent.enterExitEvent( diff --git a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift index 8e8975d..8fa06a4 100644 --- a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift @@ -172,16 +172,77 @@ final class HistoryDashboardTests: XCTestCase { func testPinnedDayCardSurvivesHoverAndUnpinsOnTheSameCell() { let model = HistoryDashboardModel() - model.showDayCard("2026-09-16", anchor: CGRect(x: 10, y: 10, width: 9, height: 9)) + let bounds = CGRect(x: -20, y: -300, width: 560, height: 700) + model.showDayCard("2026-09-16", anchor: anchor(x: 10, bounds: bounds)) XCTAssertEqual(model.daySelection?.dayKey, "2026-09-16") XCTAssertEqual(model.daySelection?.isPinned, false) - model.pinDayCard("2026-09-17", anchor: CGRect(x: 20, y: 10, width: 9, height: 9)) + model.pinDayCard("2026-09-17", anchor: anchor(x: 20, bounds: bounds)) XCTAssertEqual(model.daySelection?.isPinned, true) + XCTAssertEqual(model.daySelection?.anchor?.bounds, bounds) model.showDayCard("2026-09-15", anchor: nil) model.hideDayCard() XCTAssertEqual(model.daySelection?.dayKey, "2026-09-17") - model.pinDayCard("2026-09-17", anchor: CGRect(x: 20, y: 10, width: 9, height: 9)) + model.pinDayCard("2026-09-17", anchor: anchor(x: 20, bounds: bounds)) XCTAssertNil(model.daySelection) + model.dismissDayCard() + XCTAssertNil(model.daySelection) + } + + func testStreakCacheMatchesDirectComputationForEveryScope() async { + let model = HistoryDashboardModel() + let keys = (0..<5).map { HistoryDashboardModel.dayKey(Date().addingTimeInterval(-86_400 * Double($0))) } + await model.load( + mode: .recent, revision: 1, + previewSnapshots: [ + ProviderUsageSnapshot( + provider: .codex, windows: [], + dailyUsage: [DailyTokenUsage(day: keys[1], tokens: 10), DailyTokenUsage(day: keys[2], tokens: 10)], + summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: Date()), + ProviderUsageSnapshot( + provider: .claude, windows: [], + dailyUsage: [DailyTokenUsage(day: keys[0], tokens: 5), DailyTokenUsage(day: keys[4], tokens: 5)], + summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: Date()), + ]) + XCTAssertEqual(model.usageDays.any, model.usageDays.claude.union(model.usageDays.codex)) + for providers in [[UsageProvider.codex], [.claude], [.codex, .claude]] { + let direct = HistoryAnalytics.streaks(usageDays: model.usageDays.days(for: providers), today: keys[0]) + XCTAssertEqual(model.streak(for: providers).current, direct.current, "\(providers)") + XCTAssertEqual(model.streak(for: providers).longest, direct.longest, "\(providers)") + } + XCTAssertEqual(model.streak(for: [.codex]).current, 2) + XCTAssertEqual(model.streak(for: [.claude]).current, 1) + XCTAssertEqual(model.streak(for: [.codex, .claude]).current, 3) + } + + func testFailedLoadClearsDaysUsageDaysAndStreaks() async throws { + let directory = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: directory) } + let blocker = directory.appendingPathComponent("blocker") + try Data().write(to: blocker) + let model = HistoryDashboardModel(historyURL: blocker.appendingPathComponent("history.sqlite")) + let today = HistoryDashboardModel.dayKey(Date()) + await model.load( + mode: .recent, revision: 1, + previewSnapshots: [ + ProviderUsageSnapshot( + provider: .codex, windows: [], dailyUsage: [DailyTokenUsage(day: today, tokens: 10)], + summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: Date()) + ]) + XCTAssertEqual(model.streak(for: [.codex]).current, 1) + XCTAssertFalse(model.usageDays.codex.isEmpty) + await model.load(mode: .recent, revision: 2) + XCTAssertTrue(model.loadFailed) + XCTAssertFalse(model.isLoading) + XCTAssertTrue(model.days.isEmpty) + XCTAssertTrue(model.paces.isEmpty) + XCTAssertEqual(model.usageDays, HistoryUsageDays()) + XCTAssertEqual(model.streaks, HistoryStreaks()) + XCTAssertEqual(model.streak(for: [.codex]), HistoryStreak()) + } + + private func anchor(x: CGFloat, bounds: CGRect) -> HistoryDayCardAnchor { + HistoryDayCardAnchor(cell: CGRect(x: x, y: 10, width: 9, height: 9), bounds: bounds) } func testStreakFollowsTheDisplayedProviders() async { diff --git a/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift b/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift index 523f1ed..ed3bd81 100644 --- a/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryDayCardTests.swift @@ -36,6 +36,38 @@ final class HistoryDayCardTests: XCTestCase { XCTAssertEqual(leading.x, bounds.minX) } + func testTallCardFallsBelowAboveThenClampsToTheBottomOrTop() { + let size = CGSize(width: HistoryDayCardPlacement.width, height: 160) + let bounds = CGRect(x: -20, y: -300, width: 560, height: 700) + func origin(_ y: CGFloat, in bounds: CGRect) -> CGPoint { + HistoryDayCardPlacement.origin( + anchor: CGRect(x: 280, y: y, width: 9, height: 9), cardSize: size, bounds: bounds) + } + XCTAssertEqual(origin(100, in: bounds).y, 109 + HistoryDayCardPlacement.spacing) + XCTAssertEqual(origin(300, in: bounds).y, 300 - HistoryDayCardPlacement.spacing - size.height) + let short = CGRect(x: 0, y: 0, width: 560, height: 200) + XCTAssertEqual(origin(100, in: short).y, short.maxY - size.height) + let tiny = CGRect(x: 0, y: 0, width: 560, height: 150) + XCTAssertEqual(origin(60, in: tiny).y, tiny.minY) + for (y, frame) in [(100, bounds), (300, bounds), (100, short)] { + let point = origin(CGFloat(y), in: frame) + XCTAssertTrue(frame.contains(CGRect(origin: point, size: size)), "\(y) in \(frame)") + } + } + + func testSharePercentagesUseLargestRemainderAndSumToOneHundred() { + XCTAssertEqual(HistoryDayCardPlacement.percentages([505, 495]), [51, 49]) + XCTAssertEqual(HistoryDayCardPlacement.percentages([1, 1, 1]), [34, 33, 33]) + XCTAssertEqual(HistoryDayCardPlacement.percentages([800, 200]), [80, 20]) + XCTAssertEqual(HistoryDayCardPlacement.percentages([1, 999]), [0, 100]) + XCTAssertEqual(HistoryDayCardPlacement.percentages([7]), [100]) + XCTAssertEqual(HistoryDayCardPlacement.percentages([0, 0]), [0, 0]) + XCTAssertEqual(HistoryDayCardPlacement.percentages([]), []) + for values in [[1, 2], [333, 333, 334], [2, 3, 5, 7, 11], [Int.max / 2, Int.max / 2]] { + XCTAssertEqual(HistoryDayCardPlacement.percentages(values).reduce(0, +), 100, "\(values)") + } + } + func testCardRendersBothProvidersInEveryLanguage() { let language = LocalizationManager.shared.language defer { LocalizationManager.shared.language = language } diff --git a/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift b/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift index 980b583..7e98022 100644 --- a/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift +++ b/Tests/TokenGaugeCoreTests/HistoryAnalyticsTests.swift @@ -86,6 +86,14 @@ final class HistoryAnalyticsTests: XCTestCase { HistoryAnalytics.streaks(usageDays: days, today: "2026-09-18", calendar: calendar).current, 0) } + func testMalformedDayKeysAreIgnoredByStreaks() { + let days: Set = ["2026-09-16", "2026-09-17", "garbage", "2026-13-01", "2026-09", "2026-09-32"] + let result = HistoryAnalytics.streaks(usageDays: days, today: "2026-09-17", calendar: calendar) + XCTAssertEqual(result.current, 2) + XCTAssertEqual(result.longest, 2) + XCTAssertEqual(HistoryAnalytics.streaks(usageDays: days, today: "today", calendar: calendar).current, 0) + } + func testEmptyAndSingleDayHistories() { XCTAssertEqual(HistoryAnalytics.streaks(usageDays: [], today: "2026-09-17", calendar: calendar).current, 0) XCTAssertEqual(HistoryAnalytics.streaks(usageDays: [], today: "2026-09-17", calendar: calendar).longest, 0) From 7351c47d02e9eec7506e4744bee5cb2e63844ac8 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:03:48 -0500 Subject: [PATCH 11/21] refactor(clients): concurrent history and account fetch, async refresher seam and shared window order --- .../Resources/en.lproj/Localizable.strings | 1 - .../Resources/es.lproj/Localizable.strings | 1 - .../TokenGaugeApp/Services/BlockingWork.swift | 7 +- .../Services/ClaudeAccountUsageClient.swift | 9 --- .../Services/ClaudeUsageClient.swift | 70 +++++++++++++------ .../Services/UpdateManager.swift | 2 +- .../Services/UsageRefresher.swift | 8 +-- .../TokenGaugeApp/Services/UsageStore.swift | 7 +- .../ClaudeAccountUsageParser.swift | 8 +-- .../TokenGaugeCore/EffortUsageScanner.swift | 6 +- .../ClaudeRecoveryLiveTests.swift | 6 +- .../ClaudeRecoveryTests.swift | 16 ++--- .../ClaudeUsageClientConcurrencyTests.swift | 43 ++++++++++++ .../UsageStoreRefreshTests.swift | 2 +- .../ClaudeAccountUsageParserTests.swift | 23 ++++++ 15 files changed, 144 insertions(+), 65 deletions(-) create mode 100644 Tests/TokenGaugeAppTests/ClaudeUsageClientConcurrencyTests.swift diff --git a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings index 7e2397f..f9a74d5 100644 --- a/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/en.lproj/Localizable.strings @@ -102,7 +102,6 @@ "setup.claude_session" = "Uses your local Claude session"; "updates.local" = "Local installation"; "settings.mark_cancelled" = "Subscription cancelled"; -"activity.selected_scoped" = "%@: %@"; "view.unified" = "Unified"; "settings.display_mode" = "Menu bar view"; "settings.display_mode_help" = "Choose one provider or both in the menu bar and panel."; diff --git a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings index 5c76487..360a00a 100644 --- a/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings +++ b/Sources/TokenGaugeApp/Resources/es.lproj/Localizable.strings @@ -102,7 +102,6 @@ "setup.claude_session" = "Usa tu sesión local de Claude"; "updates.local" = "Instalación local"; "settings.mark_cancelled" = "Suscripción cancelada"; -"activity.selected_scoped" = "%@: %@"; "view.unified" = "Unificado"; "settings.display_mode" = "Vista de la barra"; "settings.display_mode_help" = "Elige un proveedor o ambos para la barra y el panel."; diff --git a/Sources/TokenGaugeApp/Services/BlockingWork.swift b/Sources/TokenGaugeApp/Services/BlockingWork.swift index 2dcaf73..cf8b6ee 100644 --- a/Sources/TokenGaugeApp/Services/BlockingWork.swift +++ b/Sources/TokenGaugeApp/Services/BlockingWork.swift @@ -7,9 +7,12 @@ enum BlockingWork { private static let queue = DispatchQueue( label: "com.stevenacz.TokenGauge.blocking-work", qos: .utility, attributes: .concurrent) - static func run(_ work: @escaping @Sendable () throws -> Value) async throws -> Value { + static func run( + qos: DispatchQoS = .unspecified, + _ work: @escaping @Sendable () throws -> Value + ) async throws -> Value { try await withCheckedThrowingContinuation { continuation in - queue.async { + queue.async(group: nil, qos: qos, flags: []) { do { continuation.resume(returning: try work()) } catch { diff --git a/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift b/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift index e89eadd..9eb37ed 100644 --- a/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift +++ b/Sources/TokenGaugeApp/Services/ClaudeAccountUsageClient.swift @@ -35,15 +35,6 @@ struct ClaudeAccountUsageClient: Sendable { }() private static let log = Logger(subsystem: "com.stevenacz.TokenGauge", category: "claude-account") - func fetch(now: Date = Date(), identity: ClaudeAccountIdentity?) throws -> ClaudeAccountSnapshot { - do { - return try BlockingWork.waitForResult(timeout: 25) { try await fetch(now: now, identity: identity) } - } catch is BlockingWork.TimedOut { - Self.log.error("Claude usage request did not complete within its bound") - throw ClaudeAccountUsageError.unavailable - } - } - func fetch(now: Date = Date(), identity: ClaudeAccountIdentity?) async throws -> ClaudeAccountSnapshot { let accountUuid = identity?.accountUuid guard let token = try await BlockingWork.run({ ClaudeOAuthTokenReader.read(accountUuid: accountUuid) }) diff --git a/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift b/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift index 4c1edc5..2b93952 100644 --- a/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift +++ b/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift @@ -38,23 +38,49 @@ struct ClaudeUsageClient: Sendable { func fetch( now: Date = Date(), recoveryAuthorization: ClaudeRecoveryAuthorization = ClaudeRecoveryAuthorization() - ) throws -> ClaudeUsageResult { + ) async -> ClaudeUsageResult { + let homeDirectory = homeDirectory let identity = ClaudeAccountIdentityReader.current(homeDirectory: homeDirectory) - let buckets = try? fetchModelBuckets() let account = ClaudeAccountUsageClient(homeDirectory: homeDirectory) - let outcome = Self.readAccount( - fetch: { try account.fetch(now: Date(), identity: identity) }, - recover: { - ClaudeSessionRecovery.shared.attempt(homeDirectory: homeDirectory, authorization: recoveryAuthorization) - } + return await Self.fetch( + history: { try? await BlockingWork.run { try self.fetchModelBuckets() } }, + account: { + await Self.readAccount( + fetch: { try await account.fetch(now: Date(), identity: identity) }, + recover: { + (try? await BlockingWork.run { + ClaudeSessionRecovery.shared.attempt( + homeDirectory: homeDirectory, authorization: recoveryAuthorization) + }) ?? false + } + ) + }, + cached: { account.cached(identity: identity) }, + capture: { + Self.capture( + at: UsagePaths.claudeCapture(homeDirectory: homeDirectory), + accountFingerprint: identity?.fingerprint) + }, + now: now, accountFingerprint: identity?.fingerprint, accountLabel: identity?.label ) - let capture = Self.capture( - at: UsagePaths.claudeCapture(homeDirectory: homeDirectory), - accountFingerprint: identity?.fingerprint) - return Self.resolve( - account: outcome, cached: account.cached(identity: identity), capture: capture, - modelBuckets: buckets ?? [], now: now, activityReadSucceeded: buckets != nil, - accountFingerprint: identity?.fingerprint, accountLabel: identity?.label + } + + static func fetch( + history: @escaping @Sendable () async -> [ModelTokenBucket]?, + account: @escaping @Sendable () async -> Result, + cached: @escaping @Sendable () -> ClaudeAccountSnapshot?, + capture: @escaping @Sendable () -> ClaudeCapturedSnapshot?, + now: Date, + accountFingerprint: String? = nil, + accountLabel: String? = nil + ) async -> ClaudeUsageResult { + async let buckets = history() + async let outcome = account() + let (modelBuckets, resolved) = await (buckets, outcome) + return resolve( + account: resolved, cached: cached(), capture: capture(), modelBuckets: modelBuckets ?? [], now: now, + activityReadSucceeded: modelBuckets != nil, accountFingerprint: accountFingerprint, + accountLabel: accountLabel ) } @@ -66,15 +92,19 @@ struct ClaudeUsageClient: Sendable { } static func readAccount( - fetch: () throws -> ClaudeAccountSnapshot, - recover: () -> Bool - ) -> Result { + fetch: () async throws -> ClaudeAccountSnapshot, + recover: () async -> Bool + ) async -> Result { do { - return .success(try fetch()) + return .success(try await fetch()) } catch ClaudeAccountUsageError.credentialExpired { - guard recover() else { return .failure(ClaudeAccountUsageError.credentialExpired) } + guard await recover() else { return .failure(ClaudeAccountUsageError.credentialExpired) } ClaudeOAuthTokenReader.invalidate() - return Result { try fetch() } + do { + return .success(try await fetch()) + } catch { + return .failure(error) + } } catch { return .failure(error) } diff --git a/Sources/TokenGaugeApp/Services/UpdateManager.swift b/Sources/TokenGaugeApp/Services/UpdateManager.swift index 6be1077..fe3a2e8 100644 --- a/Sources/TokenGaugeApp/Services/UpdateManager.swift +++ b/Sources/TokenGaugeApp/Services/UpdateManager.swift @@ -377,7 +377,7 @@ final class UpdateManager: ObservableObject { manualCheckStatus = status guard status != .idle else { return } manualCheckResetTask = Task { [weak self] in - try? await Task.sleep(nanoseconds: 3_000_000_000) + try? await Task.sleep(for: .seconds(3)) guard !Task.isCancelled else { return } self?.manualCheckStatus = .idle } diff --git a/Sources/TokenGaugeApp/Services/UsageRefresher.swift b/Sources/TokenGaugeApp/Services/UsageRefresher.swift index 8f68626..48dcaa2 100644 --- a/Sources/TokenGaugeApp/Services/UsageRefresher.swift +++ b/Sources/TokenGaugeApp/Services/UsageRefresher.swift @@ -8,19 +8,19 @@ enum ProviderOutcome: Sendable { struct UsageRefresher: Sendable { let homeDirectory: URL - private let fetchClaude: @Sendable (ClaudeRecoveryAuthorization) -> ClaudeUsageResult? + private let fetchClaude: @Sendable (ClaudeRecoveryAuthorization) async -> ClaudeUsageResult? private let fetchCodex: @Sendable () -> ProviderViewState init(claudeClient: ClaudeUsageClient, codexClient: CodexAppServerClient) { self.init( homeDirectory: claudeClient.homeDirectory, - fetchClaude: { try? claudeClient.fetch(recoveryAuthorization: $0) }, + fetchClaude: { await claudeClient.fetch(recoveryAuthorization: $0) }, fetchCodex: { Self.codexState(client: codexClient) }) } init( homeDirectory: URL, - fetchClaude: @escaping @Sendable (ClaudeRecoveryAuthorization) -> ClaudeUsageResult?, + fetchClaude: @escaping @Sendable (ClaudeRecoveryAuthorization) async -> ClaudeUsageResult?, fetchCodex: @escaping @Sendable () -> ProviderViewState ) { self.homeDirectory = homeDirectory @@ -34,7 +34,7 @@ struct UsageRefresher: Sendable { return AsyncStream { continuation in Task.detached(priority: .utility) { await withTaskGroup(of: ProviderOutcome.self) { group in - group.addTask { .claude(fetchClaude(recoveryAuthorization)) } + group.addTask { .claude(await fetchClaude(recoveryAuthorization)) } group.addTask { .codex(fetchCodex()) } for await outcome in group { continuation.yield(outcome) } } diff --git a/Sources/TokenGaugeApp/Services/UsageStore.swift b/Sources/TokenGaugeApp/Services/UsageStore.swift index 456932b..82b6ef5 100644 --- a/Sources/TokenGaugeApp/Services/UsageStore.swift +++ b/Sources/TokenGaugeApp/Services/UsageStore.swift @@ -175,12 +175,13 @@ final class UsageStore: ObservableObject { scheduleResetRefresh() guard historyReadsEnabled else { return } let archived = (claude: claudeResult, codex: codexState) - await Task.detached(priority: .background) { + let homeDirectory = refresher.homeDirectory + try? await BlockingWork.run(qos: .background) { Self.archive( claudeResult: archived.claude, codexState: archived.codex, accountFingerprint: archived.claude?.accountFingerprint) - try? EffortHistoryClient.collect(homeDirectory: refresher.homeDirectory) - }.value + try? EffortHistoryClient.collect(homeDirectory: homeDirectory) + } historyRevision &+= 1 } } diff --git a/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift b/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift index d4c1b66..a8c3c69 100644 --- a/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift +++ b/Sources/TokenGaugeCore/ClaudeAccountUsageParser.swift @@ -38,13 +38,7 @@ public enum ClaudeAccountUsageParser { guard !entries.isEmpty else { return .empty } let windows = limits(from: entries) guard !windows.isEmpty else { throw UsageDataError.invalidPayload } - return .windows( - windows.sorted { left, right in - let leftDuration = left.durationMinutes ?? Int.max - let rightDuration = right.durationMinutes ?? Int.max - if leftDuration != rightDuration { return leftDuration < rightDuration } - return left.id < right.id - }) + return .windows(windows.sorted(by: QuotaWindow.displayOrder)) } private static func limits(from entries: [Any]) -> [QuotaWindow] { diff --git a/Sources/TokenGaugeCore/EffortUsageScanner.swift b/Sources/TokenGaugeCore/EffortUsageScanner.swift index bf65725..dcb6194 100644 --- a/Sources/TokenGaugeCore/EffortUsageScanner.swift +++ b/Sources/TokenGaugeCore/EffortUsageScanner.swift @@ -44,11 +44,7 @@ public enum EffortUsageScanner { } static func hash(provider: UsageProvider, identifier: String) -> String { - let hex = Array("0123456789abcdef".utf8) - return String( - decoding: SHA256.hash(data: Data("\(provider.rawValue):\(identifier)".utf8)).flatMap { - [hex[Int($0 >> 4)], hex[Int($0 & 15)]] - }, as: UTF8.self) + Hex.string(SHA256.hash(data: Data("\(provider.rawValue):\(identifier)".utf8))) } static func codexDirectories(root: URL, cutoff: Date, now: Date) -> [URL] { diff --git a/Tests/TokenGaugeAppTests/ClaudeRecoveryLiveTests.swift b/Tests/TokenGaugeAppTests/ClaudeRecoveryLiveTests.swift index d815a05..dee3fee 100644 --- a/Tests/TokenGaugeAppTests/ClaudeRecoveryLiveTests.swift +++ b/Tests/TokenGaugeAppTests/ClaudeRecoveryLiveTests.swift @@ -5,7 +5,7 @@ import XCTest @testable import TokenGaugeApp final class ClaudeRecoveryLiveTests: XCTestCase { - func testOptInRealCLIStartupAndUsageRetry() throws { + func testOptInRealCLIStartupAndUsageRetry() async throws { guard ProcessInfo.processInfo.environment["TOKENGAUGE_LIVE_RECOVERY_QA"] == "1" else { throw XCTSkip("Requires explicit local Claude recovery QA authorization") } @@ -13,11 +13,11 @@ final class ClaudeRecoveryLiveTests: XCTestCase { let executable = try XCTUnwrap(ClaudeSessionRecovery.executable(homeDirectory: home)) let started = ProcessInfo.processInfo.systemUptime var reads = 0 - let result = ClaudeUsageClient.readAccount( + let result = await ClaudeUsageClient.readAccount( fetch: { reads += 1 if reads == 1 { throw ClaudeAccountUsageError.credentialExpired } - return try ClaudeAccountUsageClient(homeDirectory: home).fetch( + return try await ClaudeAccountUsageClient(homeDirectory: home).fetch( identity: ClaudeAccountIdentityReader.current(homeDirectory: home)) }, recover: { diff --git a/Tests/TokenGaugeAppTests/ClaudeRecoveryTests.swift b/Tests/TokenGaugeAppTests/ClaudeRecoveryTests.swift index 139bfb3..1574d08 100644 --- a/Tests/TokenGaugeAppTests/ClaudeRecoveryTests.swift +++ b/Tests/TokenGaugeAppTests/ClaudeRecoveryTests.swift @@ -5,7 +5,7 @@ import XCTest @testable import TokenGaugeApp final class ClaudeRecoveryTests: XCTestCase { - func testExpiredCredentialRecoversThenReadsEveryRealWindowAgain() throws { + func testExpiredCredentialRecoversThenReadsEveryRealWindowAgain() async throws { var reads = 0 var recoveries = 0 let expected = ClaudeAccountSnapshot( @@ -13,7 +13,7 @@ final class ClaudeRecoveryTests: XCTestCase { windows: ["five_hour", "seven_day", "seven_day_fable"].map { QuotaWindow(id: $0, usedPercentage: 88, resetsAt: nil, durationMinutes: nil, displayName: nil) }) - let result = ClaudeUsageClient.readAccount( + let result = await ClaudeUsageClient.readAccount( fetch: { reads += 1 if reads == 1 { throw ClaudeAccountUsageError.credentialExpired } @@ -27,12 +27,12 @@ final class ClaudeRecoveryTests: XCTestCase { XCTAssertEqual(recoveries, 1) } - func testMissingRevokedDeniedAndNetworkFailuresDoNotStartClaude() { + func testMissingRevokedDeniedAndNetworkFailuresDoNotStartClaude() async { for error in [ ClaudeAccountUsageError.authenticationRequired, .accessDenied, .unavailable, ] { var recoveries = 0 - let result = ClaudeUsageClient.readAccount( + let result = await ClaudeUsageClient.readAccount( fetch: { throw error }, recover: { recoveries += 1; return true @@ -42,9 +42,9 @@ final class ClaudeRecoveryTests: XCTestCase { } } - func testDeclinedOrFailedRecoveryDoesNotRetryAndRetainsExpiryState() { + func testDeclinedOrFailedRecoveryDoesNotRetryAndRetainsExpiryState() async { var reads = 0 - let result = ClaudeUsageClient.readAccount( + let result = await ClaudeUsageClient.readAccount( fetch: { reads += 1; throw ClaudeAccountUsageError.credentialExpired }, recover: { false }) @@ -54,10 +54,10 @@ final class ClaudeRecoveryTests: XCTestCase { XCTAssertEqual(reads, 1) } - func testStartupSuccessCannotMaskARejectedUsageRequestOrLoop() { + func testStartupSuccessCannotMaskARejectedUsageRequestOrLoop() async { var reads = 0 var recoveries = 0 - let result = ClaudeUsageClient.readAccount( + let result = await ClaudeUsageClient.readAccount( fetch: { reads += 1 throw reads == 1 ? ClaudeAccountUsageError.credentialExpired : .authenticationRequired diff --git a/Tests/TokenGaugeAppTests/ClaudeUsageClientConcurrencyTests.swift b/Tests/TokenGaugeAppTests/ClaudeUsageClientConcurrencyTests.swift new file mode 100644 index 0000000..ff4cb57 --- /dev/null +++ b/Tests/TokenGaugeAppTests/ClaudeUsageClientConcurrencyTests.swift @@ -0,0 +1,43 @@ +import Foundation +import TokenGaugeCore +import XCTest + +@testable import TokenGaugeApp + +final class ClaudeUsageClientConcurrencyTests: XCTestCase { + private let now = Date(timeIntervalSince1970: 2_000_000_000) + + func testHistoryAndAccountFetchOverlap() async throws { + let snapshot = ClaudeAccountSnapshot( + capturedAt: now, + windows: [ + QuotaWindow( + id: "seven_day", usedPercentage: 40, resetsAt: now.addingTimeInterval(86_400), + durationMinutes: 10_080, displayName: nil) + ] + ) + let buckets = [ModelTokenBucket(day: "2026-09-18", hourStart: now, model: "fable", tokens: 120)] + let started = ProcessInfo.processInfo.systemUptime + + let result = await ClaudeUsageClient.fetch( + history: { + try? await Task.sleep(for: .milliseconds(200)) + return buckets + }, + account: { + try? await Task.sleep(for: .milliseconds(200)) + return .success(snapshot) + }, + cached: { nil }, + capture: { nil }, + now: now + ) + let elapsed = ProcessInfo.processInfo.systemUptime - started + + XCTAssertLessThan(elapsed, 0.35) + XCTAssertEqual(result.access, .live) + XCTAssertEqual(result.snapshot.windows.map(\.id), ["seven_day"]) + XCTAssertEqual(result.snapshot.modelBuckets, buckets) + XCTAssertTrue(result.snapshot.activityReadSucceeded) + } +} diff --git a/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift b/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift index e8f4a82..3a46f37 100644 --- a/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift +++ b/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift @@ -77,7 +77,7 @@ final class UsageStoreRefreshTests: XCTestCase { let refresher = UsageRefresher( homeDirectory: FileManager.default.temporaryDirectory, fetchClaude: { _ in - releaseClaude.wait() + try? await BlockingWork.run { releaseClaude.wait() } return ClaudeUsageResult(snapshot: claudeSnapshot, access: .live, lastActivityAt: now) }, fetchCodex: { ProviderViewState(snapshot: codexSnapshot, status: .ready, isRefreshing: false) }) diff --git a/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift b/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift index 1b9396d..d074200 100644 --- a/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift +++ b/Tests/TokenGaugeCoreTests/ClaudeAccountUsageParserTests.swift @@ -34,6 +34,29 @@ final class ClaudeAccountUsageParserTests: XCTestCase { ) } + func testWindowsComeOutInDisplayOrderIncludingNilDurations() throws { + let input = Data( + """ + {"limits": [ + {"kind": "weekly_scoped", "percent": 56, "resets_at": null, + "scope": {"model": {"id": null, "display_name": "Fable"}}}, + {"kind": "weekly_all", "percent": 38, "resets_at": null, "scope": null}, + {"kind": "session", "percent": 13, "resets_at": null, "scope": null} + ]} + """.utf8 + ) + + XCTAssertEqual( + try ClaudeAccountUsageParser.parse(input).map(\.id), ["five_hour", "seven_day", "seven_day_fable"]) + + let unbounded = QuotaWindow( + id: "unbounded", usedPercentage: 1, resetsAt: nil, durationMinutes: nil, displayName: nil) + let windows = try ClaudeAccountUsageParser.parse(input) + [unbounded] + XCTAssertEqual( + windows.sorted(by: QuotaWindow.displayOrder).map(\.id), + ["five_hour", "seven_day", "seven_day_fable", "unbounded"]) + } + func testSkipsScopedLimitsWithoutAModelName() throws { let input = Data( """ From 0d13788192769a9058ad53c15c67427151bba311 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:05:16 -0500 Subject: [PATCH 12/21] perf(history): keep one dashboard model per status item, single usage-days read and formatter-free day keys --- .../App/StatusItemController.swift | 12 +++- .../Services/HistoryDashboardModel.swift | 25 ++++---- .../UsageHistoryStore+Tokens.swift | 13 ++++ .../TokenGaugeCore/UsageHistoryStore.swift | 18 +++++- .../HistoryDashboardTests.swift | 59 +++++++++++++++++++ .../UsageHistoryStoreTests.swift | 24 ++++++++ 6 files changed, 134 insertions(+), 17 deletions(-) diff --git a/Sources/TokenGaugeApp/App/StatusItemController.swift b/Sources/TokenGaugeApp/App/StatusItemController.swift index 3579318..4551813 100644 --- a/Sources/TokenGaugeApp/App/StatusItemController.swift +++ b/Sources/TokenGaugeApp/App/StatusItemController.swift @@ -16,6 +16,7 @@ final class StatusItemController: NSObject { private var popoverSizeObservation: NSKeyValueObservation? private var positioningUpdatePending = false private var positionedGeometry: PopoverGeometry? + private var history: HistoryDashboardModel? private struct PopoverGeometry: Equatable { let sourceWindow: NSRect @@ -97,7 +98,7 @@ final class StatusItemController: NSObject { }, showAbout: { [weak self] in self?.showAbout() - }) + }, history: historyModel()) let controller = NSHostingController(rootView: view) controller.sizingOptions = [.preferredContentSize] popover.contentViewController = controller @@ -106,6 +107,14 @@ final class StatusItemController: NSObject { startDismissMonitors() } + private func historyModel() -> HistoryDashboardModel { + if let history { return history } + let preview = store.historyReadsEnabled ? nil : [store.claude.snapshot, store.codex.snapshot].compactMap { $0 } + let model = HistoryDashboardModel(previewSnapshots: preview, mode: store.historyMode) + history = model + return model + } + private func schedulePopoverPositionUpdate() { guard popover.isShown, !positioningUpdatePending else { return } positioningUpdatePending = true @@ -201,5 +210,6 @@ extension StatusItemController: NSPopoverDelegate { positionedGeometry = nil stopDismissMonitors() popover.contentViewController = nil + history?.popoverDidClose() } } diff --git a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift index a17be19..215a3c4 100644 --- a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift +++ b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift @@ -180,6 +180,11 @@ final class HistoryDashboardModel: ObservableObject { daySelection = nil } + func popoverDidClose() { + daySelection = nil + selectedDayKey = nil + } + func pace(provider: UsageProvider, window: QuotaWindow, capturedAt: Date?) -> QuotaPace? { let key = provider.rawValue + ":" + window.id guard let current = Self.usablePace(paces[key], for: window, capturedAt: capturedAt) @@ -247,6 +252,7 @@ final class HistoryDashboardModel: ObservableObject { result = try await Task.detached(priority: .utility) { let tokens = try UsageHistoryStore.tokenRows(since: first, through: last, at: url) let efforts = try UsageHistoryStore.effortRows(since: first, through: last, at: url) + let usage = try UsageHistoryStore.usageDaysByProvider(at: url) return ReadResult( days: Self.makeDays(interval: interval, tokens: tokens, efforts: efforts), latest: try UsageHistoryStore.recentPaces( @@ -256,9 +262,7 @@ final class HistoryDashboardModel: ObservableObject { for: paceKeys, activeOnly: true, before: now, accountFingerprint: accountFingerprint, at: url), first: try UsageHistoryStore.bounds(at: url).firstDay, - usage: HistoryUsageDays( - claude: try UsageHistoryStore.usageDays(provider: .claude, at: url), - codex: try UsageHistoryStore.usageDays(provider: .codex, at: url)), + usage: HistoryUsageDays(claude: usage[.claude] ?? [], codex: usage[.codex] ?? []), today: today) }.value } @@ -313,16 +317,8 @@ final class HistoryDashboardModel: ObservableObject { } nonisolated static func dayKey(_ date: Date, calendar: Calendar = .current) -> String { - dayFormatter(calendar: calendar).string(from: date) - } - - nonisolated private static func dayFormatter(calendar: Calendar) -> DateFormatter { - let formatter = DateFormatter() - formatter.calendar = calendar - formatter.timeZone = calendar.timeZone - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.dateFormat = "yyyy-MM-dd" - return formatter + let components = calendar.dateComponents([.year, .month, .day], from: date) + return String(format: "%04ld-%02ld-%02ld", components.year ?? 0, components.month ?? 0, components.day ?? 0) } nonisolated static func makeDays( @@ -330,11 +326,10 @@ final class HistoryDashboardModel: ObservableObject { ) -> [HistoryCalendarDay] { let tokenDays = Dictionary(grouping: tokens, by: \.day) let effortDays = Dictionary(grouping: efforts, by: \.day) - let formatter = dayFormatter(calendar: calendar) var date = interval.start var result: [HistoryCalendarDay] = [] while date < interval.end { - let key = formatter.string(from: date) + let key = dayKey(date, calendar: calendar) var totals: [UsageProvider: Int] = [:] for provider in UsageProvider.allCases { let rows = (tokenDays[key] ?? []).filter { $0.provider == provider && $0.tokens >= 0 } diff --git a/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift b/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift index f5e8344..e8a2279 100644 --- a/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift +++ b/Sources/TokenGaugeCore/UsageHistoryStore+Tokens.swift @@ -41,6 +41,19 @@ extension UsageHistoryStore { return days } + static func readUsageDaysByProvider(_ connection: SQLiteConnection) throws -> [UsageProvider: Set] { + let sql = """ + SELECT provider, day FROM daily_totals + WHERE tokens > 0; + """ + var days: [UsageProvider: Set] = [:] + try connection.query(sql, bindings: { _ in }) { statement in + guard let provider = UsageProvider(rawValue: statement.text(0)) else { return } + days[provider, default: []].insert(statement.text(1)) + } + return days + } + static func readBounds(_ connection: SQLiteConnection) throws -> HistoryBounds { var result = HistoryBounds(firstDay: nil, lastDay: nil) let sql = """ diff --git a/Sources/TokenGaugeCore/UsageHistoryStore.swift b/Sources/TokenGaugeCore/UsageHistoryStore.swift index 7448dea..3305ddf 100644 --- a/Sources/TokenGaugeCore/UsageHistoryStore.swift +++ b/Sources/TokenGaugeCore/UsageHistoryStore.swift @@ -124,6 +124,14 @@ public enum UsageHistoryStore { } } + public static func usageDaysByProvider( + at url: URL = UsagePaths.history() + ) throws -> [UsageProvider: Set] { + try read(url) { connection in + try readUsageDaysByProvider(connection) + } + } + public static func quotaRows( provider: UsageProvider? = nil, since: Date? = nil, @@ -185,6 +193,7 @@ extension UsageHistoryStore { struct Registry { var preparations: [String: Int] = [:] var lastEntryWasReadOnly: Bool? + var entries = 0 } private static let registry = OSAllocatedUnfairLock(initialState: Registry()) @@ -201,6 +210,10 @@ extension UsageHistoryStore { registry.withLock { $0.lastEntryWasReadOnly } } + public static var entryCount: Int { + registry.withLock { $0.entries } + } + static func write(_ url: URL, _ body: (SQLiteConnection) throws -> T) throws -> T { let connection = try SQLiteConnection.open(url, readOnly: false) defer { connection.close() } @@ -224,7 +237,10 @@ extension UsageHistoryStore { } private static func recordEntry(readOnly: Bool) { - registry.withLock { $0.lastEntryWasReadOnly = readOnly } + registry.withLock { + $0.lastEntryWasReadOnly = readOnly + $0.entries += 1 + } } private static func isPrepared(_ path: String) -> Bool { diff --git a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift index 8dca442..5174487 100644 --- a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift @@ -298,6 +298,65 @@ final class HistoryDashboardTests: XCTestCase { XCTAssertTrue(day([:]).dominantProviders(for: [.codex, .claude]).isEmpty) } + func testSecondLoadWithTheSameInputsServesTheCacheWithoutReadingTheStore() async throws { + let directory = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) + try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: directory) } + let model = HistoryDashboardModel(historyURL: directory.appending(path: "usage-history.sqlite")) + await model.load(mode: .recent, revision: 1) + XCTAssertFalse(model.loadFailed) + let reads = UsageHistoryStore.entryCount + XCTAssertGreaterThan(reads, 0) + + await model.load(mode: .recent, revision: 1) + XCTAssertFalse(model.loadFailed) + XCTAssertEqual(UsageHistoryStore.entryCount, reads) + + await model.load(mode: .recent, revision: 2) + XCTAssertGreaterThan(UsageHistoryStore.entryCount, reads) + } + + func testClosingThePopoverDropsTheDaySelection() { + let model = HistoryDashboardModel() + model.selectedDayKey = "2026-09-15" + model.pinDayCard("2026-09-17", anchor: anchor(x: 20, bounds: CGRect(x: 0, y: 0, width: 300, height: 200))) + XCTAssertEqual(model.daySelection?.isPinned, true) + + model.popoverDidClose() + XCTAssertNil(model.daySelection) + XCTAssertNil(model.selectedDayKey) + } + + func testDayKeyMatchesTheFormatterAcrossTimeZones() { + for seconds in [-5 * 3600, 13 * 3600] { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = TimeZone(secondsFromGMT: seconds)! + let formatter = DateFormatter() + formatter.calendar = calendar + formatter.timeZone = calendar.timeZone + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.dateFormat = "yyyy-MM-dd" + let probes = [ + DateComponents(year: 2026, month: 1, day: 1, hour: 0), + DateComponents(year: 2026, month: 1, day: 1, hour: 23, minute: 59), + DateComponents(year: 2024, month: 2, day: 29, hour: 12), + DateComponents(year: 2026, month: 3, day: 7, hour: 3), + DateComponents(year: 2026, month: 9, day: 18, hour: 17), + DateComponents(year: 2026, month: 10, day: 31, hour: 23), + DateComponents(year: 2026, month: 12, day: 31, hour: 22, minute: 30), + DateComponents(year: 1999, month: 7, day: 4, hour: 6), + DateComponents(year: 2000, month: 2, day: 28, hour: 1), + DateComponents(year: 2035, month: 11, day: 9, hour: 15), + ] + for components in probes { + let date = calendar.date(from: components)! + XCTAssertEqual( + HistoryDashboardModel.dayKey(date, calendar: calendar), formatter.string(from: date), + "\(components) @ \(seconds)") + } + } + } + func testPreviewStoresDoNotReadOrCollectLiveHistory() { let name = "TokenGauge.history-preview.\(UUID().uuidString)" let defaults = UserDefaults(suiteName: name)! diff --git a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift index 7a36aaa..f50d77a 100644 --- a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift +++ b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift @@ -210,6 +210,30 @@ final class UsageHistoryStoreTests: XCTestCase { XCTAssertEqual(try UsageHistoryStore.usageDays(at: database), ["2026-09-15", "2026-09-17"]) } + func testUsageDaysByProviderReturnsEveryProviderInOneRead() throws { + try UsageHistoryStore.record( + ProviderUsageSnapshot( + provider: .codex, windows: [], + dailyUsage: [ + DailyTokenUsage(day: "2026-09-15", tokens: 120), DailyTokenUsage(day: "2026-09-16", tokens: 0), + DailyTokenUsage(day: "2026-09-17", tokens: 80), + ], + summary: nil, availableResetCredits: nil, creditBalance: nil, + capturedAt: Date(timeIntervalSince1970: 1_787_000_000)), + at: database) + try UsageHistoryStore.record( + claudeSnapshot(buckets: [bucket(day: "2026-09-17", hour: 0, model: "claude-fable-5", tokens: 40)]), + at: database) + + let entries = UsageHistoryStore.entryCount + let days = try UsageHistoryStore.usageDaysByProvider(at: database) + XCTAssertEqual(UsageHistoryStore.entryCount, entries + 1) + XCTAssertEqual(days[.codex], ["2026-09-15", "2026-09-17"]) + XCTAssertEqual(days[.claude], ["2026-09-17"]) + XCTAssertEqual(days[.codex], try UsageHistoryStore.usageDays(provider: .codex, at: database)) + XCTAssertEqual(days[.claude], try UsageHistoryStore.usageDays(provider: .claude, at: database)) + } + func testSchemaIsPreparedOncePerProcessAndPath() throws { try UsageHistoryStore.record(claudeSnapshot(), at: database) try UsageHistoryStore.record(claudeSnapshot(used: 60), at: database) From e621bb1bd5a284c36f994adc5c16e5b0a6fcb753 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:19:35 -0500 Subject: [PATCH 13/21] fix(panel): standard style drops its footer and fits every quota card --- Sources/TokenGaugeApp/Support/Theme.swift | 2 +- Sources/TokenGaugeApp/Views/PopoverView.swift | 70 +++---------------- .../QuotaPanelRenderingTests.swift | 39 +++++++++++ 3 files changed, 49 insertions(+), 62 deletions(-) diff --git a/Sources/TokenGaugeApp/Support/Theme.swift b/Sources/TokenGaugeApp/Support/Theme.swift index 824dd1c..784ded2 100644 --- a/Sources/TokenGaugeApp/Support/Theme.swift +++ b/Sources/TokenGaugeApp/Support/Theme.swift @@ -11,7 +11,7 @@ enum Theme { static let panelWidth: CGFloat = 340 static let maximumPanelHeight: CGFloat = 640 static let unifiedPanelWidth: CGFloat = 560 - static let providerMaxHeight: CGFloat = 182 + static let providerMaxHeight: CGFloat = 270 static let compactProviderMaxHeight: CGFloat = 230 static let ringProviderMaxHeight: CGFloat = 264 static let compactPanelWidth: CGFloat = 320 diff --git a/Sources/TokenGaugeApp/Views/PopoverView.swift b/Sources/TokenGaugeApp/Views/PopoverView.swift index 9bb454f..0005ed6 100644 --- a/Sources/TokenGaugeApp/Views/PopoverView.swift +++ b/Sources/TokenGaugeApp/Views/PopoverView.swift @@ -79,10 +79,6 @@ struct PopoverView: View { HistoryPanelView( model: history, mode: $store.historyMode, providers: store.displayMode.providers, compact: store.panelStyle != .standard) - if store.panelStyle == .standard { - Divider().padding(.top, 1) - footer - } } .padding(.horizontal, Theme.Layout.panelPadding) .padding(.top, 12) @@ -241,18 +237,16 @@ struct PopoverView: View { .accessibilityLabel("settings.panel_style".localized) .accessibilityIdentifier("TokenGauge.panelStyle") - if store.panelStyle != .standard { - Menu { - Button("settings.title".localized, action: showSettings) - Button("about.title".localized, action: showAbout) - Divider() - Button("action.quit".localized) { NSApp.terminate(nil) } - } label: { - Image(systemName: "gearshape").font(.system(size: 12)).foregroundStyle(.secondary) - } - .menuStyle(.borderlessButton).menuIndicator(.hidden).fixedSize() - .accessibilityLabel("settings.title".localized) + Menu { + Button("settings.title".localized, action: showSettings) + Button("about.title".localized, action: showAbout) + Divider() + Button("action.quit".localized) { NSApp.terminate(nil) } + } label: { + Image(systemName: "gearshape").font(.system(size: 12)).foregroundStyle(.secondary) } + .menuStyle(.borderlessButton).menuIndicator(.hidden).fixedSize() + .accessibilityLabel("settings.title".localized) Button { store.refresh(force: true) @@ -274,50 +268,4 @@ struct PopoverView: View { .disabled(store.isRefreshing) } } - - private var footer: some View { - VStack(spacing: 0) { - FooterActionRow(icon: "gearshape", title: "settings.title".localized, action: showSettings) - FooterActionRow(icon: "info.circle", title: "about.title".localized, action: showAbout) - FooterActionRow(icon: "power", title: "action.quit".localized) { - NSApp.terminate(nil) - } - } - } -} - -private struct FooterActionRow: View { - let icon: String - let title: String - let action: () -> Void - - @State private var hovered = false - - var body: some View { - Button(action: action) { - HStack(spacing: 9) { - Image(systemName: icon) - .font(.system(size: 11)) - .frame(width: 15) - Text(title) - .font(.caption) - Spacer(minLength: 0) - if icon != "power" { - Image(systemName: "chevron.right") - .font(.system(size: 9, weight: .medium)) - } - } - .padding(.horizontal, 5) - .frame(height: 24) - .background( - RoundedRectangle(cornerRadius: Theme.Layout.rowRadius, style: .continuous) - .fill(hovered ? Color.primary.opacity(0.07) : Color.clear) - ) - .foregroundStyle(icon == "power" ? Color.red : Color.secondary) - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - .accessibilityIdentifier("TokenGauge.footer.\(icon)") - .onHover { hovered = $0 } - } } diff --git a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift index d84b09b..bd5301a 100644 --- a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift @@ -158,6 +158,45 @@ final class QuotaPanelRenderingTests: XCTestCase { } } + func testStandardCardsFitTheProviderAreaWithoutScrolling() throws { + let available = Theme.Layout.unifiedPanelWidth - Theme.Layout.panelPadding * 2 + let cardWidth = (available - 10) / 2 + try withEachLanguage { language in + let codex = ProviderCard( + provider: .codex, state: codexState(count: 2), showProviderTitle: true, showHourlyPace: true) + let claude = ProviderCard( + provider: .claude, state: state(count: 3), showProviderTitle: true, showHourlyPace: true) + let unified = HStack(alignment: .top, spacing: 10) { + codex.frame(width: cardWidth) + claude.frame(width: cardWidth) + } + .fixedSize(horizontal: false, vertical: true) + XCTAssertLessThanOrEqual( + fittingSize(unified).height, Theme.Layout.providerMaxHeight, language.rawValue) + let single = ProviderCard(provider: .claude, state: state(count: 3), showHourlyPace: true) + XCTAssertLessThanOrEqual( + fittingSize(single.frame(width: Theme.Layout.panelWidth - Theme.Layout.panelPadding * 2)).height, + Theme.Layout.providerMaxHeight, language.rawValue) + } + } + + func testStandardPanelWithLargestProviderCardsStaysWithinTheMaximumHeight() throws { + try withDefaults { defaults in + let store = Fixture.store( + defaults: defaults, + snapshots: [codexState(count: 2).snapshot, state(count: 3).snapshot].compactMap { $0 }) + store.panelStyle = .standard + try withEachLanguage { language in + for mode in UsageDisplayMode.allCases { + store.displayMode = mode + let size = fittingSize(PopoverView(store: store, showSettings: {}, showAbout: {})) + XCTAssertLessThanOrEqual( + size.height, Theme.Layout.maximumPanelHeight, "\(language.rawValue) / \(mode.rawValue)") + } + } + } + } + private func bluePixelCount(_ bitmap: NSBitmapImageRep) -> Int { var count = 0 for y in 0.. Date: Fri, 18 Sep 2026 01:26:59 -0500 Subject: [PATCH 14/21] fix(services): guard deferred install, keep refresh busy through archive, decode identity outside the lock --- .../TokenGaugeApp/Services/BlockingWork.swift | 3 +- .../Services/UpdateManager.swift | 29 +++++++++-- .../TokenGaugeApp/Services/UsageStore.swift | 30 +++++++---- .../ClaudeAccountIdentity.swift | 23 +++++---- .../UpdateManagerTests.swift | 50 +++++++++++++++++++ .../UsageStoreRefreshTests.swift | 35 +++++++++++++ .../ClaudeAccountIdentityTests.swift | 21 ++++++++ 7 files changed, 163 insertions(+), 28 deletions(-) diff --git a/Sources/TokenGaugeApp/Services/BlockingWork.swift b/Sources/TokenGaugeApp/Services/BlockingWork.swift index cf8b6ee..ccb7985 100644 --- a/Sources/TokenGaugeApp/Services/BlockingWork.swift +++ b/Sources/TokenGaugeApp/Services/BlockingWork.swift @@ -8,11 +8,10 @@ enum BlockingWork { label: "com.stevenacz.TokenGauge.blocking-work", qos: .utility, attributes: .concurrent) static func run( - qos: DispatchQoS = .unspecified, _ work: @escaping @Sendable () throws -> Value ) async throws -> Value { try await withCheckedThrowingContinuation { continuation in - queue.async(group: nil, qos: qos, flags: []) { + queue.async { do { continuation.resume(returning: try work()) } catch { diff --git a/Sources/TokenGaugeApp/Services/UpdateManager.swift b/Sources/TokenGaugeApp/Services/UpdateManager.swift index fe3a2e8..021ad35 100644 --- a/Sources/TokenGaugeApp/Services/UpdateManager.swift +++ b/Sources/TokenGaugeApp/Services/UpdateManager.swift @@ -4,6 +4,14 @@ import Foundation import Sparkle import os +@MainActor +protocol UpdaterSession: AnyObject { + var sessionInProgress: Bool { get } + func checkForUpdates() +} + +extension SPUUpdater: UpdaterSession {} + @MainActor final class UpdateManager: ObservableObject { @@ -64,6 +72,7 @@ final class UpdateManager: ObservableObject { private let log = Logger(subsystem: "com.stevenacz.TokenGauge", category: "updates") private var updater: SPUUpdater? + private var session: (any UpdaterSession)? private var driver: Driver? private var updaterDelegate: UpdaterDelegate? @@ -157,10 +166,15 @@ final class UpdateManager: ObservableObject { self.driver = driver self.updaterDelegate = updaterDelegate self.updater = updater + session = updater if deferredVersion != nil { updater.checkForUpdatesInBackground() } } + func setSession(_ session: any UpdaterSession) { + self.session = session + } + func setAutoCheckEnabled(_ enabled: Bool) { autoCheckEnabled = enabled defaults.set(enabled, forKey: Self.autoCheckDefaultsKey) @@ -206,24 +220,29 @@ final class UpdateManager: ObservableObject { func resumeDeferredInstall() { guard case .readyToInstall(let version, true) = phase else { return } + guard let session, session.sessionInProgress == false else { return } resumeInstallRequested = true installRequested = true phase = .installing(version: version) - guard let updater, updater.sessionInProgress == false else { return } - updater.checkForUpdates() + session.checkForUpdates() } func checkForUpdatesManually() { guard available else { return } - guard let updater else { + guard let session else { handleManualCheckStarted() finishManualCheck(status: .failed) phase = idleOrPendingPhase return } - guard updater.sessionInProgress == false else { return } + guard session.sessionInProgress == false else { + manualCheckResetTask?.cancel() + manualCheckPending = true + finishManualCheck(status: .failed) + return + } handleManualCheckStarted() - updater.checkForUpdates() + session.checkForUpdates() } func handleManualCheckStarted() { diff --git a/Sources/TokenGaugeApp/Services/UsageStore.swift b/Sources/TokenGaugeApp/Services/UsageStore.swift index 82b6ef5..853d66c 100644 --- a/Sources/TokenGaugeApp/Services/UsageStore.swift +++ b/Sources/TokenGaugeApp/Services/UsageStore.swift @@ -81,9 +81,21 @@ final class UsageStore: ObservableObject { @Published private(set) var claudeCancelledAt: Date? @Published private(set) var codexCancelledAt: Date? + typealias ArchiveWork = @Sendable (ClaudeUsageResult?, ProviderViewState, URL) async -> Void + + static let liveArchiveWork: ArchiveWork = { claudeResult, codexState, homeDirectory in + try? await BlockingWork.run { + archive( + claudeResult: claudeResult, codexState: codexState, + accountFingerprint: claudeResult?.accountFingerprint) + try? EffortHistoryClient.collect(homeDirectory: homeDirectory) + } + } + let recoveryAuthorization: ClaudeRecoveryAuthorization private let preferences: AppPreferences private let refresher: UsageRefresher + private let archiveWork: ArchiveWork private lazy var scheduler = RefreshScheduler { [weak self] in self?.refresh(force: true) } convenience init( @@ -102,10 +114,12 @@ final class UsageStore: ObservableObject { refresher: UsageRefresher, defaults: UserDefaults = .standard, initialSnapshots: [ProviderUsageSnapshot] = [], - historyReadsEnabled: Bool? = nil + historyReadsEnabled: Bool? = nil, + archiveWork: @escaping ArchiveWork = UsageStore.liveArchiveWork ) { let preferences = AppPreferences(defaults: defaults) self.refresher = refresher + self.archiveWork = archiveWork self.preferences = preferences self.historyReadsEnabled = historyReadsEnabled ?? (defaults === UserDefaults.standard && initialSnapshots.isEmpty) @@ -171,18 +185,12 @@ final class UsageStore: ObservableObject { receive(outcome) } lastRefresh = Date() - isRefreshing = false scheduleResetRefresh() - guard historyReadsEnabled else { return } - let archived = (claude: claudeResult, codex: codexState) - let homeDirectory = refresher.homeDirectory - try? await BlockingWork.run(qos: .background) { - Self.archive( - claudeResult: archived.claude, codexState: archived.codex, - accountFingerprint: archived.claude?.accountFingerprint) - try? EffortHistoryClient.collect(homeDirectory: homeDirectory) + if historyReadsEnabled { + await archiveWork(claudeResult, codexState, refresher.homeDirectory) + historyRevision &+= 1 } - historyRevision &+= 1 + isRefreshing = false } } diff --git a/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift b/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift index 9aa05d8..ff4075e 100644 --- a/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift +++ b/Sources/TokenGaugeCore/ClaudeAccountIdentity.swift @@ -77,18 +77,21 @@ public enum ClaudeAccountIdentityReader { } public static func read(at url: URL) -> ClaudeAccountIdentity? { - cache.withLock { entry in - let previous = entry?.url == url ? entry?.identity : nil - guard let attributes = try? FileManager.default.attributesOfItem(atPath: url.path) else { - return previous - } - let modifiedAt = attributes[.modificationDate] as? Date - let size = attributes[.size] as? Int ?? 0 - if let entry, entry.url == url, entry.modifiedAt == modifiedAt, entry.size == size { + let previous = cache.withLock { entry in entry?.url == url ? entry : nil } + guard let attributes = try? FileManager.default.attributesOfItem(atPath: url.path) else { + return previous?.identity + } + let modifiedAt = attributes[.modificationDate] as? Date + let size = attributes[.size] as? Int ?? 0 + if let previous, previous.modifiedAt == modifiedAt, previous.size == size { + return previous.identity + } + guard let data = try? Data(contentsOf: url) else { return previous?.identity } + let identity = ClaudeAccountIdentity(data: data) + return cache.withLock { entry in + if let entry, entry.url == url, let stored = entry.modifiedAt, let read = modifiedAt, stored > read { return entry.identity } - guard let data = try? Data(contentsOf: url) else { return previous } - let identity = ClaudeAccountIdentity(data: data) entry = Entry(url: url, modifiedAt: modifiedAt, size: size, identity: identity) return identity } diff --git a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift index e16d830..1edddf9 100644 --- a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift @@ -4,6 +4,20 @@ import XCTest @testable import TokenGaugeApp +@MainActor +private final class FakeUpdaterSession: UpdaterSession { + var sessionInProgress: Bool + private(set) var checks = 0 + + init(sessionInProgress: Bool) { + self.sessionInProgress = sessionInProgress + } + + func checkForUpdates() { + checks += 1 + } +} + @MainActor final class UpdateManagerTests: XCTestCase { @@ -138,6 +152,7 @@ final class UpdateManagerTests: XCTestCase { manager.handleDismissInstallation() XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: true)) + manager.setSession(FakeUpdaterSession(sessionInProgress: false)) manager.resumeDeferredInstall() XCTAssertEqual(manager.phase, .installing(version: "9.9.9")) XCTAssertEqual(found(manager, stage: .downloaded), .install) @@ -336,6 +351,7 @@ final class UpdateManagerTests: XCTestCase { manager.deferReadyUpdate() XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "9.9.9") + manager.setSession(FakeUpdaterSession(sessionInProgress: false)) manager.resumeDeferredInstall() XCTAssertEqual(found(manager, stage: .downloaded), .install) XCTAssertNil(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey)) @@ -391,6 +407,40 @@ final class UpdateManagerTests: XCTestCase { XCTAssertEqual(manager.phase, .idle) } + func testResumeDeferredInstallIsIgnoredWhileASessionIsInProgress() { + let defaults = makeDefaults() + let manager = makeManager(defaults: defaults) + _ = found(manager) + manager.handleReadyToInstall { _ in } + manager.deferReadyUpdate() + let session = FakeUpdaterSession(sessionInProgress: true) + manager.setSession(session) + + manager.resumeDeferredInstall() + + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: true)) + XCTAssertEqual(session.checks, 0) + XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "9.9.9") + XCTAssertEqual(found(manager, stage: .downloaded), .dismiss) + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: true)) + } + + func testManualCheckReportsFailureWhileASessionIsInProgress() { + let defaults = makeDefaults() + defaults.set("https://updates.example.com/appcast.xml", forKey: UpdateManager.feedOverrideDefaultsKey) + let manager = makeManager(defaults: defaults) + _ = found(manager) + manager.handleReadyToInstall { _ in } + let session = FakeUpdaterSession(sessionInProgress: true) + manager.setSession(session) + + manager.checkForUpdatesManually() + + XCTAssertEqual(manager.manualCheckStatus, .failed) + XCTAssertEqual(manager.phase, .readyToInstall(version: "9.9.9", deferred: false)) + XCTAssertEqual(session.checks, 0) + } + func testManualCheckNotFoundReportsUpToDate() { let manager = makeManager() manager.handleManualCheckStarted() diff --git a/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift b/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift index 3a46f37..7dd9fb1 100644 --- a/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift +++ b/Tests/TokenGaugeAppTests/UsageStoreRefreshTests.swift @@ -116,6 +116,41 @@ final class UsageStoreRefreshTests: XCTestCase { } } + func testRefreshStaysBusyUntilTheArchiveBlockFinishes() async throws { + try await withDefaults { defaults in + let now = Date() + let claudeSnapshot = snapshot(.claude, now: now) + let fetches = OSAllocatedUnfairLock(initialState: 0) + let releaseArchive = DispatchSemaphore(value: 0) + let archiveStarted = expectation(description: "archive started") + let refresher = UsageRefresher( + homeDirectory: FileManager.default.temporaryDirectory, + fetchClaude: { _ in + fetches.withLock { $0 += 1 } + return ClaudeUsageResult(snapshot: claudeSnapshot, access: .live, lastActivityAt: now) + }, + fetchCodex: { ProviderViewState(snapshot: nil, status: .unavailable, isRefreshing: false) }) + let store = UsageStore( + refresher: refresher, defaults: defaults, historyReadsEnabled: true, + archiveWork: { _, _, _ in + archiveStarted.fulfill() + try? await BlockingWork.run { releaseArchive.wait() } + }) + + store.refresh(force: true) + await fulfillment(of: [archiveStarted], timeout: 2) + + XCTAssertTrue(store.isRefreshing) + store.refresh(force: true) + XCTAssertEqual(fetches.withLock { $0 }, 1) + + releaseArchive.signal() + try await waitUntilIdle(store) + XCTAssertEqual(fetches.withLock { $0 }, 1) + XCTAssertEqual(store.historyRevision, 1) + } + } + func testDayKeyMatchesTheLegacyFormatterAndFollowsTheCalendarTimeZone() { let utc = calendar("UTC") let tokyo = calendar("Asia/Tokyo") diff --git a/Tests/TokenGaugeCoreTests/ClaudeAccountIdentityTests.swift b/Tests/TokenGaugeCoreTests/ClaudeAccountIdentityTests.swift index 9165419..855aeab 100644 --- a/Tests/TokenGaugeCoreTests/ClaudeAccountIdentityTests.swift +++ b/Tests/TokenGaugeCoreTests/ClaudeAccountIdentityTests.swift @@ -65,6 +65,27 @@ final class ClaudeAccountIdentityTests: XCTestCase { [.modificationDate: stamp.addingTimeInterval(60)], ofItemAtPath: file.path) XCTAssertEqual(ClaudeAccountIdentityReader.current(homeDirectory: home)?.accountUuid, "uuid-b") } + func testCacheIsReusedForAnUnchangedFileAndRefreshedWhenTheSizeChanges() throws { + ClaudeAccountIdentityReader.invalidate() + let home = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) + try FileManager.default.createDirectory(at: home, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: home) } + let file = UsagePaths.claudeConfig(homeDirectory: home) + let stamp = Date(timeIntervalSince1970: 1_756_500_000) + try Data(#"{"oauthAccount":{"accountUuid":"uuid-a"}}"#.utf8).write(to: file) + try FileManager.default.setAttributes([.modificationDate: stamp], ofItemAtPath: file.path) + + XCTAssertEqual(ClaudeAccountIdentityReader.read(at: file)?.accountUuid, "uuid-a") + + try Data(#"{"oauthAccount":{"accountUuid":"uuid-c"}}"#.utf8).write(to: file) + try FileManager.default.setAttributes([.modificationDate: stamp], ofItemAtPath: file.path) + XCTAssertEqual(ClaudeAccountIdentityReader.read(at: file)?.accountUuid, "uuid-a") + + try Data(#"{"oauthAccount":{"accountUuid":"uuid-c","displayName":"Three"}}"#.utf8).write(to: file) + try FileManager.default.setAttributes([.modificationDate: stamp], ofItemAtPath: file.path) + XCTAssertEqual(ClaudeAccountIdentityReader.read(at: file)?.displayName, "Three") + } + func testTransientReadFailureKeepsTheLastIdentityButLogoutClearsIt() throws { ClaudeAccountIdentityReader.invalidate() let home = FileManager.default.temporaryDirectory.appending(path: UUID().uuidString) From 18d8fc43c780e87a58ec59cd6687eed01cdaf086 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:30:00 -0500 Subject: [PATCH 15/21] fix(core): close read handles on schema errors, anchor scan resume and checkpoint state per root --- .../Services/ClaudeUsageClient.swift | 2 +- Sources/TokenGaugeCore/JSONLReader.swift | 12 ++ Sources/TokenGaugeCore/SQLiteConnection.swift | 2 +- Sources/TokenGaugeCore/ScanState.swift | 36 ++++-- .../TokenGaugeCore/UsageHistoryStore.swift | 3 +- .../TranscriptScannerTests.swift | 122 ++++++++++++++++++ .../UsageHistoryStoreTests.swift | 26 ++++ 7 files changed, 187 insertions(+), 16 deletions(-) diff --git a/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift b/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift index 2b93952..6ff99f0 100644 --- a/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift +++ b/Sources/TokenGaugeApp/Services/ClaudeUsageClient.swift @@ -209,7 +209,7 @@ struct ClaudeUsageClient: Sendable { static func historyBuckets( executable: URL, arguments: [String] = ["--collect"], - timeout: TimeInterval = 20, + timeout: TimeInterval = 45, workingDirectory: URL ) throws -> [ModelTokenBucket] { let result: ProcessResult diff --git a/Sources/TokenGaugeCore/JSONLReader.swift b/Sources/TokenGaugeCore/JSONLReader.swift index a9f1a67..8cac085 100644 --- a/Sources/TokenGaugeCore/JSONLReader.swift +++ b/Sources/TokenGaugeCore/JSONLReader.swift @@ -1,7 +1,9 @@ +import CryptoKit import Foundation enum JSONLReader { static let maximumLineBytes = 1_048_576 + static let anchorBytes = 4_096 struct Progress { let bytesRead: Int @@ -12,6 +14,16 @@ enum JSONLReader { case offsetNotAtLineBoundary } + static func anchor(_ url: URL, endingAt offset: Int) throws -> String? { + guard offset > 0 else { return nil } + let handle = try FileHandle(forReadingFrom: url) + defer { try? handle.close() } + let length = min(offset, anchorBytes) + try handle.seek(toOffset: UInt64(offset - length)) + guard let data = try handle.read(upToCount: length), data.count == length else { return nil } + return Hex.string(SHA256.hash(data: data)) + } + @discardableResult static func read(_ url: URL, from offset: Int = 0, lineHandler: (Data) -> Void) throws -> Progress { let handle = try FileHandle(forReadingFrom: url) diff --git a/Sources/TokenGaugeCore/SQLiteConnection.swift b/Sources/TokenGaugeCore/SQLiteConnection.swift index e91e459..d63d7d2 100644 --- a/Sources/TokenGaugeCore/SQLiteConnection.swift +++ b/Sources/TokenGaugeCore/SQLiteConnection.swift @@ -112,7 +112,7 @@ final class SQLiteConnection { } func close() { - sqlite3_close(handle) + sqlite3_close_v2(handle) } func exec(_ sql: String) throws { diff --git a/Sources/TokenGaugeCore/ScanState.swift b/Sources/TokenGaugeCore/ScanState.swift index 06cc261..3c59afd 100644 --- a/Sources/TokenGaugeCore/ScanState.swift +++ b/Sources/TokenGaugeCore/ScanState.swift @@ -51,7 +51,8 @@ public enum TranscriptScanner { guard let readStart = [historyStart, effortStart].compactMap({ $0?.timeIntervalSince1970 }).min() else { return Result(buckets: [], effortRecords: [], bytesRead: 0) } - let previous = stateURL.flatMap { ScanState.load(from: $0, windowStart: readStart) } + let loaded = stateURL.flatMap { ScanState.load(from: $0, windowStart: readStart) } + let previous = loaded?.state var state = ScanState(version: ScanState.currentVersion, windowStart: readStart, files: [:]) var recentCodexDirectories: Set = [] var roots: [(provider: UsageProvider, url: URL, wanted: (URL, TimeInterval) -> Bool)] = [] @@ -75,6 +76,7 @@ public enum TranscriptScanner { let parser = TranscriptLineParser() var bytesRead = 0 + var written = loaded?.encoded for root in roots { for (file, attributes) in candidateFiles(root: root.url, wanted: root.wanted) { let key = file.path @@ -84,6 +86,7 @@ public enum TranscriptScanner { bytesRead += scanned.bytesRead state.files[key] = scanned.file } + if let stateURL { persist(state, to: stateURL, encoded: &written) } } let historyCutoff = historyStart?.timeIntervalSince1970 @@ -107,9 +110,7 @@ public enum TranscriptScanner { } } - if let stateURL { - try? SecureMetricStore.write(state, to: stateURL) - } + if let stateURL { persist(state, to: stateURL, encoded: &written) } return Result( buckets: historyStart.map { ClaudeHistoryScanner.buckets(historyEntries.values, start: $0, now: now, calendar: calendar) @@ -120,8 +121,14 @@ public enum TranscriptScanner { bytesRead: bytesRead) } + private static func persist(_ state: ScanState, to url: URL, encoded: inout Data?) { + guard let data = try? JSONEncoder.tokenGauge.encode(state), data != encoded else { return } + try? SecureMetricStore.write(state, to: url) + encoded = data + } + private static func dayDirectory(_ url: URL) -> String { - url.pathComponents.suffix(3).joined(separator: "/") + url.standardizedFileURL.path } static func dayString(_ date: Date, calendar: Calendar) -> String { @@ -174,7 +181,9 @@ public enum TranscriptScanner { var entries: [String: ScanEntry] = [:] var context: CodexTurnContext? var offset = 0 - if let reusable, attributes.size > reusable.size, attributes.modified >= reusable.modified { + if let reusable, attributes.size > reusable.size, attributes.modified >= reusable.modified, + ((try? JSONLReader.anchor(url, endingAt: reusable.offset)) ?? nil) == reusable.anchor + { entries = Dictionary(reusable.entries.map { ($0.id, $0) }, uniquingKeysWith: { first, _ in first }) context = reusable.context offset = reusable.offset @@ -212,7 +221,8 @@ public enum TranscriptScanner { } let file = ScanFile( provider: provider, size: attributes.size, modified: attributes.modified, created: attributes.created, - offset: progress.committedOffset, context: context, entries: kept) + offset: progress.committedOffset, anchor: try JSONLReader.anchor(url, endingAt: progress.committedOffset), + context: context, entries: kept) return (file, progress.bytesRead) } } @@ -238,17 +248,18 @@ struct TranscriptLineParser { } struct ScanState: Codable { - static let currentVersion = 1 + static let currentVersion = 2 var version: Int var windowStart: TimeInterval var files: [String: ScanFile] - static func load(from url: URL, windowStart: TimeInterval) -> ScanState? { - guard let state = try? SecureMetricStore.read(ScanState.self, from: url), state.version == currentVersion, - state.windowStart <= windowStart + static func load(from url: URL, windowStart: TimeInterval) -> (state: ScanState, encoded: Data)? { + guard let encoded = try? Data(contentsOf: url), + let state = try? JSONDecoder.tokenGauge.decode(ScanState.self, from: encoded), + state.version == currentVersion, state.windowStart <= windowStart else { return nil } - return state + return (state, encoded) } } @@ -258,6 +269,7 @@ struct ScanFile: Codable { var modified: TimeInterval var created: TimeInterval var offset: Int + var anchor: String? var context: CodexTurnContext? var entries: [ScanEntry] } diff --git a/Sources/TokenGaugeCore/UsageHistoryStore.swift b/Sources/TokenGaugeCore/UsageHistoryStore.swift index 3305ddf..ae3f6d0 100644 --- a/Sources/TokenGaugeCore/UsageHistoryStore.swift +++ b/Sources/TokenGaugeCore/UsageHistoryStore.swift @@ -227,12 +227,11 @@ extension UsageHistoryStore { return try write(url, body) } let connection = try SQLiteConnection.open(url, readOnly: true) + defer { connection.close() } recordEntry(readOnly: connection.isReadOnly) if try schemaVersion(connection) < Schema.version { - connection.close() return try write(url, body) } - defer { connection.close() } return try body(connection) } diff --git a/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift b/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift index d04d394..f2fa15c 100644 --- a/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift +++ b/Tests/TokenGaugeCoreTests/TranscriptScannerTests.swift @@ -158,6 +158,112 @@ final class TranscriptScannerTests: XCTestCase { } } + func testInPlaceRewriteAtALineBoundaryFallsBackToFullRescan() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let file = home.appending(path: ".claude/projects/project/a.jsonl") + try write( + file, + [ + claude("m1", time: "12:00:00", output: 3), claude("m2", time: "12:05:00", output: 5), + claude("m3", time: "12:10:00", output: 7), + ]) + let original = try size(file) + XCTAssertEqual(try scan(home, state: state).bytesRead, original) + + let head = claude("n1", time: "13:00:00", output: 4) + let padding = original - Data((head + "\n").utf8).count + XCTAssertGreaterThan(padding, 0) + let boundary = pad(head, by: padding) + XCTAssertEqual(Data((boundary + "\n").utf8).count, original) + try rewrite( + file, + [ + boundary, claude("n2", time: "13:05:00", output: 6), claude("n3", time: "13:10:00", output: 8), + claude("n4", time: "13:15:00", output: 2), + ]) + XCTAssertGreaterThan(try size(file), original) + + let rewritten = try scan(home, state: state) + XCTAssertEqual(rewritten.bytesRead, try size(file)) + XCTAssertEqual(rewritten.buckets, try fullBuckets(home)) + XCTAssertEqual(rewritten.effortRecords, try fullRecords(home)) + XCTAssertEqual(rewritten.buckets.map(\.tokens), [260]) + } + } + + func testOlderStateVersionForcesAFullRescan() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let file = home.appending(path: ".claude/projects/project/a.jsonl") + try write(file, [claude("m1", time: "12:00:00", output: 3)]) + let total = try size(file) + XCTAssertEqual(try scan(home, state: state).bytesRead, total) + XCTAssertEqual(try scan(home, state: state).bytesRead, 0) + + var stored = try XCTUnwrap( + JSONSerialization.jsonObject(with: try Data(contentsOf: state)) as? [String: Any]) + XCTAssertEqual(stored["version"] as? Int, 2) + stored["version"] = 1 + try JSONSerialization.data(withJSONObject: stored).write(to: state) + XCTAssertEqual(try scan(home, state: state).bytesRead, total) + } + } + + func testUnchangedScanDoesNotRewriteTheStateFile() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let file = home.appending(path: ".claude/projects/project/a.jsonl") + try write(file, [claude("m1", time: "12:00:00", output: 3)]) + XCTAssertGreaterThan(try scan(home, state: state).bytesRead, 0) + + let marker = Date(timeIntervalSince1970: 1_000_000) + try setModified(state, marker) + XCTAssertEqual(try scan(home, state: state).bytesRead, 0) + XCTAssertEqual(try modified(state), marker) + + try append(file, [claude("m2", time: "12:05:00", output: 5)]) + XCTAssertGreaterThan(try scan(home, state: state).bytesRead, 0) + XCTAssertGreaterThan(try modified(state), marker) + } + } + + func testNestedBackupDayDirectoryIsIgnored() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let backup = home.appending(path: ".codex/sessions/backup/2026/09/12/a.jsonl") + try write(backup, [codex("r-backup", time: "12:30:00", tokens: 40)]) + try setModified(backup, Date(timeIntervalSince1970: 0)) + + let scanned = try scan(home, state: state) + XCTAssertEqual(scanned.bytesRead, 0) + XCTAssertEqual(scanned.effortRecords, []) + XCTAssertEqual(scanned.effortRecords, try fullRecords(home)) + } + } + + func testInterruptedScanKeepsTheFinishedRootPersisted() throws { + try withHome { home in + let state = home.appending(path: "support/scan-state.json") + let claudeFile = home.appending(path: ".claude/projects/project/a.jsonl") + let codexFile = home.appending(path: ".codex/sessions/2026/09/12/a.jsonl") + try write(claudeFile, [claude("m1", time: "12:00:00", output: 3)]) + try write(codexFile, [codex("r1", time: "12:30:00", tokens: 40)]) + try FileManager.default.setAttributes([.posixPermissions: 0], ofItemAtPath: codexFile.path) + + XCTAssertThrowsError(try scan(home, state: state)) + let stored = try XCTUnwrap( + JSONSerialization.jsonObject(with: try Data(contentsOf: state)) as? [String: Any]) + let files = try XCTUnwrap(stored["files"] as? [String: Any]) + XCTAssertEqual(files.keys.map { URL(filePath: $0).standardizedFileURL.path }, [claudeFile.path]) + + try FileManager.default.setAttributes([.posixPermissions: 0o600], ofItemAtPath: codexFile.path) + let resumed = try scan(home, state: state) + XCTAssertEqual(resumed.bytesRead, try size(codexFile)) + XCTAssertEqual(resumed.effortRecords.map(\.tokens), [63, 40]) + } + } + func testCorruptOrRegressedStateFallsBackToFullScan() throws { try withHome { home in let state = home.appending(path: "support/scan-state.json") @@ -221,6 +327,22 @@ final class TranscriptScannerTests: XCTestCase { try XCTUnwrap(FileManager.default.attributesOfItem(atPath: file.path)[.size] as? Int) } + private func rewrite(_ file: URL, _ lines: [String]) throws { + let handle = try FileHandle(forWritingTo: file) + defer { try? handle.close() } + try handle.truncate(atOffset: 0) + try handle.write(contentsOf: Data((lines.joined(separator: "\n") + "\n").utf8)) + } + + private func pad(_ line: String, by count: Int) -> String { + line.replacingOccurrences( + of: "synthetic ignored content", with: "synthetic ignored content" + String(repeating: "x", count: count)) + } + + private func modified(_ file: URL) throws -> Date { + try XCTUnwrap(FileManager.default.attributesOfItem(atPath: file.path)[.modificationDate] as? Date) + } + private func setModified(_ file: URL, _ date: Date) throws { try FileManager.default.setAttributes([.modificationDate: date], ofItemAtPath: file.path) } diff --git a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift index f50d77a..8bdd4d1 100644 --- a/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift +++ b/Tests/TokenGaugeCoreTests/UsageHistoryStoreTests.swift @@ -1,3 +1,4 @@ +import Darwin import Foundation import SQLite3 import XCTest @@ -265,6 +266,31 @@ final class UsageHistoryStoreTests: XCTestCase { XCTAssertEqual(UsageHistoryStore.lastEntryWasReadOnly, false) } + func testThrowingSchemaCheckClosesTheReadOnlyHandle() throws { + try UsageHistoryStore.record(claudeSnapshot(), at: database) + _ = try UsageHistoryStore.quotaRows(at: database) + + try Data(repeating: 0x5A, count: 8_192).write(to: database) + let descriptors = openDescriptors(for: database.path) + for _ in 0..<5 { + XCTAssertThrowsError(try UsageHistoryStore.quotaRows(at: database)) + } + XCTAssertEqual(openDescriptors(for: database.path), descriptors) + } + + private func openDescriptors(for path: String) -> Int { + let target = URL(filePath: path).standardizedFileURL.path + let entries = (try? FileManager.default.contentsOfDirectory(atPath: "/dev/fd")) ?? [] + return entries.reduce(into: 0) { count, entry in + guard let descriptor = Int32(entry) else { return } + var buffer = [CChar](repeating: 0, count: Int(PATH_MAX)) + guard fcntl(descriptor, F_GETPATH, &buffer) != -1, + URL(filePath: String(cString: buffer)).standardizedFileURL.path == target + else { return } + count += 1 + } + } + private func claudeSnapshot( used: Double = 44, capturedAt: Date = Date(timeIntervalSince1970: 1_787_000_400), From ff90777ce73709c73ea74361cf01d1549574f590 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:30:23 -0500 Subject: [PATCH 16/21] fix(panel): size quota cards for real three-window data and keep the manual check reachable --- AGENTS.md | 2 +- .../Services/HistoryDashboardModel.swift | 8 ++- Sources/TokenGaugeApp/Support/Theme.swift | 8 +-- Sources/TokenGaugeApp/Views/AboutView.swift | 7 +- .../Views/HistoryDayCardView.swift | 2 +- Sources/TokenGaugeApp/Views/PopoverView.swift | 6 +- .../HistoryDashboardTests.swift | 10 +++ .../PopoverLayoutTests.swift | 59 +++++++++++++++- .../QuotaPanelRenderingTests.swift | 70 ++++++++++++++----- .../TokenGaugeAppTests/ScreenshotTests.swift | 5 +- .../TokenGaugeAppTests/Support/Fixtures.swift | 22 +++++- .../UpdateBannerRenderingTests.swift | 48 ++++++++++--- 12 files changed, 203 insertions(+), 44 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6ffbca9..adb452b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,7 +45,7 @@ - Panel style and menu-bar style persist independently; existing installs default to classic panels and numeric indicators. Compact/ring styles retain exact quota and reset data, historical provenance, and provider/window selection. Graphics never show stale values as live; exact menu values remain in tooltip/accessibility. Animations are brief, event-driven, optional, and honor Reduce Motion. - Use the native segmented control for history modes so selection and labels share one renderer. Year/week transitions must be checked in actual pixels after parent resizing; aligned accessibility frames alone cannot prove that the selection background stayed attached. - Ring grids must cap columns at the number of visible windows and distribute the occupied row across the card. Two quotas must never leave a reserved third slot; cover this with a wide two-cell render check. Unified ring width follows visible quotas within its bounds. -- Centralize visual constants in `Theme.swift`; individual panels are 340 pt wide and Unified is 560 pt wide; the panel grows to fit its content, with the layout matrix verified below 640 pt. Never wrap the entire popover in a vertical scroll view; only unusually long provider lists scroll within their own bounded area. Individual views show only their own provider; Unified shows two titled cards side by side. Scroll only when real provider content exceeds its bounded height. +- Centralize visual constants in `Theme.swift`; individual panels are 340 pt wide and Unified is 560 pt wide; the panel grows to fit its content, with the layout matrix verified below 700 pt. Never wrap the entire popover in a vertical scroll view; only unusually long provider lists scroll within their own bounded area. Individual views show only their own provider; Unified shows two titled cards side by side. Scroll only when real provider content exceeds its bounded height. - The popover closes on any click outside it: `.transient` alone does not dismiss an accessory app's popover when the click lands in another application (Steven, 2026-08-27). `StatusItemController` arms a global mouse-down monitor plus `didResignActiveNotification` while the popover is shown and tears both down in `popoverDidClose`. Keep the monitor to MOUSE events only — a global key monitor would demand Accessibility, which this app must never request. - Reset lines scale with distance: under an hour shows minutes plus the clock time, under a day shows hours plus the clock time, the next calendar day shows `mañana` plus the clock time, and anything further shows whole days only. Far distances count the real remaining duration, never midnight crossings — 3.4 days away reads `3 d`, not `4 d`. - The all-models weekly row never repeats a family that already owns its own scoped weekly row: `ProviderCard` passes those families to `ModelActivity.chips(excludingFamilies:)`, so `Semanal` and `Fable semanal` report disjoint token totals. diff --git a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift index 215a3c4..6b12f1e 100644 --- a/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift +++ b/Sources/TokenGaugeApp/Services/HistoryDashboardModel.swift @@ -316,7 +316,13 @@ final class HistoryDashboardModel: ObservableObject { } } - nonisolated static func dayKey(_ date: Date, calendar: Calendar = .current) -> String { + private nonisolated static var dayCalendar: Calendar { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = .current + return calendar + } + + nonisolated static func dayKey(_ date: Date, calendar: Calendar = dayCalendar) -> String { let components = calendar.dateComponents([.year, .month, .day], from: date) return String(format: "%04ld-%02ld-%02ld", components.year ?? 0, components.month ?? 0, components.day ?? 0) } diff --git a/Sources/TokenGaugeApp/Support/Theme.swift b/Sources/TokenGaugeApp/Support/Theme.swift index 784ded2..a8af7f4 100644 --- a/Sources/TokenGaugeApp/Support/Theme.swift +++ b/Sources/TokenGaugeApp/Support/Theme.swift @@ -9,11 +9,11 @@ enum Theme { static let menuBarFontSize: CGFloat = 13.5 static let menuRingGap: CGFloat = 8 static let panelWidth: CGFloat = 340 - static let maximumPanelHeight: CGFloat = 640 + static let maximumPanelHeight: CGFloat = 700 static let unifiedPanelWidth: CGFloat = 560 - static let providerMaxHeight: CGFloat = 270 - static let compactProviderMaxHeight: CGFloat = 230 - static let ringProviderMaxHeight: CGFloat = 264 + static let providerMaxHeight: CGFloat = 275 + static let compactProviderMaxHeight: CGFloat = 335 + static let ringProviderMaxHeight: CGFloat = 315 static let compactPanelWidth: CGFloat = 320 static let compactUnifiedWidth: CGFloat = 360 static let ringPanelWidth: CGFloat = 360 diff --git a/Sources/TokenGaugeApp/Views/AboutView.swift b/Sources/TokenGaugeApp/Views/AboutView.swift index ceaaa12..0f1d00e 100644 --- a/Sources/TokenGaugeApp/Views/AboutView.swift +++ b/Sources/TokenGaugeApp/Views/AboutView.swift @@ -74,8 +74,11 @@ struct UpdateActionView: View { case .idle: checkControl case .available: - Button("updates.download".localized) { updates.installPendingUpdate() } - .buttonStyle(.borderedProminent) + VStack(spacing: 8) { + Button("updates.download".localized) { updates.installPendingUpdate() } + .buttonStyle(.borderedProminent) + checkControl + } case .readyToInstall(let version, true): VStack(spacing: 8) { Button("updates.install_version".localized(version)) { updates.resumeDeferredInstall() } diff --git a/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift b/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift index 69295ee..e6f116f 100644 --- a/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryDayCardView.swift @@ -126,7 +126,7 @@ struct HistoryDayCardView: View { if !chips.isEmpty { HStack(spacing: 4) { ForEach(chips, id: \.self) { model in - Text(model).font(.system(size: 9)).lineLimit(1) + Text(model).font(.system(size: 10)).lineLimit(1) .padding(.horizontal, 5).padding(.vertical, 2) .background(Capsule().fill(color(provider).opacity(0.12))) } diff --git a/Sources/TokenGaugeApp/Views/PopoverView.swift b/Sources/TokenGaugeApp/Views/PopoverView.swift index 0005ed6..f2a33be 100644 --- a/Sources/TokenGaugeApp/Views/PopoverView.swift +++ b/Sources/TokenGaugeApp/Views/PopoverView.swift @@ -23,7 +23,7 @@ struct PopoverView: View { wrappedValue: history ?? HistoryDashboardModel(previewSnapshots: preview, mode: store.historyMode)) } - private var providerMaxHeight: CGFloat { + var providerMaxHeight: CGFloat { let height: CGFloat = store.panelStyle == .rings ? Theme.Layout.ringProviderMaxHeight @@ -31,7 +31,7 @@ struct PopoverView: View { return height - (updates.phase == .idle ? 0 : UpdateBannerView.height(for: updates.phase)) } - private var panelWidth: CGFloat { + var panelWidth: CGFloat { let unified = store.displayMode == .unified switch store.panelStyle { case .standard: return unified ? Theme.Layout.unifiedPanelWidth : Theme.Layout.panelWidth @@ -131,7 +131,7 @@ struct PopoverView: View { .accessibilityAddTraits(selected ? [.isSelected] : []) } - private var providerContent: some View { + var providerContent: some View { let layout = store.panelStyle == .compact ? AnyLayout(VStackLayout(alignment: .leading, spacing: 6)) diff --git a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift index 5174487..85e1895 100644 --- a/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryDashboardTests.swift @@ -21,6 +21,16 @@ final class HistoryDashboardTests: XCTestCase { XCTAssertEqual(HistoryDashboardModel.dayKey(previous.start, calendar: calendar), "2025-12-22") } + func testDayKeysMatchTheWriterEvenWithANonGregorianCurrentCalendar() { + var japanese = Calendar(identifier: .japanese) + japanese.timeZone = .current + for offset in stride(from: -86_400 * 400, through: 86_400 * 400, by: 86_400 * 37) { + let date = Date().addingTimeInterval(Double(offset)) + XCTAssertEqual(HistoryDashboardModel.dayKey(date), UsageStore.dayKey(for: date)) + XCTAssertNotEqual(HistoryDashboardModel.dayKey(date, calendar: japanese), UsageStore.dayKey(for: date)) + } + } + func testLeapYearIncludesEveryDateButDoesNotInventZeroDays() { let now = calendar.date(from: DateComponents(year: 2024, month: 7, day: 1))! let year = HistoryDashboardModel.interval(mode: .calendar, offset: 0, now: now, calendar: calendar) diff --git a/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift b/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift index cf8de96..019ffda 100644 --- a/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift +++ b/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift @@ -24,7 +24,9 @@ final class PopoverLayoutTests: XCTestCase { resetsAt: Date().addingTimeInterval(86400 * 3), durationMinutes: 10080, displayName: index == 0 ? nil : "Model \(index)") }, dailyUsage: [], summary: nil, availableResetCredits: nil, creditBalance: nil, capturedAt: Date()) - let store = UsageStore(defaults: defaults, initialSnapshots: [snapshot], historyReadsEnabled: false) + let store = UsageStore( + defaults: defaults, initialSnapshots: [snapshot, claudeSnapshot()], historyReadsEnabled: false) + store.showHourlyPace = true for language in AppLanguage.allCases { LocalizationManager.shared.language = language for mode in UsageDisplayMode.allCases { @@ -43,6 +45,61 @@ final class PopoverLayoutTests: XCTestCase { } } + func testUnifiedProviderContentFitsEveryStyleWithoutScrolling() throws { + let suite = "TokenGauge.layout.\(UUID().uuidString)" + let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) + defer { defaults.removePersistentDomain(forName: suite) } + let store = UsageStore( + defaults: defaults, initialSnapshots: [codexSnapshot(), claudeSnapshot()], historyReadsEnabled: false) + store.showHourlyPace = true + store.displayMode = .unified + try withEachLanguage { language in + for style in QuotaPanelStyle.allCases { + store.panelStyle = style + let view = PopoverView(store: store, showSettings: {}, showAbout: {}) + let content = fittingSize( + view.providerContent.frame(width: view.panelWidth - Theme.Layout.panelPadding * 2)) + XCTAssertLessThanOrEqual( + content.height, view.providerMaxHeight, "\(language.rawValue) / \(style.rawValue)") + assertHeight(store) + } + } + } + + private func claudeSnapshot() -> ProviderUsageSnapshot { + Fixture.snapshot( + .claude, + windows: [ + Fixture.window( + id: "five_hour", usedPercentage: 2, resetsAt: Date().addingTimeInterval(7_200), + durationMinutes: 300), + Fixture.window( + id: "seven_day", usedPercentage: 25, resetsAt: Date().addingTimeInterval(172_800), + durationMinutes: 10_080), + Fixture.window( + id: "seven_day_fable", usedPercentage: 88, resetsAt: Date().addingTimeInterval(172_800), + durationMinutes: 10_080, displayName: "Fable"), + ], availableResetCredits: 2, capturedAt: Date().addingTimeInterval(-600), + modelBuckets: Fixture.modelBuckets([ + ("claude-opus-4-6", 171_600_000), ("claude-fable-1", 67_900_000), ("claude-haiku-4-5", 1_100_000), + ])) + } + + private func codexSnapshot() -> ProviderUsageSnapshot { + Fixture.snapshot( + .codex, + windows: [ + Fixture.window( + id: "codex.weekly", usedPercentage: 41, resetsAt: Date().addingTimeInterval(172_800), + durationMinutes: 10_080), + Fixture.window( + id: "base_model_inference.weekly", usedPercentage: 12, + resetsAt: Date().addingTimeInterval(172_800), durationMinutes: 10_080, + displayName: "gpt-reserve"), + ], capturedAt: Date().addingTimeInterval(-600), + modelBuckets: Fixture.modelBuckets([("gpt-6-astra", 148_300_000)])) + } + private func assertHeight(_ store: UsageStore, file: StaticString = #filePath, line: UInt = #line) { let view = NSHostingView(rootView: PopoverView(store: store, showSettings: {}, showAbout: {})) XCTAssertGreaterThanOrEqual(view.fittingSize.width, Theme.Layout.compactPanelWidth, file: file, line: line) diff --git a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift index bd5301a..c7349de 100644 --- a/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/QuotaPanelRenderingTests.swift @@ -12,8 +12,10 @@ final class QuotaPanelRenderingTests: XCTestCase { for style in [QuotaPanelStyle.compact, .rings] { for count in 1...3 { for width: CGFloat in style == .rings ? [240, 334] : [334, 414] { + let claude = state(count: count) let card = ProviderCard( - provider: .claude, state: state(count: count), panelStyle: style, showProviderTitle: true) + provider: .claude, state: claude, panelStyle: style, showProviderTitle: true, + showHourlyPace: true, paces: paces(claude)) let bitmap = try render(card.frame(width: width), maximumHeight: 420) XCTAssertGreaterThan(bitmap.pixelsWide, 0) XCTAssertEqual(bitmap.size.width, width, accuracy: 1) @@ -51,9 +53,11 @@ final class QuotaPanelRenderingTests: XCTestCase { try withEachLanguage { _ in for count in [2, 3] { let width = QuotaRingLayout.minimumGridWidth(windows: count) + Theme.Layout.cardPadding * 2 + let claude = state(count: count) let card = ProviderCard( - provider: .claude, state: state(count: count), panelStyle: .rings, showProviderTitle: true) - let bitmap = try render(card.frame(width: width), maximumHeight: 220) + provider: .claude, state: claude, panelStyle: .rings, showProviderTitle: true, + showHourlyPace: true, paces: paces(claude)) + let bitmap = try render(card.frame(width: width), maximumHeight: 260) XCTAssertEqual(bitmap.size.width, width, accuracy: 1) } } @@ -74,11 +78,13 @@ final class QuotaPanelRenderingTests: XCTestCase { } func testHiddenWindowsDoNotOccupyRingSpace() throws { + let claude = state(count: 3) var card = ProviderCard( - provider: .claude, state: state(count: 3), panelStyle: .rings, showProviderTitle: true) - let all = try render(card.frame(width: 240), maximumHeight: 320) + provider: .claude, state: claude, panelStyle: .rings, showProviderTitle: true, + showHourlyPace: true, paces: paces(claude)) + let all = try render(card.frame(width: 240), maximumHeight: 420) card.hiddenClaudeWindows = [.weekly] - let filtered = try render(card.frame(width: 240), maximumHeight: 190) + let filtered = try render(card.frame(width: 240), maximumHeight: 300) XCTAssertLessThan(filtered.size.height, all.size.height - 50) } @@ -94,15 +100,18 @@ final class QuotaPanelRenderingTests: XCTestCase { let width = Theme.Layout.ringPanelWidth - Theme.Layout.panelPadding * 2 try withEachLanguage { _ in for count in 1...3 { + let state = state(count: count) let claude = ProviderCard( - provider: .claude, state: state(count: count), panelStyle: .rings, showProviderTitle: true, - showHourlyPace: true) + provider: .claude, state: state, panelStyle: .rings, showProviderTitle: true, + showHourlyPace: true, paces: paces(state)) let bitmap = try render(claude.frame(width: width), maximumHeight: Theme.Layout.maximumPanelHeight) XCTAssertEqual(bitmap.size.width, width, accuracy: 1) } for count in 1...2 { + let state = codexState(count: count) let codex = ProviderCard( - provider: .codex, state: codexState(count: count), panelStyle: .rings, showProviderTitle: true) + provider: .codex, state: state, panelStyle: .rings, showProviderTitle: true, + showHourlyPace: true, paces: paces(state)) let bitmap = try render(codex.frame(width: width), maximumHeight: Theme.Layout.maximumPanelHeight) XCTAssertEqual(bitmap.size.width, width, accuracy: 1) } @@ -114,8 +123,10 @@ final class QuotaPanelRenderingTests: XCTestCase { let available = cardWidth - Theme.Layout.cardPadding * 2 XCTAssertEqual(QuotaRingLayout.choose(availableWidth: available, windows: 3), .rows) XCTAssertEqual(QuotaRingLayout.choose(availableWidth: available, windows: 2), .grid(columns: 2)) + let claude = state(count: 3) let card = ProviderCard( - provider: .claude, state: state(count: 3), panelStyle: .rings, showProviderTitle: true) + provider: .claude, state: claude, panelStyle: .rings, showProviderTitle: true, + showHourlyPace: true, paces: paces(claude)) let rows = try render(card.frame(width: cardWidth), maximumHeight: Theme.Layout.maximumPanelHeight) let grid = try render( card.frame(width: QuotaRingLayout.minimumGridWidth(windows: 3) + Theme.Layout.cardPadding * 2), @@ -131,12 +142,14 @@ final class QuotaPanelRenderingTests: XCTestCase { (2, 2, balanced / 2, balanced / 2), ] for (codexWindows, claudeWindows, codexWidth, claudeWidth) in matrix { + let codexState = codexState(count: codexWindows) + let claudeState = state(count: claudeWindows) let codex = ProviderCard( - provider: .codex, state: codexState(count: codexWindows), panelStyle: .rings, - showProviderTitle: true, stretchesHeight: true) + provider: .codex, state: codexState, panelStyle: .rings, + showProviderTitle: true, showHourlyPace: true, stretchesHeight: true, paces: paces(codexState)) let claude = ProviderCard( - provider: .claude, state: state(count: claudeWindows), panelStyle: .rings, - showProviderTitle: true, stretchesHeight: true) + provider: .claude, state: claudeState, panelStyle: .rings, + showProviderTitle: true, showHourlyPace: true, stretchesHeight: true, paces: paces(claudeState)) let row = HStack(alignment: .top, spacing: Theme.Layout.quotaRingSpacing) { codex.frame(width: codexWidth) claude.frame(width: claudeWidth) @@ -162,10 +175,14 @@ final class QuotaPanelRenderingTests: XCTestCase { let available = Theme.Layout.unifiedPanelWidth - Theme.Layout.panelPadding * 2 let cardWidth = (available - 10) / 2 try withEachLanguage { language in + let codexState = codexState(count: 2) + let claudeState = state(count: 3) let codex = ProviderCard( - provider: .codex, state: codexState(count: 2), showProviderTitle: true, showHourlyPace: true) + provider: .codex, state: codexState, showProviderTitle: true, showHourlyPace: true, + paces: paces(codexState)) let claude = ProviderCard( - provider: .claude, state: state(count: 3), showProviderTitle: true, showHourlyPace: true) + provider: .claude, state: claudeState, showProviderTitle: true, showHourlyPace: true, + paces: paces(claudeState)) let unified = HStack(alignment: .top, spacing: 10) { codex.frame(width: cardWidth) claude.frame(width: cardWidth) @@ -173,7 +190,8 @@ final class QuotaPanelRenderingTests: XCTestCase { .fixedSize(horizontal: false, vertical: true) XCTAssertLessThanOrEqual( fittingSize(unified).height, Theme.Layout.providerMaxHeight, language.rawValue) - let single = ProviderCard(provider: .claude, state: state(count: 3), showHourlyPace: true) + let single = ProviderCard( + provider: .claude, state: claudeState, showHourlyPace: true, paces: paces(claudeState)) XCTAssertLessThanOrEqual( fittingSize(single.frame(width: Theme.Layout.panelWidth - Theme.Layout.panelPadding * 2)).height, Theme.Layout.providerMaxHeight, language.rawValue) @@ -186,6 +204,7 @@ final class QuotaPanelRenderingTests: XCTestCase { defaults: defaults, snapshots: [codexState(count: 2).snapshot, state(count: 3).snapshot].compactMap { $0 }) store.panelStyle = .standard + store.showHourlyPace = true try withEachLanguage { language in for mode in UsageDisplayMode.allCases { store.displayMode = mode @@ -222,7 +241,11 @@ final class QuotaPanelRenderingTests: XCTestCase { ] let snapshot = Fixture.snapshot( .claude, windows: Array(windows.prefix(count)), availableResetCredits: 2, - capturedAt: Date().addingTimeInterval(-600)) + capturedAt: Date().addingTimeInterval(-600), + modelBuckets: Fixture.modelBuckets([ + ("claude-opus-4-6", 171_600_000), ("claude-fable-1", 67_900_000), + ("claude-haiku-4-5", 1_100_000), + ])) return ProviderViewState(snapshot: snapshot, status: status, isRefreshing: false) } @@ -236,7 +259,16 @@ final class QuotaPanelRenderingTests: XCTestCase { resetsAt: Date().addingTimeInterval(172800), durationMinutes: 10080, displayName: "gpt-reserve"), ] let snapshot = Fixture.snapshot( - .codex, windows: Array(windows.prefix(count)), capturedAt: Date().addingTimeInterval(-600)) + .codex, windows: Array(windows.prefix(count)), capturedAt: Date().addingTimeInterval(-600), + modelBuckets: Fixture.modelBuckets([("gpt-6-astra", 148_300_000), ("gpt-6-codex", 52_400_000)])) return ProviderViewState(snapshot: snapshot, status: status, isRefreshing: false) } + + private func paces(_ state: ProviderViewState) -> [String: QuotaPace] { + var result: [String: QuotaPace] = [:] + for window in state.snapshot?.windows ?? [] { + result[window.id] = Fixture.pace(15.6, resetsAt: window.resetsAt) + } + return result + } } diff --git a/Tests/TokenGaugeAppTests/ScreenshotTests.swift b/Tests/TokenGaugeAppTests/ScreenshotTests.swift index e104a6e..276da8f 100644 --- a/Tests/TokenGaugeAppTests/ScreenshotTests.swift +++ b/Tests/TokenGaugeAppTests/ScreenshotTests.swift @@ -14,8 +14,9 @@ final class ScreenshotTests: XCTestCase { let output = URL(fileURLWithPath: directory) try FileManager.default.createDirectory(at: output, withIntermediateDirectories: true) let previousIcon = NSApplication.shared.applicationIconImage - let icon = output.deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent( - "Resources/AppIcon.icns") + let icon = URL(fileURLWithPath: #filePath) + .deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent() + .appendingPathComponent("Resources/AppIcon.icns") NSApplication.shared.applicationIconImage = try XCTUnwrap(NSImage(contentsOf: icon)) defer { NSApplication.shared.applicationIconImage = previousIcon } let suite = "TokenGauge.screenshots.\(UUID().uuidString)" diff --git a/Tests/TokenGaugeAppTests/Support/Fixtures.swift b/Tests/TokenGaugeAppTests/Support/Fixtures.swift index 2b69059..e9664cb 100644 --- a/Tests/TokenGaugeAppTests/Support/Fixtures.swift +++ b/Tests/TokenGaugeAppTests/Support/Fixtures.swift @@ -22,11 +22,29 @@ enum Fixture { windows: [QuotaWindow] = [], dailyUsage: [DailyTokenUsage] = [], availableResetCredits: Int? = nil, - capturedAt: Date? = Date() + capturedAt: Date? = Date(), + modelBuckets: [ModelTokenBucket] = [] ) -> ProviderUsageSnapshot { ProviderUsageSnapshot( provider: provider, windows: windows, dailyUsage: dailyUsage, summary: nil, - availableResetCredits: availableResetCredits, creditBalance: nil, capturedAt: capturedAt) + availableResetCredits: availableResetCredits, creditBalance: nil, capturedAt: capturedAt, + modelBuckets: modelBuckets) + } + + static func modelBuckets(_ tokens: [(String, Int)], at hourStart: Date = Date().addingTimeInterval(-1_800)) + -> [ModelTokenBucket] + { + tokens.map { model, amount in + ModelTokenBucket( + day: UsageStore.dayKey(for: hourStart, calendar: .current), hourStart: hourStart, model: model, + tokens: amount) + } + } + + static func pace(_ pointsPerHour: Double, resetsAt: Date?) -> QuotaPace { + QuotaPace( + pointsPerHour: pointsPerHour, observedMinutes: 45, sampledAt: Date().addingTimeInterval(-600), + resetsAt: resetsAt, lastUsedPercentage: 15.6) } @MainActor diff --git a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift index 22f8ee5..71adbab 100644 --- a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift @@ -45,17 +45,22 @@ final class UpdateBannerRenderingTests: XCTestCase { } func testAboutKeepsTheManualCheckReachableOutsideARunningUpdate() throws { - let idle = try actionHeight(phase: .idle) - let available = try actionHeight(phase: .available(version: "1.4.0")) - let deferred = try actionHeight(phase: .readyToInstall(version: "1.4.0", deferred: true)) - let installing = try actionHeight(phase: .installing(version: "1.4.0")) + let check = try actionBitmap(phase: .idle) + for phase in [ + UpdateManager.Phase.available(version: "1.4.0"), .readyToInstall(version: "1.4.0", deferred: true), + ] { + let bitmap = try actionBitmap(phase: phase) + XCTAssertGreaterThan(bitmap.pixelsHigh, check.pixelsHigh, "\(phase)") + XCTAssertTrue(endsWith(bitmap, check), "\(phase)") + } + let installing = try actionBitmap(phase: .installing(version: "1.4.0")) + XCTAssertFalse(endsWith(installing, check)) + let idle = try actionHeight(phase: .idle) XCTAssertGreaterThan(idle, 0) XCTAssertLessThan(idle, UpdateBannerView.compactHeight) - XCTAssertGreaterThan(available, 0) - XCTAssertLessThan(available, UpdateBannerView.compactHeight) - XCTAssertGreaterThan(deferred, max(idle, available)) - XCTAssertEqual(installing, UpdateBannerView.compactHeight, accuracy: 1) + XCTAssertEqual( + try actionHeight(phase: .installing(version: "1.4.0")), UpdateBannerView.compactHeight, accuracy: 1) } private func actionHeight(phase: UpdateManager.Phase) throws -> CGFloat { @@ -65,6 +70,33 @@ final class UpdateBannerRenderingTests: XCTestCase { return view.fittingSize.height } + private func actionBitmap(phase: UpdateManager.Phase) throws -> NSBitmapImageRep { + let manager = try makeManager(phase: phase) + return try render( + UpdateActionView(updates: manager).frame(width: Theme.Layout.panelWidth) + .environment(\.colorScheme, .light).background(Color.white)) + } + + private func endsWith(_ bitmap: NSBitmapImageRep, _ tail: NSBitmapImageRep) -> Bool { + guard bitmap.pixelsWide == tail.pixelsWide, bitmap.pixelsHigh >= tail.pixelsHigh else { return false } + var different = 0 + for row in 0.. 0.1 + || abs(left.greenComponent - right.greenComponent) > 0.1 + || abs(left.blueComponent - right.blueComponent) > 0.1 + { + different += 1 + } + } + } + return different * 100 < tail.pixelsWide * tail.pixelsHigh + } + private func makeManager(phase: UpdateManager.Phase) throws -> UpdateManager { let suite = "TokenGauge.banner.\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) From 0d6040a12abb063f0477249a7518135fd8c4b77f Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:34:16 -0500 Subject: [PATCH 17/21] chore(release): prepare version 1.4.0 --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ README.md | 6 +++--- Resources/Info.plist | 4 ++-- docs/RELEASING.md | 2 ++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f7eab9..02fde68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.4.0] - 2026-09-18 + +### Added + +- Quota ring cards that switch between one large ring, a grid, or compact rows according to the visible windows and the available width, keeping three Claude windows with model chips and pace lines fully readable. +- A calendar day card, shown by holding the pointer over a day or pinned with a click, with per-provider icons, tokens, percentages, model detail, and current and best streaks. +- Five calendar intensity levels derived from usage quantiles, so more color means more usage. +- An in-panel update banner with real download and extraction progress, followed by Install now or Later. +- A persistent Install button in the panel and in About after choosing Later, preserved across relaunches. + +### Changed + +- The yearly calendar now shows combined activity in the Codex, Claude, and Unified views. +- Calendar selection follows the pointer and returns to today when the pointer leaves the calendar; Esc, a click outside, scrolling, or changing view dismisses a pinned day card. +- The standard panel moves Settings, About, and Quit into a header gear menu instead of footer rows. +- Manual update checks are available in About whenever no update is in progress. +- Faster refreshes: transcripts are scanned incrementally with a resume file, a single capture pass replaces two, Claude activity and account data are read concurrently within a 12-second network limit, and each provider's card appears as soon as its own data is ready. +- Update feed overrides are accepted only over HTTPS. + +### Fixed + +- Claude readings, history, and pace continuity are scoped to the signed-in account, and Claude helper commands run in a private working directory. +- A refresh stays marked as busy until local archiving finishes. +- Local history read handles are closed when the database reports a schema error. +- Daily totals use the Gregorian calendar regardless of the system calendar setting. + ## [1.3.0] - 2026-09-13 ### Added diff --git a/README.md b/README.md index fa8e3f3..5c7cd3f 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,11 @@ TokenGauge lives in your Mac’s menu bar and shows how much Claude Code or Code - **A readable menu bar:** independently choose percentages, mini bars, or mini rings, with Large, Medium, or Small sizing. Exact percentages remain available on hover and in the panel. - **Quiet by design:** optional brief transitions respect Reduce Motion; menu indicators redraw only when their data or appearance changes. - **Separate limits:** general weekly quota and additional provider windows stay separate. Hide Luna weekly reserve in Settings if you do not use it. -- **Browsable activity:** rolling seven days, Monday-based weeks with previous/next navigation, or a yearly contribution calendar. Hover or select a day to inspect totals and available model/effort detail. In Unified, calendar colors show the provider with more recorded tokens, and intensity shows combined daily usage; ties use both colors. Separate month blocks and highlighted weekend rows make the year easier to scan. +- **Browsable activity:** rolling seven days, Monday-based weeks with previous/next navigation, or a yearly calendar that always shows Codex and Claude together, whichever view you are in. Five intensity levels show how much you used that day, colored by the provider with more recorded tokens. Hold the pointer over a day or click it to pin a card with per-provider tokens, percentages, model detail, and your current and best streaks; Esc, a click outside, scrolling, or changing view closes it. Separate month blocks and highlighted weekend rows make the year easier to scan. - **Local history:** SQLite preserves daily totals and observed model/reasoning effort metadata after provider logs are trimmed. Missing days remain distinct from recorded zero usage. - **Hourly quota pace:** an optional estimate in percentage points per hour for each weekly limit, based on verified recent readings, with a short explanation and dated last-active measurement. - **English and Spanish:** follows your system language initially, with an explicit language choice in Settings. -- **Native updates:** daily checks, an inline install action, and manual checks in About. +- **Native updates:** daily checks, an in-panel banner with download progress, and manual checks in About. - **No telemetry, ads, or model requests.** ## Install and connect @@ -58,7 +58,7 @@ TokenGauge is a usage viewer, not a replacement for either provider. On a Mac wi ### Updates -Release builds check for updates daily. When one is available, choose **Install update** in the panel or **About TokenGauge**. Download progress appears inline, then the app relaunches. Automatic checking can be disabled in Settings; manual checks live in About. There are no separate Sparkle update windows. +Release builds check for updates daily. When one is available, a banner appears in the panel with download and extraction progress, then offers **Install now** or **Later**. Installing relaunches the app. If you choose Later, an Install button stays in the panel and in **About TokenGauge** until you use it, including after restarting the app. Automatic checking can be disabled in Settings; a manual check is available in About whenever no update is in progress. There are no separate Sparkle update windows. Updates use [Sparkle](https://sparkle-project.org), a signed ZIP, and an EdDSA-signed appcast on GitHub Releases. Development builds stay off the public update channel. diff --git a/Resources/Info.plist b/Resources/Info.plist index c2ee42f..dc825e0 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3.0 + 1.4.0 CFBundleVersion - 4 + 5 LSMinimumSystemVersion 14.0 LSUIElement diff --git a/docs/RELEASING.md b/docs/RELEASING.md index bd25933..4f0afc7 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -14,6 +14,8 @@ The release version is `CFBundleShortVersionString` in `Resources/Info.plist`. I 4. Verify a real Sparkle update with two development builds, including a tampered ZIP rejection, retry, installation/relaunch, and preserved preferences. 5. Update CHANGELOG.md, screenshots, and release notes. Use synthetic data for public screenshots. +The incremental transcript scan keeps its resume state in `scan-state.json`, next to the history database under `~/Library/Application Support/TokenGauge`. Deleting it is safe and forces a full rescan. + ## Build artifacts Prerequisites: an Apple Developer membership, an installed Developer ID Application certificate, `create-dmg`, and an existing `notarytool` Keychain profile. Signing/private-key access and public publication follow the owner’s authorization; never export credentials into the repository or logs. From a0660c85e62f8640e00776a1aafccc6d644405b2 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 01:35:08 -0500 Subject: [PATCH 18/21] docs(images): regenerate panel screenshots for 1.4.0 --- docs/images/claude.png | Bin 86853 -> 76155 bytes docs/images/history-calendar-rings.png | Bin 138998 -> 167610 bytes docs/images/panel.png | Bin 104610 -> 94989 bytes docs/images/rings-current.png | Bin 115266 -> 120069 bytes docs/images/unified.png | Bin 132940 -> 121778 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/claude.png b/docs/images/claude.png index f8637f723da6745c4a1374fd291de2c8bb2780c6..2554af304f8363eaf90d403056d1b1070608c427 100644 GIT binary patch literal 76155 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%0Ds6?;&OSfWd*gOAT)B6& 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

w`tk-lKnI2#y?I0xOEq(&dqf|r2_AJm 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¨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 z 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 W@tJkEjVdzmPeDfIR?a_WPyP?sgu&zh literal 138998 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�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 diff --git a/docs/images/panel.png b/docs/images/panel.png index 7576455a84c99301594da1c33ed91c3ff6fafdc3..cbaf801c006be1148dac383d4425c621a0040532 100644 GIT binary patch literal 94989 zcmcG#g;yNO_x}xqARz<`9^9P-4ek&K?(Q2<{qWu;A_v!CfZ|?(X)R?0&wx z`}_gVobJRqo1Q;?HHeM9gD1_lQ8ijh{bhHGbO0ii_*wqHwCLy$=3;oPM*`%I0`{ zx4m+a{qp#-!sf^f^Io-HDgl83CYJdZX2_k#gt5`aZsU$045`?b-<$M!I-}rV1UNCX zL-5uUkP;`3a67)~`RU0QTb!9C{uRvoa659Y`1t5kMKQ3Q7=#f<;VM+$);-DMyC=FD z4#jJ7#!QoE_Kx(;UOI`5A|vu{K8!gS7nA=kM^1CI$TCjm z@exl>Y9$<&;q%xdDruC&zKba@)8}7@c8g1ln;RLrg!C;v@9TYc-@dZ?4dW%uY6tJq ziRs6vCpWiA#>Xbc&KL=ZEE>A<)>S1FIFC-e6bg=|SLVOp zwfYMp!D5i&Fv5O_eLLlk$B5`|z(fm2Wq`5(OD}}IfVkf!Y=>7Hfc2ZP5vk(a!Ec;K zv;qUXR+#+X{CFXxNQjE0^aTh2QG{506V#8S>Vt%D0=siGXkj6uB2sW$!Us8+#qU9W zpj?Dq^<6wCoaVPz!mhc(7VsXgyn_{4@zsJk3`N}pe)*-^!F+&a3BEi1#Er`w$knxF zhw24m6ENPbzOMcAy$@_mE=+h}UaphEHZ8(17WTJrQL5bD;@M&&6?_oFY~;R}bG}VZ zL2+`iyai)gcwzqNvY*W1_m{vUg|4K-5m z-jdXOP!6Q)nK9D(h|Ai*+LLml!I%`x(amG<^s{Q={h{=s#38XY%JtiNG~Pg>o^?A* zZng{*X83`A)Aew>7CS_{BKxOC!xc$BkGL`Q~^h7*egodg~HU5ZloI|YF3i_kDl zV*I-}<~W2e*@Mz1%GETVvlz*2$>-z7V^6+=m1y6KhVxQIe-~dA1LS1n^W}LZc{(*2r00toT?Zwl&KY~a2K-Xuogd6tSPH>5D69agGRTr0nqF@=sTKAZ2M^m)d4=4l3H#?Z8^I_{Iq zXYnSnyBvqg^WyOD;pNf^($UgChQDCbp^CE=R9OIOM{9d(mutrz*>_lXPPeU7rum9| z#}H?mK*u1yS)*B;S#41E?5^dSWr?Ns?9wbTD1TOV78k^#4leZ(e%jL6Y8rF=>=>~_ zoaHJ1YL0alXggM9m+iCnqRRGCMhOHXXOCa&WmHc|foyv5&J`zbi09vH$V%`(^!s^Ip`x)dAw( z&K}nun2i*V_3d|57Xl|jFIM(Xk(@fV3pTgEq-H}+6Rc)TE<00<4$WGBHTK^YBF_aH zez&Y1*leb=wlq(()&h8pzU8dp!b&;%c#s~Fy2CBcU1_%F_jxe`kOf>b5wH-hL8_(w zY0==uq3`Rn@>qV+vg2D*Tl2MM#nv4xJv0mkb%Lh%qv}dH2AZet3sL*}2h5^mLq@H% z*|f8c^p<&DR9Z+|u3U6o^pA)R`>sc?Dc;?`Lw?sngn&03sn9RcPbC?dAF@F(fEAsc zahO@1@s9Ut%lbHDe`WX4+J6#m?b{Pdu#S`N0`n}hl6te%w}bHtB`zYadhMuXV^@CH z3eWNf>ntwX1$Fr9HZ2fs`XL&ny+JAb3L5z`3aV$w7DNWvz zx0w&gC&&{J^At~(kTKpKC<|{QC?#eHJqqpV6Yrbtk77F4t2LgqYt{8qd_3xth;YQw z*UM|C1P%@TIG0(JiJ>&W%)=tUYX2#^z;Re5rUp6gRg9)Fr`dTupV^Yh+wHiXc%DVw zM43p zEsxBI6o^YLhW6X-TI+#oMSH(SPOM>_jK#Pgk#D8=F^z}NzIR#A9}XYJjN~Vg3@QG? z*uE@d)vYq@o7Tx*(O1h;cTjWL+S@E2CDiHDQEem8%4}@5idswS=IFU=zq_&uvr?Xa zRx{94&^oozy=)#68SQ@T&L#2kwV?mbfQgG*=BlTEMR70L71Ks&&3U+VTArfq^`p1C zplowQVyvG*Q1eOUdAhf-K(;OYi0fqa+ba2rgJU77vx2 zo$S|w;F9Zdo6?VEbju;D$!#Y?&&5xx9jrcpV%18fk|!;iviP}>*=$=o3k!=Gi?VqW)$<4I5=F;K}x!nv5Fk!V=^%^-QAOXU5c#$ z^G}W+cWkos-P&(NI)h|zy_vHP%v`eDHy!qRO^ZebDp)IO_3Jv8=8Wg3@6%Up%iFHo zfb$WR$Dz7Zq>j?gUhZ65X1u4M%S!W*_MZUz3aBK zhdVS@v~Uu7K1R=iv*K;nc(8WC^;CR-UI2eg4+)qA^0w`k;v$BnCrF-FemKig5a?$1 zbl4j@K6tegk%iWQ-iGI^d07O>Zqdi@;JHtJ(C5$pnBP;`S4p#G?NxeRf1G*LQc*Qg zC3!Lpj`5{^F21gM#@bN6+1VYJA4vA?@}_&SJg>XZ?rcEB+QY&kuTSCUc$0%36#pH@ zO&Jk}3I}H2874HMaA%*+zwqUCA<`pFR#saPe5y_w2G;&NKXm~Zrce$(HVy>;A$!_x zqE1fEPnoIyMcY?jCPkicaa3V$Z!<%{Z_YafO+1obDvo`%NJs9u9#}NC5lI<7DJMf` zuhym-U(94>Vd$avNHFlQ1Te3mcd*b?0G9BddkI)tm{)&2hl7C$0YIm|f4?IKz5e;d zLeD?n{C$PXf&0HV;EHoz{onnck6>W>YLPLa7i2prO-C3Q9I8Jj>=z}imDc2^GpilFFgpcPeK6CvoTvW^psZzoim_#}pTW<4`OT z4Z`?O`msW@9RDd3c`PmTyD%Oi`pAFF6zT^Ls`$@0=>B3Du|l#ldkTjCO`lT18TB7K zpf{A^e(;ugav^Uh{TQZASm&s#pIt<^OM2{kRihJvnM9 zry3ZO4v#2rESL$8kSQ-7+}qB}`%sc!sDc%*_H1d=hAWSK0%yw}4$4xi~71Ok@ z@yOsT$~=Uefr+jmeBYk4xO#4`LenTJ3YD;WI^#bzF4TqeUMwdm8LfJsY@@8ceUV^) zzQN;bM27kF7pY3wOa*bBJa%ny%Y!#KVgmLybb$Tj!ae|fb^;d%HqXS$jP;eQ^W21j z$(E@pr^y1mcEdJNX=P=EdGX1AtJR%4*41B2YoD)3E~BE-S#MgclImlT$~YI-d^7hX zbx0?}w3@dxFLR~V6FU`qk1I~ym?v-_bp51e()DdlK4svQwh9EI!?2QOlw7d5pFs<> zWUirCFWgo|nKpGG9QkjByb&U;gu}MiKUn{u^fN^$nSV>)f zd!*iDE05Hk&9u_=zoxZ)g=SZmmp7bN{!6vI2s9O;JMy$$NN@viTB=#`mX0lxi?4s9 zT!^F?Sc+R%;@qAn2!5(oGpEZz&wq3jNw^~q1SndDTZp&T*CucaA8MU*%{2vUjvg!T ziCc<_29zFG);g&7H#c8xQe*w6Z_>i}x4xOF4)1Cgem@Y#4YX(4OV>^GiMuen2f6NW z$VMnOtc@t0sQ$1dwjaKqE5WK*Q{UHmE&@GG7KBbx(|iM12O-XuUyx(d5rQ5U-KAl; zxMo{`nF>FK!R|^2`|$_JNtjZHwZuIM|5~0#X=RNK$-7eQt6QI^ZH3 z{@{hTFX5T7Uy+q})SV9^bRR9yi$|G|W-#YD64QC&_H}+RGv(C|eVIq#5-;FvD$yRh zSDW0wuu3c)Wo|LU)lyK>>5tZ3Oe^ocV(x4=`Nzet(uDwkk|-kHIV&tFM*a2`OG`@x z&ICRpZ{pXMfYMl}@00Gr+8H-fO>(QP4{l`Pp<*V5S{KuKVAr*i-n{JUsQ9cO6>KlL ziP&n}%xP3sY2}mjW!08}7ant3NB0~yByyKLUCT-{yRCV0#WhW9$jOMBTTwCQbK66*)Pp9N zp;wr?MiwjSAKoxc6o{2YD{dt2{fln)T92pDa;?OBM_K6`9yCnUN&8M?%(`?YMuSIoX&gJkB6l2MQWB6_v|j4DwyG@hqTi%OvGP zn)hh{$tA>T=sT5-Lbg_sjI{N%ELWYp&w0GJR?a&D_CbjlV&F;Zg`8Eul}T1=EAk9F zO*qN)p1ir6%vp}o)i_@_`xb|IN>URV-N3u@T4mRC1Cj-sMxff>jIno{)tSDrX4@WCp+Zs-!Oil0zUvL2 zfx04r(TSe@hurFW#kBh|N-8=0^^!q)X=UB7M;}dVy*F~g>U$<|N=tQZISw?`A#0bz zz|86R(gT9BcK4t}91e{i+G^@xlhS$a7{Da_vR5+8LgUcGG8>w%kql1z=7nvQhgSg| z#y;rL+Y5v>$aEZ_$j(>HZ|ZqemwZ+@MI=fq_siU#vph z%PxE$sq1B1!DXloz<62Cs*lF~x9Jg$IqnzRixe?@Ml2nV)q(@wr>80=e+HRB6n}Z| zePw`sxYYXH1RoZ{Xke6WSK^(H&%a9)ITDj1{#8d*57*XQO%ViUMdRvOJFg`gguykr zS)OJjeYV#+?ggYq!15cl*k7*(aMpE2G1u4TE`k_j%E!J8;$NsQ2Gpo8v7ziAruNA- z)~hTGRxK|M+AlBP4m~WL%DOo3jg%MGkD)9Ii;q}u2ME^P*$P137e~kd?fDTKEq$BQ z&Q+gk?`_QEA?cjL5A1EIr{lW8-<~ax#*2cW*kQuK#%bgT;FY{C0KJxHlBT zWrV4rfa~M{E|DY}&G)wFxnG(@B^cjF==7}}*6`m$(h^oDRw(WfB!Z>h_vt|Y2b%zr#z!lTq+r%l_~u&tBwdc^$6lvDW9; zEstle*8ShEIBmK$()j>oOq!=NjA) z)%Nk%P7jVvxMbnT48JGN@{GFD35U0E_vJ;9PJ>6Z>Aq!>%tTukWx7<4uym}X{Noxt z4$B1n+ui(_di}*7nQj5QG|Hi9o_$&txf1`4JBL|S^+id6bBq(6JkT?=RoiZC<{qN) zU&iYCK3(Ze2wcr5OI*F2_}uVzJV8BT3O$|k#N0Bt#+CVckPiAHa35wxgWsO%+00Q5 zo$C>RE|fpTA}O~Pl}IS+Wi%%)+kEP6uR3vK(9*X;9Tiv8)HO>M;2iL|Sy--bA3{~u z;u(~d9?3|aIqZCOQw{18J(>bP_t7IXF_-DwQ(c%Zyo%7PCb|(Ap$0w(-~?~kWwx%@=#@S*@zW@j-g-)UZ3ZSZ1b{f>f=jj6l~LV-%127R1szEj{98KB(al?*<;x9_&mB1@;DVw z3mnzG8);Z|(LVV?<&DXB0yi5W#PV)6BOs8ZrdL*msIqH|>iVvYdVzM{4*>M8K_yZ$ z?C@}^e>(QH<=ruFs^d1)I%&<>Zq2E9P$oPuLNCo^Xh*uSsv^W5-cr?5JA_VV`5#Vg z%O+RdlwEF9%C(fOek8_QFIA8@e=Na$=z{&_tRODqldV|Fg&kufkI%)gN)TGq_;f$t zVN-)d#^HLr!a0K8NT$#-8V-AH+HzFS1`2^lu-?mZttM3T)9j|>B=;h`&cEM|(0|PH zO_xP2C!DjO|I1sf6Ud~r@`6uJyyt@y-W>dGsPG57sTjD|PU7Nx^e)T5h9K)V0zZh} zc4M&sBqe&9C^hw7TT0hVvm>W2?eqWe05kn=v+SVj0iM_=R^%#YqB>_yFPk&f3knE~ zhfTk+qGxul#x~ps?cO!^D;f7kS9JxHW~$Hj#o!d(^E$VkKQQMH4@)2R(Nxyv_HZ?j z8Kc!-Sy@^42JUg1J^EUoeUn^WD>*J|DM_H=@>crPs#!4aY;QJKritH>6AvC99=_y( zO9&esGOO(_GDK%OcSnK9hNNILx4WGW(Re3{x`~b^N!D+vTx2*+eF3f&7e~9F_2EvZ z|9lBR6Ig%-2s8?tA0W`Mt6Hl;7hKEDn&;7vWIgF3RJN6}qAU+f9{uQ;+Lq(y(wB)r z3U*6!TK;LY?g4@8DkoyH6RXO$dfgm;K}L2Y?MAy?v|cm-*RnMm7~P;h65lW` z+u`eUk$eN4a^b?}Q2diUM$J8R)Vya_%yNSu>jzDnQQQP^Yv37-+FVw3JYQ8F@c_4} zB^g6tNpP67OnN!{qV^L4-ti1VtAZ<==B_KC!F`Nj#1%SbT$({!b%*!j6pEI4s3*_; zZvK-!IvfVb#^ToQX4REO0Ega(@1FTjHQ$l`blOvDx!*5sV+*7A`9N^CB=1uMkm@}V z&{OhJXRDhLJSeO28hQ4G_KUDHkzfghTpALmSF`tS{*!OZieL%HL4}3XFN|Y|H)F>X zm2ezd#pE>70f==oVKekQcYHoeQdSPmH@yYSC4iq`?h`=3K~e3ZcUneH!T1z8jY@>f z%C53p!Z~Y2MTL_{(NtKF$~^XH#Zr5581vIv@!T?syq*o>hqf9Ns$z%o#}R9Yn&iTi z_;~YWlw3hG2(`7Sf;C~_LEdvLjDUZ|X8dB?5jqrl7^cx-@ddkCvNZ4JF}sol#pcl) zLkF0z=Cb;>lkY+?df`Laq6oU*!HRcscgK6>adCFXa!nhAY6QOTX0q%(_~5ad`;2;> z4t^|bdpK^{n+?^02hL>q+yh8x-s|FIc5J6vweA|fbkUlt#gk@rS#KZeK9i;TlfZiqSczotKAY1+i>xgg|d_7a8{y!{>U zOttxR;_K_dVH)1PUIWP|c`7D@Y;XdX*m-~Zy=uKl@$-he`QJi`5Q$Vk-}lM6!_S;) zJj22k;l%sI^Qct+31nMNQlHmSBKWwDwpN0fM0RTT+hE2EQn#t8CDj8Pcq^6xdCcL0 zyXQv@j*m1qL@(n0fs`uqeM>Wk2Yc6qOg4VP--`laHfqO2JF=|yNb+5^vs}(Q5*@?& zu?%xZH6B<^fx$1b5?&7C&iPW4yCfe$yY zIcfl}-I}mzVP$z=F9MtU@>EUu%=TWMPhK8JlbA?s#3b%Q-*njVSqIp)T~5g?ZxN2O zAYHI{t)m=?8S(+uI~>0{Sz$66^P#o25aB~O;<=-2LeQW0UPk(xBvNi;MF*hW$CUdf^Y;E zPVW7V;7gMMkhFfm2t{8eYy$}qV-0K&svJ#(5wY{$K3tsxu)Pv;$8G|UhWF6ieI`{% z1shr?sy3yXAv$_1*F5c@&Wp!l72FDI>x4Y}XsGP)GdZj&HwS`>KODlvg)IKe4Om?s zHaJmbGUM+_@VF_9&l*eDQkpVCS@Y=BVJTrgoY_)iUkQ#`89tgs#r%Cv&GaCj*e$#A zOlO)KmA?IWF>XsE*ECq{6YW7j$B>6uN&2mTVj~LqBjHg_>b|p>^6nrBY{W#qD8xW# z&}rRiUe~n_3+RS}jJ-QJ_{x^p*3rI)@WYjy#LgF)x;KWeiSTo=6Fz$7tz*$-dpQu= zOFQ2}hiGG!?12mF1pkTftolDoqrHYBi?!BO39w!M0pudk^OORQ15^r)GB0>!1e5f% zdIm_hCtu$xu?vnyKt($tUrM{K*SL6VijiPn(B0l0l_fWgTg8+S$;Svsc*F2%gon!_ z!K0qlZcZmj@eMj3-x5^{Mi?6O@i;F+9=|lcNP^a4ZqvmCI^|YwaSaN+cv?9+^DO@2 zLx%vew~B-8u}f3#^65IWUL{!a7wYp%+6)<QE8MHTyNVRG|m9k}VW*;+N0(RDM7_7C`0qgQ=$GjdgT zV-yjmOy|e}V$RdG2CE8VBEQIl@N&s5S7=q30zppAJ)zfhl7l^6h$Jh8`((}DDFf*e zhsHmDJDV8z890gjLdD_eM%r!VUYKvc=EzTvHh>Ss`VfsYYI3nNe)CblY0n=cCAv78 z;9Cl}5@YSpw+DOO6dyb_=4R>i77aH02B~vV-X~Gq7aO4khwd;n(j5Kld1n<*B>2uL zU;L4wf0_T=Cv_PGp2cl(3Ow6`1R@shel+wf$mxdEfvg_P_xG(N!xbgadRRv~B^+eS z;bKxYUSC_$mvq0#SWiJ#MCnMK1lmQP5=v`ezd{kq=4CG!lSu2n2q%Mcm$+DO zz@Lm5NL*?xj;CzSUQ0u(%i_**JMNF#fMh6C6wh;KRZM^{m=!Q$+!Rw!*D($VPL>xy zpXR0dRY!P}_u*(1=DD~93zd_75@>K~_8*w9&WcROsQN|Y{XoRyzAfU-4BfFLhz50%=wu|Z;gD2r5!b%3b$xnSR3$Lj;WVGi{e1Iu zmMi>zuAzN)I|S#W@1kikJ_|z&tW|1Az7>4ESCyq7o z1u_NEW^Udrrrbnd>5E?F%j28hE5F^-hYZC~ty^*GU1et4R-n$Nqt3%%8cYy$Q((ws z1=;|vGp{NgMU$Eft-q)DKx8Ma2jHSD?lB+Cp}a*INqYtOmv6(Vp2259WT!=TyMBwRht$4 z3Bb&0h~Hu?!-^Gwae&^^ViikAX++fJl5r|K>HEKzF8k zl!OuOPeW=m8EjM*kzMNM;f)K6f#(MA^SD7`j%~>=9?&m&7F&=t+|qJ)%9pE?3ThBV zyq+<`sKf^%jj)l`79s6HOmpH?c1uEboZ6WVd5`_}q(56^cRR+R`+X&EV{muo0t&-} za5E};Lq%w4;e{myh;UjxcsiP@k^;a9a=N2Bw_m z8h4a}ncE#}+{{gQWA96Pn7w4wk7{5t5Ud5A09 zcpRH@e$U~N+kgeRv#`EoXZ1MPM$dV81~3u2EKA) z5Y`_=0qnL-&a+(1d=vP&+0oB}2sm4X;ObO)d6e9g2v-RE)9xisSb$Eb1rq9s+CeSo z1Q{AvM$@HVxNrkO4+7Q}iCDNQlj#Q&V2-yAaCL(b3u?*5+Q%C*nFdS@<<-OIacT!5 zNW+5-K2Z^ZVZC4Oo1f;69$Uxjb9^Bmc@@X?YYon}keHdr#`IFyBaJpA+yp_bur34D z$n9fEG|l5~hrfEmu%4>=z)~F-nI{EcwZ*L4rM8#|(R zn$_hI9;s|lPvHyleEK8s;O)Y@9e)&~tBY~_a)+*m1H=+OBG+X+=OZJ^OVXkXq#Y;q zSU{e=J$>v%6o|E8#H0TC#7RtA`lswLTPTgq3LXSY z*{VO9_;{yv+aL}cEOv`o_Ka z^=l5eWYLh*_krm&OYT0jI&LG#;Jtw|2Hf{t)aBTK1T2p0jxfR!2E3}&^`lRW#>0eE zMw}{C6T=-vjK{)#j#3n?-2{2pgA_4h9rY0<5LEo0mdC0X?_c8~f{&dFW=38Z)n0-- z8IIli?}}1=V5*U2K1Hw1T^IlnLvj(s_GACm}^JF2UE~rX)(TIHN_blP_vjZ- z%=aWrdePeRutFUv{63#&kZ~GSlecV1R4AwoS);xz*)?u1LpNl;RfTtBm#I zZsscCIQqPwWgB*jkCJ+Y#LohWtT#WT&699Igh}s>q8ECLg~ZED!m*jOkFrM~f;^8oeWiPjeX!GbZ$1vA5d=5xcunwsnc2-HBj6>}#YMB( z@oXQLt>sID1~zp6c4<;}BndkNdxGfKap67R%*jZ!_6LY)3bwe228NJnG7P45U+sht zd(fIF#?tY?_=g94%hGAy&p=vwwIfk)4itD7sV3!Kn_y=WqL)?RB3gY zFEz`{vOlTaq?jkI(?gp)btk)uAScaZzjWCA-LhEwq_9GNTFtnfFi`m>fGX255vL%UW{mXG8bYYmj=4vE{8O+aHBZ=&-UE+z(pW(L|CL5@A_JoKvdt#vwoByof{u$I*LS21AIETY9o zZY9tmTiEnZR6UK1*L+xzvDjE@edXpj5e+3QNhV!&k)`6qA6=|CzH3{hkA{No7dak# z^Pm@{i*{g}ZRO0akt}X`c|#FSdA%qXA%MY(0Jt-$>M}7C=Q2QObNOoLBPyh}sbo!N zF2d*0lZI2bL5Ue>GeodsDT-ViSJ@`>BCk2fX1}(9kj^qf7R`y=nNWRH(^#|=1YCy{ zl@zD4UcAC%Rn<1lB^0XcX6l<)$s3aSn+cDJCW_ASbAldBn^f!?Q1Ax6WZ{H-MtGJ5Mpvc&I@s zbRO2BE&y>0p$g_f5xul<=pvv~h*StX@%RqxzLR-`VA*AyR_c$%p~LO*Ed;|HQI~kC za3ho=nl+0d=+kguNq#W6_Qk8uX;|?p11+X*QiOz-ks=*@2dEFf2Re?o zOptrBo7ZIt3DL`P(*&_AoA-A4%i61cZ7u!=-KZ~WqmbA^W{*ZuRQQVN{L^p>Z3Mrt zLUbAz&MIDudU6FoKOa=Ij79wV8Lk%PcJ3B$@^Tq7JW{jNReyvSb^y}EF(aE0V=JiR@e9D(6!F$nQ@q` zWJh%eFp7^-%4M9kj?Ep&@x=4}QsA^CFpLR6qOB;^>1dI+3z0$FMZ=_P{yw0LqZa|Fyw`4geQj0ELiV!DeO1t_{RR7V z|7mt;&)7mFKAVGDoD+47HGrEF;@7OSDr8LA>&$)~+?WB~9bj2>*+>o{DYFicMo!M(gGMK#ylp&(!W4*hV!v^T#{L_dpZQ<4% zjt^_buaAf>X18;kwnNG`Pg*zj zS!%ce!<=%Hh3BVtw?<7{0`oJ;dbcBCXiRO3>g-vp&AfrHXYX}R-F6|Ft?^0wRuYK! z1A@#5LL`AbUlXEOO_Fj99)ES%PvX=(E|BI4x0G7Sr67sPh+ z%sa&CZ0qbugeQ;#C|SLSn5-lR}oYXvH~aBrV_FX8hAA{&~o2VuO0qz={bT zK|O(~i~g@3!TC{YxmdL0Zoi-!X~Rn#$~yjHbeJX8)VZke1~Xr;N{NC%MTA?Ua01I# z&hYaeLG6Sy0t9kvL=_u-du6QX3>19kzsD? zeObf&BsqxFk^WZszVj8@EqKf#z-U-b8}<+?2L``9?KJhCutO!$0HtAp)2zXHyi$_D9n*Hn$mC2K4uF}Y@TEp~WZ%1<+QtsPL)(LpLT zIJ~oZ5X-reB^G=7+M%nU;X%dG;})4C_yVlFW8QBwU%Wb^OJ0sITwz}w`yan9!fJkW zBy8+(I@VuL;*C3~c4~1@+iBn67ypI%?l&`K!#D)uz;!~Pq?(}dbWg?U^BByWq=lCI z8*6Q>SnoF!^G8bc>JKIDUl0^Q{@BlIr-)`M0IP^2f?3=y^i?U-Un8c$Zd{cbuFJi2 zvv5lT{Zf|$0qwV02r}{T*KeFzG=}emVQQke7Z+>H8@>b^v_ZwwB_xBjDH89?NzT1) z++L^>MSy7d7O^6#u^4ra1N#q|q4!OmXOGg@`hM3|N&b5mY>zD)nQ7PAWc=NYie9J_ zUwAE0qc(I&`@&F>@4|va2=&AGn?U}KJ2y4==XJ*12s+EUV*HK86tVon4=6m}c2I~7 zve38{b~9o4<4W#3Vh6r+`8OM^lb05MI1m%6!78TGBjs$t8lsiwQ;3+%jD|PD283Bk zq(I`0!wqCnR2m|It<`cPR`8bl5!oL8(phhP!#_FiY4exURhEn_hNk|cI7n8ykIT&bE-6al)>ITHTvt>Rte&yUf>}{>m z-w1>ZJW@}Co}Nis=3q1t)~g0pE(mztPku0niKX|qi%IWZS)ivfnzvtV;5Jl5SVOW7 z<7@-r6xzUtMy&LizfD)}RSpdSfH;o1@^d2&ZHf#ji8O3~8!UqvOb-Dh`}{~+Yz`wM z^RWy7{HZyCFk_n9U!w4z5`d95X9M1}O7DmREnW0fXwbt@`vSr`3(%AUjZb3>3(FfP zlYui<2j|h$HZ2NgC*sxzHD0wPcB)P4nuR6 z%@5^r-o65OjEy%6ma9I*)fvjt?;!w&UBv)#Sh<&^3Wr8==^3m*>oQlX6`zb-COXUN z=Cni~u{T9u9#|#w3iC{HL^|k7HSIqa2J@(o%3FDG zL9jmN(g|9MdGLHBxU^{QWR&_c|C65T3zyeL=_-lRYh%Hy3T5Bsgl;cfbsJjM;evie z|L=wWt30Up6u9Bsaf?4##$V{nadcR11q3&(Wzr)_Udecw5mgdWI(>w^m*xFP5h6!HCD7}S^U({i8=K9(7QbKUBbw}wn;IA8IOZu)lXZpozojFETcwHR^5?P7)9Q15VF$?kODf`V!;56z zcYZb^f@-e+Fsnj&$WUPQ{<7Ha-$YnXp%Cl4R>ukooPT&We=#g5XnMJ)xc)E7XYd;e zpAxz4=twgD)ouRjJYm#OmUeeKzdP)oJUTlmNd0+E$C{!w{_6IBQKy))PzH9gNHXX@ z_?o|@5S;VxOh=-se@jT2_J>`Sk9kA$Zyv8={NVRHd3Sh>{xwgE{STg-O^hw~ZypH5 z&}aUxW6r(*8W(Hv2dfp}r~eOR`IZm*?A1xeL8$mYL@enfymY)qGX!F^p{$~kkoAd# zk%uG+@b^ykUzUZcY3Zqu00W@4^<{Q(iYyIn=T~xgOHIwxv$%iV<%hJH43o!UQ3d_0--faUL$S~g zf{xbK74;2Vg1~E*|F|I&Mg;rB(%ZWY?G^3&m~R~4MKYi$nN$YO{x7SJ|CsDAgvqWY z3~$MOijElPABFSZyxxbx5R}J8_kL43Q!WSN+lR-Zq88b4U1XvyyO=$|Whx)3!GFRG zteW1?jv4#fGhdh$bhiw9@H#I6kl0@q?bpTH$9Ac&bUi$<1 z<~2zHboI&6^~xagg58N4*=cD6ELsm!A4|&qF5Oc)%s6AMb~~ZmmTJzq-!`cu{_*Di zzNNdAqwrL-kGS8%w}Y&P8RvsJO_h41mJ)c-Xk$}k~Gf{LP%G(7)s#1aq)R1_nB7bcWV(dpg! zMEbub=wE=o+W^PGZZiy@mZA*0`m;Mq2e*Q@g8P55O9~Fw@(u!|^{CN-uEe)_XhH0s z?Vx!Gg~QwgfbN|+{;qInZp=*c(_6pNg+{4`K5Gz!3_^R&66Wvr!JQc4<+g+L{}rp2 zDpq!+PIi_Jd`_)U!*3A=7~FxqdCR#)4%a5{_dpK*DA?w!vJ~*w>q7c}-oEPpv)VMn z%JqP`=?AE0Jq7t4$2>bwJAe4&Qs~HKGVRc2Z}J+q*b-@qut?SY8W*lv@O~t9#{N&? zgupZtEUzu=r@za)+Sh-wXhNb)geFjsg`X(%_n6Fuyg3?>c0_s!GbSN1BHlS8C5`L< zR{=WxD50?>ZImekc<0AQ$YX&KiZSto@hY$K@7jD#5j$?Kv<7d zyGrtfpN&5GZxd`WX&Z%(Mgx@Bpr3e$2)Tc$(seqmcR5?mZz_6qCCW+Hpp@jcsj9yzCoT68R|5w=Xe};yeI^6L+c$%+h zpKlqUaNRcWy4vUIjpy%N{pF0$@*3jqb+a=S_1k9rcFRIj$*_{YN4E~js+#(wBOnuR{e`dtUlI9Okt0b2*RIz* zPa=EB=4WOWHev*AP;i+q?dq3pc>f@MWzZi{88(C30u)cRh5}-M2Ie6Y1XKbO#9(tXk9L!T>31|mQ%5MV@45FWh1F0Jil1dS$NABhmHar8qow6j z7-bq&JLD^KQ{MSpxsN5U1C&W_U*kNJ@F}gRs0U0JF78g|KgBFQ-d!9;ajpGSEmZ@W zjAeo|NWP;mH+Fi)-hKT1@^}$NqL_*#hRj%5(!i^)YcgQV+chi`arBdEV5yv?h`1U_ zalUV*@0XF*$a*;Q1L(Y zjzQPLzP8LzxUr&npWX_9-0{W?8ynlD6BZGV+y}}D`m6#QR?TcXp6ZDl2Faim(sHK@ zh60+`!wi*94R}O0MGqCCVno!jLPzL|^H>VyzMWk=n#xsJMWapiu4J7n>f)xHK2v%w zE4}=OT@OB%wyoFMI)u)aL|l7_g15rH`JYI*h?^h%+D^Ms&Q$rI+p4RlB%+qkc?a<> zFpK%4o8-+JM{d{EboGp0JUyE{4Xvt{^)*cpxli^6K@Of^9OI)3b#N7rD;8?G)RW4n zX44vpdGWbqhEd`VDxc<$zIb(3&`n3ZU#91rf7p`iao^`@92UJ5GcKe>Qk>v-L`!D6 znC%Mn3hktr-xZh>b06T*^_m#Vc03M?83xvSLUxAfcbb9qi~UgQ4KF*`eCQ7z6uE~H zVV+?htl#j5R=QrYVk{(E#)G) zBUOLU19MdKGMgpkEYK;HtE`N`(DU#KP)fkFR_wMrT+~$Dd(FFR#c8y;`771cfzCF? zjS-FakoAQ#6~NY-_DArz*d&ev)Fp)pRbmO5WVMVZU8mm2)m0ufB%(62T&dprdirF6 zZxnVo_`OPHA0JPL9RxF%=@kSUH^i0!kE|VK6;+Ei-c(zFE0pFl#7a6ACum!-x?jf~ z57r9(!@u^6YEr`mQBEkH5F2`@Y|~qrPnj$W@J#7C31kU0S5S0)0CPTjAFnj2>Fb~1 zUQFSYqi()tq?ZGG95CgpQ3Ud~K6`+IF=GzWZQJq3wZK>sLc}w~d}PWE0>9QgJDV!B zd}C*KE;F_lN-hd*S}p+B9S^?WDHM-YNgfsktf9M!K+N@znf#vh9qu%88N2gmqGxe2 zUcEusjCDoXKFzWo-WdLC)P4g_{g2r7^96DB`BtP?`91Xw`hwTN{G7H;xP`S#f@VwH z4>##D)&&uQeQR1(V-1^vQyh73T<#(pte^MOPV2O%|G;PcQH05BE>O<*8MeR8KRMXa zi@4fNGlu_KL%Z4}j7h(pFH?^V8gTE(I@|7Az)xc#IAwZm&9YYl(a8oXFJQNgsP)op zfz!@c*E7oUcX#bLuFKm(2!puDGsHZT>9T9{Yn~H#YMak}#&Rvq5tAFP`}@>;mr&%h z4lN4}g@BOoh(_=(tnKl9#4wHsib7pa#`w$#+G$GFnNj;oWA{P3-9aC7*JX{_=%+QQ z^z@oiTadO}$_37dXlo4_yh@jK-K?5~kf7~lW&1torPnyo1-fxvtB&V?3WaQc#6);2 zuNgqYM}`P8Tx6gei#J5p)B8?~chy}?vdQuZ<=xU;g(LAyM+@4;>{zKs;6+|^XTW~9 zAri;K%yIm*q~pm!#L?LuA*nRdgNzUz$2&q#B)8<=_H$IqSoBb){6dT(yt z&AxPn;_vAFPTLmv-6Vcwgv3QL{yPkHnRUyDiexH|>*Mm-ljJlTIP-xyE2O=FhSYy4 z>q~O-d+g+ev4uA0U z*Q>7j*-0cnY<(`$C7fd!o8XbU+LyzAsV7xb)!d{Q#Rsb|hPY;#u;G@UGhLkJ5pNqQ zf;H;LW~JGe7nwi!^(*47%~)yoz&?JndCtW!WUa8RXo500MD|57eCJX;lnBBP;Fo8v zoe_fNv+h0=GPJhFwp&Pq3$$Sr+yo)sBq+_3yto1`BRH{p5SWAB_Y{8wGn4q!_(a5o8FHQ&(vc({kxc;+yv3LOqR>xAr=SX^j z%8RUe!>j~8K|u7MwLgS@27A(2%e?ye^HARRKE5Ml@6G@k%&xycq6#cZ?H|tuJnack zJ%tt^DeJEPkG;2ys_F~dy#-M~IwYk91f-E}q+2?qJEgn3k#3Og?(XjHlonMo!IYLN@i-&N*5*Dk;v4S$`dxmpEoip{bnKWifYS*P+8KVnhmc#s!Ac#mlJI z;&Yv3wAgC3VGCt#e1C9x5ZRd=p1(0Uktlri#>vEWPk*3(E8D&Ql?|w1MvU)hALkyC%T&b4|UupRoB~1oNid3 z$^+a^F9a)rbc#<-iQG=^L(GAk z_Z3c|0pdW6sM{+4#7pZ|rSm+Q&c1I1R2;yv@eUnv^WwvtJ4SzvNQCUQJKjUsf z(c*OBSKSU@cw63zzN*t5_M`N10!EVq_-d^°JPOJcPUq(-8;>VV>o0_3LMoe3%| zE4~BruczVg04B2<@;cj!57I&e%k}*Z8{LIRPq~J)rf7=2cm~?#8v?1*eyyJlL!V}D z;${pSw;Z&y$>n2Az!8SN>N%M)w&y2pSIoNz)XLv=#>B8m@+%2{zel~_j1TqPPg;{W zjTm;cE26ZfyrFNz)0=15DBp3Jm~tY~_AP=r)jC_7-)i$k)JsvU$yMx?vx%p0n=YeF z8P^ELNBx9bd4JsEhK)e6pTU8KD2R?Q!V~p617W~K6M-Nk`^V4k(PhS>)z+Y}-9B2AzGJ!SB420eYof^)VMe7pFdwhMK@-u>Ji~1$Yc*OM zsur;L{IX>m;q$>2)AcJnbE^k7ap$>gvE?b(=b89wSIVM+hARw8s-=@~gGh@QYJcJS zRVd1k3@v&<*@8yIkYQodmWV0dS&m4Gy3CsKIPCMZmA-HiKCGj8UrMFGu4avwxy>WS zRWc@jFFW*bXzm6xXPBS?4y>})a6ifwI>PLhrz9Ju?^GHz#Wn;!v^p_jZgGW36xKh> zPmJmqCz0C7nfBiU>Eq;2>=O30w73#;#WTZO=;KHu;xDx0?Avn# z{INgbjm2_I3*z;f;PL9MFP!0!z|Lxn|M3DS*Fox?t_}HO$uUukFMGc6m|@DRx_YYR z+nN<)JeJP?imTN=RvOiRS=({pWKcjIIb)rn`S@Fl57~Z$U{UgBk;w~wT?uC#glMvMV#q1%8;6?kmt1TQ~e!U6pbIpWvIrON~v+#nsk)IiDH

a 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

>{v8wi02_*rlMdP@FmSJd`J`mjWA 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 OpGV4Ir4of_LH`Gzt$DHl diff --git a/docs/images/rings-current.png b/docs/images/rings-current.png index 472b49ac6d00ef4cd16de4e80130f71e395fdfe1..599f2969791e9f9b2a1f4cba67db48a97dcaf7c8 100644 GIT binary patch literal 120069 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%0DolVz3u_;g?kFGa>sl_^a5_ecNmMPL)`nS!?MZ` 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%0D_LiHx^&CQi#xt+l_K0dxqan*Wo2QuKiY=i~k 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�vs?PgP`vrn(H$9Jz^`(|C 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

fk3Z@3C;$wZ>cAgAx#*RKKG&{TVy5eS%fwfpS zPR@|{Hmj3*rlfbehB7Urbdpspw(xvhTz%lHWE6b`Pkq>EswBPH6l)%-8AsIv-L}}F zy2w)+zH!*SSiBzJnW`rl6!RFlEZ*o{|VtdP=N8CRh&d>U#D1y#vB>sm4W z@m>7=sdpPv&b?u^s!?f+U*jR?l%q3}_Vv=KF>?M7l%rG{1Zk^|An}w1-nB|(tTGUP ztzL3^xy)D;7;9|w$NH(_9__#wwVtq0)#Qmu;!Id)j#>h}kE~}7*DEjBg#C7ChK_Kz zSa@%qs>wunLukRpFfgknmYk|t+7PPX8tD#QJ79- zKh=Aw*=;=F*j0-{mObfrIV&Eq@yBT8E;7TDnYH_&4K+9SkA1At5=wU+Xsg>sFIA^n zrzz}X@H5(WOr@6kaOd}Xw^4AahvdOD~$dEe42bdw6ZQIi-;yYwM`?6Wr4m-#|R zwz!qi?4Jd;YI_GRH?Ze4Y!IlUG!(2@AqB53uT@KHl{Df>`ERKXr;jkgKHj#EqG(kV zm!?~iwhF|Zm7qEQuJ`d>rScr}?HaF8D|Lh8nDMlXLPuYvyldVHsu|}R57J1DwTznx zr|W7FGc$hBd_18Ci8x47El3?Fw@I4BGLTS*yn8}&ev-2PD4!lXHWa@v6a8^d2>W~# zjH1lCATf5as4Y-3n}&>jHs=I^v06?tVQnr1rOpqR*k+pc`Qq8NYWIJRrIZ(k&Gn62 z({d&;hA5loM(@eY>XFVY2vXOFoEedvi#fW62tL#wlbCTOO7@xh&7u36zR_uO%C}#z znsf?Y&);n4-wak9GU7#3`}XGS`YCG5PW@GyPp z#1VMaOM6&g5zsexTOb=OkOJJDZ9P|Xrd_L2(H5%)Uxw_|tE(8X4+%Q3hQpQ}vxGs_ zqA1IB>E02P9y*P-p!;KY9jF}lYExw-g!_t|nM?!8QB|7G@}e59nY2}^&LW-NOs?C` z7~HJQknbYnN>uYA%JwPezn-w+iM}dE<13xn)YVR4xctNtBuVV4O8%PDjkRp7@~mh$ z&oCi}j>(cvRhs$T9&wS1rTEaexDsFOOk!$v4d!e%Wug7;50Qgb?>recjYrLLjXtVP z@N>>EGt5YtNnStW_tK*6_B?Uue^ih4kTUd6@|W@*<%uCmdL^r(n>)#Lr03EM%o~y~ ziBlC$E9`S1K{e45(j|-5kW>}H^#Xo>L))|fZWK@=hVxka+&oO?2q2bD`;e~FZN}qD^5&Lq7zLRrcIn5|+sXynyTAI`F1}aP^BYJIXsZdp3;< z)1e`S`|74Ez*OxUHLx8q1*{PDhWdpoI+}zEQj@Gxlunv9OEM@ ze8y0V!`vzM;X%lE<$}A+=OsD~hOEUbl#efkM44H48;YeqTrS^jql{npdMSQg&fz?0 zOM0c;w(~L>XIz$#TEiyUV}5E|?(`y6bB>mN(?x|&_d!toMiMfzB<}4rZfl8K?|5T0 z`_;_Un>T{XZ>~<#@M76tp??e^iK6Q+yH6oxqFtRpTJluZ>}9WA>GYbcuEIHG*^{h` z)Fm=3(PFew-l73w-(CgZ$!L%0H(xI~c_Uyi@1pN)GT|1+evz=z4>pk)JMpxh->Z%G zrD#fsS}QORyM3)IayJr(ip&3Wd}e%e+bUiZ>x3>I1U~sQ+M6}{&P@eK1gN!!KgD`B zGwbJDC#|s@PGw&-<5*!3j`i46o=~Y?OhH-)1 zwNd>8c)rL2P5B&v_Wzr*ZUI^NGwkC(k_G>!@8wwla$OBw-RV~W;Li)cNd}pB1InyF z4%y#t`_t2aUY;=j$BMtl`TIQt)H7^Q6_ES*M^fwG96R(Ayehz={ONa9;NSNi`5VA1 z0k1ut{PEiFUkg*fc<50|x&PgHzu%)8l>?OkW~`C_SqZ>}R{}l>Km6a7093|pg(L3+ zEUmXjB6WZZLVX~axytuzP4-hvp{paJ{SCmD`Pcw-6X+JW!&xhA07|_KuF{QIH2Xu-xgKr&ehm?c{p zw{yd3^hRF&j{(TS2LQMl%U}R%?`k+5?XzbJxt0>TRB;2$dBI%L%dglHLX-Ok0P@_X zqHenMFJK#-$S=Wq{9JseyQmZ)f?0~hNxTjaEJR~}_=Kmc-s}!&Jzzht+kR>;dTwRr zoe2DaPXA}|p`*cmTLkV`Cp=@2V8 z2dpQuPrKG{kKh}ChKuureo2Cf^zrY`fa@hN1cOY9phbGwEMB1$;L6*00UEcc+3xm# z`^QlH+cVhP7eEim)NOpd(G#I>3ofQQgSG~zY0%D<*s+mYH3yBm8h}Jb!3_}3d`h66 zmM3I@vz4wcc1)(h@eNbp8-z5*Y|Neeqzq8j;27_7B{J`$4*ANXxLM}`CR3k;dHbe{ z&d)4Z(Rk>pZGab1RI!17zY;Jx*zpm_LJ=1MK5UG(&|ZOR55O8#&{484CyVCXbm6F3 z>7Kh?yXnhUU+(RW7ot#Ig-@n@+kGR5UC#^1_PqN+Y?J-ZSJj0&=oacvH#K z86#Ge4{#)J9pEcyIDvOggw1@yHzbini@*hpJVxjFv;rkl(VYYgt;dlL>Hri|HP?7e zN$}L*8m1{V4QNnSp>G}I_6^*oo*H}Xd_{%es^w_V5JT>FQ+9%$pqAS)P#4E);X?r(nWQIa~Nv1&-{;S8^C#Y-|CXk1swqEbH;kT?Iu-l zD$qIr@{z@o$7Ypy$eDuM=m6kO0oMq`JK{1_FRjuYH*l^I-I3-J7beu@HBO#ob22C zo;sOX&hYPlf;;~)zAlmN$^=Hxn73r8!3dpjp3JYjg1g!y_aOIB9yZHB@t{mw@J24O z^J1x|@>L%Iv!SW%eS^my_7Akw@zxQy2p)g-w+7JuQ2r$v2tIQxSYTydUBpWd&XssJ z6CM{G#vG;e@Y9UXs%*n+`p{9(wG+hbZ7eUByO@1*R-|I_blLZN7kTh~g4FxmD}FYB zKK6b9&hFL~=!YRt+XG#0(_dOPsF`2$rusS26p{M?SOGN?6{&|=yY%_&h;Myn z^%-1D-3u^#Jg_~04xwfxC=CM;pj`j97p-}k)PIgQ(088_k3!JQ46q=FAM3PhtyG@* z56TcRo#eVbC!@qriu9$3WG6sB`fQYmgI5l~m_?tB7L3Pq3hygu*tc;uS?`erHejg5 zLQPimyLJKiU5DW1=xaA)4UV_*Y7W~^Xcp3E1bSZ3AWbwJk@fpUkYBCbnHrNKC!J{2 zN=Vr+iN|bWI!A%ITsxO)I<#*6_qY+Eg3@9@8KuL&NucmQIci_|bP4%D?K0!x2)Z_d zSRlKO^3jn8hz$f<9xOnQmpFpbqZcahdNEe;$RG3L*HL=QT<03^Hb^k~bWlf1E$E;L z&anc-&EbmypH+zuN$cmbUbiRYpnI%6&u^=X5UP z!M`XONdkf}fFzM5X~;P!3L-%i$!UEo)}PL` zvT9baFo^c)Q1asv%WL(CkCNlz17D`f`r5}5BlyXD=WoDD;4dULvu}iIY7$F0eU6+2 zxkLAz05)7;WU#;YCzX-^I6~U7W}o6JabHPnUh+4ljio=BlaFjreqc=&TKfgkkXkY^ zTyebw*wgq1{6|GTdKnb5Ehy<9J5S7opVrG_PZMlHrIgNzrquBvqkZdrYBz|C2~ZnG z0MaHX4*(99S8PuO>k^*{xhDD&rIxyTo6{PdErw6>lTwa^f0A>vrV|EZp1*I}?BLRX^s>w(Xb}(PiOk|LkMYtr43Zx)nqb8j}U@6Ro@2x#c?$A^)cf(xI5 zFtW)pE}Or-3iv&&**@}&OAiZcPBPK4b%+a<%GxD=d-)%p3jZ~bB1KsD&ipS8=z|sT z5E%cHWnJHI{q1o0Qe6Pf2+ril+y5A}{t_6}R`0IIF}TPH9|=ha92NeDEBAH&W6((k zFsMjDarKG3?_&oGfdgfQUD_5p&XYPhs4d8e;y*X|3CjBVlLYXG!29W7@Jx(3@rz>> zAp!v_ge_X}{D%_*>c|1S2T6_ce|Tf?b6`-yW~b8FKVJu!s)GSgod48B=6?(dJB>jQ zke>M6J_oNOQMhmzAPnXlVF&?RGZ$Fq?{#WC-JF0ibsNGabOME{4R$#r>M4Jb89@SN zpf%(Q)r&!iq)@5xt^2^becn3eGNHeE9x}9#OtC^5>$2x!(;@s9!+z)39SbxPew0cB z(qUhUfpqz4cgWoQ=A>WYXub(7=gf-P1j`)ARKH&l*-GX*+?%37Yl}n&&a<>$GB7-k ziuQqnc0V2KJ^(ZC2Q{VYl9PBhUV$3y*hi$ZP^GJS(}^_npY9_PP70;)0BHN1YUgn8 zjr0+bNH7dn*ALW#!>nCU{?B)@J35FIxl#m@RyBpkU5z(qcpj8*y3gl_MiO*WhH!U# zjIZb1m0Z-md4)-dhy5=%6rpvhhdk&_J#=&e=Z{9W=PZBj{nAe?#S(w> zS-=y>9kQK%096t#icjpQI6*0ksi5>d$Fx1BvC(vLX#6!WurXaHD#H%C%Acnjh2-EW@{V@lEK6`pS+`TV7 zM_yuzbkg)Kz(Kp|24TKC0m#B;jB1$C-$4ssqYLn?OomVw^iT1qqIT|F$eLD%5%O8R zX{6|nl&AZ|&6YSXJmKj8J8f_GNl6-jL*_y*^H~FWDmb4f=oS#Rsmd41R74D>4_84n zFpL5`f&T6XhwE`K>I*JWt+Y)#fhGyfI)d?1G+}ckpUe`~At(B)eP3?xGfe|+s9H8} zscbrI0XPVYou`R2g1IYR4TEQLplYtAu(ueDWPjR>hyq}T(ZP-N1t_MOIrYk3OV$9u z1M5&8PR>L*(t+qB*w>l0P(jrc;P;g_#csUP22c(;OkpDDDN;I%VE4krm&%4-P)#ew zG}6o}+;G3OxsfF;8LR(avo{LlwIoRl}zvg3y!$ax3@(Fm- zQ;knq2>Cc=6rtjeI~ThEtR>Yr7pFk`+m~4qGwengNUhqsVkOJ-haf|qsmcc42eMEx z?*g&T5F zj8kdY<%JT#COhOjG@Fv0}`+2tPr zD1e5gONAa|i!aUv_uPp~8&_aWCbw*0;Hfr!aVu3=!c3!CF`z_GV?gemHlYH5SSYMi zxPML*ZtRsv>oUrlsS(P&S5UcRQ5~p*F83!h$Y99IAXKOkW!8nRjU2lMQX!0@v^cVO zmPLrPT4dc@#;V&r9GM(GSIzKXN8-#rko*bg#9LbwQ(xYZpwWcl94uxi@ zXq}XpI$t$BOF|&E^qJ(SeKdM*CwBHRRv|Qm5uY!|{9`nnTtD3E$n|5FwUVqZdJW)` zOPeU2>F-=W1Ni9TUQcX|<87w_nNQGh0zwh4x82`I7X)^Ih!G{YhKKtg817u}GQr#g zWv#@G2^`V+i8HL0Shf79H{o7ZuA3VpGi)RFP;4&bz$pPK(D5@9{AO z@Q4zSsx%0=38b$k`|GITkgjqqfBn+Y21$UmOm>Vg8BU7&UyCq#f>tmJ4B7iWwXcyH zeXi+Awsm;Z1`e5m$smGvwuvgUr|L5{4@^DfDiog_6(X8$i_x{FBIqshag;l1z)zu&rpo-@-Sa7Mc1vaYkN*B1;UL1~>NQDVcyI8d(aovR8TQRNm0Ezpa>=SX z)TJ8~=ZbQ?`=nAW`S+te+?RWPWax4L z(AKlj36v{2)OnZ zuc1;Oc*COIaob@ApuI--6Rxs(egaZsAKssA)^t9i^4k~`ZamBT`x4+7SIbP!&G`y| zj(nIi>~S%ZoL8&qbpT^9R~ZD4{kYhHyfcygC9xD5oABDxLa4K0X{(*wySN3^>Ub|YWWQaF%3?7D1J`?wz#oxtL{MAAa{P@(8 z;X!Z4uf8Jj>nU#1I3dgqJwG$U6L0+W5ovNtDG{9|)#7F1s>##0dB--WL##{~k$oQA z#lxce_+gkCFqQ*$7Dj&F`XV_QfGtmg7nHWATPZfSOLKmiEk^ z<2_f3fL3cSKIPdacy|)a+r^;hd4zn7y+CGVU>p4p;uA#{p#^p z-dLIaXb&+IV>t072Mj#!S0i@yNqc{?gRIOk2xLIoi1TqE)0dG2{tdjxUJ_WBMxNRr z#2yH%*8j+7KX18%Rk_c*ccEX=5K2m0Xx<4 z7#-&|gw+h)SzsIE+@UrKn4C7FKYAS^4iD5{hoHjX4rRsrDN*z}EirWJNlR`Ka$rMkc8^AgJ}6dgx-)vuO|s-9q}?cDma9dK)xyVlq% zfYBU+ax>ZfCBhbD*JSbi9-~B?ch*tw3dgZG>A_78bfGudUom{0?S!!*;;U`yqYy(l zs|CMh!!mn`&cdT|dP)SvPP5bjyHjyv zWKBVD%UrKXE$o-fY9z}H_6kg&>t%Yz^b^}rf0H8rccfyL&R6@s&-|2`%%EV4<9f({ zIR8gzwN3Ayr*zu(9b;Jj)HMIZ6_l`{JKjq-seV!F_u{T0&H+u?aoA6S@e# zjK_b{c48jCKTboTmDA^nPrmDTXyk3^%d_OqjuAgkOx6dhi4mLt=S0komD%yHpoe_3 z8Ninp*)AT#?*5B@A)v;rL&Ub@7&!I>^<*&Apy<+V)!VVG{tl^v zhcf-Zm)U8r2>+9Qr@@|0BY7473Lt@bD`ER$t1({rb3ZknAptb+KVcgHq?QA)xU(R$ z41xu0v;+u(xfh-17Pt&+s-{Y;J{7q_V2JLZYuv>!=$iY(>g)P?d4~6xJCdIrx`UU| zCW7NnuY-_o6P4|9Df5dlhXGa=LLONa?JVFj% zJsXRPy+U-eilC8y%{t&I+R_gtalQ@-U*Ot^P>80uDfh`>@XMkxb?oo-TAqm?A218Z z%|F(x|L|F{4;sNz#n2LG8A%DgULZiGyywi8PH`p<9m5khbA(I@#69)yB_3-;h{cev zNfEi`&fraS7GV~WgQJIK#HiwuK&v9gX?n%qh1LiR*eJ!#C6urlL?jA5DBMT)1{Tu zSU+_*N*$zTSjeg;&AX|5OpI5QO2&!9=I_0#`}^32CKC{Z^ur!^?`T?-OkOnXXgchs zNEUe1Ir=QFYuSem&hL_Z{}^NYNW^4i5n`!)#6*4Ub90X4o+`c-Pa=>{$>O?7vVr>8 znNdqSxy?UwJR(2YNhJ%X7N<8`F#3MP%3K!*!YknM%lJDIKwm)_gqV%}fX}XjM#i9N zmw}GB&?SuC9oo3kpg2bh09&8T;CJgQz`Mw%bN%eA&~Ic{7!G>%^@9cg`jCvcgCg?V z`rtr|jxsVj$uK~p(OA8{v6g3)p@YEh&CiPX7o*<%Uj z7` z9IzwoVhA6t8FRz>5cJEOvH%y$uONU5O+#?GU#YD|JpsCF=Dgp{eUBgi;QQSN8V8`K zY09mgV&x&w2Ub-QTuYrQu{9{$nN8GGjoh1qu&J`+#2(*VcyNe%puuKb_XQ7Fo@VMA zk}fH8UwB>#o>b3pLM#a7$D*+MyNke*=B^HK3FC^}NQhO}5ou4Gox$^=Bm~7ty;7<1BD-a0kD_agGJ&^3c z@x_H;9eYNx9CX3afPm?8pu78i5S|px-f?rCgf7<9xr-d8LxnXUK*M+O7P ztQz9WRSrj436%PdHzx#5pu`*tK-=I72(|PmKn%s?Hn*FlYjjGjwEHAM$JxCCqk7^G zP#dB9h(|A^Tgt#(?|9F%`AhsZ+94uoFd(=0zzvu_WAY;ivox|xhi(F3lF6eG>xmAYgk0AJzPCT?X*Dfaufv0n`qCi8C=|qg&eay)nMt$qRSU=vQ}tjy zrlgjJ5tI!8!TE_eFP^^cIp6cLAGCd--m-%sDtrYsD||hwp{q9KI%5{hE$?dIYz5n? zln6ohCIVaU4r4mC$(>p+N=ttgfe$!?RI+rNsO#GhyDvbI)W+NC5SWY6mnr@ysE_oA zlk{@J^zL)d7t+CPAijPIo5zyJ&N&+>!ff+kZ)5>NhTJ^3RtvRk$XHJvzn30*XN*}& z9QI&V2l7L6{Oa8gKxPXMAx||Q1cJJddN`k&v+Riyuh#bJhL9&Txu?FQeAUc;i0Nw)}vU_lk=#3}DUcyu*AeqPIdVl~X= zc8B&iA{WqfXcH3G^t|wD(_aqpKZZsV3$jdV@Eu|StLf=8Z0qmZxnD@bU9adqrIE8< z+QW{yE&_n%jfoPLitu2D@bgLFdhu-HLwG4_av8vn-SV2InSe1bxOICNK(XfPDZ0e0c8PsveAnTCY2988{#&g`;-AU{ZNhVV=RDLv^vy}_doXD=YsAyoJ;rTM<8^@ zn*l9BMJVxF)EJ-4cyi#eTMf@ngpD(6me`KaT)vPAo@ds3Lu^u>jh@g;;2%?$~|3>-ii_ zLp+2Z_Hfr9ihpy!4B56Ipx@nI>4V-k_84(@(O zn}k|;pDWkAo=#vI&nvSH$azM7JmtqesyWn)8bD34uE3M_>XtC=+NuDiU$Brlk7P82 z_pGJMa`(<7A1NEXJ%O5ifX!+Viskj>wAGn_%VtI-VIZ!jm4(YhfKL3H$7^1Z6m_5P z>yCBR+*KZnP@WypS!(0k3YhHn4$kR+ z?7M9kz0X`36hBKn#C>H0&hCpty7~JQ|vdAx2jN*-@K3zvhWW3L);1_^){sB zY2rjY?Eo<)Cq~=UmGAG~SKpDRlel)uJmPUQy1Q|9(8lF9^J`zjo>unX!D=ZnwAVSa zWdOT=3Uq%;WL}=vlJle4p#)LXekkduNs@-RxKh!;Har%G%JmM?9dz{@r>=st!N>9p zKl3+y#arrJ@!MSlc>y;KL=F}R?@(`5fQ(4_I*~>%!L64t3;^YOhnmEw=xZ;suH-=@ zhXJV?#$@~=?J8R^~<7|G{&ez^VazRN#{anJDQycVhN>pvgGxTGdnk?;f(~OJnp@>fYM{J(+ znOIPM-?`qE&E+45%lWljPVtt_+Lk`GYcbLRGIzO6x8wuep1Nja_=gc+mBv)!M*0(S z+G_Ds+P`*o8L4fF3ZPwZ%zx4FrtkZbVRtwH6@B$EGRx9OfjG|bQU>89#4U9g?JsWa zvl$(HThO?^a~u!-$6d_}K~oC=cf;@50(kvP)HNtpB3kx>#y#+wW+bqd?)pqN@m1e< zZE2Idx^>8$rM{9zK};cG)`M0b>gDeK`5=mJ3w9^Y{gM>1PdQ^#FJ^T_B;7j4Vy{)l z4NSrm9$13??%4oJ40(y$uC|>{02!~hxQF0j1(x+!x9u^a9hqdyy7L9FD*IXV0IGr1 zd7Ka)tPrWuhfcCvlal;gJ;(tr{=q53?K;XklIMq}{nvtSc;2~9$y!gxM9KH+;TwOa z&~0m5`eggHJ>HziU95+Ldc?&5#P?3g7(uU%q6I~Br<3mXS{^4tWM0tr!)a-IDiM^R z29ma5>!B~MqVPuVGfzT6D9^|ViH>{4Za1(Nw00+nM>+Q>u=+0=Yo^%!%N9p?VgRsm zhdX-Rt`A;}^C;=Iez2+N(ULniEVkCdRJ>3oAHoSk*i)amKf95bba2(k2mGw*wyg)J(D3dO4i2(jFvC$;UMM?f9BDn*Tea?6p0H(oU`FB?R?Ht$=6)1uNQQ^z>!`P9B|Q zcOhT+%lU!~HK=)^QJzs2YPR@126DV zeb=iLsCnIiGk(t#7yg>oe*eL zIKB3Asy*894uwG-b{M6vGu$tDbsqQ!mDymBQWQXR!Vs* zzd%fVGe2ReAS=Z|Ww$Q%J-gl<1WRXB>xZon!N#%YzjNyQhtZ(4)7qybpk8YidIJv9 zwTT9$uM**qC_P`q)gf0cD^(QEeevVm?sCYogPO#cG=Vmsp0Hg=tHyQQ!q?O8k(ovU z^LMoAKnGDJxrESzmJ1wo`}DqC1^mSrZ~>bs5xy@1>!92q^_pB(&QienfqsJS(4poU z7h6Wl;3d&Jt@!tvw%liSN=k+GOPfuC8%}2ry#=Ue% z{eAG2waY##mR{E|vL(g`K@k-7BOlp{h@DGK*tBs=;Lf$R*abOK+bk~pqkM5&E zJAtgS{CNar@2L+Yc~6*=59$Oed>P8>lr2N~`~dp_|H>c)hHWfD{WxE55gO3W6vsq!V%C^N`x z&D&ivi5yFJ8~4Ut9h3Bi2Uh#Wbc&S%Qk>iHmn$8C?4%ADiiDc91f=%C82D^yK0p5n z;U+0I+)h?$x|Z(0h?THUa^*Q5X}FGmrobBoQZMnQLt0BN+0;nFQ)i0BTMij?nezi z$$0aQc|(eiS%=j5?Z*1G1R2f1RoLm^w>4VVFhhPko)S2m^aOCzh5NF>y}7AW7M!KL zUnE~7uhKIvDhTf|wzcB&u-mR;hD({ljJ-K$pmx1!;qh9JPx0xTp>=KCB;mE14Q3jc zFFrw$>hm%xDaUraD&}ysvyJ zjq@Utm%MWb)dDEc!*5^z!E7S`tfZml=Cs46_kd+MQ|oEoV$KSOucG1XAL9mBC-9Zq zMTAUwydK^h(!BhLcBmIP#-dbrLepnBV zj`RtU#pjObPrd%`+nGU`>=!KsJICoSAixq4apdwA5@xP?+$$rh?3s0o{wls>EbQYuwkP$;sCm5y6PedTEv%Ne&U{Kr7u>(Lx`=UJbOVq;5+&Q z*~c=%mL|iB{e;A)btEvcYJ*I63sZpS1>`vrIguxA37Ph5HlQgDc$2&7L}I|NI@6ht zjGXnEUywrN*tKXW+^xL*K6P+HKsbjEN4&72caxm4B7WS!kmHvOg7FV9Owc~0Dst+z z_bs?w=t2RGe5#hFiXLZAhp~12ShK0h_^uIrND2svFt}(^(K|svwLj|layc?`cWCaZ z;@9+awMCa|d`F$M@MTOaOLaWH@MEipRS70n8G8hxxZCye>KB> zm+yi-yknD=D}QNWObsci`Ae6ors-jf4Xv7&KS~@)6xqGupji17qmdGhrnYZ9NB3Ke zfF)c{8+aw1{mJu_89FBXJ`TN+6XAYOPOYJw*2`$av-eQ%(GwZmhS^W9x*hvoSUpL1 z%+i^a7w^TxnqOQEt}vE$x8)d)Prgf*K_^i=YI|k^7hH{Yi=CJO`MqEykRo#mCEW~pL%dHspu~&L zOAe))mVvQP;|lTxM=D%!5W{WX+D;rubNarZB~u`%3(RvtuejHp`ry#5*sx;GwT%56 zWtw4*v)TLCf#6pUlJwJ0Xd+3D6_DNG&zj=;;_lXa8fQ-s`nvyqeS&E3n-Cib_Nf}j z7nl}-&%@-A|2qD_6hYVMvl<0@RA${Nw7a{z!$m5ZXQE~eO={j&e)9j0?--2M876kt zvldYAT@s#k;K`R>kYOQYVghww?nb*C^Eh{OT)&pjWz_5MdcNr$qqwZ=q)8C5dU@r| zSZ7!do0kKsOFuc~v*k$|siq}kkg+J80-fm1v_QA$x(tQr%MTtrfJu9MuEAw951B5d z`QuW?NxCe#|HV0CtO&GBhwlY{ z^M(5r@bmC<_gvKe?~ndxLVTDgSFbetsTSt2eOuK~0p;sAhdod+a=dEW=v#%&~@JCTCcG8UI;P5Zg&L z_UiHWvE=|ce?ceuPWR|9z8I%Id}S+)x~uPYKYH`m5w{6ulC9ac^HZ;<8KLibw&s4( z)-)I~k^D8^Y7892!ZUlRp9{aIl{S9bWieZ%yJA5*b^X_1ZeXxhwcd&ohs3d_A_S)= z6`RVfKe-9B7yn~CJ}g3{Nt%el zF&%#KK6#5;nsj$tp5nj0VJk*{$#$q8-N_0tUtA{NW$ipQ-K6}=(ghbs z>tbSZ)U}y*2R7aqrKT8nlhdj&nY6UoJz>eCV+R16gi3A-3ot~QFxIJ>4(W}&57KrP z_2NotW>ZhKjmDIT@%YV_sg|m?FFb@3aa8;kZy6rEA*}4!u+qI8@W%|S7Eg1Q?Wmmd zZVG>#oW7C3CJM2d76*(kll^a@_$4oMEP(OH90f)xpt*!%Z0tn+7M=g`Dd+(0W|`5} zlw5S6JHgdYSP-mLSHcqt~CyE=mdyq;A0B}q_;mOzjgUoJIrbOx{HtI5mJzH+0beYN_xn=beV(Pod_0~^l4v`96$J)}6j zrv_fHbn(~qFcVZd;ErAV7vH8e1L`_{L}%Sz+j;m7&r;>w#EJ$mqC`zE4|zn#8#NPU z1%?}b*M*dgb2A2(;Viwo#$2jM$t2NvRerm+yw^*afsd$)w+LMfJfkkf1)SCYwUR)9tAK0zfIl#*S;QY0)sH1O!-X^ zgZgvgY!O^w<|B>Se|?cAV-1#TpZ@mze~hOKW?mYsc0#orn>nL^jlRg4U;U5qO2N#n zD6{^<&o0N?Kxssu{b|TE!#x%HoS1>PS_q|Q`cAU>Gh&6#aEbeKUdymtN6X1g4% zShuz8%_&i8qWwKY<%BLxV}MkpecGrJn04Acz^76VR)mZ?gQjW59Wey?vy@JG*zoax zEt}j}S#9^WB*`?oO8I+B{(ahA`KhT`(oQez7Shn=c(=d*z2pQExMDfp+jA7WXwjH2 z)Q>oVkn#kp{_;SdupwgXQDF(mE6!cxf>7MzB}H0yY}NG?r(a88Ssf=8EX$;)10`*1AWzd44JBj|DE z^M47?TMaO@rB}YbZvh#@3C&abKWLs4W)2u<f&yT0~iyo@CfskI6w6}iu7oEwE!V-ZN2*g!PhrtxV+=6GA zxt2VANZ@(&BQ25zaeea~(mz=gFSM=tv#PQSSAG}pW+m1nyOd2hqWdlTm%MlQBQGlnuu(9 z5KM>^KvdX&S|{qz_ZY~l09&i=@f>Hov$z09V=+(klu0s8r$(Z>W(rC!#YwO-oO`fJ zW?<)|)qQQJ88>g>3m5Or*>~bWkM)yZh8`i}9!$n?OQ8WvNY=6L*8=a9UdyxO-1|~A z#u|Ytj|79g&joD17k1@P*90vSy%(6w!^qK+yPY|Ut=&_>A> z_nY-U13v^UJC@Sh1$iQzyajZ1HT2z5=)p_AN>%7NK#w^H`bU6AtRJ>JWr0P5`8s9A z=n7K!9ubPVU8>w_3-61YwFww(IY(k~p@u2)2gN4J(9}7!H|s{Xce;#P>Vs_$qjawC zrw_;mse3gF^$stm6<9>4a(nWAEoziA3dNglzWqayLj!vur{ICoGv|AgSA!`8-_G)V zEkk(mmEyU+ThRk7Vj?J&Cfxdo0k|t zlb#Pe^v!)$LN=@aeeb>!jrZyAQ{@8->m7?-Z&L5pTfVYs+pZ-T=p-<)i(UMG6D{*m2uU0F?y(YmR!mf+9>!g<4Y(lsJUcI)(ttC&#-dZl@9 z=<8DMrrg#3A+-=cTRwYNM-tVlg<6$p{~@7kxgzdRx4m1#AusOz))-Y;HrKe`v7SeZ zvgJv+TUNU3j_iIrdDn&~#WG*2yK3p&o|{lrz;5P7XR^5P`xL`P-7JScEq$O6C7D$X zcjazGmKFacLTNHJK-Skb-wOSGW+CE$gd1H@`K|1KeOd$J8eN!G@*gj&2jWV|Wasyn zNU}u~g7G{h^OgTTh+)7QFoOk={Wh78KlyrM@2=-}4Ilsi__uT1zOB)$fk9-f0eECA zk5;FfS;K2;YLPFL

gE+uJ@; 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

Y*LNc;4aJglN7SA|Tq0{E1JM_b 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

iM=3!Vd9N>UWMbWc0>{`hghDX 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 z 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 Date: Fri, 18 Sep 2026 02:19:43 -0500 Subject: [PATCH 19/21] fix(updates): keep a banner download at the install prompt instead of installing on its own --- .../Services/UpdateManager.swift | 3 +- .../UpdateManagerTests.swift | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Sources/TokenGaugeApp/Services/UpdateManager.swift b/Sources/TokenGaugeApp/Services/UpdateManager.swift index 021ad35..283726d 100644 --- a/Sources/TokenGaugeApp/Services/UpdateManager.swift +++ b/Sources/TokenGaugeApp/Services/UpdateManager.swift @@ -314,7 +314,7 @@ final class UpdateManager: ObservableObject { func handleReadyToInstall(reply: @escaping (SPUUserUpdateChoice) -> Void) { let version = pendingVersion ?? "" - if resumeInstallRequested || installRequested { + if resumeInstallRequested { installRequested = false resumeInstallRequested = false deferredVersion = nil @@ -322,6 +322,7 @@ final class UpdateManager: ObservableObject { reply(.install) return } + installRequested = false readyReply = reply phase = .readyToInstall(version: version, deferred: false) } diff --git a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift index 1edddf9..7b8ef60 100644 --- a/Tests/TokenGaugeAppTests/UpdateManagerTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateManagerTests.swift @@ -162,6 +162,42 @@ final class UpdateManagerTests: XCTestCase { XCTAssertEqual(manager.phase, .installing(version: "9.9.9")) } + func testDownloadRequestedFromTheBannerStopsAtReadyToInstall() { + let defaults = makeDefaults() + let manager = makeManager(defaults: defaults) + _ = found(manager, version: "1.4.0") + manager.handleInstallRequested() + XCTAssertEqual(found(manager, version: "1.4.0"), .install) + + manager.handleDownloadInitiated() + manager.handleDownloadExpectedLength(1_000) + manager.handleDownloadReceived(bytes: 1_000) + manager.handleExtractionStarted() + manager.handleExtractionProgress(1.0) + + var choices: [SPUUserUpdateChoice] = [] + manager.handleReadyToInstall { choices.append($0) } + + XCTAssertEqual(manager.phase, .readyToInstall(version: "1.4.0", deferred: false)) + XCTAssertTrue(choices.isEmpty) + + manager.deferReadyUpdate() + XCTAssertEqual(choices, [.dismiss]) + XCTAssertEqual(manager.phase, .readyToInstall(version: "1.4.0", deferred: true)) + XCTAssertEqual(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey), "1.4.0") + + let session = FakeUpdaterSession(sessionInProgress: false) + manager.setSession(session) + manager.resumeDeferredInstall() + XCTAssertEqual(session.checks, 1) + XCTAssertEqual(found(manager, version: "1.4.0", stage: .downloaded), .install) + + manager.handleReadyToInstall { choices.append($0) } + XCTAssertEqual(choices, [.dismiss, .install]) + XCTAssertEqual(manager.phase, .installing(version: "1.4.0")) + XCTAssertNil(defaults.string(forKey: UpdateManager.deferredVersionDefaultsKey)) + } + func testDownloadedStageWithoutInstallIntentSurfacesTheDeferredRow() { XCTAssertEqual( UpdateManager.decideUpdateFound( From a1a93ce108921f1d65f15cb2a145f6b52d7b887a Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 02:27:17 -0500 Subject: [PATCH 20/21] fix(panel): keep provider cards unclipped under the update banner and dismiss the pinned day card with Escape --- .../Views/HistoryCalendarView.swift | 29 +++++++++++++-- Sources/TokenGaugeApp/Views/PopoverView.swift | 4 +- .../HistoryCalendarRenderingTests.swift | 35 ++++++++++++++++++ .../PopoverLayoutTests.swift | 37 ++++++++++++++++++- 4 files changed, 97 insertions(+), 8 deletions(-) diff --git a/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift b/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift index 8bbf9ba..b062dc4 100644 --- a/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift +++ b/Sources/TokenGaugeApp/Views/HistoryCalendarView.swift @@ -312,6 +312,8 @@ final class HistoryCalendarCanvas: NSView { var trackingOptions: NSTrackingArea.Options { tracking?.options ?? [] } + var hasPinMonitor: Bool { pinMonitor != nil } + override func mouseMoved(with event: NSEvent) { let position = window?.convertPoint(toScreen: event.locationInWindow) ?? event.locationInWindow defer { lastMousePosition = position } @@ -353,18 +355,37 @@ final class HistoryCalendarCanvas: NSView { guard pinned != nil, window != nil else { if let pinMonitor { NSEvent.removeMonitor(pinMonitor) } pinMonitor = nil + if let window, window.firstResponder === self { window.makeFirstResponder(window.contentView) } return } - guard pinMonitor == nil else { return } - pinMonitor = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDown, .keyDown]) { [weak self] event in - MainActor.assumeIsolated { self?.passesPinnedEvent(event) ?? true } ? event : nil + if pinMonitor == nil { + pinMonitor = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDown, .keyDown]) { [weak self] event in + MainActor.assumeIsolated { self?.passesPinnedEvent(event) ?? true } ? event : nil + } + } + if let window, window.firstResponder !== self { window.makeFirstResponder(self) } + } + + override var acceptsFirstResponder: Bool { pinned != nil } + + override func cancelOperation(_ sender: Any?) { + guard pinned != nil else { + nextResponder?.tryToPerform(#selector(NSResponder.cancelOperation(_:)), with: sender) + return } + dismissPinnedCard() + } + + private func dismissPinnedCard() { + pinned = nil + updatePinMonitor() + onDismissCard?() } func passesPinnedEvent(_ event: NSEvent) -> Bool { if event.type == .keyDown { guard event.keyCode == 53 else { return true } - onDismissCard?() + dismissPinnedCard() return false } if event.window === window, let scroll = enclosingScrollView { diff --git a/Sources/TokenGaugeApp/Views/PopoverView.swift b/Sources/TokenGaugeApp/Views/PopoverView.swift index f2a33be..8f5b1c6 100644 --- a/Sources/TokenGaugeApp/Views/PopoverView.swift +++ b/Sources/TokenGaugeApp/Views/PopoverView.swift @@ -24,11 +24,9 @@ struct PopoverView: View { } var providerMaxHeight: CGFloat { - let height: CGFloat = - store.panelStyle == .rings + store.panelStyle == .rings ? Theme.Layout.ringProviderMaxHeight : store.panelStyle == .compact ? Theme.Layout.compactProviderMaxHeight : Theme.Layout.providerMaxHeight - return height - (updates.phase == .idle ? 0 : UpdateBannerView.height(for: updates.phase)) } var panelWidth: CGFloat { diff --git a/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift b/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift index 196d3ec..7892e3b 100644 --- a/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/HistoryCalendarRenderingTests.swift @@ -197,6 +197,41 @@ final class HistoryCalendarRenderingTests: XCTestCase { XCTAssertEqual(dismissals, 2) } + func testPinMonitorIsInstalledWhilePinnedAndRemovedOnDismissOrWindowLoss() throws { + let interval = HistoryDashboardModel.interval(mode: .calendar, offset: 0, now: Date()) + let days = HistoryDashboardModel.makeDays(interval: interval, tokens: [], efforts: []) + let view = HistoryCalendarScrollView() + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 440, height: 600), styleMask: [.borderless], backing: .buffered, + defer: false) + let root = NSView(frame: NSRect(x: 0, y: 0, width: 440, height: 600)) + window.contentView = root + defer { window.contentView = nil } + view.frame = NSRect(x: 0, y: 200, width: 440, height: Theme.Layout.historyCalendarHeight) + root.addSubview(view) + var dismissals = 0 + func update(pinned: String?) { + view.calendar.update( + HistoryCalendarView( + days: days, providers: [.codex], selectedDayKey: days[0].id, focusID: "year", + pinnedDayKey: pinned, onDismissCard: { dismissals += 1 } + ) { _ in }) + } + update(pinned: nil) + XCTAssertFalse(view.calendar.hasPinMonitor) + update(pinned: days[0].id) + XCTAssertTrue(view.calendar.hasPinMonitor) + XCTAssertTrue(window.firstResponder === view.calendar) + view.calendar.cancelOperation(nil) + XCTAssertEqual(dismissals, 1) + XCTAssertFalse(view.calendar.hasPinMonitor) + XCTAssertFalse(window.firstResponder === view.calendar) + update(pinned: days[0].id) + XCTAssertTrue(view.calendar.hasPinMonitor) + view.removeFromSuperview() + XCTAssertFalse(view.calendar.hasPinMonitor) + } + private func mouseDown(at location: NSPoint, windowNumber: Int) throws -> NSEvent { try XCTUnwrap( NSEvent.mouseEvent( diff --git a/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift b/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift index 019ffda..b47fe3b 100644 --- a/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift +++ b/Tests/TokenGaugeAppTests/PopoverLayoutTests.swift @@ -66,6 +66,40 @@ final class PopoverLayoutTests: XCTestCase { } } + func testUpdateBannerNeverClipsTheRingProviderCards() throws { + let suite = "TokenGauge.layout.\(UUID().uuidString)" + let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) + defer { + defaults.removePersistentDomain(forName: suite) + UpdateManager.shared.handleNotFound() + } + let store = UsageStore( + defaults: defaults, initialSnapshots: [codexSnapshot(), claudeSnapshot()], historyReadsEnabled: false) + store.showHourlyPace = true + store.panelStyle = .rings + store.displayMode = .unified + try withEachLanguage { language in + for banner in [false, true] { + UpdateManager.shared.handleNotFound() + if banner { + _ = UpdateManager.shared.handleUpdateFound( + version: "1.4.1", releasePage: nil, informationOnly: false) + } + for downloading in banner ? [false, true] : [false] { + if downloading { UpdateManager.shared.handleDownloadInitiated() } + let view = PopoverView(store: store, showSettings: {}, showAbout: {}) + let content = fittingSize( + view.providerContent.frame(width: view.panelWidth - Theme.Layout.panelPadding * 2)) + XCTAssertEqual(view.providerMaxHeight, Theme.Layout.ringProviderMaxHeight) + XCTAssertLessThanOrEqual( + content.height, view.providerMaxHeight, + "\(language.rawValue) / \(UpdateManager.shared.phase)") + assertHeight(store) + } + } + } + } + private func claudeSnapshot() -> ProviderUsageSnapshot { Fixture.snapshot( .claude, @@ -102,10 +136,11 @@ final class PopoverLayoutTests: XCTestCase { private func assertHeight(_ store: UsageStore, file: StaticString = #filePath, line: UInt = #line) { let view = NSHostingView(rootView: PopoverView(store: store, showSettings: {}, showAbout: {})) + let budget = Theme.Layout.maximumPanelHeight + UpdateBannerView.height(for: UpdateManager.shared.phase) XCTAssertGreaterThanOrEqual(view.fittingSize.width, Theme.Layout.compactPanelWidth, file: file, line: line) XCTAssertLessThanOrEqual(view.fittingSize.width, Theme.Layout.unifiedPanelWidth, file: file, line: line) XCTAssertLessThanOrEqual( - view.fittingSize.height, Theme.Layout.maximumPanelHeight, + view.fittingSize.height, budget, "\(LocalizationManager.shared.language.rawValue) / \(store.displayMode.rawValue) / \(store.panelStyle.rawValue) / \(UpdateManager.shared.phase)", file: file, line: line) } From d4987086f275d46d91d941dae994f26b7c0359e9 Mon Sep 17 00:00:00 2001 From: Steven Coaila Date: Fri, 18 Sep 2026 05:01:23 -0500 Subject: [PATCH 21/21] fix(updater): keep the ready title on the deferred banner --- .../Views/UpdateBannerView.swift | 12 +++---- .../UpdateBannerRenderingTests.swift | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Sources/TokenGaugeApp/Views/UpdateBannerView.swift b/Sources/TokenGaugeApp/Views/UpdateBannerView.swift index 8078a44..d78de82 100644 --- a/Sources/TokenGaugeApp/Views/UpdateBannerView.swift +++ b/Sources/TokenGaugeApp/Views/UpdateBannerView.swift @@ -46,8 +46,8 @@ struct UpdateBannerView: View { fraction: fraction) case .readyToInstall(let version, let deferred): if deferred { - row(title: nil, icon: "arrow.down.circle.fill") { - action("updates.install_version".localized(version)) { updates.resumeDeferredInstall() } + row(title: "updates.banner_ready".localized(version), icon: "arrow.down.circle.fill") { + action("updates.install_now".localized) { updates.resumeDeferredInstall() } } } else { row(title: "updates.banner_ready".localized(version), icon: "arrow.down.circle.fill") { @@ -69,12 +69,12 @@ struct UpdateBannerView: View { .id(localization.language) } - private func row(title: String?, icon: String) -> some View { + private func row(title: String, icon: String) -> some View { row(title: title, icon: icon) { EmptyView() } } private func row( - title: String?, + title: String, icon: String, @ViewBuilder trailing: () -> some View ) -> some View { @@ -83,9 +83,7 @@ struct UpdateBannerView: View { .font(.system(size: 13)) .foregroundStyle(Color.accentColor) .accessibilityHidden(true) - if let title { - Text(title).font(.system(size: 11, weight: .medium)).lineLimit(1) - } + Text(title).font(.system(size: 11, weight: .medium)).lineLimit(1) Spacer(minLength: 4) trailing() } diff --git a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift index 71adbab..57f4f54 100644 --- a/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift +++ b/Tests/TokenGaugeAppTests/UpdateBannerRenderingTests.swift @@ -63,6 +63,42 @@ final class UpdateBannerRenderingTests: XCTestCase { try actionHeight(phase: .installing(version: "1.4.0")), UpdateBannerView.compactHeight, accuracy: 1) } + func testDeferredBannerKeepsTheReadyTitle() throws { + let ready = try bannerBitmap(phase: .readyToInstall(version: "1.4.0", deferred: false)) + let deferred = try bannerBitmap(phase: .readyToInstall(version: "1.4.0", deferred: true)) + let checking = try bannerBitmap(phase: .checking) + + XCTAssertTrue(leadingHalfMatches(ready, deferred)) + XCTAssertFalse(leadingHalfMatches(checking, deferred)) + } + + private func bannerBitmap(phase: UpdateManager.Phase) throws -> NSBitmapImageRep { + let manager = try makeManager(phase: phase) + return try render( + UpdateBannerView(updates: manager).frame(width: Theme.Layout.panelWidth) + .environment(\.colorScheme, .light).background(Color.white)) + } + + private func leadingHalfMatches(_ lhs: NSBitmapImageRep, _ rhs: NSBitmapImageRep) -> Bool { + guard lhs.pixelsWide == rhs.pixelsWide, lhs.pixelsHigh == rhs.pixelsHigh else { return false } + let width = lhs.pixelsWide / 2 + var different = 0 + for row in 0.. 0.1 + || abs(left.greenComponent - right.greenComponent) > 0.1 + || abs(left.blueComponent - right.blueComponent) > 0.1 + { + different += 1 + } + } + } + return different * 100 < width * lhs.pixelsHigh + } + private func actionHeight(phase: UpdateManager.Phase) throws -> CGFloat { let manager = try makeManager(phase: phase) let view = NSHostingView(