fix(node): preserve Claude SDK inbox delivery with mobile enabled
Enabling Continue agents from mobile could stop messages reaching an existing Paseo/SDK-hosted Claude session. Those processes publish kind: interactive, so Relay incorrectly switched them to native mod submission. Claude can refuse that submission after its host interrupts it; the same message still reaches the session through its ordinary inbox with mobile continuation off.
Require positive terminal attachment through the existing process predicate, excluding SDK, print and pipe-driven sessions (including pipes without SDK flags). Use the same eligibility check for discovery and authenticated native calls, preserving those sessions' ordinary inbox route. Terminal native continuation stays available. Recognized native refusals now produce bounded, actionable notices, negotiated per action so older plugins/cores remain compatible. Refused and uncertain submissions are never replayed or rerouted. A rejected first submission revokes its provisional control token; previously confirmed control from an earlier accepted turn remains valid. Regression tests exercise the authenticated acknowledgement route, durable failure notices, token revocation, and ordinary SDK delivery across on/off/on toggles.
Validation:
- 77 Rust mobile tests pass in both default and desktop library feature configurations; all 47 JavaScript harness tests and 5 delivery-source/dispatch tests pass. Public-source and formatting checks and Veto review pass.
- Read-only probe of the actual finn-mini processes: Paseo
ms-leadkeeps its ordinary caller route and has no native mobile capability; the terminal session retains both. - Disposable Claude 2.1.311 SDK reproduction: submission is admitted while idle, then explicitly dropped after an SDK interrupt. This matches the provider's documented stop/host lifecycle.
- Full real-Claude 2.1.318 terminal smoke passes on the local Mac: desktop input → native mobile turn → denied Write permission (one ticket, 45-second wait) → desktop return, same session/process/model/cwd/tools, no global model changes, process reaped. This uses a test bridge; it does not test phone UI or Cloud authentication.
- finn-mini's disposable terminal smoke was blocked by its login/locked Keychain; that process was reaped. No production core was replaced. finn-mini retains the mobile-off workaround until a reviewed desktop build includes the fix.
- iOS lead confirmed existing
MobileHandoffNoticerenders these bounded server failure notices without client changes.
The desktop core pin update follows after this change lands in Relay.