dsh-audio-alert:Linux 宿主侧会话提示音

前言

用 DeepSeek Harness(DSH)跑长任务时,回合结束、报错,或停下来等你审批、回答,往往要盯着网页或终端才知道状态。浏览器侧的提示音插件通常要求页面开着;在无 GUI、只走 SSH 的服务器上,这类提醒很容易失效。下面介绍维护者 xwzkj 发布的客户端类插件 dsh-audio-alert:它跑在 DSH 宿主进程里,通过本机音频设备发声,不依赖浏览器,也不把任何内容发到外面。

这是什么

dsh-audio-alert 是面向 Linux 的 DSH 宿主插件。它监听会话里的典型事件,在机器连接的音箱或耳机上播放短提示音,让你在不必打开网页端的情况下感知进展。插件不充当推送服务、不联网,不需要机器人 token 或手机 App;适合「DSH 跑在附近机器、接了个音箱」的部署方式,例如家里的 Linux 服务器上跑网页版 DSH profile。

五个提示音在首次播放时由包内 sounds.js 用纯 JavaScript 合成(48kHz/16-bit/立体声),npm 压缩包约 21KB,不再捆绑约 1.3MB 的 WAV。项目在 GitHub 上以 MIT 许可发布;代码与文档带有 AIGC 声明,使用前建议自行审阅源码——插件会在你的机器上启动音频播放器子进程。

与浏览器侧提示音的取舍

常见的浏览器侧提示音插件 dsh-audio-alert
需要开着浏览器 是 否
只需要 DSH 宿主在跑 不够 是
无 GUI / 只走 SSH 的机器 通常不响 有音频会话就能响
配置方式 多为设置面板 profile 的 YAML patch

取舍是刻意的:没有浏览器 UI、没有网络、没有额外服务,只有很小的宿主插件和一个 YAML 配置文件。

核心功能:什么时候响

事件 声音 行为
回合正常结束 两个上行的钟音 柔和,不刺耳
回合出错 两个下行的低音 出错时的默认提示
被策略拒绝(blocked) 与出错同音 只受 events.blocked 控制
触及输出上限 两声同音,中性 与「完成」区分
等待审批 三记上行的木琴音 未处理会重播
等待回答 / 计划评审 两个上行的音 未处理会重播

等待审批、等待回答两类事件会先立即响一次,之后按 45 秒、90 秒、3 分钟、之后每 5 分钟重播,最多 12 次;你一旦处理就停止。子代理的回合默认不响(可通过 includeSubagents: true 打开);子代理发起的审批和提问始终不响,避免一个任务连续响十几次。

播放器按顺序自动选择:pw-play(PipeWire)、paplay(PulseAudio)、aplay(ALSA),三者至少要有其一。Node.js 需 20 或更新版本。DSH 宿主必须跑在有音频会话的用户下;headless 的 systemd 服务通常还需要 loginctl enable-linger <user>,插件在 /run/user/<uid> 存在且变量缺失时会尝试补上 XDG_RUNTIME_DIR 和 D-Bus 地址,但无法替你创建音频会话。

安装与启用

安装命令以仓库 README 为准。任选其一:

# 发布到 npm 之后
dsh plugin --profile web add dsh-audio-alert

# 直接从 GitHub 装
dsh plugin --profile web add github:xwzkj/dsh-audio-alert

# 本地开发
dsh plugin --profile web add link:/path/to/dsh-audio-alert

dsh plugin 会在 profile 目录里调用 pnpm,并把包加进 dsh.profile.bundles。装完后重启宿主进程,例如:

sudo systemctl restart dsh-web

服务名按你的部署方式而定。装完通常不需要额外配置:包自带的 cordis.patch.yml 已插入 audio-alert 条目,默认值即可工作。

配置

配置写在 profile 的用户 patch 里,默认路径为 ~/.dsh/profiles/<profile>/cordis.patch.yml;若设置了 DSH_HOME,则为 $DSH_HOME/profiles/<profile>/cordis.patch.yml。追加或合并同 id 的覆盖项时,必须保留 id: audio-alert:

- id: audio-alert
  name: dsh-audio-alert
  config:
    volume: 0.6                  # 0..1 线性音量;aplay 会忽略
    quietHours: "21:30-05:30"    # 降噪时段,支持跨零点
    quietFactor: 0.6             # 时段内的音量倍数
    sink: BDM3P                  # 可选;换成 wpctl status / pactl list short sinks 里的名字
    verbose: true                # 可选:把播放决策打到宿主 stderr

若 patch 里已有 audio-alert,把 config 合进去即可,不要重复加一行。改完重启宿主。

常用配置项包括:enabled(总开关)、player(auto / pw-play / paplay / aplay 或绝对路径)、sink 与 device(输出设备)、volume、events(对 done、approval、question、error、maxTokens、blocked 分别开关)、approvalDelaysMs(等待类重播间隔)、includeSubagents、quietHours / quietFactor / approvalBypassesQuiet、sounds(自定义 WAV 覆盖)、verbose。不填 sink 时声音走系统默认设备;PipeWire/Pulse 上切换桌面默认 sink(例如蓝牙音箱)后,下一次提示音会跟随,无需重启插件。

典型用法与排障

包内提供 test-alert.sh,用于生成临时 WAV 并按当前选中的播放器依次试听:

./test-alert.sh
./test-alert.sh 80   # 先把 ALSA Master 调到 80% 再播(仅 aplay 机器)

若插件作为依赖安装,可在 node_modules/dsh-audio-alert/test-alert.sh 路径下执行。没声音时可按 README 建议顺序检查:本机是否有 pw-play / paplay / aplay;用 node scripts/render-sounds.js /tmp/alerts 生成 WAV 后手动播放;检查 sink 是否静音;设 verbose: true 看宿主 stderr 里 [audio-alert] 日志;headless 环境核对 linger 与会话变量。若 shell 里 pw-play 能响而插件不响,对比 systemd 单元的环境变量与交互式 shell。

首次播放会在 $XDG_CACHE_HOME/dsh-audio-alert(默认 ~/.cache/dsh-audio-alert)写入缓存;插件不读取会话消息或工作区文件,verbose 也不记录消息内容。

适用场景与注意

适合:Linux 上跑 DSH(含网页 profile)、机器旁有音箱或耳机,希望回合结束、出错或等待你操作时本地有声提醒,且不想依赖浏览器常开或外网推送。

务必注意:插件以当前 DSH 宿主进程的用户与权限运行,会启动你配置的播放器(player 可写绝对路径,只指向可信可执行文件);以 root 跑宿主通常拿不到桌面用户的音频会话。安装前请阅读源码与 MIT 许可证,并理解 AIGC 声明中的免责说明。DSH 生态强调「一切皆插件」;社区目录站点与 DeepSeek / 幻方无官方从属关系,本文介绍的是社区维护的独立插件。

链接

  • 社区目录页:https://www.skillhub.cn/plugins/xwzkj/dsh-audio-alert
  • 源码与完整文档:https://github.com/xwzkj/dsh-audio-alert

经过上面的步骤,你可以在 Linux 宿主侧用最小依赖完成「离开网页也能听见 DSH 会话状态」的提醒;需要精细控制时,在 profile 的 cordis.patch.yml 里按事件与时段调整即可。

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

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

Xiaoye