[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 (
savewrites.md+ indexes
it;reindexwalks 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 +
mcpserver +setup(MCP-client
registration for Claude Desktop / Claude Code / Cursor). - context-vault-gateway — axum HTTP server (bearer auth) replacing the TS hosted-gateway.
context-vaultnpm package — now a thin launcher that execs the native Rust binary
(per-platformoptionalDependencies). 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/coredependency.
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-endcaptured zero sessions. The transcript parser readrole/contentat
the top level, but real Claude Code transcripts nest them undermessageand 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/recallcrashed on ordinary input. FTS queries were passed to SQLite FTS5
verbatim, so a query containing an operator character (e.g. the-insession-end)
raisedno 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
LocalBackendhung 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 "✓" insave_contextconfirmations
never completed a frame andcapture()/save()hung on every runtime (Node and Bun
alike). The parser now operates on raw bytes and decodes only the extracted body. Also
addsLocalBackend.close()for clean engine shutdown. Regression test:
packages/sdk/test/local-framing.test.mjs(dependency-freenode:test, fake multibyte
MCP server, no Rust binary needed).