diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index 7f764ac1..067370b2 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -717,7 +717,7 @@ async function runInteractiveMode( version: string, changelogMarkdown: string | null = null, modelFallbackMessage: string | null = null, - newVersion: string | null = null, + versionCheckPromise: Promise, scopedModels: Array<{ model: Model; thinkingLevel: ThinkingLevel }> = [], initialMessages: string[] = [], initialMessage?: string, @@ -730,7 +730,6 @@ async function runInteractiveMode( settingsManager, version, changelogMarkdown, - newVersion, scopedModels, fdPath, ); @@ -738,6 +737,13 @@ async function runInteractiveMode( // Initialize TUI (subscribes to agent events internally) await renderer.init(); + // Handle version check result when it completes (don't block) + versionCheckPromise.then((newVersion) => { + if (newVersion) { + renderer.showNewVersionNotification(newVersion); + } + }); + // Render any existing messages (from --continue mode) renderer.renderInitialMessages(agent.state); @@ -1334,16 +1340,8 @@ export async function main(args: string[]) { // RPC mode - headless operation await runRpcMode(agent, sessionManager, settingsManager); } else if (isInteractive) { - // Check for new version (don't block startup if it takes too long) - let newVersion: string | null = null; - try { - newVersion = await Promise.race([ - checkForNewVersion(VERSION), - new Promise((resolve) => setTimeout(() => resolve(null), 1000)), // 1 second timeout - ]); - } catch (e) { - // Ignore errors - } + // Check for new version in the background (don't block startup) + const versionCheckPromise = checkForNewVersion(VERSION).catch(() => null); // Check if we should show changelog (only in interactive mode, only for new sessions) let changelogMarkdown: string | null = null; @@ -1394,7 +1392,7 @@ export async function main(args: string[]) { VERSION, changelogMarkdown, modelFallbackMessage, - newVersion, + versionCheckPromise, scopedModels, parsed.messages, initialMessage, diff --git a/packages/coding-agent/src/tui/tui-renderer.ts b/packages/coding-agent/src/tui/tui-renderer.ts index 5447654c..53d9c781 100644 --- a/packages/coding-agent/src/tui/tui-renderer.ts +++ b/packages/coding-agent/src/tui/tui-renderer.ts @@ -70,7 +70,6 @@ export class TuiRenderer { private lastSigintTime = 0; private changelogMarkdown: string | null = null; - private newVersion: string | null = null; // Message queueing private queuedMessages: string[] = []; @@ -126,7 +125,6 @@ export class TuiRenderer { settingsManager: SettingsManager, version: string, changelogMarkdown: string | null = null, - newVersion: string | null = null, scopedModels: Array<{ model: Model; thinkingLevel: ThinkingLevel }> = [], fdPath: string | null = null, ) { @@ -134,7 +132,6 @@ export class TuiRenderer { this.sessionManager = sessionManager; this.settingsManager = settingsManager; this.version = version; - this.newVersion = newVersion; this.changelogMarkdown = changelogMarkdown; this.scopedModels = scopedModels; this.ui = new TUI(new ProcessTerminal()); @@ -303,22 +300,6 @@ export class TuiRenderer { this.ui.addChild(header); this.ui.addChild(new Spacer(1)); - // Add new version notification if available - if (this.newVersion) { - this.ui.addChild(new DynamicBorder((text) => theme.fg("warning", text))); - this.ui.addChild( - new Text( - theme.bold(theme.fg("warning", "Update Available")) + - "\n" + - theme.fg("muted", `New version ${this.newVersion} is available. Run: `) + - theme.fg("accent", "npm install -g @mariozechner/pi-coding-agent"), - 1, - 0, - ), - ); - this.ui.addChild(new DynamicBorder((text) => theme.fg("warning", text))); - } - // Add changelog if provided if (this.changelogMarkdown) { this.ui.addChild(new DynamicBorder()); @@ -1214,6 +1195,24 @@ export class TuiRenderer { this.ui.requestRender(); } + showNewVersionNotification(newVersion: string): void { + // Show new version notification in the chat + this.chatContainer.addChild(new Spacer(1)); + this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("warning", text))); + this.chatContainer.addChild( + new Text( + theme.bold(theme.fg("warning", "Update Available")) + + "\n" + + theme.fg("muted", `New version ${newVersion} is available. Run: `) + + theme.fg("accent", "npm install -g @mariozechner/pi-coding-agent"), + 1, + 0, + ), + ); + this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("warning", text))); + this.ui.requestRender(); + } + private showThinkingSelector(): void { // Create thinking selector with current level this.thinkingSelector = new ThinkingSelectorComponent(