use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[async_trait]
pub trait Memory: Send + Sync {
async fn store(&self, key: &str, value: MemoryValue, ttl: Option<Duration>) -> crate::Result<()>;
async fn retrieve(&self, key: &str) -> crate::Result<Option<MemoryValue>>;
async fn delete(&self, key: &str) -> crate::Result<()>;
async fn search(&self, pattern: &str, limit: usize) -> crate::Result<Vec<(String, MemoryValue)>>;
async fn list_namespace(&self, namespace: &str) -> crate::Result<Vec<String>>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryValue {
pub data: serde_json::Value,
pub metadata: MemoryMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryMetadata {
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
pub access_count: u64,
pub tags: Vec<String>,
}