Skip to content

Repository files navigation

Codex 微信任务中继

这是一个不依赖 OpenClaw 的本地 Node 中继,用于完成四件事:

  1. Codex Desktop 当前任务回合处理结束时,把最终交付摘要推送到微信。
  2. 在微信直接按线程名字回复下一步,例如 示例服务:查看当前版本,并绑定到对应 Codex 线程 UUID。
  3. 后台恢复原线程执行这条指令,再把该回合的最终答复发回微信。
  4. 在微信用 /新建 任务名字:第一步 创建持久 Codex 任务,并在独立目录执行首轮任务。

它不镜像实时输出,也不监听公网端口。微信文字会作为下一步提示词送入原 Codex 线程,不会直接拼成 Shell 命令。

工作方式

Codex notify / Stop
  -> src/codex-notify.cjs
  -> SQLite 待推送队列
  -> src/wechat-worker.cjs
  -> 微信最终摘要

微信 “线程名字:下一步”
  -> 唯一 owner 校验
  -> 对应线程任务队列
  -> codex exec resume <线程 UUID>
  -> 原线程执行下一回合
  -> SQLite 待推送队列
  -> 微信最终摘要

微信 “/新建 任务名字:第一步”
  -> 创建独立工作目录
  -> codex exec 创建持久新线程
  -> 绑定新线程 UUID 与任务名字
  -> 微信最终摘要
  -> 后续继续使用 “任务名字:下一步”

Codex CLI 前提

微信派发已有任务时,中继会在本机调用 codex exec resume <线程 UUID>;使用 /新建 时会调用 codex exec 创建持久新线程。Windows 用户只需安装并登录 Codex Desktop,不需要再单独安装 Codex CLI:中继会自动定位 Desktop 安装附带的实际 codex.exe。如果 npm run doctor 提示找不到 CLI,请先打开或更新 Codex Desktop。

Codex 的完成事件中包含 last-assistant-message,中继会把这段最终交付原文放在微信通知正文中。通知显示“已处理”,表示一次 Codex 回合已结束;是否真正业务成功仍以摘要和验证结果为准。中继会从本机 Codex 线程索引读取最新线程名字和原工作目录;可用 线程名字:… 将下一步关联到该线程。

通知范围

所有 Codex Desktop 对话线程的最终消息都会推送到微信,不按项目白名单筛选。普通任务使用 Codex 侧栏中的线程名字;没有侧栏条目的子代理会使用 父任务名字 / 子任务·短标识,回复这个完整名字即可继续对应子线程。中继不会把子代理的原始内部提示词拼进名字。

安装与启动

Windows 上构建后可直接双击:

<项目目录>\程序\Codex微信中继.exe

桌面控制台提供中继启停、Hook 检查、微信在线状态、Codex 执行器状态、待执行/执行中/失败数量、实时日志、登录二维码和“随 Windows 启动”开关。关闭控制台窗口不会停止后台中继;需要停服时使用界面中的“停止”,程序会先停止活动 Codex 子进程并把未完成任务放回队列。程序只复用项目根目录里的脚本、配置和登录会话,不会复制或暴露微信 token。

桌面程序源码位于 desktop-app,可用 PowerShell 7 重新编译:

pwsh -NoProfile -File .\desktop-app\build.ps1

命令行方式仍然可用:

npm install
npm run doctor
npm run install-hook
npm start

npm run install-hook 会先备份 ~/.codex/config.toml,将现有 notify 改为中继包装器,并继续转发原来的桌面完成通知。它是唯一会修改全局 Codex 配置的命令。

首次启动前,先从示例创建本机私有配置;这个文件已被 Git 忽略,不能提交:

Copy-Item .\config\projects.example.json .\config\projects.json

首次 npm start 会在终端显示微信登录二维码,并在 data/wechat-login-qr.png 生成可扫码图片。登录成功后图片会自动删除。扫码后,先用自己的微信给收件箱发任意一条文字。

聊天中的二维码图片是静态的,不能随后台自动换码更新。若二维码已过期或需要长期显示,请另开一个始终显示当前码的本地窗口:

npm run show-qr

该窗口每秒读取一次 data/wechat-login-qr.png,应扫描窗口中的码而不是历史聊天图片。

登录成功后,先用自己的微信给收件箱发任意一条文字,再在本机执行:

npm run owners
npm run owner:allow -- <显示出的微信用户ID>

只有唯一被授权的微信用户可以查看队列或写入任务。未授权消息只会记录其用户 ID 供本机确认,不会触发任务。首次授权前,该账号必须先发过一条文字,以建立微信 SDK 的会话上下文。

微信指令

示例服务:查看当前版本
/新建 新项目想法:先调研可行性并给出最小方案
/任务
/完成 T-3
/帮助

回复会先写入 data/relay.sqlite,随后由单实例执行器串行恢复原 Codex 线程。/新建 会在 <中继所在盘符>:\Codex临时任务 下创建不含用户输入的随机目录,首轮成功取得线程 UUID 后自动改为普通 resume 任务;即使首轮启动后失败,重试也会继续同一线程,不会重复创建。旧版按项目名写入且没有线程 UUID 的任务会保留但被忽略。执行器不使用 --dangerously-bypass-approvals-and-sandbox--ephemeral,沿用当前 Codex 用户配置、项目规则和安全边界。

并发使用: 仅在目标 Codex 线程已完成或确认空闲后,通过微信发送下一步。不要同时在 Codex Desktop 和微信向同一线程发送指令;中继只保证自身微信队列串行,无法协调桌面端的并发操作。

执行器开关位于本机私有的 config/projects.json;公开仓库只提供 config/projects.example.json

{
  "executorEnabled": true
}

本地验证

npm test
npm run tasks
npm run control:status

运行 worker 后,测试摘要会像真实 Codex 完成通知一样发往已授权的微信账号。

回滚

npm run remove-hook

该命令只恢复本中继接管的 notify 行,并在恢复前再次备份全局配置。

参考

About

将 Codex 完成摘要推送到微信,并按线程接收下一步任务。

Resources

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages