Skip to content

fix(weixin): Windows 微信连接自动选用桌面版维护的标准 CLI,零配置跑通全链路 (issue #2028/#1879) - #2276

Merged
BigPizzaV3 merged 2 commits into
BigPizzaV3:mainfrom
dongyu23:codex/fix-weixin-windows-cli
Sep 22, 2026
Merged

BigPizzaV3 merged 2 commits into
BigPizzaV3:mainfrom
dongyu23:codex/fix-weixin-windows-cli

Conversation

@dongyu23

Copy link
Copy Markdown
Contributor

Closes #2028
Refs #1879

问题

Windows + Microsoft Store 版 Codex 的用户启用「个人微信连接」后,微信发消息必然失败。#2028 的报错原文(本 PR 修复前可在任何 Store 版机器上稳定复现):

处理微信消息失败:无法启动 Codex app-server
(C:\Program Files\WindowsApps\OpenAI.Codex_26.915.4065.0_x64__2p2nqsd0c76g0\app\resources\codex.exe):
没有执行权限(拒绝访问。 (os error 5))

配套还有三个持续困扰(均为真机调试中确认):

  1. 「使用桌面版内置 CLI」按钮填入的就是这个必然失败的路径——[Question]: 微信连接 #2028 报错里路径的直接来源。用户改文件夹权限无效(MSIX 包身份限制,不止 NTFS ACL);
  2. 留空也活不了:Windows 上 npm 安装的 codex.cmd shim 不被 CreateProcess 的裸命令名解析命中(只补 .exe),PATH 回退同样是 NotFound([Bug] 处理微信消息失败:无法启动 Codex app-server(codex),请检查 Codex CLI 路径 —— 应该填哪个路径? #1879 里「直接填 codex 也失败」的成因);
  3. 模型流量隐式依赖桌面版在线:Codex++ 单模型路由写入 config 的 openai_base_url 指向本地代理 127.0.0.1:57321,该代理只随 launcher 启动的桌面版存在。桌面版不在线时 turn 失败,用户只看到一句模糊的「处理失败」,无从定位。

根因

三层叠加:

  1. Store 版是 MSIX 包,WindowsApps 目录受系统保护,第三方进程无法直接 CreateProcess 其中的 exe,改权限也不生效;
  2. macOS 上 .app/Contents/Resources/codex 是普通可执行文件,探测/直启全部成立——find_bundled_codex_cli 的 Windows 分支照搬了这个假设,把包内 resources\codex.exe 当成可用路径返回;
  3. 探测链漏掉了 Windows 上真正可用的安装形态:桌面版会在 %LOCALAPPDATA%\OpenAI\Codex\bin\<哈希>\codex.exe 维护一份可独立执行的完整 CLI(本机实测约 316MB,含 sandbox 等组件,随桌面版一起更新)。旧代码只探测 bin\codex.exe 平铺层,够不到哈希子目录。

一个支撑事实:CLI 与桌面版共享同一个 ~/.codex(登录态、config.toml、会话库),因此改用这份 CLI 不产生第二套配置,桌面版里登录一次即可。

方案:一条标准路径,零选择

不给用户多方案罗列,全链路围绕单一标准路径自动化:

Windows 标准 CLI 路径 = %LOCALAPPDATA%\OpenAI\Codex\bin\<哈希>\codex.exe

候选 可执行 随更新稳定 说明
bin<哈希>\codex.exe(本 PR 采用) ✅ MSIX 容器外 ✅ 桌面版自动维护 哈希目录随更新变化,按「含 codex.exe 的最新子目录」解析,逻辑不变
WindowsApps 包内路径 ❌ 必然 os error 5 旧按钮的返回值,本次彻底弃用
npm 安装 ⚠️ .cmd shim 裸名解析不到 需手动 作为探测落空时的文案引导方向,不做主动探测

修复(5 文件,+349/−37,约半数为测试/文案;另附 1 个回归测试提交)

# 改动 位置
A 新增 find_desktop_managed_codex_cli():扫 bin 一级子目录,取含 codex.exe 的最新一份,兼容平铺布局;is_windows_store_cli_path 提为公共检测 app_paths.rs
B 路径留空时自动选用标准 CLI(取不到再退 PATH),留空即最佳配置 connect/app_server.rs
C 「使用桌面版内置 CLI」在 Windows 只返回标准路径,彻底不再把死路径写进设置;找不到给通泛指引 commands.rs
D 报错按类别区分并通泛化,统一指向「留空自动查找 / 点按钮」两个动作 connect/app_server.rs
E 存量坏路径一次性迁移:设置归一化时检测到 WindowsApps 路径自动置空(load/save/update 均经过),已踩坑用户升级即自愈 settings.rs
F 模型代理预检:处理消息前读 config 的 openai_base_url,若指向 127.0.0.1:<端口> 且 300ms 内 TCP 连不通,直接报明确原因,不再让 turn 失败后只剩「处理失败」 connect/mod.rs
G 白名单外消息从静默丢弃改为状态栏提示「已忽略来自非白名单发送方的消息:」 connect/mod.rs

macOS 行为不变(find_bundled_codex_cli 原逻辑保留在非 Windows 分支)。

报错文案(前 → 后)

场景 修复前 修复后
填了 WindowsApps 路径 spawn 失败后一句「没有执行权限」 启动前拦截:「此路径位于系统保护的安装目录内,Codex++ 无法直接运行它。请清空『Codex CLI 路径』保存(留空时自动查找),或点击『使用桌面版内置 CLI』重新选择。」
留空但机器无可用 CLI 「找不到该文件;填完整路径…」 「找不到可运行的 Codex CLI;请点击『使用桌面版内置 CLI』自动填入,或将路径留空自动查找」(Windows 裸名分支)
桌面版未在线时发微信 「处理微信消息失败:…」模糊 「Codex 桌面版当前未运行,微信连接暂时无法调用模型。请先从 Codex++ 启动 Codex 桌面版后重试。」
非白名单消息 无任何表现 状态栏「已忽略来自非白名单发送方的消息:」

验证(全部真机,Windows 11 + Store 版 Codex 26.915.4065.0)

单测:新增 10 个(哈希目录选最新/平铺兼容/误伤用例、空路径解析、文案断言、坏路径迁移、localhost 端点判定、白名单循环回归);全量 cargo test -p codex-plus-core 37 个测试组全部通过,0 回归。

核心层真机(临时集成测试,真实 LOCALAPPDATA / 真实 codex 二进制):

  • 标准路径解析命中 bin\247581e40ee272fb\codex.exe
  • 空路径启动真实 app-server 完成 initialize 握手(本机 PATH 无 codex,成功即证明走的是自动解析而非 PATH);
  • WindowsApps 路径启动前被拦截并给出指引。

UI 层 E2E(管理器 CDP 9330 驱动真实界面):坏路径经真实保存链路被归一化置空;按钮填入并落盘标准路径;清空保存后连接以空路径正常轮询。

端到端:真机微信发消息 → 收到回复,全程 CLI 路径为空(空路径 → 自动解析 → app-server → 57321 代理 → 模型 → 回微信)。

分支行为补验

  • 代理预检失败分支:真实停掉桌面版与 launcher(57321 无监听)后用 wiremock 假微信网关驱动真实 run_weixin_connect 循环,状态栏得到上述明确文案;
  • 裸命令名分支:显式填 codex 且 PATH 无 codex 时,报错带指向性提示;
  • 白名单丢弃:wiremock 驱动真实循环,非白名单消息被丢弃且状态栏出现「已忽略」提示(已转为永久回归测试,注意断言须在停止循环前快照——正常退出会覆盖状态文案)。

已知边界

  • bin\<哈希> 布局系对桌面版行为的逆向观察(无官方文档):若上游改布局,解析落空后退回 PATH + 通泛报错指引,不会崩,但主路径失效;
  • 纯 npm 用户(从未安装桌面版)留空仍找不到 codex(.cmd 不被裸名解析,历史问题非本次引入),文案将其引导至「安装桌面版」这条标准路径;
  • 旧版本管理器 + 空路径会退回 PATH 查找(同样找不到)——存量迁移(E)在升级后自动把坏路径置空,配合新版本自动解析即自愈;若用户降级则需手动填回显式路径;
  • macOS 按代码 #[cfg] 隔离完全未动,但未在 mac 真机回归(探测/按钮/留空路径建议合并前在 mac 顺手过一遍)。

BigPizzaV3#1879)

Store 版桌面应用把可独立执行的 CLI 维护在 %LOCALAPPDATA%\OpenAI\Codex\bin\<哈希>\codex.exe,
随桌面版一起更新、在系统保护目录之外;旧探测链(find_bundled_codex_cli → WindowsApps
包内路径)拿到的是第三方进程无法执行的死路径,Windows 上微信连接必然 os error 5。

- app_paths: 新增 find_desktop_managed_codex_cli(bin 哈希子目录取最新,兼容平铺布局);
  is_windows_store_cli_path 提为公共检测
- app_server: 路径留空时 Windows 自动选用标准 CLI;启动预检拦截 WindowsApps 路径;
  spawn 失败提示按类别区分,文案统一指向「留空自动查找 / 点按钮」两个动作
- manager: 「使用桌面版内置 CLI」在 Windows 只返回标准路径,不再把死路径写进设置
- settings: 归一化时把存量 WindowsApps 坏路径置空,升级即自愈
- connect: 处理消息前预检本地模型代理(openai_base_url → 127.0.0.1),
  桌面版未运行时直接报明确原因,不再只剩一句「处理失败」;
  非白名单消息从静默丢弃改为状态栏提示

附带修复本次调试发现的两个缺口:standalone 探测漏掉 bin 哈希子目录层级、
白名单静默丢弃无任何提示。macOS 行为不变。
用 wiremock 假微信网关驱动真实 run_weixin_connect 循环:
非白名单消息被丢弃的同时,状态栏必须出现「已忽略来自非白名单发送方的消息」。
此前该行为改动只有编译级确认,无测试覆盖(注意快照须在停止循环前取,
正常退出会覆盖状态文案)。真机事件路径已实际核验。
@BigPizzaV3
BigPizzaV3 merged commit a16f170 into BigPizzaV3:main Sep 22, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Question]: 微信连接

2 participants