composer: the environment picker is This Mac and Cloud only; the machines are Machines…

Merged
TE
5d ago
+423-203

Leo, 2026-10-31, on the composer's environment picker:

"bro this text is so fucking stupid why the fuck IS THERE SO MUCH BULLSHIT JUST A LITTLE CLOUD ICON OR FUCKING THE SELECTION YOU KNOW WHATEVER WORKS JUST NOT THE FUCKING EXISTING GAHHH"

and then, on this PR's first build, which still listed the other machines under a hairline:

"but anyways we ideally also can just hide the machines too and it's just a cloud button without as much of the whole subttitling on whatever... it's just a cloud button"

"austin/lawrence said indeed we wanted 1 workspace per vm for now"

His reference is Codex desktop's "Where should this chat run?" / "Work in" menu: two rows, This computer and Cloud.

Spec: leo-workspace design/composer.md rule 18 ("Where a chat runs is This Mac or Cloud: a plain Cloud choice, with no machine list and no machine-name subtitle in the main menu") and design/environment-picker.md rules 0 and 6, updated in teamleaderleo/leo-workspace#2128.

What changed (webviews/src/agent-session/acpmux/EnvironmentPicker.tsx, ComposerContext.tsx, composerLocation.css)

  • The list is This Mac (⌥⌘1) and Cloud, one line each, however many machines the person has. There are no machine rows, no hairline, no machine-name subtitle, no section headers, no second lines and no search field.
  • Cloud never picks a machine. With Run as, Cloud is the chat's Cloud mode. Its first send is cloud.startChat, which gives the new workspace its own new machine (cmux-tui #30020, one workspace per machine). Without Run as, Cloud opens New Cloud Machine. Holding ⌥ still swaps in Sandboxed.
  • The current pick is never hidden. If the pick is a specific machine or a saved environment (a chat seeded onto a Cloud machine, or a machine picked from Machines…), it is the one other row, checked. The control shows the current choice with its icon and short name.
  • The machines moved, not deleted. Machines… is the first item of the control's right-click menu. It opens the same popover as a list of its own: This Mac, New Tab's saved environments, then every other machine, each with its state and ⌥⌘ digit, plus a search field from 8 machines. ⌥⌘1–9 still pick from the composer. The right sidebar's Machines section is still where machines are managed.
  • The setup actions stay on the right-click menu: New Cloud Machine…, Open Cloud…, SSH…, Add Machine…, Connect Phone…, and New Tab's Create and Edit environment. They also keep their homes in the command palette, the File menu, Settings > Devices and the Cloud page.
  • A started chat still lists only its machine and its one move (Move to Cloud / Bring Back Local).
  • New string composer.machinesList ("Machines…"), translated in all 21 locales.
  • What else changed: the hairline CSS is removed, and so is the search that found Sandboxed (it went with the main list's search). No default changed. The folder chip, the harness and the model are untouched. Menus still open on the click.

Gallery (agent-pane.composer-context)

  • environment-picker: the two rows, while gpu-box and a Cloud machine are connected.
  • environment-picker-alone: the two rows for a person with no other machine.
  • environment-picker-machines (new): Machines….
  • environment-picker-fleet (21 machines, search), -cloud-machines, machine-colors and saved-environments now open Machines….
  • environment-picker-cloud-chat: the seeded Cloud machine is the one other row, checked.
  • Removed: environment-picker-sandboxed-search and environment-picker-cloud-search, because the main list has no search.
  • Unchanged: the control's three looks (environment-face-label, picked; -icon; -chip).

Tests

  • webviews/test/environment-picker.test.tsx "Leo's menu" tests:
    • This Mac and Cloud only, with machines connected, and no machine name in the menu.
    • Cloud picks a new machine (Cloud mode, or New Cloud Machine) and never a listed machine.
    • A machine picked from Machines… is the main list's one checked row.
    • The main list never searches; Machines… searches from 8 machines.
    • Machines… heads the right-click menu.
  • The picker, Cloud machine, New Tab saved-environment, NewTabScreen and EnvironmentPicker.test.tsx tests now pick machines through Machines…. picker-row-geometry no longer expects a hairline.

Observed / Not run

  • Ran locally in webviews/: bun install --frozen-lockfile, bun run strings, CMUX_LOCAL_HEAVY_CHECKS=0 bun run check (green), and check-default-cursor.py (ok).
  • Focused tests: 140 pass, 4 skip (the Playwright ones on this host), 0 fail.
  • Fleet run of the same files at the head: 258 pass, 0 fail across 9 files (the picker files above plus composer-menu-dismiss, composer-location-strip, picker-row-geometry and computer-picker-onboarding, the Playwright ones included), https://github.com/manaflow-ai/cmux/actions/runs/41274841874, tested_sha a6e66aae21ecd3946c27d22fec1507b3136487a7.
  • No Swift changed, so there is no compile-check.

Risk: normal. This is a UI-only reshape of one menu, and every action it moves stays reachable.

Changelog

  • Changed: The composer's environment menu is just This Mac and Cloud; every machine is under Machines… on its right-click menu.

Agent session: agent session

🤖 Generated with Claude Code