use std::fmt::Display; use cloud_objects::cloud_object::{ GenericCloudObject, GenericServerObject, GenericStringModel, JsonObjectType, }; use cloud_objects::ids::GenericStringObjectId; use serde::{Deserialize, Serialize}; use crate::{JsonModel, JsonSerializer}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub enum AIFact { #[serde(rename = "memory")] Memory(AIMemory), } /// A globally unique ID for suggested objects. /// /// This is used for telemetry purposes to track and connect both: /// - Suggested objects generated by the AI agent. /// - The corresponding objects stored in the cloud, if the suggestion was accepted. #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] pub struct SuggestedLoggingId(String); impl Display for SuggestedLoggingId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } impl From for SuggestedLoggingId { fn from(value: String) -> Self { Self(value) } } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct AIMemory { #[serde(default)] pub name: Option, pub content: String, // Deprecated: This field is no longer used and will be removed in the future. #[serde(default)] pub is_autogenerated: bool, /// If this rule was created from a suggested rule, record the suggestion's logging_id /// so we can suppress re-surfacing the same suggestion in future responses. #[serde(default)] pub suggested_logging_id: Option, } impl AIFact { pub fn is_memory(&self) -> bool { matches!(self, AIFact::Memory { .. }) } } impl JsonModel for AIFact { fn json_object_type() -> JsonObjectType { JsonObjectType::AIFact } } pub type CloudAIFact = GenericCloudObject; pub type CloudAIFactModel = GenericStringModel; pub type ServerAIFact = GenericServerObject;