Codex の左ペインに出るチャット履歴が、Azure OpenAI を使っている時と OpenAI / ChatGPT Plus を使っている時で分かれて見えることがあった。
最初は CODEX_HOME を分けているせいだと思っていたけど、実際には同じ C:\Users\noma3\.codex の中でも、左ペイン用の状態ファイルやセッションメタ情報の持ち方によって見え方が変わっていた。
この記事は、今回実際に確認して直した内容のメモ。
注意点として、ここで触っているファイルは Codex の内部状態なので、普通の設定変更として推奨されるものではない。やる場合は必ずバックアップを取ってから触る。
見ていたファイル 主に見ていたのはこのあたり。
1 2 3 4 C:\Users\noma3\.codex\session_index.jsonl C:\Users\noma3\.codex\.codex-global-state.json C:\Users\noma3\.codex\state_5.sqlite C:\Users\noma3\.codex\sessions\...\*.jsonl
それぞれの役割は、おおむね次のように見えた。
session_index.jsonl: チャット一覧用の簡易インデックス
.codex-global-state.json: 左ペインのプロジェクトや projectless なスレッドの状態
state_5.sqlite: アプリ側が使うスレッド一覧の SQLite
sessions\...\*.jsonl: 実際の会話ログ本体。先頭に session_meta がある
最初に起きていたこと 左ペインの「チャット」に、直前に作業したはずのスレッドが出てこなかった。
対象のスレッドは例えばこれ。
1 2 019e14dd-dac9-78d3-84f4-60931e9ed497 切替時ログ差分を修正
session_index.jsonl や state_5.sqlite を見ると存在はしていた。
しかし実際の UI には出ていなかった。
原因1: session_index.jsonl が JSONL ではなくなっていた session_index.jsonl は JSON Lines 形式なので、本来は1レコードごとに実際の改行が入る必要がある。
ところがファイルを見ると、実改行ではなく文字としての \n でつながった1行になっていた。
確認した時はこんな状態だった。
1 2 real LF count 1 literal backslash-n count 165
これだと、左ペイン側が正しくパースできず、最近の履歴が落ちる可能性がある。
ただし単純に全部の \n を本物の改行に置換してはいけない。
thread_name の中にも正当な \n が入っているため、壊してしまう。
今回直した時は、レコード区切りになっている }\n{ だけを本物の改行にした。
結果として、48件のレコードを持つ普通の JSONL に戻した。
1 2 real LF count 48 literal separator count 0
原因2: projectless-thread-ids に入っていなかった Codex の左ペインには「プロジェクト」と「チャット」がある。
プロジェクトに属さないチャットとして表示されるには、.codex-global-state.json の projectless-thread-ids が関係しているようだった。
今回出したかったスレッドはここに入っていなかった。
そのため、まず対象スレッドを projectless-thread-ids に追加した。
1 2 3 4 "projectless-thread-ids": [ "019e14f3-41ec-72e0-9664-d9628a1d28dd", "019e14dd-dac9-78d3-84f4-60931e9ed497" ]
ただし、これだけではまだ表示されなかった。
原因3: cwd が消したプロジェクトを指していた 決定打は cwd だった。
切替時ログ差分を修正 のスレッドは、state_5.sqlite と sessions\...\*.jsonl の先頭 session_meta の両方で、まだこのパスを指していた。
1 D:\OneDrive\03_tools\03_obs\obs-studio
このプロジェクトを UI 上で手動削除したため、そのスレッドは「プロジェクトにも出ないし、チャットにも出ない」状態になっていたように見えた。
そこで、現在表示されている projectless なチャットと同じ作業ディレクトリへ寄せた。
1 C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex
具体的には、state_5.sqlite の threads.cwd と、セッションファイル先頭の session_meta.payload.cwd を両方変更した。
state_5.sqlite 側はこのような状態になった。
1 2 3 4 5 id: 019e14dd-dac9-78d3-84f4-60931e9ed497 title: 切替時ログ差分を修正 cwd: \\?\C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex model_provider: openai archived: 0
sessions 側の session_meta も同じように寄せた。
1 2 session cwd: C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex session provider: openai
さらに、thread-workspace-root-hints に古いプロジェクト紐付けが残らないよう、対象スレッドの hint は削除した。
バックアップ 触る前にバックアップを残した。
今回の作業中に作ったバックアップ名はだいたいこのような形。
1 2 *.before-fix-hidden-recent-thread-20260511-115709.bak *.before-show-hidden-thread-20260511-120040.bak
内部状態を直接編集するなら、最低でも以下はバックアップしておいたほうがよさそう。
1 2 3 4 C:\Users\noma3\.codex\session_index.jsonl C:\Users\noma3\.codex\.codex-global-state.json C:\Users\noma3\.codex\state_5.sqlite 対象の C:\Users\noma3\.codex\sessions\...\*.jsonl
結果 修正後、Codex の左ペインに以下のように表示されるようになった。
1 2 codexの.codex変更を再確認 切替時ログ差分を修正
今回のポイントは、session_index.jsonl だけを直しても足りなかったこと。
Codex は複数のファイルを見て左ペインを作っているようで、少なくとも次の整合性が必要だった。
session_index.jsonl が正しい JSONL である
.codex-global-state.json の projectless-thread-ids に対象スレッドが入っている
.codex-global-state.json の thread-workspace-root-hints に古いプロジェクト紐付けが残っていない
state_5.sqlite の threads.cwd が消したプロジェクトを指していない
sessions\...\*.jsonl の session_meta.payload.cwd も同じ方向に直っている
デプロイについて このブログは古い Hexo 環境で動かしているので、生成や deploy はいつもの WSL 側の Node 8 環境でやる。
過去メモにもある通り、Node 14 などに上げると hexo deploy が失敗することがあったので、ここでは Markdown を追加するところまでにしておく。