use serde::{Deserialize, Serialize};
use std::time::SystemTime;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryEntry {
pub id: Uuid,
pub category: MemoryCategory,
pub memory: String,
pub tags: Vec<String>,
pub created_at: SystemTime,
pub relevance: f32,
pub access_count: usize,
pub validated: bool,
}
impl Default for MemoryEntry {
fn default() -> Self {
Self {
id: Uuid::new_v4(),
category: MemoryCategory::Working,
memory: String::new(),
tags: Vec::new(),
created_at: SystemTime::now(),
relevance: 0.5,
access_count: 0,
validated: false,
}
}
}
impl MemoryEntry {
#[must_use]
pub fn new(category: MemoryCategory, memory: impl Into<String>) -> Self {
Self {
id: Uuid::new_v4(),
category,
memory: memory.into(),
tags: Vec::new(),
created_at: SystemTime::now(),
relevance: 1.0,
access_count: 0,
validated: false,
}
}
#[must_use]
pub fn with_tag(mut self, tag: impl Into<String>) -> Self {
self.tags.push(tag.into());
self
}
#[must_use]
pub fn validated(mut self) -> Self {
self.validated = true;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MemoryCategory {
Trajectory,
Insight,
ErrorPattern,
Strategy,
Fact,
Working,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ConsolidationStats {
pub entries_before: usize,
pub entries_after: usize,
pub pruned: usize,
pub merged: usize,
pub bytes_saved: usize,
}