Back to home@Lubaoshuai

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
GitHub repo

Introduction

dsh-notify

English | 中文

Push notifications for DeepSeek Harness. Two capabilities in one plugin:

  1. notify_send tool — the agent can push a message to your phone / chat at any time: long build finished, approval needed, nightly job done, error hit.
  2. Schedule companion — the official @deepseek-ai/dsh-schedule package delivers reminders only inside the conversation (by design, "no email, SMS, or push notification"). dsh-notify watches the same schedule/change event stream and mirrors every dispatch to your channels, so a reminder also reaches you outside the session.

Channels

ChannelFieldsNotes
telegrambotToken, chatId, apiBase?Bot API sendMessage; apiBase for self-hosted bot API servers
slackurlIncoming webhook
discordurlWebhook
feishu 飞书url, secret?Custom bot; HMAC signing supported
dingtalk 钉钉url, secret?Custom bot; HMAC signing supported
barkdeviceKey, barkServer?iOS push; server defaults to https://api.day.app
ntfytopic, server?, token?Server defaults to https://ntfy.sh
webhookurl, 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_send is a normal registered tool: typed JSON-Schema arguments, canonical { delivered, failed, results } output, cooperative timeoutMs, concurrency-safe.
  • The schedule companion folds version-1 schedule/change events (createdeletedispatch) 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: dsh must be running for a notification to fire (any in-process plugin has this limit). A reminder that fires while dsh is 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 webhook channel 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 — two tsc passes (sources, sources+tests)
  • npm test — vitest: fold protocol, per-channel HTTP payloads (local node:http server), signing schemes, config normalization
  • npm run buildtsc emit to lib/ (JS to lib/, declarations to lib/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

License

MIT