AI-Galaxy-GPU/dsh-sound
DeepSeek Harness(DSH)Web 端插件:回合完成、审批、提问、计划评审、目标受阻、任务失败各有独立提示音与音量,内置合成音 / 静音 / 本地音频文件,Web 设置面板可配置。
已收录
1
Voice
Bundle 已验证
预览
功能介绍
六类事件独立提示音:回合完成、审批、提问、计划评审、目标受阻、任务失败各有独立声音与音量,可在 Web 设置面板配置(内置合成音 / 静音 / 本地音频文件)。
适合
- 需要针对完成、审批、提问、计划评审、目标受阻和失败分别获得声音提示的 DSH Web 用户。
- 希望为每类事件单独设置音量、静音、合成音或本地音频文件的用户。
- 需要关注后台任务或同时打开多个标签页,并希望避免重复响铃的用户。
不适合
- 非 Web 版 DSH 工作流,或不支持 bundle 插件的 DSH 安装。
- 偏好静默、纯视觉通知,或不需要按事件区分声音设置的用户。
- 期望设置和上传音频自动跨浏览器同步的团队;这些数据保存在浏览器本地存储中。
README
dsh-sound
| English | 中文 |
A DeepSeek Harness (DSH) plugin for the Web UI: play a customizable sound when a task finishes, and an attention sound whenever something needs a human.
📬 Submitted to Awesome DSH Plugin — PR #752 (pending maintainer approval)
Demo
Source file: docs/demo.mp4
Screenshots

Features
Six independent events
Each event type has its own sound and its own volume (0–100%):
| Event | Detection | Default sound |
|---|---|---|
| Turn end / background task completed |
turn/end with reason.kind === 'completed'; job → completed
|
Chime |
| Approval request |
approval/requested frame |
Ding |
| User question |
question/requested frame (not plan-review shaped) |
Ding |
| Plan review |
question/requested frame classified as plan-review |
Ding |
| Goal blocked | goal projection enters blocked
|
Ding |
| Background / loop failure | job → failed; turn/end error; host/agent-error
|
Bell |
- Completion respects the “quiet current session” option; attention events (approval / question / plan-review / goal-blocked / failure) always ring.
- User abort, killed jobs, and
max-tokens/blocked/interruptedturns stay silent. - Events come from
events.muxplusevents.host. Mux-open replay of still-pending approval/question frames (refresh recovery) does not ring; eachrpcIdrings at most once. - When the event stream is unavailable or frames fail to unwrap, the plugin falls back to snapshot diffing.
- Multiple tabs: the same event rings only once (BroadcastChannel tie-break). A single tab plays immediately, with no 40 ms handshake.
Sound sources
Each event picks one sound from a Radio.Button group in the settings panel:
- Built-in synthesized sounds — Ding / Chime / Bell / Complete / Success, generated live with Web Audio, no audio files required.
- Mute — silence that event.
-
Local file — choose any MP3/WAV/etc. file; a file picker appears below the event row
once selected. Uploaded files are stored in IndexedDB (
dsh-sound-audio), immune to the localStorage quota.
Settings panel (Settings → 声音通知 / Sound Notification)
Master switch, six event rows (volume slider on the title row; Radio.Group of Radio.Button options below — click to select and play; a local-file row with a choose/replace button appears when 本地文件 is selected), and config export/import.
Install
Requires a DSH version with bundle-plugin support (dsh.profile.bundles + dsh.bundle.patch)
and pnpm on PATH (corepack enable or npm i -g pnpm).
# One command: pnpm installs the package and adds it to the profile's bundle layer
dsh plugin --profile web add dsh-sound
# Restart the server (or refresh the page), then open Settings → 声音通知
Other profiles work the same way: dsh plugin --profile <name> add dsh-sound.
Manual install (without pnpm)
- Copy this package and its runtime deps (
@deepseek-ai/schemastery,@deepseek-ai/cosmokit,@standard-schema/spec) into$DSH_HOME/profiles/web/node_modules/. - Append
"dsh-sound"todsh.profile.bundlesin$DSH_HOME/profiles/web/package.json. - Restart
dsh web.
Configuration storage
- The browser half persists its configuration in localStorage (key
dsh-sound:config), sanitizing every read and filling defaults. Uploaded local music files are stored in IndexedDB (dsh-sound-audio) instead — no localStorage quota limits. - Config keys:
enabled,quietCurrent, and six sound + six volume fields —completionSound/approvalSound/questionSound/planReviewSound/goalBlockedSound/failureSound(builtin key,none,local,data:URL, oraudio:<id>) andcompletionVolume…failureVolume(0–1).localFileskeeps the last chosen local file per event so switching to a built-in sound and back does not drop it. -
0.2.0 migration: older configs are upgraded automatically —
defaultSoundbecomescompletionSound, voice/TTS values degrade to the per-event default, andworkspaces/debounceMs/ globalvolume/ voice settings are dropped. - Export / import: the settings panel downloads the full config as JSON (IndexedDB audio references are inlined as data URLs) and restores it from a JSON file — moving browsers or machines does not require reconfiguration.
- The host half also registers the
dsh-soundsettings namespace: on rc.6 the settings API allowlist (WEB_SETTINGS_NAMESPACESindsh-host-apiproxy) does not expose third-party namespaces to browsers, so the client does not depend onsettingsScopetoday; the registration keeps the migration path open for future releases.
Development
npm test # 100+ assertions across host and client halves (Node only, no browser needed)
npm run check # syntax check
Layout:
Profile development note: the profile’s pnpm uses
nodeLinker: hoisted, which COPIESfile:dependencies intonode_modulesat install time — edits to this checkout do not reach the running app until you either re-runpnpm --dir ~/.dsh/profiles/web update dsh-soundor replace the copied directory with a symlink to this checkout. The web server reads bundle content per request (only the boot-page rev hash is cached at startup), so after refreshing the copy a browser hard-refresh (Cmd+Shift+R) is enough — no server restart needed.
-
lib/index.js— host half: registers the settings namespace (schema + defaults) -
lib/client.js— browser bundle: event detection, sound engine (Web Audio / IndexedDB audio), settings panel -
lib/types/index.d.ts— host-side type declarations -
cordis.patch.yml— bundle patch layer (inserts thedsh-soundrow) -
tools/— tests and verification scripts (not shipped in the npm package)
Publish
npm login # npm account (2FA recommended)
npm publish --access public
License
常见问题常见问题
在启用了 DSH 的终端中执行已验证命令 dsh plugin --profile default add github:AI-Galaxy-GPU/dsh-sound。命令会解析公开 package 元数据,并保持插件与本页展示的目录身份一致。
兼容性以页面上展示的 bundle 与 profile 状态为准。如果某个 profile 尚未检测到,请先保持禁用,并在生产启用前阅读仓库文档。
GitHub 链接和 activity 元数据是 release 与维护状态的来源。新版本发布后重新查看本页,确认目录已经观察到最新版本。