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
羽毛球分组比赛记分
小程序二维码

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

小夜