codetether_agent/knowledge_graph/
queries.rs1use super::graph::KnowledgeGraph;
4
5pub struct QueryResult {
7 pub answer: String,
8 pub node_count: usize,
9 pub edge_count: usize,
10}
11
12pub fn query(kg: &KnowledgeGraph, question: &str) -> QueryResult {
14 let lower = question.to_lowercase();
15 let answer = if lower.contains("caller") || lower.contains("who calls") {
16 format!(
17 "Graph has {} nodes, {} edges. Use callers_of(<symbol>) for specific lookup.",
18 kg.nodes.len(),
19 kg.edges.len()
20 )
21 } else if lower.contains("symbol") || lower.contains("where is") {
22 format!(
23 "Graph has {} nodes across {} files.",
24 kg.nodes.len(),
25 unique_files(kg)
26 )
27 } else {
28 format!(
29 "Knowledge graph: {} nodes, {} edges.",
30 kg.nodes.len(),
31 kg.edges.len()
32 )
33 };
34 QueryResult {
35 answer,
36 node_count: kg.nodes.len(),
37 edge_count: kg.edges.len(),
38 }
39}
40
41fn unique_files(kg: &KnowledgeGraph) -> usize {
42 let files: std::collections::HashSet<&str> =
43 kg.nodes.values().map(|n| n.file_path.as_str()).collect();
44 files.len()
45}