rustyclaw_core/mnemo/
mod.rs1mod compaction;
16mod config;
17mod schema;
18mod sqlite_store;
19mod summarizer;
20mod traits;
21#[cfg(test)]
22mod tests;
23
24pub use compaction::run_compaction;
25pub use config::{MnemoConfig, SummarizationConfig};
26pub use sqlite_store::SqliteMemoryStore;
27pub use summarizer::{DeterministicSummarizer, LlmSummarizer};
28pub use traits::{CompactionStats, MemoryEntry, MemoryHit, MemoryStore, SummaryKind, Summarizer};
29
30use anyhow::Result;
31use std::path::Path;
32use std::sync::Arc;
33
34pub type SharedMemoryStore = Arc<dyn MemoryStore>;
36
37pub async fn create_memory_store(
39 config: &MnemoConfig,
40 settings_dir: &Path,
41) -> Result<SharedMemoryStore> {
42 let db_path = config.db_path.clone().unwrap_or_else(|| {
43 settings_dir.join("mnemo.sqlite3")
44 });
45
46 let store = SqliteMemoryStore::open(&db_path, config.clone()).await?;
47 Ok(Arc::new(store))
48}
49
50pub fn create_summarizer(config: &MnemoConfig) -> Arc<dyn Summarizer> {
52 if config.summarization.use_main_model {
53 Arc::new(DeterministicSummarizer::new(
56 config.summarization.truncate_chars,
57 config.summarization.truncate_total,
58 ))
59 } else if let (Some(base_url), Some(model)) = (
60 config.summarization.provider.as_ref(),
61 config.summarization.model.as_ref(),
62 ) {
63 Arc::new(LlmSummarizer::new(
64 base_url.clone(),
65 model.clone(),
66 None, ))
68 } else {
69 Arc::new(DeterministicSummarizer::new(
70 config.summarization.truncate_chars,
71 config.summarization.truncate_total,
72 ))
73 }
74}
75
76pub fn estimate_tokens(text: &str) -> usize {
78 (text.len() as f64 / 4.0).ceil() as usize
79}
80
81pub fn generate_context_md(entries: &[MemoryEntry]) -> String {
83 let mut lines = Vec::new();
84 lines.push("# MNEMO CONTEXT".to_string());
85 lines.push(String::new());
86
87 for entry in entries {
88 if entry.depth == 0 {
89 lines.push(format!("## {} (msg #{})", entry.role, entry.id));
90 } else {
91 lines.push(format!("## Summary d{} #{}", entry.depth, entry.id));
92 }
93 lines.push(entry.content.clone());
94 lines.push(String::new());
95 }
96
97 lines.join("\n")
98}