cmux NEXT: notification text under sidebar rows, and move notified workspaces to the top (hq#1870 P1 11)
Merged
TE
25d ago+1258+1258+0123456789012345678901234567890123456789-38-38-01234567890123456789
In cmux NEXT, a notification now does to the sidebar what it did in classic (hq#1870 P1 #11, cx-sv425):
- Notification text: the workspace's row shows the newest unread notification's text (the body, else the title) as the first item of its second line. The setting is
sidebar.workspaceRow.notification, and it's on in the standard row set. Classic's key wassidebar.showNotificationMessage. - Move to top: the notified workspace moves to the top of the unpinned rows, or to the top of its group, the same way Move Workspace to Top does. The setting is
notifications.attention.moveToTop, on by default. Classic's key wasapp.reorderOnNotification.- A pinned workspace, a muted one, or one a window is showing stays where it is.
Both default to on, as in classic. The red end-to-end test on base (#19583) already expects that.
How it works
- Text source: the daemon store keeps each live notification's text by id. At connect it seeds the texts from the
list-notificationsledger, so notifications posted before the app launched also show. - Mapping:
SidebarMappingreads the text from the newest unread tab. - Migration: classic's two keys migrate.
reorderOnNotification: agentActivitymaps to on; next moves a workspace only for a notification. - Exports: the settings exports are regenerated on the head.
Where this differs from classic
- Read notifications: classic kept showing the latest notification even after it was read. Next shows the text only while it is unread, so a read workspace goes back to its normal second line. It's a one-line change in
DaemonStore.notificationText(for:)if we want classic's behaviour. - Groups: classic moved the whole group when a grouped workspace was notified. Next moves the workspace within its group.
Review fixes: a newer notification clears its surface's ledger text, and expanded rows hide the text when the element is off.
Known gaps (left as is):
- The move-to-top help text says "unless you are looking at its pane", but a workspace any window shows also stays put.
- On Cloud and SSH machines, notifications posted before the app connected show no text. Only the local daemon's ledger is seeded.
Verification
- Red:
scripts/cmux-next/sidebar-notification-e2e.pyscored 7/9 on build 155f98a9. Its two failures were "the notified workspace moves to the top row" and "its row shows the notification's text". - Green: 9/9 from the same script on a fleet build of f8e68c0bff35 (job 939c88001b911dd1eeb1ee10), on a capture slot.
- Release compile: passed on the merged head 77c0ff97f6ac (fleet step 62385a611d6521fadb46266f).
- Fleet Swift suites: passed on 77c0ff97f6ac (Xcode 26.6, 835 passes, 0 failures).
- Unrelated reds on 77c0ff97f6ac:
- The same-tree Debug compile and daemon tests: the base push's cmux-tui artifacts run, which publishes the tree, was cancelled. The fleet suites above cover those tests.
agent-pane-seenin react-apps-check: it passed on fe0202bd with the same PR changes, and this PR doesn't touch the agent pane.- Gallery publish: an image upload hit HTTP 409.
Localization audit: four new keys (settings.attention.moveToTop and its .help, settings.workspaceRow.notification and its .help) in all 21 locales of CmuxNextSettings/Localizable.xcstrings. The non-English values are marked needs_review.
Changelog
- Added: the sidebar shows a workspace's newest unread notification under its name, and a notification moves its workspace to the top (both on by default, as in classic).
🤖 Generated with Claude Code