在 DeepSeek Harness (dsh) 中进行智能体开发或任务编排时,经常需要关注任务状态或等待人工确认。当窗口被遮挡或在其他应用中工作时,很容易错过这些关键节点。dsh-notifier 插件通过调用操作系统的原生通知能力,将任务完成和审批请求直接推送到桌面,从而解决这个问题。
是什么¶
dsh-notifier 是 DeepSeek Harness (dsh) 的一个系统通知插件。它由 YZz-S 维护,采用 MIT 许可证。该插件主要解决“任务执行状态不直观”和“审批流程易遗漏”的问题,确保开发者或用户在切换窗口时也能及时获取 DSH 的状态变化。
核心功能¶
-
任务完成通知
当顶层会话从running状态变回idle(即一个回合结束)时,插件会发送“Task completed(任务已完成)”的通知。插件使用agents.roots()来识别顶层会话,避免子代理结束时的通知刷屏。 -
审批与输入通知
当触发审批(approval/request)或需要页面内手动输入时,插件发送“Action required(需要确认)”的通知,并在正文中包含触发该请求的工具名称和原因。 -
不干扰审批流程
插件的通知逻辑透明地通过 waterfall 的next()传递,不会回答或改变审批结果,完全不影响原有的审批流程。 -
跨平台支持
* Windows:支持 WinRT Toast,失败时降级为气泡通知。
* macOS:调用osascript执行display notification。
* Linux:使用notify-send。 -
DeepSeek Harness 品牌标识
在 Windows 平台上,插件会注册一个自定义的 AppUserModelID(DeepSeekHarness.Notify),这样系统显示的通知来源应用名和图标即为“DeepSeek Harness”。
安装与启用¶
安装该插件需要使用 DSH 的命令行工具。
dsh plugin --profile web add github:YZz-S/dsh-notifier
安装后,只要 dsh 进程在运行,任务完成或需要人工确认时系统通知会自动弹出。该插件为纯 Host 插件,无需刷新页面即可生效。
典型用法¶
根据使用场景的不同,有两种启用方式。
方式一:动态 Cordis 插件(临时运行)¶
这种方式适合在开发调试时临时启用,生命周期绑定在当前 dsh 进程。
- 在 dsh Web GUI 的 Cordis 工具中调用
cordis_define,将host.js的内容粘贴到code.host字段。参数需设置为plugin.kind: 'new',idPrefix取 3-6 个小写字母。 - 调用
cordis_run激活插件。 - 下一次任务完成或触发审批时,系统通知会弹出。
注意:动态插件的生命周期与当前 dsh 进程相同。重启 dsh 后必须重新定义并运行。
方式二:安装为正式插件(推荐)¶
使用上方提供的安装命令将其安装为正式插件,无需每次手动定义。
工作原理¶
插件通过 subprocess.spawn 调用操作系统的原生命令来发送通知。命令探测顺序为:
1. Windows:优先使用 PowerShell 调用 WinRT Toast(带自定义 AppUserModelID),失败则降级为气泡通知。
2. macOS:调用 osascript。
3. Linux:调用 notify-send。
标题固定为“DeepSeek Harness”,正文显示“会话标题”+ 状态。为了防止通知过多,插件仅在检测到顶层会话(通过 agents.roots())从 running 变为 idle 时才发送任务完成通知。
隐私与注意事项¶
-
隐私
* 仅在 HKCU 注册 AppUserModelID 用于显示来源名称和图标。
* 不进行文件写入、遥测或持久化存储。
* 不采集或上传任何本地数据。
* Windows 平台仅在显示通知时从公开 CDN 拉取图标(avatars.githubusercontent.com/u/148330874?v=4&s=200)。 -
限制
* 进程级别:动态插件以当前 dsh 进程为生命周期,重启后需重新加载。
* 服务依赖:如果subprocess服务不可用,插件会静默禁用。
* 网络依赖:Windows 平台的图标依赖网络,断网时图标不显示,但通知本身仍会弹出。
总结¶
dsh-notifier 通过轻量级的系统通知机制,解决了 DSH 任务执行和审批流程中信息滞后的问题。它遵循“不干扰业务”的原则,在提供即时反馈的同时,保持了极低的隐私风险和资源占用。