Skip to main content

hirn_engine/admission/
candidate.rs

1//! Memory candidate — the input to the admission pipeline.
2
3use hirn_core::episodic::{EntityRef, EpisodicRecord};
4use hirn_core::id::MemoryId;
5use hirn_core::metadata::Metadata;
6use hirn_core::types::{AgentId, Namespace};
7
8/// A candidate memory to be evaluated by the admission pipeline.
9///
10/// Extracted from an [`EpisodicRecord`] before it enters storage.
11#[derive(Debug, Clone)]
12pub struct MemoryCandidate {
13    /// Unique ID for this candidate (same as the record's ID).
14    pub id: MemoryId,
15    /// Text content of the memory.
16    pub content: String,
17    /// Extracted entities.
18    pub entities: Vec<EntityRef>,
19    /// Pre-computed embedding vector (if available).
20    pub embedding: Option<Vec<f32>>,
21    /// Source agent.
22    pub agent_id: AgentId,
23    /// Namespace scope.
24    pub namespace: Namespace,
25    /// Importance score assigned by the caller.
26    pub importance: f32,
27    /// Surprise score assigned by the caller.
28    pub surprise: f32,
29    /// Arbitrary metadata.
30    pub metadata: Metadata,
31}
32
33impl MemoryCandidate {
34    /// Build a candidate from an [`EpisodicRecord`].
35    pub fn from_record(record: &EpisodicRecord) -> Self {
36        Self {
37            id: record.id,
38            content: record.content.clone(),
39            entities: record.entities.clone(),
40            embedding: record.embedding.clone(),
41            agent_id: record.provenance.created_by.clone(),
42            namespace: record.namespace.clone(),
43            importance: record.importance,
44            surprise: record.surprise,
45            metadata: record.metadata.clone(),
46        }
47    }
48}