Blaczz/dsh-soundscape
DeepSeek Harness Web UI 音景:回合完成庆祝(合成器提示音 + 五彩纸屑)、阻塞/批准提醒、错误蜂鸣声、打字氛围音。零音频资源,零核心改动,外加一个 ctx.soundscape 服务。
Project Overview项目介绍
This is a web plugin for DeepSeek Harness (DSH). It adds audio feedback for different conversation stages, including celebration fanfare with confetti for completed turns and alert tones when waiting for user input. All sounds are generated via WebAudio with no external assets required. Install it for auditory feedback in DSH conversations, and restart dsh web after installation.
这是DeepSeek Harness(DSH)的网页端音频插件,可为对话不同阶段提供对应音频反馈,比如回合完成的庆典音效加彩屑、等待用户的提示音,所有音效由WebAudio实时合成,无需额外音频文件。需要给DSH对话添加听觉反馈时可使用,安装后需重启dsh web生效。
请帮我了解并安装插件:【dsh-soundscape】【https://github.com/Blaczz/dsh-soundscape】
Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。
Or use CLI install (for developers)或使用命令行安装(适合开发者)
CLI Install命令行安装
dsh plugin --profile web add "github:Blaczz/dsh-soundscape#main"
把 Blaczz/dsh-soundscape 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
dsh-soundscape 🔊
A session soundscape for the DeepSeek Harness Web GUI: turn-complete celebration (synthesized fanfare + confetti), blocked-on-user alerts, error buzz, send clack, and optional typing ambience. Zero audio assets, zero core changes, plus a
ctx.soundscapeservice for other plugins.
A DeepSeek Harness (DSH) web plugin that gives the agent's turns an audio identity: synthesized WebAudio feedback when a turn starts, succeeds, fails, or blocks on you — and a confetti burst when work completes. Every sound is generated live by oscillators and envelopes — no audio files, no network requests, no core modifications. Install, restart, and it works; tune it per-sound in the settings page.
✨ Features
| Event | Sound | Default |
|---|---|---|
| Turn started | send rebound clack send |
✅ |
| Turn completed successfully | celebration fanfare + confetti celebrate (or plain ding) |
✅ |
| Turn errored / interrupted | low buzz buzz |
✅ |
| Waiting on you (approval / question / plan review) | two-tone alert alert (1.5s throttle) |
✅ |
| Session opened | soft two-note greeting greet |
⛔ |
| Streaming output (optional) | typing ambience click (throttled + jittered) |
⛔ |
- Zero audio assets: pure WebAudio oscillator synthesis.
- Zero core changes: only official client-plugin seams (
conversation.input.dock/conversation.session.header.actions/settings.section). - Durable settings: the
soundscapesettings namespace, saved immediately. - Cross-plugin service:
ctx.soundscape.play(name)/ctx.soundscape.celebrate()for other client plugins. - HMR friendly: every registration is a
ctx.effect; hot reload cleans up automatically.
📦 Install
Prereqs: DeepSeek Harness (dsh web works), Node ≥ 22.19, pnpm.
# From GitHub
dsh plugin --profile web add "github:Blaczz/dsh-soundscape#main"
# Local directory (development)
cd dsh-soundscape && npm install --legacy-peer-deps && npm run build
dsh plugin --profile web add ./dsh-soundscape
# Local link
dsh plugin --profile web add link:./dsh-soundscape
Restart dsh web after install (a new plugin row needs one restart; later source changes ride HMR).
Git installs need
allowBuildsauthorization: if the firstadd github:...fails, put the package key underallowBuildsin~/.dsh/profiles/web/pnpm-workspace.yamlas dsh prints, then re-run; or publish a prebuilt npm package to skip build authorization entirely.
🎛️ Usage
- Install, restart, open any session, send a message:
- turn start → rebound clack;
- successful completion → fanfare + confetti (switch to a plain ding in settings);
- error/interrupt → buzz; waiting on your approval/answer → two-tone alert.
- The session header has a 🔊/🔇 quick mute toggle (durable across restarts).
- Settings → 🔊 音效: master switch, master volume, per-sound toggles with previews, and stream-cadence knobs.
🔌 For developers: the ctx.soundscape service
Other client plugins add soundscape to their inject and call:
export const inject = ['slots', 'soundscape']
export function apply(ctx: Context): void {
ctx.soundscape.play('celebrate') // one sound
ctx.soundscape.celebrate() // full celebration (sound + confetti)
if (!ctx.soundscape.isEnabled()) ctx.soundscape.setEnabled(true)
}
Sound names: click send ding celebrate buzz alert greet. Each is gated by its user setting and the master volume.
🛠️ Development
npm install --legacy-peer-deps # build deps
$env:DSH_NODE_MODULES = "$env:USERPROFILE\.dsh\profiles\node_modules"
npm run setup:dsh-workspace # symlink the runtime @deepseek-ai/* packages
npm run verify # ★ one-shot local gate (clean + typecheck + test + build)
npm run typecheck # typecheck src + tests
npm test # vitest (37 tests: state machine / synth / engine / settings / manifest)
npm run build # tsc + tsdown → lib/
dsh web --patch ./cordis.patch.yml # zero-install quick verification
npm run verify is the pre-push gate: the extracted pure state machine (turn-feedback.ts) plus mock AudioContext / fetch tests catch event-mapping, gating, and throttle bugs locally, no browser needed.
Layout
dsh-soundscape/
├── package.json # dual contract: dsh.bundle.patch + dsh.client
├── cordis.patch.yml # bundle patch layer (inserts this package)
├── tsdown.config.ts # client bundle (__ModuleLoader__.load + purity gate)
├── scripts/ # build / clean / setup-dsh-workspace
├── src/
│ ├── index.ts # host half: settings namespace + loopback HTTP API
│ ├── soundscape-settings.ts # shared settings model (schema + defaults)
│ ├── settings-api.ts # GET/PATCH settings API (loopback-only)
│ └── client/ # browser half
│ ├── index.ts # apply: ctx.soundscape service + slot injection
│ ├── SessionListener.tsx # conversation-snapshot diff → event sounds
│ ├── SoundEngine.ts # WebAudio engine (lazy AudioContext)
│ ├── synth.ts # pure synthesis primitives (oscillators + envelopes)
│ ├── confetti.ts # zero-dependency canvas confetti particles
│ ├── HeaderMute.tsx # session-header mute toggle
│ ├── SettingsSection.tsx # settings page (with previews)
│ └── settings-client.ts # settings API client
└── tests/ # manifest contract + settings patch validation
🧩 Ecosystem positioning
- Fills a gap: before this, the DSH ecosystem had no turn-complete sound/celebration effect and no blocked-on-user alert sound (desktop notifications are silent;
dsh-fun-typewritercovers only typing ambience). - Technical route: dual-sided client plugin (
dsh.client+ bundle patch), mirroringdsh-fun-typewriter's zero-asset WebAudio + plugin-owned settings API, extended with thectx.soundscapecross-plugin service (thectx.providepattern fromdsh-client-shortcuts). - Zero core changes: everything registers through
ctx.effect/ctx.slots.inject; HMR unload cleans up.
⚖️ License
MIT © 2026 Blaczz. An independent community plugin, not affiliated with DeepSeek Harness.
liustack/modlens
Clarklevis1995/dsh-mobile
ZSeven-W/dsh-crew
988hj7tczd-oss/dsh-computer-use
xiaoksio/dsh-solution-explorer
wsz987/dsh-channels