前言¶
用 DeepSeek Harness(DSH)跑长任务时,人往往不在电脑前。上游社区通知插件 dsh-task-notify 能覆盖「任务结束推手机」的基本需求,但在 Node 22/24 上 HTTP 通道会静默失败,且审批、提问等人机交互卡点不会触发推送。下面介绍维护者 Lon-dawn 发布的加固 fork 鲸吟(npm 包名 dsh-notify-whale),分类为联网工具,在真实 DSH 上修掉已知必现问题并补等待类通知与设置面。
这是什么¶
鲸吟是 DSH 的 Cordis 通知插件:会话结束时推送到本机或手机;卡在审批或等你回答时也会推。纯 ESM(.mjs)、无构建步骤。
- 上游:
DeepseekHarnessPlugins/Notification(包名dsh-task-notify,MIT)。本 fork 保留原作者版权声明,按 MIT 发布。 - 维护者:Lon-dawn;仓库 github.com/Lon-dawn/dsh-notify-whale;社区目录 skillhub.cn/plugins/Lon-dawn/dsh-notify-whale。
- 当前 package 版本:0.5.0;Node 要求:
^22.19.0 || >=24。 - 代码改动、测试与文档由 AI 编程代理在 DSH 上完成,人类负责决策与发布;README 写明选择本 fork 的价值在于「真跑过」而非功能堆叠。
推送通道与平台¶
| 端 | 方式 |
|---|---|
| macOS | 系统通知中心(osascript,零依赖) |
| Windows | Toast(PowerShell + WinRT,含 PNG 图标) |
| 手机 | Bark(iOS)、ntfy(Android/iOS)、Server酱、任意 Webhook |
相对上游:修了哪些、加了哪些¶
5 个必现 bug(README 根因表)¶
- ntfy 中文标题报错
Cannot convert argument to a ByteString:标题曾放进X-Title,Node fetch/undici 要求 header 为 Latin-1。→ 改用 ntfy 官方 JSON POST(body 含topic,message,title,icon)。 - 所有 HTTP 通道发不出去:
send()未传method: "POST",httpPost变成带 body 的 GET,undici 拒绝。→ 显式 POST。 - 正文永远取不到会话标题:插件读
agent.session.events,而 DSHSession无events属性;应使用snapshotEvents()。→ 改 API 并改进兜底(剥session-前缀、优先header.cwd项目名)。 - 出错或手动停止仍显示「任务完成」:
AgentStatus仅idle/running,结束原因需读最后一条turn/end的 reason(时序:turn/end早于agent/status: idle)。 - 部分活跃会话的「完成」通知被丢弃:误用
session.header.parentSession判子代理;删除该判据,保留origin === 'subagent'与delegationDepth > 0。
另:Windows 上 paths.test.mjs 路径断言已随平台分隔符修正。上游测试在本 fork 为 154 / 154 通过(README);npm test 说明为 153 项单元测试。
新增能力(摘要)¶
- 等待人工介入时通知:监听
session/event(不用 waterfall 的approval/request,避免 Web 桥接器先认领导致 bundles 末位插件轮不到)。approval/asked→「待批准」;工具ask_user_question→「待回答」。 - 事件级 Bark 铃声:全局
sound+ 按事件sounds覆盖。 - DSH 0.1.7+ 原生设置页:侧边栏一级菜单「通知」,写入 profile 的
cordis.patch.yml,保存即生效、无需重启(0.1.7 起不再有$DSH_HOME/settings.yaml)。 - Bark 推送分组
group:默认本机主机名(≤8 字符),多机共自建 Bark 时可区分来源。 - 9 种事件标题可在设置页覆盖;留空沿用内置文案。
通知对照(标题 / event / Bark 铃声等)见仓库 README「通知对照表」;正文格式为 <会话标题或项目名> · <事由> · HH:mm。
安装与启用¶
官方安装命令(web profile):
dsh plugin --profile web add dsh-notify-whale
装完后重启 DSH。之后改配置在设置页进行,立即生效、不必再重启。
从本地目录安装:
dsh plugin --profile web add /path/to/dsh-notify-whale
pnpm 以 link: 接入时需在插件目录单独执行 npm install --omit=dev(否则可能缺 js-yaml 或 @deepseek-ai/schemastery)。若 pnpm 被 minimumReleaseAge 拦截,可在命令末尾加 --config.minimum-release-age=0。
配置要点¶
推荐:DSH 0.1.7+ 在侧边栏「通知」设置页修改。
也可直接写 profile 的 cordis.patch.yml(插件 id 仍为 task-notify,name 为 dsh-notify-whale)。示例片段:
- id: task-notify
name: dsh-notify-whale
config:
enabled: true
notifyOn: [idle, error, blocked]
agents: root
coalesceWindowMs: 2000
desktop:
enabled: off
sound: true
ntfy:
enabled: true
server: https://ntfy.sh
topic: "你的随机主题名"
bark:
enabled: true
server: https://api.day.app
deviceKey: "你的BarkKey"
group: ""
sound: "fanfare"
优先级:cordis patch 显式配置 > 环境变量 DSH_TASK_NOTIFY_* > 内置默认。公共 ntfy 上 topic 即密码,勿用可猜名字。
典型用法:自测与验证¶
向全部启用通道发样例通知:
node self-test.mjs
只测单个通道:
node self-test.mjs --channel ntfy
交互式改配置并当场测试:
npm run menu
仓库内还可运行 npm test、npm run test:client;ntfy 收包可在服务端用 README 给出的 curl 轮询 JSON 确认。
适用场景与注意¶
适合:长时间用 DSH 跑 Agent、需要手机/桌面在「完成 / 出错 / 停止 / 待审批 / 待回答」时提醒的开发者。
务必知晓:
- 插件在当前 DSH 进程权限下运行;安装前应阅读源码与 MIT LICENSE,自行评估 Webhook、Bark Key、ntfy topic 等凭据安全。
- DSH 社区目录(如 SkillHub)为独立生态站点,与 DeepSeek / 幻方无官方从属关系;插件非「官方应用商店」预装项。
- 设置页需 DSH 0.1.7+;更早版本可正常通知,但需手写 patch。
- 自建 ntfy 若
deny-all,手机 App 须配访问凭据;Bark 自定义铃声仅 iOS;self-test.mjs为独立进程读磁盘配置,成功不代表运行中宿主已热加载同一配置(README「已知边界」)。
结尾¶
鲸吟在 upstream dsh-task-notify 骨架上,针对 Node 22/24 与 DSH 实际 API 做了可复现修复,并把「等人操作」纳入通知链路,便于离开电脑时仍掌握会话状态。进一步了解实现与事件契约见仓库 SPEC.md。
- 目录页:https://www.skillhub.cn/plugins/Lon-dawn/dsh-notify-whale
- GitHub:https://github.com/Lon-dawn/dsh-notify-whale