fix(tui): show 0 not ? for fresh-session context tokens in footer (#9… · openclaw/openclaw@78f948f
mushuiyu886
·
2026-06-19
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -62,6 +62,7 @@ export type TuiSessionList = {
|
62 | 62 | | "inputTokens" |
63 | 63 | | "outputTokens" |
64 | 64 | | "totalTokens" |
| 65 | +| "totalTokensFresh" |
65 | 66 | | "goal" |
66 | 67 | | "modelProvider" |
67 | 68 | | "displayName" |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -495,6 +495,44 @@ describe("tui session actions", () => {
|
495 | 495 | expect(listSessions).not.toHaveBeenCalled(); |
496 | 496 | }); |
497 | 497 | |
| 498 | +it("renders a fresh session total as 0 (not '?') when totalTokensFresh is set", async () => { |
| 499 | +const listSessions = vi.fn().mockResolvedValue({ sessions: [] }); |
| 500 | +const loadHistory = vi.fn().mockResolvedValue({ |
| 501 | +sessionId: "session-fresh", |
| 502 | +sessionInfo: { |
| 503 | +key: "agent:main:fresh", |
| 504 | +sessionId: "session-fresh", |
| 505 | +model: "session-model", |
| 506 | +modelProvider: "openai", |
| 507 | +// The gateway strips the fresh 0 via resolvePositiveNumber but still |
| 508 | +// flags it fresh, so the footer must show 0 rather than "?". (#93798) |
| 509 | +totalTokensFresh: true, |
| 510 | +updatedAt: 60, |
| 511 | +}, |
| 512 | +messages: [], |
| 513 | +}); |
| 514 | +const state = createBaseState({ |
| 515 | +historyLoaded: true, |
| 516 | +sessionInfo: { |
| 517 | +totalTokens: 3, |
| 518 | +updatedAt: 500, |
| 519 | +}, |
| 520 | +}); |
| 521 | + |
| 522 | +const { setSession } = createTestSessionActions({ |
| 523 | +client: { |
| 524 | + listSessions, |
| 525 | + loadHistory, |
| 526 | +} as unknown as TuiBackend, |
| 527 | + state, |
| 528 | +}); |
| 529 | + |
| 530 | +await setSession("agent:main:fresh"); |
| 531 | + |
| 532 | +expect(state.sessionInfo.totalTokens).toBe(0); |
| 533 | +expect(state.sessionInfo.totalTokensFresh).toBe(true); |
| 534 | +}); |
| 535 | + |
498 | 536 | it("restores an in-flight run reported by chat.history on switch-back", async () => { |
499 | 537 | const loadHistory = vi.fn().mockResolvedValue({ |
500 | 538 | sessionId: "session-bg", |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -253,6 +253,13 @@ export function createSessionActions(context: SessionActionContext) {
|
253 | 253 | } |
254 | 254 | if (entry?.totalTokens !== undefined) { |
255 | 255 | next.totalTokens = entry.totalTokens; |
| 256 | +next.totalTokensFresh = entry.totalTokensFresh === true; |
| 257 | +} else if (entry?.totalTokensFresh === true) { |
| 258 | +// Fresh session: the total is known to be 0. The gateway strips the 0 via |
| 259 | +// resolvePositiveNumber but still flags it fresh, so render 0 (not "?"), |
| 260 | +// mirroring the /status fix in #93798. See followup to #93771. |
| 261 | +next.totalTokens = 0; |
| 262 | +next.totalTokensFresh = true; |
256 | 263 | } |
257 | 264 | if (params.clearMissingUsage) { |
258 | 265 | if (entry?.inputTokens === undefined) { |
@@ -261,8 +268,9 @@ export function createSessionActions(context: SessionActionContext) {
|
261 | 268 | if (entry?.outputTokens === undefined) { |
262 | 269 | next.outputTokens = null; |
263 | 270 | } |
264 | | -if (entry?.totalTokens === undefined) { |
| 271 | +if (entry?.totalTokens === undefined && entry?.totalTokensFresh !== true) { |
265 | 272 | next.totalTokens = null; |
| 273 | +next.totalTokensFresh = undefined; |
266 | 274 | } |
267 | 275 | } |
268 | 276 | if (hasEntryUpdate) { |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -83,6 +83,12 @@ export type SessionInfo = {
|
83 | 83 | inputTokens?: number | null; |
84 | 84 | outputTokens?: number | null; |
85 | 85 | totalTokens?: number | null; |
| 86 | +/** |
| 87 | + * True when `totalTokens` is a known-fresh value (e.g. 0 on a brand-new |
| 88 | + * session) rather than an unknown/stale total. Lets the footer render `0` |
| 89 | + * instead of `?` for fresh sessions, mirroring the `/status` fix in #93798. |
| 90 | + */ |
| 91 | +totalTokensFresh?: boolean; |
86 | 92 | goal?: SessionGoal; |
87 | 93 | responseUsage?: ResponseUsageMode; |
88 | 94 | updatedAt?: number | null; |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。