Repository navigation
Notifications: agents that finish together share one banner per workspace (cx-kz6m0.1) - #20960
Conversation
…r per workspace Red: three agents finishing in one workspace still post three banners. DesktopNotifier now records withdrawn banner ids (debug and tests). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agents that finish in one workspace within 10 s share one banner
("3 agents finished", subtitled with the workspace) that replaces the
delivered one and opens the newest. Approvals, questions and errors keep
their own banners; the notification history keeps every row. The window
is a one-shot DemandTimer. debug.notifications lists withdrawn banners.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
all web/size checks green |
|
Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by |
|
Found 1 test failure on Blacksmith runners: Failure
|
- regenerated schemas/defaults/cmux-next.json Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38701377413
…es way to the digest Red: a read agent still counts in a silent digest, and an agent's earlier banner stays beside the digest. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st' into feat-cmux-next-notification-digest
…ry burst banner Acknowledging a tab removes its agent from its burst (an empty burst closes), so a later finish posts on its own with its sound. The burst tracks every banner it still shows, and the digest withdraws them all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…App size cap) FinishedBannerBursts moves out of CmuxNextApp into CmuxNextBridge; the App keeps a few lines of wiring in NotificationCenterService (join on a finished turn, withdraw what the digest replaces, read on acknowledge). The burst records the banners it replaced for tests instead of a new DesktopNotifier field. The digest body is now the newest notification's body. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…side the burst DaemonNotification.isFinishedTurn and TabModel.holdsUnreadAsk(besides:) leave NotificationCenterService, and the burst decides which notifications join, so the App keeps only wiring under its size cap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tions Keeps #20960's finished-banner bursts beside the approval wiring: an acknowledge reads both, and approvals (warnings) never join a burst. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When several agents finish in one workspace within a few seconds, cmux NEXT posted one banner per agent. Now they share one: the first finish posts as usual, and each other agent that finishes in the same workspace within 10 s replaces the delivered banner with one titled "3 agents finished", subtitled with the workspace, whose click opens the agent that finished last. The digest's body is the newest notification's body. This is parity row 3 of cmuxterm-hq#2099 (the old app's coalescing queue) and proposal 3 of #20891.
DemandTimerwith the service's injectable clock, so there are no polling timers.The logic lives in
CmuxNextBridge/FinishedBannerBursts.swift, outside CmuxNextApp (SW14 size cap).DaemonNotification.isFinishedTurnandTabModel.holdsUnreadAsk(besides:)moved there fromNotificationCenterService, which keeps only the wiring: join on a finished turn, withdraw what the digest replaces, and leave the burst on acknowledge. The digest title is a new plural string inNotificationsPanel.xcstringswith all 21 locales (machine translated,needs_review). CmuxNextApp shrinks by 5 lines: on the merge with current feat-cmux-next,check-app-size.shreports 113727 lines, 8 under the cap of 113735. Package.swift is unchanged.Verification
withdrawnrecord it reads):run-swift-testing-suites.sh Packages/macOS/CmuxNext, fleet step 590700b67f366a85eca9a763.FinishedBannerBurstTestsfailed with 2 issues: five separate banners showed and no "3 agents finished" banner was posted. It was the only failing suite.FinishedBannerBurstTestspassed. The only other red there wasSidebarInsertWhileDisplayAsleepTests(motion alpha on a headless worker), which doesn't touch this change.check-concurrency,crash_ratchet,check-no-godfiles,check-state-roots,check-system-blue,check-test-notification-centersandcheck-l10n.FinishedBannerBurstTestspassed and the same unrelated sidebar motion suite was the only red.check-release-compile.sh) at 3693906: fleet step 095d574134b9752c716d7270, BUILD SUCCEEDED.FinishedBannerBurstTestsfailed with 3 issues: the read agent was still counted in a silent digest, and the first agent's earlier banner stayed beside the digest.freeze-checkpassed. The tests now read the replaced banners from the burst rather than from aDesktopNotifier.withdrawnfield, which is gone.Bead: cx-kz6m0.1 (parent cx-kz6m0).
Base reds in
cmux-next checks, not this change and not gating (coordinator): No literal state roots (LegacyChannelSession.swift), Type scale (BrowserFitFrameView.swift), Package conventions lint (BuiltInAdBlockerSetting.swift). Thecompilequeue check is stuck and does not gate; the fleet Release compile above covers it.Changelog
🤖 Generated with Claude Code