dsh-task-notifications
DiscoveredDSH Desktop 任务通知插件(本地分支:精简实现 + 子代理失败提醒)
DSH 任务通知
适配 DeepSeek Harness Desktop 0.2.x。在 设置 → 任务通知 新增独立页面,界面按 Codex 通知设置设计。本仓库派生自 ltao0829/dsh-task-notify,当前版本 0.1.10。
| 设置 | 默认值 | 行为 |
|---|---|---|
| 轮次完成通知 | 仅在未聚焦时 | 可选始终、仅未聚焦时、关闭 |
| 启用权限通知 | 开 | 等待审批或计划确认时提醒 |
| 启用问题通知 | 开 | 等待用户回答问题时提醒 |
| 通知提示音 | 默认 | 默认 default-notify.wav、经典 classic-notify.wav、自定义(导入本机音频,上限 1 MB)、无 |
插件优先发送 Windows 系统通知;未获得系统通知权限时,在 DSH 页面右下角显示提示。轮次完成通知以「对话名称」为标题、以本轮最后一条 assistant 文本为正文(清理常见 Markdown,最多 700 个 Unicode 字符);本轮没有文本时显示「任务已完成,点击查看对话」。通知不带输入框、Reply 或动作按钮,点击整块通知会唤醒 DSH 并打开产生它的对话。首次连接只记录现状,不补发旧任务提醒。设置保存在 DSH 客户端的 localStorage(键 dsh.codexTaskNotifications.v1);导入的自定义提示音单独存在键 dsh.codexTaskNotifications.sound.v1,只在本机这个客户端里有效,清缓存或换机器后需要重新导入。
不提醒子代理。 从 0.1.4 起,origin === 'subagent' 的会话在进入差分之前就被丢弃:子代理结束、被终止、请求权限、提出问题,都由 DSH 自己的界面呈现,不会产生桌面通知。这条规则写在检测层,不依赖任何开关,因此设置页也没有对应选项。
早期版本曾想用作业通道识别子代理,实测确认这版 DSH 的子代理不产生作业记录,该通道从未生效,已随本版删除;后台 bash 作业也不会因此新增提醒。
0.1.10 变更
- 提示音改为本地合成。 早期版本把两段 WAV 以数据 URI 内联进包,音源取自本机 Codex 安装包,随公开仓库分发等于再分发第三方音频。现在两段提示音由
scripts/generate-tones.mjs合成(A5→D6 双音、D5 单音),音色与原版不同,lib/client.js从 533 kB 降到 116 kB。 - peer 依赖可匹配预发布。
^0.2.0-rc.2按 node-semver 规则匹配不到0.2.1-rc.x,改为^0.2.0-rc.2 || ^0.2.1-rc.1,engines.dsh同步。 - 仓库元数据指向本仓库。
repository/homepage/bugs改为Jimmy-Official/dsh-task-notifications。 - 未改功能代码;「点击通知跳转」仍未在真实桌面验证,本版不声称可用。
0.1.9 变更
- 修复点击通知不跳转。 旧实现直接读取
ctx.uiWorkspace;该服务没有声明在inject里时,Cordis 会抛cannot get property "uiWorkspace" without inject,而这次读取又位于try之外,于是点击后既没有导航、也没有失败提示。现在改用 Cordis 的ctx.get('uiWorkspace')(其文档明示「不需要 inject」)作为唯一路径,删掉晚绑定变量与属性直读。 - 聚焦窗口与内部导航解耦。
window.focus()与notification.close()各自 try/catch,窗口聚焦失败不再阻断对话切换。 - 补全导航诊断。 一次点击会依次写入
native:clicked、navigate:service-found、navigate:open-called;服务缺失或抛错时写入navigate:service-missing/navigate:error:<原因>。记录写入dsh.codexTaskNotifications.diag.v1,最多保留 32 条。 - 新增
src/client/navigation.ts与 6 组导航测试,测试总数 18 → 24。
0.1.8 变更
- 新增
src/client/finalResult.ts:通过 DSH Session Controller 的sessions.using(...).eventSource读取最近已结束轮次,只取该轮最后一条assistant/message的文本块。 - 完成通知从「固定完成标题 + 对话名称正文」改为「对话名称标题 + 最终结果正文」;无正文时使用明确兜底,不会错误显示上一轮内容。
- 修复原生
Notification没有真正加入存活集合的问题;通知关闭、出错或被点击后再释放,降低点击回调丢失风险。 - 点击通知仍调用 DSH 自带的
uiWorkspace.openSession(sessionId);晚绑定调用不再吞异常,失败会显示既有提示。 - 去掉页面回退卡片的动作按钮,系统通知和回退卡片都只保留整块点击,没有输入框或 Reply。
- 新增 4 个测试,共 18 个测试。
0.1.7 变更
- 音频文件不要求自带「我是音频」标签了:Windows 上经常把
.wav交过来时type是空的,以前会被判成「不支持的类型」,现在按扩展名识别(wav / wave / mp3 / m4a / aac / ogg / oga / opus / flac / webm)。 - 解码后如果
data:前缀不是audio/,改用扩展名推出的类型重新拼接,否则new Audio(...)解不出来。 - 点「移除」自定义提示音后,提示音设置会自动退回「默认」,不再留一个空的「自定义」行、实际却放默认音。
- 跳转失败不再一声不吭:拿不到宿主导航服务或调用抛错时,右下角弹一句「没能切换到该对话,请手动在左侧列表里选择」。
- 新增 2 个测试:扩展名兜底识别、以及「没有 MIME 的文件被重新包装成 audio/wav」。共 14 个测试。
0.1.6 变更
- 修复点击提醒不跳转:
0.1.5直接读ctx.uiWorkspace,但这个服务没有写进inject,取到的永远是undefined,点下去静默无事发生。 - 改为
ctx.inject(['uiWorkspace'], …)晚绑定:服务就绪后记下跳转函数;服务缺失时退回直接取值。两条路都失败也只丢掉跳转,提醒与提示音照常。 - 系统通知的点击回调加一次性守卫,避免一次点击触发两次跳转。
- 测试数保持 12:跳转依赖宿主服务,单测只能证明回调被调用,不能证明视图被切换。
0.1.5 变更
- 提示卡片可点击跳转:底部按钮文字按提醒类型区分,点按钮或卡片任意位置都会切换到对应的对话。
- 系统通知被点击时同样切换;跳转走 DSH 自带的 Workspace 服务,不新增依赖,服务缺失或调用失败时只丢掉跳转,提醒照常显示。
- 卡片自动消失时间 5 秒 → 8 秒,并支持键盘回车 / 空格。
- 测试数 11 → 12。
0.1.4 变更
- 彻底移除子代理提醒:设置页删除「启用子代理通知」整行,控件从 5 个降为 4 个(轮次完成 / 权限 / 问题 / 提示音)。
- 检测层直接跳过
origin === 'subagent'的会话,子代理的结束、终止、权限与提问都不再产生通知;主会话的完成与审批提醒行为不变。 - 删除作业通道的全部残留:
jobs注入与订阅、watchRows订阅、activeSessions/jobWatchers、job事件与相关类型、job-controller 依赖。 - 旧版
localStorage里的subagent字段读取时被忽略,其他设置原样保留,不重置存储。 - 测试数 12 → 11。
0.1.3 变更
- 新增「自定义」提示音:设置页选「通知提示音 → 自定义…」,点「选择文件」导入本机音频(wav / mp3 / ogg / m4a,上限 1 MB),导入时自动试听一次,放不了的文件不会保存。
- 音频内容存进
localStorage的独立键dsh.codexTaskNotifications.sound.v1,不带进插件包,也不会跟着每次设置变更重写。 - 回落规则:选了自定义但没有可用音频时,提醒使用内置默认音。
- 错误提示:文件过大、非音频、空文件、读取失败、存储配额不足、无法播放,各有对应文案。
- 测试数 10 → 12。
0.1.2 变更
- 修复标题说谎:子代理会话结束时,只要「轮次完成通知」开着就会弹「DSH 任务已完成」——子代理被中途终止也一样。现在识别
origin === 'subagent'的会话,标题改为「DSH 子代理已结束」(新增 locale 键subagentEndedTitle),不再谎报完成。 - 「启用子代理通知」开关终于生效:以前它只拦
job事件,而子代理不产生job;现在它拦子代理会话的轮次提醒,关掉就不再弹。 - 已知局限:仍无法区分完成、失败与被终止,原因见上一节。
- 测试数 8 → 10(子代理会话路由、普通轮次不受影响)。
0.1.1 变更
- 修复:
failed/killed状态的子代理以前被shouldNotify直接丢弃,页面上不会有任何提示;现在与completed一样触发提醒。 - 通知标题与正文按结束状态区分(新增 locale 键
subagentFailedTitle)。 - 删除
detect.ts中从未被产生的failure事件变体,避免误以为已存在「会话失败」提醒。 - 新增两个测试:失败/终止状态的判定,以及
running→failed的整条 diff 转事件链路。测试数 7 → 8。
本地构建与验证
cd 'F:\\桌面\\DSH\\dsh-task-notifications'
pnpm install --ignore-scripts
pnpm run typecheck
pnpm run build
pnpm test
pnpm pack
本机 pnpm 不在 PATH 上时,可直接调用仓库内的二进制:node node_modules/typescript/bin/tsc -b --pretty false、node node_modules/tsdown/dist/run.mjs、node node_modules/vitest/vitest.mjs run tests/codex-notifications.spec.ts、npm pack。
安装有两条路:① 从本仓库安装——插件管理界面选择 https://github.com/Jimmy-Official/dsh-task-notifications,或下载 最新 Release 后在插件管理里选这个 tgz;② 本地开发时直接装 local-dsh-task-notifications-<version>.tgz。不要手动改写 ~/.dsh/profiles/desktop。安装前必须 bump 版本号——lockfile 按 integrity 复用,同版本号重装会装回旧包。
本机状态(2026-11-08,0.1.10)
已验证:
tsc -b --pretty false退出码 0。vitest run tests/codex-notifications.spec.ts:24 个测试全部通过(含两段合成提示音的字节与哈希校验)。tsdown构建通过;lib/client.js116,394 B(gzip 70.27 kB),资源内联只剩两段合成提示音。npm pack产出local-dsh-task-notifications-0.1.10.tgz,作为 GitHub Release 资产上传时改名为dsh-codex-notification.tgz;精确字节数与 SHA-256 记在docs/verification-evidence.md(该文件不进包,避免包内 README 自述自身校验值)。
未验证(不要当成已完成):
0.1.8已安装并做过真实点击实测,结论负面:磁盘诊断里native:shown×2、native:clicked×2,说明点击回调确实执行了,但界面没有跳转、也没有出现失败提示。根因见「0.1.9 变更」第一条。0.1.9尚未安装进 Desktop;「点击后切到对应对话」目前是已编译、已测试、尚未桌面实测。0.1.2到0.1.7中没有任何一版被完整实测过;「子代理完全静默」和「导入自定义提示音」目前只在单元测试层面成立。0.1.5做过一次真实桌面实测,结论是负面的:点击 Windows 系统通知后没有切换对话(当时目标会话在别的工作区)。0.1.6与0.1.7都没有重装验证;0.1.5、0.1.8两次桌面实测都是负面的(一次目标在别的工作区,一次同工作区也不跳)。- 自定义音频的选文件、试听、存储配额报错都依赖浏览器环境,没有在真实 DSH 页面里操作过。
- 点击跳转只在模拟页面(DOM 桩)里验证过:真实 DSH 页面里点卡片能不能切视图、目标会话在别的工作区时会不会先切工作区,都没有实测。
- 已实测但结论是负面的:2026-11-01 20:5x 在真实桌面弹窗里观察到的仍是旧的「DSH 任务已完成」,即
0.1.1修复的job分支对子代理不生效。 - 系统通知是否弹出、提示音是否可听,需要真实桌面环境与浏览器通知授权,本机没有做这一步核对。
0.1.0的安装记录只能证明「设置页可渲染、设置值可写入localStorage」,不能证明通知已送达。
两段提示音由仓库内 scripts/generate-tones.mjs 合成,再以数据 URI 打入 lib/client.js;assets/sounds/ 保存同名 WAV 供测试校验。它们不是第三方音频,可以随仓库一起分发。要换音色就改脚本里的频率与时值,重跑脚本后再构建。
来源
事件观察与 DSH 0.2 插件构建方式派生自 ltao0829/dsh-task-notify;原项目采用 BSD-3-Clause,原始版权声明与本次派生声明同在 LICENSE。后续维护在 Jimmy-Official/dsh-task-notifications:修改了设置入口、通知类别、界面、子代理策略与音源。
Comments
Loading…
Similar plugins
by zhaoxuejie
DSH 桌面通知插件:任务完成 / 等待输入 / 失败时,右下角弹窗 + 音效 + 手机推送(Windows / macOS / Linux)
★ 0
MIT
JavaScript
Sep 7, 2026
dsh plugin --profile web add dsh-plugin-desktop-noticeby CoachLeong
DeepSeek Harness plugin: desktop notifications when the model starts, finishes, or needs your input (approval / question / plan review).
★ 0
MIT
TypeScript
Aug 16, 2026
dsh plugin --profile web add dsh-notifyby Talone22
该仓库暂未提供项目说明。
★ 4
↓ 116/wk
MIT
JavaScript
Aug 22, 2026
dsh plugin --profile web add dsh-notify-toneby qgx1992
DSH 通知显示层插件:全局 toast 栈,订阅桌面壳 __dshExo 桥事件,点击经官方 sessions runtime 程序化激活会话;无壳时降级订阅 sessions store 自绘。可插拔通知显示层的 web 侧。
★ 0
↓ 381/wk
MIT
JavaScript
Aug 28, 2026
dsh plugin --profile web add dsh-notifyby Favio8
DeepSeek Harness (DSH) task-completion notifications: fast native desktop card, exact session jump, in-app toast, settings preview.
★ 0
MIT
TypeScript
Oct 18, 2026
dsh plugin --profile web add dsh-plugin-task-notifyby Dawn388887
DSH plugin: desktop toast + remote browser notifications when an agent finishes or errors
★ 0
↓ 381/wk
MIT
JavaScript
Oct 7, 2026
dsh plugin --profile web add dsh-notify