Server-side mobile fit architecture:
- handleMobileSubscribe/Unsubscribe with per-ptyId restore timers
- Server-authoritative display mode (auto/phone/desktop) per terminal
- Inline resize events on subscribe stream replace resubscribe pattern
- terminal.subscribe waits for PTY spawn (mobile left-pane race)
Bug fixes:
- Fix Claude not launching from mobile (Bug 6): worktree.create RPC
schema now accepts startupCommand from mobile, passes it through to
createManagedWorktree → activateWorktree startup param
- Fix waitForLeafPtyId handle invalidation: capture tabId/leafId before
handle can be invalidated, fall back to direct leaf lookup
- Fix desktop banner accumulation on tab switch (Bug 8): restore timer
cancel scoped to same ptyId only, not all client timers
- Fix pane ID collision banners: use transport ptyId for override lookup
instead of pane ID which collides across tabs
- Fix 0-terminals during rapid tab switch (Bug 7): consecutive-empty
guard with lastKnownTerminalCountRef
- Mobile subscribe waits for PTY spawn with graphSync callback
Co-authored-by: Orca <help@stably.ai>