dsh-notification-desktop:DSH 0.2.x 一轮跑完的系统通知

前言

在 DeepSeek Harness(DSH)里跑 agent,一轮对话结束往往发生在后台:你切到别的窗口写代码,或让任务在侧栏里自己跑完。没有提醒时,只能反复点回会话看状态。浏览器环境可以用 Web Notification API,但 DSH 0.2.x 的会话模型、客户端依赖链与 0.1.x 不同,上游面向 0.1.1 / 0.1.2 的 omdsh-dev/dsh-notification 不能直接用在 0.2.x 上。下面介绍维护者 Adingo001 发布的客户端插件 dsh-notification-desktop:在 0.2.x 上实现「一轮跑完就弹系统通知」,桌面端通过宿主 WinRT 发 toast,并带可配置的完成提醒设置页。

这是什么

dsh-notification-desktop 是给 DeepSeek Harness 0.2.x 用的完成提醒插件。分类为客户端;仓库地址为 https://github.com/Adingo001/dsh-notification-desktop,当前 package.json 版本为 0.2.0,许可证 MIT。它是上游 dsh-notification 0.1.4 逻辑的 0.2.x 移植版,针对 0.2.x 的会话快照、retention 与 inject 约定做了适配。

它做什么

插件分 Host 与 Client 两半,职责在 README 里写得很清楚。

Host 半边注册名为 notification 的会话投影:对每个会话折叠最后一次 turn/end,得到 { turn, reason, body, tools };并提供 POST /dsh-notification-desktop/notify,在 Windows 上通过 WinRT 真正弹出 toast。

Client 半边订阅 ctx.sessions.list 里该投影的 turn 单调上升,按总开关、结束原因过滤、是否仅后台提醒等条件决定是否提醒。桌面壳里把内容 POST 给宿主去弹;浏览器里则用页面自己的 Notification。正文取该轮最后一段助手回复(Host 侧截到 400 字符,Client 侧再按设置截一次)。

设置入口在 设置 → 完成提醒:总开关、按结束原因过滤、仅后台提醒、通知常驻、正文长度、权限状态、发测试通知。投影是纯函数,Host 只注册投影、不碰会话日志以外的数据;Client 只用公开的 sessions.list 快照和 settings.section 槽位。

相对上游,0.2.x 下不再移植「等你审批 / 等你回答」类挂起交互提醒(pendingInteraction 在 0.2.x 不可像 0.1 那样从根服务订阅);设置存储改为 localStorage + 自带 observable,设置页只用 React 与宿主主题 CSS 变量(--dsw-alias-*)。

安装与启用

安装方式因 profile 不同而不同,须按官方 README 操作,不要自行拼接 dsh plugin add github:owner/repo。

桌面端(DSH Desktop)

desktop profile 由 Electron 应用独占,CLI 会拒绝写入。应使用应用内入口:

  1. 侧栏 插件 → 添加插件,粘贴 https://github.com/Adingo001/dsh-notification-desktop;
  2. 或由 agent 通过宿主内置 plugin manager 的 install_bundle 安装同一地址(link: 本地目录亦可)。

Web / CLI profile(dsh web、headless 等):

dsh plugin --profile web add https://github.com/Adingo001/dsh-notification-desktop/archive/refs/heads/main.tar.gz

装完后刷新页面(桌面端需重启应用),设置里应出现 完成提醒 一页。

插件市场(Discover)

仓库提供 format 1 的 market/index.json,可在 插件 → Discover → 添加索引源 中加入:

https://raw.githubusercontent.com/Adingo001/dsh-notification-desktop/main/market/index.json

条目为 commit 固定的 git 源,版本与 commit 一一对应;engines.dsh 为 >=0.2.0 <0.3.0。

典型用法与 Windows 注意

日常使用:安装并打开 完成提醒,按需打开总开关、选择要提醒的结束原因(默认主要在 completed / error 上弹;forked / interrupted 会推进投影 turn 以免去重漏轮,但默认不弹)、设置是否仅后台提醒与正文长度。需要确认链路时,在设置页发测试通知。

Windows 桌面端除权限外,还须处理 toast 呈现问题。README 说明:主窗口里 Notification.permission 在桌面壳下通常为 granted,但 Electron 未正确注册 AUMID 时,系统可能静默丢弃 toast;且同一环境下页面 new Notification() 仍可能不显示,因此桌面端由页面 POST 宿主、宿主 WinRT 发送。两步都做完才算通,需执行:

powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\fix-toast-aumid.ps1

撤销时加 -Remove。脚本只写注册表中的 AppUserModelId 项,不修改壳或 asar。

排查「为什么不弹」时,Host 注册了 GET/POST/DELETE /dsh-notification-desktop/trace,客户端会把闸门判断 POST 进去,例如:

Invoke-WebRequest http://127.0.0.1:<port>/dsh-notification-desktop/trace

可看到 apply / seed / tick / skip / fire / deliver / host-notify 等记录。

适用场景与边界

适合谁:已在 DSH 0.2.x(含 Desktop)上跑 agent,希望一轮结束时有系统级提醒、且需要按结束原因和前台/后台区分的用户。同分类里另有 ztl0001/dsh-notify;本插件在资料中的差异化是实现事实:0.2.x 宿主投影、桌面端走宿主 WinRT(避免壳上页面 Notification 被静默丢弃)、带按结束原因过滤的设置页。

已知边界(来自 README):

  • 不提醒挂起交互(审批/回答)。
  • 判定在页面侧进行,页面未运行则不会提醒;桌面端只是把「弹」交给宿主。
  • 插件随当前 DSH 进程加载运行,安装前请自行查看仓库源码与 MIT 许可证,确认符合你的环境与安全要求。

社区目录页(与 DeepSeek / 幻方无官方从属):https://www.skillhub.cn/plugins/Adingo001/dsh-notification-desktop。代码与详细说明见 GitHub 仓库。

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

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

Xiaoye