agent_core/controller/session/
manager.rs1use std::collections::HashMap;
4use std::sync::Arc;
5
6use tokio::sync::{mpsc, RwLock};
7use tokio_util::sync::CancellationToken;
8
9use super::config::LLMSessionConfig;
10use super::LLMSession;
11use crate::client::error::LlmError;
12use crate::controller::types::FromLLMPayload;
13
14pub struct LLMSessionManager {
16 sessions: RwLock<HashMap<i64, Arc<LLMSession>>>,
18}
19
20impl LLMSessionManager {
21 pub fn new() -> Self {
23 Self {
24 sessions: RwLock::new(HashMap::new()),
25 }
26 }
27
28 pub async fn create_session(
40 &self,
41 config: LLMSessionConfig,
42 from_llm: mpsc::Sender<FromLLMPayload>,
43 ) -> Result<i64, LlmError> {
44 let cancel_token = CancellationToken::new();
45 let session = Arc::new(LLMSession::new(config, from_llm, cancel_token)?);
46 let session_id = session.id();
47
48 {
50 let mut sessions = self.sessions.write().await;
51 sessions.insert(session_id, Arc::clone(&session));
52 }
53
54 let session_clone = Arc::clone(&session);
56 tokio::spawn(async move {
57 session_clone.start().await;
58 });
59
60 tracing::info!(session_id, "Session created and started");
61 Ok(session_id)
62 }
63
64 pub async fn get_session_by_id(&self, session_id: i64) -> Option<Arc<LLMSession>> {
69 let sessions = self.sessions.read().await;
70 sessions.get(&session_id).cloned()
71 }
72
73 pub async fn remove_session(&self, session_id: i64) -> bool {
81 let session = {
82 let mut sessions = self.sessions.write().await;
83 sessions.remove(&session_id)
84 };
85
86 if let Some(session) = session {
87 session.shutdown();
88 tracing::info!(session_id, "Session removed");
89 true
90 } else {
91 false
92 }
93 }
94
95 pub async fn shutdown(&self) {
98 let sessions: Vec<Arc<LLMSession>> = {
99 let mut sessions = self.sessions.write().await;
100 sessions.drain().map(|(_, s)| s).collect()
101 };
102
103 for session in sessions {
104 session.shutdown();
105 }
106
107 tracing::info!("Session manager shutdown complete");
108 }
109
110 pub async fn session_count(&self) -> usize {
112 let sessions = self.sessions.read().await;
113 sessions.len()
114 }
115}
116
117impl Default for LLMSessionManager {
118 fn default() -> Self {
119 Self::new()
120 }
121}