Context & State Management 模块对比分析
2026/4/27大约 4 分钟
Context & State Management 模块对比分析
1. 模块边界
这里把问题拆成两条链路:
- 上下文治理:会话过长时如何裁剪、压缩、总结并继续。
- 状态持久化:消息、session 状态、恢复信息存到哪里,如何重新读回来。
2. Claude Code:上下文治理优先的文件型持久化
2.1 关键源码路径
上下文治理
claude-code-rev/src/services/compact/compact.tsclaude-code-rev/src/services/compact/snipCompact.tsclaude-code-rev/src/services/compact/microCompact.tsclaude-code-rev/src/services/compact/autoCompact.tsclaude-code-rev/src/services/compact/reactiveCompact.tsclaude-code-rev/src/services/contextCollapse/index.ts
状态持久化
claude-code-rev/src/utils/sessionStorage.tsclaude-code-rev/src/utils/sessionRestore.tsclaude-code-rev/src/utils/sessionState.tsclaude-code-rev/src/utils/queryContext.ts
2.2 上下文治理方式
Claude Code 的重点不是“等超长了再做一次 summary”,而是把上下文治理做成多层策略:
snipCompact和microCompact优先处理旧的 tool result,尽量保留结构但减少 token 占用。contextCollapse负责把已完成的子对话或阶段性上下文折叠掉。autoCompact在接近阈值时主动摘要。reactiveCompact则是被错误路径触发的兜底恢复。
这意味着 Claude Code 的压缩不是单点动作,而是 query loop 的持续配套机制。
2.3 持久化方式
sessionStorage.ts负责 transcript 的 JSONL 落盘、读取、链路修复和兼容旧格式。- 它明确区分 transcript message 与 progress message,避免 UI 临时状态污染持久化链。
- 会话恢复依赖文件系统中的 transcript、session 路径和 compact boundary,而不是数据库式查询。
2.4 特点
- 文件型存储便于直接调试和离线检查。
- 但为了让文件 transcript 在复杂场景里仍可恢复,
sessionStorage.ts本身就很重,里面包含兼容旧格式、桥接链路、裁剪大文件等大量逻辑。
3. Opencode:数据库驱动的状态管理,压缩独立成模块
3.1 关键源码路径
上下文治理
opencode/packages/opencode/src/session/compaction.tsopencode/packages/opencode/src/session/summary.tsopencode/packages/opencode/src/session/message.tsopencode/packages/opencode/src/session/message-v2.ts
状态持久化
opencode/packages/opencode/src/session/status.tsopencode/packages/opencode/src/session/session.sql.tsopencode/packages/opencode/src/storage/storage.tsopencode/packages/opencode/src/storage/db.ts及相关 schema 文件
3.2 上下文治理方式
Opencode 把 compaction 做成独立模块,而不是嵌在主循环里:
SessionCompaction.isOverflow()根据模型上下文上限、reserved buffer 和当前 token 总量判断是否溢出。prune()会回溯旧工具输出,只保留最近一段受保护窗口,把更旧的 completed tool output 标记为已 compact。process()在 overflow 场景下寻找可 replay 的用户消息边界,然后用专门的 compaction agent 生成摘要消息,供后续继续会话。- 插件还能通过
experimental.session.compacting和experimental.chat.messages.transform修改 compaction 输入。
3.3 持久化方式
- Session、message、part、permission 等状态主要通过数据库和 schema 驱动。
storage/storage.ts体现的是一个带迁移能力的持久化层,不只是简单文件读写。SessionStatus用独立状态服务维护idle / busy / retry,并通过总线发布事件。
3.4 特点
- 数据库型持久化更适合做结构化查询、状态同步和多对象关联。
- 压缩逻辑与主循环解耦,便于替换或增强。
- 但要理解“会话为什么变成这样”,往往要同时看 session 表、message/part 状态和 compaction 生成的 summary。
4. 核心差异
| 维度 | Claude Code | Opencode |
|---|---|---|
| 压缩位置 | 深度嵌入 query loop | 独立 SessionCompaction 模块 |
| 压缩粒度 | 多层次:tool result、上下文折叠、自动摘要、异常恢复 | prune + summary + replay |
| 主要持久化介质 | transcript JSONL 与文件系统状态 | 数据库 + schema + storage 抽象 |
| 恢复思路 | 依赖 compact boundary 和 transcript 链 | 依赖 session/message/part 结构和 compaction summary |
| 状态可观察性 | 以 transcript 和内部状态为主 | SessionStatus 明确对外发布 busy/retry/idle |
5. 设计取舍
5.1 Claude Code 的取舍
- 更看重“超长对话仍然能继续跑”。
- 所以上下文治理被做成 layered compaction,并直接嵌进主循环。
- 代价是 session 存储和压缩逻辑都很复杂。
5.2 Opencode 的取舍
- 更看重“状态结构清晰、存储层可演进”。
- 所以把压缩、状态、存储拆开,用数据库承载对象关系。
- 代价是压缩与恢复路径需要跨更多模块理解。
6. 结论
Claude Code 的 Context/State 体系更像“为长对话生存而设计”的上下文治理系统;Opencode 更像“以 session 数据模型为中心”的状态系统,再在其上附加 compaction。前者长于细粒度上下文续航,后者长于结构化状态管理。