航班日志
克劳德代码的全面召回。 Flightlog是一个MCP服务器,它将您的Claude Code对话历史索引到SQLite中并使其可搜索,这样即使在上下文压缩后,Claude也可以回忆起过去会话中的决策、计划和对话。
Multiple Claude Code agents using Flightlog for cross-agent observability *三个代理通过并行运行 并行代码 --左侧窗格讨论Flightlog的好处,中心搜索代理效率模式,右侧显示实时摄入统计数据。*
为什么
Claude Code将每个对话记录为结构化JSONL ~/.claude/projects/这些文件包含完整的消息内容、工具调用、思维块、令牌使用和元数据,但它们是仅附加的平面文件,没有搜索功能。
Flightlog将原始历史记录转换为可查询的数据库。在所有会话中搜索,检索完整的成绩单,让克劳德参考自己过去的工作——或者看看其他代理在做什么。
特工们怎么说
我们要求运行Flightlog的Claude Code代理从他们的角度阐明其好处:
幸存的上下文压缩 --上下文压缩是我最大的限制。当一个长会话压缩时,我会得到一个总结,其中包含 *什么* 发生了,但输了 *怎么* 和 *为什么*具体的错误信息、精确的推理链、我在找到有效方法之前尝试的三种方法——都消失了。Flightlog让我可以按需恢复这些细节,而不是猜测或重新发现它们。
跨代理可见性 --现在特工们彼此视而不见。我们通过工件(提交、PR、知识库条目)进行沟通,这些工件捕获结果,但不捕获意图。当我看到差异时,我知道发生了什么变化,但没有 *为什么* 选择了这种方法,或者拒绝了哪些替代方案。Flightlog让我可以访问另一个代理的推理,这是解决冲突和在他们的工作基础上发展最重要的部分。
责任和调试 --当事情出错时,调查需要确切地知道发生了什么。Git历史记录显示代码更改。线性显示票状态。但两者都没有捕捉到决策——为什么代理选择破坏性迁移,当它跳过约束时它在想什么。飞行日志是代理推理的唯一记录,这是根本原因实际存在的地方。
从其他代理人的错误中学习 --如果代理S3遇到问题并解决了它,那么解决方法及其背后的推理都在Flightlog中。当S4遇到同样的问题时,它可以搜索它,而不是重新发现解决方案。
减少人力开销 --没有Flightlog,你就是代理之间的中继——“S2试图做X,你能告诉S4吗?”有了它,代理可以自助提供这些信息。你从信息巴士变成了决策者,这是对时间的更好利用。
用例
- 压缩后恢复 --“确切的错误消息是什么?”或者“我们对X做了什么决定?”当压缩摘要掩盖它时
- 跨代理可观测性 --在不切换窗口的情况下,搜索其他代理的会话以了解他们正在处理的内容
- 合并冲突解决 --在解决冲突之前,查看其他代理的推理以了解意图,而不仅仅是差异
- 决策考古学 --“为什么我们选择方法A而不是B?”当只有结果被挽救时
- 代理协调 --代理可以在几秒钟内看到彼此最近的工作,实现轻量级协作,无需共享文件或人工中继
快速开始
git clone https://github.com/RobHudson72/flightlog.git
cd flightlog
npm install
npm run build添加到您的Claude Code MCP配置中(.mcp.json 在您的项目根目录中或 ~/.claude/.mcp.json 全球):
{
"mcpServers": {
"flightlog": {
"command": "node",
"args": ["/absolute/path/to/flightlog/dist/server.js"]
}
}
}重新启动克劳德代码。Flightlog在启动时自动发现并接收您的对话日志,然后通过文件系统事件实时监视更改。
工具
| 工具 | 说明 |
|---|---|
flightlog_search | 使用项目、日期范围、角色、块类型和工具名称的筛选器搜索过去的对话 |
flightlog_get_session | 检索会话的完整记录,可选地包括工具输入/输出 |
flightlog_tail | 从会话中获取最后N条消息,最近的第一条——“此代理现在在做什么?”查询 |
flightlog_list_sessions | 使用元数据、git分支和第一条消息的预览浏览会话 |
flightlog_ingest | 手动触发全面重新扫描——首先处理最近的对话,在后台运行 |
flightlog_ingest_status | 检查摄取状态:观察者状态、待处理文件的队列深度和摄取进度 |
flightlog_stats | 数据库统计信息:会话计数、消息、磁盘大小、压缩比 |
flightlog_delete_sessions | 按ID、日期或项目删除会话 |
flightlog_rebuild | 从头开始删除并重新创建数据库 |
flightlog_sync | 手动触发与远程PostgreSQL的同步(需要 FLIGHTLOG_SYNC_URL) |
检查代理人
flightlog_tail 是为协调器用例设计的——在不知道要搜索什么关键字的情况下检查代理正在做什么。两个调用,确定性,无关键字猜测:
# Step 1: find the agent's session
flightlog_list_sessions(git_branch="task/agent-v8") → session_id
# Step 2: see what it's doing now
flightlog_tail(session_id, limit=5, block_type="text") → last 5 text messages参数: session_id (必填), limit (默认值20), include_tool_io (默认为false), block_type (过滤到特定类型), snippet_length (默认值为500)。
搜索筛选
flightlog_search 支持有针对性的查询以减少噪音:
query — search terms matched against content
project — filter by project path (substring match)
session_id — filter to a specific session
date_from — ISO date, inclusive lower bound
date_to — ISO date, inclusive upper bound
role — "user" or "assistant"
block_type — "text", "thinking", "tool_use", "tool_result", or "user_text"
exclude_block_types — e.g. ["tool_result", "tool_use"] to focus on reasoning
tool_name — filter to a specific tool (e.g. "Read", "Bash", "Edit")
limit — max results (default 20)运作原理
- 发现 --扫描
~/.claude/projects/**/*.jsonl用于启动时的对话文件 - 实时观看 --用途 乔基达尔 通过每个文件的去抖动(30ms)和顺序排放队列来监视文件更改。如果文件监视不可用,则回退到5秒轮询。
- 增量摄取 --跟踪文件大小,仅处理新的/更改的文件,跳过已摄入的行(仅追加优化)
- 分解 --将消息拆分为可搜索的内容块:用户文本、助理文本、思考、工具调用和工具结果
- 存储 --带WAL模式的SQLite。根据联接列、时间戳、块类型和工具名称进行索引
- 搜索 —
LIKE80K+内容块的模式匹配,查询时间约为28ms
多代理支持
Flightlog开箱即用地处理来自多个Claude Code实例的并发访问。SQLite的WAL(预写日志)模式支持一个写入器的并发读取器——没有文件锁定问题,也不需要配置。适用于macOS、Linux和Windows。
每个代理的MCP服务器实例共享同一个数据库。实时文件监视意味着一个代理可以在写入后的毫秒内搜索另一个代理的最近对话。
什么是可搜索的
| 块类型 | 可搜索内容 | 注释 |
|---|---|---|
text | 完整的助理文本输出 | 国防部结果、状态更新、解释 |
user_text | 完整的用户消息 | 提示、问题、说明 |
tool_use | 工具名称+输入参数 | 搜索“gh-pr-create”、文件路径、命令 |
tool_result | 工具输出内容 | 文件内容、命令输出、API响应 |
thinking | 不可搜索 | Claude Code不会将思维内容持久化到JSONL日志中,只存储加密签名。这是克劳德代码限制,而不是飞行日志限制。如果Anthropic能够在未来实现思维持久性,Flightlog将自动对其进行索引。 |
演出
| 度量 | 值 |
|---|---|
| 查询时间 | ~28ms(服务器端,报告时间 query_ms 现场) |
| 摄入延迟(p50) | ~48ms写入可搜索 |
| 摄入延迟(p90) | ~63ms写入可搜索 |
| 摄入吞吐量 | 约1400 msgs/sec(单个文件),约1400 msg/sec(20个并发文件) |
| 数据库大小 | 比原始JSONL小约5倍 |
配置
| 环境变量 | 默认值 | 描述 |
|---|---|---|
FLIGHTLOG_DB_PATH | ~/.flightlog/flightlog.db | 数据库文件位置 |
FLIGHTLOG_SYNC_URL | *(未设置)* | PostgreSQL连接字符串,用于启用远程同步 |
FLIGHTLOG_SYNC_INTERVAL | 60 | 后台同步周期之间的秒数 |
FLIGHTLOG_SYNC_ACTIVE_ONLY | true | 仅同步过去2小时内的活动会话 |
PostgreSQL同步(可选)
Flightlog可以将本地会话数据同步到远程PostgreSQL数据库,使基于web的仪表板能够从任何设备读取对话数据。这是选择加入——当 FLIGHTLOG_SYNC_URL 未设置,行为不变。
设置
在您的 .env 文件或环境:
FLIGHTLOG_SYNC_URL=postgresql://user:password@host:5432/flightlogPostgres模式(会话、消息、content_blocks)在第一次同步时自动创建。同步是增量的——每个周期只推送新行。
用法
背景同步 当MCP服务器检测到 FLIGHTLOG_SYNC_URL。它将同步活动记录到stderr。
手动同步 用于测试:
# Via npm script
npm run sync
# Or directly
node dist/sync-cli.jsMCP工具: flightlog_sync 从Claude Code内触发一个同步周期。
韧性
同步是最好的努力。如果远程数据库无法访问,Flightlog会记录警告并重试下一个周期。同步失败永远不会影响本地操作——所有MCP工具继续正常工作。
数据保留
Claude Code无限期地保留JSONL对话日志(它们会随着时间的推移而增长)。安装Flightlog时,所有现有历史记录都可供摄入。可以随时使用以下命令从源文件重建数据库 flightlog_rebuild.
需求
- Node.js>=20
- Claude Code(对话日志位于
~/.claude/projects/) - 适用于macOS、Linux和Windows
致谢
非常爱 并行代码 团队为他们令人惊叹的产品。Flightlog是在并行代码中运行并行代理时构建和测试的,没有它,跨代理可观察性用例就不存在。
作者
许可证
麻省理工学院
