dsh-remember-approval:同一會話內記住已批准的審批請求

前言

DeepSeek Harness(DSH)默認只支持一次性授權,審批 outcome 只有 allowed-once / rejected / cancelled / unavailable,官方說明“沒有 allow-always、沒有記憶規則、沒有授權存儲;會話策略只有 ask / never”。因此只要沙箱攔一次,同類操作之後仍會逐個彈窗。

插件定位

dsh-remember-approval 是一個 DSH 記憶類插件(v0.1.0 · beta),由維護者 washengru 負責開發。它在一個會話內,對相同工具 + 同動作前綴的審批請求,若已人工批准則直接放行,不再重複詢問。

核心能力

  • 會話級記憶:同一會話內,對相同 tool + action prefix 的審批請求,若已批准則直接放行;工具或動作前綴不同仍會詢問
  • 自動過濾:reason 爲空的請求默認不記憶;下游秒批(耗時低於 minHumanDelayMs)不記憶
  • 安全邊界:命中 skipTools 或 neverRemember 的請求永遠人工確認
  • 安全閥:通過 neverRemember 可以將最敏感的操作(如危險權限、刪除命令)永遠人工確認

記憶粒度與限制

DSH 官方限制:審批請求只帶工具名、reason、callId,不帶工具參數。reason 的真實形態是「動作前綴: 每次現寫的理由」,例如 escalate sandbox to danger-full-access: 第三次探針寫入……。記憶鍵只取冒號前的動作前綴,正文不參與,否則同類請求永遠命中不了。

這意味着一次批准會讓「同工具 + 同動作前綴」的後續請求一起放行,也意味着一次誤批會讓同類請求一路通行。建議配合 neverRemember 給自己留一道安全閥。

安裝與啓用

方式 A:插件管理器(若你的 DSH 版本支持)

先確認你的 DSH 有插件管理子命令(dsh plugin --help 能看到 add),然後:

從 GitHub 直裝:

dsh plugin --profile desktop add https://github.com/washengru/dsh-remember-approval

或從包名裝(發佈到 npm 之後):

dsh plugin --profile desktop add dsh-remember-approval

從本地目錄安裝也可以:

dsh plugin --profile desktop add ./dsh-remember-approval

這條路徑依賴具體 DSH 版本的插件管理命令,作者只在方式 B 上做過真機驗證;方式 A 失敗時請直接用方式 B。手動掛載不需要 package.json 裏的 dsh.bundle.patch 字段,刪掉它也不影響方式 B。

方式 B:手工掛載

  1. 把整個目錄拷到 %USERPROFILE%\.dsh\profiles\<profile>\node_modules\dsh-remember-approval\(<profile> 默認是 desktop;Windows 上可以直接雙擊本目錄的 install.cmd 一步完成)
  2. 在 %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml 末尾追加:
- insert:
    - id: remember-approval
      name: dsh-remember-approval
  1. 重啓 DSH 客戶端(host 插件在啓動時裝配,熱重載不會加載新包)

配置

在 profile 的 cordis.patch.yml 裏該 insert 行下加 config::

- insert:
    - id: remember-approval
      name: dsh-remember-approval
      config:
        enabled: true
        rememberEmptyReason: false   # 無理由的請求是否也記憶(默認否)
        minHumanDelayMs: 200         # 下游耗時低於此值視爲自動批准,不記憶
        maxKeysPerSession: 200       # 單會話最多記多少條
        maxSessions: 64              # 最多跟蹤多少會話
        skipTools: [pwsh]            # 這些工具不記憶
        neverRemember:               # reason 命中即永不記憶
          - 'danger-full-access'
          - '刪除|rm -rf|format'
        log: true                    # 控制台打印命中/記憶日誌
        debug: false                 # 把每次審批的調用/reason/命中寫到 debugLogPath
        debugLogPath: ''             # 調試日誌路徑;默認系統臨時目錄下的 dsh-remember-approval.debug.log

卸載

從 cordis.patch.yml 刪掉該 insert 條目並重啓即可;沒有落盤狀態,記憶只存在於內存中,隨會話結束消失。

驗證

重啓後做兩次同類操作(理由文字可以完全不同):第一次會問,批准後第二次應直接通過。打開 debug: true 時,debugLogPath(默認系統臨時目錄下的 dsh-remember-approval.debug.log)裏能看到類似日誌:

IN  tool=write scope="escalate sandbox to danger-full-access" reason="...第一次的理由"
OUT tool=write outcome=allowed-once elapsed=6308ms
HIT tool=write scope="escalate sandbox to danger-full-access" reason="...完全不同的理由"

適用場景與注意

  • 隻影響 approval/request;「沙箱拒絕(denial)」是另一條接縫,不受影響
  • 記憶作用域是會話:同一會話內有效,跨會話不繼承
  • 本插件只是減少重複確認,不改任何權限默認值;如果想讓模型在越界時隨時“再做一次”,需要下游應答者(人工 UI)仍然在第一次出現時明確批准
  • 建議給自己設一道安全閥:把最敏感的動作放進 neverRemember,讓它們永遠人工確認,即使你之前批准過。例如:
  neverRemember:
    - 'escalate sandbox'
    - 'danger-full-access'
    - '刪除|rm -rf|format|drop'

這樣升權、刪除類操作不會被“記住”,只有其餘高頻的溫和操作才享受免重複詢問。代價是這幾類仍然每次彈窗——但它們本來就應該每次由人看一眼。

  • 目前只在 DSH 桌面版(Windows、desktop profile)上做過真機驗證;核心邏輯有單元測試覆蓋,但其他平臺/版本是否完全一致尚未驗證,遇到問題請開 issue

小結

dsh-remember-approval 在 approval/request 應答者瀑布的最前面掛一個 listener,用會話 + 工具 + 動作前綴作爲記憶鍵,把“已經人工批准過的同類審批請求”直接放行。它適合需要高頻操作但又要保留安全邊界的場景,使用時建議配合 neverRemember 給最敏感的操作留出永遠人工確認的出口。

  • 目錄頁:https://www.skillhub.cn/plugins/washengru/dsh-remember-approval
  • GitHub:https://github.com/washengru/dsh-remember-approval
羽毛球分组比赛记分
小程序二维码

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

小夜