From b9b1601bb872df0873ae33a38fe3ddfec1c049a9 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 23 Mar 2026 12:43:21 +0700 Subject: [PATCH] fix(terminal): suppress DA response feedback loop after closing vim Client-side xterm.js was generating Device Attributes responses via onData, which fed back to the PTY as visible text. Register CSI handlers to consume query responses on the client and respond to DA1 on the server. --- .../src/terminal/runtime/terminal-emulator-runtime.ts | 6 ++++++ packages/server/src/terminal/terminal.ts | 9 +++++++++ 2 files changed, 15 insertions(+) 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;