六类事件独立提示音:回合完成、审批、提问、计划评审、目标受阻、任务失败各有独立声音与音量,可在 Web 设置面板配置(内置合成音 / 静音 / 本地音频文件)。
安装
# npm 包(预构建)
dsh plugin --profile web add @ai-galaxy/dsh-sound
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:AI-Galaxy-GPU/dsh-sound
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English | 中文
DeepSeek Harness(DSH)Web 端插件:任务完成后播放通知铃声,并在需要人介入时 (审批、提问、计划评审、目标受阻、任务失败)播放注意提示音。
📬 已提交至 Awesome DSH Plugin — PR #752(等待维护者审批)
截图

功能
六类事件完全独立
每类事件各自配置声音与音量(0–100%):
| 事件 | 检测来源 | 默认声音 |
|---|---|---|
| 回答完成 / 后台任务完成 | turn/end 且 reason.kind === 'completed';任务 → completed |
风铃 |
| 审批请求 | approval/requested 帧 |
叮咚 |
| 用户提问 | question/requested 帧(不满足计划评审特征) |
叮咚 |
| 计划评审 | question/requested 帧(单问题 + 计划评审意图) |
叮咚 |
| 目标受阻 | goal 投影进入 blocked |
叮咚 |
| 后台任务失败 / 循环失败 | 任务 → failed;turn/end 且 error;host/agent-error |
铃铛 |
- 完成事件受「当前会话不响铃」限制;注意事件(审批/提问/计划评审/目标受阻/失败)始终响铃。
- 用户停止(
aborted)、killed任务、max-tokens/blocked/interrupted不响完成音。 - 事件由连接层帧流(
events.mux+events.host)精确检测。mux 打开时回放的 未决审批/提问(刷新恢复)不响;同一rpcId只响一次。 - 事件流不可用、或连续解包失败时自动降级为快照 diff。
- 多标签页:同时打开多个标签页时同一次事件只响一声(BroadcastChannel 决胜); 单标签页立即播放,不做 40ms 握手。
子代理事件独立通道
子代理来源的事件与主 agent 分开检测、独立控制:
- 一次性子代理任务 —
session/jobs中kind === 'subagent'的任务(并行委派时 每个子代理完成都会响主完成音的扰民问题由此解决); - 子代理会话 — 会话行带
origin: 'subagent'/parentId的事件(可继续子代理), 包括子会话回合结束、审批、提问、目标受阻与失败。
设置面板新增子代理事件分区:六个事件行(声音来源与音量控件与主事件一致), 外加一个「忽略子代理事件」总开关。子代理六类声音默认全部静音,主 agent 事件行为不变。
声音来源
设置面板里每类事件用 Radio.Group + Radio.Button 选择声音:
- 内置合成音 — 叮咚 / 风铃 / 铃铛 / 完成 / 成功,Web Audio 实时合成,无需音频文件;
- 静音 — 该事件不响;
- 本地文件 — 选择任意 MP3/WAV 等文件;选中后该事件行下方会出现文件选择。
上传文件存入 IndexedDB(
dsh-sound-audio),不受 localStorage 容量限制。
设置面板(设置 → 声音通知)
总开关与配置导入/导出保持常驻;主 Agent / 子代理 两个 Tab 切换面板: 主 Tab 是六类主事件行,子代理 Tab 是六类子代理事件行加「忽略子代理事件」开关。 每个事件行标题行右侧为音量滑块,下方为 Radio.Button 分段选择(点击即选中并播放); 选「本地文件」时行下方出现选择/更换按钮与文件名。
安装
需要支持 bundle 插件的 DSH 版本(dsh.profile.bundles + dsh.bundle.patch),
且 PATH 中有 pnpm(corepack enable 或 npm i -g pnpm)。
# 一键安装:pnpm 安装依赖并把本包加入 profile 的 bundles 层
dsh plugin --profile web add @ai-galaxy/dsh-sound
# 重启服务(或刷新页面),打开 设置 → 声音通知 即可配置
其他 profile 同理:dsh plugin --profile <name> add @ai-galaxy/dsh-sound。
想跟进未发布的 main 时,可从 GitHub 源安装:
dsh plugin --profile web add github:AI-Galaxy-GPU/dsh-sound
手动安装(无 pnpm 时)
- 把本包及依赖(
@deepseek-ai/schemastery、@deepseek-ai/cosmokit、@standard-schema/spec) 复制到$DSH_HOME/profiles/web/node_modules/; - 在
$DSH_HOME/profiles/web/package.json的dsh.profile.bundles中追加"@ai-galaxy/dsh-sound"; - 重启
dsh web。
配置持久化
- 客户端配置保存在浏览器 localStorage(键
dsh-sound:config),读取时做字段校验与默认值兜底。 上传的本地音乐存入 IndexedDB(dsh-sound-audio),不受 localStorage 容量限制。 - 配置键:
enabled、quietCurrent、ignoreSubagent,以及六个主声音 + 六个主音量字段——completionSound/approvalSound/questionSound/planReviewSound/goalBlockedSound/failureSound(内置键 /none/local/data:URL /audio:<id>)与completionVolume…failureVolume(0–1);子代理通道另有对应的subagentCompletionSound…subagentFailureSound与subagentCompletionVolume…subagentFailureVolume(声音默认全部none)。localFiles记住每类事件(completion… 与subagent-completion…)上次选的 本地文件,切到内置音再切回时不丢。 - 0.2.0 配置自动迁移:旧配置的
defaultSound迁为completionSound, voice/TTS 值降级为该类默认音,workspaces/debounceMs/ 全局volume/ 语音设置等旧字段一律忽略。 - 导出 / 导入:设置面板可把完整配置下载为 JSON(IndexedDB 音频引用内嵌为 data URL), 也可从 JSON 文件恢复——换浏览器 / 换设备无需重新配置。
- 宿主端同时注册
dsh-sound设置命名空间:rc.6 的 settings API 白名单 (dsh-host-apiproxy的WEB_SETTINGS_NAMESPACES)不会把第三方命名空间暴露给浏览器, 该注册为平台开放暴露机制后的无缝迁移预留(客户端存储接口外形与 settingsScope 一致)。
兼容性与能力披露
兼容范围
- Node.js:
>=20(engines.node)。 - DSH:已在
0.1.5-alpha.1、0.1.5-alpha.2、0.1.5-rc.1、0.1.5-rc.2上验证, 并在dsh.compatibility.dshReleases中声明为compatible;另在0.1.3-alpha.1源码构建上做过端到端冒烟(设置面板 + 真实事件响铃)。 - 验证记录(2026-09-13):上述每个版本都跑了一遍一次性 Profile 流程——
dsh plugin --profile web add <tarball>→dsh web --no-open启动且 boot 页包含 插件 bundle(@ai-galaxy/dsh-sound/client.js,无插件加载错误)→dsh plugin --profile web remove @ai-galaxy/dsh-sound后 profile 干净; 每次使用临时DSH_HOME,验证后删除。
依赖
- 宿主端:仅
@deepseek-ai/schemastery(设置 schema)与 peer 依赖@deepseek-ai/cordis, 无其他运行时依赖。 - 客户端:React、
@deepseek-ai/dsh-client-runtime、@deepseek-ai/dsh-client-ui-settings均由宿主应用通过客户端模块表提供,包内不携带副本。
能力与权限
- 本地文件:设置面板打开浏览器自带的文件选择器,读取用户主动选择的音频文件,
存入 IndexedDB(
dsh-sound-audio);没有浏览器沙箱之外的文件系统访问,也不会自动扫描文件。 - 存储:配置存
localStorage(dsh-sound:config),音频存 IndexedDB。 - 无网络请求、无外部服务、无 shell/命令执行、无凭据、无原生制品,
也没有安装期生命周期脚本(
preinstall/install/postinstall/prepare均不存在)。
失败边界
- 播放失败(浏览器自动播放策略、音频不支持)静默降级,界面不受影响。
- IndexedDB/localStorage 不可用时退化为内存配置;读不到的音频引用直接忽略。
- 事件流不可用或帧解析失败时降级为会话快照 diff;畸形帧被忽略且不崩溃。
- 每次读取配置都会按已知字段与默认值做清洗。
开发
npm test # 宿主端 + 客户端 100 余项自动化断言(Node 即可,无需浏览器)
npm run check # 语法检查
结构:
开发注意:profile 的 pnpm 使用
nodeLinker: hoisted,安装时会拷贝file:依赖到node_modules——直接改本仓库不会立即生效,需要 重新执行pnpm --dir ~/.dsh/profiles/web update @ai-galaxy/dsh-sound,或把~/.dsh/profiles/web/node_modules/@ai-galaxy/dsh-sound换成指向本目录的软链。 Web 服务按请求读取 bundle 内容(只有 boot 页的 rev 哈希在启动时缓存), 刷新拷贝后浏览器硬刷新(Cmd+Shift+R)即可,无需重启服务。
lib/index.js— 宿主端:注册 settings 命名空间(schemas 校验 + 默认值)lib/client.js— 浏览器端 bundle:事件检测、声音引擎(Web Audio / IndexedDB 音频)、设置面板lib/types/index.d.ts— 宿主端类型声明cordis.patch.yml— bundle 补丁层(插入dsh-sound行)tools/— 测试与验收脚本(不随 npm 包发布)
发布
以 @ai-galaxy/dsh-sound 发布(需要 ai-galaxy npm 组织成员权限;
publishConfig.access 已设为 public)。
npm login # 登录 npm(建议开启 2FA)
npm publish --access public
许可证
链接
同类插件
PolinniZhong/dsh-omi-voice★ 74
DeepSeek Harness 对话内朗读:点一下即可朗读、暂停、继续 AI 回复,豆包 TTS 自然音色(BYOK),只读最终回答并过滤代码、表格与图形,本地引擎,插件零 Key。
PensiveFei/dsh-voice-scribe★ 34
面向 Web UI 的语音输入插件:点按 Alt(或 Alt+空格)开始/停止听写,支持浏览器内置 Web Speech(零配置)或 OpenAI 兼容云端 ASR,可选经 DSH 已配置模型润色,带设置页。
1624318455/dsh-plugin-tts★ 21
用免费 Edge TTS 或你自己的 RVC 音色朗读 AI 回复:消息朗读与自动朗读、长文自适应分块渐进播放(无缝衔接)、音色包仓库一键安装、便携 RVC 运行时。
WizisCool/dsh-ears★ 21
面向 DeepSeek Harness (dsh) 的语音输入插件:输入框的麦克风按钮把语音转成草稿文本,支持多种语音识别后端,可选经 dsh 自有 LLM 路由润色,并带原生设置页。
PerryLink/dsh-talk★ 15
DeepSeek Harness 的语音输入输出:麦克风语音转文字与文字转语音。
qishuilalala/dsh-voice-mode#dsh-voice-mode★ 15
DeepSeek Harness Web UI 全双工语音对话:按钮或 Ctrl+Shift+V 进入,持续聆听(停顿自动发送)或按住说话,zipformer2 流式识别入可编辑草稿、可选唤醒词;回复按句 Edge TTS 朗读并显示实时字幕,开口即打断播放与回合(真 barge-in);识别模型本地推理、Edge TTS 在线合成,无需 API Key。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。