前言¶
用 DeepSeek Harness(DSH)跑长任务时,Agent 会在两种时刻需要你:一是 ask_user_question、审批或计划确认等「等你回复」;二是会话从 running 变为空闲,表示这一轮跑完。若你一直盯着 DSH 标签页,状态变化本来就在界面上;一旦切到别的标签、最小化浏览器,或干脆关掉浏览器,就容易错过。社区插件 dsh-notify(维护者 TaoYe599,分类:客户端)按「任务结束时谁还活着」分层发通知:页面仍开着但你不看时走网页通知,浏览器关掉后由 Host 在 Windows 上弹原生 toast。
这是什么¶
dsh-notify 是标准 DSH bundle(声明 dsh.bundle.patch,随包提供配置补丁)。它解决的是:在 DSH 需要你或任务结束时,用系统通知提醒你——浏览器开着时弹网页通知,浏览器关掉时由 DSH Host 直接弹 Windows 原生通知。
| 状态 | 表现 | 通知 |
|---|---|---|
| 它在等你 | 提问、审批、计划确认等 | 「需要你的回复 / 确认」 |
| 它不用你了 | 会话从 running 变为空闲 |
「任务已完成」 |
仓库:GitHub — TaoYe599/dsh-notify;目录页:SkillHub — dsh-notify。当前 package 版本为 0.1.0,许可证 MIT。插件以当前 DSH 进程权限运行,安装前建议自行查看源码与许可证。
通知由谁发、何时不发¶
覆盖范围按「任务结束时谁还活着」划分:
| 你的状态 | 谁来通知 | 说明 |
|---|---|---|
| 看着 DSH 页面 | 不通知 | 状态变化你已经看见了 |
| 切到别的标签页 / 别的应用 / 最小化浏览器 | 客户端(网页通知) | 点击通知可回到标签页;标签页标题出现 (N) 未读徽标 |
| 关掉浏览器 | Host(Windows 原生通知) | 页面没了,DSH 进程仍在跑,由 Host 接管 |
设计上有几条值得知道的约束:
- 按存活进程分层:浏览器关掉后网页通知不可能,Host 半用 Windows PowerShell 5.1 的 WinRT
ToastNotification弹原生 toast(PowerShell 7 已移除该类型投影,故特意用 5.1)。 - 两个通道不重复:页面持有插件期间每 20 秒 ping 一次
/dsh-notify/presence,关闭时用sendBeacon告别;Host 发现还有活着的页面就保持沉默,完全交给客户端。 - 对界面无感:无常驻设置项;首次使用浮出小卡询问是否允许通知;权限被拒或漏掉时卡片会带原因回来(三态),而不是静默失效。
- 不丢事件:客户端读会话
running与待处理交互表,由 DSH 连接推送驱动,不用轮询。 - 不误报子任务:Host 只对
agents.roots()里的顶层会话通知;子 agent 带 owning agent context,会被排除。
安装与启用¶
安装请用官方 CLI:dsh plugin 会把参数转发给 profile 目录下的 pnpm,并在包声明了 dsh.bundle 时自动追加进 dsh.profile.bundles。
下面三种方式任选其一(命令来自仓库 README):
# 1) 从本地目录安装(开发时最常用)
dsh plugin --profile web add <本包所在目录>
# 2) 从 tarball 安装(分发给同事时最省事)
pnpm pack # 生成 dsh-notify-0.1.0.tgz
dsh plugin --profile web add ./dsh-notify-0.1.0.tgz
# 3) 从 npm 或 GitHub 安装(需先发布/建仓)
dsh plugin --profile web add dsh-notify
dsh plugin --profile web add github:<你>/dsh-notify
不用启动 DSH 即可确认层已生效:
dsh --profile web --dump-config # 输出中应出现 「# == dsh-notify」 层
安装或更新后必须重启 dsh web:bundle 列表与 Host 半在 profile 启动时加载;仅改客户端 bundle 时刷新页面即可。
卸载:
dsh plugin --profile web remove dsh-notify
随后重启 dsh web。临时停用可在该 profile 的 cordis.patch.yml 里对本插件行加 disabled: true。
典型用法与权限¶
安装并重启 dsh web 后,正常使用 DSH Web 即可,无需额外配置项。
- 首次进入带该 bundle 的页面时,浏览器会询问是否允许通知;允许后,在你不在看 DSH 标签页时,任务完成或待回复会触发网页通知。
- 关闭浏览器后,若 Host 仍在跑且判定无在线页面,Windows 上会收到原生 toast。
- 若要在浏览器里彻底关掉网页通知:在站点设置里把本站「通知」改为「阻止」;Host 在浏览器关闭时仍会通知。
- 若想再次被询问:清除本站点数据(会清掉 localStorage 的
dsh-notify.asked),刷新后会再问。
分发给同事时,README 推荐优先 pnpm pack 发 .tgz,对方执行 dsh plugin --profile web add ./dsh-notify-0.1.0.tgz。本包零运行时依赖(Host 半只用 Node 内置模块),客户端 bundle 已预构建,三条安装路径都不需要构建期脚本。
排查与已知边界¶
Host 半向 ~/.dsh/dsh-notify.log.jsonl(或 $DSH_HOME 下)追加 JSONL 诊断,每条带 event,例如:presence-route(握手可用)、toast(已发原生通知)、skip(原因如 page-alive / subagent / repeat-window)、toast-failed、no-web-server。客户端日志在浏览器控制台,前缀 [dsh-notify]。
使用前需知:
- 原生通知目前仅 Windows;非 Windows 平台检测仍运行,只跳过显示。
- 存在性 TTL 为 150 秒:正常关浏览器会立刻发告别信标;崩溃来不及发信标时,最多约 150 秒 Host 才接管。
- 远程访问可能重复通知:非 localhost 域名访问时,若存在性心跳路径未代理转发,Host 可能误判无页面,客户端与 Host 各弹一次;本机
127.0.0.1不受影响。 - 子 agent 会话不通知为有意设计。
结尾¶
dsh-notify 把「任务结束」和「需要你回复」两种 DSH 状态,映射到网页通知与 Windows 原生 toast,并用存在性握手避免双通道重复。适合长时间挂任务、又需要离开页面的 DSH Web 用户;Windows 以外或纯远程代理场景需对照上文边界自行评估。
- 目录页:https://www.skillhub.cn/plugins/TaoYe599/dsh-notify
- GitHub:https://github.com/TaoYe599/dsh-notify
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。