dsh-wechat-draft-gate:微信出站审批闸门

前言

在 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 回复,且希望每一条出站都经人工确认;可与独立微信桥接项目组合,本插件只负责闸门与审计。

注意:

  1. 插件以当前 DSH 进程权限运行,安装前请自行查看源码与 MIT 许可证,并阅读仓库 SECURITY.md 中关于端口、token、状态目录的说明。
  2. 不把 token 写入仓库;优先 transportTokenEnv。
  3. DSH 插件生态遵循「一切皆插件」思路;社区目录站点与 DeepSeek / 幻方无官方从属关系,安装来源以目录页与 GitHub 为准。

结尾

dsh-wechat-draft-gate 把微信出站收成「草稿 → 确认 → POST 桥接」三步,默认过期作废并留审计行,适合把误发风险压到人工确认这一关。更多截图、测试命令与完整 API 见仓库文档。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye