From 2ee6d867bd93bb955429a274865320dfa5bd0f69 Mon Sep 17 00:00:00 2001 From: haoyuren <13851610112@163.com> Date: Fri, 13 Mar 2026 22:35:05 -0500 Subject: Fix embedded terminal for Claude Code: PTY env, DEC 2026, xterm.js window queries - Add missing PTY environment variables (TERM, COLORTERM, LANG, TERM_PROGRAM) - Strip DEC 2026 synchronized output sequences that cause xterm.js to buffer indefinitely when begin/end markers are split across PTY chunks - Enable xterm.js windowOptions for terminal pixel/char size queries that Claude Code sends to determine rendering capabilities - Launch Claude tab via login shell for full PATH inheritance Co-Authored-By: Claude Opus 4.6 --- src/main/index.ts | 14 ++++++++++++-- src/renderer/src/components/Terminal.tsx | 10 ++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/main/index.ts b/src/main/index.ts index d4d9b2d..96a225c 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -100,18 +100,28 @@ ipcMain.handle('pty:spawn', async (_e, id: string, cwd: string, cmd?: string, ar const shellPath = cmd || process.env.SHELL || '/bin/zsh' const shellArgs = args || ['-l'] + const ptyEnv: Record = { + ...(process.env as Record), + TERM: 'xterm-256color', + COLORTERM: 'truecolor', + TERM_PROGRAM: 'LatteX', + LANG: process.env.LANG || 'en_US.UTF-8', + } const instance = pty.spawn(shellPath, shellArgs, { name: 'xterm-256color', cols: 80, rows: 24, cwd, - env: process.env as Record + env: ptyEnv }) ptyInstances.set(id, instance) instance.onData((data) => { - sendToRenderer(`pty:data:${id}`, data) + // Strip DEC 2026 synchronized output sequences — xterm.js may buffer indefinitely + // if the begin/end markers are split across PTY chunks + const cleaned = data.replace(/\x1b\[\?2026[hl]/g, '') + if (cleaned) sendToRenderer(`pty:data:${id}`, cleaned) }) instance.onExit(() => { diff --git a/src/renderer/src/components/Terminal.tsx b/src/renderer/src/components/Terminal.tsx index 9a2e24c..72f785f 100644 --- a/src/renderer/src/components/Terminal.tsx +++ b/src/renderer/src/components/Terminal.tsx @@ -53,7 +53,13 @@ function TerminalInstance({ id, cwd, cmd, args, visible }: { fontFamily: '"SF Mono", "Fira Code", "JetBrains Mono", monospace', fontSize: 13, cursorBlink: true, - scrollback: 10000 + scrollback: 10000, + windowOptions: { + getWinSizePixels: true, + getCellSizePixels: true, + getWinSizeChars: true, + getWinPosition: true, + } }) const fitAddon = new FitAddon() @@ -149,7 +155,7 @@ export default function Terminal() { {claudeSpawned && ( - + )} ) -- cgit v1.2.3