Introduction

DeepSeek Harness (DSH) provides a Web UI for agent development. During operation, it can be difficult to notice when the agent receives a message, starts thinking, calls a tool, or ends a turn. The dsh-sound-notifier plugin addresses this issue by playing synthesized alert sounds in the Web UI.

Plugin Overview

This is a DSH plugin that plays alert sounds in the Web UI based on agent state changes. It synthesizes sounds using the Web Audio API, so no external audio resources are required.

Features

The plugin plays alert sounds at the following moments:
* Message received: Plays two short beeps (660 Hz → 990 Hz).
* Thinking started: Plays an ascending tone (392 → 784 Hz, triangle wave).
* Tool called: Plays a clear double beep (233 Hz → 311 Hz, triangle wave).
* Turn ended: Plays a major triad arpeggio (C5–E5–G5).

Additional features:
* Only top-level sessions play sounds; subagents remain silent.
* Sounds are synthesized using the Web Audio API, with no audio assets required.
* Events that have already been played are not replayed after a page refresh (implemented via sessionStorage).

Installation and Enablement

Run the following command from the root of the DeepSeek Harness repository:

pnpm dsh plugin --profile web add /path/to/dsh-sound-notifier

After installation, restart DSH to load the plugin.

Configuration and Usage

After the plugin is loaded, you can customize sounds by editing the SOUNDS table in client.js.
* Edit configuration: Modify parameters such as freq (starting frequency), endFreq (ending frequency), dur (duration), type (waveform), and gain (volume).
* Validate configuration: To verify that configuration changes have taken effect without restarting, you can use:

pnpm dsh --profile web --dump-config

How It Works and Limitations

  • Polling latency: There is an approximately 400 ms delay between event triggering and sound playback.
  • Web server dependency: The fixed endpoint /sound-alerts/events depends on webServer; polling cannot occur without a webServer.
  • Session filtering: Only top-level sessions (agent.owner === undefined) play sounds; subagent pages remain silent.
  • Internal calls skipped: Internal LLM calls (such as compaction and session-title) do not trigger the thinking sound.
  • Browser restrictions: Due to browser autoplay policies, the audio context is created on demand.