dsh-loose-review:爲破壞性 shell 命令加窄審查與執行期熔斷

前言

在 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'] 則僅在該預設下生效,不匹配時插件完全不動作。

流程要點:

  1. 只接管 shell 類工具的 command 參數(默認含 bash、win_bash、pwsh 等,可配 shellTools)。
  2. 命中 allowPatterns 直接放行。
  3. 內置破壞性規則預篩:不命中則零 token、零延遲放行。
  4. 命中則用 temperature: 0 做一次窄審查;destructive: false 放行,destructive: true 則按審批策略 ask 彈窗或 never 拒絕。
  5. 同一會話相同命令在 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
羽毛球分组比赛记分
小程序二维码

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

小夜