throughline 0.3.24 → 0.3.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/.claude/commands/tl-trim.md +42 -0
  2. package/.codex-sidecar.yml +62 -0
  3. package/CHANGELOG.md +583 -0
  4. package/README.ja.md +42 -5
  5. package/README.md +383 -23
  6. package/bin/throughline.mjs +168 -4
  7. package/codex/skills/throughline/SKILL.md +157 -0
  8. package/codex/skills/throughline/agents/openai.yaml +7 -0
  9. package/docs/INHERITANCE_ON_CLEAR_ONLY.md +146 -0
  10. package/docs/L1_L2_L3_REDESIGN.md +415 -0
  11. package/docs/PUBLIC_RELEASE_PLAN.md +184 -0
  12. package/docs/THROUGHLINE_CODEX_DUAL_SUPPORT.md +249 -0
  13. package/docs/THROUGHLINE_CODEX_FIRST_ROADMAP.md +555 -0
  14. package/docs/THROUGHLINE_CODEX_MONITOR_IMPLEMENTATION_PLAN.md +220 -0
  15. package/docs/THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md +528 -0
  16. package/docs/THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md +672 -0
  17. package/docs/archive/CONCEPT.md +476 -0
  18. package/docs/archive/EXPERIMENT.md +371 -0
  19. package/docs/archive/README.md +22 -0
  20. package/docs/archive/SESSION_LINKING_DESIGN.md +231 -0
  21. package/docs/archive/THROUGHLINE_NEXT_STEPS.md +134 -0
  22. package/docs/throughline-codex-trim-rollback-incident-report.md +306 -0
  23. package/docs/throughline-handoff-context.example.json +57 -0
  24. package/docs/throughline-rollback-context-trim-insight.md +455 -0
  25. package/package.json +6 -2
  26. package/src/cli/codex-capture.mjs +95 -0
  27. package/src/cli/codex-handoff-model-smoke.mjs +292 -0
  28. package/src/cli/codex-handoff-model-smoke.test.mjs +262 -0
  29. package/src/cli/codex-handoff-smoke.mjs +163 -0
  30. package/src/cli/codex-handoff-smoke.test.mjs +149 -0
  31. package/src/cli/codex-handoff-start.mjs +291 -0
  32. package/src/cli/codex-handoff-start.test.mjs +194 -0
  33. package/src/cli/codex-hook.mjs +276 -0
  34. package/src/cli/codex-hook.test.mjs +293 -0
  35. package/src/cli/codex-host-primitive-audit.mjs +110 -0
  36. package/src/cli/codex-host-primitive-audit.test.mjs +75 -0
  37. package/src/cli/codex-restore-smoke.mjs +357 -0
  38. package/src/cli/codex-restore-source-audit.mjs +304 -0
  39. package/src/cli/codex-resume.mjs +138 -0
  40. package/src/cli/codex-rollback-model-visible-smoke.mjs +373 -0
  41. package/src/cli/codex-rollback-model-visible-smoke.test.mjs +255 -0
  42. package/src/cli/codex-sidecar-diagnostics.mjs +48 -0
  43. package/src/cli/codex-sidecar-dry-run.mjs +85 -0
  44. package/src/cli/codex-summarize.mjs +224 -0
  45. package/src/cli/codex-threads.mjs +89 -0
  46. package/src/cli/codex-visibility-smoke.mjs +196 -0
  47. package/src/cli/codex-vscode-restore-smoke.mjs +226 -0
  48. package/src/cli/codex-vscode-rollback-smoke.mjs +114 -0
  49. package/src/cli/doctor.mjs +503 -1
  50. package/src/cli/doctor.test.mjs +542 -3
  51. package/src/cli/handoff-preview.mjs +78 -0
  52. package/src/cli/help.test.mjs +64 -0
  53. package/src/cli/install.mjs +227 -4
  54. package/src/cli/install.test.mjs +207 -4
  55. package/src/cli/trim.mjs +564 -0
  56. package/src/codex-app-server.mjs +1816 -0
  57. package/src/codex-app-server.test.mjs +512 -0
  58. package/src/codex-auto-refresh.mjs +194 -0
  59. package/src/codex-auto-refresh.test.mjs +182 -0
  60. package/src/codex-capture.mjs +235 -0
  61. package/src/codex-capture.test.mjs +393 -0
  62. package/src/codex-handoff-model-smoke.mjs +114 -0
  63. package/src/codex-handoff-model-smoke.test.mjs +89 -0
  64. package/src/codex-handoff-smoke.mjs +124 -0
  65. package/src/codex-handoff-smoke.test.mjs +103 -0
  66. package/src/codex-handoff.mjs +331 -0
  67. package/src/codex-handoff.test.mjs +220 -0
  68. package/src/codex-host-primitive-audit.mjs +374 -0
  69. package/src/codex-host-primitive-audit.test.mjs +208 -0
  70. package/src/codex-restore-smoke.test.mjs +639 -0
  71. package/src/codex-restore-source-audit.mjs +1348 -0
  72. package/src/codex-restore-source-audit.test.mjs +623 -0
  73. package/src/codex-resume.test.mjs +242 -0
  74. package/src/codex-rollout-memory.mjs +711 -0
  75. package/src/codex-rollout-memory.test.mjs +610 -0
  76. package/src/codex-sidecar-cli.test.mjs +75 -0
  77. package/src/codex-sidecar.mjs +246 -0
  78. package/src/codex-sidecar.test.mjs +172 -0
  79. package/src/codex-summarize.test.mjs +143 -0
  80. package/src/codex-thread-identity.mjs +23 -0
  81. package/src/codex-thread-index.mjs +173 -0
  82. package/src/codex-thread-index.test.mjs +164 -0
  83. package/src/codex-usage.mjs +110 -0
  84. package/src/codex-usage.test.mjs +140 -0
  85. package/src/codex-visibility-smoke.test.mjs +222 -0
  86. package/src/codex-vscode-restore-smoke.mjs +206 -0
  87. package/src/codex-vscode-restore-smoke.test.mjs +325 -0
  88. package/src/codex-vscode-rollback-smoke.mjs +90 -0
  89. package/src/codex-vscode-rollback-smoke.test.mjs +290 -0
  90. package/src/db-schema.test.mjs +97 -0
  91. package/src/haiku-summarizer.mjs +267 -26
  92. package/src/haiku-summarizer.test.mjs +282 -0
  93. package/src/handoff-preview.test.mjs +108 -0
  94. package/src/handoff-record.mjs +294 -0
  95. package/src/handoff-record.test.mjs +226 -0
  96. package/src/hook-entrypoints.test.mjs +326 -0
  97. package/src/package-files.test.mjs +19 -0
  98. package/src/prompt-submit.mjs +9 -6
  99. package/src/resume-context.mjs +44 -140
  100. package/src/resume-context.test.mjs +172 -0
  101. package/src/session-start.mjs +8 -5
  102. package/src/state-file.mjs +50 -6
  103. package/src/state-file.test.mjs +50 -0
  104. package/src/token-monitor.mjs +14 -10
  105. package/src/token-monitor.test.mjs +27 -0
  106. package/src/trim-cli.test.mjs +1584 -0
  107. package/src/trim-model.mjs +584 -0
  108. package/src/trim-model.test.mjs +568 -0
  109. package/src/turn-processor.mjs +17 -10
  110. package/src/vscode-task.mjs +33 -10
  111. package/src/vscode-task.test.mjs +19 -9
