cmux-next: sidebar tab list draws New Tab tabs with the new-tab icon and title

Closed
AZ
8d ago
+86-18

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: new newTab case, icon tab.new.
  • SidebarMapping.sections(…, newTabPages:newTabTitle:) and row(…, newTabPages:newTabTitle:): new parameters, default empty. The tab list kind is .newTab, then .agentChat for other agent session tabs, else the record's kind.
  • SidebarBridge.sections, liveSections and the per-machine sections: pass newTabPages through; the per-machine sections passes Strings.untitledBrowser as the title.
  • Callers: the live observation and the space-swipe pages (both read pageTabs.ids inside their observation, so a New Tab that becomes a chat relists as a chat), the first show, and resync.

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 .agentChat without the New Tab state and as .newTab (icon tab.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):

list zoom

BeforeAfter
beforeafter

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.


View with [code]smith Autofix with [code]smith
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.newTab kind with the tab.new icon. SidebarTabKind is Codable, so older saved rows remain readable.
  • The workspace row's own kind icon is unchanged.