Cloud: a paused machine reads Paused in the composer, machine list, host line and New Tab

TE
3d ago
+353-38

Cloud machines are about to pause on their own, first when idle and then between tool calls (cmux-platform docs/agent-turn-sleep.md, cmuxterm-hq#6694). Once paused, acpmux loses its link to the machine. Before this PR, that dropped link looked like a broken connection in four places. Now each of them says the machine is paused, calmly.

Leo, 2026-11-03: "The model sometimes sees a delay and you sometimes see it after sending but it evens out to not much at all just a tiny bit of extra time that you mostly perceive as "thinking" / But it's all still responsive on the ui side".

What changes

  • Composer machine chip. A Cloud machine that the account says is paused keeps the quiet ring and reads "Paused" instead of "Not connected". While it resumes, a spinner turns inside the dot's 6px box, so the strip never moves. It is a spinner, never a pulsing dot.
  • Machine list (environment picker and Computer menu). A lost peer that the account says is paused reads "Paused · Resume" and can be picked: picking it resumes the machine, and the chat moves there once acpmux links it (the existing pickCloudMachine wait). Before, it was a greyed "Reconnecting" row you could not pick. A resuming machine reads "Resuming…".
  • Host line above the composer. A sleeping machine never gets "Can't reach {machine}", however long it sleeps (hostErrorShows takes an asleep check, which reads cloudMachineAsleep).
  • New Tab machines widget. A paused Cloud host's tooltip says "Paused" instead of "offline". The widget reads the account list once, and only while it lists a Cloud machine that is not online.

The one helper is withCloudSleep in cloudMachines.ts. It matches an account machine by name, the way the app does. If two machines share that name, neither is matched, so a Resume can never start the wrong one. Nothing here touches the chat-unavailable card, the peer-copy banner, the composer queue or the wake path; another PR covers those.

Gallery

  • agent-pane.composer-context: machine-sleep-paused, machine-sleep-resuming, machine-sleep-unknown (before: a machine the account does not list) and machine-sleep-paused-list.
  • newtab: minimal-ambient-paused.

Tests

  • test/environment-picker-cloud-machines.test.tsx: withCloudSleep rows, and the picker row that is pickable and resumes.
  • hostLine.test.ts: a sleeping machine is never said to be unreachable, and cloudMachineAsleep stages.

Small and contained (web wording plus one list helper). New strings: composer.envPaused, composer.envResuming and newTab.widgets.paused.

Agent session: agent session

🤖 Generated with Claude Code


Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Cloud machines pause on their own when idle, which drops acpmux's link to them. Before this PR, that dropped link looked like a broken connection in four places; now each reads as a calm "Paused".

  • The composer machine chip says "Paused" instead of "Not connected"; while resuming, a spinner turns inside the dot's fixed 6px box so the strip never moves. The condition treats both resuming and booting/connecting stages as on the way up.
  • The machine list reads "Paused · Resume" and the row is pickable — picking it resumes the machine and the chat moves there once acpmux links it, including when the row is the chat's own machine. Previously it was a greyed "Reconnecting" row.
  • A sleeping machine is never said to be unreachable in the host line, however long it sleeps; an SSH peer sharing its name still says "Can't reach".
  • New Tab's machines widget says "Paused" instead of "offline" for a paused Cloud host; it now treats a listed peer whose link acpmux reports down as not online.
  • The new withCloudSleep helper matches account machines by name; if two machines share a name, neither matches, so a Resume can never start the wrong one.