fix(desktop): 右栏 deferred 队列按会话保序多条,不再互相覆盖 - #2511
Conversation
fix makecindy#2409:detached 右栏关闭/未 ready 时,deferredCommands 每会话只存 一条命令,后到的 passive 命令直接 set 覆盖先到的 —— 历史挂载路径的 subagent 页签静默登记会被随后的 Orca ensure/close intent 顶掉;renderer 按设计只在 attached 结果下写本地 store,队列被覆盖等于这次登记没有落点, 窗口再打开时页签入口缺失。 - 存储改为 Map<hostSessionId, RsbWindowCommand[]>:语义不同的命令保序 全量下发,detached 与 attached 两条 flush 路径共用同一实现。 - enqueue 合并规则:完全等价的重复帧只登记一次;保留既有 Orca 优先规则 (队列已有 ensure-orca intent 时,后到的无定位 generic ensure 忽略, 保护更具体的旧 intent)并先固化为测试。 - 每会话条数上限 32,溢出丢最旧并记 warn(不静默);跨会话 MAX_DEFERRED_SESSIONS 淘汰行为不变。 - flush 中途 host 销毁时,剩余命令放回队列头等下一个 host ready,不发往 死窗口也不丢弃。 新增 4 条回归:同会话登记+close 保序全量下发 / 切 attached 全量转交主 renderer / 等价重复帧合并 / generic ensure 合并后显式 intent 与其他命令 仍全量下发。既有 38 条控制器用例不变。 Signed-off-by: ficowang <fico@xd.com>
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/right-sidebar-window/controller.ts | 将单值 deferred 存储改为按会话有界队列,加入 close 屏障、命令合并、顺序 flush 与失效 host 的剩余命令恢复;既有线程指出的跨 close 合并问题已修复。 |
| apps/desktop/src/main/right-sidebar-window/tests/controller.test.ts | 新增多命令保序、attached 转交、重复帧合并、close 屏障及同目标 review 替换等回归覆盖。 |
Sequence Diagram
sequenceDiagram
participant Caller as 命令调用方
participant Controller as RsbWindowController
participant Queue as 会话 deferred 队列
participant Host as Attached/Detached Host
Caller->>Controller: "routeCommand(command, allowOpen=false)"
Controller->>Queue: 按 hostSessionId 入队/合并
Note over Queue: close-orca-workers-tab 形成合并屏障
Host->>Controller: ready 或切换至 attached
loop 按入队顺序
Controller->>Host: send(command)
end
alt Host 中途失效
Controller->>Queue: 剩余命令放回队首
end
Reviews (2): Last reviewed commit: "fix(desktop): deferred 队列合并止于 close 屏障,o..." | Re-trigger Greptile
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bd429e493a
ℹ️ 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".
review 反馈(makecindy#2511): - P1:generic ensure 合并原本扫全队列,[显式 ensure, close, generic ensure] 时最后的重开意图被屏障前的历史 ensure 吸收,flush 终态停在 close。合并判定收窄到最近一条 close-orca-workers-tab 之后的段。 - 等价帧去重同理改为只做相邻合并:隔着其他命令的等价帧可能被中间命令 改变重放语义,必须保留。 - P2(完成顺序竞态):flush 批量下发后 renderer 对命令是并发处理的,同 目标两条 open-turn-review 在途时完成顺序不保证,旧载荷可能覆盖新载荷。 open-turn-review 是同 session 单例 tab 的 last-write-wins 载荷帧,入队 时同目标旧帧被新帧取代,同一目标最多一帧在途,竞态源头消失;不同 session 的帧不受影响。 新增 3 条回归:close 后 generic ensure 保留 / 跨屏障等价帧不合并 / 同目标 open-turn-review 取代且异目标并存。 Signed-off-by: ficowang <fico@xd.com>
MagicLizi
left a comment
There was a problem hiding this comment.
Code Review (review-pr-auto): 0 P0/P1 发现。deferredCommands 从单值改为保序队列,合并规则(close 分段、邻接去重、open-turn-review 末写胜)正确,flushDeferredCommands 逐条 isHostAlive 守卫 + 中途 host 死亡重入队逻辑安全。测试覆盖全部合并路径。
这次改了什么
摘要
fix #2409。detached 右栏窗口关闭/未 ready 时,
deferredCommands每会话只存一条命令,后到的 passive 命令直接 set 覆盖先到的——历史挂载路径的 subagent 页签静默登记会被随后的 Orca ensure/close intent 顶掉;renderer 按设计只在 attached 结果下写本地 store,队列被覆盖等于这次登记没有落点,窗口再打开时页签入口缺失。Map<hostSessionId, RsbWindowCommand[]>:语义不同的命令保序全量下发,detached 与 attached 两条 flush 路径共用同一实现。MAX_DEFERRED_SESSIONS淘汰行为不变。变更类型
fix缺陷修复feat新功能refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
apps/desktop/src/main/right-sidebar-window/controller.ts队列结构与 flush 语义 +controller.test.ts新增 4 条回归UI 变化
不涉及(main 进程队列逻辑,无界面改动)。
怎么验证的
自动验证
手工验证
不涉及(队列行为由控制器测试全路径覆盖)。
未执行的验证
无。
风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)