dsh-approval-alert
Verifieddsh-approval-alert · v0.3.0 · MIT · Web UI
DeepSeek Harness approval & completion alert — desktop notification + sound + tab-title flash when a session waits for an approval or a user question, and a completion alert when a task finishes, so you never leave dsh waiting while you are away. v2 adds
Install
dsh plugin add dsh-approval-alert Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-approval-alert
DeepSeek Harness(dsh)提醒插件:当会话等待审批、等待你回答提问,或者任务完成时,即使你在浏览器的其他标签页刷视频、或者在使用其他软件,也会弹系统通知、响提示音、标签页标题闪烁提醒你回 dsh 处理,避免会话一直干等、避免任务完成半天了你还不知道。
特性
- ✅ 同时覆盖两种"卡住等你"的场景:审批(approval)与用户提问(question)
- ✅ 任务完成提醒(v3):任务跑完(含出错、受阻、达到上限)时弹一条完成通知,不用隔一会儿回来看一次
- ✅ 三种提醒手段:桌面通知(Web Notification)+ 提示音(WebAudio)+ 标签页标题
[审批]/[提问]/[完成]前缀 - ✅ 重复提醒:未处理期间按设定间隔(默认 30s)重复提醒,直到你处理或切回页面
- ✅ 设置页开关:总开关 / 提示音 / 任务完成提醒 / 重复间隔 / "开启通知并测试"按钮
- ✅ 通知内容自动带上审批工具名、原因或提问内容
- ✅ v2 主机端通知:由 dsh 进程直接弹系统通知(node-notifier),浏览器标签页关闭、没有 GUI 连接也能提醒
- ✅ v3 主机端完成通知:顶层会话
turn/end时立即弹系统通知,子代理会话的普通轮次不打扰 - ✅ 偏好存 localStorage,无服务器依赖
安装
从 npm 安装(发布后)
dsh plugin --profile web add dsh-approval-alert
# 或
npm i -g dsh-approval-alert # 若作为全局插件分发
本地/开发安装
# 1. 把本包复制到 profile 的 plugins 目录(保持可随 dsh-sync 同步)
$dst = "$env:USERPROFILE\.dsh\profiles\web\plugins\dsh-approval-alert"
New-Item -ItemType Directory -Force -Path $dst | Out-Null
Copy-Item .\* $dst -Recurse -Force
# 2. 在 ~/.dsh/profiles/web/package.json 中:
# dependencies 加: "dsh-approval-alert": "file:./plugins/dsh-approval-alert"
# dsh.profile.bundles 加: "dsh-approval-alert"
# 3. 安装并重启
dsh plugin --profile web install
# 重启 dsh web
用
file:./plugins/...本地依赖时,插件源码在 profile 内,会随 dsh-sync 的同步包一起分发到其他机器。
使用
- 打开 dsh web → 设置 → 审批提醒
- 点击 「开启通知并测试」 授权浏览器通知权限(浏览器要求权限必须来自点击手势)
- 按需调整:提示音、任务完成提醒、重复提醒间隔(0 = 不重复)
- 之后当会话需要审批/提问、或任务完成而你不在页面上时,就会收到提醒;点击通知可切回 dsh 窗口
工作原理
浏览器端(v1)
- 插件注册到客户端
conversation.input.dock插槽(与官方 todo / 队列面板同插槽,多渲染、互不冲突),用套件提供的useSession钩子订阅当前会话快照的pending列表 - 过滤出
approval/question两种 pending(与 dsh 自带审批弹窗、提问面板同源数据) - 挂载期间若页面隐藏或失焦:立即提醒一次,并按设定间隔重复
- 处理完成(pending 消失)或你切回页面(
visibilitychange/focus)→ 停止提醒、恢复标题 - 通知
tag按审批/提问 id 区分:同一 pending 的重复提醒合并不堆叠,不同 pending 各弹各的
浏览器端(v3 完成提醒)
- 订阅快照
running:true → false 的边沿即"任务跑完";挂载时已是 false 不误报 - 触发后延迟 800ms 结算(期间读最新的 running 与
goal投影):- 下一轮已经开始 → 不提醒(目标多轮连续跑时只在最后一轮完成提醒)
- 目标投影
phase === "complete"→ 「目标已完成」(带上目标内容);phase === "blocked"→ 「目标受阻」 - 无目标 / 目标暂停 → 普通「任务已完成」;快照带
lastAgentError时提示「任务已结束(出错)」
- 只在你不在页面(页面隐藏或失焦)时弹,一次性,不重复;设置页的「任务完成提醒」开关可单独关闭
主机端(v2)
- 主机半(
lib/index.js)仅监听approval/asked/approval/decided/turn/end会话事件(纯观察者,不触碰approval/requestwaterfall,避免干扰 GUI 审批通道) - 每次
approval/asked后延迟delayMs(默认 5s)检查:若该审批仍未被应答(你没答)→ 弹系统通知;若approval/decided以unavailable结束(无 GUI 连接、无人应答)→ 立即通知 - v3 完成提醒:顶层会话
turn/end时立即弹系统通知;文案按结束原因区分——completed(任务完成)/error(出错)/blocked(受阻)/max-tokens(达上限);你主动停止(aborted)与崩溃孤儿标记(interrupted)不提醒;子代理会话(header.parentSession存在)不提醒,避免普通委派轮次刷屏 - 通知用 node-notifier(Windows snoretoast / macOS terminal-notifier / Linux notify-send),由 dsh 进程直接发送,与 UI 形态无关
- 配置
host-config.json(插件目录内):{ "enabled": true, "delayMs": 5000, "completion": true },改完即生效,无需重启 - 说明:浏览器开着时,v2 的延迟通知相当于一条"跟进提醒";只想用浏览器端提醒可把
enabled设为false;只想关掉完成提醒可把completion设为false
环境兼容性(FAQ)
| 使用环境 | v1 浏览器通知 | 声音/标题 | v2 主机端通知 | v3 完成提醒 |
|---|---|---|---|---|
| Chrome / Edge(普通标签页) | ✅ | ✅ | ✅ | ✅ 浏览器端 + 主机端 |
| Chrome / Edge「安装为应用」独立窗口 | ✅ | ✅ | ✅ | ✅ 浏览器端 + 主机端 |
| 桌面端(Electron 内核) | ✅(Chromium 支持 Notification) | ✅ | ✅ | ✅ 浏览器端 + 主机端 |
| 桌面端(系统 WebView,如 Tauri / WebView2) | ⚠️ 可能不支持(无 Notification API 与权限 UI) | ✅ | ✅ | ✅ 主机端(浏览器端静默失效) |
| 无 GUI / 浏览器关闭 | ❌ | ❌ | ✅ | ✅ 主机端 |
- v2/v3 主机端与 UI 形态无关:由 dsh 进程(node 侧)经 node-notifier 发送,浏览器、桌面端、CLI 都适用
- v1/v3 浏览器端依赖渲染环境:Chrome/Edge(含安装为应用)与 Electron 支持 Web Notification;系统 WebView(WebView2 / WKWebView)通常不支持 → v1 通知静默失效,但声音、标题闪烁不受影响,v2 兜底
- 浏览器开着且你不在页面上时,v3 可能"双通知"(浏览器一条 + 主机端一条):只想留一个就把另一个关掉——设置页关「任务完成提醒」(关浏览器端),或
host-config.json里"completion": false(关主机端)
浏览器通知权限授权(Edge / Chrome)
- 打开 dsh 页面 → 设置 → 审批提醒
- 点击 「开启通知并测试」——若显示
权限: default,浏览器会弹出授权请求,点 允许 - 若之前误点了"阻止"(显示
权限: denied),requestPermission()不会再询问,必须手动改回:- Edge:地址栏左侧网站信息图标 → 网站权限 → 通知 → 允许;或 Edge 设置 → Cookie 和网站权限 → 通知 → 找到
127.0.0.1→ 允许 - Chrome:地址栏左侧锁形图标 → 网站设置 → 通知 → 允许;或 Chrome 设置 → 隐私和安全 → 网站设置 → 通知 → 找到
127.0.0.1→ 允许
- Edge:地址栏左侧网站信息图标 → 网站权限 → 通知 → 允许;或 Edge 设置 → Cookie 和网站权限 → 通知 → 找到
- 改完刷新页面,再点「开启通知并测试」验证
Windows 弹不出通知的排查(与浏览器无关)
- 设置 → 系统 → 通知 → 「获取来自应用和其他发送者的通知」 开启
- 应用列表中找到 Chrome / Edge → 通知开启
- 请勿打扰(专注助手)关闭
- 浏览器 / dsh 不要以管理员身份运行(Windows 会抑制提权进程的 toast)
- 通知中心有旧队列时先清空(tag 冲突会导致新通知被替换进队列而不弹出)
未来方向(Roadmap)
- 工作区级提醒 —— 当前只提醒当前会话;后续可扩展为工作区内任意会话的审批都提醒(侧栏"等待审批"角标同源数据)
- 通知点击跳转 —— 目前点击通知只聚焦窗口;后续可携带会话/审批 id 直接跳转到对应会话
许可
MIT