llm_worker/state.rs
1//! Worker状態
2//!
3//! Type-stateパターンによるキャッシュ保護のための状態マーカー型。
4//! Workerは`Mutable` → `CacheLocked`の状態遷移を持ちます。
5
6/// Worker状態を表すマーカートレイト
7///
8/// このトレイトはシールされており、外部から実装することはできません。
9pub trait WorkerState: private::Sealed + Send + Sync + 'static {}
10
11mod private {
12 pub trait Sealed {}
13}
14
15/// 編集可能状態
16///
17/// この状態では以下の操作が可能です:
18/// - システムプロンプトの設定・変更
19/// - メッセージ履歴の編集(追加、削除、クリア)
20/// - ツール・Hookの登録
21///
22/// `Worker::lock()`により[`CacheLocked`]状態へ遷移できます。
23///
24/// # Examples
25///
26/// ```ignore
27/// use llm_worker::Worker;
28///
29/// let mut worker = Worker::new(client)
30/// .system_prompt("You are helpful.");
31///
32/// // 履歴を編集可能
33/// worker.push_message(Message::user("Hello"));
34/// worker.clear_history();
35///
36/// // ロックして保護状態へ
37/// let locked = worker.lock();
38/// ```
39#[derive(Debug, Clone, Copy, Default)]
40pub struct Mutable;
41
42impl private::Sealed for Mutable {}
43impl WorkerState for Mutable {}
44
45/// キャッシュロック状態(キャッシュ保護)
46///
47/// この状態では以下の制限があります:
48/// - システムプロンプトの変更不可
49/// - 既存メッセージ履歴の変更不可(末尾への追記のみ)
50///
51/// LLM APIのKVキャッシュヒットを保証するため、
52/// 実行時にはこの状態の使用が推奨されます。
53///
54/// `Worker::unlock()`により[`Mutable`]状態へ戻せますが、
55/// キャッシュ保護が解除されることに注意してください。
56#[derive(Debug, Clone, Copy, Default)]
57pub struct CacheLocked;
58
59impl private::Sealed for CacheLocked {}
60impl WorkerState for CacheLocked {}