dsh-notify-sound:DSH Web 对话与审批场景的提示音插件

前言

用 DSH(DeepSeek Harness)跑长对话或并行任务时,窗口往往不在前台:一轮生成结束、审批弹框弹出、或 ask_user_question / 计划确认等你点选时,如果没有明显反馈,很容易错过时机。常见做法是盯着界面或靠系统通知,但 DSH Web 本身并不自带「按事件响铃」这一类客户端能力。

下面介绍社区插件 dsh-notify-sound(维护者 Fur1naaaaaaaa,分类:客户端):在主机侧监听 DSH 会话事件,经本机 HTTP/SSE 推到浏览器,用 Web Audio 现场合成提示音,并附带设置页与可选的气泡、标题闪烁兜底。

这是什么

dsh-notify-sound 是给 DSH Web 加的提示音插件:在「对话完成」「需要你授权」「弹出提问或计划确认」等时刻响一声,把你从别的窗口叫回来。音频不依赖外部文件和 npm 依赖包(dependencies 为空),四段音色在浏览器里用 Web Audio 合成。

会在什么时候响

README 用表格把触发时刻、默认音色和检测来源写在一起,核心如下。

触发时刻 默认提示音 检测来源
一轮对话完成 两声上行清亮音(A5 → E6) session/event 的 turn/end,reason=completed
需要你授权 三声急促方波(C6 C6 F6) approval/request(审批弹框出现的那一刻)
弹出提问 / 计划确认 两声询问音(E5 → B5) user-questions/request(ask_user_question 与 plan-review 都走它)
出错 / 被拦截 / 超长结束 两声低沉警示音 同一个 turn/end,reason 为 error、blocked、max-tokens 等

子代理(subagent / workflow 子会话)的轮次结束默认会被 skipSubagents 过滤,避免多智能体协作时连环响。用户主动停止导致的 aborted / interrupted 默认不在 turnEndReasons 里,避免自己按停止还被提醒。

核心能力

设置界面(推荐入口)

装好后打开 设置 → 插件 → 提示音(在「插件市场」旁边):

  • 音量滑杆:拖动即时生效,并写入 ~/.dsh/dsh-notify-sound.json;
  • 四个试听按钮:完成 / 提问 / 授权 / 异常;
  • 「什么时候响」:对话完成、需要授权、弹出提问/计划确认三个开关,以及忽略子代理、只在后台响、总开关;
  • 提示气泡策略(auto / always / never)与「后台时闪烁标题」;
  • 若浏览器 localStorage 里有本机覆盖(例如点过气泡上的「静音」),页面会提示并提供「清除本机覆盖」。

保存后无需刷新页面:页面内已运行的脚本会重拉配置。想确认设置页是否挂上,可看 /dsh-notify/ping 返回里的 ui.module.tabRegistered。

传输与合成

主机侧 lib/index.js 监听 session/event、approval/request、user-questions/request 等,把通知递增 seq 后推到浏览器;浏览器侧优先走 SSE /dsh-notify/stream,连不上则退回 pollMs 轮询 /dsh-notify/events,避免后台标签页定时器被节流后提示音迟到。同一条通知靠 seq 去重;插件重载时用 bootId 重置游标,避免失聪或补播旧代次的提示。

自动播放被拦时仍会弹气泡并闪标题,并提示点一下页面解锁 AudioContext。

浏览器控制台 API

在 DSH Web 页面 F12 控制台可调试:

dshNotifySound.status()            // 配置、传输方式(sse/polling)、AudioContext 状态、统计
dshNotifySound.test()              // 试听「对话完成」
dshNotifySound.test('approval')    // 还有 question / error
dshNotifySound.toggle()            // 开 / 关
dshNotifySound.setVolume(0.8)      // 音量 0~1,立即生效并记住
dshNotifySound.refreshConfig()     // 改完主机配置文件后重拉,不必刷新页面
dshNotifySound.overrides()         // 查看被浏览器覆盖的键
dshNotifySound.reset()             // 清除全部浏览器覆盖

安装与启用

