Skip to main content

origin_types/
lib.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Shared types for the Origin memory system.
3//!
4//! This crate provides lightweight type definitions shared across
5//! origin-core, origin-server, and the Tauri app. Dependencies are
6//! limited to serde and serde_json -- no heavy runtime deps.
7
8pub mod entities;
9pub mod import;
10pub mod memory;
11pub mod requests;
12pub mod responses;
13pub mod sources;
14
15// Re-export commonly used types at crate root for convenience.
16pub use entities::{
17    Entity, EntityDetail, EntitySearchResult, EntitySuggestion, Observation, Relation,
18    RelationWithEntity,
19};
20pub use memory::{
21    AgentActivityRow, AgentConnection, DomainInfo, HomeStats, IndexedFileInfo, MemoryItem,
22    MemoryStats, MemoryVersionItem, Profile, RejectionRecord, SearchResult, SessionSnapshot,
23    SnapshotCapture, SnapshotCaptureWithContent, Space, TopMemory, TypeBreakdown,
24};
25pub use sources::{MemoryType, RawDocument, SourceType, StabilityTier, SyncStatus};
26
27/// Crate version.
28pub fn version() -> &'static str {
29    env!("CARGO_PKG_VERSION")
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn version_is_set() {
38        assert!(!version().is_empty());
39    }
40
41    #[test]
42    fn memory_type_roundtrip() {
43        for variant in [
44            MemoryType::Identity,
45            MemoryType::Preference,
46            MemoryType::Decision,
47            MemoryType::Fact,
48            MemoryType::Goal,
49        ] {
50            let s = variant.to_string();
51            let parsed: MemoryType = s.parse().unwrap();
52            assert_eq!(parsed, variant);
53        }
54    }
55
56    #[test]
57    fn search_result_serializes() {
58        let sr = SearchResult {
59            id: "1".into(),
60            content: "test".into(),
61            source: "memory".into(),
62            source_id: "mem_abc".into(),
63            title: "Test".into(),
64            url: None,
65            chunk_index: 0,
66            last_modified: 1000,
67            score: 0.9,
68            chunk_type: None,
69            language: None,
70            semantic_unit: None,
71            memory_type: Some("fact".into()),
72            domain: None,
73            source_agent: None,
74            confidence: Some(0.8),
75            confirmed: Some(true),
76            stability: None,
77            supersedes: None,
78            summary: None,
79            entity_id: None,
80            entity_name: None,
81            quality: None,
82            is_archived: false,
83            is_recap: false,
84            structured_fields: None,
85            retrieval_cue: None,
86            source_text: None,
87            raw_score: 0.0,
88        };
89        let json = serde_json::to_string(&sr).unwrap();
90        assert!(json.contains("mem_abc"));
91        // Verify skip_serializing_if works: None fields should be absent
92        assert!(!json.contains("entity_id"));
93    }
94
95    #[test]
96    fn raw_document_default() {
97        let doc = RawDocument::default();
98        assert_eq!(doc.enrichment_status, "raw");
99        assert_eq!(doc.supersede_mode, "hide");
100        assert!(!doc.pending_revision);
101        assert!(!doc.is_recap);
102    }
103
104    #[test]
105    fn stability_tier_mapping() {
106        use sources::stability_tier;
107        assert_eq!(stability_tier(Some("identity")), StabilityTier::Protected);
108        assert_eq!(stability_tier(Some("preference")), StabilityTier::Protected);
109        assert_eq!(stability_tier(Some("fact")), StabilityTier::Standard);
110        assert_eq!(stability_tier(Some("decision")), StabilityTier::Standard);
111        assert_eq!(stability_tier(Some("goal")), StabilityTier::Ephemeral);
112        assert_eq!(stability_tier(None), StabilityTier::Ephemeral);
113    }
114}