Description:
当前 /cwd 工作区切换采用的是“在同一个 runtime 内热切换 activeWorkspaceRoot”的方案。该方案虽然能临时解决路径切换问题,但无法彻底同步重建工具、沙箱、session store 作用域和 runtime 的底层状态。
为了保证工作区之间的绝对隔离和状态一致性,本 Issue 提出对 /cwd 机制进行彻底重构。核心思路是将切换分为“同工作区”和“跨工作区”两套独立逻辑。跨工作区时,将直接在进程内重新 bootstrap 整套 Runtime Bundle。
Proposed Changes:
- 统一解析层 (internal/workspace): 新增独立的解析模块,统一负责路径的规范化和
workspaceRoot 的获取(严格优先取 Git 根目录,非 Git 仓库则取目标目录本身),废弃以往零散的判定逻辑。
- 单工作区 Runtime: 改造 Runtime 为“单实例绑定单工作区”。初始化时显式注入
workspaceRoot、workdir 和单一的 session.Store,移除内部所有动态切换工作区的状态和兼容 API。
- 构建 Workspace Bundle: 在
app/bootstrap 阶段显式构建整套工作区依赖。工具注册与沙箱边界将严格以 workspaceRoot 为根,不再受当前执行目录影响。
- TUI 交互与状态管理重构: * 同工作区切换: 仅调用 runtime 的新接口更新 session 的
Workdir,保留历史消息与上下文。
- 跨工作区切换: 调用注入的
RebuildWorkspace 工厂函数重新构建依赖(ConfigManager, Runtime 等),原地换绑后,强制重置界面至干净的 Draft 状态。
- 并发保护: 拦截处于
IsAgentRunning 或 IsCompacting 状态下的跨区切换请求。
API & Interface Changes:
- Remove: 删除
runtime.SwitchWorkspace 和 runtime.SetSessionWorkdir 及其底层关联的方法。
- Add: 新增
runtime.UpdateSessionWorkdir(ctx, sessionID, requestedPath) 用于处理安全的同区更新。
- Add:
RuntimeBundle 补充 WorkspaceRoot 和 Workdir 字段。
- Add: 为 TUI 提供
RebuildWorkspace(ctx, requestedPath) 的跨区换绑接口。
Acceptance Criteria (Test Plan):
internal/workspace 能正确识别 Git 子目录并回溯至顶层仓库作为 workspaceRoot。
- Runtime 层的方法(如
ListSessions / LoadSession)变为纯粹的无副作用读取,只针对当前绑定的 Store。
- 调用
UpdateSessionWorkdir 尝试越出当前 workspaceRoot 边界时,能被正确拦截并返回 Error。
- 在 TUI 中触发跨区
/cwd 后,Session 列表、文件候选和活动状态能彻底刷新,不会受到上一个工作区的污染。
- 在子目录启动应用时,安全沙箱与工具能自动以顶层
workspaceRoot 为边界成功挂载。
Description:
当前
/cwd工作区切换采用的是“在同一个 runtime 内热切换activeWorkspaceRoot”的方案。该方案虽然能临时解决路径切换问题,但无法彻底同步重建工具、沙箱、session store 作用域和 runtime 的底层状态。为了保证工作区之间的绝对隔离和状态一致性,本 Issue 提出对
/cwd机制进行彻底重构。核心思路是将切换分为“同工作区”和“跨工作区”两套独立逻辑。跨工作区时,将直接在进程内重新 bootstrap 整套 Runtime Bundle。Proposed Changes:
workspaceRoot的获取(严格优先取 Git 根目录,非 Git 仓库则取目标目录本身),废弃以往零散的判定逻辑。workspaceRoot、workdir和单一的session.Store,移除内部所有动态切换工作区的状态和兼容 API。app/bootstrap阶段显式构建整套工作区依赖。工具注册与沙箱边界将严格以workspaceRoot为根,不再受当前执行目录影响。Workdir,保留历史消息与上下文。RebuildWorkspace工厂函数重新构建依赖(ConfigManager, Runtime 等),原地换绑后,强制重置界面至干净的 Draft 状态。IsAgentRunning或IsCompacting状态下的跨区切换请求。API & Interface Changes:
runtime.SwitchWorkspace和runtime.SetSessionWorkdir及其底层关联的方法。runtime.UpdateSessionWorkdir(ctx, sessionID, requestedPath)用于处理安全的同区更新。RuntimeBundle补充WorkspaceRoot和Workdir字段。RebuildWorkspace(ctx, requestedPath)的跨区换绑接口。Acceptance Criteria (Test Plan):
internal/workspace能正确识别 Git 子目录并回溯至顶层仓库作为workspaceRoot。ListSessions/LoadSession)变为纯粹的无副作用读取,只针对当前绑定的 Store。UpdateSessionWorkdir尝试越出当前workspaceRoot边界时,能被正确拦截并返回 Error。/cwd后,Session 列表、文件候选和活动状态能彻底刷新,不会受到上一个工作区的污染。workspaceRoot为边界成功挂载。