Codex resume:找回会话,以及它不在时的报错

选择器按目录过滤、略过 codex exec 和已归档的会话,也只恢复这块磁盘上有的东西

codex resume 连同整段对话重新打开一个过去的 Codex CLI 会话。多数时候你要找的会话就在选择器里。不在的时候,原因就那么几个,每个都有自己的解法。下面的命令和报错来自 codex-cli 0.149.0,跑在一个一次性的 CODEX_HOME 上。

命令

codex resume                            # 选择器:在这个目录里开过的会话
codex resume --all                      # 所有目录,带一列 CWD
codex resume --last                     # 最近的一个,不经过选择器
codex resume <id-or-name>               # 按 UUID 或名字恢复一个会话
codex resume --include-non-interactive  # 连 codex exec 跑的也算
codex fork                              # 复制一个旧会话继续
codex exec resume <id> "next step"      # 不用 TUI 的恢复,给脚本用

参数能被解析成 UUID 时,UUID 优先于名字。

会话不在选择器里

  • 它是在另一个目录里跑的。选择器显示的是在你当前所在目录开过的会话。codex resume --all 会列出全部。按 id 恢复在哪个目录都行:测试里,一个在某个项目里开的会话,从另一个项目按 id 恢复成功了。
  • 它是一次 codex exec 运行。非交互式会话不会出现在选择器里,也不会被 --last 选中。加上 --include-non-interactive。
  • 它被归档了。codex archive 把一个会话从选择器里藏起来。codex unarchive <id> 把它放回来。
  • 它在另一台机器上。会话是本地文件,没有任何同步。见下文。

那些报错

已归档的会话会告诉你该怎么做:

$ codex exec resume 01a0775d-a98d-7500-b4b5-943a1f3a35e3 "go on"
Error: thread/resume: thread/resume failed: session 01a0775d-a98d-7500-b4b5-943a1f3a35e3 is archived. Run `codex unarchive 01a0775d-a98d-7500-b4b5-943a1f3a35e3` to unarchive it first. (code -32600)

而完全没有文件的会话不会:

$ codex exec resume 3f2a9c1e-0000-4000-8000-000000000000 "go on"
Error: thread/resume: thread/resume failed: no rollout found for thread id 3f2a9c1e-0000-4000-8000-000000000000 (code -32600)

rollout 就是会话文件,位于 ${CODEX_HOME:-~/.codex} 下的 sessions/YYYY/MM/DD/rollout-<time>-<id>.jsonl。没有 rollout 意味着三件事之一:id 错了;会话被 codex delete 或 rm 删掉了;或者这个 shell 的 CODEX_HOME 指向的是另一套目录,而不是当初写它的那套。检查一下:

echo "${CODEX_HOME:-$HOME/.codex}"
find "${CODEX_HOME:-$HOME/.codex}" -name "rollout-*<id>*"

find 的匹配式很关键:七天之后 Codex 会把 rollout 压缩成 rollout-….jsonl.zst,所以按 *.jsonl 搜会漏掉每一个超过一周的会话。两种形式 Codex 都能恢复。

还有一个和会话本身无关的:codex resume 是全屏选择器,所以在管道、CI 任务或者智能体自己的 shell 里,它会以 Error: stdin is not a terminal 停下。那种场合用 codex exec resume <id> "prompt"。

在另一台机器上恢复

没有同步。把一个 rollout 复制到另一台机器 CODEX_HOME 下的相同路径,就够按 id 恢复它;测试里,一个只有那个复制文件的干净 CODEX_HOME 成功恢复了它:

scp laptop:.codex/sessions/2026/09/06/rollout-*01a0775d-a98d-7500-b4b5-943a1f3a35e3.jsonl \
    ~/.codex/sessions/2026/09/06/
codex resume 01a0775d-a98d-7500-b4b5-943a1f3a35e3

rollout 记录着会话当时在哪个目录里跑,选择器又按它过滤,所以项目在那边换了路径时,用 --all 或者直接用 id。

只记得内容,怎么找到 id

选择器显示标题和第一条消息;它不搜索对话内容,也只认 Codex。deja 给 rollout 建索引,压缩过的、归档过的都算在内,和这台机器上其他每个智能体的历史放在一起,并打印出重新打开一个会话的命令:

deja --harness codex "the flaky retry in the uploader"   # 排好序的命中,每条带会话 id
deja resume <id>                                        # 能重新打开它的 codex resume 命令
deja resume <id> --write-back                           # 被删掉的会话:先把 rollout 写回去

--write-back 是给那种「deja 索引过、之后 Codex 弄丢了文件」的会话用的。它会根据 deja 留下的内容写出一份 rollout,也就是对话的来回,并且需要知道会话当时跑在哪个目录;找不到时它会直说,而不是写出一份 Codex 会列错地方的 rollout。工具调用及其输出只留在 deja 里。安装:

curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
deja install --auto

第一次建索引会读取磁盘上已有的历史。建索引和检索都在本地。

Codex CLI 的会话历史 · 删除 Codex 的会话 · 在任意智能体里恢复一次会话 · 跨机器同步