cmux-next: sidebar tab list draws New Tab tabs with the new-tab icon and title
Summary
Follow-up to #17630, for item 15 of the cmux-next sweep (cmuxterm-hq#1421). #17630 gives New Tab page tabs the registry's tab.new in the tab strip. The sidebar's tab list still drew them with agent.chat, because the sidebar didn't know which tabs are still on the New Tab page.
The sidebar now gets that state (AgentTabs.pageTabs.ids, the same set the tab strip titles "New Tab" from) and lists those tabs with a new SidebarTabKind.newTab, which draws tab.new.
The fleet capture showed a second defect from the same missing state: the list titled these tabs by their record's blank-page address, "about:blank", where the strip says "New Tab". They now use the strip's localized title (Strings.untitledBrowser), with no new strings.
Converted call sites:
SidebarTabKind: newnewTabcase, icontab.new.SidebarMapping.sections(…, newTabPages:newTabTitle:)androw(…, newTabPages:newTabTitle:): new parameters, default empty. The tab list kind is.newTab, then.agentChatfor other agent session tabs, else the record's kind.SidebarBridge.sections,liveSectionsand the per-machinesections: passnewTabPagesthrough; the per-machinesectionspassesStrings.untitledBrowseras the title.- Callers: the live observation and the space-swipe pages (both read
pageTabs.idsinside their observation, so a New Tab that becomes a chat relists as a chat), the first show, andresync.
Not changed: the workspace row's own kind icon (kind(front)), which is pending Leo's call. The test checks that the row's kind is the same with or without the New Tab state.
SidebarTabKind is Codable. Adding a case keeps saved rows readable, since older saves never contain it.
Testing
Red commit 62fbccd2d23 adds SidebarMappingTests.aNewTabPageTabListsAsANewTab; the fix follows. The red run failed to compile on base (no newTabPages argument, no .newTab case), and the fix passed swift test (2308 tests).
Red commit 6f451afd5d0 adds aNewTabPageTabListsUnderTheNewTabTitle for the title; its fix follows. The red run failed to compile on base (no newTabTitle argument).
- An agent session tab lists as
.agentChatwithout the New Tab state and as.newTab(icontab.new) with it. - The workspace row's kind is unchanged.
- A New Tab page tab is listed as "New Tab"; the same tab as a chat keeps its own title.
Changelog
Fixed: New Tab tabs in the sidebar's tab list show a new-tab icon and the New Tab title instead of the agent chat bubble and about:blank
Demo Video
Fleet builds on a capture mini (1x display), launched with sidebar.showWorkspaceTabs on. The before build is #17630's base (ff267c4b41d), which has the same sidebar mapping as this PR's base. The after build is 2fb599378dd, with both fixes. The tab strip above still shows the bubble because #17630 is not in this branch.
Tab list at 5x, before (top: chat bubble, "about:blank") and after (bottom: tab.new, "New Tab"):

| Before | After |
|---|---|
![]() | ![]() |
Checklist
- Behavior changes have added or updated tests, or Testing says why not
- UI change with no new or changed user-facing strings; localization not affected
🤖 Generated with Claude Code

