鲸吟(dsh-notify-whale):DSH 会话与待办通知加固版

前言

用 DeepSeek Harness(DSH)跑长任务时,人往往不在电脑前。上游社区通知插件 dsh-task-notify 能覆盖「任务结束推手机」的基本需求,但在 Node 22/24 上 HTTP 通道会静默失败,且审批、提问等人机交互卡点不会触发推送。下面介绍维护者 Lon-dawn 发布的加固 fork 鲸吟(npm 包名 dsh-notify-whale),分类为联网工具,在真实 DSH 上修掉已知必现问题并补等待类通知与设置面。

这是什么

鲸吟是 DSH 的 Cordis 通知插件:会话结束时推送到本机或手机;卡在审批或等你回答时也会推。纯 ESM(.mjs)、无构建步骤。

推送通道与平台

端 方式
macOS 系统通知中心(osascript,零依赖)
Windows Toast(PowerShell + WinRT,含 PNG 图标)
手机 Bark(iOS)、ntfy(Android/iOS)、Server酱、任意 Webhook

相对上游:修了哪些、加了哪些

5 个必现 bug(README 根因表)

  1. ntfy 中文标题报错 Cannot convert argument to a ByteString:标题曾放进 X-Title,Node fetch/undici 要求 header 为 Latin-1。→ 改用 ntfy 官方 JSON POST(body 含 topic,message,title,icon)。
  2. 所有 HTTP 通道发不出去:send() 未传 method: "POST",httpPost 变成带 body 的 GET,undici 拒绝。→ 显式 POST。
  3. 正文永远取不到会话标题:插件读 agent.session.events,而 DSH Session 无 events 属性;应使用 snapshotEvents()。→ 改 API 并改进兜底(剥 session- 前缀、优先 header.cwd 项目名)。
  4. 出错或手动停止仍显示「任务完成」:AgentStatus 仅 idle / running,结束原因需读最后一条 turn/end 的 reason(时序:turn/end 早于 agent/status: idle)。
  5. 部分活跃会话的「完成」通知被丢弃:误用 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