use crate::ids::MemoryId;
use crate::model::links::{ActivationState, AssociationKeys, AssociationLink};
use crate::model::understanding::MemoryUnderstanding;
use crate::score::UnitScore;
use crate::time::Timestamp;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MemoryUnit {
pub schema_version: u16,
pub id: MemoryId,
pub created_at: Timestamp,
pub updated_at: Timestamp,
pub content: MemoryContent,
pub context: WriteContext,
pub understanding: MemoryUnderstanding,
pub association_keys: AssociationKeys,
pub links: Vec<AssociationLink>,
pub activation: ActivationState,
pub lifecycle: MemoryLifecycle,
pub provenance: Provenance,
pub stage: MemoryStage,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MemoryContent {
pub raw: String,
pub summary: Option<String>,
pub normalized: Option<String>,
pub language: Language,
pub content_type: ContentType,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Language {
Zh,
En,
Code,
Mixed,
Other(u16),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ContentType {
UserStatement,
AssistantObservation,
ToolResult,
Decision,
Preference,
Event,
TaskState,
ProjectKnowledge,
Reflection,
Correction,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WriteContext {
pub conversation_id: Option<u64>,
pub session_id: Option<u64>,
pub project_id: Option<u64>,
pub task_id: Option<u64>,
pub user_id: Option<u64>,
pub local_time: Timestamp,
pub preceding_memory_ids: Vec<MemoryId>,
pub source_refs: Vec<SourceRef>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceRef {
pub kind: SourceKind,
pub locator: String,
pub span: Option<TextSpan>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SourceKind {
Conversation,
File,
Tool,
ExternalSystem,
MemoryRef,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct TextSpan {
pub start: u32,
pub end: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MemoryStage {
Raw,
Indexed,
Enriched,
Consolidated,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemoryLifecycle {
Active,
Compressed {
into: MemoryId,
},
Archived,
Superseded {
by: MemoryId,
},
Deprecated,
Negated {
by: MemoryId,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Provenance {
pub origin: SourceKind,
pub generated_by: GeneratedBy,
pub reliability: UnitScore,
pub evidence_refs: Vec<SourceRef>,
pub revision_history: Vec<RevisionMark>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum GeneratedBy {
UserDirect,
Extractor {
backend: String,
},
Consolidation,
Rule,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RevisionMark {
pub at: Timestamp,
pub reason: String,
pub by: GeneratedBy,
}