@dsh-external/dsh-sentinel
DSH 哨兵:条件驱动的 agent 唤醒系统——文件/进程/端口/命令传感器,订阅存为会话事件,重启自动复活;每个订阅、每次触发对用户完全可见
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:fuhefei/dsh-sentinel说明文档
阅读完整 README ↗dsh-sentinel
Condition-driven wakeup for DeepSeek Harness: the agent registers a watch, goes to sleep — even closes the session — and the sentinel wakes it when the condition happens. Every subscription and every fire is a user-visible session event, and the browser dock shows what is on duty.

How it works
The node half owns one server-lifetime runtime that folds a plugin-owned sidecar log ($DSH_HOME/sentinel.jsonl) into live subscriptions, probes every sensor on a shared 5s heartbeat, and delivers wakeups through the official followup channel — resuming a dormant session's agent first when needed. Subscriptions therefore survive process restarts, and conditions that become true while the server is down late-fire on the next probe.
The browser half is a dock card above the composer (the conversation.input.dock family) listing the session's active watches — sensor, target, live probe state, fire budget, next-probe countdown — plus recent fire history when expanded. It polls the read-only state route and renders nothing when the session has no watches.
Two surfaces make the server-global watch set visible. A sidebar branch grows under every session row that has active watches (sidebar.workspaces.sessionRow.branch, one shared poller for all rows) — collapsed it is a 👁 count, expanded it lists the session's watches and links to the dashboard. The dashboard is a standalone table of every watch across every session: session (active/dormant), sensor, target, pattern, fire budget, last probe state, next probe.
| Sidebar branch | Global dashboard |
|---|---|
![]() | ![]() |
Sensors
| Kind | Engine | Fires on |
|---|---|---|
file | path snapshot + inotify push | snapshot change (sub-second); accelerated by fs events |
command | read-only shell line, probed on an interval | output/exit-code change |

