工作区隔离
wescode 的数据隔离模型:1 个工作区 = 1 个 Cell。每个 VS Code 工作区拥有独立的 CKG 索引、记忆、技能、知识库——切换工作区就是切换完整的 AI 上下文。
为什么工作区是天然的隔离边界
VS Code 的每个窗口绑定一个工作区(文件夹或 .code-workspace)。开发者在不同项目之间切换时,期望的就是"前端项目的 lint 规则不会影响后端项目"这种隔离。
wescode 将这种直觉延伸到 AI 能力:
| 数据 | 隔离级别 | 说明 |
|---|---|---|
| CKG 索引 | 物理隔离 | 每个工作区独立的代码知识图谱 |
| 知识库 | 物理隔离 | 每个工作区独立的文档索引 |
| 记忆 | 物理隔离 | 学到的偏好跟工作区走 |
| 技能 | 物理隔离 | 安装的技能跟工作区走 |
| 会话历史 | 物理隔离 | 对话记录跟工作区走 |
| CSE 约束 | 物理隔离 | 发现的约束跟工作区走 |
| 登录状态 | 共享 | 跨工作区复用同一个账号 |
Cell ID 映射
Cell ID 由工作区路径确定性派生:
/Users/you/projects/backend → ws-a1b2c3d4
/Users/you/projects/frontend → ws-e5f6g7h8
映射使用 sha256(canonicalize(root))[:4],保证:
- 同一路径始终得到同一 Cell ID(重启后数据不丢失)
- 不同路径不会冲突(物理隔离)
- 路径规范化(消除 symlink、trailing slash 等差异)
多窗口架构
VS Code 支持同时打开多个窗口。wescode 的架构:
Window A (frontend/) ──→ Go Process A (ws-e5f6g7h8)
Window B (backend/) ──→ Go Process B (ws-a1b2c3d4)
Window C (frontend/) ──→ Go Process A (共享,同一工作区)
关键规则:
- 1 工作区 = 1 Go 进程 = 1 Cell(
INV-WS-05) - 打开相同工作区的多个窗口共享同一个 Go 进程
- 同一时刻最多一个 Chat Run(第二个窗口的请求会被拒绝)
- Go 进程内不做 Cell 切换——切换由 TypeScript 层路由到不同进程
无工作区 = 无 AI
如果你没有打开文件夹(直接打开单个文件),wescode 进入 Config Mode:
- 无 Cell 创建、无 Go 进程启动
- 只支持认证 / Provider / 设置等配置操作
- Chat 和所有 AI 功能不可用
- 前端显示引导——"请先打开一个项目文件夹"
这是有意为之:AI 编程需要项目上下文,没有工作区就没有有意义的上下文。
数据目录
所有数据在一个根目录下:
~/Library/Application Support/wescode/ # macOS
~/.local/share/wescode/ # Linux
├── hypervisor.db # Cell 注册表
├── cells/
│ ├── ws-a1b2c3d4/ # backend 工作区
│ │ ├── meta.db
│ │ ├── sessions.db # 会话与记忆
│ │ ├── state.db # 运行时状态
│ │ ├── index/ # CKG 索引
│ │ ├── knowledge/ # 知识库
│ │ └── skills/ # 安装的技能
│ └── ws-e5f6g7h8/ # frontend 工作区
│ └── ...
├── db/
│ └── wescode_auth.db # 登录状态(跨工作区共享)
└── logs/
└── wescode.log
切换的体验
切换工作区时,你会感受到:
- CKG 切换到目标项目的调用图(如果还没建好,会自动开始索引)
- 记忆切换到目标项目的偏好和修正历史
- 技能切换到目标项目安装的技能包
- 会话历史切换到目标项目的对话记录
这一切是自动的——你打开文件夹的那一刻就完成了。
下一步
- 快速开始 — 安装和首次使用
- 代码知识图谱(CKG) — 工作区级别的代码索引
- 跨会话记忆 — 工作区级别的学习能力