Extend notification service to support promos and chat tips
- Dominant language
- TypeScript
- Stars
- 193k
- Forks
- 42.4k
- PR merge metrics
- PR metrics pending
Description
## Summary
The workbench notification service (`INotificationService`) is the only place users can globally mute toasts (Do Not Disturb) or mute a specific **source** (typically an extension). Chat promos, quota/usage banners, and chat tips live in a **separate** notification stack and do **not** participate in that control plane.
We want to **Unify the control plane** so chat promo, usage, and tip surfaces register as notification sources. Users can then disable those types the same way they disable an extension's notifications, and global DND applies consistently.
With a secondary goal of modernizing the look of the notifications:
## Problem
Users already have a mental model for notification control:
- Bell / **Toggle Do Not Disturb Mode** — silences non-error toasts (`NotificationsFilter.ERROR`).
- **Toggle Do Not Disturb Mode By Source…** — multi-select of sources that have previously posted a notification.
- Per-notification **Don't Show Again** (`neverShowAgain`).
Chat surfaces reinvented the same product problem with different APIs, persistence, and mute UX:
| Surface | Implementation | User control today | Respects workbench DND? |
| --- | --- | --- | --- |
| Extension / workbench toasts | `INotificationService` → `NotificationsModel` → toast list + notification center | DND, per-source filter, never-show-again | Yes |
| Model promos | `ChatPromoNotificationContribution` → `IChatInputNotificationService` | Dismiss persists by promo id (`chat.dismissedPromoIds`) | No |
| Quota / usage | `ChatQuotaNotificationContribution` → same chat-input service | Dismiss-for-exhausted-until-reset; approaching auto-dismisses on next message | No |
| Chat tips | `IChatTipService` + `ChatInputTipPresenter` | `chat.tips.enabled`, per-tip dismiss, hide-for-session | No |
| Other chat input notices | SDK setup, signed-out models, prompt cache, permissions, etc. | Ad hoc | No |
Result: a user who turns on DND or mutes “GitHub Copilot” still sees promo/usage/tip banners in chat. Muting a promo does not appear in the source picker. Tips are a settings toggle, promos are a storage set, quota is another storage key.
## Goals
1. **One preference model** for “should this optional signal show?”
- Global DND
- Per-source / per-type mute
- Same picker and bell UX users already know
3. **Chat promo, usage, and tips hook into that model** without losing in-chat placement, session scoping, or existing dismiss semantics.
Contributor guide
Assessment
This issue has not been assessed yet.