Skip to content

fix(codex): 远端 compact 密文失败走同一任务换窗 - #3529

Open
dashhuang wants to merge 1 commit into
mainfrom
dash/codex-remote-compact-encrypted-rollover
Open

fix(codex): 远端 compact 密文失败走同一任务换窗#3529
dashhuang wants to merge 1 commit into
mainfrom
dash/codex-remote-compact-encrypted-rollover

Conversation

@dashhuang

Copy link
Copy Markdown
Member

这次改了什么

摘要

Codex 订阅会话做远端压缩时,如果历史里有解不开的 encrypted_content,上游直接 400:Error running remote compact task + invalid_encrypted_content。这条失败原样重试必败;HTTP 静默剥推理密文也够不到 compact / WebSocket。用户只能开新任务或手动 Fork。

本 PR 把它当成官方 compact 的确定性失败,接到现有同一任务换窗(host-controlled rollover):关掉旧 native thread、写交接、重放刚才那句用户消息。新任务不用用户去开,也不走 Fork 并剥离。单独的 invalid_encrypted_content(供应商切换时 HTTP 还能剥推理密文)不会被误判成换窗。

设计上接着 #3510 的「官方压不动就同一任务换窗」,但不改 #3510,独立合入。

变更类型

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

范围

  • 关联 Issue / 需求:无独立 issue;用户报告更新后旧 Codex 任务(GPT-5.6 Sol)每条消息都报 remote compact invalid_encrypted_content,新任务正常。
  • 本 PR 包含:
    • isRemoteCompactEncryptedContentError:必须同时命中 remote compactinvalid_encrypted_content
    • Codex translator / turn.completed 给稳定 context-overflow reason
    • 现有 contextOverflowRollover 把这类错误当成可重建
    • 已卡住的任务下次发送也会 prepareUnhealthySession
  • 明确不包含:
  • 用户可见变化:这类 compact 密文失败时,同一条任务自动出现既有「已整理上下文并继续」,不再停在红条上让用户重试或 Fork。本轮已有工具副作用时仍 fail closed,不自动重放。
  • 是否存在 breaking change:无

UI 变化

  • 引用的设计规范:不涉及新增视觉。换窗边界卡复用既有 contextRebuild 分隔样式与 chat.errorBanner.contextOverflow 文案。

怎么验证的

自动验证

pnpm --filter @cindy/maker-core exec vitest run \
  src/agents/shared/remote-compact-encrypted-error.test.ts \
  src/agents/codex/translator.test.ts
结果:2 files / 86 passed

pnpm --filter desktop exec vitest run \
  src/main/maker-ipc/__tests__/contextOverflowRollover.test.ts
结果:41 passed

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

pnpm test:unit:related 因改了 maker-core 公共导出而拉了全量 desktop。其中 maker-core related 通过。desktop 全量有环境性失败(claudeOrphanReaperportReclaimusageHistory、以及若干 ioreg collect 失败),与本 diff 无关;#3510 也曾在干净 main 上复现同类基线项。CI 全量 pnpm test:unit 为准。

手工验证

未在安装版 Cindy 上用真实 GPT-5.6 Sol 旧任务复现换窗。分类与 rollover 由单测覆盖用户截图中的文案形态。

未执行的验证

真机:打开已报 Error running remote compact task 的旧 Codex 任务,发下一条,确认同一任务交接并继续。device-link / SSH 未手测(SSH 本就拒绝本地换窗)。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:把 compact 密文失败映射到既有 context-overflow 换窗;交接会丢掉 native 历史细节,只保留摘要。本轮已有工具副作用时不自动 replay。

影响与回滚

  • 影响范围:本地 Codex 订阅会话的远端 compact 密文 400。SSH Codex 不换窗。
  • 回滚 / 降级方式:revert 本 PR。已换窗的任务继续用新 native thread;旧 rollout 仍在磁盘。

提交前检查

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

订阅会话 remote compact 撞 invalid_encrypted_content 时,原样重试必败,
且 HTTP 静默剥推理密文够不到这条路径。把它当成官方 compact 确定性失败,
复用现有 host-controlled rollover:同一条任务交接重建并重放用户消息,
不再要求用户开新任务或 Fork。单独的 invalid_encrypted_content 仍留给
静默剥密文,避免供应商切换被误换窗。

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang
dashhuang requested a review from a team as a code owner August 27, 2026 12:53
@greptile-apps

greptile-apps Bot commented Aug 27, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 将 Codex 远端 compact 的 invalid_encrypted_content 确定性失败接入既有的同任务换窗恢复流程。

  • 新增严格要求同时命中 remote compactinvalid_encrypted_content 的共享分类器
  • 在 Codex error notification 与 turn.completed 路径中写入稳定的 context-overflow reason
  • 扩展桌面端即时恢复及下次发送前的异常会话重建,并补充相应测试与开发规则说明

Confidence Score: 5/5

未发现需要阻止合入的问题,此改动沿用既有换窗安全边界并将匹配范围限制在目标 Codex 错误上。

新分类器要求两个特征同时存在,Codex 的两条终态路径均写入统一 reason,而桌面恢复流程继续拒绝 SSH 会话并对已有工具副作用 fail closed。

Important Files Changed

Filename Overview
packages/maker-core/src/agents/shared/remote-compact-encrypted-error.ts 新增窄范围双条件分类器,避免将单独的密文错误误判为换窗条件。
packages/maker-core/src/agents/codex/translator.ts 将 error notification 中的 message 与 additionalDetails 联合分类,并复用稳定的 context-overflow reason。
packages/maker-core/src/agents/codex/index.ts 在权威的 turn.completed 失败路径中同步标记远端 compact 密文错误。
apps/desktop/src/main/maker-ipc/contextOverflowRollover.ts 将新错误类型接入现有 rollover 检测,同时保留远程会话和副作用相关安全边界。
apps/desktop/src/main/maker-ipc/tests/contextOverflowRollover.test.ts 覆盖即时恢复、下次发送前重建及单独密文错误不触发换窗的行为。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Codex 远端 compact] --> B{错误文本同时包含<br/>remote compact 与<br/>invalid_encrypted_content?}
  B -->|否| C[保留原错误处理]
  B -->|是| D[标记 context-overflow]
  D --> E{本地会话且可安全重放?}
  E -->|否| F[Fail closed]
  E -->|是| G[关闭旧 native thread]
  G --> H[写入上下文交接]
  H --> I[重放当前用户消息]
Loading

Reviews (1): Last reviewed commit: "fix(codex): 远端 compact 密文失败走同一任务换窗" | Re-trigger Greptile

@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) labels Aug 27, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

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

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

@MagicLizi MagicLizi added status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) and removed status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) labels Aug 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants