前言¶
在本地运行 DeepSeek Harness(DSH)时,对话结束后需要手动切回应用查看结果。若会话较多,这种来回切换会打断工作流。dsh-notify-sfx 解决这个问题:当 DSH 的会话产生事件(对话完成、等待批准、等待回答等)时,弹出 Windows 原生 Toast 通知,同时播放 opencode 风格的提示音;点击通知可直接跳到对应会话。
插件定位¶
dsh-notify-sfx 是一个运行在 Windows 端的 DSH 插件,由维护者 XA-anjiu 开发。它通过 Windows 原生通知系统与音效包,将 DSH 的会话事件转化为桌面弹窗与听觉反馈,支持点击跳转、自定义音效、设置面板等配置能力。
核心功能¶
Windows 原生通知¶
使用 ToastGeneric 载荷格式,图标取自 DSH 应用本身。插件自动注册 AUMID 与开始菜单快捷方式,确保通知可以被点击激活。通知内容包括状态标题、会话名以及详情两行。
opencode 音效包¶
内置 5 组共 45 个音效(alert / bip-bop / staplebops / nope / yup),每个事件可单独选择音效。音效资源来自 opencode 仓库,采用 MIT 许可证。
逐事件音效¶
对话完成 / 出错 / 等待批准 / 等待回答 / 其他通知,五个事件各自对应一个音效胶囊。默认事件音效为:对话完成 staplebops-01、出错 staplebops-03、等待批准 staplebops-02、等待回答 staplebops-05、其他 staplebops-01。
导入自定义音效¶
支持 wav / mp3 / m4a / wma / aac / flac / ogg 格式。可通过设置面板的「导入音效」功能,或直接将文件放入 assets/opencode/ 目录后重装插件。
点击跳转¶
点击通知后,编译型启动器 bin/dshnotify.exe(无控制台窗口)会通知宿主聚焦窗口并切到对应会话,全程约 0.3 秒。点击行为可通过配置选择:app 聚焦窗口并切会话、web 用浏览器打开会话、none 不跳转。
设置面板¶
在 DSH 设置 → 通知与音效中可配置各项参数。改动即时保存、无需重启。设置项保存在 profile 的 data/dsh-notify-sfx/settings.json。
入口可关¶
主界面铃铛图标与会话头部铃铛入口、设置页「通知与音效」入口均可单独隐藏。
安装与启用¶
通过命令行安装:
dsh plugin add dsh-notify-sfx
或从源码安装:
cd <profile 目录>
pnpm add -w "file:<本仓库路径>"
安装完成后重启桌面端。插件自带 cordis.patch.yml,会被自动挂载。如需自定义配置,可在 profile 的 cordis.patch.yml 里追加:
- id: dsh-notify-sfx
name: dsh-notify-sfx
config:
enabled: true
sound:
mode: file # file | none
配置项¶
| 配置项 | 说明 | 默认 |
|---|---|---|
enabled |
总开关 | true |
clickTarget |
点击行为:app 聚焦窗口并切会话、web 用浏览器打开会话、none 不跳转 |
app |
lifetime |
通知停留:short / long / persistent |
short |
surface |
通知形式:system 系统通知、inapp 应用内浮层、both |
system |
visible.homeIcon |
会话头部铃铛入口 | true |
visible.settingsSection |
设置页「通知与音效」入口 | true |
sound.mode |
file 播放音效 / none 静音 |
file |
sound.events |
逐事件音效,取值如 pack:staplebops-01、file:<绝对路径>、none |
见下 |
sound.pack |
每个事件的默认音效 | staplebops-01 / 03 / 02 / 05 / 01 |
sound.volume |
播放音量 0–1(也可写进 data/dsh-notify-sfx/settings.json 的 volume,改完立即生效) |
1 |
includeSubagents |
子代理的通知是否也弹 | false |
音效包说明¶
| 音效包 | 名称 | 数量 | 风格 |
|---|---|---|---|
staplebops |
便签轻敲 | 7 | 短促木质敲击,适合「完成」 |
bip-bop |
哔啵电子 | 10 | 电子双音,适合「提问」 |
alert |
清脆提醒 | 10 | 明亮提示音 |
nope |
低沉否定 | 12 | 下行音,适合「出错」 |
yup |
上扬应声 | 6 | 上行确认音 |
音效文件位于 assets/opencode/,来自 opencode 仓库的 packages/ui/src/assets/audio(MIT,见 NOTICE.md)。
工作原理¶
lib/index.js监听session/event的turn/end、approval/asked、ask_user_question,按事件挑音效规格。lib/notify.ps1手写 ToastGeneric 载荷(标题 = 状态,正文 = 会话名 + 详情两行),附加<audio>或静音,用ToastNotificationManager发出;同时负责 AUMID 注册与音效播放(WinRTMediaPlayer)。lib/install-shortcut.ps1在开始菜单建一条带 AUMID 的快捷方式——非打包 Win32 程序的 toast 点击激活依赖它。- 点击走
dshnotify://协议 →bin/dshnotify.exe(lib/launcher.cs编译,lib/build-launcher.ps1负责重建)→ POST/api/dsh-notify-sfx/settings写入待聚焦会话,并聚焦 DSH 窗口;浏览器半区轮询到会话 id 后调用宿主的uiWorkspace.openSession。 lib/panel.js提供设置桥(同源校验、仅本机),lib/client.js负责设置面板、会话头部铃铛、右侧栏页面。
适用场景与注意¶
适合需要频繁切换会话、希望将 DSH 事件转化为桌面通知与听觉反馈的开发者。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
开发¶
node test/sound.test.mjs # 音效规格解析
node test/panel.test.mjs # 设置桥
node test/client.test.mjs # 浏览器半区渲染
node tools/preview.mjs # 逐个事件试听
改完 lib/ 后要同步到 profile 的 node_modules/dsh-notify-sfx(安装副本是真实目录,不是软链),再重启桌面端。
致谢¶
- 通知与 AUMID 处理基于 SeverusZh/dsh-notify-windows(MIT)派生。
- 音效资源与通知行为参考 opencode(MIT, Copyright (c) 2025 opencode)。
总结¶
dsh-notify-sfx 通过 Windows 原生通知与 opencode 音效包,将 DeepSeek Harness 的会话事件转化为桌面弹窗与听觉反馈,支持点击跳转、自定义音效、设置面板等配置能力,适合需要频繁切换会话的开发者。
- 插件目录页:https://www.skillhub.cn/plugins/XA-anjiu/dsh-notify-sfx
- GitHub:https://github.com/XA-anjiu/dsh-notify-sfx