1use async_trait::async_trait;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct MemoryMetadata {
11 pub session_id: crate::types::SessionId,
13 pub turn: Option<u32>,
15 pub indexed_at: crate::time_compat::SystemTime,
17}
18
19#[derive(Debug, Clone)]
21pub struct MemoryResult {
22 pub content: String,
24 pub metadata: MemoryMetadata,
26 pub score: f32,
28}
29
30#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
32#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
33pub trait MemoryStore: Send + Sync {
34 async fn index(&self, content: &str, metadata: MemoryMetadata) -> Result<(), MemoryStoreError>;
36
37 async fn search(
39 &self,
40 query: &str,
41 limit: usize,
42 ) -> Result<Vec<MemoryResult>, MemoryStoreError>;
43}
44
45#[derive(Debug, thiserror::Error)]
47pub enum MemoryStoreError {
48 #[error("Embedding error: {0}")]
49 Embedding(String),
50
51 #[error("Index error: {0}")]
52 Index(String),
53
54 #[error("IO error: {0}")]
55 Io(#[from] std::io::Error),
56}