Repository navigation
Releases
dsh-notify 0.6.0
dsh-notify 0.6.0
前台后台都会响提示音了。 之前提示音只在 DSH 有焦点时播放,窗口切到后台就只剩一个静音的系统通知。
改了什么
每条通知现在在两种状态下都响,但只响一次:
| 状态 | 谁发声 |
|---|---|
| 焦点在 DSH | 页面内的 <audio> 播放自带的 notify.wav(与之前一致) |
| 焦点不在 DSH | 页面保持安静,由系统原生通知发声 |
之所以不两边同时响,是为了避免同一条通知响两遍。
为什么不干脆让页面一直播? 浏览器会限流后台标签页的播放,后台标签页里的 Audio.play() 并不可靠——这正是把后台的声音交给系统通知的原因。
平台细节
- Windows:
dsh-toast.ps1现在往 toast XML 里写显式的
<audio src="ms-winsoundevent:Notification.Default" loop="false"/>,
不再依赖「没有<audio>元素时系统用默认音」这种隐式行为;
关闭「提示音」时写<audio silent="true"/>。 - macOS:
osascript的display notification加上sound name "default";
关闭「提示音」时省略该子句(不写就是静音)。
兜底
如果「系统通知」通道被关掉,后台会退回页面内发声(尽力而为,可能被浏览器限流)。
客户端在请求原生通知时带上 sound 字段;服务端未收到时默认按开启处理,旧客户端不受影响。
回归测试
新增三组断言,覆盖全部三条路径:
- 前台:不请求原生通知,页面内放音一次
- 后台:请求一次原生通知且
sound: true,页面内不放音 - 后台 + 系统通知关闭:退回页面内放音
测试里有个坑值得记:插件是在
focus/blur事件回调里读document.hasFocus()的,
所以测试必须真的派发这些事件,光改一个布尔变量不生效。
安装
# 从 npm
dsh plugin --profile desktop add @having5548/dsh-notify
# 或从本页附件
dsh plugin --profile desktop add having5548-dsh-notify-0.6.0.tgz安装后重启 DSH 生效。
新版桌面端的 profile 名是
desktop;旧版 Web 是web。
环境
- DSH ≥ 0.1.7-rc.2(已在 0.1.7-rc.2 / 0.2.0-rc.2 上核对)
- Windows 10+ / macOS
完整改动
见 7bd9ce7。
Assets
having5548-dsh-notify-0.6.0.tgz— 插件安装包- SHA256:
6AA6C5B81672AE7D90E3D41CECE4C4B5C68BBF7241C93FBDD2A0A9AA55872161
dsh-notify 0.5.0
dsh-notify 0.5.0
适配 DSH 0.2.0-rc.2 + 两项降噪优化。
如果你在用 0.4.0 且一切正常,这一版没有必须升级的理由——它不会修掉你遇到的任何故障,只是让通知更安静、更省资源。在 DSH 0.1.7 / 0.2.0 上都可用。
先说兼容性:这次没有 API 漂移
对当前打包版 DSH(0.2.0-rc.2,Electron 构建)逐项核对,插件用到的客户端接口全部健在:
| 接口 | 状态 |
|---|---|
ctx.uiSession.sessionStatus / adapter.current |
✅ |
ctx.configForms.get(entryId) |
✅ |
ctx.jobs.state + watchRows |
✅ |
settings.section 槽位 |
✅ |
ctx.on('session/event') / webServer.register |
✅ |
ctx.settingsScope |
✅ 仍然不存在(0.1.7 起就已移除) |
也确认了 dsh.client.platform 仍必须是 "web"——新版桌面端是 Electron 外壳,渲染的是同一套 Web 客户端。
优化一:子代理会话静音 🤖
DSH 会给每个子代理分配独立会话(客户端 SessionSummary.origin、服务端 session.header.origin 都是 'subagent'),而它们每一轮都会发 turn/end。
后果是:一次 fan-out 工作流(并行子代理、workflow 编排)能瞬间刷出几十条「新会话已创建」和「任务完成」,把真正属于你的任务通知淹掉。
本版在两侧都做了过滤:
- 服务端在
broadcast之前就拦掉子代理的turn/end(连流量都不产生) - 客户端的「新会话」与
turn-end两条路径各自独立过滤
审批 / 待回答类通知不过滤。 子代理同样可能请求授权,漏掉一次授权的代价远大于多一条通知。
优化二:任务订阅有界 📉
ctx.jobs 的任务名册是按会话订阅的(ctx.jobs.watchRows),每个订阅在服务端是一条常开的 job.list 流。
之前的实现给会话列表里的每个会话都开一条——本机上就是 45 条流,其中绝大多数永远不会再有任务。
现在只订阅「可能还有任务在跑」的会话:
- 当前会话
- 正在运行的会话(任务只可能在运行期被创建)
- 12 小时内活跃过的会话(兜住「轮次已结束但任务还在跑」)
- 名册里当前仍有任务的会话(任务比会话活动活得更久时继续盯着)
订阅会在会话列表变化、以及切换当前会话时重算。
回归测试扩充
tools/smoke-client.mjs 新增覆盖:
- 子代理会话不产生「新会话」通知
- 子代理的
turn/end不产生通知(普通会话的仍通知) - 48 小时未活动的会话不会被
watchRows - 切换当前会话时立即补上它的订阅
node tools/smoke-client.mjs安装
# 从 npm
dsh plugin --profile desktop add @having5548/dsh-notify
# 或从本页附件
dsh plugin --profile desktop add having5548-dsh-notify-0.5.0.tgz新版桌面端的 profile 名是
desktop(旧版 Web 是web)。可以先用dsh plugin --help确认。
安装后重启 DSH 生效。
环境
- DSH ≥ 0.1.7-rc.2(已在 0.1.7-rc.2 与 0.2.0-rc.2 上核对)
- Windows 10+ / macOS
完整改动
见 6ea8f7c。
Assets
having5548-dsh-notify-0.5.0.tgz— 插件安装包- SHA256:
141FFCDF47A98188AEB2177F7CE0C024B16401695B4707BED6C6B5B54A4CD20B
dsh-notify 0.4.0
dsh-notify 0.4.0
⚠️ 本版为 DSH 0.1.7 适配版。 如果你的 DSH 是 0.1.5 或更早,请留在 0.3.2;如果已经升到 0.1.7+,那么 0.3.x 装上后插件完全不会加载,必须用本版。
症状:插件静默停在 pending
升级 DSH 后,Web 端启动会报:
Failed to load plugins
web boot: 1 entry did not activate
@having5548/dsh-notify: pending (waiting for service: settingsScope)
cordis 会一直挂起一个插件,直到它 inject 的每个服务都存在。0.1.7 把 settingsScope 删掉了,于是插件永远等下去——整个插件不加载,而且没有任何报错,连通知都发不出来。
DSH 0.1.5 → 0.1.7 变了什么
| 用途 | 0.3.x(0.1.5 写法) | 0.4.0(0.1.7 写法) |
|---|---|---|
| 设置读写 | ctx.settingsScope.bind({namespace}) |
ctx.configForms.get('dsh-notify') |
| 待审批 / 待回答 | uiSession.pendingInteractions |
uiSession.sessionStatus → pendingInteraction |
| 后台任务 | sessions.list.jobsBySession |
ctx.jobs.state.rows(+ 按会话 watchRows) |
| 当前会话 | sessions.list.current |
uiSession.adapter.current.getSnapshot().key |
| 服务端设置 | ctx.settings.register(ns, schema) |
导出 Config schema,apply(ctx, config) 直接读 |
session/event、webServer.register、settings.section 槽位都没有变。
本版最重要的改动:不再硬依赖可选服务
光换服务名只解决这一次。真正的病根是硬 inject——任何一个服务被改名或移除,插件就整体静默死亡,而界面上只有一个 pending。
所以本版把 inject 收窄到只剩骨架服务:
var inject = ['sessions', 'slots']configForms / uiSession / jobs / locale 全部改为 ctx.get() 惰性解析,缺哪个就只关掉对应功能并在控制台留一条 warn。宁可少一个功能,也不能整个插件不加载。
后台任务的行为变化
0.1.7 的任务名册是按会话订阅的(引用计数),不再能被动读取。本版会跟随会话列表,为每个列出的会话调用 ctx.jobs.watchRows(),并在会话移出列表时释放订阅。
新增回归测试
tools/smoke-client.mjs —— 打桩跑,无需浏览器:
node tools/smoke-client.mjs覆盖 sessionStatus / jobs / configForms / 优雅降级共 9 组断言。这类 bug 没有它根本看不见(插件静默 pending、零报错)。每次 DSH 升级后请先跑它。
该目录不在
files字段内,不会进入 npm 包。
安装
# 从 npm
dsh plugin --profile web add @having5548/dsh-notify
# 或从本页附件
dsh plugin --profile web add having5548-dsh-notify-0.4.0.tgz安装后重启 DSH Web GUI 生效。
环境
- DSH ≥ 0.1.7-rc.2(0.1.5 及更早请用 0.3.2)
- Windows 10+ / macOS
Assets
having5548-dsh-notify-0.4.0.tgz— 插件安装包- SHA256:
0BC7AB229E95AADC2CF2952EC56162E4E38B2FE5A17F3F91C474F9BCAB8160CE
dsh-notify 0.3.2
⚠️ 本版只适用于 DSH ≤ 0.1.5。 在 DSH 0.1.7+ 上,本版的inject仍依赖已被移除的settingsScope服务,插件会永远停在pending、完全不加载。请改用 0.4.0。
dsh-notify 0.3.2
⚠️ 装过 0.3.1 的(GitHub Release 或 npm)请务必升级到本版。 0.3.1 的包名改造只做了一半,装完后插件在 DSH 启动时直接加载失败——不是静默降级,是起不来。
0.3.1 坏在哪
0.3.1 把包名从 dsh-notify 改成了 @having5548/dsh-notify(为的是避开 npm 上同名的第三方包 Pasumao/dsh-plugin-notify),但只改了 package.json 的 name。DSH 还会把这个包名用在另外两处模块解析上,它们当时都还是裸名:
| 位置 | 0.3.1 的值 | 正确值 |
|---|---|---|
cordis.patch.yml 里 insert 的 name |
dsh-notify |
@having5548/dsh-notify |
lib/client.js 的 __ModuleLoader__.load({ id }) |
dsh-notify |
@having5548/dsh-notify |
- 前者是插件的模块说明符,必须能被
require.resolve解析; - 后者是客户端 bundle 注册的 id,DSH 侧会校验,不匹配会抛
bundle ... loaded without registering "<id>"。
从 profile 目录实测:
dsh-notify -> MODULE_NOT_FOUND
@having5548/dsh-notify -> OK
本版修复
cordis.patch.yml:name改为'@having5548/dsh-notify'lib/client.js:__ModuleLoader__的 id 改为'@having5548/dsh-notify'- 补上 npm 元数据:
repository/homepage/bugs,以及publishConfig.access: public(作用域包默认 restricted,不加会发布失败) - 版本号 0.3.1 → 0.3.2。
pnpm pack的产物名由包名派生,作用域包会输出having5548-dsh-notify-<版本>.tgz,README 的安装示例同步更新
故意保持不变的内部标识
settings 命名空间、locale 命名空间、/dsh-notify/* 路由、settings.section 的 id 全部仍是 dsh-notify —— 改了会重置你已有的通知设置。服务端导出的插件名也仍然是 dsh-notify(官方 dshmarket 的包名是 dshmarket、导出名却是 dsh-market,可见这里没有强制一致的要求)。
安装
# 从 npm(推荐,作用域名不会被别人占用)
dsh plugin --profile web add @having5548/dsh-notify
# 或从本页附件
dsh plugin --profile web add having5548-dsh-notify-0.3.2.tgz安装后重启 DSH Web GUI 生效(重启会中断当前会话,先保存手头任务)。
环境
- Windows 10+ / macOS,DSH Web GUI(
dsh web) - 全部所用 API 已在 dsh 0.1.5-rc.2 上逐条核对
完整改动
Assets
having5548-dsh-notify-0.3.2.tgz— 插件安装包- SHA256:
B9B1FE81CAD60A2784BB38E500005772B257BF05208B62942371EE5ED9371967
dsh-notify 0.3.1
⚠️ 本版有缺陷,请改用 0.3.2。
本版的包名改造只做了一半:cordis.patch.yml的 specifier 与客户端模块 id 仍是裸名dsh-notify,装完后插件会在 DSH 启动时加载失败。npm 上对应的@having5548/dsh-notify@0.3.1同样受影响。
dsh-notify 0.3.1
DeepSeek Harness 通知插件 — 新会话 / 待审批 / 待回答 / 任务完成 / 任务中断 / 后台任务,一个都不错过。
⚠️ 如果你在用 0.2.x,这次升级是必须的
0.2.x 的「批准 / 拒绝」按钮和「待回答 / 计划审阅」通知,在当前 DSH 上是静默失效的:
- 客户端读的是
SessionSnapshot.pending和会话列表行的pendingInteraction字段; - 这两个字段在当前 DSH 客户端 API 里都已经不存在了。
后果是:审批通知照弹,但按钮点了没有任何反应(内部轮询 6 秒后悄悄放弃),而且「待回答 / 计划审阅」两类通知从来不触发。因为每一步都吞掉了异常,界面上看不出任何报错。
本版把这条链路整体迁移到官方事实源 ctx.uiSession.pendingInteractions —— 也就是 DSH 自己的审批面板和侧边栏角标用的同一个数据源。
修复
- 「批准 / 拒绝」真正可用 — 直接调用
PendingApproval.answer('allowed-once' | 'rejected'),不需要先打开会话、不需要轮询。请求已被其它界面应答时会明确报错,不再静默失败。 - 「待回答 / 计划审阅」通知恢复 — 由
pendingInteractions的kind: 'question'/'plan-review'驱动,通知正文带上第一个问题的内容。 - 待办解决后 Toast 自动撤下 — 你在审批面板里处理掉之后,右上角那条通知会自己消失,不用手动关。
- 消除重复通知 — 服务端 SSE 不再广播
approval/asked。客户端本地已经有权威事实源,两条路径并存会让同一次审批弹出两条通知(tag 不同,服务端那层 800ms 去重拦不住)。 - 不再硬依赖
uiSession— 改用ctx.inject延迟接线。万一该服务缺席或形状变化,只损失审批/问答这一类通知,其余功能照常,而不是整个插件不加载。 - 修正通知日志在失焦时的通道标注(此前会误标成「应用内+系统」)。
变更
- 移除 wscript +
dsh-activate.vbs+dsh-notify://自定义协议激活链路。
原生通知现在只负责提醒:不注册自定义协议、不创建.lnk、不调用脚本宿主、不做点击回调 / 一键审批 / 带回前台。这是为了避开 360 / 火绒这类安全软件对「脚本宿主 + 自定义协议」组合的误报。待审批请回到 DSH 界面,在应用内通知或审批面板里处理。
安装
dsh plugin --profile web add dsh-notify-0.3.1.tgz安装后重启 DSH Web GUI 生效(重启会中断当前会话,先保存手头任务)。
环境
- Windows 10+ / macOS,DSH Web GUI(
dsh web) - 全部所用 API 已在 dsh 0.1.5-rc.2 上逐条核对:
ctx.settings.register、ctx.on('session/event')、turn/end的reason.kind、ctx.sessions.list快照结构、ctx.uiSession.pendingInteractions、ctx.slots的settings.section、ctx.settingsScope.bind、ctx.locale - 原生通道:Windows 走 PowerShell 5.1 + 内置 WinRT(只写 HKCU 的 AUMID,无需管理员);macOS 走系统自带
osascript
完整改动
协议与内部实现细节见 25e72fa。
Assets
dsh-notify-0.3.1.tgz— 插件安装包(dsh plugin add直接用这个)- SHA256(
dsh-notify-0.3.1.tgz) =40863E9FB985D241B67A8ED184C7E4852F15B6B3574EB90A283BEA9FDDFB4C0D