mirror of
https://github.com/stablyai/orca.git
synced 2026-10-19 08:03:13 +00:00
Field bug (v1.4.144-rc.4): switching to a workspace with a streaming inline TUI (Codex) periodically shows a mostly-blank pane (viewport stranded mid-buffer, input box missing) or a bottom gap (PTY rows != pane rows) until a manual resize forces SIGWINCH. Three independent losing legs on the reveal path, each fixed: 1. Stranded corrective fit: the reattach/hidden-snapshot replay parks its PTY-resize continuation behind "the next successful fit"; when the pane is momentarily unmeasurable mid-reveal, no later fit is guaranteed (container size may already be final), leaving xterm at snapshot dims with no forwarded resize. safeFitAndThen now actively retries on settled frames (bounded) and breadcrumbs on exhaustion. 2. Swallowed replay paint: the cold-park remount path has no reveal repaint, so a replay parsed while xterm's RenderService is paused (IntersectionObserver lags the reveal) never painted. The settle refresh now drives one synchronous render through the pause latch (extends the #7614 release to the remount path). 3. Viewport stranded at the snapshot bottom: the reveal's bottom anchor is a one-shot that runs before deferred live chunks parse; an inline TUI keeps appending across the reveal. Re-enforce the restored scroll intent after the deferred drain parses (pins preserved). New regression harness: tests/e2e/terminal-inline-tui-reveal-convergence drives a codex-shaped inline fixture (agent-marked tab, scrollback inserts + bottom live block, synchronized output, mouse reporting) through hidden/parked/flapping/resize reveals under CPU throttle and asserts convergence with no resize: viewport at bottom, fresh frame + input row visible, still following, xterm == fit proposal == applied PTY size, and painted-pixel ink in the live-block band (WebGL forced). Co-authored-by: Orca <help@stably.ai>