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.
- 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 has the icon fix and predates the title fix, so it still says "about:blank". The tab strip above still shows the bubble because #17630 is not in this branch.
Tab list at 5x, before (top) and after (bottom):

| 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
Migrated from https://github.com/manaflow-ai/cmux/pull/17635 after correcting the PR author identity. The original head commit 2fb599378dd43bbc7b960ee7d6042a8388c8fc0e is preserved.
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.
Summary by cubic
Fixes the sidebar tab list so tabs still on the New Tab page draw with the new-tab icon and the New Tab title, instead of the agent chat bubble and the record's "about:blank" address.
- The sidebar now reads the same state the tab strip titles New Tab tabs from (
AgentTabs.pageTabs.ids), so a New Tab that becomes a chat relists as a chat. - Adds a
SidebarTabKind.newTabkind with thetab.newicon.SidebarTabKindis Codable, so older saved rows remain readable. - The workspace row's own kind icon is unchanged.

