deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
任务或对话完成时,让 DeepSeek Harness 替你发一封邮件。
DeepSeek Harness 的开源任务通知插件 · 简体中文 · English
dsh-email-notify 是 DeepSeek Harness(DSH)的邮件通知插件,支持两种触发方式:
dsh-task-board),当任务成功、失败或取消时,通过 SMTP(默认 QQ 邮箱,也支持任意 SMTP 服务)自动发送邮件。任务看板结算 → Host 轮询 /api/task-board/state → 与 seen.json 比对
→ 渲染主题/正文模板 → SMTP 发送邮件
对话 turn/end → Host 检查 notify-sessions.json → SMTP 发送完成邮件
→ 浏览器侧一级设置页 + 输入框勾选
~/.dsh/email-notify/seen.json,Host 重启后不会重复发信;对话勾选状态保存在 ~/.dsh/email-notify/notify-sessions.json。0.1.1-rc.x / 0.1.5-rc.x / 0.2.0-rc.x——插件对三代客户端/宿主接缝都做了适配,装同一份构建即可^22.19.0 || >=2410.xdsh-task-board);仅使用对话完成通知时不需要任务看板git clone https://github.com/MCviseron/dsh-email-notify.git
cd dsh-email-notify
pnpm install # prepare 钩子会自动执行 pnpm build
dsh plugin --profile web add "$PWD"
Windows Git Bash 下
$PWD会展开为绝对路径;如果dshCLI 不在 PATH 中,可改用:npx -y @deepseek-ai/dsh plugin --profile web add "$PWD"
安装完成后校验并重启:
dsh --profile web --dump-config # 确认 bundle 中包含 dsh-email-notify
dsh web
刷新 Web GUI,打开设置,即可在侧边栏看到「邮件通知」一级设置页。
dsh plugin --profile web remove dsh-email-notify
卸载后刷新 Web GUI 即可;本地源码目录不会被删除。
登录 QQ 邮箱 → 设置 → 账户。
找到「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务」,开启 SMTP 服务。
按提示发送短信后生成一个授权码——它不是 QQ 登录密码。
打开 Web GUI「设置 → 邮件通知」,填写:
| 字段 | 值 |
|---|---|
| SMTP 服务器 | smtp.qq.com |
| SMTP 端口 | 465 |
| 使用 SSL/TLS | 开 |
| 发件邮箱 | 你的QQ号@qq.com |
| 邮箱授权码 | 第 3 步生成的授权码 |
| 发件人地址 | 你的QQ号@qq.com 或 DSH 通知 <你的QQ号@qq.com> |
| 收件人 | 接收通知的邮箱(可多个) |
点击 「发送测试邮件」,收到邮件即配置成功。
使用 587 端口 + STARTTLS 时:SMTP 端口填
587,关闭「使用 SSL/TLS」。 其他邮箱服务商(Gmail、Outlook、163 等)只需替换 SMTP 服务器、端口与凭据。
配置好 SMTP 后,在任意对话的输入框左侧会看到「邮件通知」勾选框:
turn/end)都会发送一封完成邮件;~/.dsh/email-notify/notify-sessions.json,Host 重启后仍然保留。对话完成邮件默认标题为
[DSH 对话完成] {{sessionId}},默认正文为DSH 会话 {{sessionId}} 已于 {{time}} 完成一轮对话。;标题与正文都可以在设置中的「对话通知主题模板 / 对话通知正文模板」里修改。
在「设置 → 邮件通知」中开启 「审批邮件提醒」(默认关闭)后,DSH 等待用户审批时会发送一封提醒邮件,内容包含审批提示、工具名、调用 ID、会话与时间。
可分别选择两种模式:
dsh-experimental-auto-review 插件判定拒绝并把调用转交用户手动审批的场景。Auto review 转手动审批提醒选项只有在官方 auto review 插件已安装并启用时才显示/可选;未安装或未启用时插件不会提供该选项,只保留工作区审批提醒。
审批邮件默认标题为 [DSH 审批提醒] {{toolName}} 等待审批,正文优先使用界面上的本地化审批提示(displayReason),并附带原始审批原因;标题与正文都可以在设置中的「审批通知主题模板 / 审批通知正文模板」里修改。
| 设置 | 默认值 | 说明 |
|---|---|---|
| 启用插件 | true |
关闭后不轮询、不发信 |
| 向 Agent 公告本插件 | true |
在系统提示中注入插件能力说明 |
| 监听任务看板 | true |
任务执行结算后发信 |
| 轮询间隔(毫秒) | 5000 |
检查任务看板状态的频率,最小 1000 |
| 审批邮件提醒 | false |
等待用户审批时发送提醒;默认关闭 |
| 工作区审批提醒 | true |
审批提醒开启后,工作区/沙箱审批是否发信 |
| Auto review 转手动审批提醒 | true |
审批提醒开启后,官方 auto review 转手动审批是否发信;插件不可用时该项不可选 |
| SMTP 服务器 | smtp.qq.com |
任意 SMTP 服务 |
| SMTP 端口 | 465 |
QQ 邮箱 SSL;STARTTLS 常用 587 |
| 使用 SSL/TLS | true |
465 开;587 + STARTTLS 关 |
| 发件邮箱 | 空 | SMTP 登录账号 |
| 邮箱授权码 | 空 | 不是登录密码;留空时不发送任何邮件 |
| 发件人地址 | 空 | 可写作 名称 <邮箱> |
| 收件人 | 空 | 逗号/分号/换行分隔 |
| 任务通知主题模板 | [DSH 任务完成] {{taskTitle}} - {{resultText}} |
任务看板通知主题 |
| 任务通知正文模板 | 见默认值 | 任务看板通知正文 |
| 对话通知主题模板 | [DSH 对话完成] {{sessionId}} |
对话完成通知主题 |
| 对话通知正文模板 | DSH 会话 {{sessionId}} 已于 {{time}} 完成一轮对话。 |
对话完成通知正文 |
| 审批通知主题模板 | [DSH 审批提醒] {{toolName}} 等待审批 |
审批提醒主题 |
| 审批通知正文模板 | 见默认值 | 审批提醒正文 |
任务、对话、审批三类通知都各自支持主题与正文模板;不存在的变量会被替换为空字符串。
任务通知变量(任务看板)
| 变量 | 说明 | 示例 |
|---|---|---|
{{taskTitle}} |
任务标题 | 清理临时文件 |
{{result}} |
原始结果标识 | succeeded / failed / cancelled |
{{resultText}} |
结果中文文案 | 成功 / 失败 / 已取消 |
{{taskId}} |
任务 ID | task-123 |
{{executionId}} |
执行 ID | exec-456 |
{{startedAt}} |
开始时间(本地时区) | 2026/8/22 14:30:00 |
{{endedAt}} |
结束时间(本地时区) | 2026/8/22 14:35:12 |
{{durationText}} |
耗时 | 5 分钟 12 秒 |
{{error}} |
错误信息 | timeout |
对话通知变量
| 变量 | 说明 |
|---|---|
{{sessionId}} / {{session}} |
会话 ID |
{{time}} |
完成时间 |
审批通知变量
| 变量 | 说明 |
|---|---|
{{modeText}} |
模式中文名,如 工作区审批提醒 |
{{mode}} |
模式标识:workspace / auto-review |
{{toolName}} |
工具名 |
{{callId}} |
调用 ID(可能为空) |
{{sessionId}} / {{session}} |
会话 ID |
{{time}} |
审批请求时间 |
{{prompt}} |
审批提示内容 |
{{reason}} |
原始审批原因 |
EmailNotifier 按 pollIntervalMs 轮询任务看板 Host API(/api/task-board/state)。nodemailer 发送。~/.dsh/email-notify/seen.json,重启不重发。session/event;当事件为 turn/end 且该会话已勾选「邮件通知」时,发送对话完成邮件。approval/request waterfall(只观察并 next() 放行):审批提醒开启且对应模式选中时,发送包含审批提示内容的提醒邮件。conversation-notify/describe / conversation-notify/set 接口读写;审批模式可用性通过 approval/availability 接口读取。┌─────────────────┐ poll ┌──────────────────────┐
│ dsh-task-board │ ◀─────── │ EmailNotifier (Host) │
└─────────────────┘ └──────────┬───────────┘
│ diff + 渲染模板
▼
┌──────────────────────┐
│ SMTP (nodemailer) │
└──────────────────────┘
X-Forwarded-For。role('secret') 声明:浏览器读取配置时脱敏(显示为空),真实授权码不会回传前端。dsh-email-notify/
├── src/
│ ├── index.ts # 插件入口:配置、系统提示、路由注册
│ ├── notifier.ts # 轮询任务看板、去重、模板渲染、发信
│ ├── mailer.ts # nodemailer 封装、收件人解析、配置校验
│ ├── routes.ts # 测试邮件 / 设置桥接 HTTP API
│ ├── loopback.ts # loopback 请求校验
│ └── client/ # Web GUI 设置页 + 对话勾选(React)
│ ├── index.ts # 注册 settings.section 与 conversation.input.left
│ ├── EmailNotifySettingsCard.tsx
│ ├── ConversationNotifyCheckbox.tsx
│ ├── locales.ts # 中英文案
│ └── settings-scope.ts # 设置桥接客户端
├── lib/ # 构建产物(git 忽略,pnpm build 生成)
├── cordis.patch.yml # DSH bundle patch
├── build.mjs # esbuild 构建脚本
└── package.json
pnpm install # 安装依赖(prepare 钩子自动构建)
pnpm typecheck # TypeScript 类型检查
pnpm build # 构建 lib/index.js 与 lib/client.js
pnpm check # typecheck + build
提交 PR 前请保证 pnpm check 通过;CI 会在 GitHub Actions 上自动执行相同的检查。
更多约定见 CONTRIBUTING.md,变更历史见 CHANGELOG.md。
测试邮件发送失败?
name@example.com 或 名称 <name@example.com>。任务完成了但没收到邮件?
[dsh-email-notify] 开头的错误。~/.dsh/email-notify/seen.json 后重启 Host(会重新建立基线)。勾选了「邮件通知」但对话完成后没收到邮件?
[dsh-email-notify] conversation completion send failed 或 send failed。审批邮件提醒没有收到?
[dsh-email-notify] approval notify failed。~/.dsh/email-notify/notify-sessions.json 后重启 Host。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。