diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 1f51a0fbf..391f1b252 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -21,6 +21,9 @@ ### Fixed - Fixed long `ask` option labels being hard-truncated at the terminal width with no way to read the clipped tail; the rich ask dialog now wraps labels onto indented continuation lines, matching the legacy selector ([#1243](https://github.com/can1357/oh-my-pi/issues/1243), [#8594](https://github.com/can1357/oh-my-pi/issues/8594)). +### Fixed + +- Fixed toggling `display.showTokenUsage` from `/settings` leaving existing token-usage rows stale until the transcript was rebuilt. ## [17.3.4] - 2026-08-14 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");