Skip to content

dsh-approval-alert

Verified

dsh-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 的同步包一起分发到其他机器。

使用

  1. 打开 dsh web → 设置 → 审批提醒
  2. 点击 「开启通知并测试」 授权浏览器通知权限(浏览器要求权限必须来自点击手势)
  3. 按需调整:提示音、任务完成提醒、重复提醒间隔(0 = 不重复)
  4. 之后当会话需要审批/提问、或任务完成而你不在页面上时,就会收到提醒;点击通知可切回 dsh 窗口

工作原理

浏览器端(v1)

  • 插件注册到客户端 conversation.input.dock 插槽(与官方 todo / 队列面板同插槽,多渲染、互不冲突),用套件提供的 useSession 钩子订阅当前会话快照的 pending 列表
  • 过滤出 approval / question 两种 pending(与 dsh 自带审批弹窗、提问面板同源数据
  • 挂载期间若页面隐藏或失焦:立即提醒一次,并按设定间隔重复
  • 处理完成(pending 消失)或你切回页面(visibilitychange / focus)→ 停止提醒、恢复标题
  • 通知 tag 按审批/提问 id 区分:同一 pending 的重复提醒合并不堆叠,不同 pending 各弹各的

浏览器端(v3 完成提醒)

  • 订阅快照 runningtrue → false 的边沿即"任务跑完";挂载时已是 false 不误报
  • 触发后延迟 800ms 结算(期间读最新的 running 与 goal 投影):
    • 下一轮已经开始 → 不提醒(目标多轮连续跑时只在最后一轮完成提醒)
    • 目标投影 phase === "complete" → 「目标已完成」(带上目标内容);phase === "blocked" → 「目标受阻」
    • 无目标 / 目标暂停 → 普通「任务已完成」;快照带 lastAgentError 时提示「任务已结束(出错)」
  • 只在你不在页面(页面隐藏或失焦)时弹,一次性,不重复;设置页的「任务完成提醒」开关可单独关闭

主机端(v2)

  • 主机半(lib/index.js仅监听 approval/asked / approval/decided / turn/end 会话事件(纯观察者,不触碰 approval/request waterfall,避免干扰 GUI 审批通道)
  • 每次 approval/asked延迟 delayMs(默认 5s)检查:若该审批仍未被应答(你没答)→ 弹系统通知;若 approval/decidedunavailable 结束(无 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)

  1. 打开 dsh 页面 → 设置 → 审批提醒
  2. 点击 「开启通知并测试」——若显示 权限: default,浏览器会弹出授权请求,点 允许
  3. 若之前误点了"阻止"(显示 权限: denied),requestPermission() 不会再询问,必须手动改回:
    • Edge:地址栏左侧网站信息图标 → 网站权限通知允许;或 Edge 设置 → Cookie 和网站权限 → 通知 → 找到 127.0.0.1 → 允许
    • Chrome:地址栏左侧锁形图标 → 网站设置通知允许;或 Chrome 设置 → 隐私和安全 → 网站设置 → 通知 → 找到 127.0.0.1 → 允许
  4. 改完刷新页面,再点「开启通知并测试」验证

Windows 弹不出通知的排查(与浏览器无关)

  1. 设置 → 系统 → 通知 → 「获取来自应用和其他发送者的通知」 开启
  2. 应用列表中找到 Chrome / Edge → 通知开启
  3. 请勿打扰(专注助手)关闭
  4. 浏览器 / dsh 不要以管理员身份运行(Windows 会抑制提权进程的 toast)
  5. 通知中心有旧队列时先清空(tag 冲突会导致新通知被替换进队列而不弹出)

未来方向(Roadmap)

  • 工作区级提醒 —— 当前只提醒当前会话;后续可扩展为工作区内任意会话的审批都提醒(侧栏"等待审批"角标同源数据)
  • 通知点击跳转 —— 目前点击通知只聚焦窗口;后续可携带会话/审批 id 直接跳转到对应会话

许可

MIT