fix(terminal): skip output for certified-dead renderers

This commit is contained in:
Brennan Benson
2026-07-14 02:21:15 -07:00
parent 676090d968
commit e5a4d5c074
2 changed files with 10 additions and 0 deletions
@@ -1534,6 +1534,9 @@ describe('pane terminal output scheduler', () => {
expect(hasTerminalParseProgressSince(terminal, generation)).toBe(false)
expect(recoveryReasons).toEqual(['write-stalled'])
expect(isTerminalWritePipelineCertifiedDead(terminal)).toBe(true)
// Only the first rejection touches xterm; later PTY deliveries credit
// directly while recovery owns the certified-dead instance.
expect(terminal.write).toHaveBeenCalledTimes(1)
expect(onParsed).not.toHaveBeenCalled()
for (const ackCredit of ackCredits) {
expect(ackCredit).toHaveBeenCalledTimes(1)
@@ -21,6 +21,7 @@ import {
armTerminalWriteStallWatch,
cancelTerminalWriteStallWatch,
failTerminalWriteStallWatch,
isTerminalWritePipelineCertifiedDead,
settleTerminalWriteStallWatch
} from './terminal-write-pipeline-health'
import {
@@ -1123,6 +1124,12 @@ export function writeTerminalOutput(
options: WriteTerminalOutputOptions
): void {
exposeDebugApi()
// Why: recovery may be budget-delayed while PTY output keeps flowing. Main
// owns the authoritative buffer; credit delivery without waking dead xterm.
if (isTerminalWritePipelineCertifiedDead(terminal)) {
options.ackCredit?.()
return
}
if (!data) {
// Why: an empty write still consumed its delivery — credit or main's
// in-flight window leaks.