前言¶
在 DeepSeek Harness(DSH)里接个人微信时,Agent 生成的回复往往会直接走发出链路。微信是对外真人渠道,误发无法撤回,单靠「模型别写错」并不够。社区里已有 panqing0313/dsh-plugin-weixin 这类成熟的双向通道;若你额外需要「所有出站回复先审后发」,不能把生成和真正发出绑在同一条自动路径上。dsh-wechat-draft-gate(维护者 dingchenhui0618-arch,分类 admin-security)只做出站审批:回复先入本机草稿箱,面板确认或 /send 之后才 POST 到你配置的桥接端点。
这是什么¶
插件全名 dsh-wechat-draft-gate,当前版本 0.1.0(以仓库 package.json 为准),许可证 MIT。它不登录微信、不做入站收发,只把「生成回复」与「真正发出」拆成两阶段,中间必须有人确认;未确认的草稿默认 30 分钟过期并作废。未配置 transportUrl 时为演练模式:确认动作会记录,但不会发出网络请求。
与原版 dsh-plugin-weixin 的定位差异可概括为:原版是个人微信 ↔ DSH 的完整通道;本仓库独立实现,专门补「出站闸门」这一块,确认后由你的桥接端点负责真正发到微信。
核心功能¶
两级审批,无第三条发送路径¶
微信侧消息经 DSH 会话由 Agent 产出回复后,不会自动直发。流程是:自动落入「待发草稿箱」→ 人工在面板点「确认发送」,或在会话里执行 /send <id> → 插件向 transportUrl 发一次 POST。插件不会因为「回复写完了」「超时了」或「重试了」自行发出消息。
草稿会保留引用原文(类型、发送者、时间),以及语音转写来源、模型、置信度;低于 lowConfidenceThreshold 时面板标黄提示核对,但不阻止发送。
面板与命令¶
安装并重启 DSH 后,对话视图会出现「待发」Tab,可查看待确认条目、编辑正文、处理记录(已发送 / 已作废 / 已过期)。命令 /drafts 列出待确认草稿;/send <id> 确认发送一条。两者均不消耗模型对话。
Agent 侧工具 wechat_stage_draft 用于把回复放进草稿箱(参数含 chatId、text、quotedText、voiceSource、voiceConfidence 等);工具说明明确这是入草稿而非发送。
审计与过期¶
草稿状态写在 $DSH_HOME/wechat-draft-gate(可通过 stateDir 配置)下的 drafts.json;状态变更追加到 ledger.jsonl。过期扫描间隔由 sweepIntervalMs 控制,读取状态时也会先扫描。
安装与启用¶
在目标 profile 下执行(二选一,与 README 一致):
dsh plugin --profile <你的 profile> add dsh-wechat-draft-gate
或从 GitHub 安装:
dsh plugin --profile <你的 profile> add github:dingchenhui0618-arch/dsh-wechat-draft-gate
装好后重启 DSH。宿主兼容性以实测 DSH 0.2.x 为准(package.json 中 engines.dsh 为 >=0.2.1-rc.2 <0.3.0)。若 Tab 未出现,先查看 DSH 控制台中的插件加载错误。
典型用法:演练模式验证¶
不接微信时,可先跑通状态机。另开终端启动示例桥(只收 POST、写文件):
node examples/bridge-stub.mjs
在 cordis.patch.yml 中把 transportUrl 指向该 stub,例如:
- insert:
- id: dsh-wechat-draft-gate
name: dsh-wechat-draft-gate
config:
draftTtlMinutes: 30
lowConfidenceThreshold: 0.75
transportUrl: http://127.0.0.1:47832/wechat/send
transportTokenEnv: WECHAT_GATE_TOKEN
用 curl 模拟一条待发草稿(README 示例;Linux/macOS 可将 ^ 换行符改为反斜杠续行):
curl -X POST http://127.0.0.1:3080/dsh-wechat-draft-gate/stage \
-H "content-type: application/json" \
-d '{"chatId":"wxid_alice","chatName":"Alice","text":"明天下午三点见。","quotedText":"我们明天见吧?","quotedSender":"Alice","quotedKind":"voice","voiceSource":"local-whisper","voiceModel":"small","voiceConfidence":0.86}'
打开「待发」Tab 核对引用与置信度,点「确认发送」后,bridge-stub 会打印并保存出站载荷。
配置要点¶
| 字段 | 默认 | 说明 |
|---|---|---|
draftTtlMinutes |
30 |
未确认草稿存活分钟数 |
lowConfidenceThreshold |
0.75 |
语音置信度标黄阈值 |
transportUrl |
'' |
桥接端点;留空为演练模式 |
transportTokenEnv |
'' |
从环境变量读取 Bearer token(推荐) |
stateDir |
$DSH_HOME/wechat-draft-gate |
草稿与审计目录 |
确认发送后,插件向 transportUrl POST JSON(kind: wechat.outbound),请求头含 idempotency-key、x-dsh-draft-gate: 1,以及可选的 authorization: Bearer。桥返回 2xx 视为送达;非 2xx 或超时则草稿仍为待确认,可重试。入站 staging 等 HTTP 契约见仓库 README「桥接契约」一节。
插件不提供「白名单自动发」类开关;收消息、ASR、会话映射由桥接端负责。
适用场景与注意¶
适合:已在或计划用 DSH 处理微信相关 Agent 回复,且希望每一条出站都经人工确认;可与独立微信桥接项目组合,本插件只负责闸门与审计。
注意:
- 插件以当前 DSH 进程权限运行,安装前请自行查看源码与 MIT 许可证,并阅读仓库 SECURITY.md 中关于端口、token、状态目录的说明。
- 不把 token 写入仓库;优先
transportTokenEnv。 - DSH 插件生态遵循「一切皆插件」思路;社区目录站点与 DeepSeek / 幻方无官方从属关系,安装来源以目录页与 GitHub 为准。
结尾¶
dsh-wechat-draft-gate 把微信出站收成「草稿 → 确认 → POST 桥接」三步,默认过期作废并留审计行,适合把误发风险压到人工确认这一关。更多截图、测试命令与完整 API 见仓库文档。