aimem-core 0.3.4

Core library for AiMem — give your AI a memory. Vector search + knowledge graph over Turso.
Documentation
use aimem_core::{AimemDb, Config, ContentPart, LocalEmbedder, MemoryStack};
use anyhow::Result;
use std::sync::Arc;
use std::sync::OnceLock;

fn shared_local_embedder() -> Arc<LocalEmbedder> {
    static EMBEDDER: OnceLock<Arc<LocalEmbedder>> = OnceLock::new();
    EMBEDDER
        .get_or_init(|| Arc::new(LocalEmbedder::new().expect("local embedder should initialize")))
        .clone()
}

#[tokio::test]
async fn file_drawer_with_id_inserts_once_and_keeps_metadata() -> Result<()> {
    let db = AimemDb::memory().await?;
    let cfg = Config::default();
    let stack = MemoryStack::new(db.clone(), shared_local_embedder(), &cfg);

    let inserted = stack
        .file_drawer_with_id(
            "attachment.chunk.001",
            "attachments",
            "wxmem.bot-a.direct.user-1",
            "Attachment document / 文件 'report.pdf' chunk 1".to_string(),
            vec![ContentPart::text(
                "Attachment document / 文件 'report.pdf' chunk 1",
            )],
            Some("report.pdf"),
            1,
            "bot-a",
        )
        .await?;
    assert!(inserted);

    let inserted_again = stack
        .file_drawer_with_id(
            "attachment.chunk.001",
            "attachments",
            "wxmem.bot-a.direct.user-1",
            "Attachment document / 文件 'report.pdf' chunk 1".to_string(),
            vec![ContentPart::text(
                "Attachment document / 文件 'report.pdf' chunk 1",
            )],
            Some("report.pdf"),
            1,
            "bot-a",
        )
        .await?;
    assert!(!inserted_again);

    let drawers = db
        .fetch_drawers(Some("attachments"), Some("wxmem.bot-a.direct.user-1"), 10)
        .await?;
    assert_eq!(drawers.len(), 1);
    assert_eq!(drawers[0].id, "attachment.chunk.001");
    assert_eq!(drawers[0].source_file.as_deref(), Some("report.pdf"));
    assert_eq!(drawers[0].chunk_index, 1);

    Ok(())
}