fix: /status shows incorrect context percentage — totalTokens clamped to contextTokens (#15114) (#15133)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: a489669fc7
Co-authored-by: echoVic <16428813+echoVic@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
This commit is contained in:
青雲
2026-02-13 12:52:19 +08:00
committed by GitHub
parent b93ad2cd48
commit fd076eb43a
28 changed files with 361 additions and 53 deletions

View File

@@ -47,7 +47,7 @@ describe("normalizeUsage", () => {
expect(hasNonzeroUsage({ total: 1 })).toBe(true);
});
it("caps derived session total tokens to the context window", () => {
it("does not clamp derived session total tokens to the context window", () => {
expect(
deriveSessionTotalTokens({
usage: {
@@ -58,7 +58,7 @@ describe("normalizeUsage", () => {
},
contextTokens: 200_000,
}),
).toBe(200_000);
).toBe(2_400_027);
});
it("uses prompt tokens when within context window", () => {

View File

@@ -134,9 +134,10 @@ export function deriveSessionTotalTokens(params: {
return undefined;
}
const contextTokens = params.contextTokens;
if (typeof contextTokens === "number" && Number.isFinite(contextTokens) && contextTokens > 0) {
total = Math.min(total, contextTokens);
}
// NOTE: Do NOT clamp total to contextTokens here. The stored totalTokens
// should reflect the actual token count (or best estimate). Clamping causes
// /status to display contextTokens/contextTokens (100%) when the accumulated
// input exceeds the context window, hiding the real usage. The display layer
// (formatTokens in status.ts) already caps the percentage at 999%.
return total;
}