dsh-plugin-desktop-notify:为 DSH 桌面客户端补上上下文感知的系统通知

前言

用 DeepSeek Harness(DSH)跑长回合时,客户端一最小化,或被浏览器、ComfyUI 等窗口盖住,界面里的审批卡片和「回合已结束」往往看不见。官方桌面客户端在通知能力上并不完整,社区里也有若干只做「完成提醒」或「前台不打扰」的同类插件。下面介绍 LeeRolling 维护的 dsh-plugin-desktop-notify:在 desktop profile 下订阅客户端事件,在需要授权、需要回答或回合结束时弹出系统 Toast,正文带任务摘要;窗口在前台时一律不弹,避免重复打扰。

这是什么

dsh-plugin-desktop-notify 是 DSH 的桌面通知插件,仓库 LeeRolling/dsh-plugin-desktop-notify,许可证 MIT,当前 package 版本 0.1.0。它通过 dsh.bundle.patch 与 dsh.client(platform 为 web)注入宿主半与浏览器半,在 dsh-app://app/ 安全上下文中调用 new Notification(),在已验证环境 DSH Desktop 0.2.0-rc.2(Electron 44)、Windows 11、desktop profile 下,通知显示名为 DeepSeek Harness,使用 Windows 通知中心 Toast 与系统默认提示音。

插件以「一切皆插件」的方式扩展 DSH,与 SkillHub 插件目录 上的条目对应;该目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

会弹通知的情况

浏览器半监听三类客户端事件(只观察、不消费,原样 return next()):

事件 用途
approval/request 审批瀑布
user-questions/request 模型提问
api-session/status 会话 running 状态,检测 true → false 边沿表示回合结束

按场景分类后,通知标题与正文如下(资料中的表格):

情况 通知标题 正文
需要授权执行命令(pwsh / bash 等) 有任务需要授权 工具名 + 操作用途(审批理由;会剥掉 escalate sandbox to <mode>: 前缀)
需要授权改文件(write / edit 等) 有文件需要修改 工具名 + 操作用途
其它工具需要确认 有任务需要你确认 工具名 + 审批理由
模型提问等你回答 有问题需要你回答 问题原文
回合结束 任务已完成 会话名 + 提示回客户端看结果

什么时候不打扰

  • 客户端在前台(窗口有焦点、页面可见):不弹,只在 UI 里显示;
  • 子代理(subagent)会话回合结束:不弹,仅主会话完成才提醒;
  • 冷启动时本就 idle 的会话:不弹,只有观测到 running: true → false 才提醒;
  • 同一事件 1.5 秒内重复:去重,只弹一次。

用法上:先在客户端发消息,再立刻切走。回合从按下发送开始;若先切走再回来打字,窗口回到前台,按设计不会弹通知。

诊断与自检(长期保留)

浏览器侧行为外部不可见,插件提供常驻诊断通道,便于排查「装着但不响」:

端点 方向 作用
POST /api/desktop-notify/report 浏览器 → 宿主 上报决策:事件是否到达、被哪道闸拦下、new Notification() 是否异常、环境快照
GET /api/desktop-notify/selftest 浏览器 → 宿主 返回自检开关状态、trace 与开关路径

默认 trace 写在 <DSH_HOME|~/.dsh>/desktop-notify/trace.jsonl;环境变量 DSH_DESKTOP_NOTIFY_TRACE 可改路径,设为 off / 0 / false / none / no 则关闭写入(端点与自检仍可用)。trace 超过 512 KB 会按行边界轮转,保留最近约 256 KB。

在同目录放置 selftest.flag,下次页面加载约 2 秒后会无视前后台强制弹出标题「通知自检」的 Toast,用于区分「代码未跑」与「系统不显示」;自检后应删除该文件。

读 trace 摘要:

node tools/trace.mjs          # 统计 + 最近 15 条
node tools/trace.mjs --all    # 全量

安装与启用

在 desktop profile 下安装(命令来自仓库 README):

dsh plugin --profile desktop add link:<本目录>
# 或从仓库装:
dsh plugin --profile desktop add github:LeeRolling/dsh-plugin-desktop-notify

安装后重启 DSH 客户端生效。若用 link: 本地链入,改 lib/client.js 后重启即可,无需重装。

卸载:

dsh plugin --profile desktop remove dsh-plugin-desktop-notify

典型用法与验收思路

  1. 安装并重启客户端后,发一条会触发长回合的消息,立即切换到其他窗口。
  2. 等待需要授权、模型提问或回合结束,应在 Windows 通知中心看到对应标题与摘要。
  3. 若始终无通知:在 trace 目录放 selftest.flag 做强制弹窗;或运行 node tools/trace.mjs 查看 suppressed(如 window-in-front)、threw、apply-failed 等 kind。

仓库提供不依赖启动 DSH 的冒烟测试:

npm test

(假 DOM + 假 Notification,覆盖三事件、分类、前台抑制、去重、子代理静默、冷启动边沿等。)

适用场景与注意

适合谁:主要在 Windows 上使用 DSH Desktop、且经常把客户端最小化或盖在其它窗口后面的开发者;需要「授权 / 改文件 / 提问 / 完成」四类情境下带摘要的系统提醒,而不是只有单一「任务完成」铃。

权限与安全:插件随当前 DSH 桌面进程运行,安装前请阅读源码与 MIT 许可证,确认事件订阅与 HTTP 诊断端点符合你的环境策略。

已知限制(README 原文):

  • 点击通知切回客户端依赖 window.focus(),Electron 不保证窗口置顶;preload 未暴露 focus/flash,要完全保证需改主进程,易被客户端更新覆盖。
  • 客户端进程完全退出后无法收到通知。

同类思路在社区已有多个插件(如回合结束 + 前台抑制、审批 + 提问等);本插件侧重按情境分类摘要、常驻 trace/自检与可离线跑的浏览器半测试。文件类授权(write / edit)在 README 验收表中标记为待真实事件触发,逻辑与命令类共用同一段分类代码。

结尾

dsh-plugin-desktop-notify 为 DSH 官方桌面客户端补上上下文感知的系统通知:后台时才提醒,正文说明「要授权什么、要问什么、哪条会话跑完了」,并自带 trace 与自检便于排错。安装使用 desktop profile 与 README 中的 dsh plugin 命令即可。

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

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

Xiaoye