Skip to content

v4.0.0

Latest

Choose a tag to compare

@fellanH fellanH released this 09 Jul 06:43

[4.0.0] — 2026-07-08

Changed — Rewritten in Rust; TypeScript engine removed (BREAKING)

The vault engine has been ported from TypeScript to Rust (crates/) and the TypeScript
engine + Node CLI have been deleted — the Rust binary is now the whole product.

  • context-vault-core — local-first markdown persistence (save writes .md + indexes
    it; reindex walks the tree), per-vault schema + multi-vault registry, hybrid FTS+vector
    search with filters, lifecycle (summarize/compact/archive/assemble/consolidation/
    tier-analysis), ingest (url/project), file watcher, and a 13-tool MCP stdio server.
  • context-vault-cli — full engine command surface + mcp server + setup (MCP-client
    registration for Claude Desktop / Claude Code / Cursor).
  • context-vault-gateway — axum HTTP server (bearer auth) replacing the TS hosted-gateway.
  • context-vault npm package — now a thin launcher that execs the native Rust binary
    (per-platform optionalDependencies). Removed: packages/core, the Node engine/tool
    sources, and the connector/cloud-sync commands (gmail-bridge, slack-bridge, contacts,
    ingest-comms, team, remote) — kept out of the minimal core.
  • @context-vault/sdk — logic-free: .local() spawns the Rust MCP binary; no
    @context-vault/core dependency.

Added — Node-free install (install.sh / install.ps1)

curl -fsSL .../install.sh | sh (or install.ps1 on Windows) downloads the native binary
straight from this release's GitHub Release assets and verifies it against SHA256SUMS
no Node, no npm required. npx context-vault / npm install -g context-vault remain
supported as a secondary on-ramp for users who already have Node.

Added — recall CLI subcommand

context-vault recall <signal> [--limit N] surfaces lightweight hints from the vault for a
raw signal (prompt text, error message, or file path), wrapping the MCP recall capability
so shells and hooks can query the vault without an MCP client. The shipped recall hooks
previously called a subcommand that did not exist.

Fixed

  • session-end captured zero sessions. The transcript parser read role/content at
    the top level, but real Claude Code transcripts nest them under message and interleave
    non-message line types — so every session silently produced no capture. Parsing now
    normalizes real nested transcripts; regression-tested against a real-shape fixture.
  • search / recall crashed on ordinary input. FTS queries were passed to SQLite FTS5
    verbatim, so a query containing an operator character (e.g. the - in session-end)
    raised no such column; separately, matches from an out-of-sync external-content index
    returned a NULL bm25 rank that the row reader treated as a hard error. Queries are now
    tokenized into quoted phrases, and NULL ranks degrade to unranked hits instead of
    crashing.
  • SDK LocalBackend hung forever on any reply containing a multibyte character. The
    Content-Length frame parser measured a decoded JS string (UTF-16 code units) against the
    header's UTF-8 byte count, so replies with e.g. the "✓" in save_context confirmations
    never completed a frame and capture()/save() hung on every runtime (Node and Bun
    alike). The parser now operates on raw bytes and decodes only the extracted body. Also
    adds LocalBackend.close() for clean engine shutdown. Regression test:
    packages/sdk/test/local-framing.test.mjs (dependency-free node:test, fake multibyte
    MCP server, no Rust binary needed).