Skip to main content

telos_agent/tools/builtin/browser/tool_impls/
page.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;
7use crate::tools::browser::tool_impls::require_session;
8use crate::tools::browser::util::*;
9
10pub struct BrowserScrollTool {
11    manager: BrowserManager,
12}
13
14impl BrowserScrollTool {
15    pub fn new(manager: BrowserManager) -> Self {
16        Self { manager }
17    }
18}
19
20#[async_trait]
21impl Tool for BrowserScrollTool {
22    fn definition(&self) -> ToolDefinition {
23        ToolDefinition {
24            name: "BrowserScroll".into(),
25            description: "Scroll the browser page by pixel deltas.".into(),
26            input_schema: json!({
27                "type": "object",
28                "properties": {
29                    "browser_session_id": { "type": "string" },
30                    "delta_x": { "type": "integer", "default": 0 },
31                    "delta_y": { "type": "integer", "default": 600 }
32                }
33            }),
34        }
35    }
36
37    async fn invoke(
38        &self,
39        arguments: Value,
40        context: ToolContext,
41    ) -> Result<ToolOutput, AgentError> {
42        let key = browser_session_key(&arguments, &context);
43        let session = require_session(&self.manager, &key, "BrowserScroll").await?;
44        let mut session = session.lock().await;
45        Ok(ToolOutput::json(session.scroll(&arguments, &context).await?))
46    }
47}
48
49pub struct BrowserBackTool {
50    manager: BrowserManager,
51}
52
53impl BrowserBackTool {
54    pub fn new(manager: BrowserManager) -> Self {
55        Self { manager }
56    }
57}
58
59#[async_trait]
60impl Tool for BrowserBackTool {
61    fn definition(&self) -> ToolDefinition {
62        ToolDefinition {
63            name: "BrowserBack".into(),
64            description: "Go back in the browser session history and return a page summary.".into(),
65            input_schema: json!({
66                "type": "object",
67                "properties": { "browser_session_id": { "type": "string" } }
68            }),
69        }
70    }
71
72    async fn invoke(
73        &self,
74        arguments: Value,
75        context: ToolContext,
76    ) -> Result<ToolOutput, AgentError> {
77        let key = browser_session_key(&arguments, &context);
78        let session = require_session(&self.manager, &key, "BrowserBack").await?;
79        let mut session = session.lock().await;
80        Ok(ToolOutput::json(session.back(&context).await?))
81    }
82}
83
84pub struct BrowserScreenshotTool {
85    manager: BrowserManager,
86}
87
88impl BrowserScreenshotTool {
89    pub fn new(manager: BrowserManager) -> Self {
90        Self { manager }
91    }
92}
93
94#[async_trait]
95impl Tool for BrowserScreenshotTool {
96    fn definition(&self) -> ToolDefinition {
97        ToolDefinition {
98            name: "BrowserScreenshot".into(),
99            description:
100                "Capture a PNG screenshot of the browser page and save it as a workspace artifact."
101                    .into(),
102            input_schema: json!({
103                "type": "object",
104                "properties": { "browser_session_id": { "type": "string" } }
105            }),
106        }
107    }
108
109    async fn invoke(
110        &self,
111        arguments: Value,
112        context: ToolContext,
113    ) -> Result<ToolOutput, AgentError> {
114        let key = browser_session_key(&arguments, &context);
115        let session = require_session(&self.manager, &key, "BrowserScreenshot").await?;
116        let mut session = session.lock().await;
117        Ok(ToolOutput::json(session.screenshot(&context).await?))
118    }
119}