Skip to content

fix(ui): 右侧栏「后台任务」tab 跨端同步与状态镜像自愈 - #453

Merged
su-fen merged 2 commits into
mainfrom
fix/background-tasks-tab-sync
Aug 13, 2026
Merged

fix(ui): 右侧栏「后台任务」tab 跨端同步与状态镜像自愈#453
su-fen merged 2 commits into
mainfrom
fix/background-tasks-tab-sync

Conversation

@su-fen

@su-fen su-fen commented Aug 13, 2026

Copy link
Copy Markdown
Member

Fixes #452

问题

  1. 手动开/关「后台任务」tab 不跨端:可见性意图是会话本地 React state,从不进入跨端同步的 rightDock 设置。
  2. 任务列表镜像为一次性初始化 + 纯推送,任何一次推送丢失(网关背压丢帧 / webview 停摆漏 Tauri 事件 / socket 单例重建后订阅挂死)都会让面板永久停在旧状态。

改动

tab 开合跨端同步

  • RightDockProjectState 新增 backgroundTasks: { opened, dismissedIds },随 rightDock 整桶 (stateVersion, writerId) LWW 归并跨端同步(与文件树等工具 tab 同通道);normalize / contentKey / 墓碑判定 / 工作区移除路径全覆盖。
  • 新增 open/closeRightDockBackgroundTasksTabState 手势变换:open 固定可见 + 激活 tab + 清空 dismissal;close 保持 hide-only 语义(快照当前进程 id,新任务在快照外则全端重新派生)。
  • RightDockPanel 可见性改读持久化状态,开/关手势写入 projectState(写入仅限用户手势);无 projectPathKey 时回退会话本地状态。
  • tab id 常量真源迁至 settings 的 RIGHT_DOCK_BACKGROUND_TASKS_TAB_IDcloseRightDockToolTabState 显式构造补字段透传。

状态镜像自愈

  • store 新增 refreshManagedProcessState()(拉权威快照对账,兼作失败初始化的重试);init 挂 visibilitychange→visible 对账。
  • BackgroundTasksPanel 作为可见 tab 期间:激活即对账 + 30s 周期对账。
  • WebUI socket 单例:everHadClient 判定 replaced——reset→create 序列(登出→登录)也触发 onGatewayWebSocketClientReplaced,模块级 store 不再挂死在已 dispose 实例上;shouldMaintainConnection 补上 processStateListeners

测试

  • 新增 Go 集成测试:agent 发布 ManagedProcessSnapshot → 浏览器广播 + 新连接回放(v2_managed_process_test.go)。
  • 新增 web 用例:store 喂入/陈旧修订丢弃/refresh 自愈(managed-process-store.test.mjs)、单例替换契约含登出→登录路径(gateway-socket-singleton.test.mjs)。
  • 新增 right-dock 用例 6 例:归一化上限、开/关手势语义、仅后台意图桶不进墓碑、仅后台变更递增版本落盘、意图随版本归并同步。
  • 回归:web 569 例全过;GUI 1673 例仅 markdown-assets 既有失败(main 干净树同样失败,与本 PR 无关);gateway Go websocket 包全过;两端 tsc、biome、check-ui-boundaries 干净。

验证链路(定位过程中的实测)

网关广播/回放(Go 测试)、浏览器完整管线(Node 加载真实 gatewaySocket.ts + 共享 store 对接真网关)均实测健康,问题定位为上述会话本地意图与无自愈设计。

tab 开合意图提升为 RightDockProjectState.backgroundTasks 持久化字段,
随 rightDock 整桶 (stateVersion, writerId) LWW 跨端同步;关闭仍为
hide-only(快照进程 id,新任务在快照外则全端重新派生);无项目路径时
回退会话本地状态。

镜像自愈:store 新增 refreshManagedProcessState(兼作失败初始化重试),
页面回到可见即对账;面板作为可见 tab 期间 30s 周期对账。修复 WebUI
socket 单例 reset→create 不触发 replaced 事件导致订阅挂死,以及
shouldMaintainConnection 缺少 processStateListeners。

Fixes #452
@github-actions

Copy link
Copy Markdown
Contributor

PR governance checks failed — this PR has been converted to draft.

  • UI change without screenshots: this PR modifies frontend code. Please add before/after screenshots or a recording under "Screenshots / preview" in the PR body.

Fix the items above, then click Ready for review to re-run the checks.

@StackCairn
StackCairn marked this pull request as draft August 13, 2026 06:09
@su-fen su-fen added the governance-exempt Skip PR governance checks label Aug 13, 2026
store 五例合一(镜像语义+refresh 自愈按序覆盖)、单例替换只留
reset→create 关键路径、right-dock 六例并两例(手势语义/落盘归并,
墓碑守卫改单断言)、Go 用例抽公共断言并裁冗余字段。覆盖不变。
@su-fen
su-fen marked this pull request as ready for review August 13, 2026 06:24
@su-fen
su-fen merged commit ae919b2 into main Aug 13, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

governance-exempt Skip PR governance checks

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] GUI 与 WebUI 右侧栏「后台任务」tab 不同步(开合状态不跨端、状态镜像丢推送后永久停滞)

1 participant