From 5c3c8e6f7e67b42920219c9fb38680da73d18053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kao=20F=C3=A9lix?= Date: Fri, 2 Jan 2026 22:00:34 +0100 Subject: [PATCH] Add terminal title support to TUI framework (#407) Add setTitle() method to Terminal interface for setting window title. Uses standard OSC escape sequence \x1b]0;...\x07 for broad terminal compatibility (macOS Terminal, iTerm2, Kitty, WezTerm, Ghostty, etc.). Changes: - Add setTitle(title: string) to Terminal interface - Implement in ProcessTerminal using OSC sequence - Implement no-op in VirtualTerminal for testing - Use in interactive mode to set title as "pi - " --- .../src/modes/interactive/interactive-mode.ts | 4 ++++ packages/tui/src/terminal.ts | 8 ++++++++ packages/tui/test/virtual-terminal.ts | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 536b0348..d9a21d70 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -303,6 +303,10 @@ export class InteractiveMode { this.ui.start(); this.isInitialized = true; + // Set terminal title + const cwdBasename = path.basename(process.cwd()); + this.ui.terminal.setTitle(`pi - ${cwdBasename}`); + // Initialize hooks with TUI-based UI context await this.initHooksAndCustomTools(); diff --git a/packages/tui/src/terminal.ts b/packages/tui/src/terminal.ts index 9b27c12f..e484e2a5 100644 --- a/packages/tui/src/terminal.ts +++ b/packages/tui/src/terminal.ts @@ -26,6 +26,9 @@ export interface Terminal { clearLine(): void; // Clear current line clearFromCursor(): void; // Clear from cursor to end of screen clearScreen(): void; // Clear entire screen and move cursor to (0,0) + + // Title operations + setTitle(title: string): void; // Set terminal window title } /** @@ -127,4 +130,9 @@ export class ProcessTerminal implements Terminal { clearScreen(): void { process.stdout.write("\x1b[2J\x1b[H"); // Clear screen and move to home (1,1) } + + setTitle(title: string): void { + // OSC 0;title BEL - set terminal window title + process.stdout.write(`\x1b]0;${title}\x07`); + } } diff --git a/packages/tui/test/virtual-terminal.ts b/packages/tui/test/virtual-terminal.ts index 08673d3f..9b93ced3 100644 --- a/packages/tui/test/virtual-terminal.ts +++ b/packages/tui/test/virtual-terminal.ts @@ -86,6 +86,11 @@ export class VirtualTerminal implements Terminal { this.xterm.write("\x1b[2J\x1b[H"); // Clear screen and move to home (1,1) } + setTitle(title: string): void { + // OSC 0;title BEL - set terminal window title + this.xterm.write(`\x1b]0;${title}\x07`); + } + // Test-specific methods not in Terminal interface /**