Pi 的会话记录存在哪
Pi 默认把会话放在 ~/.pi/agent/sessions/。一个会话一个 JSONL 文件,包含 session 头和消息/会话树条目:
<会话根目录>/--<编码过的项目路径>--/<时间戳>_<uuid>.jsonl真实路径长这样:
~/.pi/agent/sessions/--Users-me-apps-blog--/2026-08-23T09-49-28-819Z_01a02e06-6f73-7b54-8a4a-63e19fdca249.jsonl文件名以 ISO 8601 时间戳打头,所以直接 ls 出来就是按时间排好的。
会话根目录怎么定
Pi 的根目录有三个地方可以配,优先级从高到低:
PI_CODING_AGENT_SESSION_DIR环境变量(设了且非空)<agent 目录>/settings.json里的sessionDir- 默认值,
<agent 目录>/sessions
agent 目录本身由 PI_CODING_AGENT_DIR 指定,默认 ~/.pi/agent。所以什么都不配的话,会话就在 ~/.pi/agent/sessions。
一次性的 --session-dir 可能把记录写到 Sessions Viewer 扫描范围之外。文件可能存在,只是应用未发现;应对齐根目录配置,不要把“未显示”当作“已删除”。
项目目录名怎么来的
项目绝对路径把 / 换成 -,前后各裹一对 --:
/Users/me/apps/blog → --Users-me-apps-blog--目录名只是线索,不是可逆编码。适配器以文件首条 session 记录中的 cwd 确认项目。
agent 目录里还有什么
~/.pi/agent/
├── sessions/
├── extensions/ ← 生命周期扩展
├── settings.json
├── mcp.json
├── memory/
├── models-store.json
└── auth.json ← 凭据,别读这个查阅会话应读取会话文件,而不是凭据文件。Sessions Viewer 还会读 settings.json 来解析自定义根目录;工具管理是另一项功能。
在终端里读 Pi 会话
提取文件中存储的用户/助手文本,包含存储的分支,不限当前分支:
jq -r 'select(.type=="message") | .message
| select(.role=="user" or .role=="assistant") | .content
| if type=="string" then . else .[]? | select(.type=="text") | .text end' \
~/.pi/agent/sessions/--Users-me-apps-blog--/*.jsonl某个项目最近的一个会话:
ls -1 ~/.pi/agent/sessions/--Users-me-apps-blog--/*.jsonl | tail -1按项目统计会话数:
for d in ~/.pi/agent/sessions/*/; do
printf '%4d %s\n' "$(ls "$d"*.jsonl 2>/dev/null | wc -l)" "$(basename "$d")"
done | sort -rn怎么恢复这个会话
在项目目录运行 pi --session "/absolute/path/to/session.jsonl",需要已安装 Pi。恢复参数是文件路径,不只是 UUID。应用提供终端恢复,不提供 Pi 内置对话。
依据与限制
**参考范围:**2026-10-05 对照 Sessions Viewer 0.6.0 的适配器源码核对,不代表验证过每个 CLI 版本。Shell 示例使用 macOS/Linux 路径,需要
jq(opencode 用sqlite3);占位符要替换成实际值,自定义目录以你的配置为准。提取文本不等于完整还原工具、图片或会话树当前分支。命令回归使用可下载的合成样本,不读取私人会话;验证边界见能力与证据矩阵。浏览历史与恢复、编辑数据不同,见隐私与数据处理。
Pi 用条目 ID 和父 ID 保存分支。上述命令按文件顺序提取存储文本,不会还原当前分支。见找不到会话的排障指南。
或者用应用打开
Sessions Viewer 按和 Pi 一样的顺序解析会话根目录,先看环境变量,再看 settings.json,最后用默认值,并且只读会话记录,绝不碰旁边的 auth 和凭据文件。它同时还读 Claude Code、Codex、Grok Build、Kimi Code、Antigravity CLI 和 opencode。
