1mod args;
2mod logging;
3mod output;
4mod task;
5
6use std::env;
7use std::sync::Arc;
8
9use crate::config::build_vv_llm_from_local_settings;
10use crate::runtime::AgentRuntime;
11use crate::workspace::LocalWorkspaceBackend;
12
13pub use self::args::{parse_cli_args_from, parse_cli_args_from_with_default_settings, CliArgs};
14use self::logging::build_cli_log_handler;
15pub use self::output::result_payload;
16use self::task::generate_task_id;
17pub use self::task::{build_cli_task, build_cli_task_from_resolved};
18
19pub fn main() -> Result<(), String> {
20 let raw_args = env::args().collect::<Vec<_>>();
21 if raw_args
22 .iter()
23 .skip(1)
24 .any(|arg| matches!(arg.as_str(), "--help" | "-h"))
25 {
26 println!("{}", args::help_text());
27 return Ok(());
28 }
29 let args = parse_cli_args_from(raw_args)?;
30 let (llm, resolved) =
31 build_vv_llm_from_local_settings(&args.settings_file, &args.backend, &args.model, 90.0)
32 .map_err(|err| err.to_string())?;
33
34 let mut runtime = AgentRuntime::new(llm)
35 .with_settings_file(args.settings_file.clone())
36 .with_default_backend(args.backend.clone());
37 runtime.default_workspace = Some(args.workspace.clone());
38 runtime.workspace_backend = Arc::new(LocalWorkspaceBackend::new(args.workspace.clone()));
39 runtime.log_handler = build_cli_log_handler(args.verbose);
40
41 let task = build_cli_task_from_resolved(&args, &resolved, generate_task_id())?;
42 let result = runtime.run(task).map_err(|err| err.to_string())?;
43 let payload = result_payload(&result, &resolved);
44 let output = serde_json::to_string_pretty(&payload).map_err(|err| err.to_string())?;
45 println!("{output}");
46 Ok(())
47}