前言¶
在 DeepSeek Harness(DSH)里跑长任务时,窗口最小化去做别的事很常见。若只靠盯着界面,很难知道 agent 是还在多回合里跑、已经停下来等你,还是整件事已经结束。社区里也有「回合结束就弹通知」的做法,但在开启 goal 目标模式时,一个目标往往要跑很多回合——每个回合结束都响一次,只会逼你把通知关掉。
下面介绍维护者 ztl0001 的客户端插件 dsh-notify(市场包名 dsh-notify-toast)。它在 Windows 通知栏弹出系统原生 toast,并在设计上区分「某一回合结束」和「任务真正做完」,尽量做到一条通知对应一件完成的事。
这是什么¶
dsh-notify 是 DSH 的 Cordis 插件:监听宿主会话与 agent 状态,在合适时机调用 WinRT toast API,把会话标题、结果状态和最后一条回复的摘要推到 Windows 通知中心。
- 仓库:https://github.com/ztl0001/dsh-notify
- 社区目录:https://www.skillhub.cn/plugins/ztl0001/dsh-notify(独立站点,与 DeepSeek / 幻方无官方从属关系)
- 许可证:MIT(
package.json版本 0.1.0) - 分类:客户端;仅 Windows 有效,非 Windows 会记 warning 并静默不工作,不影响宿主启动
和其他「回合结束就通知」做法的差异¶
DSH 里「一个回合结束」不等于「任务做完了」。插件把两类信号合在一起判断:
| 信号 | 说明 | 单独用的问题 |
|---|---|---|
session/event 的 turn/end |
带结束原因(完成、出错、被取消等) | 多回合目标下每回合都通知太吵 |
agent/status 的 idle |
没有驱动在跑 | 不知道是怎么结束的 |
做法:回合结束时只记录结果;等 agent 进入 idle,再经过 settleDelayMs 确认没有立刻继续,才发通知。挂了 goal 时,中间回合一律安静,只在目标完成或阻塞时通知一次;例外是 agent 停下来等人(提问、阻塞、报错)——此时值得打断你。
调度放在 turn/end 上(定义结果的事件),idle 与 running 用于过滤与取消待发通知,避免宿主「先报 idle、后提交 turn end」时通知永远排不上的情况。
核心功能¶
- Windows 原生通知,不依赖 BurntToast 等第三方模块;由系统自带的
powershell.exe(Windows PowerShell 5.1)弹出。 - 通知内容可包含会话标题、结束原因对应的状态,以及可配置的回复摘要(
includeSummary、summaryLimit)。 notifyOn支持every-turn(挂目标时仍只在整目标结束或需关注时通知)、attention(仅 agent 停下来等人)、never。onlyMainSessions默认不通知子代理会话。sound可按结果选提示音,或静音,或指定 WinRT 提示音名。
安装与启用¶
在终端执行(将 <你的 profile> 换成实际 profile 名):
dsh plugin --profile <你的 profile> add dsh-notify-toast
也可以在 DSH Settings → 插件市场里搜索 dsh-notify 一键安装。
安装后在 Settings → 插件 中改配置,或写入 profile 的 cordis.patch.yml,例如:
- id: dsh-notify
name: 'dsh-notify-toast'
config:
notifyOn: every-turn
onlyMainSessions: true
settleDelayMs: 400
includeSummary: true
includeCwd: false
summaryLimit: 220
sound: kind
配置项说明¶
| 项 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关 |
notifyOn |
every-turn |
通知策略(见上文) |
onlyMainSessions |
true |
不通知 subagent 会话 |
settleDelayMs |
400 |
进入空闲后再等的毫秒数,用于合并连续回合 |
includeSummary |
true |
是否带标题与回复摘要 |
includeCwd |
false |
是否附带工作目录 |
summaryLimit |
220 |
正文最大字符数 |
sound |
kind |
kind / silent 或具体 WinRT 提示音名 |
appId |
空 | 可选 AppUserModelID;留空时按 DSH_APP_USER_MODEL_ID 等回退 |
debug |
false |
决策过程写入宿主日志,排查「该弹没弹」时打开 |
环境要求¶
- Windows(WinRT toast)。
- Node:
^22.19.0 || >=24.0.0(与package.json的engines一致)。 - 通知不出现时,常见原因是专注助手(Focus Assist)、勿扰模式或系统通知被关闭;日志里会有
dsh-notify:前缀的记录。
典型用法与排查¶
- 安装并启用后,正常在 DSH 里跑任务;窗口可最小化,待 agent 真正空闲且满足
notifyOn规则时会收到一条 toast。 - 若完全没有通知,README 建议先确认插件是否进入加载器树(例如在
list_plugins中查看include:dsh-notify的fiberPhase是否为active),再查cordis.patch.yml缩进与config结构,最后开debug: true看日志。 - 从源码本地装进宿主时,需同时处理
dsh.profile.bundles与dependencies;仓库提供set-bundle-state.mjs与register-local-plugin.mjs,且要求在完全退出 DSH 后执行——运行中的宿主会回写配置。
适用场景与注意¶
适合在 Windows 桌面上使用 DSH、且希望长任务或 goal 跑完后用系统通知提醒自己回来的开发者。
插件在当前 DSH 进程权限下运行,安装前请自行查看 仓库源码 与 MIT 许可证。非 Windows 平台不会弹通知;不要把社区目录当成官方应用商店,包名以市场为准:dsh-notify-toast。
结尾¶
dsh-notify 用 turn/end 与 idle 的组合,把「吵人的每回合通知」和「漏报的真正完成」拆开处理,在 Windows 上提供可配置的 DSH 任务完成提醒。