gigacode 0.4.0

Sandbox Agent CLI with OpenCode attach by default
use clap::Parser;
use sandbox_agent::cli::{
    init_logging, run_command, CliConfig, CliError, Command, GigacodeCli, OpencodeArgs,
};

fn main() {
    if let Err(err) = run() {
        tracing::error!(error = %err, "gigacode failed");
        std::process::exit(1);
    }
}

fn run() -> Result<(), CliError> {
    let started = std::time::Instant::now();
    let cli = GigacodeCli::parse();
    let config = CliConfig {
        token: cli.token,
        no_token: cli.no_token,
        gigacode: true,
    };
    let yolo = cli.yolo;
    let command = match cli.command {
        Some(Command::Opencode(mut args)) => {
            args.yolo = args.yolo || yolo;
            Command::Opencode(args)
        }
        Some(other) => other,
        None => {
            let mut args = OpencodeArgs::default();
            args.yolo = yolo;
            Command::Opencode(args)
        }
    };
    if let Err(err) = init_logging(&command) {
        eprintln!("failed to init logging: {err}");
        return Err(err);
    }
    tracing::info!(
        command = ?command,
        startup_ms = started.elapsed().as_millis() as u64,
        "gigacode.run: command starting"
    );
    let command_started = std::time::Instant::now();
    let result = run_command(&command, &config);
    tracing::info!(
        command = ?command,
        command_ms = command_started.elapsed().as_millis() as u64,
        total_ms = started.elapsed().as_millis() as u64,
        "gigacode.run: command exited"
    );
    result
}