fix(tui): disable fast-echo bypass inside tmux to prevent cursor drift

This commit is contained in:
fyzanshaik 2026-06-19 15:18:29 +05:30 committed by kshitijk4poor
parent 5378b94120
commit ab8f063814
2 changed files with 27 additions and 0 deletions

View file

@ -178,6 +178,26 @@ describe('supportsFastEchoTerminal', () => {
expect(supportsFastEchoTerminal({ TERM_PROGRAM: 'Apple_Terminal' } as NodeJS.ProcessEnv)).toBe(false)
})
it('disables fast-echo inside tmux', () => {
expect(supportsFastEchoTerminal({ TMUX: '/tmp/tmux-1000/default,1234,0' } as NodeJS.ProcessEnv)).toBe(false)
expect(supportsFastEchoTerminal({ TMUX: '/private/tmp/tmux-501/default' } as NodeJS.ProcessEnv)).toBe(false)
})
it('tmux wins over Termux fast-echo opt-in', () => {
expect(
supportsFastEchoTerminal({
TMUX: '/tmp/tmux-1000/default,1234,0',
HERMES_TUI_TERMUX_FAST_ECHO: '1',
TERMUX_VERSION: '0.118.0'
} as NodeJS.ProcessEnv)
).toBe(false)
})
it('keeps fast-echo enabled when TMUX is empty or unset', () => {
expect(supportsFastEchoTerminal({ TMUX: '' } as NodeJS.ProcessEnv)).toBe(true)
expect(supportsFastEchoTerminal({ TERM_PROGRAM: 'vscode' } as NodeJS.ProcessEnv)).toBe(true)
})
it('disables fast-echo by default in Termux mode', () => {
expect(
supportsFastEchoTerminal({ TERMUX_VERSION: '0.118.0', PREFIX: '/data/data/com.termux/files/usr' } as NodeJS.ProcessEnv)

View file

@ -359,6 +359,13 @@ export function supportsFastEchoTerminal(env: NodeJS.ProcessEnv = process.env):
return false
}
// tmux adds a PTY multiplexing layer that desyncs stdout.write() cursor
// advances from its internal cursor model, causing cursor drift and ghost
// whitespace under the fast-echo bypass path.
if ((env.TMUX ?? '').trim().length > 0) {
return false
}
// Termux terminals are especially sensitive to bypass-path cursor drift and
// stale paints at soft-wrap boundaries on tall/narrow viewports. Keep this
// off by default in Termux mode; allow explicit opt-in for local debugging.