github_mcp/tools/
search_tool.rs1use rusqlite::Connection;
4
5use crate::data::store::search_endpoints;
6use crate::services::embedding_service::embed;
7
8pub fn search_operations(
12 conn: &Connection,
13 query: &str,
14 limit: usize,
15) -> anyhow::Result<serde_json::Value> {
16 warn_if_semantic_endpoints_incomplete(conn);
17 let query_embedding = embed(query)?;
18 let results = search_endpoints(conn, &query_embedding, limit)?;
19 Ok(serde_json::to_value(results)?)
20}
21
22fn warn_if_semantic_endpoints_incomplete(conn: &Connection) {
29 let counts: rusqlite::Result<(i64, i64)> = conn.query_row(
30 "SELECT (SELECT COUNT(*) FROM endpoints), (SELECT COUNT(*) FROM semantic_endpoints)",
31 [],
32 |row| Ok((row.get(0)?, row.get(1)?)),
33 );
34 if let Ok((endpoints_count, semantic_count)) = counts
35 && semantic_count < endpoints_count
36 {
37 tracing::warn!(
38 endpoints_count,
39 semantic_count,
40 "semantic_endpoints is missing rows relative to endpoints; search results may be \
41 incomplete — run the populate-embeddings binary to backfill"
42 );
43 }
44}