use std::collections::HashMap;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::{broadcast, RwLock};
use bamboo_agent_core::storage::Storage;
use bamboo_agent_core::{AgentEvent, Session};
use bamboo_domain::ProviderModelRef;
use bamboo_llm::{Config, LLMError, LLMProvider, ProviderRegistry};
use bamboo_storage::LockedSessionStore;
use crate::events::AccountEventSink;
use crate::runtime::execution::runner_state::AgentRunner;
#[cfg(test)]
#[path = "app_context/model_routing_test_support.rs"]
pub(crate) mod model_routing_test_support;
#[async_trait]
pub trait AgentSessionContext: Send + Sync {
fn sessions(&self) -> &crate::SessionCache;
fn storage(&self) -> &Arc<dyn Storage>;
fn persistence(&self) -> &Arc<LockedSessionStore>;
fn agent_runners(&self) -> &Arc<RwLock<HashMap<String, AgentRunner>>>;
fn account_sink(&self) -> &Arc<AccountEventSink>;
fn config(&self) -> &Arc<RwLock<Config>>;
fn provider_registry(&self) -> &Arc<ProviderRegistry>;
async fn get_session_event_sender(&self, session_id: &str) -> broadcast::Sender<AgentEvent>;
async fn load_session_merged(&self, session_id: &str) -> Option<Session>;
async fn save_and_cache_session(&self, session: &mut Session);
async fn get_provider(&self) -> Arc<dyn LLMProvider>;
fn get_provider_for_model_ref(&self, target: &ProviderModelRef)
-> Option<Arc<dyn LLMProvider>>;
fn get_provider_for_model_ref_with_config(
&self,
_config: &Config,
target: &ProviderModelRef,
) -> Result<Option<Arc<dyn LLMProvider>>, LLMError> {
Ok(self.get_provider_for_model_ref(target))
}
fn resolve_provider_ref_under_config_lock(&self) -> bool {
false
}
async fn get_provider_for_endpoint(&self, provider_name: &str) -> Option<Arc<dyn LLMProvider>>;
fn title_gen_acquire(&self, session_id: &str) -> bool;
fn title_gen_release(&self, session_id: &str);
}