桌面与 webhook 通知:任务完成、出错或等待审批时提醒;零依赖,走系统自带的 osascript / notify-send / PowerShell toast,并支持 Slack 兼容的 webhook,可配置最短回合时长。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-notification
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:nishit130/dsh-notification
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
该插件的 README 只有英文版本。
Desktop, browser + webhook notifications for DeepSeek Harness on macOS · Linux · Windows: know when your agent finishes a turn, hits an error, or is waiting for your approval — without watching the tab.
Long agent turns are the norm: you kick off a task, switch away, and come back to find the agent
finished five minutes ago — or worse, stuck on an approval prompt the whole time. dsh-notification
listens to the harness's own lifecycle events and pings you the moment your attention is needed.
What it does
| Event | Trigger | Default |
|---|---|---|
| Agent finished | agent/status flips running → idle, and the turn ran ≥ minTurnDurationMs |
on |
| Agent error | agent/error (a step or turn errored) |
on |
| Approval needed | approval/request waterfall (observe-only; always delegates with next()) |
on |
Each event can go to:
- Desktop notification — zero dependencies:
osascript(macOS),notify-send(Linux), PowerShell toast (Windows). - Webhook — a JSON
POSTwith a Slack-compatibletextfield, so a Slack/Discord/generic incoming-webhook URL works out of the box.
Install
dsh plugin --profile web add dsh-notification
# or straight from git:
dsh plugin --profile web add github:nishit130/dsh-notification
The package ships plain ESM JavaScript — no build step, so a git install needs no
allowBuilds entry.
Where notifications appear
Three channels, three places:
| Channel | Fires on | Best for |
|---|---|---|
Desktop (desktop) |
the machine running the dsh server |
dsh web on your own machine |
Browser (browser) |
the machine viewing the Web UI | a remote server, or any Web UI use |
Webhook (webhookUrl) |
wherever the URL points | phones, Slack, unattended runs |
Browser notifications use the standard Notification API: the Web UI asks for permission on
your first click or keypress, and by default popups appear only while the tab is hidden —
a visible tab already has your attention (set browserOnlyWhenHidden: false to change that).
Running everything on one machine with the tab hidden? You'd get both a desktop and a browser
popup for the same event — turn one channel off (desktop: false or browser: false) if the
pair bothers you.
Configuration
Override the row in your profile's cordis.patch.yml (or via the Settings UI):
- insert:
- id: notify
name: dsh-notification
config:
minTurnDurationMs: 10000 # only notify for turns ≥ 10s
webhookUrl: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
notifyOnApproval: true
desktop: true
title: 'DSH'
| Field | Type | Default | Meaning |
|---|---|---|---|
notifyOnIdle |
boolean | true |
Notify when a turn finishes |
notifyOnError |
boolean | true |
Notify on agent/error |
notifyOnApproval |
boolean | true |
Notify when a tool call awaits approval |
minTurnDurationMs |
number | 5000 |
Skip notifications for quick turns |
desktop |
boolean | true |
Native desktop notification on the server host |
browser |
boolean | true |
Browser Notification popups in the Web UI |
browserOnlyWhenHidden |
boolean | true |
Suppress browser popups while the tab is visible |
webhookUrl |
string | '' |
Optional POST target (Slack-compatible payload) |
title |
string | 'DeepSeek Harness' |
Desktop notification title |
Webhook payload
{
"text": "Agent finished — done in 2m 14s",
"summary": "Agent finished",
"body": "done in 2m 14s",
"level": "info",
"ts": "2026-08-21T12:34:56.000Z"
}
Design notes
- Everything registered through
ctxis an effect — the listeners are removed automatically on unload/hot-reload; there is no manual cleanup path (Cordis revertible effects). approval/requestis a waterfall. This plugin only observes it, so its listener always callsnext()— returning without it would claim the decision and swallow the real answerers.- Never break the loop. Desktop spawns are detached and fire-and-forget; webhook failures are swallowed. A notifier must never surface an error into the agent's turn.
Local development
Copy dev.patch.example.yml to dev.patch.yml (gitignored), point it at your checkout's
absolute path, then from a harness source checkout:
pnpm dsh web --patch ./path/to/dsh-notification/dev.patch.yml
Edits to index.js hot-reload without a restart. Run the tests with npm test.
License
MIT
链接
同类插件
xmanrui/dsh-im★ 1636
通过二维码或机器人凭据将 IM 机器人接入 DeepSeek Harness(支持飞书、微信、钉钉、企业微信、QQ、Slack、Telegram、Discord 和 WhatsApp 共 9 种渠道)。
shaobeichen/dsh-pocket★ 1558
手机远程访问 DSH Web 界面:扫码即用局域网或公网(cloudflared 隧道)访问,实时同屏、移动端适配布局,带设置页管理。
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 677
通过 WebSocket V2 将 DeepSeek Harness 接入 Avernet Bot 协作网络,支持自动注册、Agent 会话隔离、工具调用事件和多 Bot 路由工具。
omdsh-dev/dsh-notification★ 85
回合完成桌面通知,按结果分控 + 关键词过滤。
whyihaveyou/dsh-suite#plugin-notify★ 56
回合完成、错误或待审批时推送 IM webhook(飞书/企微/钉钉/Slack/Discord/自定义)与本地通知。
omdsh-dev/dsh-lark★ 55
DeepSeek Harness 的飞书/Lark 机器人渠道:每个会话驱动独立 agent,工具审批、模型提问与计划审阅都以卡片回到聊天,点按钮或直接回复即可作答;聊天里用 `/cd`、`/model`、`/new` 切工作区、换模型、重开会话,多个机器人各自独立并可在同群交接回合。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。