Plays a cue when a turn finishes and a different one when the agent asks a question, with volume and preview in Settings.
Install
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/mkpoli/dsh-finish-sound/releases/download/v0.2.1/dsh-finish-sound.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:mkpoli/dsh-finish-sound
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
DSH Web UI plugin that plays a short cue when a turn finishes, and a different cue when the agent asks you something.
- Two events, two cues. A finish cue plays when a turn ends in any session, not only the one on screen. Subagent turns never ring the finish cue, so one parent turn rings once however many delegates it runs. A question cue plays when
ask_user_questionor an approval starts waiting for you. A run of queued turns only rings once, at the end. - One setting for every session. Settings → General → Event sounds turns both cues on or off for this browser, sets the volume and previews either cue.
- Your own sounds. Either cue can be replaced with an audio file of up to 2 MB and 10 seconds that the browser can decode (WAV, MP3, OGG, …). The file stays in this browser's IndexedDB; Use built-in returns to the shipped clip.
- Generated clips. Both cues are WAV files generated with MOSS-SoundEffect-v2.0 (Apache-2.0) and ship inside the plugin, so they play offline.
Cues
| Event | Sound | Clip |
|---|---|---|
| Turn finishes | Two bright marimba notes one step apart | assets/finish.wav |
| Agent asks | Two quick bright marimba notes going up, higher and softer than the finish cue | assets/question.wav |
Exact prompt and seed for each clip are in CLIP_PROVENANCE in lib/sounds.js.
Install
Use the DSH plugin manager (Plugins → Add plugin) with the spec:
github:mkpoli/dsh-finish-sound
Or install from the command line and add the bundle to the profile:
dsh plugin --profile web add github:mkpoli/dsh-finish-sound
Then add "dsh-finish-sound" to dsh.profile.bundles in ~/.dsh/profiles/web/package.json and restart dsh web. The package ships cordis.patch.yml, which inserts the loader entry; the browser half loads through the package's dsh.client declaration.
A prebuilt tarball is attached to the release:
dsh plugin --profile web add https://github.com/mkpoli/dsh-finish-sound/releases/latest/download/dsh-finish-sound.tgz
For a local checkout, link:/path/to/dsh-finish-sound works the same way.
Behaviour
- Browsers keep audio locked until the page has had a user gesture. A cue that fires before then plays on the next click or key press unless a new turn has already started.
- A snapshot that ends a turn and asks a question at the same time plays the question cue only.
- A subagent Session never rings the finish cue. The parent turn rings once, when its own turn ends.
Development
npm test # clips, generated catalogue, bundle freshness
npm run build # regenerate lib/sounds.js and lib/client.js from assets/ and src/
The browser bundle is generated. Replace a clip in assets/, edit src/client.js, then run npm run build: lib/sounds.js embeds each clip as a data URL and lib/client.js registers the plugin module and that catalogue in one file, because the client module loader resolves only modules a bundle registered.
The clips were generated locally with MOSS-SoundEffect-v2.0 from the prompts and seeds in CLIP_PROVENANCE (the seed goes to the pipeline's seed argument), then mastered: 30 Hz high-pass, trim, fades, peak normalization, mono PCM16. The question cue is set to 80% of the finish cue's RMS.
License
MIT. The clips are model output of an Apache-2.0 model.
Links
More in this category
xmanrui/dsh-im★ 3118
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
shaobeichen/dsh-pocket★ 2685
Remote phone access to the DSH Web UI: scan a QR code for LAN or public (cloudflared tunnel) access with real-time sync, a mobile-adaptive layout, and a settings tab.
OpenPetsHQ/openpets#dsh★ 1373
Bridges DeepSeek Harness lifecycle status, errors, and approval requests to a locally running OpenPets desktop companion.
c1overzz/dsh-bili-scroll★ 1150
Let your DSH agent browse Bilibili on its own, read subtitles, write a daily digest, and @ you when it finds something worth your attention.
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 599
Connects DeepSeek Harness to Avernet's Bot Collaboration Network over WebSocket V2, with automatic onboarding, isolated agent sessions, tool-call events, and multi-bot routing tools.
zaofan-make/dsh-qqbot★ 213
QQ official bot channel for DeepSeek Harness (feature-rich fork of tencent-connect/dsh-qqbot): group and private chat with the full agent, sticker library with auto-tagging and AI meme replies, group management (join approval and mute), botplay interactive card events with paginated catalogs, user extension registry (custom slash commands and QQ tools), scheduled wakeups, remote approvals over QQ, and a floating dock web UI.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.