3 个核心模块与 2 个 API:OpenCode 状态保存与恢复完整拆解
【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencode
写代码写到一半被打断,进度不想丢——OpenCode 的数据持久化就是为这类场景设计的:它靠自动快照持续记录项目状态,并配合会话存储,让你随时把代码和会话恢复到之前的任意版本。
动手之前:存储、快照、会话三块各管什么
OpenCode 把"状态保存"这件事拆给了三个模块,各管一段,理解分工后后面所有操作都能对号入座:
- Storage(
packages/opencode/src/storage/storage.ts):最底层的读写层。所有会话、消息、摘要等数据都以 JSON 文件形式落在统一的数据目录下,读、写、更新、删除都带锁保护,避免并发写坏文件。 - Snapshot(
packages/opencode/src/snapshot/index.ts):负责项目文件层面的状态保存。它基于 git 实现,把每次跟踪到的文件变更记成一个快照,并负责按快照恢复、对比差异、回退补丁。 - Session(
packages/opencode/src/session/):负责会话层面的记录,包括对话消息、工具调用结果以及每次回滚时对应的快照 ID。会话与消息文件同样经由 Storage 落盘。
一句话概括这条链路:会话记录"你和 AI 聊了什么",快照记录"项目文件长什么样",Storage 负责把它们都存下来。
自动快照如何记录每次代码变更
你不需要手动调用任何保存命令。在会话执行过程中,系统会在后台自动触发快照跟踪,核心就一行:
const hash = await Snapshot.track()track()执行后会返回一个 hash(没有可记录的变化时返回 undefined),这个 hash 就是后续恢复状态的"取件码"。快照并不是把整个目录复制一份,而是复用 git 的机制在独立的数据目录里记录变更,所以开销很小。
两个容易忽略的细节:
- 快照目录与具体项目绑定(按项目 ID 和工作区路径隔离),多项目互不干扰,切换项目时各自的状态各走各的账本。
- 系统内置了自动清理:清理任务每小时执行一次,超过 7 天的快照会被自动清理,磁盘占用不会无限增长。
🧩 用快照 ID 回退到某个项目状态
拿到 hash 之后,把项目回退到当时的状态也是一次调用:
await Snapshot.restore(hash)恢复之前如果想先确认"当时和现在差在哪",还有两个配套能力:diff输出某快照与当前状态之间的差异文本,diffFull则给出两个快照之间逐文件的变更列表(含每个文件的增删行数)。如果你只想撤销某一段 AI 产生的改动而不是回到某个完整快照,revert可以按补丁列表逆向回退。
实际使用中的建议是:对结果不满意时,先 diff 看一眼范围,再决定是整包 restore 还是局部 revert,避免把无关的手动修改一起冲掉。
中断或换设备后,如何接着上次的会话继续
会话侧的状态由 Session 模块维护:每个会话、每条消息、每个消息片段都是独立的数据文件,经由 Storage 写入全局数据目录,而不是散落在各个项目里。这带来两个直接的好处:
- 中断恢复:临时关掉终端,再次打开时历史会话都在,打开对应会话即可从上次的位置继续,消息和上下文不会丢。
- 多项目切换:不同项目的会话按项目隔离存放,来回切换时各自的历史互不串味。
- 跨设备场景:由于数据集中在统一数据目录,把该目录随环境一起迁移(或在新机器上恢复同一份数据),会话历史就能跟着你走。
会话列表界面展示了各项目下的历史会话,点进任意一条即可继续。
存储结构升级时,数据迁移如何自动完成
工具升级后内部数据结构可能会变,旧数据不能因此作废。Storage 内置了一套顺序执行的迁移机制:
- 启动时读取数据目录下的迁移标记文件,确认当前已完成到第几步;
- 从标记位置开始,按顺序跑剩下的迁移步骤,每完成一步就把标记号加一;
- 任一步失败会记日志并停止,下次启动从失败点继续。
以仓库里实际存在的迁移为例:早期版本中会话、消息、片段是散在各项目目录下的,迁移步骤会把它们归并到统一的数据目录结构,同时根据消息里的项目信息重建项目记录。对使用者来说这个过程全自动,升级后直接可用,无需手工搬文件。
配置调优与恢复失败时的排查 🧭
如果自动快照不符合预期,可以先检查项目配置里的快照开关:
cfg.snapshot = true几个实用的调优与自查习惯:
- 过期会话数据可以定期清理,快照侧已有 7 天自动清理,会话侧建议手动删除确认不再需要的旧会话。
- 快照频率由系统按执行流程自动管理,一般不需要、也不建议手动改到更激进。
- 存储路径默认指向全局数据目录,如需调整存储位置,改的是数据目录而不是项目内配置。
遇到"恢复不了状态"这类问题时,按三步排查效率最高:先检查数据目录的读写权限是否完整;再确认项目配置完整、能正常加载;最后看运行日志——存储层和快照层在迁移失败、恢复失败时都会输出带上下文的错误日志,基本能直接定位到是哪一步出了问题。
下一步可以直接试试:在当前项目里跑一轮修改,记下自动快照生成的 hash,再用 diff 对比当前状态,体会一下"先看清差异、再决定恢复"的节奏。
【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencode
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考