前言¶
在使用 DeepSeek Harness(DSH)开发智能体时,对话过程中会频繁出现需要用户确认、授权或登录的场景。如果没有及时提醒,用户很容易错过这些关键交互点,导致对话中断或体验下降。现有的 Web 界面通知在后台运行时不够显眼,需要频繁切换窗口查看状态。
这是什么¶
dsh-win-notify 是 DeepSeek Harness 的 Windows 客户端插件,用于在系统通知栏实时提示 DSH 的状态变化。插件由维护者 Jxxxxx729(作者 Streait)开发,通过 Toast 通知将对话完成、等待选择、等待授权或需要登录等事件推送到 Windows 通知中心。点击通知可直接跳回对应对话,提升交互效率。
核心功能¶
插件监听 DSH 的多种事件并发出通知:
| 时机 | 通知标题 | 点击后 |
|---|---|---|
| 一轮对话正常结束 | 对话已完成 | 跳回该对话 |
| 一轮对话异常结束(报错 / 被阻塞 / 超长截断) | 对话异常结束 | 跳回该对话 |
| 弹出需要你选择的问题 | 需要你的选择 | 跳回该对话 |
| 弹出需要你授权的操作 | 需要你的授权 | 跳回该对话 |
| 需要登录 DeepSeek 账号 / 登录过期 | 需要登录 DeepSeek 账号 | 打开 DSH |
通知以 DeepSeek Harness 应用身份发出(Windows 应用 ID com.deepseek.dsh),带有应用图标,不经过 PowerShell 的身份。点击通知后,Windows 会调用 runtime/activate.vbs,将会话 ID 和类型写入 spool 目录,并启动/聚焦 DeepSeek Harness,Web 客户端每 1.2 秒轮询 /dsh-win-notify/next 获取记录,调用 uiWorkspace.openSession(sessionId) 将界面切到该对话。
安装与启用¶
方式 A:预构建包(推荐)¶
从 最新 release 下载 dsh-win-notify.tgz,在 DSH「插件」页用包文件 / URL 安装:
https://github.com/Jxxxxx729/dsh-win-notify/releases/latest/download/dsh-win-notify.tgz
装好后出现条目 dsh-win-notify,启用即生效。
方式 B:从源码¶
git clone https://github.com/Jxxxxx729/dsh-win-notify.git "$env:USERPROFILE\dsh-win-notify"
然后在 DSH「插件」页用本地 bundle 目录安装 $env:USERPROFILE\dsh-win-notify(目录里有 package.json 和 cordis.patch.yml)。
方式 C:插件市场¶
已向 awesome-dsh-plugin 提交条目(PR #8736);合并后可在 DSH 插件市场里按 notify 分类直接安装。
安装完成后只需「刷新一次 GUI 页面」让 Web 客户端半加载,之后启停插件都不必再刷新。
配置¶
在 profile 的 patch 里给 dsh-win-notify 条目加 config:
- id: dsh-win-notify
config:
skipWhenFocused: false # 窗口在前台时也提醒
activationTtlMinutes: 120 # 超过这个时间的点击记录直接丢弃
sessionSummaryLength: 140 # 通知正文里摘要的最大字符数
notifyOnTurnComplete: true
notifyOnTurnFailure: true
notifyOnQuestion: true
notifyOnApproval: true
notifyOnSignIn: true
appPath 一般不用填:插件会自己找 DeepSeek Harness.exe。
状态与日志¶
- 目录:
%LOCALAPPDATA%\dsh-win-notify\ spool\点击记录(客户端取走即删)payload\已发送的 Toast XML(保留最近 80 个)notify.log日志- 自检:
GET http://<GUI 地址>/dsh-win-notify/status返回当前配置、spool 待处理数与日志路径。 - 通知自检(不依赖任何对话事件):在
%LOCALAPPDATA%\dsh-win-notify\里新建空文件selftest.flag,再到「插件」里把dsh-win-notify关掉再打开;重新激活时会立刻发一条「通知自检」通知,用来确认「插件 → powershell → 通知栏」整条链路。 - 排查用日志行:
toast queued kind=... title=...:插件收到了事件并已生成 payload;toast exited code=0:powershell 正常结束(脚本内部还会往同一个notify.log追加一行shown);toast exited code=1或stderr=...:发送失败,stderr与脚本写的error: ...会给出原因。
适用场景与注意¶
- 适用于 Windows 10/11 + DSH 桌面版(通知身份依赖桌面应用的 AppUserModelID
com.deepseek.dsh)。 - 在非桌面版(纯
dsh web)里仍会发通知,但点通知只能打开 DSH 而无法靠应用标识显示图标。 - Windows「专注助手 / 勿扰模式」会压掉通知,需要允许 DeepSeek Harness 的通知。
- 只对用户会话提醒,子代理(subagent)会话结束不提醒。
- 如果 GUI 地址或端口变了无需改配置:客户端半用的是同源相对路径。
user-questions/request/approval/request是 waterfall 事件,内置 UI 应答者一旦认领就不会再往下走,所以本插件用{ prepend: true }抢在它之前只观察并立刻return next(),不参与决策;这也是修改这两个监听器时最容易被忽略的一点。- 改动
client.js后需要刷新一次 GUI 页面才会生效(Host 半可以用插件启停热重载,浏览器半不会自动重载)。 - 浏览器半可以离线自测:
node test-client.mjs(用假的window/fetch/uiWorkspace覆盖补前缀、解归档、dispose 停止轮询四种情况)。 - 发通知用的是非 detached 的
powershell.exe子进程并接住stderr、记录退出码。早先试过detached: true+stdio: 'ignore':桌面端重启后那种子进程会静默地不执行脚本(日志里只有toast queued、没有shown,通知也不弹),而且没有任何报错可查。不要改回 detached。 - 路由用
ctx.inject(['webServer'], (hostCtx) => ...)挂载:桌面端冷启动时插件可能比webServer服务先加载,直接ctx.get('webServer')会拿到undefined,一旦错过就再也不会重试,点击跳转和客户端轮询会一起失效。 - 通知与点击链路里的路由基名固定为
/dsh-win-notify/*;protocol配置只影响 Windows 协议名,不会让已打开的页面失联。
更新记录¶
- 1.0.1(2026-10-22):修复桌面端重启后「别的对话需要授权/选择却没有通知」以及点击跳转失效的问题。
- 原因一:发通知原先用
detached: true+stdio: 'ignore'的 powershell 子进程,桌面端重启后这类子进程会静默地不执行脚本 —— 日志里只有toast queued、没有shown,也没有任何报错可查。现改为非 detached 子进程,接住stderr并记录退出码。 - 原因二:插件可能比
webServer服务先加载,ctx.get('webServer')拿到undefined后就再也不会重试,客户端轮询与点击跳转一起失效。现改用ctx.inject(['webServer'], ...)在服务就绪时挂载路由。 - 另新增
selftest.flag自检通知(见「状态与日志」),用来单独验证「插件 → powershell → 通知栏」这条链路。
许可¶
MIT 许可证。
总结¶
dsh-win-notify 通过 Windows Toast 通知将 DSH 的关键交互点显式地推送到用户面前,解决了后台运行时容易错过确认/授权/登录提示的问题。插件以 DeepSeek Harness 应用身份发出通知,点击即可无缝跳回对应对话,适合需要频繁与用户交互的智能体开发场景。
插件目录页:https://www.skillhub.cn/plugins/Jxxxxx729/dsh-win-notify
GitHub:https://github.com/Jxxxxx729/dsh-win-notify