fix(cloud): resume paused machines from unavailable chats
READY FOR REVIEW; HOLD MERGE until final-head CI and a live paused-machine recovery check. No live VM/session actions were run for the latest change.
A disconnected Cloud chat now reads the native machine inventory. A paused machine offers Resume machine, using the same attach path as opening its workspace, then rereads the chat until it opens. A destroyed or removed machine says it was deleted and offers no Reconnect. Saved-transcript recovery remains available.
Requested behavior: "For a chat on a paused cloud machine, the card's button is 'Resume machine'. It resumes it ... and opens the chat when it lists." "For a destroyed machine ... the card says the machine was deleted and offers no Reconnect."
The machine identity and account come from the native Cloud-tab handshake. A failed inventory read, sign-out, another account, or a truncated list does not establish deletion. SSH and peer-only chats retain their existing behavior. The new read is passive; attach requires a click and opens no extra workspace. Recovery stops after one minute, when the chat connects, on deletion, or when the pane/chat/account changes.
Recovery loop follow-up (2026-10-29)
Followed the review finding in this PR (previous post-click cloudMachine.list failure exited early). useCloudChatRecovery now continues retrying within the original 60-second deadline across incomplete/unreadable inventory and transient post-click read/recheck errors. It preserves the previous paused card until a conclusive answer, and stops on confirmed deletion or a changed pane/session/account. The native attach still happens once per click; the polling path never re-attaches.
Added cloud-chat-resume.test.tsx: paused → accepted attach → incomplete list → rejected list → connecting → chat recheck, with one attach and no premature error. This new case needs final-head CI confirmation. The previously reported native and web test passes were on earlier commits. The live paused-VM end-to-end check is still pending and should gate merge.
Validation at b5f351b7425: 12 focused web tests passed; web type checking passed across 2,949 files (fleet job 23a1b644cb7b666da952425c). Native app/test compile and all 10 AgentPaneCloudMachineRequestTests passed (step 2c88a5faf89d381247a5d22e). Final-head reruns cover the audit fixes preserving cached transcripts/fresh-chat hero and rejecting stale inventory after a failed refresh. Live paused-machine validation is still pending; the bridge test is a controlled fixture, not a live VM result.
Gallery: agent-pane.cloud-chat-recovery
The before, paused, resuming and deleted variants preserve the existing centered unavailable-card typography, colors and glass. Design reference: Claude's quiet browser empty-state hierarchy and the transcript surface specification. These public fixture captures passed the gallery capture run (286700f24d6c558c7f074de0); no private reference capture is included.
| Before | Paused machine |
|---|---|
![]() | ![]() |
| Deleted machine | Resuming |
|---|---|
![]() | ![]() |
Known scope: this change uses native Cloud-tab provenance. Older mirrored peer-only sessions do not carry an authoritative Cloud VM ID and are deliberately not inferred from peer names.
App capture at e0cf0c7d
cmux-ci capture e0cf0c7d --state tour:agent-pane on a fleet Mac: Launch, Open agent chat and Queue a second chat all pass.
| Light | Dark |
|---|---|
![]() | ![]() |
Agent session: agent session





