Skip to main content

locus_sdk/application/
memory_schema.rs

1use crate::domain::memory::MemorySchemaResult;
2
3pub struct MemorySchemaService;
4
5impl MemorySchemaService {
6    pub fn new() -> Self {
7        Self
8    }
9
10    pub fn execute(&self) -> MemorySchemaResult {
11        MemorySchemaResult {
12            schema_version: "locus-sdk.memory.v3".to_string(),
13            sort_fields: vec![
14                "timestamp".to_string(),
15                "updated_at".to_string(),
16                "psi".to_string(),
17                "rho".to_string(),
18                "kappa".to_string(),
19            ],
20            filter_fields: vec![
21                "has_embedding".to_string(),
22                "embedding_model".to_string(),
23                "psi".to_string(),
24                "rho".to_string(),
25                "kappa".to_string(),
26                "text_contains".to_string(),
27                "tags_contains".to_string(),
28                "has_tag".to_string(),
29                "indexed_tags".to_string(),
30                "tag_prefix".to_string(),
31                "has_semantic_links".to_string(),
32                "link_rel".to_string(),
33                "link_target".to_string(),
34                "links_to_ref".to_string(),
35            ],
36            group_by_fields: vec![
37                "session_id".to_string(),
38                "tier".to_string(),
39                "embedding_model".to_string(),
40                "date_day".to_string(),
41                "semantic_tag".to_string(),
42            ],
43            fallback_policies: vec![
44                "never".to_string(),
45                "on_empty".to_string(),
46                "always".to_string(),
47            ],
48            strictness_modes: vec![
49                "precision".to_string(),
50                "balanced".to_string(),
51                "recall".to_string(),
52            ],
53            transform_operations: vec![
54                "embed_backfill".to_string(),
55                "reindex_embeddings".to_string(),
56                "embed_tag_backfill".to_string(),
57                "reindex_tag_embeddings".to_string(),
58            ],
59            evict_operations: vec![
60                "delete_nodes".to_string(),
61                "purge_session".to_string(),
62            ],
63        }
64    }
65}
66
67impl Default for MemorySchemaService {
68    fn default() -> Self {
69        Self::new()
70    }
71}
72
73#[cfg(test)]
74mod tests {
75    use super::MemorySchemaService;
76
77    #[test]
78    fn schema_contains_expected_core_fields() {
79        let service = MemorySchemaService::new();
80        let schema = service.execute();
81
82        assert_eq!(schema.schema_version, "locus-sdk.memory.v3");
83        assert!(schema.sort_fields.contains(&"timestamp".to_string()));
84        assert!(schema.group_by_fields.contains(&"session_id".to_string()));
85        assert!(schema.fallback_policies.contains(&"on_empty".to_string()));
86        assert!(schema
87            .transform_operations
88            .contains(&"embed_backfill".to_string()));
89        assert!(schema.filter_fields.contains(&"has_tag".to_string()));
90    }
91
92    #[test]
93    fn schema_contains_semantic_tag_filters() {
94        let service = MemorySchemaService::new();
95        let schema = service.execute();
96
97        assert!(schema
98            .filter_fields
99            .contains(&"tags_contains".to_string()));
100        assert!(schema
101            .filter_fields
102            .contains(&"indexed_tags".to_string()));
103        assert!(schema
104            .filter_fields
105            .contains(&"link_rel".to_string()));
106    }
107}