Skip to main content

agentic_reality/engine/query/
temporal.rs

1//! Temporal query operations.
2
3use 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}