前言¶
用 DSH Web GUI 跑长任务时,人通常不会一直盯着页面:切去别的标签页写代码、看文档,让任务在后台推进。问题出在会话需要人介入的时刻——待审批、计划审批、模型提问到达时,页面本身是静默的,任务就停在原地,直到有人切回去才发现。
dsh-web-notify 解决的就是这个注意力断层。它是挂在 web profile 上的客户端插件:待处理交互到达时,通过提示音、标签页标题与 Favicon 徽标、OS 通知、PWA 任务栏徽标、通知中心 Dock 多通道提醒;会话完成、任务失败、掉线重连、模型/工具运行异常(429 配额等)也有对应提醒。DeepSeek Harness 的理念是「一切皆插件」,dsh-web-notify 就是这种形态下的一个典型实现。下面按功能、安装、配置、调试的顺序介绍。
这是什么¶
先交代基本信息。dsh-web-notify 由 renpengfei1027 维护,MIT 许可证,当前版本 0.1.5。纯插件形态:host 半(lib/index.js)+ client 半(lib/client.js,loader 格式),通过 profile patch 挂载进 dsh web。依赖方面,运行时依赖 @deepseek-ai/schemastery ^3.18.1,peer 依赖 @deepseek-ai/cordis、@deepseek-ai/dsh-api-remotes、@deepseek-ai/dsh-settings 与 react。
待审批 / 计划审批 / 提问到达¶
这是插件的主场景。任意会话出现 pendingInteraction 即触发,共六个通道:
1、提示音:WebAudio 合成的 E5-G5-B5 三连音;
2、标签页标题徽标:用 MutationObserver 对抗 shell 的标题写入,保证徽标不被冲掉;
3、标签页 Favicon:32×32 徽章;
4、OS 通知:按会话 tag 去重,点击跳转对应会话并聚焦窗口,approval 类型用 requireInteraction 持久显示;
5、PWA 任务栏徽标:通过 navigator.setAppBadge 在任务栏/应用图标上显示数字;
6、通知中心 Dock:右下角 FAB 实时计数,展开面板列出全部待处理项。
两个设计细节值得单独说明。
一是当前会话降级:页面可见且新审批属于当前打开的会话时,提示音与 OS 通知静默,只保留视觉通道——眼睛就在这个会话上,声音反而多余;其余情况全通道照常。
二是去重:同一 (会话, kind) 在冷却期内不重复报警,冷却时长由 cooldownMs 控制,默认 5s。
完成、失败与运行异常提醒¶
除审批外,插件还覆盖四类事件:
1、会话/子代理完成:完成 toast 卡片 + 轻单音 + 可选 OS 通知;页面隐藏时看不到 toast,改用标签页标题脉冲 + PWA 角标 + 提示音 + OS 通知。
2、任务失败:job 状态为 failed / killed,或 completed 但 detail 非空且非 exit code: 0 时,弹 error 变体 toast + 提示音 + 可选 OS 通知;按 job 注册号只报一次。
3、模型/工具运行异常:捕获 llm/retry(429 配额/限流)、turn/end 的 error / max-tokens / interrupted、tool/result 的 error / isError,弹 error 变体 toast(错误原文截 240 字符)+ 提示音 + 可选 OS 通知。
4、掉线/重连:断线持续超过 connectionAlertAfterMs(默认 10s)时报 warning toast + 提示音,恢复时报轻 toast + 完成单音;快速闪断不报。
子代理的覆盖与边界¶
检测管道覆盖全部会话行,含子代理。边界需要说清楚:按当前 DSH 的委派语义,被委派的子代理不会产生待审批/提问,因此不会有子代理的待处理条目出现;但子代理的完成、失败、异常提醒照常生效,不会漏。
安装与启用¶
前提条件¶
- Node.js >= 22;
- pnpm:
dsh plugin内部用 pnpm 装依赖,先执行npm install -g pnpm; - dsh CLI:未全局安装时,所有
dsh命令加前缀npx @deepseek-ai/dsh,例如npx @deepseek-ai/dsh plugin --profile web add dsh-web-notify。
两种安装方式¶
npm 一键挂载:
dsh plugin --profile web add dsh-web-notify
DeepSeek Harness 当前处于开发预览快速迭代期,README 推荐以 link: 开发调试模式挂载本地仓库:
git clone https://github.com/renpengfei1027/dsh-web-notify.git
cd dsh-web-notify
npm install
npm run build
dsh plugin --profile web add link:$(pwd)
# Windows PowerShell: dsh plugin --profile web add link:$PWD.Path
安装完成后重启 dsh web,设置页「插件配置」下会出现「通知」卡片。
放行设置命名空间¶
DSH 官方把 settings 白名单(WEB_SETTINGS_NAMESPACES)硬编码在包里,暂不开放插件注入,所以需要运行仓库自带的 patch 脚本,把 notifications 注入白名单:
node scripts/patch-apiproxy.mjs
脚本幂等,重跑安全;dsh 升级后需重跑一次。
沙箱环境注意事项¶
1、TRAE、Cursor 等 AI 编码工具的沙箱通常阻止写入 ~/.dsh/,而 dsh plugin 和 dsh web 都要写 profile 文件,这两类命令必须在 AI 工具外部的普通终端执行;
2、切勿手动 npm install 到 ~/.dsh/profiles/web/node_modules/:这会绕过 dsh plugin 的依赖链接逻辑,导致 settings 服务不可达、命名空间注册静默失败。安装一律走 dsh plugin --profile web add。
配置与常用调法¶
经过上面的步骤,插件已经挂进 web profile 并随 dsh web 重启生效。设置卡片位于 DSH Web 设置页「插件配置」→「通知」,120ms debounce 热重配,改完即生效,不需要重启。OS 通知权限在首次触发后的下一个用户手势时请求 Notification 权限。
几个常用的调法:
- 只要审批提醒,其余关掉:
completion=false、connection=false、jobFailure=false、agentError=false; - 夜间免打扰:
quiet.enabled=true、quiet.start=22:00、quiet.end=09:00,免打扰只静音,视觉通道照常; - 嫌系统通知弹窗吵:
notify=false,保留badge=true、dock=true。
调试与诊断¶
插件提供 on-device diagnostics。在 DSH Web 页面打开 DevTools 控制台,观察 window.__NOTIFICATIONS__:
__NOTIFICATIONS__.applied
__NOTIFICATIONS__.cardRegistered
__NOTIFICATIONS__.feedCounters
__NOTIFICATIONS__.hostStatuses
__NOTIFICATIONS__.jobSamples
其中 applied、cardRegistered 反映插件与设置卡片的挂载状态,feedCounters 是各类事件的计数。不想真等一次审批来验证效果,可以调 demo() / demoSound() 一键测试 UI 与音频。
适用场景与注意事项¶
适合的人:把 DSH 会话挂后台跑、需要及时响应审批与提问的人;多会话并行、希望在一个面板里统一看待办的人;装了 PWA、想在任务栏直接看到待办数的人。
注意事项:
1、插件以当前 dsh 进程的权限运行,安装前建议先读一遍源码与许可证(MIT)再决定;
2、DSH 处于开发预览快速迭代期,dsh 升级后记得重跑 node scripts/patch-apiproxy.mjs;
3、安装与重启命令在普通终端执行,不要在 AI 工具沙箱里跑。
结尾¶
回顾一下:dsh-web-notify 把 DSH Web GUI 的「等人回来看」变成「主动来叫人」——审批、提问、完成、失败、掉线、429 都在该出现的位置提醒,通道、音量、免打扰都能按需开关,配置热重配、诊断内置,装起来成本不高。
- 社区插件目录页:https://www.skillhub.cn/plugins/renpengfei1027/dsh-web-notify
- GitHub 仓库:https://github.com/renpengfei1027/dsh-web-notify