Skip to content

feat(codex): choose implementation model at plan approval - #3267

Open
Beautyl0ve wants to merge 1 commit into
makecindy:mainfrom
Beautyl0ve:feat/cindy-2840-codex-plan-model
Open

feat(codex): choose implementation model at plan approval#3267
Beautyl0ve wants to merge 1 commit into
makecindy:mainfrom
Beautyl0ve:feat/cindy-2840-codex-plan-model

Conversation

@Beautyl0ve

@Beautyl0ve Beautyl0ve commented Aug 22, 2026

Copy link
Copy Markdown

Draft PR — feat(codex): choose implementation model at plan approval

这次改了什么

摘要

This is a focused local Codex slice of #2840. During plan_review, the user
can choose which model should execute the approved plan without leaving the plan
card. Browsing the selector does not mutate the live session.

Approval is guarded in main as one transaction: reserve the exact pending request,
snapshot and revalidate the live provider/credential route and target context capacity,
hot-switch model plus effort/Fast Mode, persist the complete selection, revalidate the
same request, and only then approve it. Runtime, persistence, stale-request, unsafe
context shrink, or rollback failures keep the plan pending; a request that once exposed
the selector cannot silently downgrade to ordinary approval after eligibility disappears.

变更类型

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

范围

  • 关联 Issue / 需求:Part of feat: plan 模式执行确认弹窗支持选择模型 #2840(不关闭整个跨 Agent 需求)。
  • 本 PR 包含:本机 Codex plan_review 的实现模型选择器;同一显式 provider / credential
    family 的即时 hot-switch;exact-request reservation / revalidation;runtime + effort +
    Fast Mode + persistence 的事务与回滚;资格漂移 fail-closed;回归测试与五语种文案。
  • 明确不包含:Claude Code、Pi、SSH remote、device-link;跨 provider/source 或凭证家族;
    需要 close/rebuild/defer 的切换;修改共享 InteractionDecision;完成 feat: plan 模式执行确认弹窗支持选择模型 #2840 的其他 Agent。
  • 用户可见变化:符合条件的本机 Codex 计划审批卡新增“实现模型”选择器;其他审批卡保持原样。
  • 是否存在 breaking change:无。preload 仅新增本机方法,既有 maker:set-model 调用保持兼容。

UI 变化

无截图:当前未启动完整桌面应用做交互录屏。本 PR 复用现有 ModelSelector、计划卡 token
和 popover 行为,没有引入新颜色或独立选择器样式。

  • 引用的设计规范:docs/design-rules/DESIGN.md §4「Select & Dropdown」复用统一模型行契约;
    §10「Theme System & Token Reference」继续消费现有 token;§14.2「Focus Management」继续
    使用既有 ModelSelector popover 的焦点管理。

怎么验证的

自动验证

基于审计基线 main c723fd3c rebase 后,在最终签署提交 99de412f0 的代码树上执行:

cd apps/desktop
..\..\node_modules\.bin\vitest.CMD run \
  src/main/maker-ipc/__tests__/runtimeSetModel.test.ts \
  src/main/maker-ipc/__tests__/planReviewModelApproval.test.ts \
  src/shared/__tests__/modelSwitchAssessment.test.ts \
  src/renderer/features/cc-agent/__tests__/planImplementationModelEligibility.test.ts \
  src/renderer/__tests__/planModeComposerEntry.test.ts \
  src/renderer/__tests__/modelSelectorProviderGroups.test.tsx \
  src/main/__tests__/makerSendToSessionOrdering.test.ts
结果:7 files / 139 tests passed

cd ../..
$env:NODE_OPTIONS='--max-old-space-size=8192'
.\node_modules\.bin\tsc.CMD --noEmit -p apps\desktop\tsconfig.json
结果:exit 0

node scripts/check-i18n.mjs
node scripts/check-i18n-glossary.mjs
node scripts/brand-terminology-guard.mjs
结果:全部通过;仅报告仓库既有的空翻译、同文翻译与 proposed glossary 警告

eslint <本 PR 改动的 14 个 TS/TSX 文件,register.ts 除外>
结果:exit 0

eslint apps/desktop/src/main/maker-ipc/register.ts
结果:5 个 no-unused-vars;五处均已存在于 origin/main,且不在本 PR 新增行

