Claude Subconscious状态文件完全解读:conversations.json与session-*.json里有什么
【免费下载链接】claude-subconsciousGive Claude Code a subconscious项目地址: https://gitcode.com/GitHub_Trending/cl/claude-subconscious
Claude Subconscious 是一个为 Claude Code 提供"潜意识"的背景智能体插件:它在后台观看你的会话、读取代码、积累跨会话记忆,并在每次提示前"低语"回引导建议。这个插件把本地的会话状态保存在两个小文件里——conversations.json和session-*.json,它们就藏在项目的.letta/claude/目录中。本文带你完整读懂这两个文件里到底存了什么、由哪个脚本写入,以及它们如何配合让智能体实现跨会话记忆。
状态文件存放在哪里?
这两个文件属于持久化状态(Durable State),统一存放在当前项目目录下的.letta/claude/文件夹中。如果你设置了LETTA_HOME环境变量,路径会改为{LETTA_HOME}/.letta/claude/,方便把所有项目的状态集中到一处。
路径的生成逻辑见 getDurableStateDir:
项目目录/ └── .letta/ └── claude/ ├── conversations.json ← 会话 → 对话 的映射表(一个项目一个) └── session-{sessionId}.json ← 每个 Claude Code 会话一份同步状态需要注意的是:这里的.letta/claude/只是会话记账(把 Claude Code 会话映射到 Letta 对话),不是独立的智能体记忆。真正的长期记忆块存在 Letta 服务端,由 README 的 State Management 章节 明确说明。
conversations.json:会话到对话的映射表
conversations.json 是整个插件的"通讯录":它把每个 Claude Code 的session_id映射到对应的 LettaconversationId,并记录当时使用的agentId。
结构定义见 ConversationEntry 接口,一个典型内容长这样:
{ "abc123def456": { "conversationId": "conv-xxxxxxxx", "agentId": "agent-yyyyyyyy" }, "old789session": "conv-zzzzzzzz" }几个值得了解的行为:
- 首次会话:由 session_start.ts 调用 Letta API 创建新对话后写入映射;
- 老格式兼容:早期版本只存一个字符串(
"sessionId": "conv-xxx"),新版会检测并自动升级为带agentId的对象格式,见 getOrCreateConversation; - 智能体变更自愈:如果你换了
LETTA_AGENT_ID,插件发现映射里的agentId对不上,会自动清掉旧条目并创建新对话; - 只查不建:同步脚本在需要时也会用 lookupConversation 从该文件找回
conversationId,例如 sync_letta_memory.ts 中的兜底恢复。
session-*.json:每个会话的同步进度状态
session-{sessionId}.json是逐会话的同步游标,字段定义见 SyncState 接口:
{ "lastProcessedIndex": 12, "sessionId": "abc123def456", "conversationId": "conv-xxxxxxxx", "lastBlockValues": { "user_preferences": "用户偏好显式类型标注……", "pending_items": "Phase 1 测试完成……" }, "lastSeenMessageId": "msg-01J9K7..." }| 字段 | 作用 |
|---|---|
lastProcessedIndex | 记录会话记录(JSONL)已发送到后台智能体的位置,实现增量同步,不重复发送 |
conversationId | 缓存该会话对应的 Letta 对话,省去查映射表 |
lastBlockValues | 缓存上次同步时的记忆块内容,用于做差异对比(diff),只把变化的块注入上下文 |
lastSeenMessageId | 记住最后一次已展示的消息 ID,防止后台"低语"消息重复注入 |
该文件的读写由 loadSyncState 与 saveSyncState 完成;会话开始时由 saveSessionState 以lastProcessedIndex: -1初始化(代表"从头开始")。
一次完整的状态流转
🔄 三个钩子按顺序协作,把这两个文件串成闭环:
- SessionStart(session_start.ts):读
conversations.json查缓存 → 没有则创建新对话并写回 → 落盘新的session-{id}.json; - Stop(send_messages_to_letta.ts):每次 Claude Code 响应结束后,按
lastProcessedIndex截取增量记录,交给后台 SDK 工作进程,成功后更新状态文件; - UserPromptSubmit / PreToolUse(sync_letta_memory.ts、pretool_sync.ts):对比
lastBlockValues和lastSeenMessageId,只把新增/变化的记忆块与消息通过 stdout 注入给 Claude。
换句话说:conversations.json回答"这个会话属于哪段对话",session-*.json回答"这段对话同步到哪了"。两者都很小、纯 JSON,可以直接打开查看。
排查与清理建议
- 状态文件异常或缺失时,插件会回退到"从头开始"(
lastProcessedIndex: -1)或重新创建对话,不会阻塞使用; - 调试钩子行为请看临时日志目录
$TMPDIR/letta-claude-sync-$UID/,里面有session_start.log、send_messages.log等,命令见 README 的 Debugging 章节; - 想重置某个会话的记忆同步进度,只需让对应会话的
session-*.json与conversations.json中的条目重新生成即可——它们都只是本地缓存,真正的记忆在 Letta 服务端。
📌 理解这两个状态文件后,你基本就掌握了 Claude Subconscious 的记忆链路:本地文件负责"记账",Letta 智能体负责"记住",而钩子脚本负责把两者缝合在一起。
【免费下载链接】claude-subconsciousGive Claude Code a subconscious项目地址: https://gitcode.com/GitHub_Trending/cl/claude-subconscious
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考