The MentisDB Agent Memory Cookbook

Patterns and recipes for building AI agents that remember

3.2 Vector Sidecar Management

The chain log is canonical. A vector sidecar is a derived index that can be rebuilt from the log at any time. Treat sidecars as durable caches: useful, integrity-checked, but never the source of truth.

The pattern

fn manage_vector_sidecar_lifecycle() -> io::Result<()> {
    let dir = tempfile::tempdir()?;
    let adapter = BinaryStorageAdapter::for_chain_key(dir.path(), "cookbook-sidecars");
    let mut chain = MentisDb::open_with_storage(Box::new(adapter))?;

    chain.upsert_agent(
        "search-agent",
        Some("Search Agent"),
        Some("memory-team"),
        Some("Maintains vector sidecars"),
        None,
    )?;
    chain.append_thought(
        "search-agent",
        ThoughtInput::new(
            ThoughtType::Decision,
            "Use local embeddings for offline semantic search during development.",
        )
        .with_concepts(["embeddings", "offline-search"]),
    )?;

    let provider = mentisdb::search::LocalTextEmbeddingProvider::new();
    let sidecar = chain
        .manage_vector_sidecar(provider)
        .map_err(|error| io::Error::other(format!("{error:?}")))?;
    assert_eq!(sidecar.entries.len(), 1);

    chain.append_thought(
        "search-agent",
        ThoughtInput::new(
            ThoughtType::Insight,
            "Managed sidecars update on append for the open handle.",
        )
        .with_concepts(["embeddings", "sidecar-sync"]),
    )?;

    let statuses = chain.managed_vector_sidecar_statuses()?;
    assert!(statuses.iter().any(|status| {
        status.provider_key == "local-text-v1" && status.sidecar_exists
    }));

    let result = chain.query_ranked(
        &RankedSearchQuery::new()
            .with_text("offline semantic search")
            .with_limit(3),
    );
    assert!(!result.hits.is_empty());
    Ok(())
}
Production rule: back up the chain log first. Sidecars can be rebuilt; lost append-only thoughts cannot.