Codeg 会话解析器实现原理15 种 AI Agent 本地会话文件如何聚合为统一可搜索模型【免费下载链接】codegCollaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker.项目地址: https://gitcode.com/gh_mirrors/co/codeg如果你同时使用 Claude Code、Codex、OpenCode 等多个 AI 编程 Agent会话记录散落在各自工具的目录里格式互不兼容、无法统一搜索。Codeg是一个协作式多 Agent AI 编码工作区桌面应用 / 自托管服务 / Docker它的会话解析器Session Parser能反向解析 15 种 AI Agent 留在本地的原始会话文件——JSONL、SQLite、JSON 等——并聚合为统一的、可搜索的会话数据模型。本文用通俗的方式讲清楚这套解析器的实现原理几乎不需要你读代码。为什么需要会话解析器15 种文件格式的混乱现场 每个 AI Agent 都把历史会话写在自己家的目录里而且写法五花八门AI Agent会话存储形态默认位置Claude Code每会话一个 JSONL 文件~/.claude/projects/Codex CLIrollout-*.jsonl日志~/.codex/sessions/OpenCode单个 SQLite 数据库opencode.dbGemini CLIJSON 会话文件 .project_root~/.gemini/tmp/项目/chats/OpenClawAgent 目录~/.openclaw/agents/Clinesessions/目录 实时 SQLite 索引~/.cline/data/Hermes单个 SQLite 状态库~/.hermes/state.dbCodeBuddyJSONLOpenAI item 记录格式~/.codebuddy/projects/Kimi Code每会话一个目录 session_index.jsonl~/.kimi-code/sessions/Pi每会话一个 JSONL~/.pi/agent/sessions/Grok每会话一个目录~/.grok/sessions/Cursor每会话一个 SQLitestore.db~/.cursor/chats/md5/uuid/DeepSeek每会话目录 内容寻址附件库~/.dsh/sessions/Qoder每会话一个 JSONL~/.qoder/projects/AntigravitySQLite 轨迹 .meta伴随文件~/.gemini/antigravity-acp/conversations/要统一搜索所有 AI 会话等于要同时读懂这 15 套格式。Codeg 的解法是为每种 Agent 写一个专用解析器全部收敛到同一个 trait 和同一套数据模型。统一入口一个 trait 一个工厂函数整个解析器体系的核心只有两个小东西位于 parsers/mod.rsAgentParsertrait只有两个方法——list_conversations()列出所有会话摘要和get_conversation(id)读取某条会话的完整内容。任何 Agent 想接入 Codeg实现这两个方法即可。build_agent_parser()工厂函数parsers/mod.rs这是历史解析器唯一被构造的地方。按 Agent 类型分发到对应的解析器实现并额外包一层RouteSanitized把 Codeg 内部注入的agent路由标记从各家 Agent 的原始记录里干净剥离——无论哪个解析器都逃不过这道清洗。15 个内置 Agent 的类型定义在 models/agent.rs其中还预留了Custom变体用户自定义注册的 ACP Agent 没有本地格式可逆向直接复用 Codeg 自己的 ACP 转录parsers/acp_native.rs。从原始文件到统一模型解析器都产出什么所有解析器最终都吐出同一组 Rust 结构体这是聚合的关键——下游 UI 和搜索完全不关心原始文件长什么样ConversationSummary会话摘要标题、Agent 类型、工作目录、起止时间、消息数、模型、Git 分支……侧边栏列表就是由它驱动的。MessageTurn消息轮次统一的用户/助手回合模型文本、图片、工具调用都收敛为统一的ContentBlock并携带 token 用量TurnUsage。SessionStats会话统计聚合输入/输出/缓存 token 与总耗时供底部状态栏和 token 仪表盘使用。每个 Agent 解析器是独立模块一文件一 Agentclaude.rs、codex.rs、opencode.rs、cursor.rs、antigravity.rs 等全部在 src-tauri/src/parsers/ 目录下。几个典型的逆向工程细节Codex 解析器只认文件名以rollout-开头的 JSONL真实 Codex CLI 的命名惯例并从session_meta事件里恢复工作目录与 Git 分支可对照 tests/parsers_snapshot.rs 中的最小会话样例。Claude 解析器要用正则剔除 CLI 注入的system-reminder等内部 XML 标签过滤掉给模型看的记账记录只留下真正的对话claude.rs。SQLite 类 AgentOpenCode、Hermes、Cursor、Antigravity、Cline则用只读方式打开数据库读取绝不写库保证不影响 Agent 正常运行。路径解析尊重每个 Agent 的环境变量约定解析器定位会话目录时严格跟随各 Agent 自己的环境变量CLAUDE_CONFIG_DIR、CODEX_HOME、GEMINI_HOME、CURSOR_CONFIG_DIR、DSH_HOME等并对~前缀做了与各家 Agent逐一对齐的展开规则——有的 Agent 展开~有的按字面处理Codeg 的 expand_home_prefix 精确镜像了每个 Agent 的行为避免Codeg 指向了 Agent 根本没用的目录。这些路径还被同一张清单复用于备份external_transcript_sources()parsers/mod.rs用白名单精确圈定只归档会话数据绝不携带凭据——例如 Gemini 目录里混着oauth_creds.json白名单保证 API 密钥永远不会进备份包。这是读别人的数据时非常克制的一个设计。共享的后处理让 15 种格式产出一致的体验 ✨原始格式千差万别但展示体验必须一致靠的是一组共享工具函数标题生成title_from_user_text 先把你首条消息里的 Markdown 文件引用折叠成纯文本标签再截断到 100 字符保证任何 Agent 的会话标题都不会出现半截 file 用时间轴平铺策略推算不报告耗时的 Agent 的每轮耗时——一次回复若被拆成多个子轮次各轮耗时平铺分割整段时长而不是都从提问时刻重复计算否则一次 9 分钟的 Codex 回复会报出 49 分钟。统计聚合compute_session_stats 汇总 token 与时长某 Agent 不报告 token 时字段保持None而非显示 0——它没说和它说是免费的是两回事。上下文窗口推断按模型名推断窗口上限Claude 默认 200K、1m后缀识别 1M 通道、Gemini 1M 等让用户无需配置就能看到上下文占用百分比。聚合之后统一入库全量可搜索 解析只是第一步。导入流程以(external_id, agent_type)作为唯一身份把各 Agent 的会话登记进 Codeg 自己的本地数据库幂等重复导入只刷新标题、不产生重复行见 models/conversation.rs 的ImportResult。之后侧边栏按文件夹 → 会话聚合展示Search入口可对所有 Agent的会话统一检索会话按目录/Agent 分组统计SidebarData / AgentStats一眼看出哪个 Agent 产生了多少会话打开任意历史会话走的仍是同一个ConversationDetail结构和实时会话渲染路径共用一套 UI。质量保障快照测试锁住每一种格式 每种格式都是逆向出来的最怕的是某天 CLI 悄悄改了结构。Codeg 用快照测试snapshot test兜底tests/parsers_snapshot.rs 为 Claude、Codex、Gemini、Cline、Hermes、Kimi Code、OpenClaw、OpenCode 等构造最小化磁盘夹具跑一遍list_conversationsget_conversation再把 JSON 输出与 tests/snapshots/ 下已提交的.snap文件逐字节比对时间戳统一打码为[ts]。格式一旦漂移CI 立即报警。小结一张图看懂整套解析器各 Agent 本地文件JSONL / SQLite / JSON │ 15 个专用解析器一文件一 Agent ▼ AgentParser traitlist_conversations / get_conversation │ build_agent_parser 统一构造 RouteSanitized 清洗 ▼ 统一模型ConversationSummary → MessageTurn / SessionStats │ 以 (external_id, agent_type) 幂等入库 ▼ Codeg 本地库全 Agent 统一搜索、按文件夹/Agent 聚合统计核心设计思想只有一句话把读 15 种方言的复杂度全部封在解析器层向上只暴露一个 trait、一套数据模型聚合、搜索、统计、展示因此天然一致。延伸阅读解析器模块 src-tauri/src/parsers/、统一数据模型 src-tauri/src/models/conversation.rs、快照测试 src-tauri/tests/parsers_snapshot.rs。克隆仓库git clone https://gitcode.com/gh_mirrors/co/codeg后运行cargo test -p codeg-lib parsers_snapshot即可亲眼看到每种 Agent 的解析输出。【免费下载链接】codegCollaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or Docker.项目地址: https://gitcode.com/gh_mirrors/co/codeg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考