前言¶
用 DSH 跑长任务时,浏览器往往不在前台:切到别的标签、最小化窗口,或同时开着多个 DSH 页面。这时模型停下来等你选方案、批工具授权,或者一轮意外中断、正常跑完,前端没有焦点,很容易错过。
常见做法是盯着页面或依赖浏览器自己的通知,但 DSH 的决策、授权和轮次结束是协议事件,不一定和「某个标签页是否可见」一一对应。下面介绍社区插件 dsh-desktop-notify(维护者 CarbonZhao-02692):在所有已打开的 DSH 前端都失焦时,把需要决策、需要授权、意外中断和任务完成推到 Windows 通知中心(或可选的自绘卡片);通知标题用会话标题,点击后尽量复用已有页面切回对应对话。
这是什么¶
- 名称:
@carbonzhao/dsh-desktop-notify(仓库 CarbonZhao-02692/dsh-desktop-notify) - 分类:客户端(SkillHub 目录归类为「客户端」)
- 平台:仅 Windows 10 / 11;其他系统只写日志、不发通知
- 定位:DSH
webprofile 插件,监听会话事件,经本机 host 与 PowerShell helper 发 Windows toast 或右下角 WPF 卡片
插件以当前 DSH 进程权限运行,会写注册表项、起本机 HTTP 路由和临时 PowerShell 脚本。安装前建议在 GitHub 查看源码与 MIT 许可证。
会通知哪些事件¶
README 中的事件与触发点如下(正文为通知内容模板):
| 事件 | 触发点 | 通知内容 |
|---|---|---|
| 需要你选择决策 | user-questions/request(含方案确认 plan-review) |
需要你选择决策:<问题> |
| 需要你授权 | approval/request |
需要你授权:<工具名> — <原因> |
| 意外中断,请重试 | turn/end reason=error / interrupted / max-tokens,以及 api-session/error |
任务意外中断:<错误>,请重试 |
| 任务已完成 | turn/end reason=completed |
任务已完成(用时 X) |
通知标题来自对应会话的标题(sessionTitle 服务折叠出的标题);标题尚未生成时,回退到该会话第一条用户消息。
可通过 loader 配置逐项开关(如 notifyOnDecision、notifyOnApproval 等),并设置 minTurnDurationMs 过滤过短的完成提醒。默认 ignoreSubagent: true,后台子代理会话不单独提醒。
焦点门控:「所有前端都失焦」才发¶
每个 DSH 页面约每 3 秒向 /dsh-desktop-notify/focus 上报状态,例如:
{ "id": "页面 id", "focused": true, "visible": true }
focused 定义为 document.visibilityState === 'visible' && document.hasFocus()。窗口失焦、切到其他标签、焦点在地址栏时,focused 为 false。
host 规则很简单:
- 任意一个页面
focused=true→ 视为仍有前端聚焦,静默不发(除非测试接口强制发送)。 - 所有已上报页面
focused=false→ 满足门控,可以发通知。 - 页面关闭时用
sendBeacon上报closed: true,立即从汇总移除;后台标签定时器可能被节流,3 分钟无心跳按已关闭处理;所有页面都关闭时视为全部失焦。
visible 仅用于状态展示,不参与是否发送。配置项 onlyWhenUnfocused: false 时,即使页面聚焦也会发通知。
通知形态与点击回到对话¶
enableCard 决定两种互斥模式(默认 false)。
Windows toast(enableCard: false)¶
走 WinRT toast,带自定义协议 dsh-desktop-notify://open?session=<id>&origin=<origin>。helper assets/open.ps1 把会话 id POST 到 host 的 /dsh-desktop-notify/activate,恢复 Edge/Chrome 窗口(最小化才 SW_RESTORE),并用 UI Automation 按标题匹配 DSH 标签页;已打开页面轮询 /dsh-desktop-notify/activation 后调用 uiWorkspace.openSession(sessionId)。host 只把激活投递给用户最后使用的那个页面。
自绘卡片(enableCard: true)¶
只显示右下角原生 WPF 卡片(约 20 秒自动关闭),不发 Windows toast,通知中心不留记录。点击卡片后激活流程与 toast 模式相同。
若当时没有任何已连接的 DSH 页面,helper 会在默认浏览器打开引导页,把会话 id 写入 localStorage 并跳回 DSH,新页面加载后自动打开对应对话。
clickToOpen: false 时通知不可点击回会话。
安装与启用¶
在 PowerShell 中执行官方安装命令:
dsh plugin --profile web add @carbonzhao/dsh-desktop-notify
安装后重启 dsh web,并在浏览器中硬刷新(Ctrl+Shift+R)。也可从源码安装:
dsh plugin --profile web add github:CarbonZhao-02692/dsh-desktop-notify
运行要求(见 README):DSH web profile,文档实测版本 0.2.1-rc.2;Windows PowerShell 5.1;Node.js >= 20。页面需保持打开才能上报焦点;系统需允许 Windows 通知,「专注助手」可能拦截。
设置页与测试¶
路径:DSH 设置 → 通用 → 桌面通知。
- 显示当前上报页面数与焦点汇总(有前端聚焦 = 静默中 / 全部失焦 = 会通知)。
- 「自绘卡片」开关对应
enableCard,立即生效并写入%DSH_HOME%\super-injector\dsh-desktop-notify-config.json。 - 「发送测试通知」忽略焦点门控,用于验证模式、应用名、图标与点击行为。
也可用本机 HTTP 接口调试:
# 查看焦点状态与最近通知
Invoke-WebRequest -UseBasicParsing http://127.0.0.1:3080/dsh-desktop-notify/status
# 强制发一条测试通知(force 忽略焦点门控;带 sessionId 时点击会回到该对话)
$body = @{ kind='complete'; force=$true; sessionId='session-...'; body='测试通知' } | ConvertTo-Json -Compress
Invoke-WebRequest -UseBasicParsing -Method POST -ContentType 'application/json' `
-Body ([Text.Encoding]::UTF8.GetBytes($body)) `
http://127.0.0.1:3080/dsh-desktop-notify/test
配置示例¶
默认值在 lib/index.js 的 DEFAULTS;可在插件 loader 的 config 中覆盖,例如:
- id: dsh-desktop-notify
name: '@carbonzhao/dsh-desktop-notify'
config:
onlyWhenUnfocused: true # false = 页面聚焦时也发
clickToOpen: true # false = 通知不可点击回会话
enableCard: false # true = 仅自绘卡片;false = 仅普通 Windows toast
ignoreSubagent: true # 后台子代理会话不提醒
notifyOnDecision: true
notifyOnApproval: true
notifyOnInterruption: true
notifyOnComplete: true
minTurnDurationMs: 0 # 完成提醒的最短轮次时长(毫秒)
toastAppId: 'DeepSeek.DSH.Notify'
toastAppName: 'Deepseek Harness Notification'
toastIconPath: '' # 默认 assets/deepseek-harness.png
toastAppIconPath: '' # 默认 assets/deepseek-harness.ico
适用场景与注意¶
适合:在 Windows 上长期用 DSH web,经常多标签或切走窗口,又需要在外部收到「要拍板、要授权、跑完了或断了」的提醒,并一键回到对应对话。
权限与本机行为(README「权限与外部服务」):写入 HKCU 下自定义协议与 AppUserModelId;toast 模式注册 dsh-desktop-notify 协议;通过 powershell.exe 显示通知;本机路由含 /focus、/status、/test、/activate、/activation、/open 等,无外部上传。插件非 DSH 官方出品。
已知限制(节选):标签页自动切换针对 Edge / Chrome,Firefox 中不会自动切回;多标签标题相同可能匹配到另一个同标题页;部分 Windows 10 环境 toast 点击未必触发协议;卡片模式 20 秒后自动关闭。helper 日志位于 %TEMP%\dsh-desktop-notify-helper.log 等路径。
DSH 生态强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。