前言¶
用 DSH 跑長任務是常態:發起一個任務,切去幹別的,回來才發現 agent 五分鐘前就跑完了——或者更糟,它一直卡在一個等待你批准的提示上,什麼都沒幹。問題不在於 agent 慢,而在於你沒有被及時叫回來。
dsh-notification 解決的就是這件事。它監聽 harness 自身的生命週期事件,在需要你注意的那一刻發出提醒。下面介紹它的功能、安裝與配置。
這是什麼¶
dsh-notification 是一個 DeepSeek Harness(DSH)插件,由 nishit130 維護,當前版本 0.1.1,MIT 許可證。一句話定位:當 agent 完成一輪、報錯或等待你的批准時,通過桌面、瀏覽器或 webhook 通知你,無需盯着標籤頁。
DSH 的理念是「一切皆插件」,通知這類外圍能力正適合以插件形式掛載,而不需要改動 harness 本身。
它監聽哪三類事件¶
1、Agent finished:agent/status 由 running 變爲 idle,且該輪時長 ≥ minTurnDurationMs 時觸發。默認開啓。
2、Agent error:監聽 agent/error,某一步或某一輪出錯時觸發。默認開啓。
3、Approval needed:監聽 approval/request 瀑布。插件只觀察(observe-only),始終以 next() 委託,不會替你做批准或拒絕的決定。默認開啓。
minTurnDurationMs 的作用是過濾:幾秒就結束的快速輪次不值得打擾,只有達到閾值的一輪才通知。
三個通知渠道,分別在哪裏觸發¶
先說清楚每個渠道在哪臺機器上觸發,這決定你該開哪個:
- 桌面通知(
desktop):零依賴。macOS 用osascript,Linux 用notify-send,Windows 用 PowerShell toast。在運行 dsh server 的機器上觸發,適合dsh web跑在自己機器上的情況。 - 瀏覽器通知(
browser):使用標準 Notification API,在查看 Web UI 的機器上觸發。默認僅在標籤頁隱藏時彈出——標籤頁可見說明你正在看。把browserOnlyWhenHidden設爲false可改變這一行爲。 - Webhook(
webhookUrl):向配置的 URL POST JSON,text字段兼容 Slack,因此 Slack、Discord 或通用 incoming-webhook URL 開箱即用。適合發到手機、Slack 頻道或無人值守場景。
三個渠道可以獨立開關,比如 desktop: false 或 browser: false。
一個需要注意的組合:單機運行且標籤頁隱藏時,同一事件可能同時彈桌面和瀏覽器通知。嫌重複的話,關掉其中一個渠道即可。
安裝¶
dsh plugin --profile web add dsh-notification
# or straight from git:
dsh plugin --profile web add github:nishit130/dsh-notification
兩條命令任選其一。插件是純 ESM JavaScript,沒有構建步驟,因此從 git 安裝也不需要在 allowBuilds 里加條目。
配置¶
在 profile 的 cordis.patch.yml 中覆蓋插件配置(或在 Settings UI 裏改):
- insert:
- id: notify
name: dsh-notification
config:
minTurnDurationMs: 10000 # 只通知 ≥ 10 秒的輪次
webhookUrl: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
notifyOnApproval: true
desktop: true
title: 'DSH'
這段配置做的事:把單輪通知的時長閾值調到 10 秒,接一個 Slack webhook,保留桌面通知,並把通知標題改成 DSH。
全部配置項及默認值:
| 配置項 | 類型 | 默認值 | 含義 |
|---|---|---|---|
notifyOnIdle |
boolean | true |
一輪結束時通知 |
notifyOnError |
boolean | true |
agent/error 時通知 |
notifyOnApproval |
boolean | true |
工具調用等待批准時通知 |
minTurnDurationMs |
number | 5000 |
低於該時長的輪次不通知 |
desktop |
boolean | true |
在 server 宿主機發原生桌面通知 |
browser |
boolean | true |
在 Web UI 彈瀏覽器通知 |
browserOnlyWhenHidden |
boolean | true |
標籤頁可見時抑制瀏覽器通知 |
webhookUrl |
string | '' |
可選的 POST 目標(Slack 兼容 payload) |
title |
string | 'DeepSeek Harness' |
桌面通知標題 |
Webhook 的 payload 長這樣:
{
"text": "Agent finished — done in 2m 14s",
"summary": "Agent finished",
"body": "done in 2m 14s",
"level": "info",
"ts": "2026-08-21T12:34:56.000Z"
}
text 是 Slack 兼容字段,summary 與 body 便於自定義消費方拆分展示,level 和 ts 提供級別與時間戳。
設計上的三個決策¶
經過上面的步驟,插件已經能正常工作。它的實現有幾處設計值得了解:
1、經 ctx 註冊的一切都是 effect。卸載或熱重載時監聽器自動移除,沒有手動清理路徑(Cordis revertible effects)。
2、approval/request 是瀑布。插件只觀察,監聽器始終調用 next()——不調用就會搶佔決策權、吞掉真正的回答方。
3、永不打斷 agent 循環。桌面通知以 detached fire-and-forget 方式 spawn,webhook 失敗被吞掉,通知器絕不向 agent 回合拋錯。
本地開發¶
想改代碼的話,先複製 dev.patch.example.yml 爲 dev.patch.yml(已被 gitignore),把它指向你 checkout 的絕對路徑,再在 harness 源碼 checkout 中運行:
pnpm dsh web --patch ./path/to/dsh-notification/dev.patch.yml
對 index.js 的修改可以熱重載,無需重啓。測試用 npm test 跑。
適用場景與注意事項¶
按部署方式選渠道:
- harness 跑在自己機器上:開桌面通知即可。
- harness 跑在遠程服務器、Web UI 在本地看:開瀏覽器通知。
- 無人值守或長任務:配 webhook,把消息送進 Slack、Discord 或任何能收 POST 的服務。
兩點提醒:
1、插件以當前 dsh 進程的權限運行,安裝前建議先讀一遍源碼和許可證(本項目爲 MIT)。從 package.json 的 files 字段看,插件只包含 index.js、client.js、cordis.patch.yml 三個文件,檢查成本不高。
2、瀏覽器通知需要 Web UI 在你首次點擊或按鍵時請求權限,裝好後先和頁面交互一次。
結尾¶
dsh-notification 解決的問題很具體:agent 跑長任務時,你不必再定時回來刷新標籤頁。三類事件、三個渠道、一個時長閾值,配置面不大,默認值基本開箱可用。
- 插件目錄頁:https://www.skillhub.cn/plugins/nishit130/dsh-notification
- GitHub:https://github.com/nishit130/dsh-notification
收錄該插件的 skillhub.cn 是社區維護的插件目錄,與 DeepSeek 官方無從屬關係。