yoi/tickets/session-store-extraction.md

58 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# session-store: persistence クレートの再構成
## 背景
`llm-worker-persistence` は名前・構造ともに llm-worker のサブクレートに見えるが、
実態はセッション管理という上位層の関心を持っている。
現状の `Session` は Worker を wrap して `run()`/`resume()` をインターセプトするが、
永続化のためにレイヤーとして呼び出しパスに噛む必要はない。
Worker からセッション状態を抜き出して保存する/復元するだけで十分。
## 方針
- クレート名を `llm-worker-persistence``session-store` に変更
- `Session` の Worker wrap を廃止し、save/restore の関数群にする
- Pod が Worker を直接保持し、run 後に session-store の関数を呼ぶ
- `llm-worker` への型依存(`Item`, `RequestConfig`)はそのまま残す(構造的に層にならなければ問題ない)
## 現状の構造
```
Controller → Pod → Session (wraps Worker) → Worker
↑ run()/resume() をインターセプト
```
`pod.session_mut().worker_mut()` と2段潜る必要がある。
## 変更後の構造
```
Controller → Pod → Worker (直接保持)
└─ run 後に session_store::save_delta(store, ...) を呼ぶ
restore 時に session_store::restore(store, id) → state を返す
```
## 変更内容
### session-store クレート(旧 llm-worker-persistence
- `Session` struct を廃止
- save 系関数を提供: history delta の記録、turn end、outcome 等
- restore 関数: ログ再生 → `RestoredState` を返すWorker は作らない)
- `Store` trait, `FsStore`, `LogEntry`, ハッシュチェーンはそのまま維持
- fork / fork_at も関数として残す
### pod クレート
- `Pod``Worker` を直接フィールドに持つ
- `Pod::run()` 内で Worker を呼び、その後 session-store の save 関数を呼ぶ
- `Pod::restore()` は session-store から `RestoredState` を受け取り、Worker に適用
- Controller は `pod.worker()` / `pod.worker_mut()` で直接アクセス
### 影響範囲
- `Session` を使っている箇所: `pod.rs`, `controller.rs`, テスト
- `SessionError` が消えるので、`PodError` から `SessionError` variant を除去し、`StoreError` に置換