dsh-turn-chime:在用户任务真正完成时响一声

前言

在 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"

触发条件(三者同时满足)

  1. 收到 session/event 的 user/message,且 source.kind === "user"(时间上下文注入、子智能体反馈、hook 注入不算);
  2. 收到 session/event 的 turn/end,且 reason.kind === "completed"(aborted、error、blocked、触达 max-tokens 不响);
  3. 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。

典型用法

  1. 按上一节完成安装并重启 DSH。
  2. 打开 Settings → Chime,开启 Enable chime,选 Voice 和 Volume。
  3. 在对话里发送一条用户消息,等待任务正常跑完;应听到一声提示。若中途点停止或报错,不应响。
  4. 需要排查时,看设置里 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye