Skip to main content

demonstrate_all_features/
demonstrate_all_features.rs

1use anyhow::Result;
2use headless_engine::browser::tab::BrowserTab;
3use headless_engine::network::fingerprint::DeviceProfile;
4use serde_json::json;
5use std::fs;
6use std::path::Path;
7
8#[tokio::main]
9async fn main() -> Result<()> {
10    println!("================================================================================");
11    println!(">>> HEADLESS ENGINE: VERIFYING SCREENSHOT, MARKDOWN & AGENTIC NAVIGATION");
12    println!("================================================================================\n");
13
14    let artifact_dir = Path::new(r"C:\Users\abhis\.gemini\antigravity-ide\brain\c08da294-7846-44b1-9403-559e0d23ce0f");
15    let evidence_dir = Path::new("evidence");
16    fs::create_dir_all(evidence_dir)?;
17    if !artifact_dir.exists() {
18        let _ = fs::create_dir_all(artifact_dir);
19    }
20
21    // Initialize browser with stealth fingerprint
22    let mut tab = BrowserTab::with_profile(DeviceProfile::ChromeWindows)?;
23
24    // =========================================================================
25    // 1. AGENTIC NAVIGATION FEATURE
26    // =========================================================================
27    println!("[1. AGENTIC NAVIGATION] Initial navigation to Wikipedia Portal...");
28    let initial_url = "https://en.wikipedia.org/wiki/Portal:Current_events";
29    let init_report = tab.navigate(initial_url).await?;
30    println!("  -> Landed on: {}", init_report.requested_url);
31    println!("  -> Page Title: {}", init_report.page_title);
32    println!("  -> Status: {}", init_report.status);
33
34    // Extract Agent Action Map / Observation Tree
35    let obs = tab.observe().expect("Expected observation");
36    println!("  -> Total Interactive Elements Indexed: {}", obs.interactive_elements.len());
37
38    // Agent decision: find an informative article link to click
39    let selected_target = obs
40        .interactive_elements
41        .iter()
42        .find(|e| e.tag == "a" && e.text.len() > 15 && !e.href.is_empty() && !e.href.contains("#") && !e.href.contains("Portal:"))
43        .or_else(|| obs.interactive_elements.iter().find(|e| e.tag == "a" && e.text.contains("article")))
44        .or_else(|| obs.interactive_elements.first())
45        .expect("No interactive link found");
46
47    let clicked_index = selected_target.index;
48    let clicked_text = selected_target.text.clone();
49    let clicked_href = selected_target.href.clone();
50    let clicked_selector = selected_target.selector.clone();
51
52    println!("\n  [Agent Decision & Act]");
53    println!("  -> Selected Element ID: [{}]", clicked_index);
54    println!("  -> Element Selector:    {}", clicked_selector);
55    println!("  -> Element Anchor Text: \"{}\"", clicked_text);
56    println!("  -> Target URL:          {}", clicked_href);
57
58    // Execute Autonomous Action Click via element index
59    let nav_report = tab.act_click(&clicked_index.to_string()).await?
60        .expect("Expected navigation report after click");
61
62    println!("\n  [Agent Navigation Result]");
63    println!("  -> Successfully Navigated to: {}", nav_report.final_url);
64    println!("  -> New Page Title:            {}", nav_report.page_title);
65    println!("  -> HTTP Status:               {}", nav_report.status);
66    println!("  -> HTML Payload Size:         {} bytes", nav_report.html_bytes);
67
68    // Save Agent Action Map
69    let sample_elements: Vec<_> = obs.interactive_elements.iter().take(20).cloned().collect();
70    let agent_map_json = json!({
71        "initial_page": {
72            "url": initial_url,
73            "title": init_report.page_title,
74            "interactive_elements_count": obs.interactive_elements.len()
75        },
76        "agent_action": {
77            "clicked_element_index": clicked_index,
78            "anchor_text": clicked_text,
79            "target_href": clicked_href,
80            "selector": clicked_selector
81        },
82        "target_page": {
83            "final_url": nav_report.final_url,
84            "page_title": nav_report.page_title,
85            "status": nav_report.status,
86            "html_bytes": nav_report.html_bytes
87        },
88        "sample_indexed_elements": sample_elements
89    });
90    fs::write(evidence_dir.join("agentic_navigation_trace.json"), serde_json::to_string_pretty(&agent_map_json)?)?;
91    fs::write(artifact_dir.join("agentic_navigation_trace.json"), serde_json::to_string_pretty(&agent_map_json)?)?;
92
93    // =========================================================================
94    // 2. SCREENSHOT FEATURE
95    // =========================================================================
96    println!("\n[2. SCREENSHOT FEATURE] Capturing high-resolution visual screenshot & vector SVG...");
97    let shot = tab.screenshot_async().await.expect("Expected screenshot");
98    println!("  -> Dimensions:        {}x{} px", shot.width, shot.height);
99    println!("  -> Elements Rendered: {}", shot.element_count);
100    println!("  -> SVG Size:          {} bytes", shot.svg.len());
101    println!("  -> PNG Bytes:         {} bytes", shot.png_bytes.len());
102
103    let png_dest_evidence = evidence_dir.join("demonstration_screenshot.png");
104    let png_dest_artifact = artifact_dir.join("demonstration_screenshot.png");
105    let svg_dest_evidence = evidence_dir.join("demonstration_screenshot.svg");
106    let svg_dest_artifact = artifact_dir.join("demonstration_screenshot.svg");
107    let wireframe_dest = evidence_dir.join("demonstration_wireframe.txt");
108
109    if !shot.png_bytes.is_empty() {
110        fs::write(&png_dest_evidence, &shot.png_bytes)?;
111        fs::write(&png_dest_artifact, &shot.png_bytes)?;
112        println!("  -> Saved PNG Screenshot to: {}", png_dest_evidence.display());
113    }
114    fs::write(&svg_dest_evidence, &shot.svg)?;
115    fs::write(&svg_dest_artifact, &shot.svg)?;
116    fs::write(&wireframe_dest, &shot.layout_wireframe)?;
117    println!("  -> Saved SVG Vector Layout to: {}", svg_dest_evidence.display());
118
119    // =========================================================================
120    // 3. MARKDOWN DISTILLATION FEATURE
121    // =========================================================================
122    println!("\n[3. MARKDOWN FEATURE] Extracting token-efficient distilled Markdown for LLMs...");
123    let markdown = tab.extract_markdown(None).unwrap_or_default();
124    let raw_html_len = nav_report.html_bytes;
125    let md_len = markdown.len();
126    let reduction_pct = if raw_html_len > 0 {
127        ((raw_html_len as f64 - md_len as f64) / raw_html_len as f64) * 100.0
128    } else {
129        0.0
130    };
131
132    println!("  -> Raw HTML Payload:      {} bytes (~{} tokens)", raw_html_len, raw_html_len / 4);
133    println!("  -> Distilled Markdown:    {} bytes (~{} tokens)", md_len, md_len / 4);
134    println!("  -> Token/Size Reduction:  {:.2}%", reduction_pct);
135
136    let md_dest_evidence = evidence_dir.join("demonstration_distilled.md");
137    let md_dest_artifact = artifact_dir.join("demonstration_distilled.md");
138    fs::write(&md_dest_evidence, &markdown)?;
139    fs::write(&md_dest_artifact, &markdown)?;
140    println!("  -> Saved Distilled Markdown to: {}", md_dest_evidence.display());
141
142    // Preview Markdown header
143    println!("\n>>> DISTILLED MARKDOWN PREVIEW (FIRST 400 CHARS):");
144    println!("--------------------------------------------------------------------------------");
145    let preview: String = markdown.chars().take(400).collect();
146    println!("{}", preview);
147    println!("--------------------------------------------------------------------------------");
148
149    // Save Complete Evidence Summary
150    let summary = json!({
151        "engine": "Headless Engine (Pure Rust)",
152        "features_tested": {
153            "1_agentic_navigation": {
154                "initial_url": initial_url,
155                "selected_element": {
156                    "id": clicked_index,
157                    "text": clicked_text,
158                    "target_url": clicked_href
159                },
160                "destination_page": {
161                    "url": nav_report.final_url,
162                    "title": nav_report.page_title,
163                    "status": nav_report.status
164                },
165                "status": "PASS"
166            },
167            "2_screenshot": {
168                "png_size_bytes": shot.png_bytes.len(),
169                "svg_size_bytes": shot.svg.len(),
170                "resolution": format!("{}x{}", shot.width, shot.height),
171                "png_file": png_dest_evidence.to_string_lossy(),
172                "svg_file": svg_dest_evidence.to_string_lossy(),
173                "status": "PASS"
174            },
175            "3_markdown_distillation": {
176                "raw_html_bytes": raw_html_len,
177                "markdown_bytes": md_len,
178                "reduction_percentage": format!("{:.2}%", reduction_pct),
179                "markdown_file": md_dest_evidence.to_string_lossy(),
180                "status": "PASS"
181            }
182        }
183    });
184
185    fs::write(evidence_dir.join("demonstration_summary.json"), serde_json::to_string_pretty(&summary)?)?;
186    fs::write(artifact_dir.join("demonstration_summary.json"), serde_json::to_string_pretty(&summary)?)?;
187
188    println!("\n================================================================================");
189    println!(">>> ALL 3 FEATURES SUCCESSFULLY DEMONSTRATED AND EVIDENCE ARTIFACTS SAVED!");
190    println!("================================================================================");
191
192    Ok(())
193}