Skip to main content

hirn_engine/observability/
write_path.rs

1use std::fmt;
2
3use hirn_core::types::{AgentId, Namespace};
4use hirn_core::{HirnError, MemoryId, TextRetention};
5
6use crate::admission::AdmissionDecision;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum RememberStatus {
10    Accepted,
11    Rejected,
12    Deferred,
13    Merged,
14    Failed,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum EmbeddingDisposition {
19    Provided,
20    Generated,
21    PendingRetry,
22    Missing,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub enum WritePathOperationStatus {
27    Disabled,
28    SkippedFastPath,
29    Unavailable,
30    Applied,
31}
32
33#[derive(Debug, Clone)]
34pub struct AdmissionExplanation {
35    pub decision: AdmissionDecision,
36    pub controllers_consulted: Vec<String>,
37}
38
39#[derive(Debug, Clone, Copy, PartialEq)]
40pub struct RpeExplanation {
41    pub enabled: bool,
42    pub score: Option<f32>,
43    pub max_similarity: Option<f32>,
44    pub threshold: f32,
45    pub is_fast_path: bool,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq)]
49pub struct WritePathOperationExplanation {
50    pub status: WritePathOperationStatus,
51    pub count: usize,
52}
53
54impl WritePathOperationExplanation {
55    #[must_use]
56    pub const fn disabled() -> Self {
57        Self {
58            status: WritePathOperationStatus::Disabled,
59            count: 0,
60        }
61    }
62
63    #[must_use]
64    pub const fn skipped_fast_path() -> Self {
65        Self {
66            status: WritePathOperationStatus::SkippedFastPath,
67            count: 0,
68        }
69    }
70
71    #[must_use]
72    pub const fn unavailable() -> Self {
73        Self {
74            status: WritePathOperationStatus::Unavailable,
75            count: 0,
76        }
77    }
78
79    #[must_use]
80    pub const fn applied(count: usize) -> Self {
81        Self {
82            status: WritePathOperationStatus::Applied,
83            count,
84        }
85    }
86}
87
88#[derive(Debug, Clone, PartialEq)]
89pub enum InterferenceDisposition {
90    None,
91    TriggerConsolidation {
92        namespaces: Vec<Namespace>,
93        backlog_score: f32,
94        cause: &'static str,
95    },
96    Suppressed {
97        reason: &'static str,
98        backlog_score: f32,
99    },
100}
101
102#[derive(Debug, Clone, PartialEq)]
103pub struct InterferenceExplanation {
104    pub score: f32,
105    pub disposition: InterferenceDisposition,
106}
107
108#[derive(Debug, Clone)]
109pub struct RememberExplanation {
110    pub status: RememberStatus,
111    pub actor_id: AgentId,
112    pub namespace: Namespace,
113    pub bypass_admission: bool,
114    pub memory_id: Option<MemoryId>,
115    pub admission: Option<AdmissionExplanation>,
116    pub embedding: EmbeddingDisposition,
117    pub rpe: Option<RpeExplanation>,
118    pub text_retention: TextRetention,
119    pub resources_extracted: bool,
120    pub prospective_indexing: WritePathOperationExplanation,
121    pub svo_extraction: WritePathOperationExplanation,
122    pub interference: Option<InterferenceExplanation>,
123    pub arrival_sequence: Option<u64>,
124    pub error: Option<String>,
125}
126
127impl RememberExplanation {
128    #[must_use]
129    pub(crate) fn new(
130        actor_id: AgentId,
131        namespace: Namespace,
132        bypass_admission: bool,
133        embedding: EmbeddingDisposition,
134        text_retention: TextRetention,
135    ) -> Self {
136        Self {
137            status: RememberStatus::Accepted,
138            actor_id,
139            namespace,
140            bypass_admission,
141            memory_id: None,
142            admission: None,
143            embedding,
144            rpe: None,
145            text_retention,
146            resources_extracted: false,
147            prospective_indexing: WritePathOperationExplanation::disabled(),
148            svo_extraction: WritePathOperationExplanation::disabled(),
149            interference: None,
150            arrival_sequence: None,
151            error: None,
152        }
153    }
154}
155
156#[derive(Debug)]
157pub struct RememberFailure {
158    pub error: HirnError,
159    pub explanation: RememberExplanation,
160}
161
162impl RememberFailure {
163    #[must_use]
164    pub(crate) fn new(error: HirnError, explanation: RememberExplanation) -> Self {
165        Self { error, explanation }
166    }
167}
168
169impl fmt::Display for RememberFailure {
170    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
171        write!(f, "{}", self.error)
172    }
173}
174
175impl std::error::Error for RememberFailure {
176    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
177        Some(&self.error)
178    }
179}