PR #7889: opening cloud workspaces on mobile, final state

iPhone 17 Pro Max sim · dev build against production · 2026-09-26. Videos are rebuilt from timestamped screenshots at about 3 fps, played in real time. The sim's own recorder was stuck.

Videos

Stopped box (vercel sandbox stop, then confirmed running=false), from tap to live session.
The same box while it's running, freshly launched app, from tap to live session.

Stopped box

1.8s: addressing, the only full-screen wait left
6.0s: last tab mounted, desktop's "waking up" copy
20.9s: box is up, host is still replaying agents
24.0s: the resumed session is live

Running box

1.4s: addressing (about 0.5s API, the rest is dev-build JS)
2.9s: live

What changed from the PR as opened

AreaPR as openedNow
AddressingOnly ever minted access({wake:true}), so the "optimistic" host still waited for the whole wake: 1.7–2.2s on a running box, the full resume and boot on a stopped one.Like desktop: access({wake:false}) addresses right away (~0.45s measured on a stopped box) and the wake runs alongside it, handing back the new domain if the box moved.
Request batching—The API client uses httpBatchLink, so an address and a wake sent in the same tick share one response. The wake now starts once the address has landed.
Race—An address that was requested before a wake landed can't overwrite the wake's newer URL.
Waiting UIA generic "Connecting…" or a blank spinnerDesktop's copy, "This cloud workspace is waking up…", shown while the box is still being woken. When the wake lands the terminals list refetches and the socket redials straight away.
Tab flickerA failed terminal list dropped the remembered tab, so the view switched between the terminal and a spinnerThe tab is kept until a list actually answers without it. A cloud box whose list is failing shows a spinner instead of "No sessions yet".
CleanupA one-use re-export of getWorkspaceActivityTime through the desktop sort module, a pointer comment in its test, and long commentsRemoved. The shared workspace-activity helper and the last-active sort are kept as they were.

Still open (not fixed here)