前言¶
在使用 DeepSeek Harness (DSH) 处理任务时,任务可能会进入“需要批准”、“需要回答”或“出错”的状态。如果这些状态变化没有被及时捕捉,可能导致任务卡住或被忽略。dsh-task-notifier 插件通过应用内横幅、合成提示音与系统通知,确保你能实时感知这些状态变更。
该插件由 xubin0628 维护,采用 MIT 许可证,主要解决“状态变更漏看”的问题。
核心功能¶
插件订阅 DSH 的四个核心事件,并分发三种通知形式:
-
事件覆盖:
agent/status:任务完成(非等待用户输入状态)。approval/request:需要批准(如沙箱/权限调用)。user-questions/request:需要回答问题。agent/error:执行出错。- 注:等待批准/回答期间的状态变化不会再次触发“任务完成”通知,避免重复提示。
-
通知形式:
- 应用内横幅:使用 Shadow DOM 实现,样式隔离,可配置停留时长。
- 提示音:使用 WebAudio 合成,无需加载外部音频文件,支持清脆/铃铛/水滴等音色与音量调节。
- 系统通知:调用页面侧的 Notification API。
-
配置灵活性:
- 在设置页提供「通知」页面,可独立开关四种事件、是否包含子代理、横幅显示时长。
- 提供试听功能,实时生效。
安装与启用¶
插件以 Bundle 形式安装。由于官方桌面端使用独占的 desktop profile,无法直接通过 CLI 插件管理,需在 DSH 会话内部调用内置 plugin_manager。
# 软链安装(推荐开发期使用,修改源码即时生效)
install_bundle target = link:<插件目录绝对路径>
# 拷贝安装(推荐生产环境,源码丢失不影响运行)
install_bundle target = file:<插件目录绝对路径>
安装后,新版本通常热生效。若涉及 package.json 修改或宿主进程模块变更,需重启客户端。
配置与设置¶
插件的配置分为两处:
-
宿主侧默认值 (
cordis.patch.yml的config段):- 控制通知开关(完成、批准、回答、错误)、是否包含子代理、防抖时间、音量等。
- 此处修改需重启客户端生效。
-
用户侧偏好(设置页「通知」):
- 存储在浏览器的
localStorage中(键为dsh-task-notifier:settings:v1)。 - 一旦用户在设置页修改过任何项,后续以用户侧设置为准,不再回退到默认值。
- 存储在浏览器的
自检与排查¶
插件提供 RESTful 接口用于检查状态和测试链路。
检查插件状态与等待中的会话:
Invoke-RestMethod http://127.0.0.1:19387/dsh-notifier/status
查看最近的通知记录:
Invoke-RestMethod 'http://127.0.0.1:19387/dsh-notifier/recent?limit=20'
测试通知链路:
Invoke-RestMethod 'http://127.0.0.1:19387/dsh-notifier/test?kind=approval'
# kind 可取: done | approval | question | error
开发与已知限制¶
在修改代码后,生效逻辑取决于文件类型:
| 修改文件 | 生效方式 | 原因 |
|---|---|---|
assets/notifier-client.js |
刷新页面 | 宿主按 mtime 重新读取 |
lib/client.js |
刷新页面 | 页面重载即更新 |
lib/index.js |
重启客户端 | Node ESM 模块缓存 |
package.json / cordis.patch.yml |
重启客户端 | 需要重新 apply patch |
桌面端已知限制:
* 通知限制:桌面端运行在独立子进程,无法直接访问 Electron 的 Notification API(会导致 WinRT 错误 0x80073D54),必须依赖页面侧的 Notification API。
* 注入限制:桌面端的 index 注入表在宿主启动时收集一次,修改注入逻辑后必须重启客户端。
* 设置隔离:设置存储在 localStorage,不写入 profile 配置,换浏览器或清缓存会重置为默认值。
结尾¶
dsh-task-notifier 是一个轻量级的通知增强工具,通过 SSE 事件流与 WebAudio 合成技术,为 DSH 提供了可视与听觉的双重反馈。对于需要长时间运行代理或频繁进行人机交互的场景,它能有效降低状态遗漏的风险。
更多细节与源码,请访问 SkillHub 目录 或 GitHub 仓库。