DSH Web GUI 审批语音提示插件:需要审批/回答的弹窗出现时播放提示音并语音播报
32.1/100
综合分
3
GitHub 星标
264
npm 周下载
—/5
用户评分
数据截至 2026/10/5 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-approval-voicenpm 源 · dsh-approval-voice 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · ui
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-approval-voice @ 0.3.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/18 00:26:15
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 审批弹窗提示音
- 语音播报提醒
最近更新
在 GitHub 查看全部 →v0.3.02026-10-04
· 修复:自定义提示音不再静默丢失;音量滑块写入 448ms→0ms
· 症状
· 选完自定义提示音后,面板立刻显示「已自定义」,但刷新/重开标签页后提示音消失,全程零报错、零提示。
· 真机实测(Chrome headless + CDP):本机单源 localStorage 配额仅 5,242,879 字符,一份 5.4M 字符的 base64 提示音写入 grewBy=0(根本没写进去)、零告警,面板仍显示「已自定义」。
· 音量滑块每次拖动都触发一次全量 setConfig 落盘,20 次 set 实测耗时 448ms,拖动明显发涩。
· 根因
三环叠加,只堵一环修不干净:
1. setConfig 的上限按 4MB(二进制) 计算,但实际存的是 FileReader.readAsDataURL 产出的 base64,膨胀约 1.33× ≈ 5.33M 字符,正好压在浏览器 5MB 配额线上,必然超限;
2. setConfig 里是 try { setItem } catch { /* ignore */ } —— QuotaExceededError 被静默吞掉,调用方永远拿不到失败信号;
3. 面板读的是内存里的 config 对象,所以 UI 立刻反映「已自定义」,磁盘上却什么都没存。
· 修复
· 提示音上限降到 2MB(二进制),留足余量;二进制超限时面板直接显示红色错误行,不再假装成功。
· 新增 writeVerified():写入后回读比对(有些环境 setItem 不抛错却没真正落盘),失败时回滚内存配置、还原磁盘上的提示音,并 console.warn 写明原因。
· 提示音拆到独立 key dsh.approvalVoice.sound.v1,主配置回到 2MB 的音频文件,应出现红色错误行;再拖动音量滑块,界面无卡顿。
· Console 验证:写入失败时应出现 console.warn,而不是毫无动静。
· 旧的自定义提示音会自动迁移到新 key,升级后直接可用。
· 验证
· test-global-scope.mjs 断言 27 → 45 条;test-cross-tab.mjs 5 个场景全过;node --check lib/client.js 通过。
· A/B 对照:同一份新测试跑旧版 client.js 有 12 条 FAIL,跑新版 45 条全过。
· 真机(Chrome headless + CDP):旧版 5.4M 字符写入静默失败(grewBy=0)、零告警、面板仍显示已自定义;新版返回 QuotaExceededError + console.warn;滑块 20 次 set 从 448ms 降到 0ms。
完整变更:
v0.2.22026-10-01
· 修复:桌面端里「提醒范围 = 所有会话」不生效(网页版正常)
· 症状
设置明明是「所有会话」,但只有当前正在显示的那个会话的审批会响;同一个插件在网页版正常、
在桌面端 dsh-desktop 不正常。诊断依据:响铃记录(localStorage 的 dsh.approvalVoice.bell.v1)
里桌面端的 eventKey 全是 ${tabId}:approval:... 前缀(= 只走了 DOM 兜底),
而网页版那次是 session:${sessionId}:approval:... 前缀(= 全局源生效)。
· 根因
0.2.1 订阅的全局源是网页版核心的 ctx.uiSession.pendingInteractions(dsh 0.1.5-rc.3);
桌面端 dsh-desktop 0.2.0-rc.2 的客户端核心没有这个属性 —— 它只有
ctx.uiSession.sessionStatus(Map,
待处理交互藏在 pendingInteraction 字段,正是桌面端侧边栏「等待审批」读的那个源)。
于是 startGlobalWatcher() 取源失败 → 退回 DOM 卡片监听 → 只有当前视图渲染的卡片能被看到,
现象与 0.2.1 修复前一模一样。
连带问题:桌面端 sessions.list.getSnapshot() 返回 {byId, phase}(没有网页版的 .current),
currentSessionId() 取不到值 → eventKey 退化成 ${tabId}:${kind}:${key},跨标签页去重被架空。
· 修复
· 新增 resolveGlobalSource() 双形状解析:优先 uiSession.pendingInteractions(网页版),
否则把 uiSession.sessionStatus 适配成同形状(桌面端);两者都取不到才退回 DOM 监听并打印明确告警
(告警文案同时点名两个属性)。
· currentSessionId() 增加回退:sessions.list.getSnapshot().current →
uiSession.adapter.current.getSnapshot().key,桌面端的 eventKey 恢复会话作用域
session:::。
· 调试接口同步:window.__approvalVoice.pending() 走同一解析,桌面端也能列出所有会话的待处理交互。
· 升级
· 桌面端
dsh plugin --profile desktop add dsh-approval-voice@0.2.2
· 网页版
dsh plugin --profile web add dsh-approval-voice@0.2.2
重启 / 刷新界面后,在 Console 里验证:
window.__approvalVoice.global() // 应为 true(已挂上全局源)
window.__approvalVoice.pending() // 应列出「所有」会话的待处理交互
window.__approvalVoice.currentSessionId() // 应返回当前会话 id
实测方法:让另一个没有显示在界面里的会话触发一次审批,不要切过去,应当立刻响。
· 验证
test-global-scope.mjs 新增 3 组「桌面端核心形状」场景(sessionStatus 源 + 无 .current 快照 +
adapter.current 回退),断言 17 → 27 条全部通过(test-cross-tab.mjs 5 组也全过):
· 桌面端形状:非当前会话的审批响 1 次(修复前为 0),eventKey 是 session:session-bg:approval:approval:5(修复前是 tabId 前缀);
· 桌面端形状 + 仅当前会话:其它会话不响、本页会话照响;
· 桌面端形状:DOM 兜底路径的 eventKey 同样带会话作用域。
完整变更:
v0.2.12026-09-11
· 修复:设置成「所有会话」后,非当前会话的审批不响
· 根因
旧实现只嗅 DOM 里的 data-approval-key / data-question-key / data-plan-review-key 卡片,
而 DSH 只在当前正在显示该会话的视图里渲染这张卡片。因此没有开在任何标签页里的会话
(只在侧边栏显示「等待审批」)永远不会触发提醒 —— 单页签切换会话的用户就会感觉
「明明设置了全局提醒,但没有生效」。
· 修复
· 真的覆盖所有会话:改为主订阅 DSH 客户端的全局待处理交互源
ctx.uiSession.pendingInteractions(侧边栏「等待审批」同源),任何会话的
approval / question / plan-review 出现都会触发提醒;取不到该源时(更老的 DSH)
自动退回 DOM 卡片监听并打印明确告警。
· 跨标签页仍然只响一次:eventKey 由 ${tabId}:${kind}:${key} 改为会话作用域
session:${sessionId}:${kind}:${key},两个标签页显示同一会话不再各响一次,
且仍然优先由聚焦标签页出声。
· 自定义提示音不再静默失效:保留 引用(避免被 GC 提前回收导致截断);
未起播(NotAllowedError / 解码失败 / 1 秒内没有 playing 事件)时自动回退内置
提示音,失败原因写入 console.warn。
· 播放失败会让出并补响:本页确实出不了声时释放跨标签页 claim 并广播
bell-failed,请已解锁音频的其它页签补响一次。
· 调试接口新增 window.__approvalVoice.global() / pending() / currentSessionId()。
· 升级
dsh plugin --profile web add dsh-approval-voice@0.2.1
安装后重启 dsh web 服务并刷新页面。可在浏览器 Console 里用
window.__approvalVoice.global() 确认返回 true(已挂上全局源),
用 window.__approvalVoice.pending() 看到所有会话的待处理交互。
· 验证
新增 test-global-scope.mjs:直接加载真实 lib/client.js 的假浏览器回归测试,
6 组场景 17 条断言全部通过 —— 单页签 + 非当前会话 / 多页签只响一次 / 仅当前会话 /
自定义提示音失败回退 / 播放失败补响 / uiSession 缺失退回 DOM。
完整变更:
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-approval-voice(审批语音提示)
DSH Web GUI 插件:当需要你审批或回答的弹窗(沙箱权限升级审批、ask_user_question 提问、计划审批等)出现时,自动播放提示音并用语音播报,避免漏看。
工作原理
插件有两条检测路径,两条路径统一使用会话作用域的事件标识(session:<sessionId>:<kind>:<key>),因此不会重复提醒:
1. 全局待处理交互源(首选):订阅 DSH 客户端的全局待处理交互快照,按
Map<sessionId, {kind, key}> 感知所有会话的 approval / question / plan-review ——
包括没有开在任何标签页里的会话。
展开完整文档(README 剩余 1 节)
dsh-approval-voice(审批语音提示)
DSH Web GUI 插件:当需要你审批或回答的弹窗(沙箱权限升级审批、ask_user_question 提问、计划审批等)出现时,自动播放提示音并用语音播报,避免漏看。
工作原理
插件有两条检测路径,两条路径统一使用会话作用域的事件标识(session:<sessionId>:<kind>:<key>),因此不会重复提醒:
1. 全局待处理交互源(首选):订阅 DSH 客户端的全局待处理交互快照,按
Map<sessionId, {kind, key}> 感知所有会话的 approval / question / plan-review ——
包括没有开在任何标签页里的会话。两种客户端核心形状都支持(resolveGlobalSource() 自动适配):
- 网页版 dsh 0.1.5-rc.3:ctx.uiSession.pendingInteractions (即侧边栏「等待审批」所用的 root hook sessionPendingInteraction);
- 桌面端 dsh-desktop 0.2.0-rc.2:没有 pendingInteractions,改用
ctx.uiSession.sessionStatus(Map<sessionId, {running, pendingInteraction, completionUnread}>,
取其中的 pendingInteraction),这正是桌面端侧边栏「等待审批」用的源。
2. DOM 标记(兜底):仅在两个源都取不到时(更老的 DSH)才使用,监听当前视图渲染出来的卡片:
| 标记 | 对应界面 |
| data-approval-key | 沙箱权限升级等审批(ApprovalPanel) |
| data-question-key | 提问 / 选择题(QuestionComposer) |
| data-plan-review-key | 计划审批(PlanReviewPanel) |
命中时按配置播放升调提示音(Web Audio,C5-E5-G5)和/或语音播报(SpeechSynthesis,中文语音)。每个请求只提醒一次。
安装
方式一:npm(推荐,已发布到 npmjs)
dsh plugin --profile web add dsh-approval-voice
方式二:GitHub(备选)
dsh plugin --profile web add github:ZIye1208/dsh-approval-voice
安装后重启 dsh web 服务,刷新页面即可生效。
本地开发安装(改代码即时生效):
dsh plugin --profile web add link:C:\path\to\dsh-approval-voice
使用
- 默认开启「提示音 + 语音播报」,且默认对所有会话提醒(多会话 / 单页签切换会话 / 多标签页都能听到任何会话的审批、提问、计划审批)。
- 设置入口:设置 → 常规 → 审批语音提示,可配置:
- 总开关;
- 提醒方式:仅提示音 / 仅语音播报 / 提示音 + 语音播报;
- 音量;
- 提醒范围:所有会话(默认,覆盖所有会话,含没开在任何标签页里的会话)或 仅当前会话(只在当前标签页响应本页显示的会话);
- 提示音文件:选择本地音频文件(mp3/wav/ogg 等,≤2MB)替换内置提示音;点「恢复默认」回到内置提示音。超限或保存失败时面板会直接报错,不会"看着像存住了"。
- 试听按钮:按当前设置播放一次(含自定义提示音)。
- 控制台调试:window.__approvalVoice.get() / set({...}) / test() / pending() / global() / alertedCount() / soundBytes() / currentSessionId() / tabId。
set({...}) 返回 { ok, error, config }:ok:false 表示没存住(已回滚内存配置),别忽略它。
- 配置保存在浏览器 localStorage(键 dsh.approvalVoice.v1),同一浏览器所有标签页共享。
多会话提醒原理
DSH Web GUI 里每个会话可能是一个独立标签页,也可能只是同一页签侧边栏里的一条。插件按以下方式让任一会话的审批都能被听到:
- 每个页签订阅 DSH 客户端的全局待处理交互源(网页版 ctx.uiSession.pendingInteractions、桌面端 ctx.uiSession.sessionStatus),因此任何会话(哪怕没开在任何页签里、只在侧边栏显示「等待审批」)出现审批 / 提问 / 计划审批时,每个页签都会感知到;两个源都取不到时才退回监听本页 DOM 里的卡片。
- 事件标识是会话作用域的(session:<sessionId>:<kind>:<key>),配合 BroadcastChannel (并写入 localStorage 作为兜底)在全浏览器内一次提醒只响一次:优先由当前聚焦的标签页 播放(声音最可靠),若没有任何聚焦标签页,则由最先到时的后台标签页兜底播放。
- 若抢到播放权的页签实际没能出声(浏览器拒绝自动播放且音频未解锁),它会释放 claim 并广播 bell-failed,请已解锁音频的其它页签补响一次。
- 仅当前会话 模式不广播,只在本地为本页正在显示的那个会话出声。
注意事项
- 语音播报依赖系统安装的中文 TTS 语音;找不到中文语音时自动退化为仅提示音(避免用英文语音念中文)。
- 浏览器自动播放策略:首次点击/按键后音频才解锁;设置在自定义提示音且未起播时会自动回退内置提示音,并把失败原因打到 console.warn(不再静默无声)。
- 自定义提示音以 data URL 存入 localStorage(≤2MB 二进制,编码成 base64 后约 1.33 倍),请选择短促音频;跨标签页共享。提示音单独占一个 key,不跟开关/音量挤在一起 ——这样拖动音量滑块不会每次都重写几 MB 的数据。老版本留下的提示音会在首次启动时自动搬过去。
- 保存失败不会静默:浏览器存储配额不足时(数据 URL 太大,或同源其它插件把 localStorage 占满),面板会显示红色错误行,失败原因写进 console.warn,并且配置回滚到上一个值 ——绝不会出现「面板显示已自定义、刷新后提示音消失」。遇到这种提示就换更短的音频(建议 1MB 以内),或清理浏览器数据后重试。
- 若所有 DSH 标签页都在后台且使用「仅语音播报」,浏览器可能限制后台标签页的语音合成(提示音不受影响)。
- 卸载:dsh plugin --profile web remove dsh-approval-voice,重启服务即可。
文件结构
dsh-approval-voice/
├── package.json # dsh.bundle + dsh.client 声明(免构建) ├── cordis.patch.yml # 插件名册插入行 ├── lib/index.js # 宿主侧空插件(浏览器专用插件无需宿主行为) ├── lib/client.js # 浏览器端实现(模块加载器格式,纯 JS) ├── test-global-scope.mjs # 回归测试:直接加载真实 lib/client.js 的假浏览器测试 └── test-cross-tab.mjs # 旧版跨标签页协调逻辑复刻测试预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ZIye1208/dsh-approval-voice
DSH Web GUI 审批语音提示插件:需要审批/回答的弹窗出现时播放提示音并语音播报
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目