Skip to main content

codetether_agent/knowledge_graph/
queries.rs

1//! Query helpers for the knowledge graph.
2
3use super::graph::KnowledgeGraph;
4
5/// Result of a knowledge graph query.
6pub struct QueryResult {
7    pub answer: String,
8    pub node_count: usize,
9    pub edge_count: usize,
10}
11
12/// Answer a natural-language query against the knowledge graph.
13pub 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}