fix: normalize missing Codex token usage

Treat token_count events without usage as null canonical token values so node:sqlite never receives undefined. Covers issue #1 with a parse-to-persist regression test.
This commit is contained in:
tommy0103
2026-07-22 01:02:25 +08:00
parent 28fa99ac94
commit 476d4a94fa
3 changed files with 52 additions and 7 deletions
+13 -4
View File
@@ -296,12 +296,21 @@ function parseCodexJsonInput(value: JsonValue): JsonValue {
try { return JSON.parse(value); } catch { return value; }
}
function codexUsage(payload: JsonRecord) {
interface CodexUsage {
inputTokens: number | null;
outputTokens: number | null;
}
function codexUsage(payload: JsonRecord): CodexUsage {
const usage = payload?.info?.last_token_usage || payload?.info?.total_token_usage || payload?.last_token_usage || null;
if (!usage) return {};
if (!usage) return { inputTokens: null, outputTokens: null };
return {
inputTokens: usage.input_tokens ?? null,
outputTokens: usage.output_tokens ?? null,
inputTokens: typeof usage.input_tokens === 'number' && Number.isFinite(usage.input_tokens)
? usage.input_tokens
: null,
outputTokens: typeof usage.output_tokens === 'number' && Number.isFinite(usage.output_tokens)
? usage.output_tokens
: null,
};
}
+3 -3
View File
@@ -256,9 +256,9 @@ export function* parse(unit: IndexUnit, _cursor: Cursor): Generator<TranscriptRe
}
if (payload.type === 'token_count') {
const usage = codexUsage(payload);
if (usage.inputTokens !== null) sm.totalInputTokens = usage.inputTokens;
if (usage.outputTokens !== null) sm.totalOutputTokens = usage.outputTokens;
if (sm.lastTextAssistantUuid && (usage.inputTokens !== null || usage.outputTokens !== null)) {
if (usage.inputTokens != null) sm.totalInputTokens = usage.inputTokens;
if (usage.outputTokens != null) sm.totalOutputTokens = usage.outputTokens;
if (sm.lastTextAssistantUuid && (usage.inputTokens != null || usage.outputTokens != null)) {
const rec = msgByUuid.get(sm.lastTextAssistantUuid);
if (rec) { rec.input_tokens = usage.inputTokens; rec.output_tokens = usage.outputTokens; }
}