dsh-system-notify:在 agent 运行时用 Windows 系统通知提醒授权与任务状态

前言

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 分钟冷却,避免同会话连续调用刷屏。

两条默认行为:

  1. 授权延迟:scope.approvalGraceMs 默认 1500 ms,避免「刚弹出审批你已在界面点完」的误扰。
  2. 子会话: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 与 插件目录页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye