From 0ba19b4fe48f1e742374ae8e443912f667e96e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E5=A5=87?= Date: Mon, 10 Aug 2026 10:19:48 +0800 Subject: [PATCH] fix(cli): enable DEC synchronized output on Warp to reduce redraw flicker Warp answers the DECRQM 2026 probe with status 2 (recognized, reset), so synchronized updates are available there. Without them Warp renders ink's erase-then-rewrite frame pattern as visible flicker (issue #8557). Add WarpTerminal to the synchronized-output allowlist; the existing QWEN_CODE_DISABLE_SYNCHRONIZED_OUTPUT escape hatch covers regressions. --- packages/cli/src/ui/utils/synchronizedOutput.test.ts | 3 +++ packages/cli/src/ui/utils/synchronizedOutput.ts | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/ui/utils/synchronizedOutput.test.ts b/packages/cli/src/ui/utils/synchronizedOutput.test.ts index f9c9da0e1c0..22c26ef65cc 100644 --- a/packages/cli/src/ui/utils/synchronizedOutput.test.ts +++ b/packages/cli/src/ui/utils/synchronizedOutput.test.ts @@ -31,7 +31,10 @@ function createStdout(write: NodeJS.WriteStream['write']): NodeJS.WriteStream { describe('terminalSupportsSynchronizedOutput', () => { it.each([ [{ TERM_PROGRAM: 'WezTerm' }, true], + [{ TERM_PROGRAM: 'WarpTerminal' }, true], + [{ TERM_PROGRAM: 'ghostty' }, true], [{ TERM_PROGRAM: 'iTerm.app' }, true], + [{ TERM_PROGRAM: 'WarpTerminal' }, true], [{ TERM: 'xterm-kitty' }, true], [{ KITTY_WINDOW_ID: '1' }, true], [{ TERM_PROGRAM: 'Apple_Terminal' }, false], diff --git a/packages/cli/src/ui/utils/synchronizedOutput.ts b/packages/cli/src/ui/utils/synchronizedOutput.ts index fb75786ad27..af8425c4eff 100644 --- a/packages/cli/src/ui/utils/synchronizedOutput.ts +++ b/packages/cli/src/ui/utils/synchronizedOutput.ts @@ -53,7 +53,16 @@ export function terminalSupportsSynchronizedOutput( } const termProgram = env['TERM_PROGRAM']; - if (termProgram === 'WezTerm' || termProgram === 'iTerm.app') { + // Warp's DECRQM 2026 probe answers status 2 (recognized, reset), so + // synchronized updates are available there; without them Warp renders the + // erase-then-rewrite pattern as flicker (issue #8557). Ghostty implements + // synchronized output natively. + if ( + termProgram === 'WezTerm' || + termProgram === 'iTerm.app' || + termProgram === 'WarpTerminal' || + termProgram === 'ghostty' + ) { return true; }