dsh-approval-memory:把 DSH 審批請求記下來,再按類決定是否自動同意

前言

用 DSH 跑智能體時,會持續遇到要人確認的請求:裝插件、列插件、切沙箱、寫文件。每次都彈窗點「同意」,久了要麼麻木點滿,要麼乾脆不裝不用。痛點不是沒有確認機制,而是確認時缺少上下文:這個請求之前出現過幾次、屬於哪一類、風險等級如何。

下面要介紹的插件 dsh-approval-memory(簡稱 DAM)就是做這件事的:它在當前 profile 內記錄每一次 approval/asked 與 approval/decided,把請求歸到相對穩定的類裏,顯示次數、風險和最近出現時間,並允許用戶對低風險只讀類打開自動同意開關。

這是什麼

DAM 是一個 profile 級的 DSH Host + Client 插件,維護者爲 TMrazbw,分類屬於 admin-security,在社區插件目錄 skillhub.cn 上有獨立條目。它不改動 DSH 核心、不引入自定義 session 事件類型,只用公開事件與公開服務。

它要解決的問題是:把「哪些請求我反覆同意過」這類信息從一次性彈窗裏撈出來,變成可查看、可審計、可逐類開啓的規則;同時把高風險類固定留在人工確認一側。它的一個明確邊界是,自動同意只發一次性授權,仍然返回 allowed-once,不復用爲長期放行。

核心能力

按一次安裝後實際會拿到的東西寫:

1、採集。從當前 profile 下每個 session 收集 approval/asked 與 approval/decided 事件。

2、歸類。請求被歸到穩定的類名,例如 plugin_manager:list_bundles、bash:sandbox:danger-full-access。

3、展示。面板列出請求名、操作、次數、風險、最近一次出現時間;統計按觀察到的頻率排序,主表突出展示已自動同意的次數。

4、不可逆動作標記。force-push、deploy、data-delete、send-message 只在展示與審計時打標籤,不會影響自動同意。

5、逐類開關。低風險只讀類可以單獨打開自動同意。

6、會話內路徑信任。這是隻在當前對話裏生效、重啓即清的特性:

  • 非敏感路徑的 read 請求直接自動同意;
  • 敏感路徑先保持人工;一旦某條精確路徑被同意過一次,該 session 內就信任這條路徑;
  • 手工同意一次某個 write / edit,只信任該 session 下的這個文件;
  • 不做父目錄繼承,也不做 shell 信任。

7、不可自動同意的統計區。一個可摺疊的「no auto-approval」分區,裏面分兩組:一組是其他已觀察到但無法切換的類(帶命令預覽、風險標籤、目標、cwd);另一組是永久黑名單(只讀計數,無開關,不可生成規則)。

8、重複拒絕提示。對最近一條命令的哈希,如果出現重複拒絕,會從保留的審計事件裏查出並提示;保留窗口不是固定的 30 天,保留窗口可能更短。

9、結果近似統計。從 tool/result 事件裏近似統計自動同意後的結果,分爲 ok / error / no-result。

10、審計。自動同意過的請求會寫入審計日誌。

11、入口。側邊欄面板、/dam-ui 命令,以及支持自然語言打開面板的 agent 工具 open_dam_ui。面板打開時才加載數據,也提供手動刷新;長表格支持橫向和縱向滾動。

安裝與啓用

在 DSH Web session 裏,把它作爲 profile bundle 安裝:

plugin_manager
  action: install_bundle
  target: https://github.com/TMrazbw/dsh-approval-memory

或者用 DSH CLI:

dsh plugin --profile <profile> add https://github.com/TMrazbw/dsh-approval-memory

這一步需要審批授權;是否需要重啓取決於該 profile 的 HMR 配置。插件面向公開的 DSH 0.2.x 插件與事件 API,README 寫明在 DSH 0.2.1-rc.2 上驗證過,其他版本的 API 變化可能需要自行調整。

典型用法

裝好之後:

1、從左側邊欄打開「自動同意請求」,或在命令裏輸入 /dam-ui;

/dam-ui

2、也可以直接對 agent 說「我要看 DAM 的界面」或「open the DAM UI」,agent 會調用 open_dam_ui;

3、面板只會列出真實出現過、且可以自動同意的類;黑名單和中高風險類只計數,不出現在可切換表格裏,黑名單另有隻讀分區;

4、在需要放開的低風險只讀類上打開開關即可;

5、「關閉全部自動同意」會停掉所有已知規則,但不會關閉面板;

6、「返回對話」關閉面板並回到對話。

命令名是小寫:輸入命令爲 /dam-ui,側邊欄菜單標籤是 DAM-UI。

