diff --git a/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts b/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts index f25c420c5..bf766c052 100644 --- a/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts +++ b/packages/app/src/terminal/runtime/terminal-emulator-runtime.ts @@ -211,6 +211,12 @@ export class TerminalEmulatorRuntime { terminal.loadAddon(new ImageAddon()); + // Suppress terminal query responses — the server-side headless xterm handles these. + // Without this, xterm.js generates DA/CPR responses via onData that feed back + // to the PTY as visible text. + terminal.parser.registerCsiHandler({ final: "c" }, () => true); + terminal.parser.registerCsiHandler({ final: "R" }, () => true); + const restoreDocumentStyles = this.applyDocumentBoundsStyles({ root: input.root, }); diff --git a/packages/server/src/terminal/terminal.ts b/packages/server/src/terminal/terminal.ts index d10d34f6f..59acda802 100644 --- a/packages/server/src/terminal/terminal.ts +++ b/packages/server/src/terminal/terminal.ts @@ -272,6 +272,15 @@ export async function createTerminal(options: CreateTerminalOptions): Promise { + if (params.length === 0 || (params.length === 1 && params[0] === 0)) { + ptyProcess.write("\x1b[?62;4;22c"); + return true; + } + return false; + }); + function emitExit(): void { if (exitEmitted) { return;