diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index bfaad940..ec74ca4f 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -6,6 +6,10 @@ - Added bash-style argument slicing for prompt templates ([#770](https://github.com/badlogic/pi-mono/pull/770) by [@airtonix](https://github.com/airtonix)) +### Fixed + +- Fixed extension messages rendering twice on startup when `pi.sendMessage({ display: true })` is called during `session_start` ([#765](https://github.com/badlogic/pi-mono/pull/765) by [@dannote](https://github.com/dannote)) + ## [0.47.0] - 2026-01-16 ### Breaking Changes diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 268bfccb..7677e116 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -145,6 +145,7 @@ export class InteractiveMode { private keybindings: KeybindingsManager; private version: string; private isInitialized = false; + private hasRenderedInitialMessages = false; private onInputCallback?: (text: string) => void; private loadingAnimation: Loader | undefined = undefined; private readonly defaultWorkingMessage = "Working..."; @@ -619,7 +620,9 @@ export class InteractiveMode { this.session .sendCustomMessage(message, options) .then(() => { - if (!wasStreaming && message.display) { + // Don't rebuild if initial render hasn't happened yet + // (renderInitialMessages will handle it) + if (!wasStreaming && message.display && this.hasRenderedInitialMessages) { this.rebuildChatFromMessages(); } }) @@ -2007,6 +2010,7 @@ export class InteractiveMode { } renderInitialMessages(): void { + this.hasRenderedInitialMessages = true; // Get aligned messages and entries from session context const context = this.sessionManager.buildSessionContext(); this.renderSessionContext(context, {