0%

Codex の左ペインに出ないチャット履歴を直したメモ

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.jsonlstate_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.jsonprojectless-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.sqlitesessions\...\*.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.sqlitethreads.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.jsonprojectless-thread-ids に対象スレッドが入っている
  • .codex-global-state.jsonthread-workspace-root-hints に古いプロジェクト紐付けが残っていない
  • state_5.sqlitethreads.cwd が消したプロジェクトを指していない
  • sessions\...\*.jsonlsession_meta.payload.cwd も同じ方向に直っている

デプロイについて

このブログは古い Hexo 環境で動かしているので、生成や deploy はいつもの WSL 側の Node 8 環境でやる。

過去メモにもある通り、Node 14 などに上げると hexo deploy が失敗することがあったので、ここでは Markdown を追加するところまでにしておく。