mirror of
https://github.com/stablyai/orca.git
synced 2026-10-21 00:03:46 +00:00
The WriteUnavailable signal reached the renderer and then died. `onWriteUnavailable` routed to `requestTerminalPaneRecovery` with `requireAuthoritativeLiveness: true`, which probes `pty:hasPty`. For a paired pane the id is `remote:<env>@@<handle>`: `ptyOwnership` never holds it and `parseAppSshPtyId` ignores it, so the lookup falls through to the local provider, whose "not in my table" came back as an authoritative `false`. Recovery returned early and no remount ever happened. Two fixes, both about not inventing evidence: - `pty:hasPty` now returns null for a `remote:` id instead of routing it to the local provider, mirroring the guard `pty:kill` already has. Main cannot know another host's PTY state, so it says so. - A host rejection now takes a distinct recovery reason, `input-rejected-by-host`, that consults no local probe. The probe is not made to lie: the frame itself is the evidence, it came from the process that owns the PTY over a live connection, and the remount preserves the session rather than destroying it. Local ids keep the probe, where a `false` really does mean the shell died. Tests: a cross-boundary contract runs the real dispatcher, multiplexer, transport and pty-connection together and requires the remount for every answer the probe can give; an un-negotiated legacy binary subscriber must never receive opcode 17.