DSH-ApproveByEmail-WhenApprovalNeeded:用郵件審批與作答,擴展 DSH 工作流

前言

DeepSeek Harness(DSH)在桌面端遇到需要人工把關的操作時,會通過審批瀑布(approval/request)和提問瀑布(user-questions/request)把決定權交給你。如果你當時不在電腦前,或者更希望用郵箱異步處理,就需要一條不繞開 DSH 官方審批接口、又能把「同意 / 拒絕」和「1. 2」式選項寫回系統的通道。

下面介紹的 DSH-ApproveByEmail-WhenApprovalNeeded 由維護者 xkzdwb 發佈,歸類爲工作流類 cordis 插件(零額外 npm 依賴)。它在兩個瀑布的最外層作爲應答者掛載:敏感操作發審批郵件,模型讓你選題時發提問郵件;你回覆郵件即可放行或作答,仍走 @deepseek-ai/dsh-user-approval 與 DSH 自帶策略,不改工具權限、不註冊給模型用的工具。

這是什麼

一句話:給 DSH 加兩條共用同一郵箱與令牌機制的郵件通道——審批(approval/request)與提問(user-questions/request)。

項目 說明
目錄頁 https://www.skillhub.cn/plugins/xkzdwb/DSH-ApproveByEmail-WhenApprovalNeeded
源碼 https://github.com/xkzdwb/DSH-ApproveByEmail-WhenApprovalNeeded
許可證 MIT(見倉庫 package.json)
當前版本 1.1.0
Node >=20

插件做的是:有審批或提問請求時發通知郵件;輪詢收件箱識別你對某次請求的回覆並解析結論;默認以郵件爲唯一交互通道(可選同時彈界面卡);每次請求與結論寫入本地審計 JSONL。不做的是:不改工具執行權限、不寫入審批策略(ask / never 仍由 DSH 管理)、不碰會話日誌裏的 approval/asked / approval/decided、不給模型暴露任何工具。

核心功能

審批通道

模型觸發需要審批的操作後,流程大致如下:

模型觸發需要審批的操作
  └─ ctx.approval.request()
       └─ waterfall('approval/request'):
            ① 本插件(prepend,最外層)
                 ├─ 發通知郵件 + 輪詢收件箱
                 │     回覆「同意 #令牌」→ allowed-once
                 │     回覆「拒絕 #令牌」→ rejected
                 └─ 默認不彈卡;showApprovalCard: true 時才 next() → 瀏覽器彈窗
            ③ 兜底:unavailable(fail-closed)

DSH 只認四種結論:allowed-once、rejected、cancelled、unavailable。插件必須用 prepend 搶在桌面端瀏覽器彈窗之前,否則郵件通道發不出去——桌面端彈窗作爲「最終應答者」會把請求整個喫掉。

提問通道

ask_user_question 經 ctx.userQuestions.ask() 進入 user-questions/request 瀑布,本插件同樣在最外層發郵件、解析你回覆裏的題號與選項(例如 1. 2 表示第 1 題選第 2 項),再返回結構化答案。默認 showQuestionCard: false,避免郵件答完後界面卡片無法被 Host 收回而一直佔位;需要界面按鈕時可打開,但郵件先答完時界面點擊僅起關閉卡片作用,不會改變已記錄結果。

兩種界面模式(README 歸納)

模式 配置 桌面表現 郵件答完後
A 純郵件(默認) showApprovalCard / showQuestionCard 均爲 false 不彈卡 無殘留卡
B 桌面 + 郵件 兩項均爲 true 卡片照常出現 卡片可能留在屏幕上,需點一下關閉

安裝與啓用

本插件通過 profile 級 cordis patch 安裝,不是單獨的 dsh plugin add 命令。發佈說明裏要求把路徑與郵箱換成真實值;授權碼放在 secrets.json(由 secrets.example.json 複製),且已在 .gitignore 中。

在 ~/.dsh/profiles/desktop/cordis.patch.yml 的 insert 列表裏增加一項(完整片段見倉庫 examples/cordis.patch.snippet.yml):

    - id: approval-email
      name: "/path/to/DSH-ApproveByEmail-WhenApprovalNeeded/src/plugin.js"
      config:
        address: sender@example.com          # 發信 + 收回復的郵箱賬號
        to: approver@example.com             # 收通知的郵箱(回覆會回到 address)
        allowFrom:                         # 誰有資格審批(默認只認 address)
          - approver@example.com
        secretsFile: "/path/to/DSH-ApproveByEmail-WhenApprovalNeeded/secrets.json"
        pollIntervalMs: 5000
        waitMs: 0
        showApprovalCard: false
        showQuestionCard: false

