Skip to main content

codetether_agent/cli/
search.rs

1//! `codetether search` subcommand.
2//!
3//! Thin wrapper over [`crate::search::run_router_search`] that formats the
4//! result for humans or emits JSON.
5
6use std::sync::Arc;
7
8use anyhow::Result;
9
10use crate::cli::SearchArgs;
11use crate::provider::ProviderRegistry;
12use crate::search::{model::DEFAULT_ROUTER_MODEL, run_router_search};
13
14/// Execute the `search` subcommand.
15///
16/// Picks up the router model from `--router-model`, falling back to the
17/// `CODETETHER_SEARCH_ROUTER_MODEL` env var and finally [`DEFAULT_ROUTER_MODEL`].
18pub async fn execute(args: SearchArgs) -> Result<()> {
19    let providers = Arc::new(ProviderRegistry::from_vault().await?);
20    let router_model = args
21        .router_model
22        .clone()
23        .or_else(|| std::env::var("CODETETHER_SEARCH_ROUTER_MODEL").ok())
24        .unwrap_or_else(|| DEFAULT_ROUTER_MODEL.to_string());
25    let top_n = args.top_n.max(1);
26    let result = run_router_search(providers, &router_model, &args.query, top_n).await?;
27    if args.json {
28        println!("{}", serde_json::to_string_pretty(&result)?);
29    } else {
30        super::search_render::render_human(&result);
31    }
32    Ok(())
33}