Skip to content

fix(codex): preserve parent websocket with routed subagents - #3136

Merged
MagicLizi merged 2 commits into
makecindy:mainfrom
lizzjin:fix/3119-preserve-parent-websocket
Aug 21, 2026
Merged

fix(codex): preserve parent websocket with routed subagents#3136
MagicLizi merged 2 commits into
makecindy:mainfrom
lizzjin:fix/3119-preserve-parent-websocket

Conversation

@lizzjin

@lizzjin lizzjin commented Aug 20, 2026

Copy link
Copy Markdown

这次改了什么

摘要

修复配置独立 Codex Subagent Provider 后,父任务的 ChatGPT OAuth 会话也被全局关闭 WebSocket、被迫进入不兼容 HTTP SSE fallback,最终持续重连并返回 502 non_sse_stream_response 的问题。

本 PR 保持 cindy_openai 的 WebSocket 能力,只在 WebSocket upgrade 确认命中独立 Subagent 路由时,对对应子线程返回 426。Codex 随后仅将该子会话降级到 HTTP,使既有请求正文转换、Provider、模型和推理强度路由继续生效;父线程及未配置独立路由的子线程仍使用原生 Responses WebSocket。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:Closes bug: 独立 Codex Subagent Provider 会关闭父会话 WebSocket,导致 ChatGPT 会话持续重连 #3119
  • 本 PR 包含:
    • 保持 OAuth host 的 cindy_openai.supports_websockets=true
    • 对已登记且继承独立 Provider 路由快照的子线程拒绝 WebSocket upgrade
    • 使用 x-codex-parent-thread-id 处理首次 collab_spawn upgrade 早于 thread/started 的竞态
    • 仅让命中独立路由的子会话通过 426 回退到 HTTP,保留既有 body transform 和 fail-closed Provider 路由
    • 覆盖父线程 WebSocket、已登记子线程 fallback、首次创建竞态及未配置路由子线程的回归测试
    • 同步更新 Codex transport 注释和 Orca 架构文档
  • 明确不包含:
    • UI、Renderer 或设置页改动
    • system prompt 或 developer instructions 内容改动
    • 独立多 host / 多 app-server 架构重写
    • HTTP 非 SSE 响应的错误分类或重试策略调整
    • 数据库 migration、移动端和 remote runtime 改动
  • 用户可见变化:配置独立 Codex Subagent Provider 后,父任务的 ChatGPT OAuth 会话不再仅因此进入持续重连或失败;独立 Subagent 的固定 Provider、模型和推理强度路由保持有效。
  • 是否存在 breaking change:无。

UI 变化

不涉及:改动仅位于 Desktop main 进程的 Codex gateway/proxy、maker-core 契约注释、测试及架构文档,没有修改视觉、交互或用户文案。

  • 引用的设计规范:不涉及

怎么验证的

自动验证

pnpm test:unit:related
结果:通过;Desktop、packages/lizi-mcps、packages/maker-core 和 packages/orca-workflow 均通过。改动的 codexProxyHost.test.ts 全文件 159/159 通过。

pnpm --filter desktop run --if-present typecheck
结果:通过。

node scripts/check-dco.mjs
结果:通过;1 个 commit 已包含匹配提交身份的 Signed-off-by。

git diff upstream/main...HEAD --check
结果:通过。

手工验证

未进行真实账号和系统代理环境的端到端手工验证;父子线程传输选择、首次创建竞态和未配置路由子线程由自动化回归测试覆盖。

未执行的验证

  • 未在 Issue 报告环境中执行 macOS Apple Silicon、系统 HTTP/HTTPS 代理、ChatGPT OAuth 与独立自定义 Provider 的完整端到端复现;本地没有对应账号和上游环境。
  • 未执行全仓 pnpm test:unit;已按仓库提交门禁执行并通过 pnpm test:unit:related,完整单测由 CI 继续验证。
  • @cindy/maker-core 没有 typecheck script,因此对应 --if-present typecheck 门禁会跳过。额外执行的非门禁 pnpm --filter @cindy/maker-core run build 仍报告未修改测试代码中的既有类型错误,没有错误指向本 PR 修改行。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:本地 Codex WebSocket upgrade 与按会话 HTTP fallback 路由

影响与回滚

  • 影响范围:Desktop 本地 OAuth Codex host 的 WebSocket upgrade 路由。
  • 兼容性依赖:当前 bundled Codex 0.145.0 会在 upgrade 中提供 thread/subagent/parent-thread 身份,并在单个会话收到 426 后回退到 HTTP。路由未命中时继续透传到官方 Responses WebSocket。
  • 独立 Subagent 路由仍保持 fail-closed:只有确认存在对应路由快照时才拒绝子线程 WebSocket,随后由既有 HTTP transform 强制应用 Provider、模型、鉴权和推理强度。
  • maker-core 没有运行时代码变化,仅更新契约注释和测试名称;未修改 prompt 内容或顺序、工具定义、事件流、模型映射和 usage 计量,因此缓存率、性能、返回准确性和 usage 语义不变。
  • Remote/mobile、数据库、system prompt、凭证存储和存量插件不受影响。
  • 回滚 / 降级方式:回退本 PR 可恢复原先 host-wide WebSocket disabling 的 fail-closed 行为,但会重新引入 bug: 独立 Codex Subagent Provider 会关闭父会话 WebSocket,导致 ChatGPT 会话持续重连 #3119。若未来 bundled Codex 的 upgrade header 或 426 fallback 契约发生变化,可将该回退作为紧急降级方案,并要求用户清除独立 Subagent Provider 路由以恢复父会话 WebSocket。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Signed-off-by: lizzjin <lizzjin37@gmail.com>
