dsh-approval-comment:給 DSH Web 審批加上「拒絕並附言」

前言

如果你在用 DSH(DeepSeek Harness)的 web 模式跑智能體,大概率遇到過這兩個問題:

1、工具調用觸發審批窗,你點「拒絕」,但模型不會停下,而是繼續下一輪思考,猜測你拒絕的原因、換一個方案接着跑。
2、你手動停止任務,拒絕這件事不進模型上下文,下一次請求就像什麼都沒發生過。

真實協作裏,拒絕通常附帶原因:「不要動這個文件,改到工作目錄去」。默認審批流程既不接收這個原因,也不讓模型基於它重新思考。dsh-approval-comment 就是爲補齊這一環而寫的插件。

這是什麼

dsh-approval-comment 是一個 DSH Web 審批增強插件,由 MaYiFei1995 維護,MIT 許可證,當前版本 0.1.0。它的定位是無感替代內置審批窗口:審批窗保持原樣(警示條、工具名、允許一次/拒絕),新增一個附言輸入框;拒絕後終止當前回合,讓模型重新結合附言思考。

它是純 host + client 雙半區插件,零第三方依賴、零構建步驟(純 JS),不修改任何 @deepseek-ai/dsh* 核心包,因此核心升級不會覆蓋本插件。安裝進 web profile 即生效,下次 dsh web 啓動自動加載。

README 中聲明:本項目代碼及文檔由 deepseek-v4-pro 模型生成。

核心行爲

插件支持「允許一次/拒絕 × 無附言/有附言」四種組合:

允許一次 拒絕
無附言 繼續執行 中斷任務(停止,等待下一條指令)
有附言 附言一併生效,繼續執行 據附言調整並自動繼續(不停止)

幾個關鍵點:

  • 拒絕並附言:附言經 session.prompt(…, 'steer') 注入當前回合,模型讀到「拒絕 + 附言」後據此調整,自動繼續,不停止。
  • 無附言的純拒絕agent/pre-step 守衛返回 { kind: 'reject' } 終止當前回合,模型停止並等待你的下一條指令。
  • 允許並附言:附言同樣以 steer 注入,工具照常執行,模型在下一步讀到附言並據此調整。
  • grant-next 一次性放行:附言後模型調整出的越權調用自動放行,全程只彈一次審批窗。
  • 拒絕與附言都留在 transcript 中,手動停止後也不丟上下文。

對無人值守場景也做了兼容:approval/policy = 'never' 的自動拒絕在應答鏈之前短路,不受停止守衛影響,CI 行爲與現狀一致。

工作原理

插件分兩個半區:

半區 文件 作用
host lib/index.js approval/request 前置監聽:觀察拒絕結果 + grant-next 一次性放行;agent/pre-step 守衛:純拒絕 → { kind: 'reject' } 終止回合,拒絕+附言 → 放行
client lib/client.js conversation.composerpriority: 0 頂替內置審批面板,新增附言框;允許/拒絕時若有附言,先經 session.prompt(…, 'steer') 注入附言再應答

以「拒絕並附言」爲例,完整時序是:

模型調用需越權的工具
   審批面板(本插件版)彈出,附言框可用
   用戶填寫說明並點「拒絕」
      a) 附言經 session.prompt(, 'steer') 注入當前回合(插話)
      b) 應答 rejected  工具結果 = the user rejected tool "X"(核心文本,不可改)
   agent/pre-step 守衛:檢測到剛被拒絕,且本步消息裏有附言  放行(不終止)
   模型讀到「拒絕 + 附言」→ 據附言調整並自動繼續
   調整的越權調用命中 grant-next  自動放行,不再彈第二次審批窗

安裝與啓用

前置要求 Node >= 18。官方推薦從 GitHub Release 遠程安裝:

dsh plugin --profile web add https://github.com/MaYiFei1995/dsh-approval-comment/releases/download/v0.1.0/dsh-approval-comment-0.1.0.tgz

如果目標設備不便聯網,先從 Release 下載 .tgz(或本機 npm pack 生成),再用本地路徑安裝:

# 絕對路徑
dsh plugin --profile web add C:\path\to\dsh-approval-comment-0.1.0.tgz

# 相對路徑(錨定到執行命令的目錄)
dsh plugin --profile web add ./dsh-approval-comment-0.1.0.tgz

也可以直接從 git 源安裝:

dsh plugin --profile web add git+https://github.com/MaYiFei1995/dsh-approval-comment.git

注意:git 源安裝會運行 prepare 腳本,pnpm 默認攔截,需按 pnpm 提示把包名加入 profile 的 pnpm-workspace.yamlallowBuilds。Release tarball 是預構建產物,無需此步。

安裝後重啓 dsh webCtrl+C 後重新 dsh web)生效。用下面的命令驗證:

dsh --profile web --dump-config   # 應能看到 approval-comment 行

卸載:

dsh plugin --profile web remove dsh-approval-comment

卸載後同樣重啓 dsh web 生效,可再用 --dump-config 確認 approval-comment 行已移除。

客戶端半區改動後需要瀏覽器硬刷新(非 dev 模式無熱更新),排查「改了沒生效」時先確認這一點。

構建與分發

如果你要自己改代碼或發佈:

npm run check   # 契約校驗(host/client 半區、package.json、cordis.patch.yml 的掛載契約)
npm run build   # 別名:同 check(本插件純 JS,無需轉譯)
npm pack        # 產出 dsh-approval-comment-<version>.tgz

倉庫自帶 GitHub Actions:push 時跑語法+契約校驗併產出 tarball,推 v* tag 時自動把 tarball 作爲 Release 資產發佈。

已知邊界

使用前需要了解幾個邊界:

  • grant-next 是一次性授權、回合作用域:只放行附言後緊接着的那一次越權調用,turn/end 或離開附言調整步即作廢,不跨回合殘留。
  • 允許+附言時原命令先執行:審批語義是「批准本次調用」,附言無法改寫已定參數,舊參數命令先執行,模型再據附言自動修正。要完全跳過舊參數需上游支持改參執行。
  • 審批面板以 reason(或「工具 X 請求越權執行」)爲標題,內置面板額外顯示的命令原文未復刻。
  • 若目標設備無可用審批 UI(非 web 場景),應答鏈回退爲 unavailable,行爲與現狀一致。

適用場景與注意

這個插件適合經常在 dsh web 下與審批窗交互的開發者:你希望拒絕時帶上原因、讓模型按你的意圖修正,而不是讓它自己猜;也希望手動停止後對話上下文不丟失。如果你主要跑無人值守/CI 流程,現有 approval/policy = 'never' 的行爲不受影響,無需爲此安裝。

最後提醒一點:插件以當前 dsh 進程的權限運行,安裝前建議檢查源碼(本插件就兩個文件 lib/index.jslib/client.js,均爲純 JS、零依賴,審查成本不高)並確認許可證條款。

結尾

dsh-approval-comment 解決的是一個很具體的問題:讓審批交互裏的拒絕帶上原因,並讓模型基於原因重新思考,而不是猜測或丟上下文。實現上不碰核心包、零依賴,安裝和卸載都可以隨時回退。

  • GitHub:https://github.com/MaYiFei1995/dsh-approval-comment
  • 社區目錄頁:https://www.skillhub.cn/plugins/MaYiFei1995/dsh-approval-comment

社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

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

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

小夜