Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
229 commits
Select commit Hold shift + click to select a range
c82dab5
Add CLIProxyAPI cost attribution
EClinick Jul 25, 2026
5d61c30
Tighten proxy attribution evidence
EClinick Jul 26, 2026
023c0f1
Fix Linux telemetry networking import
EClinick Jul 26, 2026
c3bedb0
Fix CLIProxyAPI attribution edge cases
EClinick Jul 27, 2026
0f4bda0
Preserve CLIProxyAPI usage across scoped scans
EClinick Jul 27, 2026
e9b111e
Prune stale CLIProxyAPI telemetry
EClinick Jul 27, 2026
02951c4
Preserve complete CLIProxyAPI attribution
EClinick Jul 27, 2026
b9192ab
Retain proxy spend after forced refresh
EClinick Jul 27, 2026
19f7f1b
Harden CLIProxyAPI telemetry maintenance
EClinick Jul 27, 2026
b02b484
Fix proxied model pricing boundaries
EClinick Jul 27, 2026
3ce2fcc
Retry proxy-only unknown pricing
EClinick Jul 27, 2026
eb1f283
Isolate and index proxy attribution
EClinick Jul 27, 2026
0acb769
Cache CLIProxyAPI request logs
EClinick Jul 27, 2026
b28c18d
Hydrate cached CLIProxyAPI usage
EClinick Jul 27, 2026
ee96859
Prefer dated CLIProxyAPI request logs
EClinick Jul 27, 2026
2372a08
Refresh resolved proxy model pricing
EClinick Jul 27, 2026
d20f52a
Refresh proxy pricing by provider
EClinick Jul 27, 2026
c82e0d5
Resolve proxy model vendors after refresh
EClinick Jul 27, 2026
a87a694
Keep proxy auth inventory ambiguous
EClinick Jul 27, 2026
a4795f3
Merge upstream main into CLIProxyAPI attribution
EClinick Jul 28, 2026
3bf86e5
Stabilize attribution breakdown ordering
EClinick Jul 28, 2026
c75c92f
Stabilize dashboard attribution ranks
EClinick Jul 28, 2026
5811859
Merge latest upstream main
EClinick Jul 28, 2026
f933bdb
Retry failed telemetry persistence
EClinick Jul 28, 2026
9cb7f0f
Merge current upstream main
EClinick Jul 28, 2026
bf8a117
Split telemetry retry test
EClinick Jul 28, 2026
30604c7
Harden telemetry collection
EClinick Jul 28, 2026
4a60621
Isolate telemetry staging tests
EClinick Jul 28, 2026
5dcc12d
Keep proxy subscriptions isolated
EClinick Jul 28, 2026
4e845a7
Respect cost tracking opt out
EClinick Jul 28, 2026
282e01b
Recheck telemetry opt out and pricing
EClinick Jul 28, 2026
2f8747b
Fix attribution sort expectation
EClinick Jul 28, 2026
b5d9426
Complete attribution sort tie-breaks
EClinick Jul 28, 2026
895de6b
Split chart attribution sort coverage
EClinick Jul 28, 2026
01ffbe2
Remove feature changelog entry
EClinick Jul 28, 2026
09262e9
Stop proxy collection on removal
EClinick Jul 28, 2026
95028de
Persist proxy telemetry durably
EClinick Jul 28, 2026
f472866
Serialize proxy telemetry migration
EClinick Jul 28, 2026
ab2f183
Stabilize project attribution ordering
EClinick Jul 28, 2026
1d32f31
Skip empty proxy history scans
EClinick Jul 28, 2026
6731ef0
Exclude proxy usage from subscriptions
EClinick Jul 28, 2026
7461d2e
Preserve proxy telemetry timestamps
EClinick Jul 28, 2026
37ddfd8
Avoid shared timestamp formatter
EClinick Jul 28, 2026
b37f346
Preserve valid proxy queue records
EClinick Jul 28, 2026
dccfa4f
Merge upstream main
EClinick Jul 29, 2026
b03ec2b
Protect popped usage batches
EClinick Jul 29, 2026
6988c7f
Quarantine unresolved proxy usage
EClinick Jul 29, 2026
fb9769e
Clear durable cost caches
EClinick Jul 29, 2026
af15749
Merge upstream main
EClinick Jul 29, 2026
b5648f4
Purge proxy telemetry on disconnect
EClinick Jul 29, 2026
9bd15e8
Complete proxy telemetry cleanup
EClinick Jul 29, 2026
164bc73
Harden proxy cleanup lifecycle
EClinick Jul 30, 2026
d093217
Finish proxy disconnect cleanup
EClinick Jul 30, 2026
a579b7d
Merge main and address proxy review feedback
EClinick Jul 30, 2026
1fe0077
Merge concurrent proxy cleanup fixes
EClinick Jul 30, 2026
2908743
Address remaining proxy review feedback
EClinick Jul 30, 2026
e728e2a
Fix proxy collector lock location
EClinick Jul 30, 2026
6517067
Fix remaining proxy review issues
EClinick Jul 30, 2026
3bf52d6
Reject stale proxy cache time zones
EClinick Jul 30, 2026
7bad61f
Reject stale-zone proxy caches
EClinick Jul 30, 2026
32d681d
Merge remote-tracking branch 'fork/task/ec/codex-proxy-attribution' i…
EClinick Jul 30, 2026
ff3287d
Use released model fixtures
EClinick Jul 30, 2026
8fd2dd4
Drop cached proxy attribution on disconnect
EClinick Jul 30, 2026
2907270
Serialize cost cache clearing
EClinick Jul 30, 2026
0b8a0f2
Fix proxy telemetry retention cleanup
EClinick Jul 30, 2026
71592d4
Recheck proxy configuration before collection
EClinick Jul 30, 2026
20ada6b
Serialize proxy telemetry migration
EClinick Jul 30, 2026
fdf7763
Stabilize proxy cache timezone test
EClinick Jul 30, 2026
ff8417f
Tighten proxy attribution boundaries
EClinick Jul 30, 2026
53ff713
Drain in-flight proxy telemetry pops
EClinick Jul 30, 2026
008e9e6
Honor live proxy attribution results
EClinick Jul 30, 2026
202ffee
Exclude proxy attribution from share providers
EClinick Jul 30, 2026
851586b
Harden proxy telemetry cleanup
EClinick Jul 30, 2026
92b6cdd
Recheck proxy disconnect before reporting
EClinick Jul 30, 2026
ae3aaf1
Reconcile unkeyed proxy attribution
EClinick Jul 30, 2026
3bae274
Recognize CLIProxyAPI Codex model aliases
EClinick Aug 2, 2026
dd9d59c
Merge remote-tracking branch 'upstream/main' into task/ec/codex-proxy…
EClinick Aug 2, 2026
d5d885a
Require route evidence for proxy aliases
EClinick Aug 2, 2026
6ea9848
Merge remote-tracking branch 'upstream/main' into task/ec/codex-proxy…
EClinick Aug 2, 2026
1f0fddb
Make proxy removal atomic
EClinick Aug 3, 2026
ec8b28b
Invalidate Claude spend on proxy removal
EClinick Aug 3, 2026
fe3ef91
Preserve uniquely matched proxy routes
EClinick Aug 3, 2026
dd95cc4
Tighten proxy evidence and pricing
EClinick Aug 3, 2026
eeec35f
Tighten proxy maintenance boundaries
EClinick Aug 3, 2026
1cc2d18
Merge upstream main
EClinick Aug 3, 2026
fe868f2
Harden proxy reconnect and deduplication
EClinick Aug 3, 2026
0418682
Preserve proxy events and refresh reconnects
EClinick Aug 3, 2026
5b5f686
Reprice cached Google proxy rows
EClinick Aug 3, 2026
3cc6e6e
Harden proxy route ownership and pricing
EClinick Aug 3, 2026
5de7b2b
Prune durable proxy telemetry
EClinick Aug 3, 2026
029fc99
Invalidate cross-process proxy disconnects
EClinick Aug 3, 2026
9b8cd1e
Coordinate proxy cache invalidation
EClinick Aug 3, 2026
aa07df2
Require supported proxy route matches
EClinick Aug 3, 2026
2a76ca3
Preserve snapshots without proxy configuration
EClinick Aug 3, 2026
1746aea
Preserve temporary proxy credentials
EClinick Aug 3, 2026
7c25cfb
Detect missed proxy reconnects
EClinick Aug 3, 2026
a5f9d26
Publish proxy generations atomically
EClinick Aug 3, 2026
0f33a44
Purge replaced proxy telemetry
EClinick Aug 3, 2026
8d80053
Preserve proxy telemetry on failed saves
EClinick Aug 3, 2026
c684cf3
Merge upstream main
EClinick Aug 3, 2026
235e5c3
Close proxy attribution transaction gaps
EClinick Aug 3, 2026
146e6c2
Harden proxy replacement interruptions
EClinick Aug 3, 2026
340ec7a
Guard proxy report generation
EClinick Aug 3, 2026
2daf030
Invalidate scans when clearing cost caches
EClinick Aug 3, 2026
7a6e3fd
Harden proxy generation boundaries
EClinick Aug 3, 2026
1001c15
Protect proxy replacement boundaries
EClinick Aug 3, 2026
87ceae6
Merge upstream main
EClinick Aug 3, 2026
b4b52a0
Merge upstream main
EClinick Aug 3, 2026
fc4aab8
Serialize proxy scan attribution state
EClinick Aug 3, 2026
80d4f84
Merge upstream main
EClinick Aug 3, 2026
009e883
Merge upstream main
EClinick Aug 4, 2026
845eb70
Detect proxy changes after hydration
EClinick Aug 4, 2026
fb5b4a5
Retry proxy telemetry cleanup
EClinick Aug 4, 2026
6132516
Refresh proxy configuration state
EClinick Aug 4, 2026
a4fb6e1
Recover proxy save isolation
EClinick Aug 4, 2026
8bcafdf
Invalidate proxy telemetry before credentials
EClinick Aug 4, 2026
c0fee4a
Complete proxy transition recovery
EClinick Aug 4, 2026
65cfa9a
Handle missing proxy credentials during removal
EClinick Aug 4, 2026
112461d
Integrate upstream provider plugin updates
EClinick Aug 4, 2026
06312e5
Preserve proxy attribution boundaries
EClinick Aug 4, 2026
1a66672
Preserve proxy rollback recovery
EClinick Aug 4, 2026
c694017
Journal credential rollback recovery
EClinick Aug 4, 2026
8441b9a
Invalidate cancelled proxy spend
EClinick Aug 9, 2026
29abfc6
Integrate current main cost store
EClinick Aug 21, 2026
0f971ca
Integrate latest upstream updates
EClinick Aug 21, 2026
5b12543
Preserve interrupted proxy removals
EClinick Aug 21, 2026
68c5720
Finalize isolated proxy removals
EClinick Aug 21, 2026
92ef197
Harden proxy generation boundaries
EClinick Aug 21, 2026
4aa1f97
Honor proxy scan boundaries
EClinick Aug 21, 2026
0af9612
Bound proxy telemetry timestamps
EClinick Aug 21, 2026
4fef1b3
Fix proxy retention test clocks
EClinick Aug 21, 2026
3a0d3b4
Merge main and harden proxy maintenance
EClinick Aug 22, 2026
57885c3
Invalidate stale proxy dashboard rows
EClinick Aug 22, 2026
6b413d3
Refresh costs after proxy removal
EClinick Aug 22, 2026
89c22c3
Merge remote-tracking branch 'refs/remotes/steipete/main' into task/e…
EClinick Aug 22, 2026
67a102c
Refresh spend dashboard gatekeeper anchors
EClinick Aug 22, 2026
3b1d663
Preserve account rows during proxy cancellation
EClinick Aug 22, 2026
67c87f3
Refresh attribution after proxy imports
EClinick Aug 22, 2026
a72ea1b
Guard proxy refresh configuration
EClinick Aug 22, 2026
fe98893
Preserve proxy home for cached calendars
EClinick Aug 22, 2026
f57f48a
Harden proxy cache refresh races
EClinick Aug 22, 2026
0955135
Refresh imported telemetry after failures
EClinick Aug 22, 2026
eaa9a69
Refresh native costs after proxy disconnects
EClinick Aug 23, 2026
c471a6e
Isolate proxy attribution before disconnect refresh
EClinick Aug 23, 2026
22e9b30
Keep proxy configuration transitions pending
EClinick Aug 23, 2026
3eaee5e
Serialize proxy disconnect isolation
EClinick Aug 23, 2026
c8738c4
Guard proxy disconnect boundaries
EClinick Aug 23, 2026
cfd39aa
Guard cached proxy hydration
EClinick Aug 23, 2026
d6a6f3e
Integrate current main and guard cached attribution
EClinick Aug 24, 2026
90014e4
Reject stale proxy telemetry reports
EClinick Aug 24, 2026
4b4afc1
Integrate latest main
EClinick Aug 24, 2026
aa3aeea
Merge branch 'main' of https://github.com/steipete/CodexBar into task…
EClinick Aug 24, 2026
26008c0
Harden proxy attribution state changes
EClinick Aug 24, 2026
814ae7b
Close proxy recovery crash windows
EClinick Aug 24, 2026
ea9bf8d
Fix pre-credential rollback recovery
EClinick Aug 24, 2026
a5b51c1
Preserve proxy merge request metadata
EClinick Aug 25, 2026
e1323a6
Classify Google models before Claude
EClinick Aug 25, 2026
07fc8d8
Guard proxy snapshot publication
EClinick Aug 25, 2026
e801d96
Integrate current main
EClinick Aug 25, 2026
aa43db4
Guard dashboard proxy publication
EClinick Aug 25, 2026
7782051
Keep Claude proxy totals provider-owned
EClinick Aug 25, 2026
a90c6c2
Keep disconnected Claude totals provider-owned
EClinick Aug 25, 2026
54211a6
Align proxy attribution test expectations
EClinick Aug 25, 2026
671c5c9
Invalidate proxy attribution before connection tests
EClinick Aug 25, 2026
96119f4
Integrate current main
EClinick Aug 25, 2026
dc5a98a
Merge remote-tracking branch 'upstream/main' into task/ec/codex-proxy…
EClinick Aug 26, 2026
e8df86a
Parse proxy aliases independent of key order
EClinick Aug 26, 2026
cdf53ee
Guard proxy publication artifacts
EClinick Aug 26, 2026
be83254
Keep proxy spend source distinct
EClinick Aug 26, 2026
dd0e838
Preserve model counters in report merges
EClinick Aug 26, 2026
d40a988
Merge remote-tracking branch 'upstream/main' into task/ec/codex-proxy…
EClinick Aug 26, 2026
b980749
Preserve proxy-only share stats
EClinick Aug 26, 2026
3c5d073
Skip proxy guards for unrelated providers
EClinick Aug 26, 2026
2dec313
Align provider gatekeeper anchors
EClinick Aug 26, 2026
0a4b2b4
Guard merged usage totals from overflow
EClinick Aug 26, 2026
519f3fd
Merge upstream main
EClinick Aug 26, 2026
bee8a7e
Use upstream model in shared proxy stats
EClinick Aug 26, 2026
19c92d1
Export upstream proxy model identity
EClinick Aug 26, 2026
f322971
Preserve proxy model token details
EClinick Aug 26, 2026
dc52ee8
Fix proxy custom cache isolation
EClinick Aug 26, 2026
2fc3b50
Align proxy cache timing and locks
EClinick Aug 26, 2026
a0effdd
Update merged Claude token expectation
EClinick Aug 27, 2026
ea354bc
Fix proxy overview accounting
EClinick Aug 27, 2026
1987b3d
Refresh provider architecture anchors
EClinick Aug 27, 2026
59e6c76
Stabilize provider architecture markers
EClinick Aug 27, 2026
3813aa0
Recognize proxy telemetry without request logs
EClinick Aug 27, 2026
b014a8d
Isolate proxy collector telemetry test
EClinick Aug 27, 2026
b2b10d6
Merge upstream main
EClinick Aug 27, 2026
3bc6e5c
Preserve durable proxy route evidence
EClinick Aug 27, 2026
d7c740a
Split proxy attribution reconciliation
EClinick Aug 27, 2026
de74b31
Align changelog before main merge
EClinick Aug 27, 2026
5798cda
Align changelog with main for update
EClinick Aug 27, 2026
1a7946f
Merge latest upstream main
EClinick Aug 27, 2026
01aa885
Refresh changelog alignment with main
EClinick Aug 27, 2026
cb7e1b1
Isolate browser uninstall test
EClinick Aug 27, 2026
a579a12
Preserve durable proxy route evidence
EClinick Aug 27, 2026
bc56046
Split proxy attribution reconciliation
EClinick Aug 27, 2026
913d850
Restore proxy attribution changelog
EClinick Aug 27, 2026
00ac3b7
Merge published PR head
EClinick Aug 27, 2026
8bfb0b5
Merge latest upstream main
EClinick Aug 27, 2026
cb8af28
Add CLIProxyAPI routed proof screenshot
EClinick Aug 27, 2026
5dd5686
Merge remote-tracking branch 'origin/task/ec/codex-proxy-attribution'…
EClinick Aug 27, 2026
98f416b
Merge latest upstream main
EClinick Aug 27, 2026
161804c
Merge latest upstream main and guard proxy redirects
EClinick Aug 27, 2026
ff946d2
Add redirect final-effect proof
EClinick Aug 27, 2026
edeacec
Remove proof screenshots
EClinick Aug 27, 2026
8b175f7
Merge latest upstream main
EClinick Aug 28, 2026
b7bced9
Move proxy fingerprinting off main actor
EClinick Aug 28, 2026
09421d6
Fix proxy catch-up review findings
EClinick Aug 28, 2026
0c77ccb
Merge latest upstream main
EClinick Aug 29, 2026
5c6c59d
Merge latest upstream main
EClinick Aug 30, 2026
29d4288
Merge latest upstream main
EClinick Aug 30, 2026
a66dbab
Merge latest upstream main
EClinick Aug 31, 2026
37cf61d
Keep foreign models out of Claude totals
EClinick Aug 31, 2026
dea4da1
Merge latest upstream main
EClinick Aug 31, 2026
5576aeb
Preserve ambiguous Claude model usage
EClinick Aug 31, 2026
f610e5a
Harden CLIProxyAPI recovery boundaries
EClinick Aug 31, 2026
7dd482e
Merge latest upstream main
EClinick Aug 31, 2026
4443b51
Fix proxy attribution edge cases
EClinick Aug 31, 2026
760bc3d
Merge latest upstream main
EClinick Aug 31, 2026
65f36ab
Handle empty proxy upstream lists
EClinick Aug 31, 2026
6926672
Support bare YAML alias items
EClinick Aug 31, 2026
f69185f
Support flow-style YAML aliases
EClinick Sep 1, 2026
129a798
Merge latest upstream main
EClinick Sep 1, 2026
b27b030
Isolate proxy attribution after credential loss
EClinick Sep 1, 2026
1a44434
Merge latest upstream main
EClinick Sep 1, 2026
7c19e3a
Skip unrelated proxy attribution scans
EClinick Sep 1, 2026
dfb6159
Parse quoted proxy alias keys
EClinick Sep 1, 2026
b5bee20
Recognize quoted proxy upstream keys
EClinick Sep 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
- Cursor: estimate API-rate costs when usage events omit prices, using cached or bundled pricing while keeping unknown costs unpriced and estimates separate from Cursor-metered charges (#3129). Thanks @Yuxin-Qiao!

### Fixed
- CLIProxyAPI attribution: identify Claude Code requests from uniquely matching management-queue telemetry even when CLIProxyAPI request-file logging is disabled, so routed Codex models display their upstream and `CLIProxyAPI via Claude Code` provenance.
- Cursor: show empty cost-history windows without a decoding error, while preserving incomplete-history and malformed-response checks.
- Codex: honor the native access token's expiry so valid OAuth sessions keep model-specific limits, while leaving credential refresh under CLI ownership (#3221, #3222). Thanks @anagnorisis2peripeteia!
- Codex: clear stale connectivity errors after a successful fetch, even when weekly usage cannot yet be published, including persisted and stacked-account errors (#3214). Thanks @olddonkey!
Expand Down
74 changes: 53 additions & 21 deletions Sources/CodexBar/CostHistoryChartMenuView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@ import Charts
import CodexBarCore
import SwiftUI

private func claudeCodeModelProviderText(_ provider: CostUsageAttribution.ModelProvider) -> String {
switch provider {
case .openAI: "OpenAI model via Claude Code"
case .anthropic: "Anthropic model via Claude Code"
case .google: "Google model via Claude Code"
case .other: "Other model provider via Claude Code"
case .unknown: "Unknown model provider via Claude Code"
}
}

@MainActor
// swiftlint:disable:next type_body_length
struct CostHistoryChartMenuView: View {
Expand Down Expand Up @@ -729,7 +739,7 @@ struct CostHistoryChartMenuView: View {
}

private static func hasModeSubtitle(_ item: CostUsageDailyReport.ModelBreakdown) -> Bool {
item.standardCostUSD != nil || item.priorityCostUSD != nil
item.attribution != nil || item.standardCostUSD != nil || item.priorityCostUSD != nil
}

private static func detailRowsViewportHeight(rowCount: Int, rowHeight: CGFloat) -> CGFloat {
Expand Down Expand Up @@ -930,26 +940,6 @@ struct CostHistoryChartMenuView: View {
}
}

static func orderedBreakdownItems(
_ breakdown: [CostUsageDailyReport.ModelBreakdown]) -> [CostUsageDailyReport.ModelBreakdown]
{
breakdown.sorted { lhs, rhs in
let lCost = lhs.costUSD ?? -1
let rCost = rhs.costUSD ?? -1
if lCost != rCost {
return lCost > rCost
}

let lTokens = lhs.totalTokens ?? -1
let rTokens = rhs.totalTokens ?? -1
if lTokens != rTokens {
return lTokens > rTokens
}

return lhs.modelName > rhs.modelName
}
}

static func detailViewportRowCount(itemCount: Int) -> Int {
min(max(itemCount, 0), self.maxVisibleDetailLines)
}
Expand All @@ -972,6 +962,19 @@ struct CostHistoryChartMenuView: View {

private func modelBreakdownModeSubtitle(_ item: CostUsageDailyReport.ModelBreakdown) -> String? {
var parts: [String] = []
if let attribution = item.attribution {
switch attribution.route {
case .cliProxyAPI:
let route = if let upstream = attribution.upstream {
"\(upstream.displayName) · CLIProxyAPI via Claude Code"
} else {
"CLIProxyAPI via Claude Code"
}
parts.append(route)
case .unknown:
parts.append(claudeCodeModelProviderText(attribution.modelProvider))
}
}
if let standardCost = item.standardCostUSD {
var standardPart = "\(L("Std")) \(self.costString(standardCost))"
if let standardTokens = item.standardTokens {
Expand Down Expand Up @@ -1022,6 +1025,32 @@ struct CostHistoryChartMenuView: View {
}

extension CostHistoryChartMenuView {
static func orderedBreakdownItems(
_ breakdown: [CostUsageDailyReport.ModelBreakdown]) -> [CostUsageDailyReport.ModelBreakdown]
{
breakdown.sorted { lhs, rhs in
let lCost = lhs.costUSD ?? -1
let rCost = rhs.costUSD ?? -1
if lCost != rCost {
return lCost > rCost
}

let lTokens = lhs.totalTokens ?? -1
let rTokens = rhs.totalTokens ?? -1
if lTokens != rTokens {
return lTokens > rTokens
}

if lhs.modelName != rhs.modelName {
return lhs.modelName > rhs.modelName
}

let lhsAttribution = lhs.attribution?.deterministicSortKey ?? ""
let rhsAttribution = rhs.attribution?.deterministicSortKey ?? ""
return lhsAttribution > rhsAttribution
}
}

static func projectIdentity(
_ project: CostUsageProjectBreakdown,
ordinal: Int,
Expand Down Expand Up @@ -1070,6 +1099,7 @@ extension CostHistoryChartMenuView {

struct VisibleModelBreakdownFingerprint: Equatable {
let modelName: String
let attribution: CostUsageAttribution?
let costBitPattern: UInt64?
let totalTokens: Int?
let standardCostBitPattern: UInt64?
Expand Down Expand Up @@ -1163,6 +1193,7 @@ extension CostHistoryChartMenuView {
models: session.modelBreakdowns.map { item in
VisibleModelBreakdownFingerprint(
modelName: item.modelName,
attribution: item.attribution,
costBitPattern: item.costUSD.map(\.bitPattern),
totalTokens: item.totalTokens,
standardCostBitPattern: item.standardCostUSD.map(\.bitPattern),
Expand All @@ -1182,6 +1213,7 @@ extension CostHistoryChartMenuView {
modelBreakdowns: self.orderedBreakdownItems(entry.modelBreakdowns ?? []).map { item in
VisibleModelBreakdownFingerprint(
modelName: item.modelName,
attribution: item.attribution,
costBitPattern: item.costUSD.map(\.bitPattern),
totalTokens: item.totalTokens,
standardCostBitPattern: item.standardCostUSD.map(\.bitPattern),
Expand Down
Loading
Loading