kiromi-ai-memory 0.2.2

Local-first multi-tenant memory store engine: Markdown/text content on object storage, metadata in SQLite, plugin-shaped embedder/storage/metadata, hybrid text+vector search.
Documentation
// SPDX-License-Identifier: Apache-2.0 OR MIT
//! `kiromi-ai-memory` — engine for the kiromi-ai-memory memory store.
//!
//! This crate exposes the public API consumers (CLI, FFI, future server) wrap.
//! See `docs/superpowers/specs/` for the design spec.
// Plan 18: relaxed from `forbid` to `deny` so the `sqlite-vec` extension
// auto-load (one tiny `unsafe` block in `metadata::sqlite::ensure_sqlite_vec_loaded`)
// can be opted-in with a localised `#[allow(unsafe_code)]`. The rest of the
// crate stays unsafe-free; CI greps for additional `unsafe_code` allowances.
#![deny(unsafe_code)]
#![warn(missing_docs)]
#![cfg_attr(
    test,
    allow(
        clippy::unwrap_used,
        clippy::expect_used,
        clippy::panic,
        clippy::missing_panics_doc
    )
)]

pub mod anchor;
pub mod attribute;
pub mod audit;
pub mod builder;
pub mod canonical_keys;
pub mod capabilities;
pub mod codec;
pub mod content;
pub mod context;
pub mod embedder;
pub mod error;
pub mod event;
pub mod evolve;
pub mod graph;
pub mod handle;
pub mod index;
pub mod link;
pub mod memory;
pub mod metadata;
pub mod migrate;
pub mod ops;
pub mod opts;
pub mod partition;
pub mod query;
pub mod regen;
mod regen_ops;
pub mod reranker;
pub mod search;
pub mod snapshot;
pub mod storage;
pub mod summarizer;
pub mod summary;
pub mod tenancy;
pub mod tenant;
pub mod util;

pub use crate::attribute::{AttributeValue, kind_str as attribute_kind_str};
pub use crate::builder::Builder;
pub use crate::capabilities::{
    EmbedderCapabilities, MetadataCapabilities, Plugin as CapabilityPlugin, StorageCapabilities,
};
pub use crate::codec::Codec;
pub use crate::content::{Content, ContentHash, ContentKind};
pub use crate::context::{ContextBlock, ContextDiff, ContextKind, ContextOpts, ContextOrdering};
pub use crate::embedder::{CALLER_PROVIDED_EMBEDDER_ID, EmbedRole, Embedder, EmbedderRegistry};
pub use crate::error::{Error, Result};
pub use crate::event::{DEFAULT_EVENT_CAPACITY, MemoryEvent};
pub use crate::evolve::{
    EvolutionApplied, EvolutionOps, EvolutionReport, MemoryAttributeOp, SummaryAttributeOp,
};
pub use crate::graph::{EdgeKind, EdgeKindTag, Graph, GraphEdge, GraphNode, NodeRef, TraverseOpts};
pub use crate::handle::{Memory, MemoryView};
pub use crate::link::{Edge, Link, LinkKind};
pub use crate::memory::{MemoryId, MemoryKind, MemoryRecord, MemoryRecordWire, MemoryRef};
pub use crate::metadata::{MetadataStore, PartitionInfo, SnapshotRow, SqliteMetadata};
pub use crate::migrate::{MigrationOpts, MigrationReport, SchemeMapper};
pub use crate::ops::{BackupReport, CheckpointReport, VacuumOpts, VacuumReport};
pub use crate::opts::{AppendOpts, AttachSummaryOpts, DeleteOpts, LinksOpts, ListOpts, Page};
pub use crate::partition::{PartitionPath, PartitionScheme, Partitions};
pub use crate::query::{Query, QueryMode, SearchHit};
pub use crate::regen::{GcOpts, GcReport, RegenReport, RegenSubjectOpts, ReindexReport};
pub use crate::reranker::Reranker;
pub use crate::snapshot::{
    RestoreOpts, RestoreReport, SnapshotAttribute, SnapshotId, SnapshotManifest, SnapshotOpts,
    SnapshotRef,
};
pub use crate::storage::{InMemoryBackend, LocalFsBackend, Storage};
pub use crate::summarizer::{
    SummarizeOpts, Summarizer, SummarizerCapabilities, SummarizerRegistry, SummaryStyle,
};
pub use crate::summary::content::{
    DataPointRef, PartitionRef, SummaryBlock, SummaryContent, SummaryInputRange,
};
pub use crate::summary::{Scope, StaleKind, SummaryId, SummaryRecord, SummaryRef, SummarySubject};
pub use crate::tenant::TenantId;