waitMs: 0 表示永不超時,持續等待你的郵件回覆。改完後必須重啓 DSH(插件在 HOST 啓動時裝載)。成功掛載時 HOST 日誌會出現類似:

[approval-email] 已掛載:sender@example.com(SMTP smtp.163.com:465,IMAP imap.163.com:993,輪詢 5000ms,永不超時)

常用配置字段(節選,默認值以 README 表爲準):

字段 說明
address 必填;發信並 IMAP 輪詢該賬號收件箱
to 通知收件人,默認同 address
allowFrom 有資格審批/回覆的發件人白名單
secretsFile / authCode 163 等郵箱的客戶端授權碼,非登錄密碼
pollIntervalMs 收件箱輪詢間隔,默認 5000
notifyOnly true 時只發通知,回覆不作爲放行依據
confirmByEmail 結論落地後再回一封「已處理」,默認關
auditFile 默認插件目錄下 audit/audit.jsonl

默認 SMTP / IMAP 示例爲 smtp.163.com:465、imap.163.com:993(TLS),可按需改 smtp / imap 對象。

典型用法

郵件裏如何審批

審批郵件主題形如:[DSH 審批] #a1b2c3d4 需要你批准:bash。正文含令牌、工具名、原因、會話與工作區路徑。直接回複本郵件:

  • 批准:正文寫「同意 #a1b2c3d4」(亦認「批准 / 通過 / approve / yes」等詞,且須帶令牌)
  • 拒絕:正文寫「拒絕 #a1b2c3d4」(亦認「駁回 / deny / no」等)

解析時只看你新寫的幾句,引用區會被去掉,避免誤把模板裏的示例當成你的結論。無令牌、雙結論、發件人不在白名單或不是對通知的回覆時,一律忽略並繼續等待。

郵件裏如何答題

提問郵件主題形如:[DSH 提問] #a1b2c3d4 需要你選擇:方案。每行一題,例如 1. 2 表示第 1 題選第 2 個選項;支持多選 1. 2,3、自定義 1. 自定義:你的文字、或按選項原文匹配。某題不寫則記爲跳過。

不裝 DSH 時自測鏈路

倉庫提供探測腳本,一條命令驗證發信與收信解析:

node tools/probe-mail.mjs --send --watch 300

迴歸測試:

node test/run-tests.mjs

適用場景與注意

適合:需要在離開桌面時仍能對 DSH 敏感操作做一次性放行;習慣用郵箱處理待辦;希望提問與審批統一走同一套 SMTP/IMAP 與審計。不適合:期望完全依賴界面按鈕、且不願處理「雙通道時卡片殘留」的用戶(除非你接受 B 模式並手動關卡)。

安全邊界(README 強調):

  1. 只認 address 與 allowFrom 白名單發件人。
  2. 一次性令牌,結論落地即失效。
  3. 必須是對通知郵件的回覆(In-Reply-To / 主題 Re: 等),fail-closed:說不清、發信失敗均不放行;發信失敗時該次請求回退到界面審批。
  4. 郵箱賬號等價於遠程放行通道:請開二次驗證,授權碼只放在 secrets.json,勿提交倉庫或發到羣聊。

插件以當前 DSH HOST 進程權限運行,安裝前應自行閱讀 src/plugin.js 與 MIT 許可證,確認郵件賬號與審計路徑符合你的合規要求。DSH 生態是「一切皆插件」的社區擴展;SkillHub 目錄頁 與 DeepSeek / 幻方無官方從屬關係。

排錯時可對照 README:例如 配置不可用,插件未掛載 多爲缺 authCode 或 address;535 authentication failed 多爲授權碼或 163 SMTP/IMAP 未開通。郵件到了但 DSH 無反應時,用 probe-mail.mjs --watch 檢查解析是否認出你的回覆。

結尾

經過上面的步驟,你可以在不大改 DSH 審批策略的前提下,把「等人點同意」變成「等人回郵件」——審批迴「同意 / 拒絕」,提問回「1. 2」,默認純郵件、無關不掉的界面卡。進一步瞭解實現細節與 50 項離線迴歸說明,見 GitHub 倉庫 README;在 SkillHub 檢索同名插件可跳轉到同一項目。

  • 目錄:https://www.skillhub.cn/plugins/xkzdwb/DSH-ApproveByEmail-WhenApprovalNeeded
  • 源碼:https://github.com/xkzdwb/DSH-ApproveByEmail-WhenApprovalNeeded
羽毛球分组比赛记分
小程序二维码

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

小夜