Back to home@Joeytisaly

dsh-client-ui-notify

No description

Stars
0
Language
TypeScript
Created
Aug 19, 2026
Updated
Aug 19, 2026
GitHub repo

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.8 line). 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-deps or 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 percentage 0-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-notify settings namespace (its WEB_SETTINGS_NAMESPACES allowlist). The sound works on every host; the settings row stays disabled on hosts whose dsh-host-apiproxy does not yet include ui-notify in 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.yaml directly.

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