[package]
name = "kglite-bolt-server"
version = "0.12.1"
edition = "2021"
authors = ["Kristian dF Kollsgård <kkollsg@gmail.com>"]
license = "MIT"
description = "Bolt v5.x protocol server for kglite knowledge graphs — pure-Rust single-binary frontend speaking the Neo4j wire protocol so the Neo4j driver ecosystem (Python/JS/Java/Go/.NET drivers, Cypher Shell, Neo4j Browser, BloodHound, LangChain Neo4jGraph) plugs in unchanged."
readme = "README.md"
repository = "https://github.com/kkollsga/kglite"
homepage = "https://github.com/kkollsga/kglite"
documentation = "https://kglite.readthedocs.io/en/latest/operators/bolt-server.html"
keywords = ["bolt", "neo4j", "cypher", "knowledge-graph", "kglite"]
categories = ["database", "command-line-utilities"]

[[bin]]
name = "kglite-bolt-server"
path = "src/main.rs"

[dependencies]
# Reuse kglite's pure-Rust surface (kglite::api::*) — no libpython link
# in the resulting binary. Mirrors the kglite-mcp-server pattern.
# `default-features = false` skips the `abi3` toggle (which only matters
# for wheel builds) but keeps the lib compilable for cargo's binary
# build. No `fastembed` here — Bolt server is a wire transport and
# doesn't expose `text_score()`-style semantic search.
# Phase G.4: the kglite engine crate is the workspace member at crates/kglite/. The pyo3-wrapper
# crate (`kglite-py`) is now the separate workspace member that
# bolt-server NEVER depends on — keeps pyo3 out of this binary's
# dep tree (verified via `cargo tree -p kglite-bolt-server | grep
# pyo3` → empty).
# Local dev uses the path dep; `cargo publish` strips path and falls
# back to the version requirement (so this crate publishes against
# the crates.io kglite). The version must be kept in sync with
# `crates/kglite/Cargo.toml`'s package.version on each release.
kglite = { version = "0.12", path = "../kglite", default-features = false }

# Bolt v5.x protocol library. Implements PackStream framing, message
# dispatch, session state machine, handshake. We implement BoltBackend
# (the 11-method seam in boltr::server::BoltBackend) and hand the
# instance to BoltServer::builder(...).serve(addr).
#
# boltr v0.2.0 requires rust-version = "1.91.0". Local + CI toolchains
# (rustc stable 1.95+) clear this comfortably. Phase B's plan calls out
# the upstream-churn risk; we accept it because hand-rolling Bolt
# framing for Phase B alone is not the right shape.
boltr = { version = "0.2", features = ["tls"] }

# Phase F #6: rustls crypto provider for boltr's TLS support.
# boltr enables tokio-rustls but doesn't pick a crypto provider —
# we install `ring` at startup (see main.rs). `ring` is the more
# battle-tested option; `aws-lc-rs` is the alternative.
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }

# Async trait sugar used by boltr's BoltBackend trait declaration.
async-trait = "0.1"

# Async runtime. Features match what boltr needs from tokio at runtime
# plus what main.rs needs to register a SIGINT shutdown future.
tokio = { version = "1", features = ["macros", "rt-multi-thread", "net", "signal", "io-util", "sync", "time"] }

clap = { version = "4", features = ["derive"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
anyhow = "1"
# `Value::DateTime(NaiveDate)` arithmetic for the Bolt Date encoding
# (days-since-Unix-epoch). Already transitive via kglite; pin to the
# same version range so a workspace-level chrono bump touches us too.
chrono = { version = "0.4.43", default-features = false }
