前言¶
在 DeepSeek Harness(DSH)裏跑 agent 時,瀏覽器 Web UI 會在兩類場景下阻塞整條鏈路:工具需要用戶點「批准 / 拒絕」的授權(approval),以及 agent 通過 ask_user_question 向用戶提問。Harness 會一直等到有人點擊爲止。人離開屏幕、會話掛着不動時,agent 可能長時間卡在授權或提問面板,既佔着會話,也談不上「沒人應就按安全側默認收尾」。
原生 DSH 對這兩種等待沒有截止時間。下面介紹社區插件 dsh-approval-timeout(維護者 EviMing,分類 admin-security):在 Web 客戶端 爲當前阻塞中的授權與提問設置可配置超時,到點按與手動操作等價的語義自動結束等待,避免無限掛起。
這是什麼¶
dsh-approval-timeout 是面向 dsh web 的 DSH 插件(npm 包名 dsh-approval-timeout,當前版本 1.1.0,MIT 許可證)。它不改變服務端 profile 文件,也不髮網絡請求;只在瀏覽器裏讀取當前會話的 pendingInteraction,在截止時刻調用與用戶點擊相同的路徑完成收尾。
插件目錄頁:https://www.skillhub.cn/plugins/EviMing/dsh-approval-timeout(社區 SkillHub 目錄,與 DeepSeek / 幻方無官方從屬關係)。源碼與說明:https://github.com/EviMing/dsh-approval-timeout。
核心行爲¶
默認超時 10 分鐘(可在 UI 中調整或選「關閉」恢復原生無限等待)。沒有等待中的交互時,插件完全靜默。
授權(approval)¶
超時且用戶未點擊時,自動按 拒絕 處理:寫入與用戶點「拒絕」一致的 approval/decided: rejected 審計事件,面板消失,工具調用以拒絕結束(fail closed)。插件 沒有 任何自動批准的路徑。
提問(ask_user_question)¶
超時且用戶未回答時,自動按 跳過 處理:等價於每道題留空並點「跳過」,agent 收到 { answers: [{ id, selected: [] }, ...] },表示用戶未作答,不會默許,也不會僞造回覆;面板消失,工具返回空答案並繼續。
若用戶正在作答(面板聚焦或輸入框編輯中),截止時間 順延 60 秒,避免寫到一半被掐斷。
故意不處理的等待¶
只處理「當前真的阻塞 agent、且面板仍有效」的請求,例如:
- 已結算、只讀的提問卡片;
- 已斷開實時通道的舊卡片(
continued); - 客戶端自帶倒計時的提問(
ask_user_question的 timed 模式); - 計劃審批(
plan-review):不自動跳過,避免超時後 agent 改 plan 再提、形成循環; - 沒有
callId、又無法取消的卡片:僅dismiss()收起面板,不假裝結束請求。
爲什麼在客戶端實現¶
授權與提問面板由 @deepseek-ai/dsh-client-ui-approval、@deepseek-ai/dsh-client-ui-user-questions 等在瀏覽器渲染;HOST 側 waterfall 轉發請求並等待客戶端作答。若在 HOST 側搶先 return,面板可能仍在而工具已結束,用戶再點會變成空操作。因此插件讀取 ctx.uiSession.sessionStatus 中的 PendingApproval / PendingQuestion,到點調用 pending.answer('rejected')、pending.answer({ answers: [...] }) 或 pending.dismiss(),與用戶按鈕同一路徑,保證審計、面板與工具結局一致。
安裝與啓用¶
安裝前建議自行查看 GitHub 源碼與 MIT 許可證;插件在 當前 DSH Web 會話對應的瀏覽器環境 中運行,副作用限於一次 pending.answer(...) 與 localStorage 中的一個整數。
官方 README 給出的安裝方式:
dsh plugin --profile web add github:EviMing/dsh-approval-timeout
# 或用 npm 包(如有發佈):
dsh plugin --profile web add dsh-approval-timeout
安裝後重啓或刷新 dsh web。輸入框(composer)下方會出現一行控件,例如:
審批/提問超時 [10 分鐘 ▾]
卸載:
dsh plugin --profile web remove dsh-approval-timeout
或在插件頁禁用後刷新,README 說明不留殘留。
典型用法¶
- 用下拉框選擇超時:關閉 / 1 / 3 / 5 / 10 / 15 / 30 / 60 分鐘,立即生效並記住。
- 有授權在等待時,該行變黃並顯示倒計時,例如
bash: 9:58 後自動拒絕。 - 有提問在等待時同樣變黃,例如
提問:9:58 後自動跳過。 - 設置保存在瀏覽器
localStorage,鍵名爲dsh.approval-timeout.minutes,按瀏覽器 profile 持久化;無服務端配置項。
適用場景與注意¶
適合在 dsh web 無人值守或長時間離開 時,避免 agent 永久卡在授權/提問 UI;也適合希望「超時默認拒絕授權、跳過提問」的安全偏好(與 fail closed、不僞造用戶答案的設計一致)。
兼容性:README 寫明在 dsh 0.2.0-rc.2(dsh web)上測試,依賴 @deepseek-ai/dsh-client-ui-session、@deepseek-ai/dsh-client-ui-approval,提問部分與 @deepseek-ai/dsh-client-ui-user-questions 協作。桌面版若捆綁更舊 dsh、缺少 uiSession.sessionStatus,插件會保持靜默而不報錯。
安全側要點(來自 README):無網絡請求、不讀憑據、不寫 document.body;僅上述兩類客戶端副作用。計劃審批仍建議人工處理,不要指望本插件替你在 plan-review 上超時跳過。
結尾¶
dsh-approval-timeout 用可配置的超時,把 Web UI 裏兩種最常見的「等人點擊」等待收成可預期的拒絕或跳過,而不是無限阻塞。需要安裝命令、邊界行爲與實現理由時,以倉庫 README 爲準。