dsh-opencode-sounds:在 DSH Web UI 里用 opencode 通知音

前言

在 DeepSeek Harness(DSH)里跑长任务时,浏览器标签页往往不在前台:任务结束、需要审批或回答问题时,如果只有界面变化而没有声音,很容易错过。社区里已有基于合成提示音的 DSH 音效插件;若你更习惯 opencode 那套真实 MP3 素材,或希望事件检测与设置面板沿用成熟实现、只换音包,可以看一下维护者 notf0und 发布的 dsh-opencode-sounds。它面向 DSH Web UI,在任务完成、需要人工介入等节点播放 opencode 的通知音包。

这是什么

dsh-opencode-sounds 是 DSH 的 Web 端 bundle 插件:在任务完成或需要人工 attention 时播放 opencode 的通知音。项目 fork 自 @ai-galaxy/dsh-sound(MIT),保留上游的事件检测引擎、设置面板与子智能体(subagent)通道,将内置合成 chime 替换为 opencode 的真实音频资源,并将插件界面改为仅英文。音包、默认映射与文案归属本 fork。当前 package 版本为 0.2.2,许可证 MIT,仓库:github.com/notf0und/dsh-opencode-sounds。社区目录分类为「趣味换装」,属 DSH 社区插件生态,与 DeepSeek / 幻方无官方从属关系。

音包与默认映射

内置音效与 opencode 一致,按 opencode 顺序组织,MP3 位于 assets/audio/,经 tools/build-sounds.mjs 以 base64 内联进 lib/client.js(DSH 客户端以单文件 CJS 工厂加载插件,无相对模块解析)。

系列 数量 ID 范围
Alert 10 alert-01 … alert-10
Bip-bop 10 bip-bop-01 … bip-bop-10
Staplebops 7 staplebops-01 … staplebops-07
Nope 12 nope-01 … nope-12
Yup 6 yup-01 … yup-06

另可选 None(静音)和 Local file(自选音频,存浏览器 IndexedDB)。

默认映射对齐 opencode 内置 「OpenCode Default」 音包(来源见仓库 assets/audio/PROVENANCE.md 中记录的 opencode tag):

DSH 事件 默认音效
任务完成(Completion) bip-bop-01
审批请求(Approval) staplebops-06
用户问题(User question) bip-bop-03
计划审阅(Plan review) bip-bop-05
目标阻塞(Goal blocked) nope-03
失败(Failure) nope-07

子智能体通道单独一套音量与音效:完成默认 yup-01,其余 attention 类事件默认 none;可用 Ignore subagent events 一键静音整条通道。

核心功能

下面介绍 README 中已写明、可在 Web UI 里直接感知的能力。

  1. 六个独立主通道事件,各自可选音效与 0–100% 音量:完成、审批、用户问题、计划审阅、目标阻塞、失败。
  2. 完成音尊重「安静当前会话」(quiet current session);需要 attention 的事件仍会响。
  3. 有意静音:用户中止、killed 任务,以及 max-tokens / blocked / interrupted 等 turn 结束不会触发音效。
  4. 与 DSH 构建适配:有 events.mux + events.host 时用事件流(mux 重连回放不响、同一 rpcId 最多响一次);无该层时(如 0.1.5-rc.3 及之后)改读客户端 fact 源。页面加载时已存在的 pending 审批、已 blocked 的目标、已 failed 的任务会静默 seed,避免一打开就误响。
  5. 多标签:同一事件只响一次(BroadcastChannel 仲裁);单标签无握手直接播放。
  6. 配置 JSON 导出/导入(IndexedDB 中的本地音频会在导出时内联为 data URL)。

检测逻辑(DSH 0.1.5-rc.3+)概要:完成来自 turn/end 的 completed 或 running 边沿回退;失败来自 turn/end 的 error、SessionSnapshot.lastAgentError 或后台 job failed;审批/问题/计划审阅来自 uiSession.pendingInteractions 的 approval / question / plan-review;目标阻塞来自 goal projection 进入 blocked。计划审阅仅在 plan mode 下存在,由 exit_plan_mode 触发的问题经客户端按 intent 与 detail 分类。

安装与启用

插件以当前 DSH 进程及 Web profile 的 bundle 机制加载;安装前建议阅读仓库源码与 MIT 许可证,确认符合你的环境策略。需要支持 bundle 插件的 DSH(dsh.profile.bundles + dsh.bundle.patch),且 PATH 上有 pnpm(可先 corepack enable 或 npm i -g pnpm)。package.json 要求 Node >= 20。

官方安装方式如下。

# 自本地 checkout(示例路径按 README)
dsh plugin --profile web add file:/home/gonzalo/code/dsh-opencode-sounds

# 自 GitHub
dsh plugin --profile web add github:notf0und/dsh-opencode-sounds

安装后重启 dsh web(或刷新页面),打开 Settings → Sounds。

若从上游 @ai-galaxy/dsh-sound 迁移,手动步骤包括:在 $DSH_HOME/profiles/web/package.json 增加依赖与 bundle 条目、pnpm --dir "$DSH_HOME/profiles/web" install、执行 dsh plugin --profile web remove @ai-galaxy/dsh-sound,再重启 Web。profile 使用 nodeLinker: hoisted 时,file: 依赖会在 install 时复制到 node_modules;改本地 checkout 后需重新 install(或改 symlink),浏览器硬刷新即可,不必重启 Web 服务。

典型用法

  1. 安装并打开 DSH Web UI,进入 Settings → Sounds。
  2. 用总开关 Enabled 开启或关闭整插件;在 Main agent / Subagents 标签间切换主智能体六类事件与子智能体面板。
  3. 每一行:下拉选择 opencode 音包 ID、None 或 Local file;点 Play 预览;拖动音量滑块。选 Local file 时用文件选择器,文件存入 IndexedDB(库名 dsh-opencode-sounds-audio),不受 localStorage 配额限制。
  4. 按需开启 Ignore subagent events 或调整 quiet current session 等行为(见设置项与 localStorage 配置字段)。
  5. 需要备份或迁移设置时,使用面板提供的配置导出/导入 JSON。

客户端配置保存在 localStorage,键名 dsh-opencode-sounds:config;字段包括 enabled、quietCurrent、ignoreSubagent、六个主事件及六个子事件的 sound/volume 对等(如 completionSound、failureVolume、subagentCompletionSound 等),以及 localFiles 记录各事件上次选的本地文件。

适用场景与注意

适合:长期在 DSH Web UI 里跑 agent、希望用 opencode 同款通知音区分「完成 / 要审批 / 要问话 / 计划审阅 / 阻塞 / 失败」,并需要与子智能体通道分开调音量的开发者。

注意:

  • 插件仅在 Web UI 客户端注入(dsh.client.platform: web),不是 CLI 侧音效方案。
  • 与 @ai-galaxy/dsh-sound 功能同源时,二者不应并存;迁移文档要求移除旧包。
  • 第三方 settings namespace 在部分 DSH 构建(如 rc.6 的 WEB_SETTINGS_NAMESPACES)未向浏览器暴露时,配置仍走 localStorage;host 侧已注册 dsh-opencode-sounds namespace 以便后续迁移。
  • 开发自检:npm install 后可用 npm test、npm run check、npm run build(见仓库 README)。

结尾

dsh-opencode-sounds 把 opencode 的通知音包接到 DSH Web UI 的六类主事件与子智能体通道上,在保留上游检测与设置结构的前提下替换音源与默认映射。目录页:skillhub.cn/plugins/notf0und/dsh-opencode-sounds;源码与安装说明:github.com/notf0und/dsh-opencode-sounds。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye