mirror of
https://github.com/stablyai/orca.git
synced 2026-09-24 08:02:33 +00:00
* fix(terminal): reset PTY delivery accounting across renderer lifecycle resets (frozen panes) Panes froze permanently because main's PTY->renderer flow control leaked its unacked in-flight byte counters and pending backlog across renderer reloads/crashes: the lifecycle reset cleared only visibility hints, daemon PTYs outlive the page, and the new page never acks the dead page's bytes, so any pty with >=512KB unacked at reload time was delivery-gated forever (proven by dev repro: counter pinned at exactly 524288; one manual ackData of the leaked bytes instantly unfroze the pane). Fix: (1) zero in-flight counters + pending backlog on every main-frame renderer lifecycle reset (panes rebuild losslessly from main's authoritative snapshot on reattach); (2) hold PTY sends until the new page's pty:data listener signals ready (pty:rendererDispatcherReady), so boot-window output accrues in the capped backlog instead of being counted-but-dropped; (3) 10s self-heal watchdog + reconcile-on-handshake backstop so a missed reset (subframe-overlapped reload emits no did-start-loading) or lost handshake can never itself freeze delivery; (4) derive the active-renderer-pty report reactively so in-place rebinds keep the interactive reserve; (5) expose reset/gate state in the delivery debug snapshot for future diagnosis. Adds an experimental reliability gate (pty-delivery.renderer-lifecycle-accounting-reset) with red/green-proven regression tests for each branch of the fix. * chore(reliability-gates): link PR #8034 as the gate's motivating fix * fix(terminal): sender-guard the dispatcher-ready handshake; fix WSL gate wording CodeRabbit: the reconcile backstop destructively clears delivery accounting, so a straggler pty:rendererDispatcherReady from a dying window's webContents must not reset the new window — reuse the pty:write main-window sender check (+ regression test). Also resolve the contradictory WSL coverage claim in the reliability gate notes (WSL rides the same local/daemon pipeline; mobile/relay and SSH are separate paths).