use std::sync::Arc;
use cel_memory::{
ChunkKind, ChunkSource, MemoryProvider, NewMemoryChunk, NewMemorySession, SessionOutcome,
};
use cel_memory_sqlite::{MockEmbedder, SqliteMemoryProvider};
#[tokio::main(flavor = "multi_thread", worker_threads = 2)]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let dir = tempfile::tempdir()?;
let db_path = dir.path().join("memory.sqlite");
let embedder = Arc::new(MockEmbedder::new());
let provider = SqliteMemoryProvider::open(&db_path, embedder).await?;
println!("opened SqliteMemoryProvider at {}", db_path.display());
let session = provider
.open_session(NewMemorySession {
caller_id: "example".into(),
title: Some("basic-example".into()),
metadata: serde_json::json!({}),
})
.await?;
println!("opened session {}", session.id);
let mut written = Vec::with_capacity(10);
for i in 0..10 {
let chunk = provider
.write(NewMemoryChunk {
kind: ChunkKind::Chat,
source: ChunkSource::Embedded,
session_id: Some(session.id.clone()),
project_root: None,
caller_id: "example".into(),
content: format!("chunk number {i} — synthetic content for the basic example"),
metadata: serde_json::json!({ "index": i }),
importance: None,
shareable: false,
pinned: false,
})
.await?;
written.push(chunk);
}
println!("wrote {} chunks", written.len());
let mut read_back = 0;
for chunk in &written {
if let Some(fetched) = provider.get(&chunk.id).await? {
assert_eq!(fetched.content, chunk.content);
read_back += 1;
}
}
println!("read back {read_back} chunks (all matched on content)");
let stats = provider.stats().await?;
println!(
"stats: total_chunks={}, total_sessions={}, embedding_model={:?}",
stats.total_chunks, stats.total_sessions, stats.embedding_model
);
provider
.close_session(&session.id, SessionOutcome::Success)
.await?;
println!("closed session and finished cleanly");
Ok(())
}