dsh-client-ui-notify
No description
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 19, 2026
- Updated
- Aug 19, 2026
Introduction
@joeytisaly/dsh-client-ui-notify
English | 中文
Notification sound for DeepSeek Harness web: plays an audible cue when a user-decision interaction appears — an approval request, a plan review, or an ask_user_question question. The web surface otherwise announces these only as composer popups, which a user looking away from the tab cannot see; this plugin gives the popup an ear.
Quick start
# 1) install into your web profile (it uses pnpm)
cd "$DSH_HOME/profiles/web"
pnpm add @joeytisaly/dsh-client-ui-notify
# 2) append one loader row to the profile patch file
# ($DSH_HOME/profiles/web/cordis.patch.yml — create it if missing):
# - insert:
# - id: ui-notify
# name: '@joeytisaly/dsh-client-ui-notify'
# 3) restart
dsh web
Then: Settings → General → Notification sound (通知声音) to enable, set volume, and preview. Full details below.
How it works
The plugin is a read-only observer: it subscribes to the session-list snapshot (ctx.sessions.list) that dsh-client-runtime keeps warm for every session, and cues exactly when a session's pendingInteraction transitions from absent to present. It issues no RPC and holds no state beyond a seen-set of pending interactions plus its own settings. The boot-time baseline is registered silently, so refreshing the page over an already-pending approval does not re-alert; a reconnect replay of the same request is likewise quiet, while a genuinely new request cues again.
The cue is a two-note ascending chime synthesized with the Web Audio API — no audio asset, no dependency. Because browsers gate AudioContext behind a user gesture, the first audible cue requires one prior click or keypress on the page (a one-time unlock); afterwards every cue plays.
Requirements
- A DeepSeek Harness web deployment built from a source baseline ≥ 0.1.0-rc.6 (the npm
@deepseek-ai/dsh-*@^0.1.0-rc.8line). The plugin declares the dsh client packages as peer dependencies — the host provides them from its module table at runtime.
Install (end users)
Add the package to your web profile and insert one loader row:
cd "$DSH_HOME/profiles/web"
pnpm add @joeytisaly/dsh-client-ui-notify
Edit $DSH_HOME/profiles/web/cordis.patch.yml (create it if missing):
- insert:
- id: ui-notify
name: '@joeytisaly/dsh-client-ui-notify'
Restart with dsh web (or dsh --profile web). For a temporary overlay without touching the profile, run dsh web --patch ./notify.yml with the same row.
npm note: if you install with plain npm instead of pnpm, npm ≥ 7 auto-installs peer dependencies and may hit a resolver bug on this peer graph — use
npm i --legacy-peer-depsor pnpm (the profile already uses pnpm).
Settings
Settings → General → 通知声音 (Notification sound):
enabled— master switch (default on).onlyWhenHidden— cue only while the document is hidden (default off: cue on every new decision popup).volume— output volume as a percentage0-100(default 80), committed on Enter/blur, with a preview button.
Preferences persist in the host user-settings document ($DSH_HOME/settings.yaml).
Compatibility warning: the settings row's writability depends on the host's api-proxy exposing the
ui-notifysettings namespace (itsWEB_SETTINGS_NAMESPACESallowlist). The sound works on every host; the settings row stays disabled on hosts whosedsh-host-apiproxydoes not yet includeui-notifyin that allowlist — that includes the current npm release line (0.1.0-rc.8). Until a release carrying the allowlist change lands, you can still change the settings by editing$DSH_HOME/settings.yamldirectly.
Development
npm install --legacy-peer-deps # dev deps resolve from the npm @deepseek-ai rc line
npm run build # tsc (lib/types) + tsdown (lib/index.js, lib/client.js)
npm pack # inspect the publish tarball
npm publish # requires an npm account with the @joeytisaly scope
The browser bundle is self-contained except for the host module-table externals (react, cordis, dsh-client-runtime/client, …), which the host answers at runtime — the plugin never needs those packages installed in its own node_modules.
Model Experience
None: the package plays a sound for a human and touches no prompt, message, schema, stream, or tool result.
License
MIT