talon-cli 0.4.2

Talon CLI: hybrid retrieval over Obsidian vaults and markdown corpora, with grounded answers, MCP server, and agent-native output.
Documentation
use serde::Serialize;
use talon_core::{SearchResponse, SearchResult};

#[derive(Debug, Serialize)]
pub(super) struct AgentSearchResponse<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    vault: Option<&'a str>,
    results: Vec<AgentSearchHit<'a>>,
}

impl<'a> From<&'a SearchResponse> for AgentSearchResponse<'a> {
    fn from(search: &'a SearchResponse) -> Self {
        Self {
            vault: search.vault.as_ref().map(talon_core::ContainerPath::as_str),
            results: search.results.iter().map(AgentSearchHit::from).collect(),
        }
    }
}

#[derive(Debug, Serialize)]
struct AgentSearchHit<'a> {
    path: &'a str,
    title: &'a str,
    snippet: &'a str,
    score: f64,
}

impl<'a> From<&'a SearchResult> for AgentSearchHit<'a> {
    fn from(result: &'a SearchResult) -> Self {
        Self {
            path: result.vault_path.as_str(),
            title: &result.title,
            snippet: &result.snippet,
            score: round_score(result.score),
        }
    }
}

fn round_score(score: f64) -> f64 {
    (score * 100.0).round() / 100.0
}