前言¶
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 强调):
- 只认
address与allowFrom白名单发件人。 - 一次性令牌,结论落地即失效。
- 必须是对通知邮件的回复(
In-Reply-To/ 主题Re:等),fail-closed:说不清、发信失败均不放行;发信失败时该次请求回退到界面审批。 - 邮箱账号等价于远程放行通道:请开二次验证,授权码只放在
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