navi-cli 0.3.5

Local agentic engine and terminal-first coding agent.
use anyhow::Result;
use navi_browser::{BrowserRuntimeConfig, doctor_report};
use navi_core::LoadedConfig;

pub async fn handle_browser_command(
    action: crate::BrowserAction,
    loaded_config: &LoadedConfig,
) -> Result<()> {
    let c = &loaded_config.config.browser;
    let runtime = BrowserRuntimeConfig {
        enabled: c.enabled,
        backend: c.backend.clone(),
        cdp_url: c.cdp_url.clone(),
        headless: c.headless,
        allow_private_network: c.allow_private_network,
        proxy: c.proxy.clone(),
        timeout_ms: c.timeout_ms,
        binary_path: c.binary_path.clone(),
        humanize: c.humanize,
    };

    match action {
        crate::BrowserAction::Doctor => {
            let report = doctor_report(&runtime);
            println!("{}", serde_json::to_string_pretty(&report)?);
            if let Some(hints) = report.get("hints").and_then(|h| h.as_array()) {
                if !hints.is_empty() {
                    println!();
                    println!("Hints:");
                    for h in hints {
                        if let Some(s) = h.as_str() {
                            println!("  - {s}");
                        }
                    }
                }
            }
        }
        crate::BrowserAction::Install => {
            println!("Browser backends for the NAVI `browser` tool:\n");
            println!("  1) CloakBrowser Rust client (preferred) — PR #438");
            println!("     Build NAVI with the engine feature:");
            println!("       cargo run -p navi-cli --features browser-cloak");
            println!("     Point navi-browser at your checkout (default path in Cargo.toml):");
            println!("       lab/CloakBrowser-rust/rust/cloakbrowser");
            println!("     First use downloads the stealth Chromium binary (~200MB).");
            println!("     See crates/navi-browser/INTEGRATION.md\n");
            println!("  2) CDP fallback (feature cdp-fallback, default without browser-cloak)");
            println!("     - Google Chrome / Chromium, or:");
            println!("       docker run -d -p 127.0.0.1:9222:9222 cloakhq/cloakbrowser cloakserve");
            println!("       # [browser] backend = \"cdp\", cdp_url = \"http://127.0.0.1:9222\"");
            println!();
            println!("  Then run: navi browser doctor");
        }
        crate::BrowserAction::Status => {
            let report = doctor_report(&runtime);
            println!("Browser tool");
            println!("  enabled: {}", runtime.enabled);
            println!("  backend: {}", runtime.backend);
            println!("  headless: {}", runtime.headless);
            println!("  allow_private_network: {}", runtime.allow_private_network);
            if !runtime.cdp_url.is_empty() {
                println!("  cdp_url: {}", runtime.cdp_url);
            }
            if let Some(bin) = report.get("binary") {
                println!(
                    "  binary: {}",
                    bin.get("path").and_then(|p| p.as_str()).unwrap_or("(none)")
                );
                println!(
                    "  kind: {}",
                    bin.get("kind")
                        .and_then(|p| p.as_str())
                        .unwrap_or("unknown")
                );
            } else {
                println!("  binary: (none found)");
            }
            println!(
                "  data_dir/browser: {}",
                loaded_config.data_dir.join("browser").display()
            );
        }
    }
    Ok(())
}