要求:DSH 0.2.x(README 开发与验证环境为 0.2.0-rc.2 桌面版)、Node ≥ 20。插件不引入第三方 npm 包。

从 npm 安装(README 写明已发布时最省事):

dsh plugin --profile <你的 profile> add dsh-notify-sound

从 GitHub 安装:

dsh plugin --profile <你的 profile> add github:Fur1naaaaaaaa/dsh-notify-sound

本地目录开发挂载:

dsh plugin --profile <你的 profile> add link:/绝对路径/dsh-notify-sound

安装完成后刷新一次页面:注入脚本在页面加载时写入 index.html,已打开的 tab 不会自动带上脚本。卸载可在插件管理器中禁用或删除条目。

配置说明

配置按字段逐级覆盖:默认值 → profile 里该插件条目的 config → ~/.dsh/dsh-notify-sound.json → 浏览器 localStorage(只记你显式改过的键)。

~/.dsh/dsh-notify-sound.json 完整字段示例:

{
  "enabled": true,
  "volume": 0.5,
  "pollMs": 700,
  "turnEnd": true,
  "approval": true,
  "question": true,
  "turnEndReasons": ["completed", "error", "blocked", "max-tokens"],
  "skipSubagents": true,
  "onlyWhenHidden": false,
  "toast": "auto",
  "flashTitle": true
}

onlyWhenHidden: true 表示只有页面在后台时才响,是多窗口场景里常见的用法。也可在 profile patch 里写 config(id 需与挂载 id 一致,README 示例为 notify-sound)。

调节音量三种方式,越靠前越推荐:设置页滑杆;编辑 ~/.dsh/dsh-notify-sound.json 的 volume(0~1)后刷新或执行 dshNotifySound.refreshConfig();控制台 dshNotifySound.setVolume(0.8)。

典型用法与自检

主机 HTTP 自检

<端口> 取 dsh web 启动时打印的地址,或环境变量 DSH_WEB_URL:

curl http://127.0.0.1:<端口>/dsh-notify/ping
curl "http://127.0.0.1:<端口>/dsh-notify/test?type=approval"

/ping 里 lastAck.outcome: played 表示浏览器确实出声;blocked 多为自动播放策略;muted 为当前静音。metrics.streamOpened 可确认是否走了 SSE。

按顺序试听四段音

仓库提供脚本,默认连 http://127.0.0.1:19387,会按浏览器回执节奏依次推送完成、提问、授权、异常四类试听:

python scripts/preview-cues.py
python scripts/preview-cues.py http://127.0.0.1:<端口>

适用场景与注意

适合谁:长时间让 DSH 在后台跑生成、需要审批或回答问题时再切回前台的开发者;希望用轻量客户端插件补足 Web 端「听觉提醒」、又不想维护音频资源文件的用户。

权限与隐私(README 原文要点):插件不请求外网,只注册本机 http://127.0.0.1:<端口>/dsh-notify/* 路由;会写 ~/.dsh/dsh-notify-sound.json 和浏览器 localStorage['dsh-notify-sound.prefs']。路由经 DSH webServer 注册,不经过 DSH Web 登录鉴权;同源页面可读写,跨源受 CORS 限制。插件与当前 dsh 进程同权限运行,安装前请自行查看源码与 MIT 许可证,并评估本机是否有不受信任的本地进程。

排查速查:完全不响时看 /dsh-notify/ping 与 dshNotifySound.status();第一次不响多为未点击页面解锁音频;配置不生效时先 dshNotifySound.overrides();设置页缺失看 /ping 的 ui.module.error;声音迟到可确认是否退到后台轮询并尝试刷新以重连 SSE。

社区目录站点 skillhub 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本文介绍的是社区维护的客户端插件,而非官方内置功能。

结尾

dsh-notify-sound 把 DSH 主机事件、本机 SSE/轮询和 Web Audio 合成绑在一起:零第三方依赖、带设置页与控制台 API,适合「人不在窗口旁、但会话还在跑」的日常开发节奏。进一步了解可打开 目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye