Codex の左ペインに出るチャット履歴が、Azure OpenAI を使っている時と OpenAI / ChatGPT Plus を使っている時で分かれて見えることがあった。
最初は CODEX_HOME を分けているせいだと思っていたけど、実際には同じ C:\Users\noma3\.codex の中でも、左ペイン用の状態ファイルやセッションメタ情報の持ち方によって見え方が変わっていた。
この記事は、今回実際に確認して直した内容のメモ。
注意点として、ここで触っているファイルは Codex の内部状態なので、普通の設定変更として推奨されるものではない。やる場合は必ずバックアップを取ってから触る。
見ていたファイル
主に見ていたのはこのあたり。
1 | C:\Users\noma3\.codex\session_index.jsonl |
それぞれの役割は、おおむね次のように見えた。
session_index.jsonl: チャット一覧用の簡易インデックス.codex-global-state.json: 左ペインのプロジェクトや projectless なスレッドの状態state_5.sqlite: アプリ側が使うスレッド一覧の SQLitesessions\...\*.jsonl: 実際の会話ログ本体。先頭にsession_metaがある
最初に起きていたこと
左ペインの「チャット」に、直前に作業したはずのスレッドが出てこなかった。
対象のスレッドは例えばこれ。
1 | 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 | real LF count 1 |
これだと、左ペイン側が正しくパースできず、最近の履歴が落ちる可能性がある。
ただし単純に全部の \n を本物の改行に置換してはいけない。
thread_name の中にも正当な \n が入っているため、壊してしまう。
今回直した時は、レコード区切りになっている }\n{ だけを本物の改行にした。
結果として、48件のレコードを持つ普通の JSONL に戻した。
1 | real LF count 48 |
原因2: projectless-thread-ids に入っていなかった
Codex の左ペインには「プロジェクト」と「チャット」がある。
プロジェクトに属さないチャットとして表示されるには、.codex-global-state.json の projectless-thread-ids が関係しているようだった。
今回出したかったスレッドはここに入っていなかった。
そのため、まず対象スレッドを projectless-thread-ids に追加した。
1 | "projectless-thread-ids": [ |
ただし、これだけではまだ表示されなかった。
原因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 | id: 019e14dd-dac9-78d3-84f4-60931e9ed497 |
sessions 側の session_meta も同じように寄せた。
1 | session cwd: C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex |
さらに、thread-workspace-root-hints に古いプロジェクト紐付けが残らないよう、対象スレッドの hint は削除した。
バックアップ
触る前にバックアップを残した。
今回の作業中に作ったバックアップ名はだいたいこのような形。
1 | *.before-fix-hidden-recent-thread-20260511-115709.bak |
内部状態を直接編集するなら、最低でも以下はバックアップしておいたほうがよさそう。
1 | C:\Users\noma3\.codex\session_index.jsonl |
結果
修正後、Codex の左ペインに以下のように表示されるようになった。
1 | 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 を追加するところまでにしておく。