use anyhow::Result;
use selfware::agent::Agent;
use selfware::config::{AgentConfig, Config, ExecutionMode, SafetyConfig};
#[tokio::main]
async fn main() -> Result<()> {
println!("=== Selfware Run Task Example ===\n");
let config = Config {
endpoint: std::env::var("SELFWARE_ENDPOINT")
.unwrap_or_else(|_| "http://localhost:8000/v1".to_string()),
model: std::env::var("SELFWARE_MODEL")
.unwrap_or_else(|_| "Qwen/Qwen3-Coder-Next-FP8".to_string()),
max_tokens: 65536,
temperature: 0.7,
api_key: std::env::var("SELFWARE_API_KEY")
.ok()
.map(selfware::config::RedactedString::new),
safety: SafetyConfig {
allowed_paths: vec!["./**".to_string()],
denied_paths: vec!["**/.env".to_string(), "**/secrets/**".to_string()],
protected_branches: vec!["main".to_string(), "master".to_string()],
require_confirmation: vec![
"git_push".to_string(),
"file_delete".to_string(),
"shell_exec".to_string(),
],
strict_permissions: false,
permissions: vec![],
},
agent: AgentConfig {
max_iterations: 50,
step_timeout_secs: 300,
token_budget: 500000,
native_function_calling: false,
streaming: true,
..Default::default()
},
execution_mode: ExecutionMode::Yolo,
resources: selfware::config::ResourcesConfig::default(),
yolo: Default::default(),
ui: Default::default(),
continuous_work: Default::default(),
retry: Default::default(),
evolution: Default::default(),
models: Default::default(),
compact_mode: false,
verbose_mode: false,
show_tokens: false,
extra_body: None,
qa: Default::default(),
mcp: Default::default(),
hooks: Vec::new(),
plan_mode: false,
};
println!("Configuration:");
println!(" Endpoint: {}", config.endpoint);
println!(" Model: {}", config.model);
println!(" Mode: {:?}", config.execution_mode);
println!(" Max iterations: {}", config.agent.max_iterations);
println!();
let mut agent = Agent::new(config).await?;
let task = r#"
Create a simple Rust module that implements a basic calculator.
The module should:
1. Create a file called 'calculator.rs' in the current directory
2. Implement add, subtract, multiply, and divide functions
3. Include proper error handling for division by zero
4. Add documentation comments for each function
After creating the file, verify it compiles correctly.
"#;
println!("Running task:\n{}\n", task.trim());
println!("--- Agent Output ---\n");
let start = std::time::Instant::now();
let task_result = agent.run_task(task).await;
let duration = start.elapsed();
if std::path::Path::new("calculator.rs").exists() {
let _ = std::fs::remove_file("calculator.rs");
}
task_result?;
println!("\n--- Task Complete ---");
println!("Duration: {:.2}s", duration.as_secs_f64());
Ok(())
}