dsh-ops-guard:在 pre-execute 層強制下載走 aria2、文件名搜索走 Everything

前言

在 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 目錄頁。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