use crate::swarm::agent::{ChatMessage, LlmProvider, Role};
use crate::swarm::llm::LlmClient;
use crate::traits::VectorStore;
use std::sync::Arc;
use tokio::time::{interval, Duration};
pub struct ConsolidationWorker {
store: Arc<dyn VectorStore>,
interval_seconds: u64,
compressor_provider: Option<LlmProvider>,
}
impl ConsolidationWorker {
pub fn new(store: Arc<dyn VectorStore>, interval_seconds: u64) -> Self {
Self {
store,
interval_seconds,
compressor_provider: None,
}
}
pub fn with_holographic_compression(mut self, provider: LlmProvider) -> Self {
self.compressor_provider = Some(provider);
self
}
pub fn start(self) {
let store = self.store.clone();
let interval_seconds = self.interval_seconds;
let provider = self.compressor_provider.clone();
tokio::spawn(async move {
let mut ticker = interval(Duration::from_secs(interval_seconds));
let llm = LlmClient::new();
loop {
ticker.tick().await;
println!("[Consolidation] Sleep cycle starting...");
if let Ok(nodes) = store.get_all_nodes().await {
println!("[Consolidation] Analyzing {} memories...", nodes.len());
if let Some(ref p) = provider {
if nodes.len() > 10 {
println!(
"[Consolidation] Holographic compression triggered for {} nodes...",
nodes.len()
);
let mut combined_text = String::new();
for node in nodes.iter().take(20) {
combined_text.push_str(&node.chunk.text);
combined_text.push('\n');
}
let system_prompt = "You are a Holographic Memory Compressor. \
Read the following episodic memories and output a SINGLE highly abstract, \
generalized axiom that summarizes the core truth or pattern within them. \
Output ONLY the axiom as plain text.";
let messages = vec![
ChatMessage::new(Role::System, system_prompt),
ChatMessage::new(Role::User, combined_text),
];
if let Ok(response) = llm.chat(p, &messages).await {
let axiom = response.content.trim();
if !axiom.is_empty() {
println!("🌌 Holographic Axiom generated: {}", axiom);
}
}
}
}
tokio::time::sleep(Duration::from_secs(2)).await;
println!("[Consolidation] Refined and pruned semantic space.");
} else {
eprintln!("[Consolidation Error] Could not fetch nodes.");
}
}
});
}
}