fathomdb-engine 0.8.20

FathomDB engine — embedded vector + JSON database core (storage, projection, ingest, query).
Documentation
[package]
name = "fathomdb-engine"
description = "FathomDB engine — embedded vector + JSON database core (storage, projection, ingest, query)."
# 0.8.20 Slice 39 (R-20-DOC) — see the fathomdb facade manifest for the rationale
# behind `readme` being explicit and `categories` being absent (HITL seq-198).
readme = "README.md"
keywords = ["database", "embedded", "sqlite", "vector-search", "full-text-search"]
version.workspace = true
edition.workspace = true
license.workspace = true
# 0.8.20 Slice 39 (R-20-DOC): ships the repo-root MIT LICENSE inside this
# crate's `.crate` tarball. Path is resolved relative to the workspace root.
license-file.workspace = true
repository.workspace = true
rust-version.workspace = true

[dependencies]
fathomdb-embedder.workspace = true
fathomdb-embedder-api.workspace = true
fathomdb-query.workspace = true
fathomdb-schema.workspace = true
rusqlite = { version = "0.31", features = ["bundled"] }
jsonschema = { version = "0.18", default-features = false }
serde_json = "1"
sha2 = "0.11"
sqlite-vec = "=0.1.7"

[features]
default = []
# Slice 27 fix-1 (Q5=BIND-RUST, AC-074): the operator/recovery seam
# (rebuild_*, excise_source, dump_*, trace_source_ref, truncate_wal,
# verify_embedder, check_integrity, safe_export, recompute_mean + their
# operator-exclusive private helpers) is gated behind this feature so the
# DEFAULT engine surface is recovery-clean at the method level. Behavior is
# identical with the feature on (gate, not delete). `fathomdb-cli` enables it.
operator = []
# EU-5b: turning on this feature causes `EmbedderChoice::Default` to
# materialize a real `CandleBgeEmbedder` via the loader at `Engine::open`.
# Without it, `EmbedderChoice::Default` returns a typed `EmbedderError`
# rather than attempting a network fetch (preserves the no-network build
# closure per ADR-0.7.1-default-embedder-weight-fetch).
default-embedder = ["fathomdb-embedder/default-embedder"]
# GPU acceleration (opt-in; forwards to the embedder; default stays CPU).
# Activate at runtime via FATHOMDB_EMBED_DEVICE=cuda|metal.
embed-cuda = ["default-embedder", "fathomdb-embedder/embed-cuda"]
embed-metal = ["default-embedder", "fathomdb-embedder/embed-metal"]
# 0.8.1 Slice 10 (R1): enabling this feature gates the CPU cross-encoder CE
# inference path (TinyBERT-L-2 via Candle) in `rerank_fused`. Without this
# feature, `rerank_fused` is always the identity (soft-fallback) path — no
# network call, no ML dependency. With the feature ON and weights cached
# locally, `rerank_depth > 0` activates the CE scorer + score-blend.
# Design memo: dev/design/0.8.1-slice-10-reranker-design.md.
# 0.8.2 Slice E1: forwards to the embedder's `default-reranker` feature, which
# owns the Candle + tokenizers CE stack (`CandleTinyBertReranker`). The default
# engine build enables neither, staying ML-free + no-network.
default-reranker = ["fathomdb-embedder/default-reranker"]
# 0.8.12 — GPU acceleration for the CE reranker (opt-in; forwards to the
# embedder; default stays CPU). Activate at runtime via the separate knob
# FATHOMDB_RERANK_DEVICE=cuda|metal. Mirrors the embed-cuda passthrough.
rerank-cuda = ["default-reranker", "fathomdb-embedder/rerank-cuda"]
rerank-metal = ["default-reranker", "fathomdb-embedder/rerank-metal"]

# The corpus-ingest example calls the operator-seam `trace_source_ref`, so it
# only builds when the `operator` feature is enabled (skipped on default builds).
[[example]]
name = "ingest_corpus"
required-features = ["operator"]

# Slice 27 fix-2: these integration-test targets exercise the operator/recovery
# `Engine` methods that fix-1 gated behind `operator`. They are PURE-operator
# (every `#[test]` calls a gated method), so the whole target is skipped on the
# default build and runs under `--features operator`. This makes
# `cargo test -p fathomdb-engine` (default) compile again without un-gating any
# method. (The mixed `pr2b_mean_recompute.rs` is NOT here — its non-operator
# carve-out test stays default-runnable via per-fn `#[cfg(feature = "operator")]`.)
[[test]]
name = "check_integrity"
required-features = ["operator"]

[[test]]
name = "dump_profile"
required-features = ["operator"]

[[test]]
name = "dump_row_counts"
required-features = ["operator"]

[[test]]
name = "dump_schema"
required-features = ["operator"]

[[test]]
name = "eu7_real_corpus_ac"
required-features = ["operator"]

[[test]]
name = "erasure_projection_registry"
required-features = ["operator"]

[[test]]
name = "erasure_completeness"
required-features = ["operator"]

[[test]]
name = "provenance_mandatory"
required-features = ["operator"]

[[test]]
name = "excise_source"
required-features = ["operator"]

[[test]]
name = "rebuild_projections"
required-features = ["operator"]

[[test]]
name = "rebuild_report"
required-features = ["operator"]

[[test]]
name = "rebuild_vec0"
required-features = ["operator"]

[[test]]
name = "safe_export"
required-features = ["operator"]

[[test]]
name = "trace_source_ref"
required-features = ["operator"]

[[test]]
name = "truncate_wal"
required-features = ["operator"]

[[test]]
name = "verify_embedder"
required-features = ["operator"]

# 0.8.2 Slice E1: the CE-reorders test exercises the real reranker, so the whole
# target only compiles/runs under `--features default-reranker`. The default
# build skips it (and the soft-fallback identity tests in `pr_g10_reranker.rs`
# stay default-runnable).
[[test]]
name = "pr_g10_reranker_ce"
required-features = ["default-reranker"]

# 0.8.2 Slice E2: the standalone-rerank helper (`rerank_passages`) reorder test
# exercises the real reranker, so the whole target only compiles/runs under
# `--features default-reranker` (same gate as `pr_g10_reranker_ce`).
[[test]]
name = "pr_e2_rerank_passages"
required-features = ["default-reranker"]

# 0.8.2 Slice E2 fix-1 [P2]: is_finite guard tests — no feature gate because the
# guard fires before the CE model path (depth/feature state irrelevant).
[[test]]
name = "pr_e2_rerank_nonfinite"

[dev-dependencies]
libc = "0.2"
proptest = "1"
rusqlite = { version = "0.31", features = ["bundled"] }
serde_json = "1"
sha2 = "0.11"
tempfile = "3"