用 dsh-notification 给 DeepSeek Harness 加上回合完成桌面通知

前言

DeepSeek Harness(dsh)把智能体跑在本地 Web 界面里,一轮任务经常要等很久:改代码、跑测试、查仓库,浏览器标签页一切走,完成或报错就只能回头盯着会话列表。页面开着但人在别的窗口时,这种等待尤其明显。

DeepSeek 官方把 Harness 的设计写成「一切皆插件」:模型、工具、会话、沙箱、循环和 UI 都是可替换的插件,不必改 Harness 源码。社区目录 deepseek-harness-plugin.com 收录了不少第三方扩展,它是独立站点,与 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。

dsh-notification 就是其中一款通知类插件。它不给模型加工具,只在 Web GUI 里用浏览器的 Notification API 弹出系统通知,让你切到别的标签页也能知道这一轮已经结束。本文按目录详情页、仓库 README / README.zh.md、package.json 和 DeepSeek Harness 官方说明核对后整理。

这是什么

dsh-notification 是面向 DeepSeek Harness Web GUI 的桌面通知插件,由 omdsh-dev 维护,许可证 MIT,当前仓库版本为 0.1.2。社区目录把它归在「通知与集成」,2026-08-15 收录;写作当日(2026-08-17)目录页与 GitHub 仓库均显示 55 stars。

它解决的问题很具体:会话结束一轮后,浏览器弹出系统通知。你可以按结束原因开关,再用关键词包含 / 排除规则过滤,避免所有完成都响一遍。

仓库 README 把实现拆成两半,不需要改 Harness 源码:

host:   notification 投影(最近一轮的原因/正文/工具名) --session/projection--> 浏览器
client: 会话列表完成提醒(实时、去重)+ 持久化设置
        -> 权限 + 当前会话可见性门控
        -> new Notification("DSH 已完成", { body: "部署完成" })

host 侧只对已有会话日志做只读投影(结束原因、截断后的回复正文、调用过的工具名),client 侧监听会话列表里「未选中会话已完成」的实时去重信号,再套上你保存在浏览器里的偏好。插件不写会话日志,不注册面向模型的工具,也不往请求里塞任何提示词,因此没有额外 token 开销。

核心功能

按结束状态决定要不要响

host 投影会带上这一轮的结束原因。设置里可以分别开关五类:

  • 正常完成(completed)
  • 出错(error)
  • 中止(aborted)
  • 阻塞(blocked)
  • 达 Token 上限(token limit)

默认只开「完成」和「出错」,其余关闭。长时间跑任务时,通常只需要知道成功或失败;中止、阻塞、打到 token 上限可以按自己的工作流再打开。

关键词包含 / 排除

规则匹配对象是会话标题、该轮回复文本,以及调用过的工具名。更早的轮次不会参与匹配。

  • 包含规则:至少命中一条才通知;一条都没有时整轮不弹。
  • 排除规则:命中即不通知。
  • 支持字面量或正则,可选择是否区分大小写。

默认没有任何关键词规则。需要的时候可以用来只盯含 deployerror 的会话,或把噪音大的工具名排除掉。

可见性门控

「仅在任务不在眼前时通知」默认开启:当前正在看的那条会话完成时不弹;页面在后台,或你正在看别的会话、别的工作区时仍会提醒。关掉之后,即使正盯着该会话也会通知。同一会话的多条通知会互相替换,避免堆一串横幅。

另外还有总开关和「需要手动关闭」。总开关关掉后不再弹出,规则和偏好仍保留;手动关闭打开后,通知会一直待到你点掉。

权限与测试

偏好存在浏览器 localStorage。设置段在 设置 > 通知,可以在这里授予浏览器 Notification 权限,并发送一条测试通知,用来确认系统层面没有把浏览器通知拦掉。

安装与启用

插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前应先看仓库源码和 MIT 许可证。

社区目录页给出的安装命令是:

dsh plugin add github:omdsh-dev/dsh-notification

这是目录页的原文写法。该插件的 dsh.plugin.json 把 client 平台声明为 web,仓库 README 因此要求装进 web profile,并用带版本标签的 tarball,装完后重启 web 服务,让 host 半部分和新的 client bundle 一起生效:

dsh plugin --profile web add https://github.com/omdsh-dev/dsh-notification/archive/refs/tags/v0.1.2.tar.gz

默认的 dsh web profile 已包含所需的 client 组合(会话列表、设置外壳、locale)。目录页还提示:如需可复现安装,可固定 commit 哈希,例如 dsh plugin add github:omdsh-dev/dsh-notification#<commit>

装完后打开 Web GUI,到 设置 > 通知 打开总开关,并在浏览器弹出权限请求时选择允许。macOS 等系统还要在系统设置里允许该浏览器发送通知,否则页面里开了也看不见横幅。

典型用法

  1. 先发一条测试通知,确认浏览器权限和系统通知开关都已放行。
  2. 保持默认:完成和出错才提醒,「仅在任务不在眼前时通知」保持开启。切到别的标签页跑一轮任务,完成后应看到标题为「DSH 已完成」一类的系统通知,正文是该轮回复的文本摘要。
  3. 若只关心部署或报错,加包含规则(例如字面量 deploy)或排除规则,过滤掉不需要的会话标题、回复片段或工具名。
  4. 回复很长时,host 侧会按 maxBodyChars 截断后再送给浏览器。需要更长摘要时,在 cordis.yml 对应插件行上改配置:
- id: dsh-notification
  name: dsh-notification
  config:
    maxBodyChars: 400      # 投影正文预算;更长的回复会在 host 侧省略号截断

点击通知只会把浏览器窗口拉到前台,不会跳到那一轮的具体位置。通知正文是纯文本摘要,不是完整对话。

适用场景与注意事项

比较适合这些情况:

  • dsh web 跑较长的编码或排查任务,人会切去看文档、邮件或别的仓库。
  • 同时开着多个会话或工作区,需要知道后台那条已经结束。
  • 只想被「完成 / 出错」打断,而不是每一次中止或阻塞都弹一次。

使用前要清楚边界,这些都写在仓库的「已知限制」里:

  1. 标签页必须开着。页面隐藏时浏览器仍可弹通知;标签页关掉之后不会再弹。它不是操作系统级的常驻守护进程。
  2. 必须授予 Notification 权限。站点权限被拒绝后,无法从页面内部强行恢复,需要到浏览器站点设置里改。
  3. 只在 running→idle 边沿触发一次。断线期间完成的轮次,重连后不会补发。
  4. 规则只看最近一轮。会话标题 + 最近一轮回复 + 该轮工具名,不匹配更早的轮次。
  5. 点击不深链。只聚焦窗口,不会定位到那一轮。

目录页的安全提示同样适用:插件以当前 dsh 进程权限运行。这款插件声称自己只读投影、不写日志、不给模型加工具,但仍应自行核对源码后再装。

小结

dsh-notification 把「这一轮跑完了」从 Web 页面里挪到系统通知栏,用结束状态开关和关键词规则控制噪音,并且不改模型请求、不改会话日志。它依赖浏览器 Notification API 和仍打开着的 Web GUI,适合已经在用 dsh web、又经常把标签页切走的人。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-notification/

GitHub:https://github.com/omdsh-dev/dsh-notification

羽毛球分组比赛记分
小程序二维码

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

小夜