use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemoryTier {
Summary,
CausalSpine,
EvidencePack,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum MemoryAnswerPolicy {
#[default]
EvidenceOrUnknown,
ShowConflicts,
BestEffort,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MemoryWakeRequest {
pub about: String,
pub role: String,
pub intent: String,
pub dimension_kinds: Vec<String>,
pub scoped_to_about: bool,
pub token_budget: u32,
pub depth: u32,
pub max_tier: Option<MemoryTier>,
pub max_entries: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MemoryAskRequest {
pub about: String,
pub question: String,
pub answer_policy: MemoryAnswerPolicy,
pub dimension_kinds: Vec<String>,
pub scoped_to_about: bool,
pub token_budget: u32,
pub depth: u32,
pub max_tier: Option<MemoryTier>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_default_answer_policy_is_the_strict_one() {
assert_eq!(
MemoryAnswerPolicy::default(),
MemoryAnswerPolicy::EvidenceOrUnknown,
"a memory that answers beyond its evidence is worse than one that \
says it does not know"
);
}
#[test]
fn a_request_survives_the_wire() {
let request = MemoryWakeRequest {
about: "project:checkout".to_string(),
role: "resumer".to_string(),
intent: "resume after restart".to_string(),
dimension_kinds: vec!["timeline".to_string()],
scoped_to_about: true,
token_budget: 4096,
depth: 2,
max_tier: Some(MemoryTier::EvidencePack),
max_entries: Some(50),
};
let bytes = serde_json::to_vec(&request).expect("serializes");
assert_eq!(
serde_json::from_slice::<MemoryWakeRequest>(&bytes).expect("deserializes"),
request
);
}
}