数据隔离模型
wesclaw 的数据隔离分为两层:引擎层的 Cell 物理隔离和应用层的 Actor 逻辑隔离。了解这个模型有助于理解你的数据如何被保护。
两层隔离架构
┌─────────────────────────────────────────┐
│ 应用层(wesclaw) │
│ Actor 逻辑隔离:用户身份 → 数据可见性 │
└────────────────────┬────────────────────┘
│
┌────────────────────▼────────────────────┐
│ 引擎层(wesgine) │
│ Cell 物理隔离:独立数据库、独立文件系统 │
└─────────────────────────────────────────┘
Cell 物理隔离(引擎层)
Cell 是 wesgine 引擎的最小隔离单元。每个 Cell 拥有:
| 资源 | 隔离方式 |
|---|---|
| 数据库 | 独立的 SQLite 文件(meta.db / sessions.db / state.db) |
| 记忆 | 物理存储在 Cell 目录下 |
| 知识库 | 独立的文件和索引 |
| 技能 | 独立的 Skill 包目录 |
| 工作区文件 | workspace/{actor}/ 按用户分区 |
Cell 之间没有数据面通信(AX-1 公理)。一个 Cell 的数据对另一个 Cell 在物理上不可及。
Actor 逻辑隔离(应用层)
在同一个 Cell 内,Actor(用户身份)决定数据的可见性:
- 记忆:私有层(about_me、agent_memory)只对归属 Actor 可见
- 会话:每个会话归属一个 Actor,其他 Actor 不可见
- 观测数据:Run 记录、Token 用量按 Actor 过滤
桌面个人版的简化模型
wesclaw 桌面版是 N=1 场景:
- 1 个 Cell:名为
"main"的唯一 Cell - 1 个 Actor:登录后为 weisyn uid,未登录时为
"local" - 所有数据对唯一用户完全透明
- 前端不感知 Cell 概念(PROD-1 决策)
多 Profile 时的数据分离
wesclaw 支持多 Profile(可选功能),每个 Profile 对应一个独立的 Cell:
引擎数据(per-Cell 物理隔离)
每个 Profile 的以下数据完全独立:
- 会话和对话历史
- 记忆(所有七层)
- 知识库
- 技能
- Provider 配置
- 观测数据(Token 用量、Run 记录)
应用数据(逻辑隔离)
应用层数据存储在共享的 wesclaw.db 中,通过 cell_id 列隔离:
tc_conversations(对话列表)tc_agents(Agent 配置)tc_skills(技能元数据)
跨 Profile 共享
以下数据跨 Profile 共享(有意设计):
- 登录凭证(
tc_session表):切换 Profile 不需要重新登录 - Hypervisor 配置(
hypervisor.db):Cell 注册表
切换账号的含义
当前桌面版中,切换账号 = Go 进程重启,不是在前端切换 Cell。这意味着:
- 切换是干净的——不存在旧账号的残留状态
- 所有引擎资源重新加载
- 安全性由进程级隔离保证
导出与迁移
Cell 的数据可以整体导出和导入:
- 导出:打包 Cell 目录下的所有数据库和文件为 tar.gz
- 导入:从 tar.gz 恢复完整的 Cell 数据
- 工作区文件默认包含在导出中(可通过
SkipWorkspace: true排除) .scratch/临时计算目录永不包含
安全边界
| 边界 | 执行位置 | 说明 |
|---|---|---|
| Cell 隔离 | 引擎层 | 物理文件系统隔离 |
| Actor 可见性 | 引擎层 | 记忆/会话/观测面的查询过滤 |
| 进程排他锁 | 引擎层 | 同一 Cell 同时只有一个写入者 |
| Token 鉴权 | 应用层 | Cell Token / Admin Token 控制访问 |
相关文档
- 记忆层模型 →
memory-layers.md - 安全与隐私 →
security-privacy.md - 多账号管理 →
multi-account.md - 数据备份 →
data-backup.md