@@ -0,0 +1,220 @@
1
+ # Throughline Codex Monitor 実装計画
2
+
3
+ Status: implemented
4
+ Date: 2026-05-06
5
+
6
+ この計画は、既存の Claude-primary monitor 経路を置き換えずに、
7
+ `throughline monitor` へ Codex 対応を追加するためのもの。
8
+
9
+ ## 目的
10
+
11
+ `throughline monitor` で、Claude セッションと並べて Codex セッションも
12
+ active session として表示できるようにする。
13
+
14
+ token monitor 自体はすでに Throughline の Node.js CLI であり、Claude ランタイム
15
+ 機能ではない。現時点の制約は、monitor に渡す state producer と usage reader が
16
+ Claude 寄りになっている点にある。
17
+
18
+ - Claude hooks は `~/.throughline/state/<session_id>.json` を書く。
19
+ - Claude transcript JSONL には実測 `message.usage` token sample がある。
20
+ - 実装前の Codex Stop hook は DB capture のみで、monitor 用 state / token usage を
21
+ 書いていなかった。
22
+
23
+ Codex 対応では、既存 monitor contract の周辺に Codex adapter / projection を追加する。
24
+ Claude hooks、transcript parsing、slash command、baton、resume behavior は rename / 劣化
25
+ させない。
26
+
27
+ ## 非目的
28
+
29
+ - Claude transcript usage parsing を置き換えない。
30
+ - `~/.codex/hooks.json` を手編集しない。hook 更新は `throughline install` に任せる。
31
+ - Caveat / Spotter など既存 Codex hooks を削除・劣化させない。
32
+ - Codex token count を、host 実測 sample が無いのに exact と主張しない。
33
+ - 実測 usage が無い場合に、黙って estimate へ切り替えない。estimate は必ず表示上も
34
+ data 上も明示する。
35
+
36
+ ## 現在の contract
37
+
38
+ Monitor reader:
39
+
40
+ - `throughline monitor` は `src/token-monitor.mjs` に dispatch される。
41
+ - `~/.throughline/state/` の session state files を読む。
42
+ - 現在の state file は主に次を持つ。
43
+ `sessionId`, `projectPath`, `transcriptPath`, `pid`, `updatedAt`, optional `usage`
44
+ - `state.usage` があれば monitor はそれをそのまま表示する。
45
+ - `state.usage` が無く、`transcriptPath` があれば、
46
+ `src/transcript-usage.mjs` で Claude transcript usage を読む。
47
+ - したがって `transcriptPath` は Claude transcript fallback 用の field として残す。
48
+ Codex rollout path を同じ field に詰めると、monitor が Claude transcript parser に
49
+ 読ませてしまう可能性があるため、Codex 用には別 field を追加する。
50
+ - `pid` は既存 state schema に残っているが、現行 stale 判定は `updatedAt` ベース。
51
+ Codex Stop hook は短命 process なので、Codex の active 判定に hook process PID を
52
+ 意味づけない。
53
+
54
+ Claude writer:
55
+
56
+ - `src/turn-processor.mjs` が Claude Stop 時に state を書く。
57
+ - 可能なら Claude transcript JSONL から usage snapshot を state に固定する。
58
+ - `src/session-start.mjs` と `src/prompt-submit.mjs` も VSCode monitor task を
59
+ provision する。
60
+
61
+ Codex writer:
62
+
63
+ - `src/cli/codex-hook.mjs` は Codex rollout を DB capture する。
64
+ - 実装後は `codex:<thread_id>` の monitor state も書く。
65
+ - Codex Stop hook から VSCode monitor task を provision する。
66
+ - Codex rollout の `event_msg` / `token_count` を monitor usage として渡す。
67
+
68
+ ## 提案設計
69
+
70
+ ### 1. Monitor state を host-aware にする
71
+
72
+ state file に optional な host metadata を追加する。
73
+
74
+ ```json
75
+ {
76
+ "sessionId": "codex:019df...",
77
+ "host": "codex",
78
+ "projectPath": "/repo",
79
+ "transcriptPath": null,
80
+ "rolloutPath": "/home/user/.codex/sessions/.../rollout.jsonl",
81
+ "updatedAt": 1770000000000,
82
+ "usage": {
83
+ "tokens": 12345,
84
+ "model": "codex",
85
+ "contextWindowSize": 200000,
86
+ "contextWindowEstimated": true,
87
+ "outputTokens": 0,
88
+ "estimated": true,
89
+ "source": "codex-rollout-chars-div-4"
90
+ }
91
+ }
92
+ ```
93
+
94
+ 互換ルール:
95
+
96
+ - `host` が無い既存 state は `claude` と扱う。
97
+ - 既存 Claude state file はそのまま有効。
98
+ - normalization は `readAllSessionStates()` 側で行い、monitor 本体が
99
+ `state.host ?? "claude"` を各所で繰り返さないようにする。
100
+
101
+ ### 2. Codex Stop hook から monitor state を書く
102
+
103
+ Codex rollout capture 成功後、`runCodexStopHook` が state file を書く。
104
+
105
+ - `sessionId`: `codex:<thread_id>`
106
+ - `host`: `codex`
107
+ - `projectPath`: payload cwd または process cwd
108
+ - `pid`: hook process id を入れてよいが、Codex active 判定には使わない
109
+ - `transcriptPath`: `null`。Claude transcript parser に Codex rollout を読ませない
110
+ - `rolloutPath`: 現在の Codex rollout path が分かる場合だけ入れる
111
+ - `updatedAt`: 現在時刻
112
+ - `usage`: Codex usage sample が取れる場合は入れる。`token_count` が無い場合は
113
+ labeled estimate を入れる
114
+
115
+ 最初の milestone は、usage 無しでも Codex active session が monitor に出ることだった。
116
+ 実装では verified `token_count` usage または明示 estimate まで入れる。
117
+
118
+ ### 3. Codex usage adapter を追加する
119
+
120
+ 小さな adapter を追加する。候補は `src/codex-usage.mjs`。
121
+
122
+ Codex data から monitor 用 usage sample を作る。
123
+
124
+ 優先順位:
125
+
126
+ 1. Codex rollout の `event_msg` / `token_count` が verified shape として存在するなら、
127
+ それを読む。実 rollout でこの shape を確認済み。
128
+ 2. 実測が無い場合は、active rollout text length から既存 `estimateTokens` helper で
129
+ `chars / 4` estimate を作る。
130
+
131
+ estimate しか無い場合、usage sample は必ず次を持つ。
132
+
133
+ - `estimated: true`
134
+ - `source: "codex-rollout-chars-div-4"`
135
+ - Codex の context window が未検証なら `contextWindowEstimated: true`
136
+
137
+ monitor 表示でも compact に `est` と出す。
138
+
139
+ ### 4. Monitor core を小さく保つ
140
+
141
+ `src/token-monitor.mjs` を Codex parser にしない。
142
+
143
+ monitor は引き続き state を読んで描画するだけに寄せる。host 固有の解析は writer /
144
+ adapter 側に置く。
145
+
146
+ 期待挙動:
147
+
148
+ - Claude state + real usage: 既存どおり表示。
149
+ - Codex state + estimated usage: token bar を表示し、`est` marker を付ける。
150
+ - Codex state + usage 無し: active session として表示し、token usage は未取得扱い。
151
+
152
+ ### 5. VSCode monitor task provision を Codex にも接続する
153
+
154
+ Codex Stop hook でも、Claude hooks と同じく
155
+ `ensureMonitorTaskFile({ cwd, env })` を呼ぶ。
156
+
157
+ これにより体験を揃える。
158
+
159
+ - VSCode で project を開く。
160
+ - Codex を使う。
161
+ - Throughline Codex Stop hook が発火する。
162
+ - monitor task が存在する。
163
+ - Codex session が monitor に出る。
164
+
165
+ ## TODO
166
+
167
+ - [x] `src/state-file.mjs` に host metadata support を追加する。
168
+ - [x] `src/state-file.mjs` に optional `rolloutPath` support を追加する。
169
+ - [x] `host` 無しの旧 state file を Claude として読む互換性を維持する。
170
+ - [x] `readAllSessionStates()` で state normalization を行う。
171
+ - [x] 旧 Claude state が読めることを test で固定する。
172
+ - [x] Codex state が読め、project filter に乗ることを test で固定する。
173
+ - [x] `src/token-monitor.mjs` の表示に compact な host 表示を足す。
174
+ - [x] estimated usage sample には `est` marker を表示する。
175
+ - [x] monitor UI は静かに保ち、説明文を増やしすぎない。
176
+ - [x] `src/codex-usage.mjs` または同等の Codex usage adapter を追加する。
177
+ - [x] Codex rollout JSONL に実測 token usage field があるか確認する。
178
+ - [x] 実測 usage がある場合、verified shape だけを parse し fixture test を置く。
179
+ - [x] 実測 usage が無い場合、active rollout text から labeled `chars / 4` estimate を作る。
180
+ - [x] Codex usage estimate shape の test を追加する。
181
+ - [x] Codex context window が未検証の場合は `contextWindowEstimated: true` を保持する。
182
+ - [x] `src/cli/codex-hook.mjs` で Codex Stop hook state writing を追加する。
183
+ - [x] monitor session id は `codex:<thread_id>` にする。
184
+ - [x] Codex state の `pid` を active 判定に使わないことを test / docs で固定する。
185
+ - [x] Codex state では `transcriptPath: null` とし、rollout path は `rolloutPath` に保存する。
186
+ - [x] Codex Stop hook から `ensureMonitorTaskFile` を呼ぶ。
187
+ - [x] Codex Stop hook が monitor state を書く test を追加する。
188
+ - [x] Codex Stop hook が DB capture / L1 summarize を従来通り行うことを test で保つ。
189
+ - [x] install tests で Caveat / Spotter hook preservation が壊れていないことを維持する。
190
+ - [x] `README.md` に Claude/Codex monitor support を追記する。
191
+ - [x] `CLAUDE.md` に Codex monitor adapter contract を追記する。
192
+ - [x] 実装完了後、`docs/THROUGHLINE_CODEX_FIRST_ROADMAP.md` に結果を記録する。
193
+ - [x] `CHANGELOG.md` を更新する。
194
+ - [x] focused tests を実行する:
195
+ `rtk node --test src/state-file.test.mjs src/token-monitor.test.mjs src/codex-usage.test.mjs src/cli/codex-hook.test.mjs`
196
+ - [x] full validation を実行する:
197
+ `rtk npm test`,
198
+ `rtk npm pack --dry-run --json`,
199
+ `rtk git diff --check`
200
+ - [x] installed Codex-facing assets / hook behavior を変えた場合は
201
+ `rtk throughline install` を実行する。
202
+
203
+ ## 受け入れ条件
204
+
205
+ - Codex Stop hook capture 後、`throughline monitor` に現在の Codex session が出る。
206
+ - Claude monitor behavior は既存どおり。
207
+ - Codex session は Codex と分かる。
208
+ - Codex token usage が estimate の場合、estimate と分かる。
209
+ - Codex context window が未検証の場合、分母も推定であることが data 上分かる。
210
+ - Codex monitor path が Claude transcript parsing を置き換えない。
211
+ - `~/.codex/hooks.json` の手編集は不要。
212
+
213
+ ## 実装順
214
+
215
+ 1. Host-aware state schema と互換 test。
216
+ 2. Codex Stop hook が usage 無しでも monitor state を書く。
217
+ 3. Monitor が Claude/Codex mixed state を描画する。
218
+ 4. Codex usage adapter で実測 usage または labeled estimate を追加する。
219
+ 5. Codex Stop hook から VSCode task provision を行う。
220
+ 6. docs / changelog / install / full validation を通す。