use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[derive(Default)]
pub enum ExperienceType {
Success,
Failure,
Discovery,
Correction,
#[default]
Learning,
Hypothesis,
Validation,
Warning,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[derive(Default)]
pub enum OutcomeType {
Positive,
Negative,
#[default]
Neutral,
Mixed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Experience {
pub id: String,
pub agent_id: String,
#[serde(rename = "type")]
pub experience_type: ExperienceType,
pub outcome: OutcomeType,
pub context: String,
pub action: String,
pub result: String,
pub learning: String,
pub tags: Vec<String>,
pub domain: String,
pub related_experiences: Option<Vec<String>>,
pub supersedes: Option<String>,
pub confidence: f64,
pub importance: f64,
pub created_at: i64,
pub updated_at: i64,
pub last_accessed_at: Option<i64>,
pub access_count: u32,
pub previous_belief: Option<String>,
pub corrected_belief: Option<String>,
pub embedding: Option<Vec<f64>>,
pub memory_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TimeRange {
pub start: Option<i64>,
pub end: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExperienceQuery {
pub query: Option<String>,
pub types: Option<Vec<ExperienceType>>,
pub outcomes: Option<Vec<OutcomeType>>,
pub domains: Option<Vec<String>>,
pub tags: Option<Vec<String>>,
pub min_importance: Option<f64>,
pub min_confidence: Option<f64>,
pub time_range: Option<TimeRange>,
pub limit: Option<usize>,
pub include_related: Option<bool>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_experience_type_serde() {
let json = serde_json::to_string(&ExperienceType::Discovery).unwrap();
assert_eq!(json, "\"discovery\"");
}
}