lean_ctx/core/knowledge_router/
source_manifest.rs1#[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}