mod cmd;
mod demo_agents;
mod gui;
use std::path::PathBuf;
use clap::{Parser, Subcommand};
use cmd::{
cmd_config, cmd_eval, cmd_init, cmd_learn, cmd_llama, cmd_lora, cmd_open, cmd_profile, cmd_run,
LearnAction, LlamaAction, LoraAction, OpenTarget, ProfileAction,
};
use gui::run_gui;
#[derive(Parser)]
#[command(name = "swarm-engine")]
#[command(about = "SwarmEngine - High-throughput Agent Swarm Engine")]
#[command(version)]
struct Cli {
#[arg(long)]
gui: bool,
#[command(subcommand)]
command: Option<Commands>,
}
#[derive(Subcommand)]
enum Commands {
Init {
#[arg(long)]
project: bool,
},
Config,
Open {
target: OpenTarget,
},
Run {
task: String,
#[arg(short, long)]
scenario: PathBuf,
#[arg(short = 'd', long)]
dir: Option<PathBuf>,
#[arg(short = 'e', long)]
env: Option<String>,
#[arg(short = 'n', long)]
max_ticks: Option<u64>,
#[arg(short, long)]
verbose: bool,
#[arg(long)]
variant: Option<String>,
#[arg(long)]
no_learning: bool,
#[arg(long)]
no_dep_graph: bool,
#[arg(long = "set", value_name = "KEY=VALUE")]
overrides: Vec<String>,
#[arg(long)]
profile: Option<String>,
#[arg(long, default_value = "smart")]
provider: String,
},
Eval {
scenario: PathBuf,
#[arg(short = 'n', long, default_value = "1")]
runs: usize,
#[arg(short, long, default_value = "42")]
seed: u64,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(long)]
output_dir: Option<PathBuf>,
#[arg(long)]
no_log: bool,
#[arg(short, long)]
verbose: bool,
#[arg(long)]
variant: Option<String>,
#[arg(long)]
list_variants: bool,
#[arg(long)]
no_learning: bool,
#[arg(long, default_value = "smart")]
provider: String,
},
Llama {
#[command(subcommand)]
action: LlamaAction,
},
Learn {
#[command(subcommand)]
action: LearnAction,
},
Lora {
#[command(subcommand)]
action: LoraAction,
},
Profile {
#[command(subcommand)]
action: ProfileAction,
},
}
fn main() {
let cli = Cli::parse();
if cli.gui {
run_gui();
return;
}
match cli.command {
Some(Commands::Init { project }) => cmd_init(project),
Some(Commands::Config) => cmd_config(),
Some(Commands::Open { target }) => cmd_open(target),
Some(Commands::Run {
task,
scenario,
dir,
env,
max_ticks,
verbose,
variant,
no_learning,
no_dep_graph,
overrides,
profile,
provider,
}) => cmd_run(
task,
scenario,
dir,
env,
max_ticks,
verbose,
variant,
!no_learning,
no_dep_graph,
overrides,
profile,
&provider,
),
Some(Commands::Eval {
scenario,
runs,
seed,
output,
output_dir,
no_log,
verbose,
variant,
list_variants,
no_learning,
provider,
}) => cmd_eval(
scenario,
runs,
seed,
output,
output_dir,
no_log,
verbose,
variant,
list_variants,
!no_learning, &provider,
),
Some(Commands::Llama { action }) => cmd_llama(action),
Some(Commands::Learn { action }) => cmd_learn(action),
Some(Commands::Lora { action }) => cmd_lora(action),
Some(Commands::Profile { action }) => cmd_profile(action),
None => {
println!("SwarmEngine - High-throughput Agent Swarm Engine\n");
println!("Usage: swarm-engine [OPTIONS] <COMMAND>\n");
println!("Commands:");
println!(" playground Iterative learning loop (eval → train → reload)");
println!(" eval Run evaluation scenario");
println!(" profile Manage ScenarioProfiles (add, list, bootstrap, delete)");
println!(" learn Run offline learning on collected data");
println!(" lora LoRA fine-tuning tools (setup, train, convert)");
println!(" llama Manage llama-server (start, stop, logs, status)");
println!(" init Initialize SwarmEngine directories and config");
println!(" config Show current configuration");
println!(" open Open a directory in file manager");
println!();
println!("Options:");
println!(" --gui Launch desktop GUI");
println!(" --help Print help");
println!();
println!("Examples:");
println!(" swarm-engine --gui");
println!(" swarm-engine playground scenario.toml -n 20 --train-every 5");
println!(" swarm-engine eval scenarios/troubleshooting.toml -n 5");
println!(" swarm-engine learn \"Service Troubleshooting\" -n 10");
println!(" swarm-engine lora setup && swarm-engine lora train");
println!(" swarm-engine llama start -m model.gguf");
}
}
}