kmp_memory_api/
memory_requests.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9pub enum MemoryTier {
10 Summary,
11 CausalSpine,
12 EvidencePack,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
21pub enum MemoryAnswerPolicy {
22 #[default]
23 EvidenceOrUnknown,
24 ShowConflicts,
25 BestEffort,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30pub struct MemoryWakeRequest {
31 pub about: String,
34 pub role: String,
36 pub intent: String,
39 pub dimension_kinds: Vec<String>,
41 pub scoped_to_about: bool,
43 pub token_budget: u32,
44 pub depth: u32,
45 pub max_tier: Option<MemoryTier>,
46 pub max_entries: Option<u32>,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
54pub struct MemoryAskRequest {
55 pub about: String,
56 pub question: String,
57 pub answer_policy: MemoryAnswerPolicy,
58 pub dimension_kinds: Vec<String>,
59 pub scoped_to_about: bool,
60 pub token_budget: u32,
61 pub depth: u32,
62 pub max_tier: Option<MemoryTier>,
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn the_default_answer_policy_is_the_strict_one() {
71 assert_eq!(
72 MemoryAnswerPolicy::default(),
73 MemoryAnswerPolicy::EvidenceOrUnknown,
74 "a memory that answers beyond its evidence is worse than one that \
75 says it does not know"
76 );
77 }
78
79 #[test]
80 fn a_request_survives_the_wire() {
81 let request = MemoryWakeRequest {
82 about: "project:checkout".to_string(),
83 role: "resumer".to_string(),
84 intent: "resume after restart".to_string(),
85 dimension_kinds: vec!["timeline".to_string()],
86 scoped_to_about: true,
87 token_budget: 4096,
88 depth: 2,
89 max_tier: Some(MemoryTier::EvidencePack),
90 max_entries: Some(50),
91 };
92 let bytes = serde_json::to_vec(&request).expect("serializes");
93 assert_eq!(
94 serde_json::from_slice::<MemoryWakeRequest>(&bytes).expect("deserializes"),
95 request
96 );
97 }
98}