前言¶
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 與 插件目錄頁。