dsh-plugin-task-notify
Manifest validLong Task Completion Audio Alert Plugin: plays a "beep" when a subtask completes and a "ding" when a full round completes, with configurable threshold/volume/multi-session global settings (pure frontend, zero host changes)
dsh-plugin-task-notify
Long-task audio reminder for DeepSeek Harness — a short "beep" when a sub-agent finishes, a clear "ding" when the whole turn is done and you should come back. Pure browser-side; works with any AI provider.
DSH(DeepSeek Harness)长任务完成提醒:你发出消息不响;子任务(子代理)完成响一声"嘟";整轮任务跑完、该回来操作了,响一声"叮"(附带可选标题闪动 / TTS 播报)。纯浏览器端做提醒,和你用哪家 AI 模型无关。
Features / 特性
- Beep on sub-task / 嘟(子任务完成): listens for sub-agent tool calls (
subagent,subagent_fork, etc.) settling; plays a short beep per completion, with an automatic merge window for rapid consecutive ones. - Ding on turn end / 叮(整轮完成): starts a timer when the turn begins; if the turn runs past a configurable threshold (default 5 min), plays a rising two-tone ding when the agent returns idle — the signal to come back. Short turns stay silent.
- Multi-session / 多会话全局: monitors all sessions by default; configurable to current session only.
- Self-contained audio / 声音自包含: Web Audio API synthesis, no external assets; optional TTS via
speechSynthesis(off by default) with customizable template — use{time}as a placeholder for the actual duration. - Two-half structure / 两个半结构: Host half registers the settings namespace; Client half runs the browser reminder.
Install / 安装
From the plugin market / 从插件市场安装
dsh plugin add dsh-plugin-task-notify
Restart dsh web and the settings card appears under Settings → Plugins.
Manual install / 手动安装
- Build (or use the pre-built
lib/artifacts):pnpm install && pnpm buildThe
lib/directory ships pre-built; only rebuild after modifyingsrc/. - Copy the whole package into the DSH profile:
<dsh-home>/profiles/web/node_modules/dsh-plugin-task-notify/ - Add a
cordis.patch.ymlentry to the profile (theinject: [settings]line is required):- insert: - id: task-notify name: dsh-plugin-task-notify inject: [settings] config: enabled: true thresholdMinutes: 5 - Restart DSH. The settings card appears under Settings → Plugins.
⚠️ The
inject: [settings]line is critical. Without it the cordis loader never waits for the settings service, so the host half'sapply()runs but the namespace never registers — and the settings card silently does not appear. See Troubleshooting below.
Configuration / 配置项
| Field | Meaning | Default |
|---|---|---|
enabled | Master switch | true |
thresholdMinutes | Turn-end ding threshold (minutes) | 5 |
subReminderEnabled | Sub-task beep switch | true |
mergeMs | Consecutive sub-task merge window (ms) | 500 |
masterVolume | Ding volume, 0..1 | 0.6 |
subVolume | Beep volume, 0..1 | 0.5 |
ttsEnabled | TTS readout (default off) | false |
ttsTemplate | TTS template, {time} = actual duration | 任务完成,用时约 {time} 分钟 |
titleFlash | Title-bar flash on turn end | true |
globalSessions | Monitor all sessions | true |
batchSingleBeep | Single beep per turn for all sub-tasks | false |
Sound trigger rules / 声音触发规则
- You send a message: silent.
- Sub-task completes: a sub-agent-family tool call disappears from
runningCalls→ short beep. Merge window deduplicates rapid completions;batchSingleBeepmakes one beep per whole turn. - Turn ends: session goes from running to idle AND the timer ≥ threshold → rising two-tone ding + optional title flash + optional TTS using your custom template (with
{time}replaced by actual duration).
Browser notes / 浏览器注意
- Needs one user gesture (click/keypress) before audio plays — click the page or send a message first.
- TTS may be throttled in background tabs; Web Audio beeps/dings are unaffected.
- Stops when the page closes; DSH host keeps running but sound needs the browser open.
Compatibility / 兼容性
- Targets DSH
0.1.0-rc.8client contract (same baseline asdsh-plugin-agent-workflow). - Uses only public session snapshots (
sessions.list,running,runningCalls) and standard settings slots. - Settings card staleness fix (0.2.1, 2026-09): the card now receives the live bound settings scope and subscribes to it, so saved values render immediately (the slot renderer caches a one-shot
inject()snapshot forever). - DSH
0.1.2-rc.1snapshot-shape fix (2026-09): the client notifier previously readsnap.runningCalls/snap.turnTimingsas flat fields, but on0.1.2-rc.1SessionSnapshotonly exposesrunning(running-call tree / turn timings moved into the chat viewviews.get('chat')?.legacy). Reading the flat field threwTypeError: items is not iterableinsidewalk→ everySessionTracker.adopt()died →trackers= 0and the whole notifier was silent, with the error repeating on every sync. Fix: addedrunningCallsOf()/turnTimingsOf()adapters that readviews.get('chat')?.legacy?.runningCallsfirst, fall back to the flat field, and degrade to empty on absence;walknow guardsArray.isArray. On0.1.2-rc.1the turn-end "叮" works (it only needsrunning); the sub-agent "嘟" is a silent no-op there because the running-call tree is not reachable throughsessionswithout the chat-view service.
Troubleshooting / 排坑
Card shows stale values right after Save (controls look like they "did not work" even though the settings file actually updated):
The DSH slot renderer caches each slot entry's inject() result per registration (dsh-client-ui-renderer cachedRootInject, a WeakMap keyed by the entry). The settings card therefore receives whatever the inject closure returned on first render, forever. The 0.2.0 card was injected a one-shot value snapshot, so after Save (which writes via the live scope.set) the card fell back to the frozen snapshot and displayed the pre-save state. Fix (0.2.1): the inject closure hands the card the live bound settings scope instead of a snapshot; the card subscribes to it (scope.subscribe + scope.getSnapshot().value) and re-reads after every settled write, so Save updates the card without a reload.
Settings card does not appear even though the plugin shows as mounted and active in the plugin list:
The cordis loader reads inject from the patch line only, not from the plugin module's export const inject. If the patch line omits inject: [settings], the host half's apply() runs but any async delay (like installSettingsSection) never fires — the settings namespace is never registered, and the card never appears. Fix: add inject: [settings] to the patch line and use synchronous ctx.settings.register() in apply().
License
MIT © DearMrChai
Comments
Loading…
From the same category
by nexu-io
🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. 🖼️ Your coding agent becomes the design engine: prototypes, landing pages, dashboards,
★ 98.5k
Apache-2.0
TypeScript
Sep 28, 2026
by Molunerfinn
:rocket: The Ultimate Image Uploader for Efficient Creators. Supports Obsidian, Typora, VS Code etc. and 60+ image hosting services (S3, GitHub, Cloudflare R2, Imgur, Aliyun OSS...). Paste, upload, d
★ 27.3k
MIT
TypeScript
Sep 24, 2026
by zhu1090093659
DeepSeek Harness (DSH) Web Plugin Aggregation Ecosystem · Everything is a plugin, distributed via the Creative Workshop
★ 8.1k
Apache-2.0
TypeScript
Sep 28, 2026
dsh plugin --profile web add dsh-webby YaoApp
✨ All your agents and workspaces in one place, on every device you own. Track tasks on a board, accessible from desktop, mobile, browser, or API. Self-hosted.
★ 8k
Go
Sep 28, 2026
by omdsh-dev
开放的侧边栏底座,支持三方拓展注册新侧边栏页面。内置文件渲染编辑/终端/侧边对话/Git/子代理页面 | Open sidebar foundation, supports third-party extensions to register new sidebar pages. Built-in file rendering/editing, terminal, side chat, Git,
★ 3.9k
↓ 51.6k/wk
MIT
TypeScript
Sep 28, 2026
dsh plugin --profile web add dsh-better-sidebarby ccch1mneyyy
DSH 官方公众号收录的 TUI 补位插件:Claude Code 风,鲸鱼顶栏/实时状态/流式思考/双击 Esc 回滚/上下文进度+TPS。npm 一键装。 DSH official WeChat featured TUI plugin — Claude Code style: whale bar, live status, streaming thoughts, double-Esc rol
★ 3.7k
↓ 8.2k/wk
MIT
TypeScript
Sep 28, 2026
dsh plugin --profile terminal add @deepseek-harness-tui/dsh-tui