cmux NEXT New Tab: optional widget view with Projects and Needs you cards

Merged
TE
18d ago
+875-26

Leo wanted an optional, widget-style view for the New Tab / new chat page, like the rounded cards in his reference: a list card of places to run, and a "Blocked" chat with an × and a hover card.

With the Debug Settings toggle New tab widgets (newTab.widgets) on, the New Tab page shows two soft cards under its create actions. Off, which is the default, the page is unchanged.

  • Projects: this Mac (the host's machine name), a hairline, then up to four of its projects, ordered by each folder's newest local chat. The folder a prompt starts in gets a check. A click picks that project, the same as a pick in the location strip, and the strip and Return follow it. The card leaves out the tab's inherited folder unless a prompt starts there, because picking it is no pick. It also leaves out private agent-home folders and other machines' folders, because a New Tab chat starts on this Mac.
  • Needs you: up to four chats that ask for input, whose last turn failed, or that lost their agent, with input first, then newest. Each row shows the state in amber or red and the title. A click opens the chat. The × dismisses it until the chat changes again (the key is the session id plus its updatedAt). Dismisses live in the agent pages' shared localStorage: every New Tab page sees them, and they last until cmux quits, because agent pages use a non-persistent data store. A pointer over a row shows a hover card with the whole title and the chat's last line. The All chats templates (Threads, Console) don't show this card, since they already list those chats.

Every row comes from data the page already has: the composer's project list and the acpmux sessions. A card with nothing to show isn't drawn. The cards use the composer's fill, a hairline edge, 20 px corners and 14 px rows, the same tokens as the rest of the page.

The toggle is a Debug Settings tunable, AgentPaneTunables.newTabWidgets in the Tabs section, next to New tab design. It applies to the next new tab. AgentPaneNewTab's init reads it, so the page and the prewarmed spare page both carry widgets: true, and CmuxNextApp is unchanged (its size cap allows no growth). newTabHost reads the flag and NewTabScreen draws WidgetCards.

This includes #21850's commits (the gallery advisory samples the states a PR adds first, and each stage renders its own manifest). Without them, this PR touches every gallery entry and the receipt captured 16 unrelated states. The widget commits are e0c3ce63804, cb6c41266e3, 7b785d1dd2e and ac9f866125e.

Proof

From this PR's gallery advisory run (run 39186217829, Linux Chromium, 420 px): the same chats and projects with the toggle off, then on, then a pointer over the failed chat, then on in a light theme. The hover card was caught partway through its fade-in.

widgets off widgets on

widgets hover card widgets on, light theme

Testing

  • bun test test/new-tab-widgets.test.tsx (4 pass) covers:
    • the Needs you order and states, and a dismiss that holds until the chat changes;
    • the Projects order, with agent-home and the inherited folder left out;
    • the handshake flag;
    • a render of NewTabScreen off and on: a project pick moves the check and the location strip, a click opens the chat, and the × hides the row, holds on the next page and keeps another page's dismiss.
  • test/tooltip-rules.test.ts passes. The hover card carries a tooltip-allow note because the reference asks for it.
  • bun run typecheck, bun run lint, vp fmt --check, check-type-scale.py and gen-strings.mjs --check pass locally.
  • CI at ac9f866: the cmux-next run (fast tier, checks, size cap) and the web run (react-apps-check) pass.
  • Swift: NewTabWidgetsTests in CmuxNextAgentPaneTests checks that the context carries widgets only when it's on and that the tunable ships off. The path routing skipped cmux-next swift test on this PR, so the test is added but hasn't run, and nothing has compiled the Swift change yet. Only Swift syntax passed locally.
  • A review subagent found five issues. Four are fixed in ac9f866 and the base-ordering one in #21850.
  • Localization: two new pane keys, newTab.widgets.attention and newTab.widgets.dismiss, in all 21 locales (en and ja translated, the rest needs_review, the same as their neighbours). The state labels reuse existing keys.

Changelog

Added: An optional widget view on the New Tab page (Debug Settings, New tab widgets), with your recent projects and the chats that need you

🤖 Generated with Claude Code