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