//! Worker状態 //! //! Type-stateパターンによるキャッシュ保護のための状態マーカー型。 //! Workerは`Mutable` → `CacheLocked`の状態遷移を持ちます。 /// Worker状態を表すマーカートレイト /// /// このトレイトはシールされており、外部から実装することはできません。 pub trait WorkerState: private::Sealed + Send + Sync + 'static {} mod private { pub trait Sealed {} } /// 編集可能状態 /// /// この状態では以下の操作が可能です: /// - システムプロンプトの設定・変更 /// - メッセージ履歴の編集(追加、削除、クリア) /// - ツール・Hookの登録 /// /// `Worker::lock()`により[`CacheLocked`]状態へ遷移できます。 /// /// # Examples /// /// ```ignore /// use llm_worker::Worker; /// /// let mut worker = Worker::new(client) /// .system_prompt("You are helpful."); /// /// // 履歴を編集可能 /// worker.push_message(Message::user("Hello")); /// worker.clear_history(); /// /// // ロックして保護状態へ /// let locked = worker.lock(); /// ``` #[derive(Debug, Clone, Copy, Default)] pub struct Mutable; impl private::Sealed for Mutable {} impl WorkerState for Mutable {} /// キャッシュロック状態(キャッシュ保護) /// /// この状態では以下の制限があります: /// - システムプロンプトの変更不可 /// - 既存メッセージ履歴の変更不可(末尾への追記のみ) /// /// LLM APIのKVキャッシュヒットを保証するため、 /// 実行時にはこの状態の使用が推奨されます。 /// /// `Worker::unlock()`により[`Mutable`]状態へ戻せますが、 /// キャッシュ保護が解除されることに注意してください。 #[derive(Debug, Clone, Copy, Default)] pub struct CacheLocked; impl private::Sealed for CacheLocked {} impl WorkerState for CacheLocked {}