会话持久化
DotCraft 把每段对话保存为线程,跨客户端、跨进程重启都能接着用。本页面向集成方和贡献者,说明存储权威、恢复路径和生命周期边界。
存储模型
| 数据 | 位置 | 作用 |
|---|---|---|
| 线程记录 | .craft/threads/active/ 或 .craft/threads/archived/ | 对话时间线和模型可见历史的权威来源 |
| 工作区状态 | .craft/state.db | 业务状态、运行连续性、诊断数据和查询投影 |
| 线程配套文件 | .craft/tool-results/、.craft/attachments/ 和 .craft/terminals/ | 线程引用的大型工具结果、附件内容和终端记录 |
线程记录同时包含客户端可见的 Thread → Turn → Item 历史,以及继续对话所需的精确模型历史。大型结果可以独立保存,线程记录中只保留有界预览和引用。
state.db 不能替代线程记录。DotCraft 可以从线程记录重建部分线程元数据和附件引用,但目标、计划、关系图、邮箱状态等业务数据无法全部恢复。丢失 state.db 属于部分数据丢失。
写入与恢复
每轮对话期间,DotCraft 会向线程记录追加内容,并更新相关工作区状态。恢复线程时,它会:
- 校验线程身份和来源。
- 重放仍然有效的线程记录。
- 恢复最新可用的上下文压缩检查点。
- 接上检查点之后仍然有效的轮次。
- 重建运行时会话。
格式异常但可以安全忽略的记录会被跳过。如果被拒绝的精确历史记录能关联到某个 Turn,DotCraft 会从该 Turn 仍然有效的 Session Item 重建它对模型可见历史的完整贡献,而不会把部分精确历史与回退结果混在一起。线程头或来源身份不安全、有冲突时,恢复直接失败,避免在错误身份下继续执行。
如果线程记录存在,但查询投影缺失或过期,文件优先的读取流程可以修复 state.db 中可重建的投影。修复不会覆盖无关的业务或诊断状态。
线程生命周期
| 操作 | 持久化结果 |
|---|---|
| 活跃 | 线程记录保留在 threads/active/,可以继续接收新轮次。 |
| 归档 | 阻止新 Turn,停止或失效活跃后台终端,并把线程记录移到 threads/archived/。对话历史继续保留。 |
| 恢复 | 线程记录回到活跃集合。只有父子 edge 仍为 open 的 subagent 后代会随之恢复。 |
| 删除 | 从持久化线程状态中永久移除该线程及其 subagent 后代。线程专属文件采用 best effort 清理,失败后可以重试。 |
归档不会取消已经在执行的主 Turn。它会阻止新 Turn,并停止或失效活跃后台终端。归档不等于删除:它会保留对话历史,也不会删除仍被有效线程记录引用的独立工具结果。
已完成和丢失的终端元数据与日志会在归档时保留,但仍受 Tools.Shell.Background.OutputRetentionDays 约束,默认保留 7 天。正在运行的终端不会被该过期清理删除。正常关闭进程只会停止终端,不会把线程视为已删除。
备份与恢复工作区
Git 克隆只包含已经跟踪的文件。自动生成的 .craft/.gitignore 会排除本地数据库和多个配套文件目录,因此单独使用 Git 并不是完整的会话备份。
如需保留完整本地状态,先停止该工作区的 AppServer,确保线程写入器和工作区状态已经落盘,再复制整个项目文件夹,包括 .craft/ 下隐藏的、被忽略的文件。线程记录保留工作区的绝对路径,因此受支持的会话恢复要求使用相同绝对路径。当前不支持在另一个路径打开副本来迁移会话。全局 Provider 凭据独立存储,可能需要重新配置。用户操作流程见快速开始。
支持的集成边界
线程 JSONL 是内部持久化格式,不是公开交换协议。集成使用以下接口之一:
- DotCraft 内部的
ISessionService - AppServer 协议
- 受支持的 SDK
dotcraft context search和dotcraft context export,用于只读交接
这样,集成不会依赖内部记录版本、上下文压缩细节和恢复行为。