sumeshi/agentlogparser-rs
GitHub: sumeshi/agentlogparser-rs
该库将 Claude Code 与 Codex CLI 等 AI agent 的本地日志和产物解析为统一的时间线数据,并支持序列化为 JSON、JSONL 或 CSV 格式。
Stars: 0 | Forks: 0
# agentlogparser-rs
`agentlogparser-rs` 是一个 Rust 库,用于将 AI agent 产物解析为统一的
timeline schema。它提供 Rust 和 Python API,并将结果
序列化为 JSON、JSONL 或 CSV。
解析器在读取源产物时不会对其进行修改。
## 支持的产物
### Claude Code
| Path | Parsed data |
|---|---|
| `.claude/history.jsonl` | Prompt 文本、内嵌 timestamp、工作目录、session ID 以及粘贴/图片引用 |
| `.claude/paste-cache/*` | 外部存储的文本粘贴 |
| `.claude/image-cache/*` | 外部存储的图片粘贴 |
| `.claude/file-history/*` | 编辑前的文件快照,按 session 和版本分组 |
传入 `.claude` 目录以解析并关联这些产物。history
文件、cache 路径或 file-history 路径也可以独立解析。
当仅提供
`history.jsonl` 时,无法解析外部 `contentHash` 引用。
`.claude/projects` 下的 Claude Code 对话记录不会被解析。
### Codex CLI
| Path | Parsed data |
|---|---|
| `.codex/history.jsonl` | Prompt 文本、session ID 和 Unix timestamp |
| `.codex/sessions/**/rollout-*.jsonl` | Session 元数据、消息、reasoning、tool 调用与结果、task 状态、token 使用情况、compaction 和错误 |
| `.codex/attachments/**` | 附件路径、文件系统 timestamp、大小、媒体类型和 SHA-256 |
传入 `.codex` 目录以解析所有支持的 Codex 产物。history
文件、sessions 目录、rollout 文件、attachments 目录或附件
文件也可以独立解析。
SQLite 数据库、身份验证数据、环境文件、配置、
shell 快照和内部 cache 不会被解析。
Codex history 和 rollout 文件中匹配的 prompt 记录将作为独立的
事件保留,因为它们是独立的源记录。
Provider 检测使用已注册的 adapter。显式的 provider 目录
优先于通用文件名,而特定于 provider 的目录布局
优先于通用的 history 布局。在匹配项具有同等特定性时,检测会
返回错误,而不是按注册
顺序选择 adapter。
## 快速转换
`examples/inspect_evidence.py` 解析受支持的产物并将
选定格式写入标准输出。它可以作为直接转换器使用:
```
python examples/inspect_evidence.py ~/.claude --format csv > timeline.csv
python examples/inspect_evidence.py ~/.codex --format jsonl > timeline.jsonl
python examples/inspect_evidence.py ~ --format json > all-agents.json
```
当用户配置目录包含已注册的 provider 目录时,所有
检测到的 provider 都会被解析到一个 timeline 中。该脚本还接受
单个受支持的文件和目录。
有用的选项包括:
```
--strict
--include-raw
--include-content
--follow-symlinks
--max-line-size BYTES
--max-content-size BYTES
```
在运行脚本之前必须安装 Python 扩展。在
源码检出目录中使用 `python -m pip install ./python`。
## Rust API
将该 crate 添加为依赖项:
```
[dependencies]
agentlogparser = { path = "../agentlogparser-rs" }
```
解析受支持的目录或文件:
```
use agentlogparser::{parse_path, ParserOptions};
fn main() -> Result<(), agentlogparser::Error> {
let report = parse_path(
r"C:\Users\alice\.codex",
&ParserOptions::default(),
)?;
println!("events: {}", report.events.len());
println!("diagnostics: {}", report.diagnostics.len());
Ok(())
}
```
`parse_path` 接受受支持的 provider 根目录以及上面列出的各个
产物路径。`parse_history` 接受包含
Claude Code history 记录的 `BufRead`。
`ParserOptions::default()` 使用以下设置:
| Option | Default | Effect |
|---|---:|---|
| `input_kind` | `Auto` | 从路径检测产物类型 |
| `mode` | `BestEffort` | 在发生可恢复的错误后继续并记录诊断信息 |
| `include_raw` | `false` | 不包含原始 JSON 记录 |
| `include_content` | `false` | 不包含文件内容或 Codex 工具参数/结果 |
| `follow_symlinks` | `false` | 不遵循符号链接 |
| `max_line_size` | 10 MiB | 保留的最大 JSONL 行大小;过大的行将被排空并跳过 |
| `max_content_size` | 50 MiB | 有资格包含内容的最大文件大小 |
`Strict` 模式在遇到 error 级别诊断时停止。大小
限制为 `0` 将禁用该限制。启用 `follow_symlinks` 可能会读取所提供证据根目录之外的
目标。
序列化内存中的已解析报告:
```
use agentlogparser::{write_csv, write_json, write_jsonl};
let mut json = Vec::new();
write_json(&report, &mut json, true)?;
let mut jsonl = Vec::new();
write_jsonl(&report.events, &mut jsonl)?;
let mut csv = Vec::new();
write_csv(&report.events, &mut csv, true, false)?;
# Ok::<(), agentlogparser::Error>(())
```
## Python API
通过 CPython 稳定 ABI 支持 Python 3.10 或更高版本。
从 PyPI 安装:
```
python -m pip install agentlogparser
```
从源码检出安装:
```
python -m pip install ./python
```
将产物解析为 Python 对象:
```
from agentlogparser import parse
report = parse(
r"C:\Users\alice\.claude",
mode="best_effort",
include_raw=False,
include_content=False,
follow_symlinks=False,
max_line_size=10 * 1024 * 1024,
max_content_size=50 * 1024 * 1024,
)
print(report["events"])
print(report["diagnostics"])
```
返回序列化数据而不创建输出文件:
```
from agentlogparser import to_csv, to_json, to_jsonl
csv_text = to_csv(r"C:\Users\alice\.codex")
json_text = to_json(r"C:\Users\alice\.codex")
jsonl_text = to_jsonl(r"C:\Users\alice\.codex")
```
将序列化数据写入文件:
```
from agentlogparser import convert
convert(
r"C:\Users\alice\.codex",
"timeline.jsonl",
format="jsonl",
)
```
`format` 接受 `json`、`jsonl` 或 `csv`。Python 函数接受
`str`、`pathlib.Path` 以及其他 `os.PathLike` 值。`parse`、`to_json`、
`to_jsonl`、`to_csv` 和 `convert` 会公开 `follow_symlinks`、
`max_line_size` 和 `max_content_size`。大小值为 `0` 将禁用相应的
限制。
## 输出 schema
所有受支持的 provider 使用相同的 `TimelineEvent` 字段和 CSV 列。
特定于 provider 的记录会映射到公共的 `provider`、`event_type`、
`source` 和 `artifact` 字段。
| Field | Description |
|---|---|
| `schema_version` | 输出 schema 版本 |
| `event_id` | 确定性的 SHA-256 事件标识符,由 provider 命名空间划分 |
| `sequence` | 确定性 timeline 排序后从零开始的位置 |
| `provider` | 生成该事件的解析器的标识符,或为 `unknown` |
| `source_file_sha256` | 完整源 JSONL 文件的 SHA-256(如果可用) |
| `timestamp` | UTC RFC 3339 timestamp 或 `null` |
| `timestamp_source` | `embedded`、`referenced_event`、`filesystem_modified` 或 `none` |
| `timestamp_raw` | 原始 timestamp 值(如果存在) |
| `event_type` | 规范化的事件类型 |
| `session_id` | 源 session 标识符(如果存在) |
| `working_directory` | 源工作目录(如果存在) |
| `message` | Prompt、消息、reasoning 文本、工具名称或可选的工具内容 |
| `source` | 产物种类、provider 原生记录类型、相对路径、行号和源标识符 |
| `artifact` | 引用状态、解析出的路径、版本、大小、SHA-256、媒体类型和可选内容 |
| `fs_times` | 可用的文件系统修改、访问和创建 timestamp |
| `warnings` | 特定于事件的警告 |
| `raw` | 启用 `include_raw` 时的原始 JSON 记录 |
规范化的事件类型有:
- `prompt_input`
- `paste_attachment`
- `image_attachment`
- `orphan_cache`
- `file_snapshot`
- `session_start`
- `developer_message`
- `agent_message`
- `agent_reasoning`
- `tool_call`
- `tool_result`
- `task_state`
- `token_usage`
- `context_compacted`
- `attachment`
- `error`
- `unknown`
### JSON
JSON 包含完整的 `ParseReport`:
```
{
"events": [],
"diagnostics": []
}
```
### JSONL
JSONL 每行包含一个紧凑的 `TimelineEvent`。诊断信息不会与
timeline 事件混在一起。`write_jsonl_diagnostics` 可以单独
序列化诊断信息。
### CSV
CSV 是带有 RFC 4180 标头的 UTF-8 编码。其列包括:
```
schema_version,event_id,sequence,provider,source_file_sha256,timestamp,timestamp_raw,timestamp_source,event_type,session_id,working_directory,message,artifact_kind,source_record_type,source_relative_path,source_line,source_id,reference_status,resolved_path,snapshot_version,size,sha256,media_type,content,content_encoding,fs_modified,fs_accessed,fs_created,warnings,raw
```
`include_message` 和 `include_content` 控制是否填充这些 CSV 单元格。
原始 JSON 仅在启用 `include_raw` 时填充。
CSV 中不包含诊断信息。
## Timestamp 处理
- 有效时使用内嵌的记录 timestamp。
- 被引用的 Claude 附件继承父事件的 timestamp,并使用
`timestamp_source = "referenced_event"`。
- 独立文件产物使用其文件系统的修改时间,并使用
`timestamp_source = "filesystem_modified"`。
- 缺失或无效的 timestamp 会产生 `timestamp = null`;解析器不会
替换为其他 timestamp。
- 相等的 timestamp 保持相等。`sequence` 提供确定性的排序。
文件系统 timestamp 可能会在收集或复制过程中发生变化。
## 内容与 hash
- 当源文件被完全读取时,源 JSONL 事件包含
`source_file_sha256`。
- 文件产物在 `artifact` 中包含大小和 SHA-256 值。
- Claude `contentHash` 值被视为不透明的 cache 标识符。
解析器会计算自己的 SHA-256 值。
- 当启用 `include_content` 时,UTF-8 内容将作为文本返回。二进制
内容会进行 Base64 编码,并标记为
`content_encoding = "base64"`。
- 仅当启用 `include_content` 时,才会包含 Codex 工具参数和结果。
工具名称在没有它的情况下依然可用。
- Claude file-history 标识符不包含原始文件路径。
解析器不会推断路径。
## 构建与测试
```
cargo fmt --check
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --all-features
cargo build --workspace --all-features --release
```
为本地开发构建 Python 扩展:
```
python -m pip install maturin
cd python
maturin develop --release
```
标签:AI智能体, PKI安全, Python, Rust, 可视化界面, 数据解析, 无后门, 日志解析, 网络流量审计, 证书伪造, 逆向工具, 通知系统