Skip to content

fix(desktop): 右栏 deferred 队列按会话保序多条,不再互相覆盖 - #2511

Merged
MagicLizi merged 2 commits into
makecindy:mainfrom
fico-hub:fix/issue-2409-rsb-deferred-queue
Aug 12, 2026
Merged

fix(desktop): 右栏 deferred 队列按会话保序多条,不再互相覆盖#2511
MagicLizi merged 2 commits into
makecindy:mainfrom
fico-hub:fix/issue-2409-rsb-deferred-queue

Conversation

@fico-hub

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

fix #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,不发往死窗口也不丢弃。

变更类型

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

范围

  • 关联 Issue / 需求:右栏 detached 队列:同会话 deferred 命令互相覆盖,登记类命令可能丢失 #2409
  • 本 PR 包含:apps/desktop/src/main/right-sidebar-window/controller.ts 队列结构与 flush 语义 + controller.test.ts 新增 4 条回归
  • 明确不包含:renderer 侧 store 写入时机;右栏窗口 UI
  • 用户可见变化:右栏关闭期间发生的多个登记(如 subagent 页签 + Orca 面板)在窗口重开后全部生效,不再互相顶掉
  • 是否存在 breaking change:无

UI 变化

不涉及(main 进程队列逻辑,无界面改动)。

  • 引用的设计规范:不涉及

怎么验证的

自动验证

pnpm --filter desktop exec vitest run src/main/right-sidebar-window/__tests__/controller.test.ts --pool=forks
结果:全部通过(既有 38 条控制器用例不变;新增 4 条:同会话登记+close 保序全量下发 / 切 attached 全量转交主 renderer / 等价重复帧合并 / generic ensure 合并后显式 intent 与其他命令仍全量下发)

pnpm --filter desktop run --if-present typecheck
结果:通过(0 错误)

desktop 全量单测(--pool=forks 规避 threads 池已知 SIGSEGV flake)
结果:约 2.44 万用例全部通过

根 pnpm test:unit
结果:通过(期间出现的失败均逐一隔离复跑核实为负载 flake,与本改动无关)

手工验证

不涉及(队列行为由控制器测试全路径覆盖)。

未执行的验证

无。

风险

风险分类

  • 无已知风险
  • 其他:

影响与回滚

  • 影响范围:仅右栏窗口 deferred 命令队列;单条命令场景行为与原实现一致,多条场景从「覆盖」变为「保序下发」。上限 32 条/会话防无界增长。
  • 回滚 / 降级方式:revert 本 commit 回到单条覆盖行为,无状态、无数据迁移。

提交前检查

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

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>
@fico-hub
fico-hub requested a review from a team as a code owner August 12, 2026 07:17
@greptile-apps

greptile-apps Bot commented Aug 12, 2026

Copy link
Copy Markdown

Greptile Summary

本次修改将右栏窗口的 deferred 存储从每会话单条命令扩展为有界有序队列,并统一 detached 与 attached 模式的 flush 行为。

  • 保序交付同一宿主会话中的多条不同命令,并合并等价重复帧
  • 将 Orca close 作为合并屏障,保留 close 后的重新打开意图
  • host 在 flush 中失效时将剩余命令重新放回队首
  • 为单会话队列增加 32 条上限和溢出告警
  • 增加覆盖多命令交付、close 屏障、去重及 review 载荷替换的回归测试

Confidence Score: 5/5

当前实现已修复既有 Orca close 屏障问题,未发现仍需阻止合并的故障。

当前代码只在最近一次 Orca close 之后检查 generic ensure 合并,并通过相邻去重与顺序 flush 保留 [ensure, close, ensure],因此既有阻塞问题不再存在。

Important Files Changed

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
Loading

Reviews (2): Last reviewed commit: "fix(desktop): deferred 队列合并止于 close 屏障,o..." | Re-trigger Greptile

Comment thread apps/desktop/src/main/right-sidebar-window/controller.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment thread apps/desktop/src/main/right-sidebar-window/controller.ts Outdated
Comment thread apps/desktop/src/main/right-sidebar-window/controller.ts
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 MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review (review-pr-auto): 0 P0/P1 发现。deferredCommands 从单值改为保序队列,合并规则(close 分段、邻接去重、open-turn-review 末写胜)正确,flushDeferredCommands 逐条 isHostAlive 守卫 + 中途 host 死亡重入队逻辑安全。测试覆盖全部合并路径。

@MagicLizi
MagicLizi merged commit 6b09fc3 into makecindy:main Aug 12, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

右栏 detached 队列:同会话 deferred 命令互相覆盖,登记类命令可能丢失

2 participants