发现 链接到标题

执行 openclaw doctor 时看到这样一行警告:

Found 127 orphan transcript files in ~/.openclaw/agents/main/sessions.
These .jsonl files are no longer referenced by sessions.json.

127 个文件——不是小数目。但它们是什么、从哪来、为什么成了孤儿?

排查:它们是什么 链接到标题

查看这些 .jsonl 文件的会话头发现,全部是定时任务(cron)的历史执行记录——Dreaming(记忆处理)、Wiki Compile(知识库编译)等系统级自动化任务,不是用户聊天对话。

年龄分布:大部分在 7~30 天之间,每日凌晨产生。

根因:两层存储不同步 链接到标题

OpenClaw 的会话存储一直是两层结构:

  1. sessions.json(索引)——记录 sessionKey 到 sessionId 的映射及元数据
  2. *.jsonl(数据)——完整的对话/任务执行原始记录

会话维护机制(cron.sessionRetention 默认 24h、session.maintenance.pruneAfter 默认 30d)会定期清理 sessions.json 中的过期条目。但清理索引时不会删对应的 .jsonl 文件,日积月累,文件成了孤儿。

检查结果:

sessions.json 条目:51 条
引用的 sessionId:56 个
活跃 .jsonl 文件:106 个
孤儿 .jsonl 文件:127 个(含 trajectory)

新产生的会话正常写入 .jsonl,但索引清理产生的孤儿文件越积越多。

官方文档怎么说 链接到标题

OpenClaw 官方文档明确说明会话存储使用两层:

  • Store: ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • Transcripts: ~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl

SQLite(state.db)仅存 cron 运行历史与插件安装元数据,不存会话数据。

社区反馈 链接到标题

这个问题在社区已有讨论:

影响评估 链接到标题

  • 孤儿文件均为 cron 任务会话,不会被重新加载到对话 prompt 中(#91868 的 token 浪费问题在 cron 场景不适用)
  • 不影响用户对话渠道的消息收发
  • 纯粹是磁盘空间占用问题

当前方案 链接到标题

OpenClaw 暂无内置的孤儿文件自动清理机制。社区已知但尚未修复。手动管理方式:

  1. 先用 openclaw doctor 检查孤儿文件数量
  2. 对比 sessions.json 中的 sessionId 与文件列表,确认孤儿范围
  3. 删除未引用的 .jsonl.trajectory.jsonl 文件

或定期运行清理脚本,删除超过 30 天且不在 sessions.json 中引用的 .jsonl 文件。

后记 链接到标题

这不是数据丢失——孤儿文件的数据已经被 sessions.json 解除引用,Agent 已无法读取这些历史记录。删除只是清理磁盘残留。期待官方后续版本能内置自动清理机制。