🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

审批语音提醒 ZIye1208/dsh-approval-voice

DeepSeek Harnessv0.3.0
ZIye120831 天前有提交已提供中文文档扫描:未发现敏感能力

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-voice
npm 源 · dsh-approval-voice 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 审批弹窗提示音
  • 语音播报提醒
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 # 旧版跨标签页协调逻辑复刻测试
预览分享卡片长什么样 ↓ZIye1208/dsh-approval-voice
分享 · DeepSeek Harness Hub
ZIye1208/dsh-approval-voice

DSH Web GUI 审批语音提示插件:需要审批/回答的弹窗出现时播放提示音并语音播报

这是你的仓库?认领条目

回到顶部