microsoft / microsoft/vscode

Extend notification service to support promos and chat tips

Open
#332,650 0 comments 0 reactions 2 assignees Claimed by @lramos15 View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.