Skip to main content

telos_agent/tools/builtin/browser/tool_impls/
state.rs

1use async_trait::async_trait;
2use serde_json::{Value, json};
3
4use crate::error::AgentError;
5use crate::tools::api::{Tool, ToolContext, ToolDefinition, ToolOutput};
6use crate::tools::browser::manager::{BrowserManager, SharedSession};
7use crate::tools::browser::util::*;
8
9pub struct BrowserStateTool {
10    manager: BrowserManager,
11}
12
13impl BrowserStateTool {
14    pub fn new(manager: BrowserManager) -> Self {
15        Self { manager }
16    }
17}
18
19#[async_trait]
20impl Tool for BrowserStateTool {
21    fn definition(&self) -> ToolDefinition {
22        ToolDefinition {
23            name: "BrowserState".into(),
24            description: "Return visible page text, scroll state, and indexed interactive elements for the browser session.".into(),
25            input_schema: json!({
26                "type": "object",
27                "properties": { "browser_session_id": { "type": "string" } }
28            }),
29        }
30    }
31
32    async fn invoke(
33        &self,
34        arguments: Value,
35        context: ToolContext,
36    ) -> Result<ToolOutput, AgentError> {
37        let key = browser_session_key(&arguments, &context);
38        let session = self.require_session(&key).await?;
39        let mut session = session.lock().await;
40        Ok(ToolOutput::json(session.state(&context).await?))
41    }
42}
43
44impl BrowserStateTool {
45    async fn require_session(&self, key: &str) -> Result<SharedSession, AgentError> {
46        self.manager.get(key).await.ok_or_else(|| AgentError::ToolExecution {
47            tool: "BrowserState".into(),
48            message: "no browser session found; call BrowserNavigate or BrowserStart first".into(),
49        })
50    }
51}