fix(desktop): 发送时应用模型选择,保留 Codex 原生上下文 - #4011
Conversation
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/maker-ipc/register.ts | 接入同引擎待发送意图、发送锁内应用模型设置,并移除 Codex provider thread relink/fork 流程。 |
| apps/desktop/src/main/maker-ipc/sessionAgentSwitchHandler.ts | 扩展 pending switch registry,使同引擎选择在发送时应用,并以 CAS 方式避免清除较新的选择。 |
| apps/desktop/src/renderer/components/new-chat/ChatInput.tsx | 将本机受支持会话的模型和 provider 选择统一投影为 agent-switch intent。 |
| packages/anthropic-compat-proxy/src/server.ts | 增加压缩密文终态分类及无 MIME SSE 推断;后者在完整 SSE 事件出现前过早提交响应。 |
| packages/anthropic-compat-proxy/src/transform.ts | 仅在已无可剥除密文且仍保留 compaction 密文时生成稳定的不兼容错误码。 |
| packages/maker-core/src/agents/shared/remote-compact-encrypted-error.ts | 将代理证明的压缩密文不兼容错误纳入既有 compact 恢复判定。 |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[用户选择模型或来源] --> B[校验并写入 pending intent]
B --> C{用户发送下一条消息}
C -->|否| B
C -->|是| D[获取 session 发送锁]
D --> E[应用最终 route / effort / Fast]
E --> F{目标窗口需要整理}
F -->|是| G[执行 context rebuild / handoff]
F -->|否| H[沿用原生线程]
G --> I[清除已消费 intent]
H --> I
I --> J[按最终选择发送消息]
Prompt To Fix All With AI
### Issue 1
packages/anthropic-compat-proxy/src/server.ts:1640-1642
**SSE 响应过早提交**
缺少 `Content-Type` 的响应只要开头出现 `data:` 或 `event:` 就会立即提交为 SSE,但此时尚未确认一个以空行结束的完整事件。例如,上游干净结束于 `data: upstream timeout`,或在首个字段行后截断时,SSE 客户端不会派发事件,而代理已经返回 200,无法再通过原有门控转换为结构化 502。请至少等到完整 SSE 事件边界后再提交,并确保前缀解析能正确处理跨 chunk 的内容。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "fix(desktop): 在发送时应用模型选择并复用 Codex 原生线程" | Re-trigger Greptile
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 419d2edb79
ℹ️ 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".
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
@dashhuang 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/anthropic-compat-proxy/src/server.ts / apps/desktop/src/main/maker-ipc/register.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
419d2ed to
b4206cd
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b4206cd85f
ℹ️ 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".
|
命中 UI 路径(apps/desktop/src/renderer/components/new-chat/ChatInput.tsx)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范 |
|
@dashhuang 👋 这个 PR 还有 3 条 review conversation 没 resolve(apps/desktop/src/main/maker-ipc/register.ts / apps/desktop/src/renderer/components/new-chat/ChatInput.tsx),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
b4206cd to
855d9b7
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 855d9b79b1
ℹ️ 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".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d49209025f
ℹ️ 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".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e74c551cfe
ℹ️ 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".
|
@dashhuang 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/maker-ipc/register.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 54b0c90d24
ℹ️ 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".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
MagicLizi
left a comment
There was a problem hiding this comment.
代码重审通过:当前 head 未发现 P0/P1,全部 conversation 已 resolve。发送时才应用选模、Codex 跨来源 resume 原线程、压缩密文分类与 SSE MIME 补齐均在描述范围内。
|
合了。发送才落地选模、跨来源还走原 Codex 线程,这两件事终于对上用户手感了——谢谢把 pending 和 resume 拆清楚。 |
这次改了什么
摘要
在同一个任务里从 OpenAI 订阅的 Codex 切到 Cindy AI Codex,原先会立即尝试 fork 并改写原生历史;带
ordinal/history_base的历史会被安全检查拒绝,继而提前触发摘要交接。现在选模型只记录“下条消息”的选择,真正发送时才应用最终来源、模型与推理设置。同为 Codex 时按新来源 resume 原线程;切走又切回不会提前整理历史。确实需要缩窗整理时,也推迟到发送边界;用户发送即同意必要整理,不再二次弹窗。只切换模型不授权整理。
实测还发现 OpenAI HTTP 回退返回有效 SSE、却缺少
Content-Type,被代理误报 502。本次补上严格的 SSE 前缀识别,仅在响应头缺失且正文满足事件流格式时补齐类型。变更类型
fix缺陷修复feat新功能refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
复用现有模型选择器和“下条消息”提示,调整触发时机;无新增布局或样式。Mobile 同引擎选择显示“下条 · 模型”及待应用来源的图标,跨引擎选择保留原切换提示;补齐五种语言。macOS 开发版通过真实 Renderer 选择器、输入框与发送按钮验证(CDP 驱动),并只读核对测试任务数据库和原生 rollout。
docs/design-rules/DESIGN.md§4「Select & Dropdown」、§2「Layer System (Light & Dark)」;保留现有控件及语义颜色,不新增视觉样式。怎么验证的
自动验证
pnpm test:unit:related:Mobile、代理与其余受影响工作区通过;同步最新主干e17d32d7f后,Desktop 32809 项通过,剩余 9 个失败已在相同基线的干净工作区再次独立复现(46 项通过)。pnpm --filter desktop --filter @cindy/anthropic-compat-proxy --filter @cindy/maker-core run --if-present typecheck:通过;maker-core 无独立 typecheck script。pnpm test:unit:Mobile、maker-core、代理及其余适用工作区通过;Desktop 32650 通过 / 9 个已复现基线失败。首轮相关门禁 Desktop 为 32651 通过 / 同样 9 个基线失败;内部 no-op 边界的 95 例定向复验通过。基线失败:
claudeOrphanReaper5 例、codexAuthIsolatedSandbox3 例、usageHistory的 Pi SuperGrok 估价 1 例;同一测试基线独立运行这三个文件为 9 失败 / 46 通过。未修改这些测试或实现。补充定向核对:从实际源码执行 3 种默认/显式来源重选与 2 种手机宿主 effort/Fast 更新分支,全部通过;包括显式默认来源
null和 Fast=false。仅行为分支验证,不代表手机实机测试。Mobile 补充检查:
pnpm --filter mobile typecheck、pnpm check:i18n、pnpm check:i18n-glossary通过;从实际组件源码执行空闲、同引擎、跨引擎、断开来源、默认来源五种标签/图标投影,全部通过。五种语言新增 key 一致;本轮根相关门禁仍为 Desktop 32801 通过 / 9 个相同基线失败。订阅恢复补充验证:
modelWindowConfirmation.test.ts8 项通过,覆盖明确等待发送、被覆盖意图和旧式 deferred 拒绝;实际恢复组件源码的 3 种结果路径通过(等待发送不提前落库、已应用先落库、被覆盖不重试)。Desktop 类型检查通过。本轮未新增实机验证。自动回退补充验证:新增 6 项待发送意图交错/接线测试;连同 iOS 模拟器界面定向复验共 52 项通过,Desktop 类型检查通过。本轮根相关门禁 Desktop 32809 通过 / 同样 9 项已复现基线失败,其余受影响工作区通过。旧 HEAD Windows 2/2 的唯一失败为未改动的
IOSSimulatorTabBody测试 20 秒超时,下一 HEAD CI 继续验证,未混入无关改动。手工验证
macOS,隔离开发工作区
cindy-fix-codex-switch-on-send,Global 服务,已登录真实账号,Codex 原生版本 0.153.0,最终开发版构建身份419d2ed;专用测试任务,不使用原任务做写入测试。openai/gpt-5.6-sol。未执行的验证
未做 Windows、Mobile / 多控制端、Light 模式实机目检,未构造真实长历史压缩密文不兼容账号场景;后者由代理真实 HTTP 用例和既有恢复编排回归测试覆盖。Codex 当前没有对外暴露手动 compact 入口,因此没有将
/compact当成已完成的实测。风险
风险分类
自动操作与用户选择的边界(收敛检查点)
不变量:用户已接受的待发送选择只能被更新的用户选择、明确取消/任务清理或实际发送消费;自动回退、Agent 调参及延迟应用不能清掉它。
状态 owner 沿用 Main 的
agentSwitchPending;runtime generation 负责让旧自动请求失效,既有 per-session 发送锁串行化提交。统一canApplyAutomaticRuntimeSelection判据同时检查用户意图与 generation,同引擎入口及跨引擎 fallback 共用;未新增锁或持久化。审计了正常提交与失败后的运行态保留两处清理:同引擎均在共用判据之后;跨引擎 fallback 的切换与接受 runtime 状态现在在同一把已有锁内完成。真实 fallback 源码执行测试覆盖交错顺序和失败保留,并核对同引擎入口复用同一判据。
SSE 识别与转换顺序(收敛检查点)
不变量:先完成既有有效性门控并确定最终 MIME,再构造响应适配器,最后提交成功响应头。
commitStreamResponse是唯一构造与提交 owner,适配器最多创建一次;沿用原有有界缓冲和终态清理,没有新增解析器或状态机制。response_transform_unavailable502验证:代理整包 439 项及类型检查通过,新增有/无 MIME 的分块 SSE、构造失败用例,并断言既有 8 种无效流不进入适配器。另用实际代理与实际 Codex exec custom/function 适配器运行 loopback HTTP 验证:缺 Content-Type 的上游 function 事件成功还原为 custom tool 事件。此验证不代表新增真实账号或实机验证。本轮根相关门禁 Desktop 32809 通过 / 同样 9 项已复现基线失败,其余受影响工作区通过。
旧 HEAD
54b0c90d2Windows 1/2 的失败是未改动的 FeishuoutboundFileUnicode 目录链测试 5 秒超时;该文件在本机 9 项复验通过,等待本次新 HEAD 的 Windows CI,未将本机结果当成 Windows 已验证。影响与回滚
提交前检查
git commit -s)