1pub use khive_pack_gtd::GtdPack;
18pub use khive_pack_kg::KgPack;
19pub use khive_pack_memory::MemoryPack;
20
21use khive_runtime::{KhiveRuntime, VerbRegistryBuilder};
22
23pub const BUILTIN_PACK_NAMES: &[&str] = &["kg", "gtd", "memory"];
28
29pub fn register_pack(
35 name: &str,
36 runtime: KhiveRuntime,
37 builder: &mut VerbRegistryBuilder,
38) -> Result<(), String> {
39 match name {
40 "kg" => {
41 builder.register(KgPack::new(runtime));
42 Ok(())
43 }
44 "gtd" => {
45 builder.register(GtdPack::new(runtime));
46 Ok(())
47 }
48 "memory" => {
49 builder.register(MemoryPack::new(runtime));
50 Ok(())
51 }
52 other => Err(other.to_string()),
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 use khive_runtime::{KhiveRuntime, RuntimeConfig};
61
62 fn make_runtime() -> KhiveRuntime {
63 KhiveRuntime::new(RuntimeConfig {
64 db_path: None,
65 embedding_model: None,
66 ..RuntimeConfig::default()
67 })
68 .expect("in-memory runtime")
69 }
70
71 #[test]
72 fn builtin_pack_names_includes_kg_and_gtd() {
73 assert!(BUILTIN_PACK_NAMES.contains(&"kg"));
74 assert!(BUILTIN_PACK_NAMES.contains(&"gtd"));
75 assert!(BUILTIN_PACK_NAMES.contains(&"memory"));
76 }
77
78 #[test]
79 fn register_kg_pack_succeeds() {
80 let rt = make_runtime();
81 let mut builder = VerbRegistryBuilder::new();
82 register_pack("kg", rt, &mut builder).expect("kg registration must succeed");
83 let registry = builder.build().expect("registry builds");
84 let verb_names: Vec<&str> = registry.all_verbs().iter().map(|v| v.name).collect();
85 assert!(verb_names.contains(&"create"));
87 assert!(verb_names.contains(&"link"));
88 assert!(verb_names.contains(&"traverse"));
89 }
90
91 #[test]
92 fn register_gtd_pack_succeeds() {
93 let rt = make_runtime();
94 let mut builder = VerbRegistryBuilder::new();
95 register_pack("gtd", rt, &mut builder).expect("gtd registration must succeed");
96 let registry = builder.build().expect("registry builds");
97 let verb_names: Vec<&str> = registry.all_verbs().iter().map(|v| v.name).collect();
98 assert!(verb_names.contains(&"assign"));
99 assert!(verb_names.contains(&"next"));
100 assert!(verb_names.contains(&"complete"));
101 }
102
103 #[test]
104 fn register_unknown_pack_returns_err() {
105 let rt = make_runtime();
106 let mut builder = VerbRegistryBuilder::new();
107 let err = register_pack("nosuchpack", rt, &mut builder)
108 .expect_err("unknown pack must return Err");
109 assert_eq!(err, "nosuchpack");
110 }
111
112 #[test]
113 fn both_packs_register_together() {
114 let rt1 = make_runtime();
115 let rt2 = make_runtime();
116 let rt3 = make_runtime();
117 let mut builder = VerbRegistryBuilder::new();
118 register_pack("kg", rt1, &mut builder).unwrap();
119 register_pack("gtd", rt2, &mut builder).unwrap();
120 register_pack("memory", rt3, &mut builder).unwrap();
121 let registry = builder.build().expect("registry builds");
122 let verb_names: Vec<&str> = registry.all_verbs().iter().map(|v| v.name).collect();
123 assert!(verb_names.contains(&"link"));
125 assert!(verb_names.contains(&"transition"));
127 assert!(verb_names.contains(&"remember"));
129 assert!(verb_names.contains(&"recall"));
130 }
131}