前言¶
DeepSeek Harness(DSH)桌面端在跑 agent 时,界面若不在前台,很多关键状态不会主动打断你:会话在等待授权、要操控本机、一轮任务结束或失败、会话被终止——往往需要一直盯着窗口。社区插件 dsh-system-notify(维护者 linanbuan)在 agent 运行时监听已有 cordis / 会话事件,通过 Windows App SDK 弹出系统通知;不注册工具、不进 function calling、不改 system prompt,触发与模型输出无关。
这是什么¶
- 包名:
@local/dsh-system-notify(版本 1.0.0,MIT) - 类型:宿主插件(bundle 经
cordis.patch.yml挂入 profile),无客户端半边 - 环境:Windows 10 1809+ / Windows 11,DSH 桌面端;Node
>=20;@deepseek-ai/cordis^4.0.1 - 依赖:宿主侧零 npm 依赖;通知发送依赖
native/下基于 Windows App SDK 与 .NET 的小助手
目录页:skillhub.cn/plugins/linanbuan/dsh-system-notify
源码与说明:github.com/linanbuan/dsh-system-notify
核心功能¶
下面按「你在等什么」和「检测点从哪里来」说明。
通知覆盖的场景¶
| 你在等的事 | 装上之后(示意) |
|---|---|
| agent 要求授权(提权、写文件、跑命令) | 「会话请求授权」,带工具名与原因 |
| agent 要操控电脑(OpenCU 等) | 「电脑操控请求」等单独规则 |
| 一轮任务跑完 | 「任务完成」,带会话名与轮次 |
| 一轮失败 / 被阻塞 / 上下文超限 | 「任务未完成」,带错误码与消息 |
| 会话被终止 | 「会话已终止」(仅在终止时仍有轮次在跑时默认弹) |
紧急程度会映射到 Windows 通知场景与提示音:授权、失败类多为 urgent,完成类为 default。应用栏标题默认可配为 DeepSeek Harness。
检测点(不新增「让模型做决定」的环节)¶
| 检测点 | 来源 | 默认 |
|---|---|---|
approval/asked / approval/decided |
session/event(审批服务) |
开 |
turn/end |
session/event(agent-loop 收尾) |
开 |
session/disposed |
cordis 事件 | 开 |
agent/error |
cordis 事件 | 关 |
tool/call |
session/event(工具调用前) |
开 |
电脑操控除审批链外,还会在 tool/call 上匹配 computer_use / opencu 等(OpenCU 不经过 DSH 审批服务时的挂点);该规则默认 5 分钟冷却,避免同会话连续调用刷屏。
两条默认行为:
- 授权延迟:
scope.approvalGraceMs默认 1500 ms,避免「刚弹出审批你已在界面点完」的误扰。 - 子会话:
scope.includeChildSessions默认false,主 agent 拉起 subagent 时默认不逐项轰炸。
监听器只读,不改审批、不 append 事件;合约测试禁止插件访问 ctx.tool / ctx.systemPrompt。
安装与启用¶
插件是标准 DSH bundle:package.json 里 dsh.bundle.patch 指向 cordis.patch.yml。
方式一:桌面端插件管理器(推荐)¶
在 DSH 桌面端用插件管理器安装本包目录,写入当前 profile 的 dsh.profile.bundles,无需命令行。
方式二:手工写入 profile¶
在 profile 的 package.json 中增加依赖与 bundle(路径换成本机插件目录):
{
"dependencies": {
"@local/dsh-system-notify": "link:<本插件目录的绝对路径>"
},
"dsh": {
"profile": {
"bundles": ["...", "@local/dsh-system-notify"]
}
}
}
在 profile 目录安装依赖后重启 DSH。
首次使用:编译原生通知助手¶
Node 无法直接发 Windows 系统通知;发送端在 native/。
- 自动(默认
sink.autoBuild: true):首次发送时执行native/build.ps1,若无则dotnet build native/*.csproj -c Release。 - 手动(需要 .NET SDK 10,目标
net10.0-windows10.0.19041.0):
pwsh -NoProfile -File native/build.ps1
产物在 native/bin/Release/。可运行:
native/bin/Release/DshNotificationSink.exe --selftest
最小配置¶
在 profile 的 cordis.patch.yml 中按 id 覆盖:
- id: system-notify
config:
enabled: true
其余字段均有默认值;sink.provider 可选 windows | log | none,Windows 失败时可 fallbackProvider: log。
典型用法¶
规则与开关¶
内置多条有序规则(授权、电脑操控、turn 结束、会话结束等)。match 命中但 enabled: false 会吞掉该条通知,不会落到更宽规则上。自定义 rules 会整体替换内置表,保留内置行为需一并抄写。
占位符示例:{session} {tool} {reasonText} {turn} 等,用于 title / body 模板。
节流与静音¶
全局闸门包括去重窗口、最小间隔、每分钟上限、可选 quietHours。例如夜间只放行高优先级授权:
throttle:
quietHours:
start: '23:00'
end: '07:00'
allowHighSeverity: true
诊断(桌面端已挂 connection 服务时)¶
curl -X POST http://127.0.0.1:<端口>/api/system-notify/status
curl -X POST http://127.0.0.1:<端口>/api/system-notify/test -d "{}"
curl -X POST http://127.0.0.1:<端口>/api/system-notify/throttle/reset
排障时先看 /status 里 sink.detail.helper.located 与 counters.skipped(未构建助手、子会话被过滤、被节流等)。
适用场景与注意¶
适合:在 Windows 上用 DSH 桌面端跑 agent,希望离开主窗口时仍能通过系统通知感知授权、电脑操控、轮次结束与会话终止。
限制与注意:
- 仅 Windows;Linux / macOS 不适用。
- 插件随当前 DSH 进程权限运行;安装前请阅读仓库源码与 MIT 许可证,自行评估信任边界。
- 社区目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系;DSH 生态奉行「一切皆插件」,本介绍事实以仓库 README 为准。
结尾¶
dsh-system-notify 把通知挂在已有运行时事件上,与 LLM 输出解耦,适合需要「少盯窗口、关键状态仍能被系统打断」的 Windows DSH 用户。进一步细节见 GitHub README 与 插件目录页。