sh_layer3/memory_system/
mod.rs1pub mod file_backend;
6pub mod long_term;
7pub mod project;
8pub mod session;
9pub mod system;
10pub mod working;
11
12pub use file_backend::{FileBackend, JsonFileBackend, StorageContainer};
14pub use long_term::LongTermMemory;
15pub use project::ProjectMemory;
16pub use session::SessionMemory;
17pub use system::UnifiedMemorySystem;
18pub use working::WorkingMemory;
19
20use crate::types::{Layer3Result, MemoryEntry, MemoryQuery, MemoryTier};
21use async_trait::async_trait;
22use std::collections::HashMap;
23
24#[async_trait]
28pub trait MemoryStore: Send + Sync {
29 fn tier(&self) -> MemoryTier;
31
32 async fn store(&self, entry: MemoryEntry) -> Layer3Result<String>;
34
35 async fn get(&self, id: &str) -> Layer3Result<Option<MemoryEntry>>;
37
38 async fn delete(&self, id: &str) -> Layer3Result<bool>;
40
41 async fn query(&self, query: &MemoryQuery) -> Layer3Result<Vec<MemoryEntry>>;
43
44 async fn list(&self, limit: Option<usize>) -> Layer3Result<Vec<MemoryEntry>>;
46
47 async fn clear(&self) -> Layer3Result<usize>;
49
50 async fn count(&self) -> Layer3Result<usize>;
52}
53
54#[async_trait]
58pub trait MemorySystem: Send + Sync {
59 async fn store(&self, tier: MemoryTier, content: String) -> Layer3Result<String>;
61
62 async fn get(&self, tier: MemoryTier, id: &str) -> Layer3Result<Option<MemoryEntry>>;
64
65 async fn query_all(&self, query: &MemoryQuery) -> Layer3Result<Vec<MemoryEntry>>;
69
70 async fn query(&self, tier: MemoryTier, query: &MemoryQuery) -> Layer3Result<Vec<MemoryEntry>>;
72
73 async fn delete(&self, tier: MemoryTier, id: &str) -> Layer3Result<bool>;
75
76 async fn clear(&self, tier: MemoryTier) -> Layer3Result<usize>;
78
79 async fn stats(&self) -> Layer3Result<HashMap<MemoryTier, usize>>;
81}
82
83pub trait ImportanceScorer: Send + Sync {
85 fn score(&self, entry: &MemoryEntry) -> f32;
87}
88
89pub trait DecayPolicy: Send + Sync {
93 fn decay(&self, entry: &MemoryEntry, current_time: chrono::DateTime<chrono::Utc>) -> f32;
95
96 fn should_evict(&self, entry: &MemoryEntry) -> bool;
98}
99
100pub struct TimeBasedDecay {
102 decay_rate: f32,
104 min_threshold: f32,
106}
107
108impl TimeBasedDecay {
109 pub fn new(decay_rate: f32, min_threshold: f32) -> Self {
110 Self {
111 decay_rate,
112 min_threshold,
113 }
114 }
115}
116
117impl Default for TimeBasedDecay {
118 fn default() -> Self {
119 Self {
120 decay_rate: 0.1,
121 min_threshold: 0.1,
122 }
123 }
124}
125
126impl DecayPolicy for TimeBasedDecay {
127 fn decay(&self, entry: &MemoryEntry, current_time: chrono::DateTime<chrono::Utc>) -> f32 {
128 let days_since_access = (current_time - entry.last_accessed).num_days() as f32;
129 let decayed = entry.importance * (1.0 - self.decay_rate * days_since_access);
130 decayed.max(0.0)
131 }
132
133 fn should_evict(&self, entry: &MemoryEntry) -> bool {
134 entry.importance < self.min_threshold
135 }
136}
137
138#[cfg(test)]
139mod tests {
140 use super::*;
141
142 #[test]
143 fn test_decay_policy_default() {
144 let decay = TimeBasedDecay::default();
145 assert_eq!(decay.decay_rate, 0.1);
146 assert_eq!(decay.min_threshold, 0.1);
147 }
148}