scv-cli 0.1.0

A small, extensible terminal agent runtime with a TUI and headless server
use anyhow::Result;
use clap::{Parser, ValueEnum};
use scv_server::{ApprovalPolicy, ConfigOverrides};

#[derive(Parser)]
#[command(name = "scv-server", version, about = "SCV stdio agent server")]
struct Cli {
    #[arg(long, default_value_t = true)]
    stdio: bool,
    #[arg(long)]
    model: Option<String>,
    #[arg(long)]
    base_url: Option<String>,
    #[arg(long, value_enum)]
    approval_policy: Option<ApprovalArg>,
}

#[derive(Clone, Copy, ValueEnum)]
enum ApprovalArg {
    OnRisk,
    Always,
    Never,
}

impl From<ApprovalArg> for ApprovalPolicy {
    fn from(value: ApprovalArg) -> Self {
        match value {
            ApprovalArg::OnRisk => Self::OnRisk,
            ApprovalArg::Always => Self::Always,
            ApprovalArg::Never => Self::Never,
        }
    }
}

#[tokio::main]
async fn main() -> Result<()> {
    let cli = Cli::parse();
    if !cli.stdio {
        anyhow::bail!("v0.1 supports only --stdio");
    }
    let filter = tracing_subscriber::EnvFilter::try_from_default_env()
        .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("warn"));
    let _ = tracing_subscriber::fmt()
        .with_env_filter(filter)
        .with_writer(std::io::stderr)
        .try_init();
    scv_server::run_stdio(ConfigOverrides {
        model: cli.model,
        base_url: cli.base_url,
        approval_policy: cli.approval_policy.map(Into::into),
    })
    .await
}