Skip to main content

lean_ctx/core/knowledge_router/
source_manifest.rs

1#[derive(Debug, Clone, Default, PartialEq, Eq)]
2pub struct SourceManifestEntry {
3    pub source_id: String,
4    pub display_name: String,
5    pub kinds: Vec<String>,
6    pub capabilities: SourceCapabilities,
7    pub freshness_typical_ms: u64,
8    pub cost_class: CostClass,
9}
10#[derive(Debug, Clone, Default, PartialEq, Eq)]
11pub struct SourceCapabilities {
12    pub search: bool,
13    pub exact_get: bool,
14    pub delta_sync: bool,
15    pub live_query: bool,
16    pub graph_edges: bool,
17}
18#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
19pub enum CostClass {
20    #[default]
21    Negligible,
22    Low,
23    Medium,
24    High,
25}
26impl SourceManifestEntry {
27    pub fn is_valid(&self) -> bool {
28        !self.source_id.is_empty() && !self.display_name.is_empty() && !self.kinds.is_empty()
29    }
30}
31pub fn builtin_manifests() -> Vec<SourceManifestEntry> {
32    vec![
33        entry(
34            "local_files",
35            "LocalFiles",
36            vec!["file"],
37            false,
38            CostClass::Negligible,
39        ),
40        entry("jira", "Jira", vec!["issue"], true, CostClass::Low),
41        entry(
42            "github",
43            "GitHub",
44            vec!["issue", "pull_request"],
45            true,
46            CostClass::Low,
47        ),
48    ]
49}
50fn entry(
51    source_id: &str,
52    display_name: &str,
53    kinds: Vec<&str>,
54    live_query: bool,
55    cost_class: CostClass,
56) -> SourceManifestEntry {
57    SourceManifestEntry {
58        source_id: source_id.into(),
59        display_name: display_name.into(),
60        kinds: kinds.into_iter().map(str::to_owned).collect(),
61        capabilities: SourceCapabilities {
62            search: true,
63            exact_get: true,
64            delta_sync: true,
65            live_query,
66            graph_edges: true,
67        },
68        freshness_typical_ms: 60_000,
69        cost_class,
70    }
71}
72#[cfg(test)]
73mod tests {
74    use super::*;
75    #[test]
76    fn builtin_has_three_entries() {
77        assert_eq!(builtin_manifests().len(), 3);
78    }
79    #[test]
80    fn builtin_entries_are_valid() {
81        assert!(
82            builtin_manifests()
83                .iter()
84                .all(SourceManifestEntry::is_valid)
85        );
86    }
87}