cmux-next: generic New opens the New Tab page; chat titles, New chat focus, tooltips, hover card

Merged
TE
9d ago
+1140-504

Summary

Leo's 2026-10-05 dogfood batch for the agent pane and its New entry points.

A generic New opens the New Tab page. Every "New" that doesn't say "agent" used to open a blank agent chat. Leo: "WHY IS IT EVEN NEW AGENT WHERE IS NEW TAB". Now each one opens the New Tab page, where you pick an agent, terminal or browser. Only agent-labeled actions start a chat directly.

Entry pointActionBeforeAfter
Cmd-T, tab strip +, double-click on the empty strip, tab group's New TabnewTab.sameKind (follows tabs.newTabKind)Agent chat (agent default)New Tab page (page default)
Cmd-N, sidebar +, New Workspace in menus and the palettenewTab (New Workspace)Workspace opens on a blank agent chatWorkspace opens on the New Tab page
Empty workspace's New buttonEmptyWorkspaceView → openFirstPageBlank agent chatNew Tab page
Agent empty state's New button ("What should we build?")pane action.runAnother empty acpmux session, same screenNew Tab page, beside the chat
New Agent Chat (Cmd-I), Search chats' New chatpalette.newAgentChat, chat.newAgent chatAgent chat (agent-labeled, unchanged)
New Terminal Tab (Ctrl-Shift-Cmd-T), Open BrowsernewSurface, openBrowserTerminal or browserUnchanged

A tabs.newTabKind set in cmux.json still wins. "agent" keeps the old Cmd-T behavior.

New chat gives feedback and stops piling up sessions. acpmux names a session after its harness profile (claude-sr, claude-sr-1). The pane showed that name for any chat that hadn't been prompted yet, and each New chat click on an empty chat started another one. Chats now take their title from the agent's title, then the first prompt, else "New chat", never the launch command. This covers Search chats and the Home lists; #17504 has since moved the chat list to the window sidebar. New chat focuses the composer. On a chat that's still empty it focuses that chat instead of creating a duplicate.

Tooltips. The pane used native title tooltips. They waited about a second, drew wherever the pointer was, and ran past the pane's edge ("More: c…"). One in-page tooltip (webviews/src/ui/titleTooltips.ts) now shows every title in the pane: after 350 ms, immediately when moving between controls, flipped and shifted so it stays inside the window. An icon-only control keeps its title as its aria-label.

Workspace hover card. A one-tab workspace listed its only tab ("~ 0.0% · 7.8 MB") under the total line that already said the same thing. The per-tab rows now show only when a workspace has more than one tab.

Not in this PR:

  • The "Default (Claude Code's choice)" picker label is covered by op-next-markdown's #17503.
  • The "Sessions" pane toggle and the pane's rail were removed by #17504 (op-next-sidebar-merge).

Testing

Red before green for each fix: the test commits come first.

  • bun test on sessionList.test.ts and tooltips.test.ts ran locally. On the test commits: 3 fail and 1 error (the tooltips module was missing). With the fixes: 41 pass, 0 fail, including SessionSidebar, searchChats and homeLists.
  • vp check (format, lint, types) is clean on the changed webview files. build-agent-pane-web.sh --check reports the bundle is current after merging feat-cmux-next, and check-webviews-react-compiler.mjs passes.
  • Swift tests were added and changed but not run locally, since this host can't do Swift builds: NewTabKindTests, NewTabKindSettingsTests, AgentPaneNewTabTests.aChatCanOpenTheNewTabPageAndNothingElse, ResourceAggregatorTests.aLoneTabIsNotRepeatedUnderTheTotal. CI runs them. The MDM and settings-schema exports were edited by hand to the new default, and ManagedPreferencesManifestTests and SettingsSchemaExportTests in CI check that.
  • Swift tests in CI: the six new and changed tests passed on 5ef4ccd. That run's only failures were the stale settings-schema hash, fixed in c53a181, and a signal-11 crash of the test process in unrelated localization tests.
  • Fleet builds: base 18aed0f (job f437037e) and PR e64412a (job 8b9d4636) both built. The captures below come from those builds on a capture mini, driven by CuaDriver.
  • Not shown live: the hover card. CuaDriver's cursor move didn't trigger a hover in either build, so ResourceAggregatorTests.aLoneTabIsNotRepeatedUnderTheTotal is the only evidence for that fix.

Localization: no new strings. The "New chat" fallback reuses sidebar.newChat, which is already translated in every locale.

Changelog

Changed: Cmd-T, the + buttons and New Workspace open the New Tab page, and agent chats are titled from their first prompt instead of the agent's command name

Demo Video

Same steps on both builds, a fresh tagged app with the default settings.

Before (18aed0f)After (e64412a)
Cmd-T
Cmd-N (new workspace)
Empty state's New, clicked

Before, clicking New on the agent empty state leaves the same screen, and an extra empty session appears behind it. After, a New Tab page tab opens beside the chat.

🤖 Generated with Claude Code