Start a ninety-minute task, go to lunch, come back to discover the agent stalled on an approval dialog three minutes in. That is the default bad experience of running DSH unattended: nobody tells you when the task finishes, and nobody tells you when it wedges.
The demand
- #5208: system-level notification cards, ideally with in-card approval.
- #6712: browser sound + notification on completion.
- #2335 (5 upvotes): no alert at all when the context window fills up and the task silently dies.
The gap
349 indexed repositories touch notifications; exactly one has 100+ stars (and that one, dsh-cost-meter at 290★, is adjacent rather than focused). The focused entries — THEWOLFWALKER/dsh-notifier (95★), omdsh-dev/dsh-notification (83★) — each cover a single channel. dsh-im (1,274★) is two-way IM bot integration, not push notifications. Competitors exist; a winner does not.
Proposed shape
Primarily a host service: subscribe to session and turn events (completed, approval requested, errored, context nearly full) and route them to configurable channels — Lark/WeCom/Bark/Telegram/generic webhook — with a client settings card to manage channels and toggles.
Implementation notes
- Event sources: the official events doc and the session-telemetry subsystem. DSH ships a webhook runtime — evaluate reusing it before building your own.
- Make approval notifications deep-link back into the session: the value of a notification is not the alert, it is returning the user to the right context.
- Per-channel retry and degradation; a notification plugin that fails silently is worse than none.
- Settings card via the official cookbook: adding-a-settings-card.md.
The MVP
One channel (generic webhook) and three event types (done / approval / error). Under a week.
Risks
Notification payloads can carry session summaries — sensitive data leaving the machine. Disclose it and redact by default; the permission surface is exactly what a review will inspect.
FAQ
Isn’t the browser Notification API enough?
It covers only “a person is staring at the browser.” Unattended and remote scenarios need channels that leave the browser — which is precisely the gap.