use crate::commands::daemon_utils::daemon_base_url;
use anyhow::Result;
pub async fn register_index_with_daemon(
index_name: &str,
project_path: &std::path::Path,
) -> Result<(bool, bool)> {
register_index_with_daemon_filtered(index_name, project_path, &RegisterFilters::default()).await
}
#[derive(Debug)]
pub struct RegisterFilters {
pub include_paths: Vec<String>,
pub exclude_globs: Vec<String>,
pub extensions: Vec<String>,
pub domain_terms: Vec<String>,
pub lexical_only: bool,
pub skip_kg: bool,
pub defer_embed: bool,
}
impl Default for RegisterFilters {
fn default() -> Self {
Self {
include_paths: vec![],
exclude_globs: vec![],
extensions: vec![],
domain_terms: vec![],
lexical_only: false,
skip_kg: false,
defer_embed: true,
}
}
}
pub async fn register_index_with_daemon_filtered(
index_name: &str,
project_path: &std::path::Path,
filters: &RegisterFilters,
) -> Result<(bool, bool)> {
let base = daemon_base_url();
let client = trusty_common::server::daemon_http_client()?;
let create_url = format!("{}/indexes", base);
let mut create_body = serde_json::json!({
"id": index_name,
"root_path": project_path,
});
if !filters.include_paths.is_empty() {
create_body["include_paths"] = serde_json::json!(filters.include_paths);
}
if !filters.exclude_globs.is_empty() {
create_body["exclude_globs"] = serde_json::json!(filters.exclude_globs);
}
if !filters.extensions.is_empty() {
create_body["extensions"] = serde_json::json!(filters.extensions);
}
if !filters.domain_terms.is_empty() {
create_body["domain_terms"] = serde_json::json!(filters.domain_terms);
}
if filters.lexical_only {
create_body["lexical_only"] = serde_json::json!(true);
}
if filters.skip_kg {
create_body["skip_kg"] = serde_json::json!(true);
}
if !filters.defer_embed {
create_body["defer_embed"] = serde_json::json!(false);
}
match client.post(&create_url).json(&create_body).send().await {
Ok(resp) if resp.status().is_success() => {
let body: serde_json::Value =
resp.json().await.unwrap_or_else(|_| serde_json::json!({}));
let created = body
.get("created")
.and_then(|v| v.as_bool())
.unwrap_or(false);
Ok((created, true))
}
Ok(resp) => {
anyhow::bail!("daemon returned {} for POST /indexes", resp.status());
}
Err(_) => Ok((false, false)),
}
}
pub async fn fetch_chunk_count(index_id: &str) -> Option<u64> {
let base = daemon_base_url();
let url = format!("{}/indexes/{}/status", base, index_id);
let client = trusty_common::server::daemon_http_client().ok()?;
let resp = client.get(&url).send().await.ok()?;
if !resp.status().is_success() {
return None;
}
let body: serde_json::Value = resp.json().await.ok()?;
body.get("chunk_count").and_then(|v| v.as_u64())
}