//! Session-wide mutable state. use codex_protocol::models::ResponseItem; use crate::conversation_history::ConversationHistory; use crate::protocol::RateLimitSnapshot; use crate::protocol::TokenUsage; use crate::protocol::TokenUsageInfo; /// Persistent, session-scoped state previously stored directly on `Session`. #[derive(Default)] pub(crate) struct SessionState { pub(crate) history: ConversationHistory, pub(crate) token_info: Option, pub(crate) latest_rate_limits: Option, } impl SessionState { /// Create a new session state mirroring previous `State::default()` semantics. pub(crate) fn new() -> Self { Self { history: ConversationHistory::new(), ..Default::default() } } // History helpers pub(crate) fn record_items(&mut self, items: I) where I: IntoIterator, I::Item: std::ops::Deref, { self.history.record_items(items) } pub(crate) fn history_snapshot(&self) -> Vec { self.history.contents() } pub(crate) fn replace_history(&mut self, items: Vec) { self.history.replace(items); } // Token/rate limit helpers pub(crate) fn update_token_info_from_usage( &mut self, usage: &TokenUsage, model_context_window: Option, ) { self.token_info = TokenUsageInfo::new_or_append( &self.token_info, &Some(usage.clone()), model_context_window, ); } pub(crate) fn set_rate_limits(&mut self, snapshot: RateLimitSnapshot) { self.latest_rate_limits = Some(snapshot); } pub(crate) fn token_info_and_rate_limits( &self, ) -> (Option, Option) { (self.token_info.clone(), self.latest_rate_limits.clone()) } // Pending input/approval moved to TurnState. }