From 45a6c394ca99fb72d8a11df807d857e801cae8cf Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Fri, 9 Jan 2026 00:40:57 +0100 Subject: [PATCH] Fix components not rebuilding content on theme change --- packages/coding-agent/CHANGELOG.md | 4 ++++ .../modes/interactive/components/assistant-message.ts | 10 ++++++++++ .../src/modes/interactive/components/bash-execution.ts | 5 +++++ .../interactive/components/branch-summary-message.ts | 5 +++++ .../components/compaction-summary-message.ts | 5 +++++ .../src/modes/interactive/components/custom-message.ts | 5 +++++ .../src/modes/interactive/components/tool-execution.ts | 5 +++++ 7 files changed, 39 insertions(+) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index c8ab95f0..efa35719 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Components now properly rebuild their content on theme change (tool executions, assistant messages, bash executions, custom messages, branch/compaction summaries) + ## [0.39.1] - 2026-01-08 ### Fixed diff --git a/packages/coding-agent/src/modes/interactive/components/assistant-message.ts b/packages/coding-agent/src/modes/interactive/components/assistant-message.ts index 399f834e..a47954ca 100644 --- a/packages/coding-agent/src/modes/interactive/components/assistant-message.ts +++ b/packages/coding-agent/src/modes/interactive/components/assistant-message.ts @@ -8,6 +8,7 @@ import { getMarkdownTheme, theme } from "../theme/theme.js"; export class AssistantMessageComponent extends Container { private contentContainer: Container; private hideThinkingBlock: boolean; + private lastMessage?: AssistantMessage; constructor(message?: AssistantMessage, hideThinkingBlock = false) { super(); @@ -23,11 +24,20 @@ export class AssistantMessageComponent extends Container { } } + override invalidate(): void { + super.invalidate(); + if (this.lastMessage) { + this.updateContent(this.lastMessage); + } + } + setHideThinkingBlock(hide: boolean): void { this.hideThinkingBlock = hide; } updateContent(message: AssistantMessage): void { + this.lastMessage = message; + // Clear content container this.contentContainer.clear(); diff --git a/packages/coding-agent/src/modes/interactive/components/bash-execution.ts b/packages/coding-agent/src/modes/interactive/components/bash-execution.ts index 8f98b45e..9dd5f371 100644 --- a/packages/coding-agent/src/modes/interactive/components/bash-execution.ts +++ b/packages/coding-agent/src/modes/interactive/components/bash-execution.ts @@ -73,6 +73,11 @@ export class BashExecutionComponent extends Container { this.updateDisplay(); } + override invalidate(): void { + super.invalidate(); + this.updateDisplay(); + } + appendOutput(chunk: string): void { // Strip ANSI codes and normalize line endings // Note: binary data is already sanitized in tui-renderer.ts executeBashCommand diff --git a/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts b/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts index fedb2de1..a108b466 100644 --- a/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts +++ b/packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts @@ -21,6 +21,11 @@ export class BranchSummaryMessageComponent extends Box { this.updateDisplay(); } + override invalidate(): void { + super.invalidate(); + this.updateDisplay(); + } + private updateDisplay(): void { this.clear(); diff --git a/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts b/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts index fce96f08..9da74053 100644 --- a/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts +++ b/packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts @@ -21,6 +21,11 @@ export class CompactionSummaryMessageComponent extends Box { this.updateDisplay(); } + override invalidate(): void { + super.invalidate(); + this.updateDisplay(); + } + private updateDisplay(): void { this.clear(); diff --git a/packages/coding-agent/src/modes/interactive/components/custom-message.ts b/packages/coding-agent/src/modes/interactive/components/custom-message.ts index 3e535289..2b4babcc 100644 --- a/packages/coding-agent/src/modes/interactive/components/custom-message.ts +++ b/packages/coding-agent/src/modes/interactive/components/custom-message.ts @@ -36,6 +36,11 @@ export class CustomMessageComponent extends Container { } } + override invalidate(): void { + super.invalidate(); + this.rebuild(); + } + private rebuild(): void { // Remove previous content component if (this.customComponent) { diff --git a/packages/coding-agent/src/modes/interactive/components/tool-execution.ts b/packages/coding-agent/src/modes/interactive/components/tool-execution.ts index 1e4cdff5..bfc6ee4d 100644 --- a/packages/coding-agent/src/modes/interactive/components/tool-execution.ts +++ b/packages/coding-agent/src/modes/interactive/components/tool-execution.ts @@ -219,6 +219,11 @@ export class ToolExecutionComponent extends Container { this.updateDisplay(); } + override invalidate(): void { + super.invalidate(); + this.updateDisplay(); + } + private updateDisplay(): void { // Set background based on state const bgFn = this.isPartial