工作区即 Cell
wescode 的核心隔离模型:1 workspace = 1 Cell。
核心理念
每个 VS Code workspace 是一个独立的 wesgine Cell 隔离域。
workspace 路径 → sha256(canonicalize(root))[:4] → "ws-a1b2c3d4"
切换 workspace = 换 Cell = 整个数据面一起换。
Cell ID 派生
CellID 由 workspace 路径确定性派生:
cellID := workspaceCellID(wsAbs) // → "ws-a1b2c3d4"
- 相同路径 → 相同 CellID → 相同数据
- 不同路径 → 不同 CellID → 物理隔离
- Multi-root workspace → hash(primary folder)
数据隔离
切换 workspace 时,以下数据全部切换:
| 数据 | 位置 | 隔离级别 |
|---|---|---|
| CKG 索引 | cells/ws-{hash}/index/ | per-Cell |
| Memory | cells/ws-{hash}/sessions.db | per-Cell |
| Skills | cells/ws-{hash}/skills/ | per-Cell |
| Knowledge | cells/ws-{hash}/knowledge/ | per-Cell |
| Plan | cells/ws-{hash}/.plans/ | per-Cell |
| Observe | cells/ws-{hash}/state.db | per-Cell |
跨 workspace 共享
以下数据跨所有 workspace 共享:
| 数据 | 位置 | 原因 |
|---|---|---|
| 登录 session | db/wescode_auth.db | 登录状态跟用户走 |
| Hypervisor 配置 | hypervisor.db | Cell 注册表 |
| 崩溃日志 | crashes/ | 进程级 |
Actor
wescode 的 actor 固定为 "local"(单用户场景)。
未来接入 weisyn SSO 后改为登录 uid。
INV-WS-05
Cell ID 在 Go 进程生命周期内不可变。
Go 进程不做 Cell 切换——切换由 TypeScript 层路由到不同进程实现。
无工作区场景
无工作区 = Config Mode:
- 无 Cell,无 Go 进程启动
- 只支持 auth/provider/settings RPC
- 前端 GateGuard 引导打开文件夹
Convention vs Correction
| 概念 | 持久化 | 作用域 |
|---|---|---|
| Convention | runtime probe-cache | 当前 workspace |
| Correction | L4 Memory | 跨 workspace |
Convention 是运行时探测(tab/space 等项目事实),不入 memory store。
Correction 是用户教给 Agent 的偏好,跨项目生效。
Boot 流程
eng, _ := engine.StartEngine(ctx, engine.Config{DataDir: dataDir})
cell, _ := eng.Hypervisor.Cells().GetOrCreate(ctx, wesgine.CellSpec{
ID: cellID, // "ws-a1b2c3d4"
Timezone: "Asia/Shanghai",
Locale: "zh-CN",
// ... specOverride 注入
})
记忆面影响
记忆物理落在当前 workspace 的 Cell 里:
- 切 workspace = 换 Cell = 整个记忆面一起换
- 空层显示
0(不是隐藏) consensus在单用户场景恒空——但芯片仍渲染
相关文档
- 多窗口架构 →
multi-window.md - 数据布局 →
data-layout.md - Device Agent →
device-agent.md