fix(codex): preserve parent websocket with routed subagents - #3136
Conversation
Signed-off-by: lizzjin <lizzjin37@gmail.com>
There was a problem hiding this comment.
💡 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".
|
| 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、模型、鉴权转换]
Reviews (2): Last reviewed commit: "test(codex): cover prewarm websocket rou..." | Re-trigger Greptile
Signed-off-by: lizzjin <lizzjin37@gmail.com>
|
这条 PR 改了 Orca/Codex WebSocket 通道的规则原文(不只是实现),需要维护者确认后再合。 请在本 PR 上 Approve 放行;若要改,Request Changes 即可。讨论 issue:#3144 |
MagicLizi
left a comment
There was a problem hiding this comment.
审查通过。精确缩小 WebSocket 拒绝粒度:从主机全局→子线程级别,通过升级头(thread-id / x-openai-subagent / x-codex-parent-thread-id)判定路由子代理,父线程与非路由子线程保留 WS 能力,4 种场景覆盖完整。
|
Routed subagent 场景下父 WebSocket 连接的保持逻辑修正得很精准——确保子 Agent 走自己的路由时不会把父会话的实时通道断掉,避免了一类很难调的连接状态丢失问题。 |
…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>
这次改了什么
摘要
修复配置独立 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文档、测试或工程维护范围
cindy_openai.supports_websockets=truex-codex-parent-thread-id处理首次collab_spawnupgrade 早于thread/started的竞态UI 变化
不涉及:改动仅位于 Desktop main 进程的 Codex gateway/proxy、maker-core 契约注释、测试及架构文档,没有修改视觉、交互或用户文案。
怎么验证的
自动验证
手工验证
未进行真实账号和系统代理环境的端到端手工验证;父子线程传输选择、首次创建竞态和未配置路由子线程由自动化回归测试覆盖。
未执行的验证
pnpm test:unit;已按仓库提交门禁执行并通过pnpm test:unit:related,完整单测由 CI 继续验证。@cindy/maker-core没有typecheckscript,因此对应--if-present typecheck门禁会跳过。额外执行的非门禁pnpm --filter @cindy/maker-core run build仍报告未修改测试代码中的既有类型错误,没有错误指向本 PR 修改行。风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)