dsh-notify
Push notifications for DeepSeek Harness: agent-callable notify_send tool + external delivery for schedule reminders (Telegram/Slack/Discord/飞书/钉钉/Bark/ntfy/webhook). DSH plugin.
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 30, 2026
- Updated
- Aug 30, 2026
Introduction
dsh-notify
English | 中文
Push notifications for DeepSeek Harness. Two capabilities in one plugin:
notify_sendtool — the agent can push a message to your phone / chat at any time: long build finished, approval needed, nightly job done, error hit.- Schedule companion — the official
@deepseek-ai/dsh-schedulepackage delivers reminders only inside the conversation (by design, "no email, SMS, or push notification"). dsh-notify watches the sameschedule/changeevent stream and mirrors every dispatch to your channels, so a reminder also reaches you outside the session.
Channels
| Channel | Fields | Notes |
|---|---|---|
telegram | botToken, chatId, apiBase? | Bot API sendMessage; apiBase for self-hosted bot API servers |
slack | url | Incoming webhook |
discord | url | Webhook |
feishu 飞书 | url, secret? | Custom bot; HMAC signing supported |
dingtalk 钉钉 | url, secret? | Custom bot; HMAC signing supported |
bark | deviceKey, barkServer? | iOS push; server defaults to https://api.day.app |
ntfy | topic, server?, token? | Server defaults to https://ntfy.sh |
webhook | url, headers? | Generic POST of { title, message, level, source, timestamp } |
Configure any number of channels; every notification fans out to all of them concurrently. One broken channel never blocks the others — the tool reports a per-channel receipt.
Install
dsh plugin --profile web add dsh-notify # from npm once published
dsh plugin --profile web add github:Lubaoshuai/dsh-notify # straight from GitHub
Then restart your dsh web session. The notify_send tool appears in the conversation.
Configure
Create ~/.dsh/dsh-notify/config.json (respects $DSH_HOME):
{
"channels": [
{ "type": "feishu", "url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx", "secret": "optional" },
{ "type": "telegram", "botToken": "123456:ABC", "chatId": "42" },
{ "type": "bark", "deviceKey": "your-device-key" }
],
"scheduleNotifications": true,
"timeoutMs": 15000
}
The plugin also registers the dsh-notify settings namespace, so when a settings provider is mounted its document layers on top of the file. Changes are picked up live; no restart needed.
Restart dsh after editing the file, then ask the agent: "notify me when the tests finish" — or schedule a reminder and watch it arrive on your phone.
How it works
notify_sendis a normal registered tool: typed JSON-Schema arguments, canonical{ delivered, failed, results }output, cooperativetimeoutMs, concurrency-safe.- The schedule companion folds version-1
schedule/changeevents (create→delete→dispatch) per session, exactly like the official package, so the notification can quote the original reminder prompt (dispatch events carry only the id). - Every listener body is failure-contained: a malformed event, a dead endpoint, or a timeout is reported, never thrown into the host.
- Cold sessions:
dshmust be running for a notification to fire (any in-process plugin has this limit). A reminder that fires whiledshis closed is delivered by schedule on next resume, and dsh-notify mirrors it then.
Security
- Webhook URLs and bot tokens are secrets. The config file lives under your
DSH_HOME; keep it file-mode 0600 if the machine is shared. - The
webhookchannel posts to whatever URL you configure — use HTTPS and treat it as an outbound integration, not an inbound API.
Development
npm install
npm run check # typecheck + tests + build + pack dry-run
npm run typecheck— twotscpasses (sources, sources+tests)npm test— vitest: fold protocol, per-channel HTTP payloads (localnode:httpserver), signing schemes, config normalizationnpm run build—tscemit tolib/(JS tolib/, declarations tolib/types/)
Peer dependencies track the published @deepseek-ai/* packages; the plugin loads against the real harness (dsh.bundle patch row in cordis.patch.yml, row name = package name).
Roadmap
- v0.2: browser settings card on the Web UI Plugins page
- v0.2: SMTP email channel
- v0.3: per-channel quiet hours and retry with backoff