agent 回合结束时在浏览器标签页里播放一声合成的叮,纯前端 Web Audio 发音,不经过后端、不弹系统通知。
安装
# npm 包(预构建)
dsh plugin --profile web add @falling-ts/dsh-web-ding
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:falling-ts/dsh-web-ding
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
一个 DSH Cordis 插件:当 agent 回合结束(所有轮次安静、转入空闲)时,在 浏览器里播放一声"叮"。声音完全由前端 JavaScript(Web Audio API)合成—— Node/后端从不发声,也不走 Windows/系统通知。
架构参照 dsh-force-compact:
纯监听器的 Host 半部 + 浏览器 client 半部,之间用官方
settings/document-updated 镜像通道相连。
工作方式
| 层 | 行为 |
|---|---|
Host(index.js + src/) |
监听 agent/status 的 idle 转变(全部轮次与子代理结束、下一次人为对话之前;新建会话从未运行过的首次 idle 与重复 idle tick 都保持静默)。向 falling-ts-web-ding 设置命名空间写入 { phase:'done', at, sessionId, title }——title 在这里从官方 sessionProjections 的 title 投影读出,浏览器因此无需自己去取。绝不发声、绝不调用系统。 |
浏览器(web/client.js) |
经 configForms 实时镜像命名空间;收到 at 严格更新的 done 信号后用 Web Audio API 合成一声短"叮",经标签页播放——同一瞬间在右下角弹出 Win11 风格 toast。点击 toast 展开右侧消息列表,展示全部回合结束消息(存在浏览器 localStorage,上限 100、按 signal at 去重),支持单条删除与全部删除。全程纯前端:后端不发声、不弹系统通知。 |
除了提示音,每次回合结束还会在右下角弹出一条 Win11 风格 toast(6 秒自动消失)。点击它即可打开右侧消息列表:最近 100 条回合结束消息保存在浏览器 localStorage(键 falling-ts-web-ding.notify.v1),每条可单独删除,顶部"全部删除"按钮一键清空。消息记录纯前端——Host 不读也不写。
安装
dsh plugin --profile web add github:falling-ts/dsh-web-ding
(需要 Web 应用带上 client bundle——package.json 的 dsh.client 声明会自动
完成。)
配置(falling-ts-web-ding 命名空间,写进 profile 的 cordis.patch.yml)
两块独立配置,各自有开关与音色:
块 1 — 弹出用户选择 —— harness 弹出用户选择题时在浏览器播放一声"叮"。
检测在浏览器侧完成(DOM 上 QuestionComposer 的 [data-question-key] 锚点):
宿主看不到 question 帧,故本块完全由前端实现。
| 字段 | 类型 | 默认 | 含义 |
|---|---|---|---|
questionEnabled |
boolean | true |
弹出用户选择提示音开关。 |
questionVolume |
number 0..1 | 0.7 |
Web Audio 播放音量。 |
questionFreq |
number 80..4000 | 880 |
"叮"的基频(Hz)。 |
questionDecayMs |
number 100..4000 | 900 |
音色衰减时长(ms)。 |
块 2 — 回合结束 —— 经典的 agent/status idle 转变提示音。Host 观察
agent/status,在 idle 转变(全部轮次与子代理结束、下一次人为对话之前;
新建后从未运行过的会话与重复 idle tick 保持静默)时发布 done 信号。
| 字段 | 类型 | 默认 | 含义 |
|---|---|---|---|
turnEndEnabled |
boolean | true |
回合结束提示音开关(关闭时 Host 跳过发布)。 |
turnEndVolume |
number 0..1 | 0.7 |
Web Audio 播放音量。 |
turnEndFreq |
number 80..4000 | 880 |
"叮"的基频(Hz)。 |
turnEndDecayMs |
number 100..4000 | 900 |
音色衰减时长(ms)。 |
浏览器自动播放策略
浏览器要求一次用户手势后才允许出声。客户端在首次指针/按键交互(以及点击
"试听"按钮)时预热 AudioContext,所以:与页面交互一次(或点一下试听),之后
每次回合结束就能听到叮。后台标签页里的 AudioContext 可能被浏览器自身挂起——
保持标签页可见才能听到声音。
开发
# 作为开发覆盖层挂载(plain JS,无构建步骤)
dsh web --patch $(pwd)/cordis.patch.yml # 你的 CLI 支持该选项时
# 或从本地路径安装
dsh plugin --profile web add /path/to/dsh-web-ding
插件自身规则见 AGENTS.md(纯 Host 监听器、后端不发声、不弹系统通知、只用
官方 settings 镜像通道通向浏览器)。
效果截图

设置页——「提示音配置」分区:「弹出用户选择」与「回合结束」两块,各自 开关、音量、频率、衰减时长,免重启实时可调,各带"试听"按钮预热浏览器 AudioContext。
License
MIT
链接
同类插件
xmanrui/dsh-im★ 1862
通过二维码或机器人凭据将 IM 机器人接入 DeepSeek Harness(支持飞书、微信、钉钉、企业微信、QQ、Slack、Telegram、Discord 和 WhatsApp 共 9 种渠道)。
shaobeichen/dsh-pocket★ 1671
手机远程访问 DSH Web 界面:扫码即用局域网或公网(cloudflared 隧道)访问,实时同屏、移动端适配布局,带设置页管理。
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 636
通过 WebSocket V2 将 DeepSeek Harness 接入 Avernet Bot 协作网络,支持自动注册、Agent 会话隔离、工具调用事件和多 Bot 路由工具。
omdsh-dev/dsh-notification★ 88
回合完成桌面通知,按结果分控 + 关键词过滤。
Oscar-Williams/dsh-deepcanary★ 84
面向 DeepSeek Harness 的证据优先注意力监督,提供 C0–C3 策略、去重 Inbox 提醒、静默时段和脱敏结果记录。
whyihaveyou/dsh-suite#plugin-notify★ 59
回合完成、错误或待审批时推送 IM webhook(飞书/企微/钉钉/Slack/Discord/自定义)与本地通知。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。