dsh-deferred-approvals:DSH 非阻塞審批與定時提問

前言

在 DeepSeek Harness(DSH)裏跑智能體時,一旦工具調用觸發權限審批,原生流程往往會讓整輪對話停在那裏,直到你在界面上點允許或拒絕。你稍走開幾分鐘,模型就只能乾等,同一回合裏本來還能做的其它步驟也推進不了。ask_user_question 若一直等用戶回答,同樣會佔住回合。

社區插件 dsh-deferred-approvals(維護者 Hao0311,分類 admin-security)把這兩類交互改成「可稍後處理」:審批先掛成待辦、工具立刻拿到「未執行」結果,模型繼續幹活;用戶對問題的回答則走 DSH 內置的 timed 模式,超時後模型先繼續,卡片仍保留供你補答。下面介紹它的定位、權限邊界、安裝配置與使用上需要注意的限制。

這是什麼

dsh-deferred-approvals 是一個 DSH 插件 bundle,當前包版本 0.3.1(MIT 許可證),要求 DSH ≥0.2.1-0。它做兩件事:

  1. 非阻塞審批:宿主本來就要彈審批的工具調用,由插件攔截並記爲待辦(編號如 #A1),同一 assistant 回合可繼續做其它工作;你在輸入框附近的「待處理審批」卡片裏再允許或拒絕。
  2. 定時提問:把 standard 預設裏的 ask_user_question 配成 timed 模式(能力來自 @deepseek-ai/dsh-tool-ask-user),提問後默認最多等一段時間,超時返回 {pending:true, callId},模型不阻塞。

目錄頁:SkillHub 插件頁。源碼與說明:GitHub — Hao0311/dsh-deferred-approvals。

權限邊界(使用前先弄清)

審批權限屬於宿主(sandbox / approval 層),不是對話裏的「口頭批准」。

  • 模型在 workspace-write 沙箱下只能發起 sandbox_permissions 升級請求;是否要審批完全由原生策略/沙箱決定。會話策略爲 never 或原生不需要審批時,插件默認不介入(forceAskPolicy 默認爲 false,不會擅自改會話策略)。
  • 插件在 approval/request 最外層攔截請求,給工具返回「未執行」,並登記待辦;唯一授權來源是你在 UI 上點擊(允許一次 / 本對話允許同類)。宿主記錄「工具 + 參數指紋」的一次性授權,默認 5 分鐘過期、用掉即銷。
  • 批准後模型收到的是宿主事件通知(在 Chat 裏多爲上下文行,不是用戶氣泡),用於提示可以重試;對話內容不能授予權限。重試時 command 等實際參數必須與指紋一致,justification / description / timeoutMs 不參與指紋。

弄清這一點,可以避免誤以爲「模型說已批准」就等於已授權。

核心功能:非阻塞審批

和原生行爲的對比

  • 以前:審批一齣現,整個 turn 停住,必須等你點擊。
  • 現在:審批變成後臺待辦;模型可跑其它子任務或換不需要提權的路徑;你回來再在卡片裏處理。允許一次後,重試時宿主按一次性授權放行,不再彈框。「本對話允許同類」會爲會話記規則,之後同類請求直接放行,並已排隊的同類待辦可一併批准。

會話列表裏對應對話旁會出現與原生審批類似的橙色小點,提示有待處理項。

工作方式概要

  1. 攔截:在審批瀑布最外層拿到請求,臺賬記下工具名、參數指紋、權限級別與理由,立刻對本次調用返回 rejected(工具層顯示未執行)。
  2. 改寫結果:經 tools/post-execute 把文案改成「已掛起爲待辦 #A1,不要等待也不要反覆重試」等說明;若已用其它方式完成,可調用 pending(action="cancel") 撤銷。
  3. 模型繼續:同一回合內繼續後續步驟。
  4. 用戶決定:允許一次、本對話允許同類、拒絕或忽略;拒絕可帶備註引導模型換方式。
  5. 送達:用戶決定後通過宿主事件(source.kind = 'deferred-approval')通知模型。模型空閒時用 agent.followup;若正在長考且本會話沒有工具在執行,默認會中斷當前思考再投遞(interruptOnDecision 默認爲 true);有工具在執行則退回到 agent.steer,避免殺掉運行中的命令。
  6. 臺賬與冪等:批准/拒絕/忽略/過期/撤銷都會記入「最近決定」;pending 的 list / cancel 可給出確定答覆。同一按鈕重複點擊冪等;decide 帶 sessionId 時會校驗待辦歸屬。
  7. 過期:待辦默認 15 分鐘過期,靜默作廢、不喚醒模型。

插件還提供 pending 工具,用於查詢待辦、最近決定和已放行規則;HTTP 路由在 /api/deferred-approvals/*(Host 側)。

核心功能:定時提問(合併自原 dsh-timed-questions)

同一 bundle 通過 cordis.patch.yml 覆蓋 standard 預設,把 ask_user_question 設爲 timed 模式:

  • 提問後最多等 timeout 秒(默認 20);超時返回 {pending:true, callId},模型繼續工作。
  • 問題卡片保留,可隨時回答;回答作爲用戶消息送回(模型在跑則下一步收到,空閒則開新一輪)。
  • 單次調用可用 timeout 覆蓋;-1 表示這次必須等到回答。

生效範圍是新會話;已存在會話沿用啓動時的預設組合,需新開對話才能用到 timed 配置。

DSH 升級後官方 standard 預設可能與本地 patch 副本漂移;插件啓動時會對比並嘗試重新生成(保留 mode: timed 與 timeout),並提示需重啓後新會話才生效。也可手動執行:

node check-preset-drift.mjs --regenerate

安裝與啓用

面向 Web profile 的官方安裝命令如下(與 README 一致,注意倉庫名爲 Hao0311):

dsh plugin --profile web add github:Hao0311/dsh-deferred-approvals

開發時可在工作區 plugins/dsh-deferred-approvals 目錄,通過 plugin_manager 的 install_bundle 以該絕對路徑爲 target 安裝。安裝後 Client 半通常會自定加載;Host 半源碼修改需重啓 DSH 才生效(已 import 的模塊默認不熱替換,除非開啓 HMR 源碼監聽)。

依賴方面,插件僅使用 node:crypto 與 ctx 服務(tools / approval / agents / systemPrompt,以及可選的 connection、typertGateway);Client 側使用 slots / locale / uiSession。

卸載時用 plugin_manager 的 remove_bundle(target 爲 dsh-deferred-approvals),審批與定時提問會恢復原生行爲。

配置

配置寫在 profile patch 裏該插件 id 下的 config 字段,全部可選;倉庫未導出 Config schema,加載期不做校驗。

鍵 默認 含義
ttlMinutes 15 待辦有效期(分鐘)
grantMinutes 5 「允許一次」的一次性授權有效分鐘數
softCapAway 20 無在線客戶端時的待辦上限
forceAskPolicy false 是否把顯式 never 的根會話策略切回 ask
requireLiveClient true 無在線 Web 客戶端時交回原生審批,不做掛起
excludeTools [] 不接管列出的工具的審批
interruptOnDecision true 用戶決定時,純長考場景是否中斷思考並立即送達
sweepMs 20000 過期清理間隔

示例片段:

- id: deferred-approvals
  config:
    ttlMinutes: 15
    softCapAway: 20

典型用法(流程側)

沒有單獨的「一鍵 Demo」腳本;實際使用跟隨 DSH 裏會觸發審批的工具調用即可。可按下面 mental model 自測:

  1. 在 ask 策略且 Web 客戶端在線 的會話中,讓模型發起需要審批的命令(例如沙箱外寫盤、需要 sandbox_permissions 的調用)。
  2. 觀察工具結果是否爲「已掛起爲待辦 #Ax」,且模型是否在同一回合繼續其它步驟。
  3. 在輸入框附近的待處理卡片選擇「允許一次」或「本對話允許同類」,確認模型收到通知後重試且宿主放行。
  4. 若模型已用其它方式完成同一目標,應依提示調用 pending(action="cancel"),避免重複執行。

定時提問側:新開會話後讓模型調用 ask_user_question,等待超過默認 timeout,確認模型繼續執行且卡片仍可作答。

倉庫內迴歸測試(零依賴,Node ≥18):

node test/run.mjs

退出碼 0 表示當前文檔記載的 38 項斷言全部通過。

適用場景與注意

適合誰:長時間 unattended 跑任務、又偶爾需要點審批的 DSH 用戶;希望審批與追問不要佔滿整輪 turn 的智能體開發者。

務必注意:

  • 插件在當前 DSH 進程權限下運行;安裝前請自行查看源碼與 MIT 許可證,確認符合你的安全策略。
  • 待辦只在 Host 內存裏,DSH 重啓後丟失;原生審計對掛起記 rejected,批准細節 v1 未落盤。
  • 需要 ask 策略 + 在線 Web 客戶端(requireLiveClient 默認 true);never 時審批在插件之前就結束,插件收不到請求。
  • 批准後不會自動執行工具,由模型覈對後重試,以保證調用仍出現在會話日誌與 UI。
  • 參數一改指紋即變,會重新掛起,這是權限邊界設計,不是誤殺。
  • 社區目錄 SkillHub 與 DeepSeek / 幻方無官方從屬關係;DSH 生態是「一切皆插件」,本介紹事實均來自上述 GitHub README 與 package 元數據。

結尾

dsh-deferred-approvals 把審批變成可稍後處理的待辦,並把 ask_user_question 接到 timed 模式,減少「人等機器、機器等人」的空轉。若你經常在 DSH Web 裏跑需要點頭的工具鏈,可在 profile 裏安裝後,結合 ask 策略與在線客戶端條件試一輪。

  • 目錄頁:https://www.skillhub.cn/plugins/Hao0311/dsh-deferred-approvals
  • 源碼:https://github.com/Hao0311/dsh-deferred-approvals
羽毛球分组比赛记分
小程序二维码

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

小夜