fathomdb-engine 0.5.5

Storage engine and write coordinator for the fathomdb agent datastore
Documentation
#[macro_use]
mod trace_support;

mod admin;
mod coordinator;
mod database_lock;
mod embedder;
mod ids;
mod operational;
mod projection;
pub mod rebuild_actor;
mod runtime;
mod sqlite;
mod telemetry;
mod vector_projection_actor;
mod writer;

pub use admin::{
    AdminHandle, AdminService, Capabilities, ConfigureEmbeddingOutcome, ConfigureVecOutcome,
    CurrentConfig, EmbedderCapability, EmbeddingProfileSummary, FtsKindConfig, FtsProfile,
    FtsPropertyPathMode, FtsPropertyPathSpec, FtsPropertySchemaRecord, IntegrityReport,
    KindDescription, LogicalPurgeReport, LogicalRestoreReport, ProjectionImpact,
    ProvenancePurgeOptions, ProvenancePurgeReport, SafeExportManifest, SafeExportOptions,
    SemanticReport, SkippedEdge, TOKENIZER_PRESETS, TraceReport, VecIndexStatus, VecKindConfig,
    VecProfile, VectorRegenerationConfig, VectorRegenerationReport, VectorSource, WorkQueueSummary,
    load_vector_regeneration_config,
};
pub use coordinator::{
    ActionRow, EdgeExpansionRootRows, EdgeExpansionSlotRows, EdgeRow, ExecutionCoordinator,
    ExpansionRootRows, ExpansionSlotRows, GroupedQueryRows, NodeRow, ProvenanceEvent, QueryPlan,
    QueryRows, RunRow, StepRow,
};
#[cfg(feature = "default-embedder")]
pub use embedder::BuiltinBgeSmallEmbedder;
pub use embedder::{BatchEmbedder, EmbedderError, QueryEmbedder, QueryEmbedderIdentity};
pub use ids::{new_id, new_row_id};
pub use operational::{
    OperationalCollectionKind, OperationalCollectionRecord, OperationalCompactionReport,
    OperationalCurrentRow, OperationalFilterClause, OperationalFilterField,
    OperationalFilterFieldType, OperationalFilterMode, OperationalFilterValue,
    OperationalHistoryValidationIssue, OperationalHistoryValidationReport, OperationalMutationRow,
    OperationalPurgeReport, OperationalReadReport, OperationalReadRequest,
    OperationalRegisterRequest, OperationalRepairReport, OperationalRetentionActionKind,
    OperationalRetentionPlanItem, OperationalRetentionPlanReport, OperationalRetentionRunItem,
    OperationalRetentionRunReport, OperationalSecondaryIndexDefinition,
    OperationalSecondaryIndexField, OperationalSecondaryIndexRebuildReport,
    OperationalSecondaryIndexValueType, OperationalTraceReport, OperationalValidationContract,
    OperationalValidationField, OperationalValidationFieldType, OperationalValidationMode,
};
pub use projection::{ProjectionRepairReport, ProjectionService, ProjectionTarget};
pub use rebuild_actor::{RebuildMode, RebuildProgress, RebuildStateRow};
pub use runtime::EngineRuntime;
pub use sqlite::{SharedSqlitePolicy, shared_sqlite_policy};
pub use telemetry::{
    SqliteCacheStatus, TelemetryCounters, TelemetryLevel, TelemetrySnapshot, read_db_cache_status,
};
pub use vector_projection_actor::{DrainReport, VectorProjectionActor};
pub use writer::{
    ActionInsert, ChunkInsert, ChunkPolicy, EdgeInsert, EdgeRetire, LastAccessTouchReport,
    LastAccessTouchRequest, NodeInsert, NodeRetire, OperationalWrite, OptionalProjectionTask,
    ProvenanceMode, RunInsert, StepInsert, WriteReceipt, WriteRequest, WriterActor,
};
// Pack G: `VecInsert` is `#[deprecated]` but still re-exported so external
// callers see the warning rather than a hard compile break during the
// transition window. The inner `#[allow]` silences the deprecation on the
// re-export itself.
#[allow(deprecated)]
pub use writer::VecInsert;

use thiserror::Error;

/// Top-level error type for all engine operations.
#[derive(Debug, Error)]
pub enum EngineError {
    #[error("sqlite error: {0}")]
    Sqlite(#[from] rusqlite::Error),
    #[error("schema error: {0}")]
    Schema(#[from] fathomdb_schema::SchemaError),
    #[error("io error: {0}")]
    Io(#[from] std::io::Error),
    #[error("writer actor rejected request: {0}")]
    WriterRejected(String),
    #[error("write timed out (may still commit): {0}")]
    WriterTimedOut(String),
    #[error("invalid write request: {0}")]
    InvalidWrite(String),
    #[error("bridge error: {0}")]
    Bridge(String),
    #[error("capability missing: {0}")]
    CapabilityMissing(String),
    #[error("database locked: {0}")]
    DatabaseLocked(String),
    #[error("invalid configuration: {0}")]
    InvalidConfig(String),
    #[error(
        "embedder not configured: call Engine::open with a non-None EmbedderChoice to regenerate vector embeddings"
    )]
    EmbedderNotConfigured,
    /// Attempted to change the database-wide embedding identity while
    /// enabled per-kind vector index schemas exist, but the caller did not
    /// acknowledge the rebuild impact. Re-invoke with
    /// `acknowledge_rebuild_impact = true` to proceed (which will mark the
    /// affected kinds `stale` without triggering a rebuild).
    #[error(
        "changing the database-wide embedding identity would invalidate {affected_kinds} enabled vector index kinds; re-invoke with acknowledge_rebuild_impact=true"
    )]
    EmbeddingChangeRequiresAck {
        /// Number of enabled per-kind vector index schemas that would be
        /// marked stale by the identity change.
        affected_kinds: usize,
    },
    /// The caller ran `semantic_search` / `raw_vector_search` against a
    /// kind that has no enabled `vector_index_schemas` row. Configure per-kind
    /// vector indexing via `AdminService::configure_vec_kind` first.
    #[error(
        "kind {kind:?} is not vector-indexed; call configure_vec_kind({kind:?}, VectorSource::Chunks) before running semantic_search/raw_vector_search"
    )]
    KindNotVectorIndexed {
        /// Node kind the caller tried to search.
        kind: String,
    },
    /// The caller's vector (or the embedder's output) does not match the
    /// active embedding profile's dimension.
    #[error("vector dimension mismatch: expected {expected}, got {actual}")]
    DimensionMismatch {
        /// Dimension declared by the active embedding profile.
        expected: usize,
        /// Dimension of the vector the caller / embedder produced.
        actual: usize,
    },
}