use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AtomType {
#[default]
Episodic,
Semantic,
Procedural,
Preference,
Digest,
PromptEvolution,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SynapseType {
RelatesTo,
CausedBy,
Contradicts,
EvolvedInto,
Supports,
PartOf,
UsedIn,
Hebbian,
Temporal,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AtomSource {
pub conversation_id: Option<String>,
pub message_id: Option<String>,
pub composition_id: Option<String>,
pub step: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EncodingContext {
pub goal: Option<String>,
pub phase: Option<String>,
pub gain_mode: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryAtom {
pub id: String,
pub content: String,
#[serde(skip)]
pub embedding: Option<Vec<f32>>,
pub atom_type: AtomType,
pub source: AtomSource,
pub importance: f64,
pub access_count: u32,
pub last_accessed_at: f64,
pub created_at: f64,
pub topics: Vec<String>,
pub domain: Option<String>,
pub consolidated_from: Option<Vec<String>>,
pub is_consolidated: bool,
pub parent_id: Option<String>,
pub depth: Option<u32>,
pub label: Option<String>,
pub child_ids: Option<Vec<String>>,
pub superseded: bool,
pub suppressed: bool,
pub dormant: bool,
pub tags: Vec<String>,
pub encoding_context: Option<EncodingContext>,
pub retrieval_reward: Option<f64>,
pub reconsolidation_count: Option<u32>,
pub arousal: Option<f64>,
pub valence: Option<String>,
pub epoch: Option<u32>,
pub crystallized: bool,
}
impl MemoryAtom {
pub fn is_active(&self) -> bool {
!self.is_consolidated && !self.superseded && !self.suppressed && !self.dormant
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Synapse {
pub id: String,
pub source: String,
pub target: String,
pub synapse_type: SynapseType,
pub strength: f64,
pub created_at: f64,
pub last_accessed_at: Option<f64>,
pub access_count: Option<u32>,
}