From da29b12112181fbe90477662708b96cd1b0859c3 Mon Sep 17 00:00:00 2001 From: notnotype Date: Sat, 15 Aug 2026 15:39:42 +0800 Subject: [PATCH] fix(tui): refresh token usage rows when toggled --- packages/coding-agent/CHANGELOG.md | 4 ++++ .../modes/controllers/selector-controller.ts | 6 ++++++ .../selector-settings-side-effects.test.ts | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 5597d222b..61e6f5c93 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed toggling `display.showTokenUsage` from `/settings` leaving existing token-usage rows stale until the transcript was rebuilt. + ## [17.3.4] - 2026-08-14 ### Changed diff --git a/packages/coding-agent/src/modes/controllers/selector-controller.ts b/packages/coding-agent/src/modes/controllers/selector-controller.ts index d2c5cd788..61f00c31c 100644 --- a/packages/coding-agent/src/modes/controllers/selector-controller.ts +++ b/packages/coding-agent/src/modes/controllers/selector-controller.ts @@ -562,6 +562,12 @@ export class SelectorController { this.ctx.rebuildChatFromMessages(); this.ctx.ui.resetDisplay(); break; + case "display.showTokenUsage": + // Rebuild reruns usage-row detection under the new setting; resetDisplay + // retires rows already committed to native scrollback. + this.ctx.rebuildChatFromMessages(); + this.ctx.ui.resetDisplay(); + break; case "tui.tight": setTuiTight(value as boolean); this.ctx.ui.invalidate(); diff --git a/packages/coding-agent/test/selector-settings-side-effects.test.ts b/packages/coding-agent/test/selector-settings-side-effects.test.ts index 82c220278..0bf313358 100644 --- a/packages/coding-agent/test/selector-settings-side-effects.test.ts +++ b/packages/coding-agent/test/selector-settings-side-effects.test.ts @@ -166,6 +166,25 @@ describe("selector setting side effects", () => { }); } + for (const enabled of [false, true]) { + it(`rebuilds the transcript when display.showTokenUsage=${enabled} changes in /settings`, () => { + const rebuildChatFromMessages = vi.fn(); + const resetDisplay = vi.fn(); + const controller = new SelectorController({ + rebuildChatFromMessages, + ui: { resetDisplay }, + } as unknown as InteractiveModeContext); + + controller.handleSettingChange("display.showTokenUsage", enabled); + + expect(rebuildChatFromMessages).toHaveBeenCalledTimes(1); + expect(resetDisplay).toHaveBeenCalledTimes(1); + expect(rebuildChatFromMessages.mock.invocationCallOrder[0]).toBeLessThan( + resetDisplay.mock.invocationCallOrder[0], + ); + }); + } + it("clears stale default role thinking when auto is selected", async () => { const testTheme = await getThemeByName("dark"); if (!testTheme) throw new Error("Failed to load dark theme for model selector test");