@lizzjin
lizzjin requested a review from a team as a code owner August 20, 2026 13:54

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b78661b39c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/main/maker-host/codex-gateway-config.ts
@greptile-apps

greptile-apps Bot commented Aug 20, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 将 Codex WebSocket 降级从 host-wide 开关调整为按子线程路由:父线程继续使用 ChatGPT Responses WebSocket,仅命中独立 Provider 路由的子线程通过 426 回退到 HTTP。

  • OAuth 模式下始终启用 cindy_openai WebSocket 能力
  • 根据已登记的子线程快照或 collab_spawn 的父线程标识决定是否拒绝 upgrade
  • 保留现有 HTTP 请求体、Provider、鉴权、模型及推理强度转换
  • 补充父线程、已登记子线程、首次启动竞态和未配置路由子线程的回归测试

Confidence Score: 5/5

当前可用证据中没有仍需阻止合并的故障,PR 看起来可以安全合并。

没有剩余的阻塞性故障。

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-host/codex-proxy-host.ts 新增按子线程及显式父线程血缘解析 WebSocket 路由的逻辑,使独立 Provider 子线程回退 HTTP,同时保留父线程 WebSocket。
apps/desktop/src/main/maker-host/codex-gateway-config.ts 移除 host-wide WebSocket 开关,并让 OAuth OpenAI provider 始终声明 WebSocket 支持。
apps/desktop/src/main/maker-host/index.ts 停止根据 subagentRoute 全局关闭 WebSocket,并同步更新向 maker-core 暴露的 transport 能力。
packages/anthropic-compat-proxy/src/server.ts 运行时代码未改变,仅更新 Codex WebSocket 稳定线程标识的契约注释。
packages/maker-core/src/agents/codex/index.ts 更新线程级 WebSocket 与 proxy prompt 注入通道的契约说明,未改变运行时判断。
apps/desktop/src/main/maker-host/tests/codexProxyHost.test.ts 覆盖父线程保留 WebSocket、已登记子线程及首次 prewarm 竞态回退 HTTP、无独立路由子线程继续使用 WebSocket。
packages/anthropic-compat-proxy/src/server-websocket.test.ts 更新 WebSocket 测试以记录 Codex upgrade 使用稳定 thread-id 的预期。
packages/maker-core/src/agents/codex/index.test.ts 更新 maker-core transport 契约测试,反映独立子代理路由不再关闭整个 host 的 WebSocket。
docs/dev-rules/orca-team-architecture.md 同步记录按子线程选择 WebSocket 或 HTTP transport 的架构约束。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Codex Responses WebSocket upgrade] --> B{OAuth bearer host?}
  B -- 否 --> H[返回 426,回退 HTTP]
  B -- 是 --> C{线程已登记 HTTP recovery?}
  C -- 是 --> H
  C -- 否 --> D{命中独立 Subagent 路由?}
  D -- 是 --> H
  D -- 否 --> W[转发到 ChatGPT Responses WebSocket]
  H --> T[执行请求体、Provider、模型、鉴权转换]
Loading

Reviews (2): Last reviewed commit: "test(codex): cover prewarm websocket rou..." | Re-trigger Greptile

Signed-off-by: lizzjin <lizzjin37@gmail.com>
@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Aug 20, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这条 PR 改了 Orca/Codex WebSocket 通道的规则原文(不只是实现),需要维护者确认后再合。

请在本 PR 上 Approve 放行;若要改,Request Changes 即可。讨论 issue:#3144

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查通过。精确缩小 WebSocket 拒绝粒度:从主机全局→子线程级别,通过升级头(thread-id / x-openai-subagent / x-codex-parent-thread-id)判定路由子代理,父线程与非路由子线程保留 WS 能力,4 种场景覆盖完整。

@MagicLizi MagicLizi added status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Aug 21, 2026
@MagicLizi
MagicLizi merged commit a28f976 into makecindy:main Aug 21, 2026
11 checks passed
@MagicLizi MagicLizi removed the status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) label Aug 21, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

Routed subagent 场景下父 WebSocket 连接的保持逻辑修正得很精准——确保子 Agent 走自己的路由时不会把父会话的实时通道断掉,避免了一类很难调的连接状态丢失问题。

Battleplus pushed a commit to Battleplus/cindy that referenced this pull request Aug 21, 2026
…y#3136)

* fix(codex): preserve parent websocket with routed subagents

Signed-off-by: lizzjin <lizzjin37@gmail.com>

* test(codex): cover prewarm websocket routing

Signed-off-by: lizzjin <lizzjin37@gmail.com>

---------

Signed-off-by: lizzjin <lizzjin37@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: 独立 Codex Subagent Provider 会关闭父会话 WebSocket,导致 ChatGPT 会话持续重连

2 participants