前言¶
在 DeepSeek Harness(DSH)里跑长任务时,你往往不会一直盯着界面。常见做法是轮询 api-session/status,看智能体是否从 busy 回到 idle,再当作「做完了」去处理后续事情。这个信号有两个盲区:用户点停止、运行报错或被 hook 拦截时,状态同样会变 idle,和正常结束无法区分;一次用户任务还可能经历多个 driver(子智能体回传、goal 轮次继续等),每停一个 driver 就会 idle 一次,容易误响多次。
下面介绍社区客户端插件 dsh-turn-chime(维护者 MacilyDots,GitHub:MacilyDots/dsh-turn-chime)。它在主机侧根据会话事件判断「用户发起的任务是否正常结束」,再通过 SSE 通知浏览器用 Web Audio 合成提示音,尽量做到只响一次、且不在中断时响。
这是什么¶
dsh-turn-chime 是 DSH 的会话完成提示音插件,分类为客户端。主机负责判定何时该响;声音在渲染进程播放;音色由 Web Audio 现场合成,不依赖音频文件。
社区目录页:skillhub.cn/plugins/MacilyDots/dsh-turn-chime。目录站点与 DeepSeek / 幻方无官方从属关系;DSH 生态本身是「一切皆插件」的思路,安装第三方插件前建议自行查看源码与许可证(本插件为 MIT,当前 package 版本 0.2.0)。插件在当前 DSH 进程权限下运行,安装前请确认你信任该仓库。
核心功能¶
与直接看 idle 的差异¶
| 问题 | 仅看 api-session/status |
dsh-turn-chime |
|---|---|---|
| 正常结束 vs 中断 | 无法区分 | 仅 turn/end 且 reason.kind === "completed" 才计入 |
| 多 driver 一次任务 | 可能多次 idle | 一条用户消息对应一次 pending,首次响铃后消费 |
| 谁发的消息 | 客户端只有 busy 布尔值 | 主机校验 user/message 且 source.kind === "user" |
触发条件(三者同时满足)¶
- 收到
session/event的user/message,且source.kind === "user"(时间上下文注入、子智能体反馈、hook 注入不算); - 收到
session/event的turn/end,且reason.kind === "completed"(aborted、error、blocked、触达max-tokens不响); agent/status变为idle(一个 driver 完全停下)。
判定结果经 SSE 推送到客户端路径 /dsh-turn-chime/events。
客户端设置¶
在 DSH 界面 Settings → Chime 可配置:
| 项 | 说明 |
|---|---|
| Enable chime | 总开关 |
| Voice | Crisp ding / Bell / Short pluck / Short beep / Water drop / Xylophone / Retro two-tone / Soft bass / Muted |
| Volume | 0–100%,松开滑块时自动试听 |
| Ignore subagent sessions | 默认开启;子智能体结束不计入「用户在等的那件事」 |
| Event channel | 显示 SSE 是否连接、已响次数 |
配置保存在浏览器 localStorage,键名 dsh-turn-chime:config:v1。
架构要点¶
声音只能来自渲染进程:主机侧若直接播放到系统,要么冷启动外部播放器(延迟大),要么只能用 Electron shell.beep()(无法选音色)。Web Audio 无额外依赖、延迟低、跨平台。
判定只能放在主机:turn/end 的 reason、user/message 的 source 只在主机事件总线上;客户端拿到的 session status 不足以区分「完成」与「被停止」。
主要文件:lib/index.js(主机判定与路由)、lib/client.js(SSE、Web Audio、设置面板)、install.mjs(安装脚本)。
安装与启用¶
将仓库放到任意目录后,在仓库根目录执行(命令来自官方 README):
node install.mjs # 安装到 %DSH_HOME%\profiles\desktop
node install.mjs web # 安装到命名 profile(可多次指定不同 profile)
node install.mjs X:\path\to\profile
安装脚本会:在对应 profile 的 package.json 写入 file: 依赖;把插件名加入 dsh.profile.bundles;在 node_modules/<plugin> 下创建指向本仓库的 junction(改源码即生效,无需再拷贝同步)。
安装后必须重启 DSH。客户端模块清单在启动时生成,不重启插件不会加载。
卸载:从 dsh.profile.bundles 去掉对应行,再删除 node_modules/dsh-turn-chime。
典型用法¶
- 按上一节完成安装并重启 DSH。
- 打开 Settings → Chime,开启 Enable chime,选 Voice 和 Volume。
- 在对话里发送一条用户消息,等待任务正常跑完;应听到一声提示。若中途点停止或报错,不应响。
- 需要排查时,看设置里 Event channel 的 SSE 状态与响铃计数。
浏览器控制台调试(README 提供):
__dshTurnChime.play('chime', 0.6) // 手动试听
__dshTurnChime.status() // { connected, chimes, config }
__dshTurnChime.onChime('x') // 模拟完成事件,应响一次
主机侧日志默认路径:
%DSH_HOME%\logs\dsh-turn-chime.log
正常结束一段日志大致包含 client-ready、sse-open、chime、play(且 ok:true)。同插件还提供:
GET /dsh-turn-chime/events— SSE 完成事件流GET /dsh-turn-chime/log— 最近 120 行日志POST /dsh-turn-chime/clear— 清空日志
逻辑测试可在仓库根目录运行:
node test/test-logic.mjs # 或 npm test
覆盖场景包括:正常结束响铃、用户中断静音、仅时间上下文注入静音、一条消息两个 driver 只响一次、错误静音、中断后新消息再完成再响。
适用场景与注意¶
适合:长时间让 DSH 在后台跑任务、希望「真正做完」时有可听反馈、又不想被误 idle 或子智能体多次结束打扰的开发者。
局限(README 已说明):
- 仅在浏览器渲染进程发声,DSH 完全关闭时没有声音。
- 依赖 DSH 内部事件形态(
session/event、agent/status);大版本升级后可能需要同步改lib/index.js。 - 默认只对
completed响;若希望错误也用另一种音,需改lib/index.js中的CHIME_REASON。
安全与信任:插件会订阅会话事件并在本地写日志、开 SSE;安装前请阅读 GitHub 仓库 源码,确认符合你的环境策略。
结尾¶
dsh-turn-chime 把「完成」从单纯的 idle 里拆出来:主机看用户消息与 turn 结束原因,客户端用 Web Audio 响一声,并可在设置里选音色与音量。若你正在 DSH 里做智能体开发、又需要可靠的完成提醒,可以从目录页或 GitHub 获取仓库,按 install.mjs 装入 profile 后重启即可试用。
- 目录页:https://www.skillhub.cn/plugins/MacilyDots/dsh-turn-chime
- GitHub:https://github.com/MacilyDots/dsh-turn-chime