PicoBot/src/gateway/session_factory.rs

66 lines
1.8 KiB
Rust

use std::sync::Arc;
use tokio::sync::mpsc;
use crate::agent::AgentError;
use crate::config::LLMProviderConfig;
use crate::protocol::WsOutbound;
use crate::skills::SkillRuntime;
use crate::storage::{ConversationRepository, SkillEventRepository};
use super::agent_factory::AgentFactory;
use super::prompt_injector::PromptInjector;
use super::session::Session;
#[derive(Clone)]
pub(crate) struct SessionFactory {
provider_config: LLMProviderConfig,
skills: Arc<SkillRuntime>,
agent_factory: AgentFactory,
prompt_injector: PromptInjector,
conversations: Arc<dyn ConversationRepository>,
skill_events: Arc<dyn SkillEventRepository>,
chat_history_ttl_hours: Option<u64>,
}
impl SessionFactory {
pub(crate) fn new(
provider_config: LLMProviderConfig,
skills: Arc<SkillRuntime>,
agent_factory: AgentFactory,
prompt_injector: PromptInjector,
conversations: Arc<dyn ConversationRepository>,
skill_events: Arc<dyn SkillEventRepository>,
chat_history_ttl_hours: Option<u64>,
) -> Self {
Self {
provider_config,
skills,
agent_factory,
prompt_injector,
conversations,
skill_events,
chat_history_ttl_hours,
}
}
pub(crate) async fn create(
&self,
channel_name: impl Into<String>,
user_tx: mpsc::Sender<WsOutbound>,
) -> Result<Session, AgentError> {
Session::with_factories(
channel_name.into(),
self.provider_config.clone(),
user_tx,
self.skills.clone(),
self.agent_factory.clone(),
self.prompt_injector.clone(),
self.conversations.clone(),
self.skill_events.clone(),
self.chat_history_ttl_hours,
)
.await
}
}