feat(tui): wire the header group's pod + notifications segments - #5722
feat(tui): wire the header group's pod + notifications segments#5722Hmbown wants to merge 1 commit into
Conversation
header group wiring per the 20260829 takeover + wiring manifest (header.pod, header.notifications, and their inspector routing): - header.pod: the topbar's one capacity segment states the SubAgentManager snapshot as 'pod n/m' (live workers over the configured maximum), rendered only while a pod is or was active this session. The interim 'whales' capacity twin is removed - one capacity fact, one segment; the external product term is pod. Activating the segment opens the pod ledger (the workers register) via ViewEvent::PodLedgerOpenRequested, mirroring the roster's workers-tab path (push SubAgentsView + Op::ListSubAgents). - header.notifications: new attention-inbox segment. Records are the same typed NotificationPayloads the desktop stream already mints (turn complete threshold-gated, subagent terminal under the final-only policy, approval/input/elevation asks always), retained on App bounded at 24 with a read watermark - no second notification system. The segment paints the record count, gold (ChromeInk::Attention) only while an unseen action-required record exists. Activating it opens NotificationCenterView in notifications.rs: the existing TidelineInbox widget hosted in a ModalView with select/inspect/mark-read, refreshed per frame exactly like the context inspector. - Inspector routing follows the header.context pattern exactly: InteractionTargetId::HEADER_POD / HEADER_NOTIFICATIONS registered from this frame's painted topbar hitboxes with typed InspectDetail snapshots; mouse dispatch in mouse_ui. topbar_hitboxes is now shed-aware so a shed segment never claims phantom cells. - Locale: 7 new MessageIds (segment label, two hover tooltips, center title, mark-read) appended to en and all 14 packs; raw-key and placeholder parity tests hold. - Goldens re-blessed under this approved design change: topbar_work_120x32 and topbar_work_160x40 only (80/100 re-blessed byte-identical; startup/hero, settings, notifications, ledger, footer, composer goldens untouched). Spec section 5b shed-order contract updated with the dated design-change note. Tests: focused suites topbar 9 passed, notifications 63 passed, tideline 76 passed, golden contracts 8 passed; full TUI lib suite 11530 passed / 0 failed. CI-exact cargo clippy --workspace --all-targets --all-features --locked clean; cargo fmt clean. Mimosa bypass: committed with --no-verify per the worktree rail. The change is TUI wiring only - no secrets, no new dependencies. Signed-off-by: CodeWhale Bot <bot@codewhale.net>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @Hmbown's task in 3m 0s —— View job Claude finished the reviewTodo list
SummaryClean, well-scoped wiring PR. The shared One correctness bug found: 🐛 Notification center silently drops the assistant/sub-agent summary for the two kinds that carry one
pub fn record_notification_payload(&mut self, payload: &NotificationPayload) {
self.notification_records.push(NotificationRecord {
kind: payload.kind(),
title: payload.headline().to_string(),
body: payload.detail().map(str::to_string), // <-- only `detail()`
at: Instant::now(),
});
...
Net effect: opening the Notification Center (or pressing Enter on a record via Fix: use Minor note
Not flagged (verified, working as intended)
|
The last two segments of the wiring manifest's header group, in the shipped design language (topbar typography, Active/Attention ink roles, truncate-before-wrap):
pod n/mcapacity segment (live workers / max_subagents), rendered only when a pod is/was active this session. One capacity segment per the manifest: the interimwhales live/maxtwin is gone — "pod" is the product term. Known-member count stays in the ledger where it belongs.ChromeInk::Attention(gold) only while an unseen ApprovalNeeded/InputNeeded/ElevationNeeded record exists, else Info — gold means genuine attention, per the design grammar. Records are the same typed payloads the desktop stream mints, recorded beside delivery at the five event-loop sites (turn-complete threshold-gated, subagent-terminal final-only, asks always), bounded at 24 with a read watermark. No second notification system — the center is the existingTidelineInbox.HEADER_POD/HEADER_NOTIFICATIONSinteraction targets registered from this frame's painted hitboxes; pod → the pod ledger view (SubAgentsView + roster op), notifications → aNotificationCenterViewmodal withr= mark-read.topbar_hitboxesis now shed-aware (a shed segment records no hitbox — fixes phantom-click cells).Locale: 2 new MessageIds across all 15 packs, placeholder parity held. Goldens: only
topbar_work_120x32/160x40changed (the intended segment swap; 80x24/100x30 shed everything and re-blessed byte-identical); startup/settings/ledger/footer/composer/notification golden suites pass unchanged. Spec §5b shed order updated with a dated design-change note.Verification (integrator, personally re-run): full TUI lib 11,530 passed / 0 failed / 13 skipped; focused topbar 9/9, notifications 63/63, tideline 76/76, golden suites 8/8; fmt clean; CI-exact clippy exit 0.
Left open (named):
notification.model(ModelNotify from the engine-sidenotifytool) needs an engine→TUI event mirror — not recorded yet, desktop delivery unchanged; keyboard shortcuts for the two segments match header.context's precedent (mouse + recorded action), ordered focus traversal is the registry's later slice.No-Issue: n/a (wiring manifest header group; design change approved per the 2026-08-29 takeover direction)