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;
eprintln!("[Consolidation] Sleep cycle starting...");
if let Ok(nodes) = store.get_all_nodes().await {
eprintln!("[Consolidation] Found {} memories.", nodes.len());
if let Some(ref p) = provider {
if nodes.len() > 10 {
eprintln!(
"[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() {
eprintln!(
"🌌 Holographic Axiom generated (not stored yet): {}",
axiom
);
}
}
}
}
eprintln!(
"[Consolidation] Pruning and merging are not implemented yet; no memories were changed."
);
} else {
eprintln!("[Consolidation Error] Could not fetch nodes.");
}
}
});
}
}