webterm_agent/models/
session.rs

1use crate::models::activity::Activity;
2use crate::models::agent_error::AgentError;
3use crate::models::frontend::Frontend;
4use crate::models::session_registry::SessionRegistry;
5use std::collections::HashMap;
6use std::sync::Arc;
7use tokio::sync::{Mutex, RwLock};
8use webterm_core::types::{ActivityId, SessionId};
9
10pub struct Session {
11    session_id: SessionId,
12    activities: RwLock<HashMap<ActivityId, Arc<Activity>>>,
13    current_frontend: Option<Arc<Mutex<Frontend>>>,
14}
15
16impl Session {
17    pub fn new() -> Self {
18        let session_id = SessionRegistry::next_session_id();
19
20        Self {
21            session_id,
22            activities: RwLock::new(HashMap::new()),
23            current_frontend: None,
24        }
25    }
26
27    pub fn session_id(&self) -> SessionId {
28        self.session_id
29    }
30
31    pub fn set_current_frontend(&mut self, frontend: Arc<Mutex<Frontend>>) {
32        self.current_frontend = Some(frontend);
33    }
34
35    pub fn current_frontend(&self) -> Result<Arc<Mutex<Frontend>>, AgentError> {
36        Ok(self
37            .current_frontend
38            .as_ref()
39            .ok_or(AgentError::RuntimeError(
40                "Current frontend is not set".to_string(),
41            ))?
42            .clone())
43    }
44
45    pub async fn get_activity(
46        &self,
47        activity_id: &ActivityId,
48    ) -> Result<Arc<Activity>, AgentError> {
49        let activity = self
50            .activities
51            .read()
52            .await
53            .get(activity_id)
54            .ok_or(AgentError::RuntimeError(format!(
55                "Activity {:?} not found",
56                activity_id
57            )))?
58            .clone();
59
60        Ok(activity)
61    }
62
63    pub async fn create_terminal_activity(&self) -> Result<Arc<Activity>, AgentError> {
64        let activity = Activity::create_pty(self.session_id).await?;
65        self.add_activity(activity.clone()).await;
66        Ok(activity)
67    }
68
69    pub async fn add_activity(&self, activity: Arc<Activity>) {
70        self.activities
71            .write()
72            .await
73            .insert(activity.activity_id(), activity.clone());
74    }
75}