前言¶
在 DeepSeek Harness(DSH)裏讓智能體跑 shell,常見 tension 是:需要「完全訪問」才能把活幹完,又怕一條 rm -rf 或誤操作 git 把 workspace 或本地數據清掉。官方實驗性的 Auto 預設會對每一次工具調用做較寬審查,token 成本和誤攔都偏高。社區維護者 IFIAnder 的 dsh-loose-review 走另一條路:只對命中規則的破壞性候選命令做一次窄模型判斷,放行後若監控目錄內文件淨刪過多還會執行期中止,並可做成權限選擇器裏的獨立預設「自動審查(寬鬆)」(key:loose-review)。
這是什麼¶
dsh-loose-review 是 DSH 的 Cordis 插件(分類 admin-security),倉庫 IFIander/dsh-loose-review,當前 package 版本 1.2.0,MIT 許可證。它給刪除等破壞性 shell 命令加兩道閘:執行前用當前會話的 provider/model 判斷會不會造成嚴重且不可逆破壞;執行中輪詢工作目錄文件數,超過閾值則 abort 並可選彈審批後重跑。
判據刻意很窄:只看命令執行下去的後果,不看動機、授權、是否該用別的方式。不確定時默認傾向放行;審查失敗時默認也是放行(可配 deny)。與官方 @deepseek-ai/dsh-experimental-auto-review(Auto 預設)並列:選 loose-review 時只有本插件介入,選 Auto 時本插件讓位(skipWhenAutoPreset: true)。
核心功能¶
執行前審查¶
受 presets 控制:默認爲空數組表示所有權限預設下都介入;填 ['loose-review'] 則僅在該預設下生效,不匹配時插件完全不動作。
流程要點:
- 只接管 shell 類工具的
command參數(默認含bash、win_bash、pwsh等,可配shellTools)。 - 命中
allowPatterns直接放行。 - 內置破壞性規則預篩:不命中則零 token、零延遲放行。
- 命中則用
temperature: 0做一次窄審查;destructive: false放行,destructive: true則按審批策略ask彈窗或never拒絕。 - 同一會話相同命令在
cacheTtlMs(默認 5 分鐘)內只審一次。
判成破壞時,展示給用戶的理由固定爲簡體中文(prompt 約束 + 英文兜底替換 + audit.jsonl 留痕 reasonRewrittenFrom)。
執行期熔斷¶
命令被放行並開始運行後,插件輪詢會話工作目錄(或 guardPaths)內的文件數;淨減少超過 deletionThreshold(默認 200)則 abort 子進程。輪詢間隔默認 250ms;跳過 node_modules、dist、.git 等(guardIgnore)。熔斷後會彈審批:同意則命令重跑且本次不再裝熔斷器;拒絕則保持中止。審批策略爲 never 的預設下 DSH 不會彈框,想要確認框需處在 ask 策略的預設(如本插件自帶的 loose-review 配置)。
侷限:命令 cd 到未監控目錄再刪則監控不到;防的是「刪得多」而非「刪得準」。
與官方 Auto 的對比(摘要)¶
| Auto review(官方實驗) | 自動審查(寬鬆)· 本插件 | |
|---|---|---|
| 啓用 | 權限選擇器選 Auto |
選「🛡️ 自動審查(寬鬆)」 |
| 審查範圍 | 每個工具調用 | 僅規則命中的破壞性候選命令 |
| 判據 | 破壞性 + 授權 + 範圍等 | 僅嚴重不可逆後果 |
| 默認傾向 | 中等風險需明確授權 | 不確定就放行 |
| Token | 每次調用一次 | 僅命中規則時 |
安裝與啓用¶
需要帶 cordis.patch.yml 插件機制的 DSH(當前桌面版滿足)。安裝命令以倉庫 README 爲準:
dsh plugin add IFIAnder/dsh-loose-review
包內 cordis.patch.yml 會註冊插件;默認在所有權限預設下生效,且只在可能毀數據的命令上介入。
若要做成選擇器裏的獨立預設,在 profile 的 cordis.patch.yml 裏爲 permission 服務增加預設,並把插件 presets 設爲 ['loose-review']:
- id: permission
name: "@deepseek-ai/dsh-permission-presets"
config:
presets:
loose-review:
sandbox: danger-full-access
approval: ask
name: "🛡️ 自動審查(寬鬆)"
description: 完全訪問;刪除等破壞性命令先由模型判斷會不會造成不可逆破壞,判定破壞時詢問你。
defaultPreset: loose-review
- insert:
- id: destructive-command-review
name: './plugins/dsh-loose-review/index.js'
config:
presets: ['loose-review']
自定義預設名裏的 emoji 是爲彌補 DSH 權限選擇器未給第三方預設硬編碼 SVG 圖標的設計取捨。改 permission 等核心服務時建議一次改完並等熱重載完成,避免連續快速保存導致插件樹 inactive。
手動掛載路徑示例:
~/.dsh/profiles/<profile>/plugins/dsh-loose-review/
並在 profile 的 cordis.patch.yml 中 insert 指向 ./plugins/dsh-loose-review/index.js。
典型用法與自檢¶
前提: 若配置了 presets: ['loose-review'],當前會話權限預設必須是「自動審查(寬鬆)」;選「完全訪問」時插件按設計不介入。
無害刪除自檢(10 秒內 audit.jsonl 應出現 "destructive": false):
D=$(mktemp -d /tmp/dcr-check-XXXXXX) && echo hi > "$D/a.txt" && rm -rf "$D"
明顯破壞性示例(在非 git 目錄執行無害前提下,在 /tmp 等環境測試;應彈審批「破壞性命令審查:…。是否仍然執行?」):
cd /tmp && git reset --hard HEAD~1
常用配置片段(寫在插件條目的 config: 下,保存後約 5–10 秒熱重載):
presets: ['loose-review']
onDestructive: auto
failureMode: allow
guardDeletions: true
deletionThreshold: 200
allowPatterns: ['rm\s+-rf\s+node_modules']
promptAppend: |
這個項目裏 build/ 和 dist/ 可以隨便刪,一律判 false。
審計與診斷:plugins/destructive-command-review/audit.jsonl;加載痕跡 loaded.json;需要時可開 trace: true 寫 trace.log。本插件未附 client 包,配置目前通過 cordis.patch.yml 修改,而非 DSH 自帶插件設置頁。
適用場景與注意¶
適合:已在用 DSH 做 agent 開發、希望保留「完全訪問 + 詢問」手感,又只想在真正危險的 shell 上多花模型成本,並希望對「誤刪大量文件」多一道執行期止損的人。
安裝前請自行查看 GitHub 源碼 與 MIT 許可證;插件以當前 DSH 進程權限運行,第三方插件與 DeepSeek / 幻方無官方從屬關係,社區目錄 SkillHub 插件頁 爲獨立生態站點。
卸載:刪除 cordis.patch.yml 裏對應 insert 條目,重啓 DSH,再刪插件目錄。
結尾¶
dsh-loose-review 把 DSH「一切皆插件」的思路落在 admin-security:窄判據、規則預篩省 token、執行期熔斷補盲區,並可與官方 Auto 預設二選一。目錄與源碼:
- https://www.skillhub.cn/plugins/IFIAnder/dsh-loose-review
- https://github.com/IFIAnder/dsh-loose-review