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