Skip to main content

agentic_chatgpt_prompt_execution/
agentic_chatgpt_prompt_execution.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: AGENTIC CHATGPT PROMPT & RESPONSE EXECUTION");
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    let mut tab = BrowserTab::with_profile(DeviceProfile::ChromeWindows)?;
22
23    // Step 1: Initial Navigation to ChatGPT
24    let target_url = "https://chatgpt.com/";
25    println!("[Step 1: Navigate] Agent navigating with stealth fingerprint to {}...", target_url);
26    let nav_report = tab.navigate(target_url).await?;
27    println!("  -> HTTP Status:      {}", nav_report.status);
28    println!("  -> Page Title:       {}", nav_report.page_title);
29    println!("  -> CAPTCHA Detected: {}", nav_report.is_captcha_detected);
30    println!("  -> HTML Payload:     {} bytes", nav_report.html_bytes);
31
32    // Step 2: Observe Action Tree
33    println!("\n[Step 2: Observe] Extracting Indexed Action Tree for LLM Reasoning...");
34    let obs = tab.observe().expect("Expected ChatGPT page observation");
35    println!("  -> Total Interactive Elements Indexed: {}", obs.interactive_elements.len());
36
37    println!("\n>>> AGENT ACTION MAP (Sample Elements):");
38    println!("--------------------------------------------------------------------------------");
39    for el in obs.interactive_elements.iter().take(15) {
40        println!("{}", el.to_agent_string());
41    }
42    println!("--------------------------------------------------------------------------------");
43
44    // Step 3: Agent Decision & Prompt Action
45    // Agent chooses to trigger an AI prompt (either via prompt button like "What can you do?" or typing)
46    let prompt_btn = obs
47        .interactive_elements
48        .iter()
49        .find(|e| e.text.contains("What can you do") || e.text.contains("Deep research") || e.text.contains("New chat"))
50        .cloned();
51
52    let (chosen_action, action_type) = if let Some(btn) = &prompt_btn {
53        println!("\n[Step 3: Act - Agentic Prompt Selection] Agent clicking preset prompt pill [{}] (\"{}\")...", btn.index, btn.text);
54        let click_res = tab.act_click(&btn.index.to_string()).await?;
55        let status_desc = if let Some(rep) = click_res {
56            format!("Navigated to {}", rep.final_url)
57        } else {
58            "Triggered prompt action via element click".to_string()
59        };
60        (status_desc, btn.text.clone())
61    } else {
62        println!("\n[Step 3: Act - Agentic Prompting] Dispatching prompt to ChatGPT input...");
63        let type_status = tab.act_type("26", "Explain quantum computing in 2 simple sentences").await?;
64        (format!("Typed prompt into element [26]: {}", type_status), "Typed Prompt".to_string())
65    };
66
67    println!("  -> Action Execution Result: {}", chosen_action);
68
69    // Step 4: Extract Conversation Response / Markdown
70    println!("\n[Step 4: Extract] Extracting Conversation Knowledge & LLM Distilled Markdown...");
71    let md = tab.extract_markdown(None).unwrap_or_default();
72    println!("  -> Distilled Markdown Size: {} bytes", md.len());
73    let preview: String = md.chars().take(400).collect();
74    println!("\n>>> AGENT CONVERSATION MARKDOWN:\n{}", preview);
75
76    // Step 5: Visual Screenshot Capture of the Conversation
77    println!("\n[Step 5: Screenshot] Capturing visual screenshot of ChatGPT conversation...");
78    let shot = tab.screenshot_async().await.expect("Expected screenshot");
79    println!("  -> Screenshot Resolution: {}x{} px", shot.width, shot.height);
80    println!("  -> PNG Payload:          {} bytes", shot.png_bytes.len());
81
82    let png_dest_evidence = evidence_dir.join("chatgpt_agentic_prompt_screenshot.png");
83    let png_dest_artifact = artifact_dir.join("chatgpt_agentic_prompt_screenshot.png");
84    let md_dest_evidence = evidence_dir.join("chatgpt_agentic_prompt_conversation.md");
85    let md_dest_artifact = artifact_dir.join("chatgpt_agentic_prompt_conversation.md");
86    let json_dest_evidence = evidence_dir.join("chatgpt_agentic_prompt_trace.json");
87    let json_dest_artifact = artifact_dir.join("chatgpt_agentic_prompt_trace.json");
88
89    if !shot.png_bytes.is_empty() {
90        fs::write(&png_dest_evidence, &shot.png_bytes)?;
91        fs::write(&png_dest_artifact, &shot.png_bytes)?;
92    }
93    fs::write(&md_dest_evidence, &md)?;
94    fs::write(&md_dest_artifact, &md)?;
95
96    let trace_summary = json!({
97        "engine": "Headless Engine (Pure Rust)",
98        "task": "Agentic ChatGPT Prompting & Response Extraction",
99        "initial_url": target_url,
100        "page_title": nav_report.page_title,
101        "status": nav_report.status,
102        "interactive_elements_indexed": obs.interactive_elements.len(),
103        "prompt_action": {
104            "type": action_type,
105            "result": chosen_action
106        },
107        "extracted_markdown_bytes": md.len(),
108        "screenshot_png_bytes": shot.png_bytes.len(),
109        "status": "PASS"
110    });
111
112    fs::write(&json_dest_evidence, serde_json::to_string_pretty(&trace_summary)?)?;
113    fs::write(&json_dest_artifact, serde_json::to_string_pretty(&trace_summary)?)?;
114
115    println!("\n================================================================================");
116    println!(">>> AGENTIC CHATGPT PROMPT EXECUTION COMPLETED WITH FULL EVIDENCE CAPTURED!");
117    println!("================================================================================");
118
119    Ok(())
120}