dsh-desktop-notify:DSH 全端失焦时的 Windows 桌面通知

前言

用 DSH 跑长任务时,浏览器往往不在前台:切到别的标签、最小化窗口,或同时开着多个 DSH 页面。这时模型停下来等你选方案、批工具授权,或者一轮意外中断、正常跑完,前端没有焦点,很容易错过。

常见做法是盯着页面或依赖浏览器自己的通知,但 DSH 的决策、授权和轮次结束是协议事件,不一定和「某个标签页是否可见」一一对应。下面介绍社区插件 dsh-desktop-notify(维护者 CarbonZhao-02692):在所有已打开的 DSH 前端都失焦时,把需要决策、需要授权、意外中断和任务完成推到 Windows 通知中心(或可选的自绘卡片);通知标题用会话标题,点击后尽量复用已有页面切回对应对话。

这是什么

  • 名称:@carbonzhao/dsh-desktop-notify(仓库 CarbonZhao-02692/dsh-desktop-notify)
  • 分类:客户端(SkillHub 目录归类为「客户端」)
  • 平台:仅 Windows 10 / 11;其他系统只写日志、不发通知
  • 定位:DSH web profile 插件,监听会话事件,经本机 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 规则很简单:

  1. 任意一个页面 focused=true → 视为仍有前端聚焦,静默不发(除非测试接口强制发送)。
  2. 所有已上报页面 focused=false → 满足门控,可以发通知。
  3. 页面关闭时用 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 / 幻方无官方从属关系。

链接

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

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

小夜