Files
Jinwoo-H d8734fa5fd fix(terminal): carry the rejected paired-runtime write into an actual remount (STA-2830)
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.
2026-08-05 04:33:39 -04:00
..