Skip to content

Codex 的会话记录存在哪 ​

Codex 一个会话一个 JSONL 文件,按会话开始的日期归档:

~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-<时间戳>-<uuid>.jsonl

真实的一个长这样:

~/.codex/sessions/2026/03/20/rollout-2026-03-20T09-55-16-019d08f4-37fe-7090-96a6-100d7fbe09df.jsonl

归档过的会话会挪到隔壁目录:

~/.codex/archived_sessions/

Codex 还在 ~/.codex/state_<N>.sqlite 维护一个带 schema 版本号的状态库,<N> 随 schema 变更递增,编号最大的那个才是当前在用的。

路径不告诉你项目是哪个 ​

目录层级是日期,不是项目。工作目录记在文件的 session_meta.payload.cwd 字段里。所以「把这个仓库的所有 Codex 会话列给我」这个需求,光看目录列表答不出来,必须逐个打开文件把 cwd 读出来。

两种记录 ​

Codex 的 JSONL 更像事件流而不是消息日志,同一轮对话会以两种抽象层次各写一遍:

记录是什么
event_msg高层对话事件。文本干净,已经整理过
response_item模型 API 的原始 item:工具调用、多段 content 数组

要可读文本就用 event_msg,要工具调用细节或者附件就看 response_item。

图片被拆成两条 ​

一轮里粘了图的用户输入会被写成两条记录。role: user 的 response_item 带着 input_image 块和真正的图片数据,event_msg.user_message 带着干净的文本。两条各自都不完整。想还原成当时那个气泡,必须把图缓存住再贴到对应的文本事件上。

在终端里读 Codex 会话 ​

打印对话文本:

bash
jq -r 'select(.type=="event_msg")
  | .payload // . | select(.type=="user_message" or .type=="agent_message")
  | .message // .text' \
  ~/.codex/sessions/2026/03/20/rollout-*.jsonl

不开编辑器就看出一个会话属于哪个项目:

bash
jq -r 'select(.type=="session_meta") | .payload.cwd // empty' SESSION.jsonl | head -1

按项目归类所有会话。目录结构不肯给你这份列表,所以循环必须打开每一个文件:

bash
for f in ~/.codex/sessions/*/*/*/rollout-*.jsonl; do
  jq -r 'select(.type=="session_meta") | .payload.cwd // empty' "$f" 2>/dev/null | head -1
done | sort | uniq -c | sort -rn

怎么恢复这个会话 ​

在项目目录运行 codex resume SESSION_ID,需要已安装 Codex;也可以用应用的终端或内置对话。普通列表默认不包含已归档记录,请打开应用的已归档会话视图查找。

依据与限制 ​

实现依据:Codex 适配器。上游:Codex 文档。

**参考范围:**2026-10-05 对照 Sessions Viewer 0.6.0 的适配器源码核对,不代表验证过每个 CLI 版本。Shell 示例使用 macOS/Linux 路径,需要 jq(opencode 用 sqlite3);占位符要替换成实际值,自定义目录以你的配置为准。提取文本不等于完整还原工具、图片或会话树当前分支。命令回归使用可下载的合成样本,不读取私人会话;验证边界见能力与证据矩阵。浏览历史与恢复、编辑数据不同,见隐私与数据处理。

查看器读取上述 home 目录布局;CLI 用其他 CODEX_HOME 写入的记录不会自动覆盖。见找不到会话的排障指南。

或者用应用打开 ​

具体步骤和手动/GUI 取舍见 Codex 项目定位、归档、导出与恢复流程。

Sessions Viewer 替你归类和缓存,将拆开的图片记录重新配对;认证账户返回订阅额度窗口时,也可以显示它。额度不等于 Token 成本账单,见统计。它同时还读 Claude Code、Grok Build、Kimi Code、Pi、Antigravity CLI 和 opencode。