Skip to content

fix(chat): 侧栏点选跨工作空间会话时同步切换工作空间与右侧文件树 - #837

Merged
Loosand merged 2 commits into
Stack-Cairn:developfrom
AlphaCatMeow:fix/sidebar-filetree-sync-develop
Sep 20, 2026
Merged

Loosand merged 2 commits into
Stack-Cairn:developfrom
AlphaCatMeow:fix/sidebar-filetree-sync-develop

Conversation

@AlphaCatMeow

@AlphaCatMeow AlphaCatMeow commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

Closes #787

本 PR 是 #817 改 base 到 develop 的重提,补丁内容与 #817 完全一致(git patch-id 相同),在 develop 上 cherry-pick 无冲突。合并后 #817 可关闭。

问题

侧栏改成跨工作空间的会话树(#770)之后,点另一个工作空间下的会话,会话内容切过去了,右侧 dock(文件树、终端、Git 面板)还停在上一个工作空间。

原因:dock 的 cwd / projectPathKey 一直取自 activeWorkspaceProjectPath,这个值只在点项目行、Workbench 聚焦 Pane、或从搜索弹窗打开会话(#752 加的 beforeCommit)时更新。普通点选会话走 openController.open(id) 直开,中间没有任何一步把会话所属的工作空间置为当前。Desktop 和 WebUI 都有这个问题。

改法

  • activateSearchConversationWorkspace 抽出 activateConversationWorkspace(cwd):按 cwd 找到对应项目(找不到就按 history 类型临时建一个)并 activateWorkspaceProject(project, { preserveMissing: true })。同工作空间或无 cwd 时直接返回,不写 settings。搜索路径改为复用它,行为不变。
  • Desktop handleSelectConversation 和 WebUI handleSidebarSelectConversation 的普通点选分支,把这个激活挂在 openController.openafterCommit 上:会话先提交,提交后再切工作空间。只在 agent 模式生效。
  • Desktop openInitial 的 cache-hit 分支补调了 request?.afterCommit?.()。缓存命中同样是一次真实提交,之前只有冷路径会调,不补的话热路径下工作空间不会跟。搜索路径不走这个分支,不受影响。

为什么必须等 afterCommit

第一版实现是点选时先切工作空间再打开会话,实测要点两次才能进会话。链条是:先切工作空间 → sidebarScope 先行刷新 → 旧的当前会话从新作用域的列表里消失 → ChatPage 里"当前会话从历史列表消失则新建草稿"的兜底 effect 触发 startNewConversationcancelConversationLoad 把正在进行的这次打开顶掉,用户落在空白草稿上。挂到 afterCommit 之后,提交时当前会话已经是目标会话,在新作用域列表里存在,兜底 effect 不会误判。

文件树面板关着的时候也一样生效:RightDockPanelcwd/projectPathKey 是常驻 props,激活后内部状态已指向新工作空间,下次展开就是对的目录,不会主动弹开面板。

验证(在 develop 基线上重新跑)

不改的东西

activateWorkspaceProject 本身、搜索路径和 Workbench 路径的语义都没动。有一个副作用是有意保留的:当前是空白草稿时点别的工作空间的会话,草稿的 workdir 会跟过去,和点项目行、搜索打开的既有行为一致。

截图

2026-09-20_16-04-48

普通点选会话只走 openController.open,没有把会话所属工作空间置为当前,
右侧 dock 的文件树/终端/Git 仍停在上一个工作空间。从搜索路径抽出
activateConversationWorkspace,Desktop 与 WebUI 的普通点选分支在打开前
按会话 cwd 激活对应工作空间;同工作空间或无 cwd 时不动。

Refs Stack-Cairn#787
点选前先激活工作空间会让侧栏作用域先行刷新,旧的当前会话从列表消失
触发兜底新建草稿,把这次打开顶掉——表现为要点两次。改为会话提交后
(afterCommit)再激活其工作空间;Desktop 的 cache-hit 分支补调 afterCommit,
热路径同样生效。cwd 优先取运行时/历史响应的权威 workdir。

Refs Stack-Cairn#787
@StackCairn
StackCairn marked this pull request as draft September 20, 2026 06:33
@github-actions

github-actions Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

PR governance checks passed. Awaiting human review.

@AlphaCatMeow
AlphaCatMeow marked this pull request as ready for review September 20, 2026 08:05
@Loosand
Loosand merged commit fcbf774 into Stack-Cairn:develop Sep 20, 2026
10 of 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.

2 participants