前言¶
在 DeepSeek Harness(DSH)裏跑智能體時,常見兩類「寫在技能裏、運行時卻沒人遵守」的規則:大文件下載應走本機 aria2 引擎,按路徑找文件應走 Everything 而不是內置 glob。提示詞只是建議,模型仍可能用 curl -o、wget -O 或內置 glob,速度和可觀測性都會差一截。下面介紹社區插件 dsh-ops-guard(維護者 BeiWay1145,分類 admin-security),它把上述建議變成 tools/pre-execute 上的運行時裁決。
這是什麼¶
dsh-ops-guard 是 DSH 插件,監聽 cordis 的 tools/pre-execute 鉤子(waterfall 模式),在 shell 與 glob 真正執行前攔截並處置:
| 守衛 | 規則 | 替代通道 |
|---|---|---|
| 下載守衛 | 大文件下載必須走 aria2 | 隨包腳本 aria2-dl.cjs → aria2-next(Motrix Next) |
| 搜索守衛 | 按路徑找文件必須走 Everything | Everything 常駐 IPC(\\.\PIPE\Everything IPC) |
兩者攔截點相同,攔截後的處理不同,這是插件設計的核心:
- 下載守衛:拒絕執行,並在拒絕理由裏給出可複製的 aria2 命令(下載有副作用,守衛不能替模型執行)。
- 搜索守衛:拒絕執行內置 glob,但在拒絕理由裏直接返回 Everything 的查詢結果(只讀查詢,守衛在 DSH 進程內走 IPC 算完再返回)。
倉庫:https://github.com/BeiWay1145/dsh-ops-guard
社區目錄頁:https://www.skillhub.cn/plugins/BeiWay1145/dsh-ops-guard
爲什麼需要運行時守衛¶
下載:shell 命令與 aria2 腳本在形態上無法區分¶
README 記載:同一條約 4.76 GB 鏡像,aria2-next 通道實測約 11.78 MB/s,而用 node 單連接 https 的繞過通道約 0.13 MB/s,斷點續傳能力也不一致。agent 只要手邊有 download.cjs,在 shell 裏執行 node download.cjs 與走 aria2-dl.js 看起來一樣,沒有機制在提示詞層區分,因此需要在 pre-execute 拒絕 curl -o、wget -O 等落盤下載。
搜索:內置 glob 能用,模型沒有動力換 Everything¶
內核 glob 可用時,模型沒有理由主動用 Everything。規則必須落到運行時;守衛在 IPC 可用時用索引回答,成本主要是 IPC 往返(Everything 進程已常駐),而不是每次啓動 ripgrep/glob 遍歷目錄樹。README 中的 bench/scope-latency.mjs 數據表明:在多種搜索範圍下,守衛相對內置 glob 的中位延遲更低(例如整盤級路徑 D:\VibeCoding 量級差異 README 記爲約 68 倍)。Everything 是文件名索引,不是內容索引;剛創建的文件可能有約數秒索引延遲,且內容搜索需用戶顯式開啓——因此守衛只攔 glob,不攔 grep。
攔截規則與放行邊界¶
會攔截的情況¶
| 規則 | 觸發 | 處置 |
|---|---|---|
curl-output |
curl -o / -O |
拒絕 + aria2 命令 |
wget-output |
wget -O |
拒絕 + aria2 命令 |
invoke-webrequest-outfile |
Invoke-WebRequest -OutFile |
拒絕 + aria2 命令 |
bits-transfer |
Start-BitsTransfer |
拒絕 + aria2 命令 |
glob |
內置 glob 工具 | 拒絕 + 實際搜索結果 |
必須放行的例子¶
curl https://api.x/data:輸出到 stdout,不落盤。Invoke-RestMethod等不落盤請求。- 非 shell 工具、grep(內容搜索仍走內置工具)。
- 拒絕理由中會說明 grep 未被攔截,避免模型誤繞路。
管道或 Everything 不可用時,搜索守衛會回落爲「給命令」模式(searchDenialMessage),避免因守衛本身讓搜索完全失效。
安裝與啓用¶
官方安裝命令(來自 README):
cd ~/.dsh && dsh plugin --profile <your-profile> add "dsh-ops-guard@github:BeiWay1145/dsh-ops-guard"
安裝後重啓 DSH 生效。搜索守衛要求本機運行 Everything(含 es.exe);下載守衛要求本機運行 aria2-next 引擎(Motrix Next 內置),隨包腳本通過 JSON-RPC 與之通信,不依賴 aria2c.exe。
插件以當前 DSH 進程權限運行;安裝前請自行查看倉庫源碼與 MIT 許可證(package.json 版本 0.1.0,要求 Node >= 20)。
典型用法¶
被攔截的下載:按拒絕理由改用 aria2-dl¶
攔截後模型會看到類似說明:下載必須走本機 aria2,並給出隨包腳本的絕對路徑(由 import.meta.url 解析),URL 會從被攔命令中自動提取。可直接在終端使用:
node scripts/aria2-dl.cjs <url> --out=<文件名> [--dir=<目錄>] [--no-wait]
node scripts/aria2-dl.cjs --status <gid>
node scripts/aria2-dl.cjs --list
環境變量(README 記載):
| 變量 | 默認 | 說明 |
|---|---|---|
ARIA2_RPC_PORT |
16800 |
引擎 RPC 端口 |
ARIA2_RPC_TIMEOUT_MS |
15000 |
RPC 超時 |
ARIA2_DOWNLOAD_DIR |
用戶 Downloads 目錄 | 默認落盤目錄 |
引擎未啓動時腳本會明確報錯,而不是靜默失敗。
被攔截的 glob:結果已在拒絕理由中¶
搜索守衛不會讓模型再跑一次 glob;拒絕文本中包含匹配數量、路徑列表、IPC 耗時,以及必要時 es.exe 的示例命令。若需不同查詢,可按提示使用與 Everything 相同的模式語言。
工作原理(簡述)¶
模型請求 glob("**/*.md", path: "D:/proj")
↓
tools/pre-execute 鉤子觸發
↓
搜索守衛經 Everything IPC 查詢 → 拿到結果
↓
返回 { kind: 'deny', reason: '<拒絕說明 + 實際結果>' }
↓
內置 glob 未執行,模型直接讀到結果
下載路徑同理:pre-execute 只能 allow/deny/ask/cancel,無法改寫調用,故下載側採用「拒絕 + 完整替代命令」。
適用場景與已知邊界¶
適合:希望在 DSH 會話內統一大文件下載到 Motrix Next / aria2-next,並強制文件名搜索走 Everything IPC 的團隊或個人;與「一切皆插件」的 DSH 生態一致,插件來自社區目錄 SkillHub,與 DeepSeek / 幻方無官方從屬關係。
注意:
- 攔不住命令內部的下載(例如
python script.py內 urllib);DSH 外終端裏的curl -o不受影響。 - Everything IPC 協議未公開,版本變更可能導致守衛回落爲「給命令」模式。
- 新寫入磁盤的文件可能短暫查不到;內容搜索請繼續使用 grep。
結尾¶
dsh-ops-guard 把 aria2 下載與 Everything 文件搜索從「技能建議」收束爲 pre-execute 上的強制策略,並用「拒絕 + 命令」與「拒絕 + 結果」兩種處置區分副作用操作與只讀查詢。如需安裝或 issue,見 GitHub 倉庫 與 SkillHub 目錄頁。