yoi/tickets/session-store-extraction.md

2.3 KiB
Raw Blame History

session-store: persistence クレートの再構成

背景

llm-worker-persistence は名前・構造ともに llm-worker のサブクレートに見えるが、 実態はセッション管理という上位層の関心を持っている。

現状の Session は Worker を wrap して run()/resume() をインターセプトするが、 永続化のためにレイヤーとして呼び出しパスに噛む必要はない。 Worker からセッション状態を抜き出して保存する/復元するだけで十分。

方針

  • クレート名を llm-worker-persistencesession-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 クレート

  • PodWorker を直接フィールドに持つ
  • 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 に置換