前言¶
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:手工掛載¶
- 把整個目錄拷到
%USERPROFILE%\.dsh\profiles\<profile>\node_modules\dsh-remember-approval\(<profile>默認是desktop;Windows 上可以直接雙擊本目錄的install.cmd一步完成) - 在
%USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml末尾追加:
- insert:
- id: remember-approval
name: dsh-remember-approval
- 重啓 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、
desktopprofile)上做過真機驗證;核心邏輯有單元測試覆蓋,但其他平臺/版本是否完全一致尚未驗證,遇到問題請開 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