fix: harden token usage reporting

Token usage is shown as concrete counts, so malformed provider payloads must not leak NaN.

Gemini can emit token fields as strings or invalid values, so non-finite values now fall back to 0.

OpenCode token reads happen while the CLI is shutting down, when the DB may be missing or locked.

Those failures now return null instead of interrupting session completion.

/cost no longer invents an input breakdown from an aggregate total.

When a provider only supplies total usage, the UI now says the breakdown is unavailable.

This keeps the display honest instead of presenting made-up input and output rows.

Verification: npm run typecheck; targeted eslint.
This commit is contained in:
Haileyesus
2026-05-29 17:40:44 +03:00
parent ed9f0d74aa
commit 04edf7d9c4
4 changed files with 45 additions and 20 deletions

View File

@@ -7,10 +7,13 @@ function buildGeminiTokenBudget(tokens) {
return null;
}
const inputTokens = Number(tokens.input || 0);
const outputTokens = Number(tokens.output || 0);
const used = Number(tokens.total || inputTokens + outputTokens || 0);
if (used <= 0) {
const parsedInputTokens = Number(tokens.input);
const parsedOutputTokens = Number(tokens.output);
const inputTokens = Number.isFinite(parsedInputTokens) ? parsedInputTokens : 0;
const outputTokens = Number.isFinite(parsedOutputTokens) ? parsedOutputTokens : 0;
const parsedUsed = Number(tokens.total);
const used = Number.isFinite(parsedUsed) ? parsedUsed : inputTokens + outputTokens;
if (!Number.isFinite(used) || used <= 0) {
return null;
}