cmux NEXT: make chat title an action menu

Merged
TE
6d ago
+1691-44

Leo: “Why is it just text that you can highlight? ... If you want it to be that, we can let it have additional options. Then make it have additional options.”

The chat title is a focusable chevron button. Its instant menu offers Rename (R), Fork (F), Move to machine, Open in, Archive (A), and Delete (D), while retaining the existing controls. Move enumerates the host's eligible Cloud destinations and dispatches through the existing CloudMove path, with a native allowlist and fresh-gesture check; remote chats retain Bring Back Local. Delete asks for confirmation before purging the selected session. Session-bound callbacks and asynchronous archive/delete completions cannot act on a newly selected chat.

The menu opens from cached state on the click, then refreshes availability in place. Closing or unmounting invalidates outstanding refreshes. No timer or animation loop is added.

Gallery: agent-pane.thread-title. The plain treatment is chosen; the glass and compact long-title variants remain alongside it. Reference: Claude's compact environment submenu and trailing key hints in environment-cloud-submenu.png. Private Leo screenshots are never published.

HeaderBeforeAfter
DarkBefore darkAfter dark
LightBefore lightAfter light
VersionDarkLight
Plain, chosenPlain darkPlain light
GlassGlass darkGlass light
Compact long titleCompact darkCompact light

Rebase integration

Current head: 056be9c0e8abfb995b5d5317fc81523581d32f6e, rebased on ef2fbe558b31af8cc288b0ca3abde74434c9f3a8 only after GitHub reported CONFLICTING/DIRTY.

  • App/header conflicts retain base's removal of the repeated Environment row, plus the session-keyed title in ordinary and tab-row slots. The gallery keeps both the title-trigger check and the no-duplicate-location check. In direct.ts, both the newer selection token and the title feature's purge guard remain. Native wiring applied cleanly; reconnect, status and frame-keep changes are preserved.

  • Fresh independent Astra review found a stale Delete confirmation could target another chat after a snapshot hold released. The regression first recorded a kill of B from A's confirmation. Deletion now validates the live selected/shown session and sends the explicit confirmed ID, with no intervening await. All seven focused title/deletion tests pass locally and in final-head hosted run 40525774559, source 056be9c0e8abfb995b5d5317fc81523581d32f6e, snapshot d90786f1f76b3687f0467ce77e654e0b52744f6e. The hosted run is terminal SUCCESS.

  • Final-head static pre-push reports no new violations. Full web lint has only unchanged base findings in SendScrollSetting.gallery.tsx, pages/settings/channelsCard.test.tsx, pages/settings/store.ts, and generated protocol methods.ts freshness; no PR lint/type error was reported.

  • Rebased gallery run 40524542876 is SUCCESS: twelve ready cases, including six passing menu interactions, four current header captures, and two current-base headers. The media above comes from that run at 03e2b967beb3f468985950cd8a901866a776a49c (snapshot 1e3a0d63be5065da3ae8859650cf03e382559d64, base ef2fbe558b31af8cc288b0ca3abde74434c9f3a8). The final delta only adds the Delete session guard and its regression; header components, styles, fixtures and rendered JSX are unchanged, so these captures remain representative of the final head. SHA-256 and PNG decoding were verified. The base's quiet header remains free of the repeated environment row.

  • Final-head managed fleet Release -Onone app compile is PASS: exact source 056be9c0e8abfb995b5d5317fc81523581d32f6e, job d8884a3e93d77bf6bad75246, recipe version 2 (--app --release), artifact sha256:eabce75422816a9faf4a439015c9a58a629098abbaca0d5f7798ca125a5cb1af. The job log explicitly records app ok: true in 116.3 s and cmux-tui ok: true in 47.5 s. This is the Linux Swift compile. Final-head native suite AgentPaneConnectActionTests also passed on aws-m4pro-1 with Xcode 26.6, fleet step 10f224fb6b31f2fc66cb498d (suite 12 s, step exited 0); no test pass is inferred from compiling the app.

Earlier exact-head evidence / limits

  • At the pre-rebase reviewed head 1c1e6bc3d0a1489588acf1d6509054c827108a44, hosted run 40486603897 passed all five ThreadTitle tests and rendered 12 gallery cases: six title-menu interactions, four header states and two base headers. All were ready; all six title-menu plays passed. The prior source fails the guarded-action discriminator. The run's terminal conclusion is SUCCESS; earlier notes calling its handled base discriminator a terminal red were inaccurate. Eighteen actual PNGs, including step captures, were recovered and SHA-256/PIL verified. Source tree 8fec5f51c791d37b74cd206378b4651d049db784; gallery snapshot 0e370ad2ff131bfa872cb21737a63186781485f5; base aa82735368f69b31aafcd6666304502a7716bc62.
  • A second same-source full-window gallery run 40522356958 passed all six dark/light menu interactions and captured all six actions without scrolling. Every case was ready in 539–637 ms, with zero recorded layout shifts or popup problems. Its source tree is the same 8fec5f51c791d37b74cd206378b4651d049db784; capture snapshot c644f9f52c93324579ac64af920e11dc19ce729a. The table above uses these actual full-menu captures.
  • Native CI job 122131865418 passed AgentPaneConnectActionTests 7/7, including titleMoveTargetsAreAdvertisedAndValidated, at pre-rebase head 1c1e6bc3d0a1489588acf1d6509054c827108a44. The broader Swift aggregate has unrelated failures.
  • At pre-rebase head 1c1e6bc3d0a1489588acf1d6509054c827108a44, app Release -Onone compile passed recipe version 2: job db908e8adf388627482a2c7b, published compile receipt, matching CI gate. This was the Linux Swift compile. Mac arm64 Release compiled successfully at f87d6086feee1214082e347015a0e4dd0e2fd964; all native source and test blobs are unchanged between that Mac head and pre-rebase head 1c1e6bc3d0a1489588acf1d6509054c827108a44. The separate pre-rebase-head Mac job 1aa352a04847db39f72fc789 was cancelled before starting and is not claimed as a pass.
  • The earlier pre-rebase full web typecheck on its PR/base merge reports no errors in 2,865 files. Fast gates' two App.tsx exhaustive-deps warnings (unlift, follow) are inherited: the entire VirtualTranscript block is byte-identical to base. Existing type-scale, format and protocol findings were also reported on base. Static pre-push reports no new violations. The source-root/namespace reds flag untouched prompt_uploads.rs and CloudVmHost.swift; the web aggregate is red because its base-comparison jobs failed, while every head shard passed.
  • The compact fixtures use a scrollable menu; the full-window captures above show every action. These are gallery fixtures, not an end-to-end move between real machines. Native target validation and dispatch are covered by the focused suite; a real Cloud transfer was not initiated for this review. The publisher defers image OCR to the repository privacy workflow on Linux.

Review (Codex gpt-6-astra xhigh): SHIP at 056be9c0e8abfb995b5d5317fc81523581d32f6e. Independent final integration receipt found no remaining P1/P2 after closing the stale Delete blocker. Earlier pre-rebase review receipt remains historical evidence.

No capture: native changes add IPC target enumeration, gesture validation and dispatch through the existing CloudMove action, with no new native view; actual rendered web UI is shown by the hosted gallery captures above. No fleet-capture marker is claimed for those gallery images.

Changelog

Changed - The chat title opens an instant action menu with rename, fork, machine move, open, archive and delete actions.

Agent session: agent session