You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Web Playback Selector: the header bell now opens a compact notification settings popover — a Notifications On/Off switch plus a Playback radio group (Browser / Backend / None). Changes apply immediately and persist atomically to ~/.config/dsh/notify-bell.json (no restart); the backend config is the single source of truth.
Browser playback (default): the backend classifies events and pushes the semantic sound over SSE (GET /notify-bell/events); the DSH Web UI plays the matching WAV (/notify-bell/sounds/*.wav, served from the package) via Web Audio. Autoplay unlock takes one user gesture.
Backend / None: backend plays on the host (BEL or WAV via soundPack); none keeps logs only.
Migration
Default playback changed to browser. Deployments upgrading from v0.11.x without an explicit playback now play in the DSH Web browser instead of the host. Terminal-only setups: set "playback": "backend" (or "none" for logs only) in ~/.config/dsh/notify-bell.json or via the popover.
API
GET /notify-bell → { ok, value: { enabled, playback }, version }
POST /notify-bell/setEnabled / POST /notify-bell/setPlayback (invalid 400, write failure 500 with runtime unchanged) / POST /notify-bell/toggle
Quality
Locale dictionary registered inside ctx.effect (HMR-safe); official DSH locale service for zh/en; dsh.client.inject declares @deepseek-ai/dsh-client-locale.
Browser sound map covers default (→ done.wav); SSE heartbeat stops when idle, connection cap (8) with 503; client GET failure has a retry path via the popover.
Tests: 6 node:test cases (179 assertion checks in the unit script + 5 session-layer integration), all passing; 30 files packed.