Summary
Add a notification system that allows any running code (scheduled tools, agent sessions,
background services) to post tab-linked notifications. A notification associates a tab with
a reason string. The UI shows an auto-fading overlay on new notifications and a bell toggle
button for explicit browsing.
Design
See docs/design/notifications.md.
Scope
Data model
INotificationService.Notify(TabDescriptor tab, string? reason) — null reason clears the tab's notification
- One notification retained per tab (newest replaces oldest, marks unread)
- Snoozed tabs: auto-read, never trigger overlay popup; persisted in
user-computer-profile
Overlay UI
- Anchored below the toggle button (top-right header)
- On new non-snoozed notification: appears at full opacity, fades to transparent over ~1s after 1.5s delay (unless mouse hovers)
- Toggle button: bell icon with unread count badge; opens overlay at full opacity indefinitely on click
IsHitTestVisible = false when fully transparent
Notification row
- Tab title + reason text + relative timestamp
- Unread indicator (bold / colored dot)
- zzz button: snooze/unsnooze the tab
- Clicking row: navigate to tab, mark read, close overlay
Keyboard navigation
- F8: navigate to next (newer) unread notification; mark read
- F7: navigate to previous (older) unread notification; mark read
- Both keys reopen closed tabs using
TabDescriptor
Tab navigation on click / F7/F8
- Tab open:
MainWindowViewModel.OpenTabAsync
- Tab closed: reopen via
TabDescriptor with original disposition
Acceptance
- Any in-process code can post/clear a notification for any tab via
INotificationService
- New non-snoozed notification causes overlay to auto-show and auto-fade
- F7/F8 cycle through notifications navigating to each tab
- Snoozed tabs never trigger the overlay; their notifications are auto-read
- Null reason removes the notification for that tab
Summary
Add a notification system that allows any running code (scheduled tools, agent sessions,
background services) to post tab-linked notifications. A notification associates a tab with
a reason string. The UI shows an auto-fading overlay on new notifications and a bell toggle
button for explicit browsing.
Design
See
docs/design/notifications.md.Scope
Data model
INotificationService.Notify(TabDescriptor tab, string? reason)— null reason clears the tab's notificationuser-computer-profileOverlay UI
IsHitTestVisible = falsewhen fully transparentNotification row
Keyboard navigation
TabDescriptorTab navigation on click / F7/F8
MainWindowViewModel.OpenTabAsyncTabDescriptorwith original dispositionAcceptance
INotificationService