把 pi coding agent 的 JSONL 会话记录变成可读的对话时间线
一个基于 Tauri + React + Rust 的原生桌面工具:扫描目录 → 解析会话 → 结构化呈现
中文 · English
pi 会把每次会话完整记录到 ~/.pi/agent/sessions/ 下的 JSONL 文件里 —— 消息、思考过程、工具调用、工具输出、Token 用量、模型切换、分支与压缩。信息很全,但直接打开就是一堆 JSON。
Pi Session Viewer 把这些文件解析成结构化的聊天界面:谁说了什么、调用了哪个工具、参数是什么、返回了什么、花了多少 Token —— 一目了然。
全文搜索 —— 搜索所有消息正文,按角色筛选,命中高亮,点击跳转:
- 递归扫描任意目录下的
.jsonl会话文件(默认~/.pi/agent/sessions/) - 按项目目录自动分组,支持一键筛选
- 跨会话全文内容搜索(见下)
- 每条会话显示:消息数、工具调用数、文件大小、模型、错误标记
不只是搜标题 —— 搜索所有消息正文,并直接定位到命中的那一条。
| 语法 | 作用 | 示例 |
|---|---|---|
关键词 |
模糊匹配正文(大小写不敏感,支持中文) | 数据库连接池 |
"精确短语" |
必须逐字连续出现 | "connection pool" |
-词 |
排除包含该词的内容 | 泄漏 -日志 |
role:用户 |
按角色筛选 | role:助手 |
role:助手+思考 |
多角色(或关系) | role:user+thinking |
-role:结果 |
排除某角色 | pool -role:工具结果 |
角色名中英文皆可:user/用户、assistant/助手、thinking/思考、tool/工具调用、result/工具结果、event/事件。
(也接受简写 u a t r e。)
界面上还提供:
- 角色筛选面板 — 点击彩色标签即可「仅显示」或「排除」
- 命中数量统计 — 按角色分组显示各有多少条匹配
- 命中片段高亮 — 每条结果显示上下文 + 黄色高亮命中词
- 多次命中提示 — 显示该条内容中出现几次(如「5 处」)
- 按会话分组 — 同一会话的命中聚在一起,显示会话名与命中数
- 点击跳转 — 点任意结果直接跳到原消息,自动切换到所在分支并闪烁高亮
Ctrl/Cmd + K— 随时聚焦搜索框
搜索有 mtime 缓存:首次扫描索引全部会话,之后只重新解析被修改的文件(实测 93 个会话约 200–400ms)。
会话内查找(Ctrl/Cmd + F) —— 打开某个会话后,可只在该会话内查找:显示 当前/总数,命中处黄色高亮,上下按钮或 Enter / Shift+Enter 在命中之间跳转,F3 下一个,Esc 关闭。
| 内容 | 呈现方式 |
|---|---|
| 用户消息 | 绿色气泡,保留原始换行 |
| 助手回复 | 完整 Markdown 渲染(表格、列表、引用、链接) |
| 代码块 | 语法高亮(highlight.js,自动语言识别) |
| 思考过程 | 可折叠的 💭 思考块,默认折叠并显示摘要 |
| 工具调用 | 可展开卡片:命令 / 文件路径 / 参数一屏可见 |
| 工具输出 | 等宽代码块,超长自动截断并提供字符数提示 |
| 文件编辑 | 红绿 diff 视图,edit 的 oldText/newText 并排呈现 |
| 网页抓取 | 输出按 Markdown 渲染,而非原始字符串 |
- 每次回复的 Token 明细:输入 / 输出 / 缓存读 / 缓存写 / 总计 / 花费
- 会话累计统计条:用户轮次、助手回复、工具调用、思考块、总 Token、总花费
- 完整解析 pi 的
id/parentId树结构,默认跟随最新分支 - 多分支会话提供下拉切换(叶节点选择)
- 模型切换、思考等级、重命名、上下文压缩、分支摘要等以时间线事件呈现
- 隐藏的扩展消息(
display: false)自动跳过
- 完全本地:所有解析在 Rust 后端内存中完成,不联网、不上传
- 只读:绝不修改任何会话文件
- 单文件大小 / Token 上限保护,避免超大输出拖垮界面
前往 Releases 下载:
| 平台 | 文件 |
|---|---|
| Windows 10/11 x64 | Pi-Session-Viewer_x.y.z_x64-setup.exe(推荐)或 .msi |
| macOS (Apple Silicon) | Pi.Session.Viewer_x.y.z_aarch64.dmg |
| Linux x64 | .AppImage 或 .deb |
Windows 用户直接运行
setup.exe安装即可,无需任何运行时依赖(Tauri 使用系统自带 WebView2)。
- 启动应用,自动扫描
~/.pi/agent/sessions/ - 左侧点击任意会话 → 右侧显示结构化对话
- 点击「更改」可切换到其他目录(例如备份的会话归档)
- 点击工具卡片标题展开参数与输出
- 点击 💭 思考过程展开完整推理内容
自定义会话目录:设置环境变量 PI_SESSIONS_DIR 可覆盖默认路径。
- Node.js ≥ 18
- Rust ≥ 1.77
- 平台依赖见 Tauri prerequisites
- Linux:
libwebkit2gtk-4.1-dev、libgtk-3-dev、librsvg2-dev、patchelf
- Linux:
npm install
npm run tauri devnpm run tauri build产物在 src-tauri/target/release/bundle/。
需要 mingw-w64 与 nsis(sudo apt-get install mingw-w64 nsis):
rustup target add x86_64-pc-windows-gnu
npm run tauri build --target x86_64-pc-windows-gnu产物:src-tauri/target/x86_64-pc-windows-gnu/release/bundle/nsis/*-setup.exe。
Tauri 将交叉编译标记为实验性;正式发布由 release workflow 在 windows-latest 上原生构建。
npm run test # 前端:分支解析、渲染模型、格式化
cargo test --manifest-path src-tauri/Cargo.toml --lib # 后端:JSONL 解析、扫描、分组pi-session-viewer/
├── src/ # React 前端
│ ├── types.ts # 与 Rust 结构对应的类型
│ ├── sessionModel.ts # 分支重建 / 渲染模型 / 统计(含单元测试)
│ ├── api.ts # Tauri invoke 封装
│ ├── App.tsx # 布局、会话头、事件行
│ └── components/
│ ├── Sidebar.tsx # 项目分组、搜索、会话列表
│ ├── MessageView.tsx # 用户/助手/工具结果/思考块
│ ├── ToolCallView.tsx # 工具卡片、参数、diff、输出
│ └── Markdown.tsx # Markdown + 代码高亮
└── src-tauri/ # Rust 后端
├── src/session.rs # JSONL 解析、扫描、项目分组(含单元测试)
└── src/lib.rs # Tauri 命令注册
设计原则:Rust 负责快速扫描与容错解析,前端只接收结构化 JSON 并专注渲染。sessionModel.ts 中的分支重建逻辑与 Rust 解析器分别测试,互不依赖。
完整支持 pi session format v1/v2/v3:
- 条目类型:
session、message、model_change、thinking_level_change、compaction、branch_summary、custom、custom_message、session_info、label - 消息角色:
user、assistant、toolResult、custom、branchSummary、compactionSummary - 内容块:
text、thinking、toolCall、image
对损坏行容错:无法解析的行会被跳过并标记,不影响整个会话加载。
如果这个工具帮到了你,欢迎点个 ⭐


