complete_demo/
complete_demo.rs

1/// Complete Demo: All New Features
2///
3/// This example demonstrates all three new features working together:
4/// 1. Streaming for local models
5/// 2. File management tools
6/// 3. Session memory
7
8use helios_engine::{Agent, Config, FileSearchTool, FileReadTool, FileEditTool, FileWriteTool};
9use std::io::{self, Write};
10
11#[tokio::main]
12async fn main() -> helios_engine::Result<()> {
13    println!("šŸš€ Helios Engine - Complete Feature Demo");
14    println!("=========================================\n");
15
16    // Load configuration
17    let config = Config::from_file("config.toml").unwrap_or_else(|_| {
18        println!("⚠ No config.toml found, using default configuration");
19        Config::new_default()
20    });
21
22    // Create agent with all file tools
23    println!("šŸ“¦ Creating agent with file tools...");
24    let mut agent = Agent::builder("SmartAssistant")
25        .config(config)
26        .system_prompt(
27            "You are an intelligent assistant with file management capabilities. \
28             You can search files, read them, and make edits. Always explain what \
29             you're doing and track important information in session memory."
30        )
31        .tool(Box::new(FileSearchTool))
32        .tool(Box::new(FileReadTool))
33        .tool(Box::new(FileEditTool))
34        .tool(Box::new(FileWriteTool))
35        .max_iterations(10)
36        .build()
37        .await?;
38
39    println!("āœ“ Agent created successfully!\n");
40
41    // Initialize session memory
42    println!("🧠 Initializing session memory...");
43    agent.set_memory("session_start", chrono::Utc::now().to_rfc3339());
44    agent.set_memory("working_directory", std::env::current_dir()?.display().to_string());
45    agent.set_memory("files_accessed", "0");
46    agent.set_memory("edits_made", "0");
47    println!("āœ“ Session memory initialized\n");
48
49    // Demo 1: Search for files with streaming response
50    println!("Demo 1: File Search with Streaming");
51    println!("===================================");
52    println!("User: Find all Rust example files\n");
53    
54    print!("Agent: ");
55    io::stdout().flush()?;
56
57    let response1 = agent.chat("Find all Rust example files in the examples directory").await?;
58    println!("{}\n", response1);
59
60    // Update memory
61    let files_accessed = agent.get_memory("files_accessed")
62        .and_then(|v| v.parse::<u32>().ok())
63        .unwrap_or(0);
64    agent.set_memory("files_accessed", (files_accessed + 1).to_string());
65    agent.set_memory("last_action", "file_search");
66
67    // Demo 2: Read a file
68    println!("\nDemo 2: Reading File Contents");
69    println!("==============================");
70    println!("User: Read the NEW_FEATURES.md file and summarize the key points\n");
71    
72    print!("Agent: ");
73    io::stdout().flush()?;
74
75    let response2 = agent.chat("Read the NEW_FEATURES.md file and give me a brief summary of what's new").await?;
76    println!("{}\n", response2);
77
78    // Update memory
79    let files_accessed = agent.get_memory("files_accessed")
80        .and_then(|v| v.parse::<u32>().ok())
81        .unwrap_or(0);
82    agent.set_memory("files_accessed", (files_accessed + 1).to_string());
83    agent.set_memory("last_action", "file_read");
84
85    // Demo 3: Show session summary
86    println!("\nDemo 3: Session Summary");
87    println!("=======================\n");
88    println!("{}", agent.get_session_summary());
89
90    // Demo 4: Interactive mode
91    println!("\n\nDemo 4: Interactive Mode");
92    println!("========================");
93    println!("You can now interact with the agent. Type 'exit' to quit.\n");
94
95    loop {
96        print!("\nYou: ");
97        io::stdout().flush()?;
98
99        let mut input = String::new();
100        io::stdin().read_line(&mut input)?;
101        let input = input.trim();
102
103        if input.is_empty() {
104            continue;
105        }
106
107        match input.to_lowercase().as_str() {
108            "exit" | "quit" => {
109                println!("\nšŸ‘‹ Goodbye!");
110                break;
111            }
112            "summary" => {
113                println!("\nšŸ“Š Session Summary:");
114                println!("{}", agent.get_session_summary());
115                continue;
116            }
117            "memory" => {
118                println!("\n🧠 Session Memory:");
119                if let Some(start) = agent.get_memory("session_start") {
120                    println!("  Session started: {}", start);
121                }
122                if let Some(dir) = agent.get_memory("working_directory") {
123                    println!("  Working directory: {}", dir);
124                }
125                if let Some(files) = agent.get_memory("files_accessed") {
126                    println!("  Files accessed: {}", files);
127                }
128                if let Some(edits) = agent.get_memory("edits_made") {
129                    println!("  Edits made: {}", edits);
130                }
131                if let Some(action) = agent.get_memory("last_action") {
132                    println!("  Last action: {}", action);
133                }
134                continue;
135            }
136            "help" => {
137                println!("\nšŸ“– Available Commands:");
138                println!("  exit, quit  - Exit the demo");
139                println!("  summary     - Show session summary");
140                println!("  memory      - Show session memory");
141                println!("  help        - Show this help");
142                println!("\nšŸ’” Try asking the agent to:");
143                println!("  • Search for specific files");
144                println!("  • Read file contents");
145                println!("  • Summarize what it has done");
146                continue;
147            }
148            _ => {}
149        }
150
151        // Send message to agent with streaming
152        print!("\nAgent: ");
153        io::stdout().flush()?;
154
155        match agent.chat(input).await {
156            Ok(response) => {
157                println!("{}", response);
158                
159                // Update memory after each interaction
160                let files_accessed = agent.get_memory("files_accessed")
161                    .and_then(|v| v.parse::<u32>().ok())
162                    .unwrap_or(0);
163                agent.set_memory("files_accessed", (files_accessed + 1).to_string());
164            }
165            Err(e) => {
166                eprintln!("\nāŒ Error: {}", e);
167            }
168        }
169    }
170
171    // Final summary
172    println!("\nšŸ“Š Final Session Summary:");
173    println!("{}", agent.get_session_summary());
174
175    println!("\nāœ… Demo completed successfully!");
176    println!("\nšŸ’” Features Demonstrated:");
177    println!("  āœ“ Streaming responses (local/remote models)");
178    println!("  āœ“ File search with pattern matching");
179    println!("  āœ“ File reading with summaries");
180    println!("  āœ“ Session memory tracking");
181    println!("  āœ“ Interactive conversation");
182    println!("  āœ“ Real-time progress updates");
183
184    Ok(())
185}