prettier --check <本 PR 的 4 个新 TS 文件>
结果:全部匹配

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

在最终签署提交 99de412f0 上,使用仓库固定的 pnpm 10.33.2 和正常 Windows
文件权限补跑了正式提交门禁:

pnpm test:unit:related
结果:PASS apps/desktop unit(140 秒,exit 0)

pnpm --filter desktop run --if-present typecheck
结果:exit 0

此前一次受限环境中的探索性 related run 错误扩大了测试范围,并因无法写入固定
D:\tmp 产生 77 个 EPERM,另触发 21 个无关旧 fixture 失败;该结果已被上述仓库正式
门禁取代,不再作为本 PR 的当前验证结果。

手工验证

未执行完整 Cindy 桌面端真实账户 smoke test;没有切换真实模型或产生外部 API 调用。

未执行的验证

  • 完整 Electron IPC mount 级集成测试;main 事务由可注入 coordinator 的 20 项行为测试、
    maker:set-model 的 28 项 runtime 测试和 ordering contract 覆盖。
  • Claude Code、Pi、SSH、device-link 和跨 provider 切换:本 PR 明确 fail-closed / 不展示。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:会话模型事务与持久化顺序

影响与回滚

  • 影响范围:仅显式 provider、确认本机所有权、无 agent switch intent 的 Codex
    plan_review。普通批准、反馈、编辑、取消及其他 Agent 仍走原通道。
  • 安全边界:renderer 只提供选择;main 再次校验 trusted sender、session owner、Agent、
    exact requestId、provider route 与 credential family。close/rebuild/defer 在任何 mutation
    前被拒绝。
  • 失败语义:apply / persist / pending replacement 都回滚模型、effort、Fast Mode 与 DB
    snapshot,并保留计划待审批;rollback 自身失败会明确报内部错误且仍不批准计划。
  • 回滚 / 降级方式:回滚本 PR 即移除 selector 和原子审批入口;无数据库 migration、无持久
    数据格式变更。
  • 邻近并发风险:open PR #1745
    只修 provider 标签,#3035
    只处理新任务配置继承;merged #3033
    提供选择器基础,均不实现本 PR 的审批时执行模型事务。
  • 最新主线:target main 已前进到 589a244b2;相对本分支共同基线的两个提交只改
    apps/mobile 和 XAI usage 文件,与本 PR 的 model/plan-review/i18n 路径零交集。
    git merge-tree --write-tree origin/main HEAD 生成 9ebaed4d,无冲突。
  • 合并风险:最终本地 heads 99de412f0(本分支)与 a3d292a129(Cindy feat: feature(orca): 协同 Worker 请求授权时没有提醒,希望对齐对话模式 #2532
    做了 git merge-tree --write-tree,合并树 102b70d0 成功;共同文件
    maker-ipc/register.ts 同时保留 plan-model 与 Worker permission 两组语义。

提交前检查

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

Signed-off-by: Beautyl0ve <74452755+Beautyl0ve@users.noreply.github.com>
@Beautyl0ve
Beautyl0ve marked this pull request as ready for review August 23, 2026 14:38
@Beautyl0ve
Beautyl0ve requested a review from a team as a code owner August 23, 2026 14:38
@greptile-apps

greptile-apps Bot commented Aug 23, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为本机 Codex 的计划审批卡增加实现模型选择,并在主进程中以保留、复核、切换、持久化和精确批准组成原子事务。

  • 将模型选择限制在当前 provider 与凭证路由,并在切换前检查上下文容量
  • 在失败、请求替换或持久化异常时回滚模型、effort、Fast Mode 与数据库快照
  • 扩展 preload、renderer 选择器、审批卡、五种语言文案及相关回归测试

Confidence Score: 4/5

此 PR 看起来可以合并,但建议先修复旧审批 Promise 可能提前解锁新计划卡的非阻塞交互竞态。

主进程的模型切换与计划批准事务具备明确的保留、复核、持久化和回滚边界;剩余问题局限于 renderer 请求切换时的提交锁状态,主进程 reservation 仍会阻止实际重复批准。

Files Needing Attention: apps/desktop/src/renderer/components/new-chat/PlanActionCard.tsx

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-ipc/planReviewModelApproval.ts 新增 exact-request 保留、事务排序、失败回滚和 CAS 式批准协调器,未发现阻塞问题。
apps/desktop/src/main/maker-ipc/register.ts 将模型热切换、路由与上下文复核、持久化及计划批准整合为主进程事务。
apps/desktop/src/main/maker-ipc/runtimeSetModel.ts 增加 requireHotSwitch 模式,拒绝关闭、重建、跨路由或延迟切换。
apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx 增加选择器资格判断、请求级选择状态和原子审批入口。
apps/desktop/src/renderer/components/new-chat/PlanActionCard.tsx 增加模型选择器和异步防重复提交,但旧请求回调可错误解锁新请求。
apps/desktop/src/renderer/components/new-chat/ModelSelector.tsx 新增 provider 限定范围,并沿用既有模型资格与能力派生逻辑。
apps/desktop/src/preload/preload.ts 新增窄化的本机计划审批模型切换桥接方法。

Sequence Diagram

sequenceDiagram
  participant U as 用户
  participant R as Renderer
  participant M as Main IPC
  participant S as Codex Session
  participant D as Session DB
  U->>R: 选择实现模型并批准
  R->>M: approvePlanReviewWithModel
  M->>M: 保留并复核 exact request
  M->>S: 热切模型、effort、Fast Mode
  M->>D: 持久化完整选择
  M->>M: 再次校验并批准计划
  alt 任一步骤失败或请求已替换
    M->>S: 恢复运行时快照
    M->>D: 恢复数据库快照
    M-->>R: 保持计划 pending 并返回错误
  else 成功
    M-->>R: 批准完成
  end
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/renderer/components/new-chat/PlanActionCard.tsx:108-117
**旧请求回调重置新提交锁**

如果请求 A 的审批仍在等待时计划卡切换到请求 B,A 随后返回 `false` 或 rejection 会无条件清除 B 正在使用的 `submittedRef`。这会在 B 的审批仍在途时重新启用按钮,允许用户发起重复 IPC,并触发 `in_flight` / `PRECONDITION_FAILED` 错误和误导性的失败提示。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(codex): choose implementation model..." | Re-trigger Greptile

Comment on lines +108 to +117
void Promise.resolve(result)
.then((accepted) => {
if (accepted !== false) return;
submittedRef.current = false;
setSubmitted(false);
})
.catch(() => {
submittedRef.current = false;
setSubmitted(false);
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 旧请求回调重置新提交锁

如果请求 A 的审批仍在等待时计划卡切换到请求 B,A 随后返回 false 或 rejection 会无条件清除 B 正在使用的 submittedRef。这会在 B 的审批仍在途时重新启用按钮,允许用户发起重复 IPC,并触发 in_flight / PRECONDITION_FAILED 错误和误导性的失败提示。

Context Used: 使用和PR描述相同的语言进行评论 (source)

Knowledge Base Used: Desktop renderer experience

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/components/new-chat/PlanActionCard.tsx
Line: 108-117

Comment:
**旧请求回调重置新提交锁**

如果请求 A 的审批仍在等待时计划卡切换到请求 B,A 随后返回 `false` 或 rejection 会无条件清除 B 正在使用的 `submittedRef`。这会在 B 的审批仍在途时重新启用按钮,允许用户发起重复 IPC,并触发 `in_flight` / `PRECONDITION_FAILED` 错误和误导性的失败提示。

**Context Used:** 使用和PR描述相同的语言进行评论 ([source](https://app.greptile.com/review/custom-context?memory=instruction-0))

**Knowledge Base Used:** [Desktop renderer experience](https://app.greptile.com/xindong/-/custom-context/knowledge-base/makecindy/cindy/-/docs/desktop-renderer-experience.md)

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@MagicLizi

Copy link
Copy Markdown
Contributor

@Beautyl0ve 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/renderer/components/new-chat/PlanActionCard.tsx),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi

Copy link
Copy Markdown
Contributor

@Beautyl0ve 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Aug 23, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 会改用户能看见的计划批准交互(选择实现模型),已按维护者确认门拦住,讨论 issue:#3305

请维护者在本 PR 上 Approve 放行;若要改,请 Request Changes。作者这边先不用再推来「催合并」——球在维护者手里。

@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/new-chat/ModelSelector.tsx / apps/desktop/src/renderer/components/new-chat/PlanActionCard.tsx / apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants