DeepSeek Harness 插件

nishit130/dsh-notification

Star 数 ★ 2 下载量(近 30 天) 2,393 分类 通知与集成 收录于 2026-08-22 npm dsh-notification

桌面与 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 POST with a Slack-compatible text field, 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 ctx is an effect — the listeners are removed automatically on unload/hot-reload; there is no manual cleanup path (Cordis revertible effects).
  • approval/request is a waterfall. This plugin only observes it, so its listener always calls next() — 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

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。