Back to home

ellelkktrraaa

dsh-audio-alert

dsh中断声音提示喵(可配置音频喵)Browser audio alerts for dsh attention edges: approval requests, ask-user questions, and finished turns.

Stars
1
Language
TypeScript
Created
Aug 14, 2026
Updated
Aug 14, 2026

Introduction

@deepseek-ai/dsh-client-audio-alert

English | 中文

Sound alerts for the moments a session needs you: an interrupted turn (approval request), a question, or a finished turn — a reminder to come back without keeping the tab in view. The node half registers the audio-alert settings namespace; the browser half subscribes to the session list and plays a sound on three attention edges: an approval request (pendingInteraction becomes approval or plan-review), an ask-user question (pendingInteraction becomes question), and a finished turn (a session's running bit flips true → false).

Sounds are configurable per trigger through the audio-alert settings namespace (Settings → plugin configuration, or the settings.yaml document). Each field is optional: enabled (default true), volume (default 0.8, in [0, 1]), approvalSound / questionSound / doneSound, and debug (default false). A sound field accepts a data URI, an http(s)/blob URL, a root-relative URL (leading /), or a local filesystem path. An empty field selects the built-in synthesized tone. debug: true logs the resolved config and each play to the browser console and the server log.

A local path (for example C:/sounds/alert.mp3, ~/sounds/alert.mp3, or ./alert.mp3) is read by the node half on the machine running dsh web and served to the browser over /audio-alert/audio/<kind>, so the browser never touches the filesystem itself. Write the path with no data: or file: scheme prefix.

Installation

Prerequisites — a dsh web deployment (DeepSeek Harness; the web profile is created on first use), Node ^22.19 || >=24, and pnpm. The plugin resolves its @deepseek-ai/* peers from the profile's own node_modules, so no extra packages are needed.

Installdsh plugin forwards its arguments to pnpm inside the profile directory:

# from GitHub (recommended; the build runs automatically on install)
dsh plugin --profile web add https://github.com/ellelkktrraaa/dsh-audio-alert.git

# or from a local checkout
dsh plugin --profile web add C:\path\to\dsh-audio-alert

# remove again (by package name)
dsh plugin --profile web remove @deepseek-ai/dsh-client-audio-alert

Configure — create an audio-alert: section in $DSH_HOME/settings.yaml (default C:\Users\<you>\.dsh\settings.yaml):

audio-alert:
  enabled: true
  volume: 0.8
  approvalSound: "C:/sounds/approval.mp3"   # empty = built-in tone; or a data:/http(s) URL
  questionSound: "C:/sounds/question.mp3"
  doneSound: "C:/sounds/done.mp3"
  debug: true

Then restart dsh web.

Verify — with debug: true, the browser console (F12) shows the resolved config and each alert:

[audio-alert] browser half mounted
[audio-alert] scope changed: {"status":"ready","writable":true,"value":{"enabled":true,"volume":0.8,...}}
[audio-alert] alert kind: approval

Trigger an approval, an ask-user question, or a finished turn and listen for the sound.

Host requirement for custom sounds — the browser reads the audio-alert settings namespace through the host API proxy, which only serves namespaces on an explicit allowlist. On the current DeepSeek Harness checkout this needs 'audio-alert' added to WEB_SETTINGS_NAMESPACES in packages/host/apiproxy/src/api-proxy.ts (a namespace absent there answers settings-not-exposed). Without it the plugin still plays built-in tones at the default volume, but the custom sounds are not read by the browser.

Troubleshooting

  • No [audio-alert] lines in the console → the browser is serving a cached client.js; hard-refresh (Ctrl+Shift+R) or open a fresh tab.
  • Scope stuck at "unavailable" → the host does not expose the audio-alert namespace (see the host requirement above).
  • Built-in tone plays but not the configured file → the path must exist and be readable on the machine running dsh web; the server log (debug: true) prints [audio-alert] serving approval from ... or the failure reason.
  • First sound is silent → the browser autoplay policy blocks playback until the page has had a user gesture; click anywhere once.

Compatibility Evidence

Following the dsh-plugin-radar evidence ladder, this repository carries evidence at every level:

LevelCheckStatus
L0 discoverytopic, visibility, metadatadsh-plugin topic set; repository public; keywords / homepage / repository present in package.json
L1 manifestpackage.json, name, entry fields@deepseek-ai/dsh-client-audio-alert; mainlib/index.js, exports["./client"]lib/client.js
L2 static compatpatches, seams, dependency rangesSeams: the audio-alert settings namespace (installSettingsSection), the /audio-alert/audio web-server route, and the browser sessions.list / settingsScope services. Peer dependencies are pinned to the 0.1.0-rc.x dsh family
L3 compile experimenttype/syntax check in a workspacepnpm typecheck (tsc -b) and pnpm build (tsc -b && tsdown) pass on Node 22/24
L4 runtime testinstall, load, minimal taskInstall via dsh plugin add (see the tutorial above); 37 unit tests pass; with debug: true the browser console logs [audio-alert] scope changed: {"status":"ready",...} and each alert kind

Known boundaries — the radar's own caveats apply here too: mainline and plugins change fast, so conclusions age quickly; a static pass does not guarantee runtime success; a compile failure can come from the environment or missing dependencies rather than real API drift; and the runtime checks above only cover the minimal path described here.

Model Experience

None, as the plugin only plays a browser sound on live session-list attention edges; nothing here reaches a model request.

KV Cache effect

None; this package neither assembles nor sends a provider request.

Known Limitations and Deferred Work

  • Done fires on the running edge — a turn ending for any reason (completed, error, aborted) announces once; the sound does not distinguish the reason.
  • Autoplay policy — the first sound can be suppressed until the browser has registered a user gesture on the page; playback rejection is contained, never retried.
  • First observation is silent — sessions already pending or idle at load do not replay their attention, matching the session list's own reminder semantics.
  • Local files are read on the server — the node half reads the file on the machine running dsh web, whole into memory, per request; a path is not portable to another machine.
  • Leading-slash paths are URLs — a /-prefixed value is a root-relative URL, never a local file, so a POSIX absolute path must be written ~-relative or cwd-relative instead.