dsh-plugin-notify:DSH 会话状态变更时的 WxPusher 与浏览器通知

前言

在 DeepSeek Harness(DSH)里跑长任务或并行多个 session 时,开发者往往不能一直盯着 Web 界面。会话何时停跑、是否报错、Agent 是否在等你回答或审批工具调用,这些信息如果只能靠手动刷新页面才能看到,很容易错过时机。

常见做法是另写脚本轮询状态,或依赖外部监控;它们要么和 DSH 的事件模型脱节,要么无法同时推到手机和当前打开的浏览器标签页。dsh-plugin-notify 由社区维护者 This-is-XiaoDeng 提供,在 Host 侧监听会话状态转换,用同一套 payload 分别走 WxPusher 与浏览器原生通知(含可选提示音与 requireInteraction),并通过 DSH 自带的设置页完成配置,无需改 profile 里的 YAML 才能日常调参。

这是什么

dsh-plugin-notify 是 DSH 生态中的一款「联网工具」类插件(当前 package 版本 0.1.0,MIT 许可证)。它面向已启用 Web 面的 DSH profile(例如 dsh web),在 session 停止、异常退出、Agent 提问或(可选)待审批工具调用等场景下发出通知。

维护者与源码仓库:This-is-XiaoDeng / GitHub: This-is-XiaoDeng/dsh-plugin-notify。插件目录页见 SkillHub 插件页(社区目录站点,与 DeepSeek / 幻方无官方从属关系)。

核心功能

双通道、一次检测

Host 在状态转换时只检测一次,将相同内容投递到 WxPusher,以及所有已连接浏览器页面。没有 Web 面时(缺少 ctx.webServer),插件仍可推 WxPusher,但不会向浏览器下发通知流。

会触发通知的事件

事件 来源 展示内容
Session 停止 api-session/status → running: false 折叠后的 session 标题
异常退出 api-session/error、agent/error 错误信息
Agent 提问 user-questions/request(observe 后 delegate) 第一个问题
待审批 approval/request(observe 后 delegate) 工具名

user-questions/request 与 approval/request 属于 Cordis waterfall:插件只 observe 并始终 next() 委托,不会拦截其他 answerer 的请求。

降噪与过滤

  • minRunMs:运行时长低于该阈值的 stop 不通知。
  • stopDebounceMs:Agent 空闲后 Host 等待该时长再上报 stop;若 session 再次运行则丢弃。同一 session 刚发过 error 通知时也会抑制 stop,避免重复且更不精确的信息。

浏览器侧行为

Client 通过 SSE 订阅事件,使用 new Notification(...)(PNG 图标),可选 WebAudio 双音提示,以及 requireInteraction 使横幅保持到用户关闭。配置项 browser.onlyWhenHidden 默认为 true,标签页可见时可保持静默。

设置页与密钥

在 设置 → 通知(Settings → Notifications)中编辑插件 Config schema 定义的字段;字段均为 volatile,修改即时生效,无需重启或 remount 插件。WxPusher 的 appToken 声明为 role('secret'):写入 profile,不在 API 中回传,界面加载时输入框始终为空,仅显示是否已设置 token。

实现上 Host 注册 /dsh-plugin-notify/events(SSE)与 /dsh-plugin-notify/test;除 @deepseek-ai/schemastery 外无额外运行时依赖,单 Host 文件、单 Client 文件,无构建步骤。

环境与要求

  • 带 Web 面的 DSH Host(@deepseek-ai/dsh-web-app),即常规 dsh web profile。
  • Node.js ≥ 20。
  • 支持 Notification API 的浏览器(Chrome、Edge、Firefox、Safari 16+)。
  • 若需要手机推送,需 WxPusher 账号。

安装与启用

通过插件管理器(推荐)

在 DSH 的 Plugins 页面添加包 spec(registry 名、git URL 或本地 checkout 绝对路径),并启用对应 bundle:

dsh-plugin-notify

或指向本地目录:

/path/to/dsh-plugin-notify

bundle 由插件自带的 cordis.patch.yml 声明,无需再改其他清单。若 profile 已在运行,需 reload 或重启以使新包进入模块解析表。

在 profile 中手动安装

在 profile 目录(例如 ~/.dsh/profiles/web)执行:

pnpm add dsh-plugin-notify

在该 profile 的 package.json 里把 bundle 加入 dsh.profile.bundles:

{
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-plugin-notify"]
    }
  }
}

配置与典型用法

打开 设置 → 通知,字段会直接写入 profile 中的插件条目。常用项如下(完整列表见 README):

字段 默认值 含义
enabled true 总开关(两通道)
events.stopped / error / question true 对应事件是否通知
events.approval false 待审批是否通知
browser.enabled / sound / requireInteraction / onlyWhenHidden 见 README 浏览器通道行为
wxpusher.enabled false 是否启用 WxPusher
wxpusher.appToken '' 仅写 secret
wxpusher.uids / topicIds [] 接收方 UID 或 topic
advanced.stopDebounceMs 1200 stop 上报前的空闲等待
advanced.minRunMs 2000 短于该时长的 run 不报 stop
advanced.rootSessionsOnly true 跳过 subagent session

需要持久化到 profile patch 时,可在 YAML 中写入同级结构,例如:

- id: dsh-plugin-notify
  config:
    events:
      approval: true
    wxpusher:
      enabled: true
      uids:
        - UID_xxxxxxxx

WxPusher

  1. 在 https://wxpusher.zjiecode.com 登录,创建应用并复制 appToken。
  2. 用微信扫应用二维码订阅,从用户列表复制 UID(或使用 topic id 群发)。
  3. 在设置页填入 appToken 与 UID,保存。

浏览器权限与声音

页面展示当前 Notification.permission:default 时点 Request permission;denied 时需在浏览器站点设置中重新允许。提示音依赖 WebAudio,需用户在页面上有一次点击或按键后浏览器才允许 AudioContext 启动,插件会在首次交互时解锁。

测试

各通道卡片自带测试按钮:

  • Browser notifications → Send a test notification:向所有连接页广播一帧,并发送一条 WxPusher(全链路探测)。
  • WxPusher push → Send a test push:仅 WxPusher;不弹出系统通知,且在 wxpusher.enabled 仍为 false 时也可验证凭据。

按钮下方会显示结果,例如 Browser: delivered to 1 page(s) · WxPusher: sent 或 WxPusher: no appToken 等。

适用场景与注意

适合需要在 DSH Web 会话跑在后台或另一台机器上时,仍能在手机和浏览器上收到「停跑、报错、提问、审批」提醒的开发者。若只开浏览器通知、不用 WxPusher,可不配置 WxPusher 账号。

安装前请自行审阅 仓库源码 与 MIT 许可证。插件在当前 DSH 进程权限下运行,WxPusher 推送会携带你配置的 token 与消息内容;appToken 虽为 write-only secret,仍应妥善保管,勿将含 secret 的 profile 提交到公开仓库。

DSH 生态遵循「一切皆插件」;本插件通过社区目录与 npm 包名 dsh-plugin-notify 分发,与官方 Harness 仓库并列存在,按需选用即可。

结尾

dsh-plugin-notify 将会话状态变更收敛为 Host 侧一次检测,再同步到 WxPusher 与浏览器 SSE 通知,并用原生设置页管理事件开关、降噪参数与密钥。若你已在用 DSH Web profile,可从插件管理器添加 dsh-plugin-notify,在 设置 → 通知 中完成权限与(可选)WxPusher 配置后,用各卡片自带的测试按钮验证通道。

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

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

Xiaoye