
3 个核心模块与 2 个 APIOpenCode 状态保存与恢复完整拆解【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencode写代码写到一半被打断进度不想丢——OpenCode 的数据持久化就是为这类场景设计的它靠自动快照持续记录项目状态并配合会话存储让你随时把代码和会话恢复到之前的任意版本。动手之前存储、快照、会话三块各管什么OpenCode 把状态保存这件事拆给了三个模块各管一段理解分工后后面所有操作都能对号入座Storagepackages/opencode/src/storage/storage.ts最底层的读写层。所有会话、消息、摘要等数据都以 JSON 文件形式落在统一的数据目录下读、写、更新、删除都带锁保护避免并发写坏文件。Snapshotpackages/opencode/src/snapshot/index.ts负责项目文件层面的状态保存。它基于 git 实现把每次跟踪到的文件变更记成一个快照并负责按快照恢复、对比差异、回退补丁。Sessionpackages/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),仅供参考