/// Crate version — written into audit log entries.
pub const VERSION: &str = env!("CARGO_PKG_VERSION");

#[cfg(test)]
mod sync_send_asserts {
    //! Plan 14 phase C.2 — compile-time guards that every cross-thread public
    //! type stays `Send + Sync` and that the public traits stay object-safe.
    //!
    //! If any of these fail to compile, the public surface has regressed —
    //! diagnose the offending field/payload before adjusting the assert.

    use static_assertions::assert_impl_all;

    use super::*;

    // Engine handles cross thread boundaries (every async runtime usage).
    assert_impl_all!(Memory: Send, Sync, Clone);
    assert_impl_all!(MemoryView: Send, Sync);

    // Records returned by reads.
    assert_impl_all!(MemoryRecord: Send, Sync, Unpin);
    assert_impl_all!(MemoryRef: Send, Sync, Unpin);
    assert_impl_all!(MemoryId: Send, Sync, Unpin, Copy);

    // Options consumed by writes / queries.
    assert_impl_all!(AppendOpts: Send, Sync, Unpin);
    assert_impl_all!(ListOpts: Send, Sync, Unpin);
    assert_impl_all!(DeleteOpts: Send, Sync, Unpin);
    assert_impl_all!(Query: Send, Sync, Unpin);
    assert_impl_all!(snapshot::SnapshotOpts: Send, Sync);
    assert_impl_all!(snapshot::RestoreOpts: Send, Sync);

    // Push-side events: cloned across subscriber tasks.
    assert_impl_all!(MemoryEvent: Send, Sync, Clone);

    // Snapshots / regen / migration reports.
    assert_impl_all!(snapshot::SnapshotManifest: Send, Sync);
    assert_impl_all!(snapshot::SnapshotRef: Send, Sync);
    assert_impl_all!(regen::RegenReport: Send, Sync);
    assert_impl_all!(regen::ReindexReport: Send, Sync);
    assert_impl_all!(regen::GcReport: Send, Sync);
    assert_impl_all!(migrate::MigrationReport: Send, Sync);

    // Summary surface (Plan 9 + Plan 11).
    assert_impl_all!(SummaryRecord: Send, Sync);
    assert_impl_all!(SummaryRef: Send, Sync);
    assert_impl_all!(summary::SummarySubject: Send, Sync);
    assert_impl_all!(summary::content::SummaryContent: Send, Sync);

    // Attribute payload (Plan 11).
    assert_impl_all!(attribute::AttributeValue: Send, Sync);

    // Errors must round-trip across thread boundaries.
    assert_impl_all!(Error: Send, Sync);

    // Public traits must stay object-safe (engine internals already use
    // `dyn Storage`, `dyn MetadataStore`, etc., but compile-fail here pins
    // it from the public side too).
    fn _assert_object_safe(
        _s: &dyn storage::Storage,
        _m: &dyn metadata::MetadataStore,
        _e: &dyn embedder::Embedder,
        _sm: &dyn summarizer::Summarizer,
        _r: &dyn reranker::Reranker,
        _c: &dyn codec::Codec,
    ) {
    }
}