前言¶
DeepSeek Harness(dsh)是 DeepSeek 開源的智能體運行時,核心理念是「一切皆插件」:模型、工具、會話、調度和界面都可以用插件增刪。智能體實際幹活時,經常要等一件事發生——構建產物落盤、HTTP 接口恢復、某個進程起來或掛掉、CI 推一條結果過來。如果讓模型自己輪詢,既耗 token,關了會話就斷了;如果人肉盯着,又失去了把循環交給運行時的意義。
社區插件目錄 DeepSeek Harness 插件庫 收錄了面向這類等待場景的插件 dsh-sentinel。該目錄是獨立的社區站點,與 DeepSeek / 幻方沒有官方從屬關係,條目指向維護者倉庫,安裝前需要自己覈對源碼。本文按目錄頁、GitHub 倉庫 README 與源碼交叉覈實後,介紹它是什麼、怎麼裝、怎麼用。
本文覈實日期爲 2026-08-18。倉庫當前發佈版本爲 v0.11.0(2026-08-17)。
這是什麼¶
dsh-sentinel 是一款由 fuhefei 維護的 DeepSeek Harness 插件。社區目錄把它分在「界面增強」,因爲它在 Web UI 上提供 dock 卡片、側邊欄分支和全局 dashboard;能力本身是條件驅動喚醒:智能體註冊一條持久監視(watch),之後可以休眠甚至關掉會話,條件成立時由哨兵通過官方 followup 通道把它叫醒,必要時先復活休眠會話裏的 agent。
許可證爲 BSD-3-Clause,主要語言是 TypeScript。截至本文覈實,GitHub 倉庫 fuhefei/dsh-sentinel 的 star 數爲 11;目錄頁當時顯示爲 6,星標以倉庫頁面爲準。npm 上的包名是 dsh-sentinel,運行時無第三方依賴。
它要解決的問題很具體:把「等到某件事發生再繼續」從對話循環裏拿出去,交給與 server 同生命週期的值守進程,並且每一次訂閱、每一次觸發都寫成用戶可見的會話事件。
核心能力¶
倉庫 README 把傳感器分成六種。目錄頁簡介寫的是文件 / 命令 / HTTP / 進程 / Webhook,倉庫還多了一種 port(TCP 可達性),下面以倉庫爲準。
1、file:對路徑做快照,並用 inotify 推送加速,快照變化時觸發,延遲可以到亞秒級。
2、command:按間隔執行一條只讀 shell,輸出或退出碼變化時觸發。
3、http:按間隔探測 URL,狀態碼或響應體變化時觸發。
4、process:用 pgrep -f 按模式探測,匹配集合變化時觸發。
5、port:對 [host:]port 做 TCP 連接,可達性在 open / closed / timeout 之間變化時觸發。
6、webhook:純推送。註冊後會得到一條 hook URL,對它發任意 POST 即可喚醒。
帶 pattern 時,探測類傳感器在該正則的「不匹配 → 匹配」邊沿觸發,webhook 只接受匹配的載荷;不帶 pattern 時,探測類傳感器對基線之後的任何變化觸發,webhook 對任意 POST 觸發。首次探測的語義也寫在倉庫裏:不帶 pattern 的 watch 把第一次觀測當成基線(不觸發);帶 pattern 且目標已經匹配時,第一次探測就會觸發。
值守不在單次對話裏。Node 側把插件自己的 sidecar 日誌($DSH_HOME/sentinel.jsonl)摺疊成活躍訂閱,按共享心跳(默認 5 秒)探測;命中後走官方 followup 投遞。訂閱能扛住進程重啓;server 停機期間變真的條件,會在下一次探測時補觸發。投遞是 at-least-once:崩潰前已記錄但沒送出的觸發,重啓後從 delivered 水位線重新入隊。
值守是常駐進程的事,通常是 dsh web。一次性 headless 運行也能加載插件、創建 / 列出 / 取消 watch,但進程退出後沒人探測;等下一個常駐進程起來,這些 watch 會自動恢復。每個 $DSH_HOME 只有一個值守 owner,靠租約文件 sentinel.lease 協調:第一個進程負責探測和投遞,同一 home 上的第二個 dsh 進程保持被動,owner 死後在一個租約 TTL 內接管。
瀏覽器側有三塊界面:
- composer 上方的 dock 卡片(conversation.input.dock),列出本會話的活躍 watch:傳感器、目標、即時探測狀態、觸發預算、下次探測倒計時;展開可以看到最近觸發歷史。沒有 watch 時不渲染。
- 全局 dashboard:跨所有會話的 watch 表,路徑是 GET /plugins/dsh-sentinel/dashboard。
- 側邊欄會話行下的分支(摺疊時是計數,展開後列出該會話的 watch)。dock 和 dashboard 在原版 host 上就能用;側邊欄分支依賴官方樹尚未聲明的擴展洞,需要給 DSH 源碼打上倉庫附帶的 patches/session-row-holes.patch 並重建 ui-workspace。這個補丁和 dsh-subagent-tree 對同名洞的補丁語義不同,不要同時打。
同一 profile 裏如果裝了 dsh-better-sidebar,sentinel 會把全局 watch 表註冊成側邊欄 tab(dsh-sentinel:watches);沒裝則靜默跳過。和 dsh-notification 一起用時,倉庫說明是零集成代碼:哨兵叫醒 agent,agent 幹完這一輪,回合結束觸發桌面通知。
面向模型的工具只有三個:sentinel_watch 註冊,sentinel_list 列出本會話活躍 watch 及即時探測狀態,sentinel_cancel 按 id 取消。
安裝與啓用¶
社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端中運行即可:
dsh plugin add github:fuhefei/dsh-sentinel
如需可復現安裝,目錄頁建議固定 commit 哈希:
dsh plugin add github:fuhefei/dsh-sentinel#commit
把上面的 commit 換成實際哈希。倉庫 README 還提供了兩條寫法,一條走 npm 包名,一條把 git 源釘在當前發佈標籤 v0.11.0(構建產物直接提交在倉庫裏,git 源安裝不需要再跑構建):
dsh plugin --profile web add dsh-sentinel
dsh plugin --profile web add "github:fuhefei/dsh-sentinel#v0.11.0"
v0.11.0 的發行說明寫明:包名已從 @dsh-external/dsh-sentinel 改爲無 scope 的 dsh-sentinel。如果以前按舊名字裝過,需要把 profile 裏的舊行換成 dsh-sentinel;watch 本身寫在 sidecar 日誌裏,不跟安裝包走,切換後訂閱還在。
部署相關的旋鈕在插件 config schema 裏,可在 profile 的 cordis.patch.yml 裏對 bundle 行覆蓋。倉庫給出的默認值如下:
- id: dsh-sentinel
name: dsh-sentinel
config:
heartbeatMs: 5000
probeConcurrency: 8
maxSubscriptionsPerSession: 16
maxPendingWakeups: 8
defaultIntervalSeconds: 30
defaultCooldownSeconds: 60
dutyLeaseTtlMs: 30000
notifyWebhookUrl: ''
非法值會在插件加載時按 schema 報錯,而不是運行時 silently 亂來。notifyWebhookUrl 非空時,每次觸發會額外 JSON POST 到該地址(字段包括 plugin、event、sessionId、id、kind、target、note、fireNumber、maxFires、summary、after),可以接到飛書 / 企微 / Slack 或任意接收端。這條外發是 at-most-once:POST 失敗只在日誌裏 warn,不阻塞 harness 內的喚醒。
典型用法¶
安裝完成後,在會話裏直接告訴智能體要監視什麼即可,不必自己寫輪詢循環。sentinel_watch 的參數以倉庫源碼裏的工具定義爲準:kind、target、note 必填;可選 pattern、interval_seconds、max_fires、cooldown_seconds、expires_in_seconds。
kind 與 target 的對應關係如下:
file:絕對路徑command:只讀 shell 單行http:URLprocess:交給pgrep -f的模式port:[host:]port,端口範圍 1–65535webhook:給預期調用方起的短標籤,真正用來推送的是返回的 hook URL
note 會隨每次喚醒原樣送達,相當於留給「被叫醒之後的自己」的便籤,不能爲空。max_fires 默認 1,也就是一次性;需要反覆觸發時再顯式加大。cooldown_seconds 默認 60。探測間隔默認 30 秒;webhook 忽略間隔,file 會由文件系統事件加速。源碼會把間隔夾到 5–86400 秒(README 工具一節曾寫 1–3600 秒,以源碼爲準)。pattern 使用 JavaScript 正則(m 標誌);佔位狀態(文件不存在、URL 不可達、沒有匹配進程)不會被 pattern 命中,避免「文件還沒出現就用盡觸發額度」。
註冊之後可以用 sentinel_list 查看本會話的活躍 watch 和最近探測狀態,用 sentinel_cancel 按 id 取消,id 形如 watch-3。Web UI 的 dock、dashboard 表和各行上的 ✕ 也會走手動取消接口 POST /plugins/dsh-sentinel/cancel?sessionId=…&id=watch-N。host 沒有 session-deleted 事件,會話刪掉後孤兒 watch 會繼續探測,直到人手取消,所以這個開關是最後的兜底。
webhook 場景下,工具會返回完整的推送地址:
POST /plugins/dsh-sentinel/hook?id=watch-N&s=
s 是會話限定符,避免兩個會話都叫 watch-1 時 hook 撞車。不帶 s 的舊 URL 仍可用,會解析到第一條匹配的 webhook watch。倉庫建議把這條 curl 塞進 CI 任務、git hook 或另一臺機器的腳本。完整 URL 按密鑰對待:拿到它的人就可以叫醒對應會話裏的 agent。
只讀狀態接口是 GET /plugins/dsh-sentinel/state?sessionId=…,省略 sessionId 返回所有會話,供 dock 和側邊欄輪詢。
適用場景與注意事項¶
更適合已經在跑 dsh web、需要把「等到條件成立再繼續」交給運行時的人。典型方向包括:等某個文件或構建產物出現、等 HTTP 健康檢查從失敗變爲成功、等本機進程或端口狀態翻轉、以及讓 CI / git hook 從外部推一把把 agent 叫醒。它不是通用定時任務框架,也不替代通知插件本身。
使用前有幾條邊界需要看清楚。
1、插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查源代碼倉庫和許可證。
2、探測和投遞依賴長期運行的 dsh 進程。只跑一次 headless 就把進程退出,watch 會寫進 sidecar,但當時不會有人探測。
3、command 傳感器會在每次探測時執行配置的 shell 行,信任邊界和 host 自帶的 shell 工具相同,不要把不可信命令寫進去。
4、webhook URL 視爲密鑰;瀏覽器標記的跨站請求和 DNS rebinding 嘗試會被四條路由以 403 拒絕,curl 和 CI 這類無頭客戶端不受影響。
5、每會話活躍訂閱上限默認 16,每會話排隊喚醒上限默認 8,超出丟最舊的。dashboard 會顯示被丟掉的排隊喚醒。
6、側邊欄分支不是開箱即用,需要給 DSH 源碼打補丁;dock 和 dashboard 不依賴這塊。
7、社區目錄不是官方應用商店。本插件是社區開源項目,不代表 DeepSeek 官方背書。
小結¶
dsh-sentinel 把條件監視做成可持久、可看見、可取消的值守:智能體註冊完就可以去睡覺,文件、命令、HTTP、進程、端口或 Webhook 條件成立時再被叫醒。界面上的 dock 和 dashboard 讓訂閱不再是後臺黑盒。安裝、源碼和許可證以目錄頁與倉庫爲準,裝之前自己看過再決定。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-sentinel/
GitHub:https://github.com/fuhefei/dsh-sentinel