webterm_agent/models/
session.rs1use 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}