ppy-web/dsh-plugin-xiaomi-mimo-tts
ppy-web/dsh-plugin-xiaomi-mimo-tts为 DSH 提供小米 MiMo、豆包和浏览器本地语音朗读,支持自动播报、自定义音色与可选 UI 音效。
六类事件独立提示音:回合完成、审批、提问、计划评审、目标受阻、任务失败各有独立声音与音量,可在 Web 设置面板配置(内置合成音 / 静音 / 本地音频文件)。
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)
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
question / plan-review / goal-blocked / failure) always ring.
max-tokens / blocked / interrupted turns stay silent.events.mux plus events.host. Mux-open replay of still-pendingapproval/question frames (refresh recovery) does not ring; each rpcId rings at most once.
snapshot diffing.
tab plays immediately, with no 40 ms handshake.
Subagent-originated events are detected and routed independently from the main agent:
session/jobs entry with kind === 'subagent' (eachparallel delegation completing used to ring the main completion sound; now it does not).
origin: 'subagent' /parentId (continuable subagents), including child-session turn ends, approvals, questions, goal projections, and failures.
The settings panel adds a 子代理事件 / Subagent Events section with six rows (same sound sources and per-row volume as the main events) plus an ignore all subagent events master switch. All six subagent sounds default to mute; main-agent events are unchanged.
Each event picks one sound from a Radio.Button group in the settings panel:
with Web Audio, no audio files required.
once selected. Uploaded files are stored in IndexedDB (dsh-sound-audio), immune to the localStorage quota.
The master switch and config export/import stay visible; a 主 Agent / 子代理 tab bar switches the panel between the six main event rows and the subagent panel (its own six rows plus the 「忽略子代理事件」/ ignore-all-subagent-events switch). Each event row has a volume slider on the title row and a 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.
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 @ai-galaxy/dsh-sound
# Restart the server (or refresh the page), then open Settings → 声音通知Other profiles work the same way: dsh plugin --profile add @ai-galaxy/dsh-sound.
To track unreleased main, install from the GitHub source instead:
dsh plugin --profile web add github:AI-Galaxy-GPU/dsh-sound@deepseek-ai/schemastery,@deepseek-ai/cosmokit, @standard-schema/spec) into $DSH_HOME/profiles/web/node_modules/.
"@ai-galaxy/dsh-sound" to dsh.profile.bundles in$DSH_HOME/profiles/web/package.json.
dsh web.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.
enabled, quietCurrent, ignoreSubagent, and six main sound + six mainvolume fields — completionSound / approvalSound / questionSound / planReviewSound / goalBlockedSound / failureSound (builtin key, none, local, data: URL, or audio:) and completionVolume … failureVolume (0–1) — plus the matching subagentCompletionSound … subagentFailureSound / subagentCompletionVolume … subagentFailureVolume pairs for the subagent channel (all sounds default to none). localFiles keeps the last chosen local file per event (completion, … and subagent-completion, …) so switching to a built-in sound and back does not drop it.
defaultSoundbecomes completionSound, voice/TTS values degrade to the per-event default, and workspaces / debounceMs / global volume / voice settings are dropped.
(IndexedDB audio references are inlined as data URLs) and restores it from a JSON file — moving browsers or machines does not require reconfiguration.
dsh-sound settings namespace: on rc.6 thesettings API allowlist (WEB_SETTINGS_NAMESPACES in dsh-host-apiproxy) does not expose third-party namespaces to browsers, so the client does not depend on settingsScope today; the registration keeps the migration path open for future releases.
Compatibility
>=20 (engines.node).0.1.5-alpha.1, 0.1.5-alpha.2, 0.1.5-rc.1, 0.1.5-rc.2 —declared as compatible in dsh.compatibility.dshReleases; the plugin was also smoke-tested end-to-end (settings panel + live event sounds) on a source build of 0.1.3-alpha.1.
dsh plugin --profile web add → dsh web --no-open boots and serves the plugin bundle (@ai-galaxy/dsh-sound/client.js present in the boot page, no plugin load errors) → dsh plugin --profile web remove @ai-galaxy/dsh-sound leaves the profile clean. Each run used a temporary DSH_HOME, deleted afterwards.
Dependencies
@deepseek-ai/schemastery (settings schema) plus the peer@deepseek-ai/cordis. No other runtime dependencies.
@deepseek-ai/dsh-client-runtime, and@deepseek-ai/dsh-client-ui-settings are provided by the host application through the client module table; the package ships no copies of them.
Capabilities and permissions
file the user selects; the audio is stored in IndexedDB (dsh-sound-audio). There is no filesystem access outside the browser sandbox and no automatic file scanning.
localStorage (dsh-sound:config), audio files inIndexedDB.
credentials, no native artifacts, and no install lifecycle scripts (preinstall / install / postinstall / prepare are absent).
Failure bounds
keeps working.
audio references are ignored.
malformed frames are ignored without crashing.