Code Reader
首页
帮助
设计文档
首页
帮助
设计文档
  • 对象关系图

对象关系图

本文档描述 OpenCode 核心对象之间的关系和交互流程。

核心关系图

详细关系说明

1. Project - Session 关系

关系类型: 一对多 (1:N)

说明:

  • 一个 Project 可以包含多个 Session
  • Session 通过 projectID 引用 Project
  • Session 的 directory 可以是 Project 的 worktree 或某个 sandbox

2. Session - Message 关系

关系类型: 一对多 (1:N)

说明:

  • 一个 Session 包含多条 Message
  • Message 通过 sessionID 引用 Session
  • Messages 按 id 排序(标识符包含时间戳)

3. Session - Session 关系(分支)

关系类型: 自引用 (0:1)

说明:

  • Session 可以是另一个 Session 的分支
  • parentID 指向父会话
  • 分支会话继承父会话的部分 Messages

4. Message - Part 关系

关系类型: 一对多 (1:N)

说明:

  • 一条 Message 包含多个 Part
  • Part 通过 messageID 引用 Message
  • Part 的 id 在 Message 内是唯一的

5. Message - Agent 关系

关系类型: 多对一 (N:1)

说明:

  • Message 通过 agent 字段引用 Agent
  • Agent 定义了消息的权限、模型和行为
  • primary Agent 由用户直接使用,subagent Agent 由其他 Agent 调用

6. Config - 核心对象关系

说明:

  • Config 是单例,在项目初始化加载
  • 支持多层配置(远程、全局、项目、命令行)
  • 配置合并规则:数组字段去重,对象字段深度合并

7. Permission - Agent 关系

说明:

  • 每个 Agent 有自己的权限规则集
  • 权限规则按优先级:默认 < Agent 特定 < 用户配置
  • 权限在工具调用前检查

8. MCP - Tool 关系

说明:

  • MCP 服务器可以提供多个工具
  • 工具通过 MCP 协议调用
  • OpenCode 自动将 MCP 工具转换为内部 Tool 格式

交互流程

完整对话流程

使用工具

会话分支

数据流图

生命周期图

Session 生命周期

Message 生命周期

ToolPart 生命周期

关系约束

唯一性约束

约束说明
Session.id全局唯一
Message.idSession 内唯一
Part.idMessage 内唯一
Project.id全局唯一(基于 Git root)

引用完整性

引用必须存在约束描述
Message.sessionIDSession 必须存在约束到有效会话
Part.messageIDMessage 必须存在约束到有效消息
Session.projectIDProject 必须存在约束到有效项目
Session.parentIDParent 必须存在如果指定,父会话必须存在

级联删除

对象删除时级联删除
Session所有 Message 和 Part
Session所有子 Session
Message所有 Part
Project不删除(多 Session 可以引用同一 Project)

性能考虑

缓存策略

  1. Config 缓存: Config 单例,避免重复加载
  2. Agent 缓存: Agent 定义在运行时缓存
  3. Model 缓存: 模型列表从本地缓存或远程加载

批量操作

  1. 批量创建 Part: 使用 Promise.all 并行写入
  2. 批量读取 Message: 使用列表 API 批量获取
  3. 批量删除: 先删除子对象,再删除父对象

延迟加载

  1. Parts 延迟加载: Message 信息不包含 Parts,按需加载
  2. 快照内容: 快照内容仅在需要时读取
  3. MCP 工具: MCP 工具列表仅在连接后加载

安全考虑

访问控制

  1. 权限系统: 所有工具调用受权限控制
  2. 会话隔离: 不同 Session 使用不同沙箱(可选)
  3. 文件访问: 读写操作受权限规则检查

数据验证

  1. Zod Schema: 所有对象使用 Zod 验证
  2. 类型安全: TypeScript 提供编译时类型检查
  3. 输入清理: 用户输入在处理前验证

相关文档

  • Index - 主索引
  • Storage - 存储架构详情
  • Events - 事件系统详情