Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// Generated by Scripts/regenerate-codex-parser-hash.sh. Do not edit by hand.

enum CodexParserHash {
static let value = "4cf70ccd355c42ac"
static let value = "a8a9621fcff92f55"
}
13 changes: 8 additions & 5 deletions Sources/CodexBarCore/Vendored/CostUsage/CostUsageCache.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import Foundation

enum CostUsageCacheIO {
private static let compatibleCodexProducerKeys: Set<String> = [
"codex:cu:p3c27f997569eb3c5",
"codex:cu:pc54070a94f6419ea",
]
/// Producer keys from older parser hashes whose caches are still valid under the current
/// delta semantics. Cleared for #2037: interleave containment changed how cumulative
/// totals are counted, so every earlier cache must be rebuilt.
private static let compatibleCodexProducerKeys: Set<String> = []

private static func artifactVersion(for provider: UsageProvider) -> Int {
switch provider {
Expand Down Expand Up @@ -134,7 +134,10 @@ struct CostUsageFileUsage: Codable {
var lastTotals: CostUsageCodexTotals?
var lastCountedTotals: CostUsageCodexTotals?
var lastRawTotalsBaseline: CostUsageCodexTotals?
var lastRawTotalsWatermark: CostUsageCodexTotals?
var seenRawTotals: [CostUsageCodexTotals]?
var hasDivergentTotals: Bool?
var hasInterleavedTotals: Bool?
var lastCodexTurnID: String?
var sessionId: String?
var forkedFromId: String?
Expand All @@ -152,7 +155,7 @@ struct CostUsageFileUsage: Codable {
var claudeRows: [CostUsageScanner.ClaudeUsageRow]?
}

struct CostUsageCodexTotals: Codable {
struct CostUsageCodexTotals: Codable, Equatable {
var input: Int
var cached: Int
var output: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,10 @@ extension CostUsageScanner {
lastTotals: CostUsageCodexTotals? = nil,
lastCountedTotals: CostUsageCodexTotals? = nil,
lastRawTotalsBaseline: CostUsageCodexTotals? = nil,
lastRawTotalsWatermark: CostUsageCodexTotals? = nil,
seenRawTotals: [CostUsageCodexTotals]? = nil,
hasDivergentTotals: Bool? = nil,
hasInterleavedTotals: Bool? = nil,
lastCodexTurnID: String? = nil,
sessionId: String? = nil,
forkedFromId: String? = nil,
Expand All @@ -304,7 +307,10 @@ extension CostUsageScanner {
lastTotals: lastTotals,
lastCountedTotals: lastCountedTotals,
lastRawTotalsBaseline: lastRawTotalsBaseline,
lastRawTotalsWatermark: lastRawTotalsWatermark,
seenRawTotals: seenRawTotals,
hasDivergentTotals: hasDivergentTotals,
hasInterleavedTotals: hasInterleavedTotals,
lastCodexTurnID: lastCodexTurnID,
sessionId: sessionId,
forkedFromId: forkedFromId,
Expand Down Expand Up @@ -692,7 +698,10 @@ extension CostUsageScanner {
lastTotals: usage.lastTotals,
lastCountedTotals: usage.lastCountedTotals,
lastRawTotalsBaseline: usage.lastRawTotalsBaseline,
lastRawTotalsWatermark: usage.lastRawTotalsWatermark,
seenRawTotals: usage.seenRawTotals,
hasDivergentTotals: usage.hasDivergentTotals,
hasInterleavedTotals: usage.hasInterleavedTotals,
lastCodexTurnID: usage.lastCodexTurnID,
sessionId: usage.sessionId,
forkedFromId: usage.forkedFromId,
Expand Down Expand Up @@ -956,10 +965,18 @@ extension CostUsageScanner {
let startOffset = cached.parsedBytes ?? cached.size
let initialCountedTotals = cached.lastCountedTotals ?? cached.lastTotals
let initialRawTotalsBaseline = cached.lastRawTotalsBaseline ?? cached.lastTotals
let initialHasDivergentTotals = cached.hasDivergentTotals ?? (cached.lastTotals == nil)
// Correctness-critical interleave state is watermark + interleaved flag (+ counted/raw).
// `seenRawTotals` is optional precision only and must not gate incremental resume (#2037).
let hasIncompleteInterleaveState =
(cached.hasInterleavedTotals == true && cached.lastRawTotalsWatermark == nil)
|| (cached.lastRawTotalsWatermark != nil && cached.hasInterleavedTotals == nil)
|| (initialHasDivergentTotals && cached.lastRawTotalsWatermark == nil)
let canIncremental = input.metadata.size > cached.size && startOffset > 0
&& startOffset <= input.metadata.size
&& initialCountedTotals != nil
&& cached.forkedFromId == nil
&& !hasIncompleteInterleaveState
guard canIncremental else { return false }

let delta = try Self.parseCodexFileCancellable(
Expand All @@ -969,7 +986,10 @@ extension CostUsageScanner {
initialModel: cached.lastModel,
initialTotals: initialCountedTotals,
initialRawTotalsBaseline: initialRawTotalsBaseline,
initialHasDivergentTotals: cached.hasDivergentTotals ?? (cached.lastTotals == nil),
initialRawTotalsWatermark: cached.lastRawTotalsWatermark,
initialSeenRawTotals: cached.seenRawTotals ?? [],
initialHasDivergentTotals: initialHasDivergentTotals,
initialHasInterleavedTotals: cached.hasInterleavedTotals ?? false,
initialCodexTurnID: cached.lastCodexTurnID,
initialCodexUsageRowIndex: Self.nextCodexUsageRowIndex(cached.codexRows),
checkCancellation: context.checkCancellation)
Expand Down Expand Up @@ -1039,7 +1059,10 @@ extension CostUsageScanner {
lastTotals: delta.lastTotals,
lastCountedTotals: delta.lastCountedTotals,
lastRawTotalsBaseline: delta.lastRawTotalsBaseline,
lastRawTotalsWatermark: delta.lastRawTotalsWatermark,
seenRawTotals: delta.seenRawTotals,
hasDivergentTotals: delta.hasDivergentTotals,
hasInterleavedTotals: delta.hasInterleavedTotals,
lastCodexTurnID: delta.lastCodexTurnID,
sessionId: sessionId,
forkedFromId: delta.forkedFromId ?? migratedCached.forkedFromId,
Expand Down Expand Up @@ -1133,7 +1156,10 @@ extension CostUsageScanner {
lastTotals: parsed.lastTotals,
lastCountedTotals: parsed.lastCountedTotals,
lastRawTotalsBaseline: parsed.lastRawTotalsBaseline,
lastRawTotalsWatermark: parsed.lastRawTotalsWatermark,
seenRawTotals: parsed.seenRawTotals,
hasDivergentTotals: parsed.hasDivergentTotals,
hasInterleavedTotals: parsed.hasInterleavedTotals,
lastCodexTurnID: parsed.lastCodexTurnID,
sessionId: sessionId,
forkedFromId: parsed.forkedFromId,
Expand Down
Loading