Skip to content

feat(chat): move conversations to another workspace (single & batch) - #356

Merged
su-fen merged 3 commits into
Stack-Cairn:mainfrom
devil233-ui:feat/move-conversations-between-workspaces
Aug 9, 2026
Merged

feat(chat): move conversations to another workspace (single & batch)#356
su-fen merged 3 commits into
Stack-Cairn:mainfrom
devil233-ui:feat/move-conversations-between-workspaces

Conversation

@devil233-ui

@devil233-ui devil233-ui commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Conversations are permanently bound to the workspace (cwd) selected at creation time, with no way to re-file them afterwards (see #348). This PR adds a "Move to workspace" action for a single conversation plus a batch move in multi-select mode.

Changes

Backend (agent-gui/src-tauri)

  • New Tauri command chat_history_set_cwd(id, cwd) that updates chatHistory.cwd and broadcasts a history sync (mirrors chat_history_set_pinned).
  • Unit tests covering: moving a conversation between workspaces (and the resulting workdirs grouping), rejecting empty targets, and rejecting missing conversations.

Frontend (agent-gui/src)

预览
  • setChatHistoryCwd(id, cwd) IPC wrapper in chatHistory.ts.
  • Conversation context menu now includes a "Move to workspace" submenu listing available workspaces (excludes the current one).
  • Multi-select mode gains a batch move button (folder icon) that moves all selected conversations to a chosen workspace, reusing the existing selection mechanism (parallel to bulk delete).
  • i18n keys added for zh-CN and en.

Verified

  • cargo test -p liveagent set_cwd — 2/2 pass
  • cargo check — clean
  • pnpm exec tsc --noEmit — clean
  • pnpm exec biome check on changed files — clean
  • Manually tested in the desktop GUI: single-conversation move and batch move both work; sidebar re-groups immediately without restart.

Closes #348 (feature request).

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

PR governance checks passed. Awaiting human review.

@su-fen

su-fen commented Aug 4, 2026

Copy link
Copy Markdown
Member

Webui需要同步更新

@devil233-ui

devil233-ui commented Aug 4, 2026 via email

Copy link
Copy Markdown
Contributor Author

@devil233-ui

devil233-ui commented Aug 4, 2026 via email

Copy link
Copy Markdown
Contributor Author

@devil233-ui

Copy link
Copy Markdown
Contributor Author

Webui需要同步更新

忘记通知了,已实际测试(非ai脑测)通过,请审阅

@su-fen

su-fen commented Aug 9, 2026

Copy link
Copy Markdown
Member

前端重构了下,得解决下冲突了QAQ

@devil233-ui

devil233-ui commented Aug 9, 2026 via email

Copy link
Copy Markdown
Contributor Author

@devil233-ui
devil233-ui force-pushed the feat/move-conversations-between-workspaces branch from a45e796 to 9674066 Compare August 9, 2026 08:38
@devil233-ui

Copy link
Copy Markdown
Contributor Author

已处理上游前端重构带来的冲突,并将分支变基到最新main

本次适配保留了#399引入的crates/agent-ui共享界面结构,会话移动统一接入共享SidebarStore.setCwd,未恢复已删除的GUI/WebUI重复实现。单条移动、批量移动、运行中拦截、乐观更新失败回滚及批量失败项保留选择均已保留。

验证结果:

  • GUI生产构建通过
  • WebUI生产构建通过
  • GUI测试1491/1491通过
  • WebUI测试546/546通过
  • Rustset_cwd定向测试2/2通过
  • UI边界检查、定向Biome检查、git diff --check通过
  • Gateway Buf lint及生成结果一致性验证通过
  • 手动联调通过单条移动、桌面端同步、批量移动和运行中禁用
  • 失败回滚与失败项保留选择由GUI/WebUI两端自动化用例覆盖;正常在线UI没有安全的手动故障注入入口

- 后端新增 chat_history_set_cwd 命令:更新会话的 cwd 归属并广播历史同步
- 前端新增 chat_history_set_cwd IPC 封装与 setChatHistoryCwd API
- 侧边栏会话右键菜单新增"移动到工作空间"子菜单,列出可用工作空间
- 多选模式下新增"批量移动到工作空间"按钮,复用现有选择机制
- 新增后端单元测试覆盖移动归属与边界校验
新增history.set_cwd协议、网关处理和生成代码,持久化会话cwd并广播同步事件。

为WebUI与桌面端共享侧边栏加入单条/批量移动、运行中拦截、乐观更新回滚和错误提示。

补齐中英文文案、WebSocket二进制帧往返测试及共享存储回归测试。

同步WebUI菜单交互,支持从更多操作和批量选择中切换目标工作空间。
@devil233-ui
devil233-ui force-pushed the feat/move-conversations-between-workspaces branch from 9674066 to cff6bdc Compare August 9, 2026 12:59
@devil233-ui

devil233-ui commented Aug 9, 2026

Copy link
Copy Markdown
Contributor Author

已再次将分支变基到包含#406 的最新\main\,当前无冲突且GitHub显示可合并。滚动与右侧楼层导航问题现由#406 正式修复;本地已在真实桌面DOM中验证:聊天区域恢复为有界滚动容器,滚轮可更新\scrollTop\,楼层导航8个标记正常显示。PR合规检查也已通过。

@su-fen

su-fen commented Aug 9, 2026

Copy link
Copy Markdown
Member

行吧..还好凌晨大善人重置了

---Original--- From: @.> Date: Sun, Aug 9, 2026 15:06 PM To: @.>; Cc: @.@.>; Subject: Re: [Stack-Cairn/LiveAgent] feat(chat): move conversations to another workspace (single & batch) (PR #356) su-fen left a comment (Stack-Cairn/LiveAgent#356) 前端重构了下,得解决下冲突了QAQ — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

token不够的话,在群里找我

@devil233-ui

Copy link
Copy Markdown
Contributor Author

行吧..还好凌晨大善人重置了

---Original--- From: @.> Date: Sun, Aug 9, 2026 15:06 PM To: _@**._>; Cc: _@.@._>; Subject: Re: [Stack-Cairn/LiveAgent] feat(chat): move conversations to another workspace (single & batch) (PR #356) su-fen left a comment (Stack-Cairn/LiveAgent#356) 前端重构了下,得解决下冲突了QAQ — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: _@_.*>

token不够的话,在群里找我

我去这就加(bushi

@su-fen

su-fen commented Aug 9, 2026

Copy link
Copy Markdown
Member

我在当前 head cff6bdc576cab00154dbc2304ec3f4f122a4d8b2 上复核后,发现一个需要在合入前修复的 GUI runtime blocker:移动当前已打开但空闲的会话后,桌面 GUI 没有同步更新该会话的运行时工作目录。

复现路径

  1. 在工作空间 A 打开一个历史会话,保持会话空闲;
  2. 右键将当前会话移动到工作空间 B;
  3. 不关闭或重新打开会话,直接发送下一条消息(可让 Agent 执行 pwd);
  4. 下一轮仍可能以 A 作为 effectiveWorkdir,本轮历史持久化还可能把数据库中的 chatHistory.cwd 从 B 覆盖回 A。

原因

  • ChatSidebarContainer 的单条/批量移动只调用 SidebarStore.setCwd(),更新了侧边栏和 SQLite,但没有更新 conversationRuntimeCacheRef 中当前会话的 workdir
  • GUI 的 useSendChatTurn 计算 effectiveWorkdir 时读取的是 runtimeEntry.workdir ?? settings.system.workdir,没有像 WebUI 一样优先读取 sidebarStore.peek(conversationId)?.cwd
  • 随后的 persistConversationWithHistorySync({ cwd: conversationCwd }) 会通过 history upsert 再次写入 cwd,因此旧 runtime 值可能撤销刚完成的移动;
  • WebUI 发送路径优先使用 SidebarStore 中的持久化 cwd,所以这里还存在 GUI/WebUI 行为不一致。

这个问题不只是侧边栏归组显示错误:Bash、文件工具、Skills/MCP workspace 资源等可能继续在旧项目 A 中运行,存在误操作旧工作空间文件的风险。

建议修复

  • 当前会话的持久化 cwd 变化且会话不在发送中时,同步更新 GUI runtime entry;
  • GUI 解析 effectiveWorkdir 时优先使用 sidebarStore.peek(conversationId)?.cwd,再回退到 runtime/global workdir,与 WebUI 保持一致;
  • 增加回归测试:当前打开的空闲会话 A → B 后不重新打开,下一轮工具 workdir 必须为 B,且本轮持久化后数据库 cwd 仍为 B;单条移动和批量包含当前会话都应覆盖。

当前 CI 8/8 全绿,现有定向测试也覆盖了乐观移动、失败回滚、运行中拦截和协议往返,但没有覆盖上述 SidebarStore → GUI runtime → 下一轮执行 → 历史持久化的跨层合同,因此绿灯暂时不能排除这个问题。修复并补充回归测试后再考虑合入。

移动成功后仅同步已存在且空闲的GUI runtime entry,单条与批量路径共用同一持久化确认合同。

发送下一轮时按显式覆盖、Sidebar持久化cwd、runtime cwd、全局cwd的顺序解析工作目录,避免旧runtime值撤销移动结果或让工具继续操作原工作空间。

新增单条、批量、失败项、发送中/运行中保护及下一轮目录优先级回归测试;GUI测试1516/1516、UI边界、定向Biome和生产构建均通过。
@devil233-ui

devil233-ui commented Aug 9, 2026

Copy link
Copy Markdown
Contributor Author

已修复,提交d2677de4

修复内容

  • GUI下一轮解析工作目录时,优先级调整为:显式override→SidebarStore持久化cwd→runtimeworkdir→全局目录,与WebUI保持一致。
  • 单条和批量移动仅在setCwd确认成功后通知GUI同步runtime。
  • 仅更新已存在且空闲的runtime entry;发送中、运行中、失败项或无runtime的会话不会被改写。
  • 后续conversationCwd来自新的effectiveWorkdir,历史持久化不会再把B覆盖回A。

复核补充

  • 当前桌面端和WebUI的移动入口均在会话行的“三个点”菜单中,并非右键菜单。
  • 桌面端直接把当前会话移出当前工作空间后,会立即离开该会话并进入新会话页。因此,“不重新打开会话,直接发送下一条消息”无法通过这条纯桌面操作路径完成。
  • 更稳定的复现方式有两种:1.全程Webui操作;2.桌面端停留在工作空间A的当前会话,由WebUI将同一会话移动到B,然后不刷新、不切换桌面端,直接发送下一条消息。该路径会保留桌面旧runtime,同时更新持久化cwd,能够准确覆盖本次问题。
  • 本次修复同时覆盖GUI移动成功后的runtime同步,以及WebUI/跨客户端移动后GUI发送前读取持久化cwd的场景。

回归测试

  • 已打开会话从A移动到B后,即使旧runtime仍为A,下一轮也使用持久化的B。
  • 覆盖单条移动及批量移动包含当前会话。
  • 覆盖失败项不触发runtime同步。
  • 覆盖发送中、运行中和缺失runtime的保护。
  • 显式workdir override仍保持最高优先级。

验证结果

  • 定向回归测试:6/6通过
  • GUI完整测试:1516/1516通过
  • GUI生产构建通过
  • 定向Biome、UI边界检查和git diff --check通过

@su-fen
su-fen merged commit c1bfe47 into Stack-Cairn:main Aug 9, 2026
8 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.

feat: move/reassign conversations between workspaces

2 participants