agentic_reality/engine/query/
temporal.rs1use crate::engine::query::QueryEngine;
4use crate::types::error::{RealityError, RealityResult};
5use crate::types::ids::EventId;
6use crate::types::temporal::*;
7
8impl<'a> QueryEngine<'a> {
9 pub fn get_temporal_context(&self) -> RealityResult<&TemporalContext> {
10 let awareness = self
11 .engine
12 .temporal_store
13 .awareness
14 .as_ref()
15 .ok_or_else(|| RealityError::NotInitialized("temporal awareness".into()))?;
16 Ok(&awareness.context)
17 }
18
19 pub fn get_grounded_time(&self) -> RealityResult<&TemporalAwareness> {
20 self.engine
21 .temporal_store
22 .awareness
23 .as_ref()
24 .ok_or_else(|| RealityError::NotInitialized("temporal awareness".into()))
25 }
26
27 pub fn get_causality_graph(&self) -> RealityResult<&CausalityGraph> {
28 self.engine
29 .temporal_store
30 .causality
31 .as_ref()
32 .ok_or_else(|| RealityError::NotInitialized("causality graph".into()))
33 }
34
35 pub fn get_causal_chain(&self, event_id: &EventId) -> RealityResult<Vec<&CausalEvent>> {
36 let graph = self.get_causality_graph()?;
37 let mut chain = vec![];
38 let mut stack = vec![*event_id];
39 while let Some(id) = stack.pop() {
40 if let Some(evt) = graph.events.iter().find(|e| e.id == id) {
41 chain.push(evt);
42 for cause in &evt.causes {
43 if !chain.iter().any(|e| e.id == *cause) {
44 stack.push(*cause);
45 }
46 }
47 }
48 }
49 Ok(chain)
50 }
51
52 pub fn get_root_causes(&self) -> RealityResult<&[EventId]> {
53 Ok(&self.get_causality_graph()?.root_causes)
54 }
55
56 pub fn get_timelines(&self) -> &[Timeline] {
57 &self.engine.temporal_store.timelines
58 }
59
60 pub fn get_unified_timeline(&self) -> UnifiedTimeline {
61 let timelines = &self.engine.temporal_store.timelines;
62 let mut merged = vec![];
63 let mut conflicts = vec![];
64 for t in timelines {
65 merged.extend(t.events.clone());
66 conflicts.extend(t.conflicts.iter().filter(|c| !c.resolved).cloned());
67 }
68 merged.sort_by_key(|e| e.timestamp);
69 UnifiedTimeline {
70 timelines: timelines.iter().map(|t| t.id).collect(),
71 merged_events: merged,
72 unresolved_conflicts: conflicts,
73 coherence_score: if timelines.is_empty() {
74 1.0
75 } else {
76 timelines.iter().filter(|t| t.coherent).count() as f64 / timelines.len() as f64
77 },
78 }
79 }
80
81 pub fn get_deadlines(&self) -> RealityResult<&[Deadline]> {
82 Ok(&self.get_temporal_context()?.deadlines)
83 }
84}