Files
orca/src
Jinwoo Hong d9a3c84b00 fix(terminal): don't duplicate terminals a newer Orca still runs after a downgrade (#27577)
* refactor(daemon): share the cold-restore payload builder

Lets a reader outside the adapter build the same saved-screen payload from
history without spawning.

* feat(daemon): hold restored terminals a newer build's daemon may still run (STA-9257)

After a downgrade, an older build cannot adopt a newer-protocol daemon, so it
cold-restored that daemon's terminals under the same ids and resumed their
agents beside the originals. Startup now classifies newer-protocol pid records
in this profile's runtime dir as live, unverifiable or exited, and pty:spawn
refuses a restore no adopted daemon owns while one is live or unverifiable.
Reopen stops the newer daemon by verified signal only and reports success only
once its pid is confirmed gone.

* feat(terminal): show held restored panes read-only with a Reopen banner (STA-9257)

A pane refused for a newer daemon shows its saved screen read-only under a
pane-top warning. Reopen terminal stops the newer daemon and releases every held
pane through the existing reattach path, then toasts what actually reopened and
resumed; an unconfirmed stop reopens nothing and offers Try again.

* refactor(daemon): hold newer-daemon restores at the router, one classifier (STA-9257)

The hold moves from the pty:spawn IPC handler into DaemonPtyRouter.spawn so
every spawn source (IPC, runtime controller, mobile refresh, CLI) refuses a
cold restore of an id no adopted daemon owns while a newer daemon is held.
Discovery and stop share one classifier; an unidentifiable owner settles by
whether its endpoint accepts a connection, so a dead leftover never holds a tab
forever. Main announces a confirmed stop to the renderer.

* fix(terminal): per-pane failed state, one release path, no repeated screen (STA-9257)

A pane held after a failed Reopen shows the held state. Held panes also release
on main's stop announcement, with one toast only from the clicking window. A
pane whose saved buffer the layout restore already painted skips the history
screen and is not cleared on release.

* refactor(terminal): drop the release event, await the router hold, one phase per pane (STA-9257)

The release announcement only reached the window that clicked, which already
releases on its reply, so it is removed. The router hold check is always
awaited; three router tests released the adapter spawn before the router had
reached it and now wait for it instead. Each held pane carries its own phase.

* refactor(terminal): trim the newer-daemon hold, keep paired panes out of it (STA-9257)

A paired host's refusal is now an ordinary error: holding it locally looped,
since this window cannot stop that host's daemon. The history-screen read is
gone (the layout restore already paints saved output), discovery folds into the
hold module, the hold store uses zustand, the reattach returns its outcome so a
fresh-session fallback counts as reopened, and the toast uses plural keys.

* feat(terminal): show a held local pane's saved screen read-only (STA-9257)

Local daemon-backed panes keep no layout buffer, so a held pane was blank. Main
reads the session's saved screen from history without spawning and the pane
paints it read-only, unless the layout restore already painted the pane; it is
cleared before the normal reconnect.

* fix(daemon): re-probe a timed-out newer-daemon endpoint before holding (STA-9257)

* feat(terminal): count held panes in the reopen label, add Dismiss (STA-9257)
2026-10-11 22:21:20 -04:00
..