use adk_core::{Content, Result};
use async_trait::async_trait;
use chrono::{DateTime, Utc};
#[derive(Debug, Clone)]
pub struct MemoryEntry {
pub content: Content,
pub author: String,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct SearchRequest {
pub query: String,
pub user_id: String,
pub app_name: String,
pub limit: Option<usize>,
pub min_score: Option<f32>,
#[serde(default)]
pub project_id: Option<String>,
}
#[derive(Debug, Clone)]
pub struct SearchResponse {
pub memories: Vec<MemoryEntry>,
}
pub fn validate_project_id(project_id: &str) -> Result<()> {
if project_id.is_empty() {
return Err(adk_core::AdkError::memory("project_id must not be empty"));
}
if project_id.len() > 256 {
return Err(adk_core::AdkError::memory(format!(
"project_id exceeds maximum length of 256 characters (got {})",
project_id.len()
)));
}
Ok(())
}
#[async_trait]
pub trait MemoryService: Send + Sync {
async fn add_session(
&self,
app_name: &str,
user_id: &str,
session_id: &str,
entries: Vec<MemoryEntry>,
) -> Result<()>;
async fn search(&self, req: SearchRequest) -> Result<SearchResponse>;
async fn delete_user(&self, app_name: &str, user_id: &str) -> Result<()> {
let _ = (app_name, user_id);
Err(adk_core::AdkError::memory("delete_user not implemented"))
}
async fn delete_session(&self, app_name: &str, user_id: &str, session_id: &str) -> Result<()> {
let _ = (app_name, user_id, session_id);
Err(adk_core::AdkError::memory("delete_session not implemented"))
}
async fn add_entry(&self, app_name: &str, user_id: &str, entry: MemoryEntry) -> Result<()> {
let _ = (app_name, user_id, entry);
Err(adk_core::AdkError::memory("add_entry not implemented"))
}
async fn delete_entries(&self, app_name: &str, user_id: &str, query: &str) -> Result<u64> {
let _ = (app_name, user_id, query);
Err(adk_core::AdkError::memory("delete_entries not implemented"))
}
async fn health_check(&self) -> Result<()> {
Ok(())
}
async fn add_session_to_project(
&self,
app_name: &str,
user_id: &str,
session_id: &str,
project_id: &str,
entries: Vec<MemoryEntry>,
) -> Result<()> {
let _ = project_id;
self.add_session(app_name, user_id, session_id, entries).await
}
async fn add_entry_to_project(
&self,
app_name: &str,
user_id: &str,
project_id: &str,
entry: MemoryEntry,
) -> Result<()> {
let _ = project_id;
self.add_entry(app_name, user_id, entry).await
}
async fn delete_entries_in_project(
&self,
app_name: &str,
user_id: &str,
project_id: &str,
query: &str,
) -> Result<u64> {
let _ = project_id;
self.delete_entries(app_name, user_id, query).await
}
async fn delete_project(&self, app_name: &str, user_id: &str, project_id: &str) -> Result<u64> {
let _ = (app_name, user_id, project_id);
Err(adk_core::AdkError::memory("delete_project not implemented"))
}
}