Skip to content

Refactor: 彻底重做 /cwd 工作区切换机制 (Cross-workspace Bundle Rebuild) #214

Description

@pionxe

Description:

当前 /cwd 工作区切换采用的是“在同一个 runtime 内热切换 activeWorkspaceRoot”的方案。该方案虽然能临时解决路径切换问题,但无法彻底同步重建工具、沙箱、session store 作用域和 runtime 的底层状态。

为了保证工作区之间的绝对隔离和状态一致性,本 Issue 提出对 /cwd 机制进行彻底重构。核心思路是将切换分为“同工作区”和“跨工作区”两套独立逻辑。跨工作区时,将直接在进程内重新 bootstrap 整套 Runtime Bundle。

Proposed Changes:

  • 统一解析层 (internal/workspace): 新增独立的解析模块,统一负责路径的规范化和 workspaceRoot 的获取(严格优先取 Git 根目录,非 Git 仓库则取目标目录本身),废弃以往零散的判定逻辑。
  • 单工作区 Runtime: 改造 Runtime 为“单实例绑定单工作区”。初始化时显式注入 workspaceRootworkdir 和单一的 session.Store,移除内部所有动态切换工作区的状态和兼容 API。
  • 构建 Workspace Bundle:app/bootstrap 阶段显式构建整套工作区依赖。工具注册与沙箱边界将严格以 workspaceRoot 为根,不再受当前执行目录影响。
  • TUI 交互与状态管理重构: * 同工作区切换: 仅调用 runtime 的新接口更新 session 的 Workdir,保留历史消息与上下文。
    • 跨工作区切换: 调用注入的 RebuildWorkspace 工厂函数重新构建依赖(ConfigManager, Runtime 等),原地换绑后,强制重置界面至干净的 Draft 状态。
    • 并发保护: 拦截处于 IsAgentRunningIsCompacting 状态下的跨区切换请求。

API & Interface Changes:

  • Remove: 删除 runtime.SwitchWorkspaceruntime.SetSessionWorkdir 及其底层关联的方法。
  • Add: 新增 runtime.UpdateSessionWorkdir(ctx, sessionID, requestedPath) 用于处理安全的同区更新。
  • Add: RuntimeBundle 补充 WorkspaceRootWorkdir 字段。
  • Add: 为 TUI 提供 RebuildWorkspace(ctx, requestedPath) 的跨区换绑接口。

Acceptance Criteria (Test Plan):

  • internal/workspace 能正确识别 Git 子目录并回溯至顶层仓库作为 workspaceRoot
  • Runtime 层的方法(如 ListSessions / LoadSession)变为纯粹的无副作用读取,只针对当前绑定的 Store。
  • 调用 UpdateSessionWorkdir 尝试越出当前 workspaceRoot 边界时,能被正确拦截并返回 Error。
  • 在 TUI 中触发跨区 /cwd 后,Session 列表、文件候选和活动状态能彻底刷新,不会受到上一个工作区的污染。
  • 在子目录启动应用时,安全沙箱与工具能自动以顶层 workspaceRoot 为边界成功挂载。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Fields

No fields configured for Feature.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions