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
第一次建索引会读取磁盘上已有的历史。建索引和检索都在本地。