mirror of
https://github.com/stablyai/orca.git
synced 2026-10-19 00:03:20 +00:00
Every field report of the frozen-terminal family so far has needed follow-up asks (console output, main logs, second snapshots) because each capture showed one process's counters at one instant. This makes a single DevTools command sufficient: `await window.__orcaTerminalFreezeReport()` returns renderer state (document.visibilityState + the stale-visibility override, pty:data listener count, delivery-watchdog totals), main's debug snapshot extended with a per-pty delivery table (sent/acked/pending, hidden vs visible-set membership, last send/ACK ages, window focus flags, power suspend/resume ages, app version), and bounded breadcrumb rings from BOTH processes recording the transitions that matter: gate marks/unmarks, visibilitychange and stale-visibility latches, watchdog stalls and heals, restore markers, heal write-offs, and renderer lifecycle resets (so "user already reloaded" is visible in the history). Costs stay off the data path: breadcrumbs record only rare transitions into a 100-entry ring with same-kind coalescing (a flood costs one slot per second); the per-pty table is built only when the snapshot is read; the per-send bookkeeping adds one Date.now() to existing accounting writes. Pty ids are redacted to their `@@` suffix because daemon session ids embed worktree paths. The report assembles over invoke IPC — the direction proven alive in every observed wedge — and a failing invoke is captured as data instead of sinking the report. The stuck-occlusion e2e now also pins the report end-to-end: after the wedge + keystroke recovery, the report must carry the stale-visibility latch and gate transitions in the renderer ring, gate-mark/unmark in main's ring, and a populated per-pty table. Suites: pty.test.ts 258, terminal-pane 1705, shared ring 5; typing-latency perf gate passes. Co-authored-by: Orca <help@stably.ai>