fix(desktop): preserve fresh remote Orca Lead startup - #3926
Conversation
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/maker-ipc/makerSendTransaction.ts | 新增可信 device-link 队列来源标记,并在 active Codex Orca Lead rehydrate 时依据 live rollout evidence 决定是否丢弃 DB resume id。 |
| apps/desktop/src/main/maker-ipc/agent-input-coordinator.ts | 在内部队列 drain 时透传 device-link provenance,同时从对外投影中删除该 main-only 字段。 |
| apps/desktop/src/main/maker-ipc/register.ts | 在 enqueue 与 steer 两个可信 IPC 边界为 device-link 输入盖章,避免客户端伪造来源。 |
| packages/maker-core/src/agents/codex/index.ts | 抽取 fresh thread/start 并为 resume 增加 no-rollout fallback,但回退分类使用过宽的错误字符串子串匹配。 |
| packages/maker-core/src/session.ts | 将 Codex thread rollout evidence 从 provider handle 暴露给 desktop session transaction。 |
| scripts/device-link-orca-e2e.mjs | 新增双实例 CDP runner、trace 脱敏与场景断言,但 regression 的简化 events 输入可绕过完整场景矩阵。 |
| docs/testing/device-link-orca-e2e.md | 记录 CN 双实例启动、配对、场景 trace 合同及脱敏输出流程。 |
Sequence Diagram
sequenceDiagram
participant C as Device-link Controller
participant M as Desktop Main
participant Q as Input Coordinator
participant T as Send Transaction
participant DB as Session DB
participant X as Codex Adapter
participant P as Codex Provider
C->>M: input.enqueue
M->>M: 校验调用来源并盖章 provenance
M->>Q: 入队(携带 fromDeviceLinkClient)
Q->>T: drain / sendToAgentAccepted
T->>DB: reconcile resumeSessionId
T->>T: 检查 Orca Lead 与 rollout evidence
alt 已证明 fresh
T->>T: 清除 resumeSessionId
T->>X: bootstrap fresh session
X->>P: thread/start
else 保留历史身份
T->>X: bootstrap resumed session
X->>P: thread/resume
alt 精确 no-rollout
X->>P: thread/start fallback
end
end
X->>P: 首次 turn
Prompt To Fix All With AI
### Issue 1
packages/maker-core/src/agents/codex/index.ts:5734
**回退条件匹配过宽**
这里并没有像注释所说的那样识别“精确的 provider 错误”,而是对整个包装后的错误字符串进行无边界的子串匹配。app-server 会把服务端的任意 `error.message` 原样拼入该字符串;如果其他 resume 错误的原因链或包装文本包含 `no rollout found`,历史会话就会被误判为全新线程并执行 `thread/start`,导致后续消息脱离原有历史上下文。请结合结构化错误码、错误数据和精确消息形状进行分类,而不是匹配任意子串。
### Issue 2
scripts/device-link-orca-e2e.mjs:224-225
**回归断言可被绕过**
只有提供非空 `cases` 对象时,runner 才要求 SSH、local、Worker、non-Orca、evidence true/unknown 和 retry 八组场景。否则,仅含一次 `thread/resume` 的普通 `events` trace 也会通过并被标记为 asserted,即使文档声明的回归矩阵根本没有执行。这会产生假阳性的验证结果;请始终要求完整场景集合,或将简化输入拆分为明确的较弱模式。
---
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): preserve fresh remote Orca..." | Re-trigger Greptile
|
@fmfsaisai 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/maker-core/src/agents/codex/index.ts / scripts/device-link-orca-e2e.mjs),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
9388a42 to
6f3b7a7
Compare
Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
6f3b7a7 to
a81bab1
Compare
|
远程 Orca Lead 这次终于不会把「刚建起来、还没 rollout」的会话当成旧线程硬 resume 了——device-link 盖章也收在 main 侧,控制端没法自己报身份。谢谢。 |
这次改了什么
摘要
修复远程 device-link 新建 Codex Orca Lead 时,刚由 thread/start 产生且尚未接受 turn 的 sdk_session_id 被错当成可 resume 历史线程,导致首条消息 no-rollout 失败。main 侧盖章 device-link provenance;active Orca rehydrate 仅在可证明 fresh evidence=false 时清除 DB id;Codex 只对精确 app-server no-rollout 错误执行一次 thread/start fallback,并保留 preflight fail-closed。
根因由多个时序共同形成:PR #1212(b7c098250)引入 remote draft→pending→SessionView enableOrca→first input;PR #2882(3f39190ad)与 #3818(ab805af81)扩展 DB reconcile/rehydrate,使 fresh sdk_session_id 在尚未接受 turn 时进入 resume。不是单个 PR 独立引入全部问题。
变更类型
fix缺陷修复test测试维护范围
fromDeviceLinkClientprovenance(IPC/coordinator 到 send transaction)、active Orca fresh Codex Lead 判定、Codex exact no-rollout fallback 与 resume preparation fail-closed、相关 Desktop/maker-core Vitest 回归测试。UI 变化
怎么验证的
自动验证
手工验证
2026-09-04,CN,隔离双 worktree/userData 的两实例人工验证;无仓库自动化 E2E runner:
未执行的验证
negative live fault injection、SSH/local/evidence 矩阵、精确原始 RPC trace:BLOCKED/未覆盖;不声称完成真实 live fault injection 或 raw RPC 观测。手机端未额外适配验证;本 PR 未修改 device-link retry/timeout/reconnect recovery。
风险
风险分类
影响与回滚
-32600canonical message、空error.data且 thread id 精确一致时 fallback;普通/包装 resume 错误不 fallback,preflight blocked 仍 fail-closed。Device-link / remote adaptation
本 PR 未修改 retry、timeout、reconnect recovery,因此故障半径三问不适用。device-link provenance 与 fresh Lead 行为已按人工双实例验证;SSH/手机没有额外 live 适配覆盖,另行跟踪即可。
提交前检查
git commit -s,见 DCO)后续工作
fault injection harness、exact raw RPC trace、完整 SSH/local/evidence 兼容矩阵另开 follow-up;不把未执行内容视为本 PR 的 PASS。