autonomous_agent_loop/
autonomous_agent_loop.rs1use anyhow::Result;
2use headless_engine::browser::tab::BrowserTab;
3use headless_engine::network::fingerprint::DeviceProfile;
4
5#[tokio::main]
6async fn main() -> Result<()> {
7 println!("================================================================================");
8 println!(">>> AI AGENTIC AUTONOMOUS BROWSING LOOP (PURE RUST)");
9 println!("================================================================================\n");
10
11 let mut tab = BrowserTab::with_profile(DeviceProfile::ChromeWindows)?;
12
13 println!("[Step 1: Navigate] Agent navigating to Wikipedia Main Page...");
15 tab.navigate("https://en.wikipedia.org/wiki/Main_Page")
16 .await?;
17
18 println!("\n[Step 2: Observe] Extracting Indexed Action Tree for Agent LLM...");
20 let obs = tab.observe().expect("Expected observation");
21 println!(" * Page Title: {}", obs.title);
22 println!(
23 " * Total Interactive Elements Indexed: {}",
24 obs.interactive_elements.len()
25 );
26
27 println!("\n>>> AGENT ACTION MAP (Sample First 10 Elements):");
28 println!("--------------------------------------------------------------------------------");
29 for el in obs.interactive_elements.iter().take(10) {
30 println!("{}", el.to_agent_string());
31 }
32 println!("--------------------------------------------------------------------------------");
33
34 if let Some(target_link) = obs
37 .interactive_elements
38 .iter()
39 .find(|e| e.tag == "a" && e.text.contains("article"))
40 {
41 println!(
42 "\n[Step 3: Act] Agent decides to click element [{}] (Text: \"{}\")...",
43 target_link.index, target_link.text
44 );
45 let action_res = tab.act_click(&target_link.index.to_string()).await?;
46
47 if let Some(report) = action_res {
48 println!(" -> Navigated to: {}", report.final_url);
49 println!(" -> New Page Title: {}", report.page_title);
50 }
51 }
52
53 println!("\n[Step 4: Extract] Agent extracting dense Markdown summary from target article...");
55 let md = tab.extract_markdown(None).unwrap_or_default();
56 println!(" * Extracted Markdown Length: {} bytes", md.len());
57 let preview: String = md.chars().take(400).collect();
58 println!("\n>>> AGENT KNOWLEDGE PREVIEW:\n{}", preview);
59
60 println!("\n================================================================================");
61 println!(">>> AUTONOMOUS AGENT LOOP COMPLETED SEAMLESSLY!");
62 println!("================================================================================");
63
64 Ok(())
65}