Skip to content

拆分 Electron 工作区目录选择与全局工作目录切换 #698

@Yumiue

Description

@Yumiue

目前场景

用户无法在app端便捷地添加自己想要的工作区,添加新工作区的体验不好

目标

引入了一个新的前端运行时方法 pickWorkspaceDirectory(),用于拆分 Electron 新建工作区弹窗里的“临时目录选择”和状态栏里的“全局工作目录选择”。

目标是让新建工作区弹窗只负责收集路径输入,不直接改变全局运行时状态。用户只有点击“创建”后,才通过现有 Gateway 工作区 API 注册并切换工作区。

改动范围

  • web/src/context/RuntimeProvider.tsx

    • 新增 pickWorkspaceDirectory(): Promise<string | null> 到运行时上下文。
    • Electron 模式下调用 window.electronAPI.pickDirectory()
    • 选择成功返回路径;取消、异常、浏览器模式返回 null
    • 不修改 workdir,不调用 selectWorkdir()
  • web/src/components/layout/Sidebar.tsx

    • 新建工作区弹窗改用 runtime.pickWorkspaceDirectory
    • onPickDirectory 返回值改为 string | null
    • “浏览”按钮设置为 type="button"
    • 选择成功只更新弹窗本地 path,取消不修改输入框。
  • web/src/components/layout/Sidebar.test.tsx

    • 扩展 Runtime mock,覆盖 pickWorkspaceDirectory
    • 增加浏览器模式不显示“浏览”按钮测试。
    • 增加 Electron 选择目录、取消目录选择、提交创建工作区测试。
  • web/src/context/RuntimeProvider.lifecycle.test.tsx

    • 增加浏览器模式 pickWorkspaceDirectory() 返回 null 的测试。
    • 增加 Electron 选择目录返回路径且不调用 selectWorkdir() 的测试。
    • 增加 Electron 取消选择返回 null 且不修改全局 workdir 的测试。

实现设计

  • selectWorkdir() 继续保留给状态栏旧入口使用。
  • pickWorkspaceDirectory() 作为新建工作区弹窗专用的无副作用目录选择入口。
  • Electron preload API 不变,继续使用已有 window.electronAPI.pickDirectory()
  • Gateway、Runtime、Tools、Session 后端链路不改。
  • 工作区创建仍由 useWorkspaceStore.createWorkspace() 触发现有 gateway.createWorkspacegateway.switchWorkspace

验收标准

  • 浏览器模式新建工作区只展示路径输入,不展示“浏览”按钮。
  • Electron 模式点击“浏览”后选择目录,输入框填入所选路径,弹窗保持打开。
  • Electron 模式点击“浏览”后取消,输入框保持原值,弹窗保持打开。
  • 新建工作区弹窗不会调用 selectWorkdir()
  • pickWorkspaceDirectory() 不修改全局 workdir
  • 点击“创建”后才调用工作区创建逻辑并关闭弹窗。

测试验证

已验证或需在合入前确认:

  • npm test -- RuntimeProvider.lifecycle.test.tsx Sidebar.test.tsx
  • npm test
  • npm run verify:electron-preload
  • npm run build

风险与回滚

风险:

  • 新增运行时上下文字段后,遗漏 mock 会导致测试失败。
  • 后续开发可能再次混用 selectWorkdir()pickWorkspaceDirectory()

回滚:

  • 回滚 RuntimeProvider 新增方法。
  • 将 Sidebar 新建工作区弹窗恢复为仅手动输入或原调用方式。
  • 不涉及后端数据结构和 Gateway 协议迁移。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions