throughline 0.3.24 → 0.4.0

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 (116) hide show
  1. package/.claude/commands/tl.md +6 -21
  2. package/.codex-sidecar.yml +62 -0
  3. package/CHANGELOG.md +632 -0
  4. package/README.ja.md +71 -46
  5. package/README.md +420 -76
  6. package/bin/throughline.mjs +169 -7
  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 +159 -0
  10. package/docs/L1_L2_L3_REDESIGN.md +415 -0
  11. package/docs/PUBLIC_RELEASE_PLAN.md +185 -0
  12. package/docs/THROUGHLINE_CLEAR_AUTO_HANDOFF_PLAN.md +286 -0
  13. package/docs/THROUGHLINE_CODEX_DUAL_SUPPORT.md +249 -0
  14. package/docs/THROUGHLINE_CODEX_FIRST_ROADMAP.md +555 -0
  15. package/docs/THROUGHLINE_CODEX_MONITOR_IMPLEMENTATION_PLAN.md +220 -0
  16. package/docs/THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md +528 -0
  17. package/docs/THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md +672 -0
  18. package/docs/archive/CONCEPT.md +476 -0
  19. package/docs/archive/EXPERIMENT.md +371 -0
  20. package/docs/archive/README.md +22 -0
  21. package/docs/archive/SESSION_LINKING_DESIGN.md +231 -0
  22. package/docs/archive/THROUGHLINE_NEXT_STEPS.md +134 -0
  23. package/docs/throughline-codex-trim-rollback-incident-report.md +306 -0
  24. package/docs/throughline-handoff-context.example.json +57 -0
  25. package/docs/throughline-rollback-context-trim-insight.md +455 -0
  26. package/package.json +6 -2
  27. package/src/baton.mjs +17 -45
  28. package/src/baton.test.mjs +4 -41
  29. package/src/cli/codex-capture.mjs +95 -0
  30. package/src/cli/codex-handoff-model-smoke.mjs +292 -0
  31. package/src/cli/codex-handoff-model-smoke.test.mjs +262 -0
  32. package/src/cli/codex-handoff-smoke.mjs +163 -0
  33. package/src/cli/codex-handoff-smoke.test.mjs +149 -0
  34. package/src/cli/codex-handoff-start.mjs +291 -0
  35. package/src/cli/codex-handoff-start.test.mjs +194 -0
  36. package/src/cli/codex-hook.mjs +276 -0
  37. package/src/cli/codex-hook.test.mjs +293 -0
  38. package/src/cli/codex-host-primitive-audit.mjs +110 -0
  39. package/src/cli/codex-host-primitive-audit.test.mjs +75 -0
  40. package/src/cli/codex-restore-smoke.mjs +357 -0
  41. package/src/cli/codex-restore-source-audit.mjs +304 -0
  42. package/src/cli/codex-resume.mjs +138 -0
  43. package/src/cli/codex-rollback-model-visible-smoke.mjs +373 -0
  44. package/src/cli/codex-rollback-model-visible-smoke.test.mjs +255 -0
  45. package/src/cli/codex-sidecar-diagnostics.mjs +48 -0
  46. package/src/cli/codex-sidecar-dry-run.mjs +85 -0
  47. package/src/cli/codex-summarize.mjs +224 -0
  48. package/src/cli/codex-threads.mjs +89 -0
  49. package/src/cli/codex-visibility-smoke.mjs +196 -0
  50. package/src/cli/codex-vscode-restore-smoke.mjs +226 -0
  51. package/src/cli/codex-vscode-rollback-smoke.mjs +114 -0
  52. package/src/cli/doctor.mjs +503 -1
  53. package/src/cli/doctor.test.mjs +542 -3
  54. package/src/cli/handoff-preview.mjs +78 -0
  55. package/src/cli/help.test.mjs +64 -0
  56. package/src/cli/install.mjs +226 -3
  57. package/src/cli/install.test.mjs +205 -4
  58. package/src/cli/trim.mjs +564 -0
  59. package/src/codex-app-server.mjs +1816 -0
  60. package/src/codex-app-server.test.mjs +512 -0
  61. package/src/codex-auto-refresh.mjs +194 -0
  62. package/src/codex-auto-refresh.test.mjs +182 -0
  63. package/src/codex-capture.mjs +235 -0
  64. package/src/codex-capture.test.mjs +393 -0
  65. package/src/codex-handoff-model-smoke.mjs +114 -0
  66. package/src/codex-handoff-model-smoke.test.mjs +89 -0
  67. package/src/codex-handoff-smoke.mjs +124 -0
  68. package/src/codex-handoff-smoke.test.mjs +103 -0
  69. package/src/codex-handoff.mjs +331 -0
  70. package/src/codex-handoff.test.mjs +220 -0
  71. package/src/codex-host-primitive-audit.mjs +374 -0
  72. package/src/codex-host-primitive-audit.test.mjs +208 -0
  73. package/src/codex-restore-smoke.test.mjs +639 -0
  74. package/src/codex-restore-source-audit.mjs +1348 -0
  75. package/src/codex-restore-source-audit.test.mjs +623 -0
  76. package/src/codex-resume.test.mjs +242 -0
  77. package/src/codex-rollout-memory.mjs +711 -0
  78. package/src/codex-rollout-memory.test.mjs +610 -0
  79. package/src/codex-sidecar-cli.test.mjs +75 -0
  80. package/src/codex-sidecar.mjs +246 -0
  81. package/src/codex-sidecar.test.mjs +172 -0
  82. package/src/codex-summarize.test.mjs +143 -0
  83. package/src/codex-thread-identity.mjs +23 -0
  84. package/src/codex-thread-index.mjs +173 -0
  85. package/src/codex-thread-index.test.mjs +164 -0
  86. package/src/codex-usage.mjs +110 -0
  87. package/src/codex-usage.test.mjs +140 -0
  88. package/src/codex-visibility-smoke.test.mjs +222 -0
  89. package/src/codex-vscode-restore-smoke.mjs +206 -0
  90. package/src/codex-vscode-restore-smoke.test.mjs +325 -0
  91. package/src/codex-vscode-rollback-smoke.mjs +90 -0
  92. package/src/codex-vscode-rollback-smoke.test.mjs +290 -0
  93. package/src/db-schema.test.mjs +96 -0
  94. package/src/db.mjs +14 -1
  95. package/src/haiku-summarizer.mjs +267 -26
  96. package/src/haiku-summarizer.test.mjs +282 -0
  97. package/src/handoff-preview.test.mjs +108 -0
  98. package/src/handoff-record.mjs +294 -0
  99. package/src/handoff-record.test.mjs +226 -0
  100. package/src/hook-entrypoints.test.mjs +286 -0
  101. package/src/package-files.test.mjs +19 -0
  102. package/src/prompt-submit.mjs +9 -6
  103. package/src/resume-context.mjs +58 -171
  104. package/src/resume-context.test.mjs +177 -0
  105. package/src/session-start.mjs +85 -26
  106. package/src/state-file.mjs +50 -6
  107. package/src/state-file.test.mjs +50 -0
  108. package/src/token-monitor.mjs +14 -10
  109. package/src/token-monitor.test.mjs +27 -0
  110. package/src/trim-cli.test.mjs +1584 -0
  111. package/src/trim-model.mjs +584 -0
  112. package/src/trim-model.test.mjs +568 -0
  113. package/src/turn-processor.mjs +17 -10
  114. package/src/vscode-task.mjs +33 -10
  115. package/src/vscode-task.test.mjs +19 -9
  116. package/src/cli/save-inflight.mjs +0 -81
package/README.ja.md CHANGED
@@ -97,7 +97,7 @@ flowchart LR
97
97
 
98
98
  | 層 | 名称 | 保存先 | 内容 | ターンあたりコスト |
99
99
  | --- | --- | --- | --- | --- |
100
- | **L1** | スケルトン | 古いターンとして注入 | Haiku が生成する一行要約 | 約 10 トークン |
100
+ | **L1** | スケルトン | 古いターンとして注入 | ターンの一行要約(既定は Claude Haiku、設定時は Codex sidecar も可) | 約 10 トークン |
101
101
  | **L2** | ボディ | 直近ターンとして注入 | ユーザー本文 + アシスタント返答そのまま | 自然なフルサイズ |
102
102
  | **L3** | ディテール | SQLite のみ | ツール I/O、システムメッセージ、画像、**拡張思考** (オンデマンド) | 重い、退避済 |
103
103
 
@@ -114,10 +114,11 @@ flowchart LR
114
114
  - **それ以前** は L1 (`skeletons`) の一行要約として注入
115
115
  - L3 は SQLite に残り、`/sc-detail <時刻>` でオンデマンド取得
116
116
 
117
- L1 要約は `claude -p --model claude-haiku-4-5-*` サブプロセスで
118
- **Claude Haiku 4.5** が生成します。Claude Max のログイン認証を流用するため
119
- API キー不要です。要約は遅延実行で、20 ターン未満で終わるセッションでは
120
- Haiku は一度も呼ばれず、短いタスクの要約コストはゼロです。
117
+ L1 要約は遅延実行で、20 ターン未満で終わるセッションでは外部要約器を呼ばず、
118
+ 短いタスクの要約コストはゼロです。既定では
119
+ `claude -p --model claude-haiku-4-5-*` サブプロセスで **Claude Haiku 4.5** が生成します。
120
+ Claude Max のログイン認証を流用するため API キー不要です。
121
+ `codex-sidecar` が `summarize-l1` preset で明示設定されている場合は、そちらを使えます。
121
122
 
122
123
  3 層 (L1/L2/L3) の書き込みパスは schema v5 から動作しています。
123
124
  `/sc-detail HH:MM:SS` はユーザー / アシスタント本文 (L2) と、そのターンで
@@ -125,59 +126,75 @@ L3 に保存された `kind` 別 (ツール入力 / ツール出力 / hook 出
125
126
 
126
127
  ---
127
128
 
128
- ## 明示的引き継ぎ `/tl` (in-flight メモ付き)
129
+ ## 引き継ぎ: `/clear` で自動、env で OFF、`/tl` で明示
129
130
 
130
- 引き継ぎは **明示的** であり、自動ではありません。次セッションへ「ここから続けてほしい」と
131
- 渡したいときは、現セッションで `/clear` または新規チャットを開く **前に** `/tl` を打ちます。
132
- `/tl` 無しの場合、新セッションはまっさらな状態で始まり、過去メモリは引き継がれません。
131
+ Throughline 0.4.0 から引き継ぎは 2 経路:
133
132
 
134
- `/tl` は 2 つの仕事をします:
133
+ ### auto path (デフォルト): `/clear` で自動引き継ぎ
135
134
 
136
- 1. **引き継ぎバトンの書き込み**。現在の `session_id` `handoff_batons` テーブルへ、
137
- `UserPromptSubmit` hook 経由で記録します。
138
- 2. **現 Claude in-flight メモを書かせる**。`/tl` は Claude に対し、
139
- *次に何をしようとしていたか、現在の仮説、未解決の問い、進行中 TODO* を Markdown で
140
- 要約し、`throughline save-inflight` 経由でバトンの `memo_text` カラムに添付するよう
141
- 指示します。これにより、トランスクリプト再生だけでは保てない「いま考え中だった内容」を保存できます。
135
+ Claude Code 2.1.128 以降は `/clear` 直後の SessionStart hook に
136
+ `source='clear'` が確実に乗ります。Throughline がこれを検出して、前セッションの
137
+ メモリを新セッションに自動 merge します。**ユーザー操作不要** `/clear`
138
+ だけで新チャットが「途中から」再開されます。
142
139
 
143
- 次の `SessionStart` では、hook がバトンを読み、**1 時間以内** であれば
144
- そのセッションのメモリを `BEGIN IMMEDIATE` トランザクション内で
145
- `UPDATE session_id = ?` を使って決定論的にマージします。バトンはマージと
146
- 原子的に消費 (削除) されるため、二重発火しません。注入される再開コンテキストは
147
- **「中断されたタスクの再開」** として再フレーミングされ、in-flight メモと最終ターンの
148
- 拡張思考が先頭に来ることで、新 Claude は思考の途中から拾えます。
140
+ `THROUGHLINE_DISABLE_AUTO_HANDOFF=1` を環境変数に立てると auto path を OFF にできます。
141
+
142
+ ### baton path (`/tl`): 明示意思マーカー
143
+
144
+ 次のいずれかのユーザー向け:
145
+
146
+ - `THROUGHLINE_DISABLE_AUTO_HANDOFF=1` を立てている、**または**
147
+ - `/clear` 経由しないで引き継ぎたい (新 chat / VSCode 再起動など)
148
+
149
+ 新セッションを開く前に `/tl` を打つと `UserPromptSubmit` hook が baton を書き、
150
+ 次の `SessionStart` (1 時間以内) が baton を消費して merge します。
151
+ `source` 値関係なく発火します。
149
152
 
150
153
  ```
151
- Session A (/tl を打つ) -----------> バトン書き込み
152
- |
153
- /clear |
154
- | ▼
155
- Session B ---- バトン読込 → A を B にマージ → バトン削除 ---->
156
- |
157
- (もう一度 /tl で更に渡せる)
154
+ auto path: Session A /clear → Session B (A を auto-merge)
155
+ baton path: Session A → /tl → (新 chat / 再起動) → Session B (baton を消費して A を merge)
158
156
  ```
159
157
 
160
- 明示的バトン方式を選んだ理由:
158
+ ### 注入されるもの
159
+
160
+ 両経路で同じ curated memory が注入されます:
161
+
162
+ - L1 サマリー (古い turn の一行要約)
163
+ - L2 verbatim (直近 20 turn の本文)
164
+ - L3 references (`throughline detail <時刻>` で引き出すコマンド一覧、本文は SQLite に残置)
161
165
 
162
- - **誤継承ゼロ**。並行ウィンドウや VSCode 再起動、同じリポジトリでの新規タスクが、
163
- 前セッションのメモリを誤って引き継ぐことはありません。`/tl` 明示時のみ発火。
164
- - **VSCode 拡張対応**。`SessionStart` hook の `source` フィールドは VSCode 拡張で
165
- `/clear` 後も `"startup"` に書き換えられてしまう
166
- ([issue #49937](https://github.com/anthropics/claude-code/issues/49937))。
167
- source 判定は信用できないため、ユーザー駆動のバトンで回避。
168
- - **決定論的**。時間窓ヒューリスティック、PID 推測、祖先プロセス追跡なし。
169
- ユーザーが意思を宣言し、hook が実行する。それだけ。
166
+ 注入は **「中断されたタスクの再開」** として再フレーミングされます。L2 verbatim に
167
+ 最終 assistant turn (= 次に何をしようとしていたか) が含まれるため、別途 memo /
168
+ extended thinking セクションは注入されません。
170
169
 
171
- 各マージ行は `origin_session_id` を保持するので、`/tl` を繰り返すと
170
+ 各マージ行は `origin_session_id` を保持するので、繰り返し引き継ぐと
172
171
  記憶がチェーン状に蓄積します:
173
172
 
174
173
  ```
175
- S1 (4 ターン) --/tl,/clear--> S2 (S1 をマージ + 3 ターン追加) --/tl,/clear--> S3 (S2 をマージ + 5 ターン追加)
176
- origin=S1×4 origin=S1×4, S2×3, S3×5
174
+ S1 (4 ターン) --/clear--> S2 (S1 auto-merge + 3 ターン追加) --/clear--> S3 (S2 auto-merge + 5 ターン追加)
175
+ origin=S1×4 origin=S1×4, S2×3, S3×5
177
176
  ```
178
177
 
179
178
  ---
180
179
 
180
+ ## Codex sidecar と Codex trim
181
+
182
+ Throughline の主軸は引き続き **Claude Code** です。Codex 対応は、Claude hooks /
183
+ slash command / transcript / baton / resume behavior を置き換えるものではなく、
184
+ adapter / projection として追加されます。
185
+
186
+ 現時点で core Throughline が外部モデルを呼ぶのは L2→L1 要約だけです。
187
+ `codex-sidecar` が `summarize-l1` preset で設定されている場合はその要約に
188
+ Codex sidecar を使えます。使えない場合は、従来どおり Claude Haiku 経路を使います。
189
+
190
+ Codex 側 trim (= same-thread context trim) は `throughline trim --execute --host codex`
191
+ で発火します。Claude 側は `/clear` での auto path 引継ぎが本線になったため、
192
+ `/tl-trim` slash command は v0.4.0 で廃止されました。current-work framing は
193
+ SessionStart 注入の Reading Contract / Continuation Instruction で同じ意図を
194
+ 継承しています。
195
+
196
+ ---
197
+
181
198
  ## マルチセッション トークン監視
182
199
 
183
200
  実行:
@@ -210,8 +227,13 @@ throughline monitor --session <id-prefix>
210
227
  | `throughline monitor` | マルチセッション監視を起動 |
211
228
  | `throughline monitor --diag` | TTY/columns/env 診断ダンプ (描画バグ切り分け用) |
212
229
  | `throughline detail <時刻>` | あるターンの L2 本文と L3 ツール I/O を取得 (Claude が使う) |
213
- | `throughline save-inflight` | `/tl` から呼ばれ、現バトンに in-flight メモを添付 (stdin 経由) |
214
230
  | `throughline doctor` | Node バージョン、hook 登録状況、DB、PATH をチェック |
231
+ | `throughline doctor --trim --host claude` | trim boundary と手動手順を診断 |
232
+ | `throughline handoff-preview --session <id>` | Codex 向け `throughline_handoff` JSON projection を表示 |
233
+ | `throughline codex-sidecar-diagnostics` | この project の `codex-sidecar` diagnostics status を確認 |
234
+ | `throughline codex-sidecar-dry-run` | App Server を呼ばずに read-only sidecar request を正規化表示 |
235
+ | `throughline trim --dry-run --host codex` | Codex same-thread trim の dry-run preview |
236
+ | `throughline trim --execute --host codex` | Codex 同 thread の guarded rollback + DB memory inject |
215
237
  | `throughline doctor --session <id-prefix>` | 特定セッションの state/transcript ズレを診断 |
216
238
  | `throughline status` | DB 統計表示 (sessions / skeletons / bodies / details) |
217
239
  | `throughline --version` | インストール済みバージョンを表示 |
@@ -220,12 +242,12 @@ throughline monitor --session <id-prefix>
220
242
 
221
243
  | コマンド | 役割 |
222
244
  | --- | --- |
223
- | `/tl` | 引き継ぎバトンを書き込み + Claude in-flight メモを書かせる |
245
+ | `/tl` | 引き継ぎバトンを書き込む (auto path OFF にしているユーザー / `/clear` 経由しない引継ぎの逃げ道) |
224
246
  | `/sc-detail <時刻>` | 過去ターンの L2 本文と L3 ツール I/O を取得 |
225
247
 
226
- > `/tl` 発火時、Claude Bash 経由で `throughline save-inflight` を呼びます。
227
- > 初回は許可確認が出るので、`Bash(throughline save-inflight:*)` allowlist
228
- > 追加すると以後の確認はスキップできます。
248
+ > v0.4.0 から auto-handoff がデフォルト ON です。`/clear` だけで新セッションが
249
+ > 「途中から」再開されます。`THROUGHLINE_DISABLE_AUTO_HANDOFF=1` OFF にできます。
250
+ > `/tl` は OFF 設定下、または `/clear` 経由しない引継ぎ用の明示マーカー。
229
251
 
230
252
  ---
231
253
 
@@ -244,6 +266,9 @@ throughline monitor --session <id-prefix>
244
266
 
245
267
  - [`docs/L1_L2_L3_REDESIGN.md`](docs/L1_L2_L3_REDESIGN.md) — L1/L2/L3 差分階層モデルの **設計仕様書** (schema v4 ベース + v5 L3 分類拡張)。記憶階層化ルールの正典
246
268
  - [`docs/INHERITANCE_ON_CLEAR_ONLY.md`](docs/INHERITANCE_ON_CLEAR_ONLY.md) — `/tl` バトン引き継ぎ方式の設計判断記録 (schema v6–v7)
269
+ - [`docs/THROUGHLINE_CODEX_DUAL_SUPPORT.md`](docs/THROUGHLINE_CODEX_DUAL_SUPPORT.md) — Claude 主軸を維持したまま Codex 対応を足すための architecture brief
270
+ - [`docs/throughline-rollback-context-trim-insight.md`](docs/throughline-rollback-context-trim-insight.md) — rollback / trim 設計 insight。復元 memory を current work として読ませる制約も記録
271
+ - [`docs/THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md`](docs/THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md) — Claude/Codex 両対応と rollback trim の統合 TODO 計画
247
272
  - [`docs/PUBLIC_RELEASE_PLAN.md`](docs/PUBLIC_RELEASE_PLAN.md) — 公開配布化プラン、§ 0 フォールバック禁止ルール、バージョン別実装ステータス
248
273
  - [`CHANGELOG.md`](CHANGELOG.md) — リリース履歴
249
274
  - [`docs/archive/`](docs/archive/) — 破棄済み旧設計 (CONCEPT 初期案、session-linking 実験記録など)