这是一个不依赖 OpenClaw 的本地 Node 中继,用于完成四件事:
- Codex Desktop 当前任务回合处理结束时,把最终交付摘要推送到微信。
- 在微信直接按线程名字回复下一步,例如
示例服务:查看当前版本,并绑定到对应 Codex 线程 UUID。 - 后台恢复原线程执行这条指令,再把该回合的最终答复发回微信。
- 在微信用
/新建 任务名字:第一步创建持久 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 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 startnpm 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 行,并在恢复前再次备份全局配置。