默認自動同意的範圍

V1 默認對以下低風險只讀類開啓自動同意:plugin_manager:list_plugins、plugin_manager:list_bundles、plugin_manager:list_version_exemptions、plugin_manager:inspect(當前 DSH 暴露該操作時才生效)。除此之外都偏保守:

類 行爲
plugin_manager:set_plugin / set_bundle 展示,開關禁用(中等風險)
plugin_manager:install_bundle / remove_bundle 僅統計
plugin_manager:set_version_exemption 黑名單,永不自動同意
bash / pwsh 沙箱升級 僅統計
write / edit 沙箱升級 僅統計
bash / pwsh / write / edit 完全訪問 黑名單
unknown / MCP / PTC 僅統計

風險標籤是靜態推斷出來的,README 明確說明這不是安全保證。

作用範圍與數據目錄

插件作用於安裝了它的當前 DSH profile 下的所有 session;subagent session 會被計數,但默認對 subagent 關閉自動同意。其他 profile、其他進程、以及安裝之前產生的請求都不在覆蓋範圍內。

數據默認落在 %DSH_HOME%/approval-memory:

%DSH_HOME%/approval-memory
  classes.json
  rules.json
  events.jsonl
  _plugin.log

可選配置有四項:

dataRoot      默認 %DSH_HOME%/approval-memory  數據目錄
maxEvents     默認 5000                          保留的審計事件數
maxExamples   默認 3                             每個類保留的示例數
includeSubagents  默認 false                     允許在 subagent session 中自動同意

另有一個環境變量覆蓋入口:DSH_APPROVAL_MEMORY_ROOT。

安全邊界

這部分值得在採用前讀完:

  • 自動同意是用戶主動打開的規則,不是插件推斷「用戶應該會同意」。
  • 重複請求不會自動生成規則;V1 從不把重複出現當作同意。
  • 只要某個請求類有過拒絕記錄,就可以被檢視。
  • 黑名單由代碼持有,無法通過 UI 或 API 移除。
  • open_dam_ui 只負責打開面板,不會改任何規則。
  • 面板走帶鑑權的 connection.fetch 路由:GET /api/approval-memory.snapshot 與 POST /api/approval-memory.mutate(支持 setRule 與 closeAll)。

需要多說一句的是:插件以當前 DSH 進程的權限運行,自動同意因此繼承會話已有的授權範圍。安裝前應當讀一遍源碼、確認許可協議,再決定是否打開任何自動同意開關。

代碼結構與測試

插件不需要構建步驟,只用公開事件/服務與瀏覽器模塊加載器。README 給出的目錄大致是:

index.js           Host 入口
client.js          Client 入口:面板、側邊欄、/dam-ui、open_dam_ui
lib/classes.js     請求類目錄
lib/blacklist.js   永久拒絕列表
lib/extract.js     callId、tool-call、command/cwd、reason 提取
lib/format.js      計數、時間、脫敏
lib/store.js       文件持久化
lib/host.js        審批運行時
lib/path-trust.js  session 內路徑歸一化與敏感路徑判定
lib/command-risk.js 命令風險啓發式
test/              136 個 Node 測試
locale/            en / zh 展示元數據

跑測試:

node --test --test-isolation=none

README 寫明當前測試集是 136 個,覆蓋分類、提取、脫敏、存儲、Host 運行時、數據橋接、Client 註冊、命令風險解析、路徑信任、結果跟蹤和集成流程。

適用場景與注意

適合這類人:DSH 會話裏審批請求數量已經偏多,且需要可追溯的審計記錄;希望把「只讀列舉類」的重複確認放開,同時不願意放開寫操作和全權命令。

不適合期待它做決策代理的場景:它不替代人工判斷,風險標籤是靜態推斷;自動同意按類單發,不提供長期放行;路徑信任侷限在單個 session,重啓即消失。

其他兩點:插件記錄的是 profile 內發生過的請求,不會跨 profile 或跨進程;黑名單元數據也說明它不能用來放開某些被固定禁止的類。許可協議爲 MIT。

結尾

DAM 的價值在於把審批請求從「每次彈窗」變成「有類、有次數、有風險標記、可逐類開關、可審計」的記錄,同時把手伸得較短:只放開默認白名單裏的只讀列舉類,其餘進統計或黑名單。它不改變 DSH 核心,也沒有自定義事件,接的是公開 API。

目錄頁:https://www.skillhub.cn/plugins/TMrazbw/dsh-approval-memory

GitHub:https://github.com/TMrazbw/dsh-approval-memory

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

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

小夜