Skip to main content

telos_agent/tools/builtin/browser/
manager.rs

1use std::collections::HashMap;
2use std::sync::Arc;
3
4use serde_json::Value;
5use tokio::sync::Mutex;
6
7use super::session::BrowserSession;
8use super::util::{browser_session_key, optional_string_array};
9use crate::error::AgentError;
10use crate::tools::api::ToolContext;
11
12pub(super) type SharedSession = Arc<Mutex<BrowserSession>>;
13
14#[derive(Clone, Default)]
15pub struct BrowserManager {
16    sessions: Arc<Mutex<HashMap<String, SharedSession>>>,
17}
18
19impl BrowserManager {
20    pub fn new() -> Self {
21        Self::default()
22    }
23
24    pub(super) async fn get(&self, key: &str) -> Option<SharedSession> {
25        self.sessions.lock().await.get(key).cloned()
26    }
27
28    pub(super) async fn start_or_update(
29        &self,
30        arguments: &Value,
31        context: &ToolContext,
32    ) -> Result<(String, SharedSession, bool), AgentError> {
33        let key = browser_session_key(arguments, context);
34        let allowed_domains = optional_string_array(arguments, "allowed_domains")?;
35        let prohibited_domains = optional_string_array(arguments, "prohibited_domains")?;
36
37        if let Some(session) = self.get(&key).await {
38            {
39                let mut session = session.lock().await;
40                if let Some(domains) = allowed_domains {
41                    session.allowed_domains = domains;
42                }
43                if let Some(domains) = prohibited_domains {
44                    session.prohibited_domains = domains;
45                }
46            }
47            return Ok((key, session, false));
48        }
49
50        let session = BrowserSession::start(&key, arguments, context).await?;
51        let shared = Arc::new(Mutex::new(session));
52        self.sessions.lock().await.insert(key.clone(), shared.clone());
53        Ok((key, shared, true))
54    }
55
56    pub(super) async fn remove(&self, key: &str) -> Option<SharedSession> {
57        self.sessions.lock().await.remove(key)
58    }
59}