wardn 0.3.0

Credential isolation proxy — agents never see real API keys
Documentation
use std::path::Path;

use anyhow::{bail, Context, Result};

use wardn::config::WardenConfig;
use wardn::daemon::{Daemon, DaemonConfig};
use wardn::Vault;

use super::ServeArgs;

pub async fn run(args: &ServeArgs, vault_path: &Path, config_path: Option<&Path>) -> Result<()> {
    if args.mcp && args.agent.is_none() {
        bail!("--agent is required when --mcp is set");
    }

    let passphrase = if let Ok(pass) = std::env::var("WARDN_PASSPHRASE") {
        tracing::warn!("using passphrase from WARDN_PASSPHRASE env var");
        pass
    } else {
        rpassword::prompt_password("Passphrase: ")
            .context("failed to read passphrase")?
    };

    let vault = Vault::open(vault_path, &passphrase)?;

    let warden_config = match config_path {
        Some(p) => WardenConfig::load(p)?,
        None => WardenConfig::default(),
    };

    let daemon_config = DaemonConfig {
        host: args.host.clone(),
        port: args.port,
        warden_config,
    };

    let daemon = Daemon::new(vault, daemon_config);

    if args.mcp {
        let agent_id = args.agent.clone().unwrap();
        daemon.serve_all(agent_id).await?;
    } else {
        daemon.serve_proxy().await?;
    }

    Ok(())
}