telos_agent/tools/builtin/browser/
manager.rs1use 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}