- Interactive onboarding (
engraph init) — polished CLI with welcome banner, vault scan checkmarks, identity prompts via dialoguer, progress bars, actionable next steps - Agent onboarding —
engraph init --detect --jsonfor vault inspection,--jsonfor non-interactive apply. Two-phase detect → apply flow for AI agents. identityMCP tool + CLI + HTTP — returns compact L0/L1 identity block (~170 tokens) for AI session contextsetupMCP tool + HTTP — first-time setup from inside an MCP session (detect/apply modes)identity_factstable — SQLite storage for L0 (static identity) and L1 (dynamic context) facts- L1 auto-extraction — active projects, key people, current focus, OOO status, blocking items extracted during
engraph index engraph identity --refresh— re-extract L1 facts without full reindex[identity]config section — name, role, vault_purpose in config.toml[memory]config section — feature flags for identity/timeline/mining
- MCP tools: 23 → 25
- HTTP endpoints: 24 → 26
- Dependencies: +dialoguer 0.12, +console 0.16, +regex 1
auto_linkparameter oncreate— set tofalseto skip automatic wikilink resolution. Applies to MCP, HTTP, and CLI. Discovered links still appear as suggestions in the response.reindex_fileMCP tool + HTTP endpoint — re-indexes a single file after external edits. Reads from disk, re-embeds chunks, rebuilds edges. Available as MCP tool,POST /api/reindex-file, and OpenAPI operation.
- rmcp bumped from 1.2.0 to 1.4.0 — host validation, non-Send handler support, transport fixes. Does not yet fix #20 (protocol
2025-11-25needed for Claude Desktop Cowork/Code modes — blocked upstream on modelcontextprotocol/rust-sdk#800). - MCP tools: 22 → 23
- HTTP endpoints: 23 → 24
- OpenAPI version: 1.5.0 → 1.5.5
- OpenAPI 3.1.0 spec (
openapi.rs) — hand-written spec for all 23 endpoints, served atGET /openapi.json - ChatGPT plugin manifest — served at
GET /.well-known/ai-plugin.json --setup-chatgptCLI helper — interactive setup: enables HTTP, creates API key, configures CORS, prompts for public URL- Plugin config —
[http.plugin]section for name, description, contact_email, public_url
- Module count: 25 → 26
- Test count: 417 → 426
/openapi.jsonand/.well-known/ai-plugin.jsonroutes require no authentication
- PARA migration engine (
migrate.rs) — AI-assisted vault restructuring into Projects/Areas/Resources/Archive - Heuristic classification — priority-ordered rules detect Projects (tasks, active status), Areas (recurring topics), Resources (people, reference), Archive (done, inactive)
- Preview-then-apply workflow — generates markdown + JSON preview for review before moving files
- Migration rollback —
engraph migrate para --undoreverses the last migration - 3 new MCP tools —
migrate_preview,migrate_apply,migrate_undo - 3 new HTTP endpoints —
POST /api/migrate/preview,/apply,/undo - Migration log — SQLite table tracks all moves for rollback support
- Module count: 24 → 25
- MCP tools: 19 → 22
- HTTP endpoints: 20 → 23
- Test count: 385 → 417
- HTTP REST API (
http.rs) — axum-based HTTP server alongside MCP, enabled viaengraph serve --http - 20 REST endpoints mirroring all 19 MCP tools + update-metadata
- API key authentication —
eg_prefixed keys with read/write permission levels - Rate limiting — configurable per-key token bucket (requests/minute)
- CORS — configurable allowed origins for web-based agents
- Graceful shutdown — CancellationToken coordinates MCP + HTTP + watcher exit
- API key management CLI —
engraph configure --add-api-key/--list-api-keys/--revoke-api-key --no-authmode — local development without API keys (127.0.0.1 only)
engraph servegains--http,--port,--host,--no-authflags- Module count: 23 → 24
- Test count: 361 → 385
- New dependencies: axum, tower-http, tower, rand, tokio-util
- Temporal search lane (
temporal.rs) — 5th RRF lane for time-aware queries - Date extraction — from frontmatter
date:field orYYYY-MM-DDfilename pattern - Heuristic date parsing — "today", "yesterday", "last week", "this month", "recent", month names, ISO dates, date ranges
- LLM date extraction — orchestrator detects temporal intent and extracts date ranges from natural language
- Temporal scoring — smooth decay function for files near but outside the target date range
- Temporal candidate injection — date-matched files enter candidate pool as graph seeds
- Confidence % display — search results show normalized confidence (0-100%) instead of raw RRF scores
- Date coverage stats —
engraph statusshows how many files have extractable dates
QueryIntentgainsTemporalvariant with custom lane weights (temporal: 1.5)OrchestrationResultgainsdate_rangefield (backward-compatible serde)LaneWeightsgainstemporalfield (0.0 for non-temporal intents)insert_filesignature extended withnote_dateparameter- Module count: 22 → 23
- Test count: 318 → 361
- Section parser (
markdown.rs) — heading detection, section extraction, frontmatter splitting - Obsidian CLI wrapper (
obsidian.rs) — process detection, circuit breaker (Closed/Degraded/Open), async CLI delegation - Vault health (
health.rs) — orphan detection, broken link detection, stale notes, tag hygiene - Section-level editing —
edit_note()with replace/prepend/append modes targeting specific headings - Note rewriting —
rewrite_note()with frontmatter preservation - Frontmatter mutations —
edit_frontmatter()with granular set/remove/add_tag/remove_tag/add_alias/remove_alias ops - Hard delete —
delete_note()with soft (archive) and hard (permanent) modes - Section reading —
read_section()in context engine for targeted note section access - Enhanced file resolution — fuzzy Levenshtein matching as final fallback in
resolve_file() - 6 new MCP tools —
read_section,health,edit,rewrite,edit_frontmatter,delete - CLI events table — audit log for CLI operations
- Watcher coordination —
recent_writesmap prevents double re-indexing of MCP-written files - Content-based role detection — detect people/daily/archive folders by content patterns, not just names
- Enhanced onboarding —
engraph initdetects Obsidian CLI + AI agents,engraph configurehas new flags - Config sections —
[obsidian]and[agents]in config.toml
- Module count: 19 → 22
- MCP tools: 13 → 19
- Test count: 270 → 318
- Person search uses FTS —
context whonow finds person notes via full-text search instead of exact filename matching. Handles hyphens, underscores, any vault structure. Prefers People folder →persontag → fuzzy filename. - llama.cpp logs suppressed —
backend.void_logs()silences Metal/model loading output. Clean terminal output by default. - Basename resolution —
find_file_by_basenamenormalizes hyphens/underscores/spaces for cross-format matching.
- Re-recorded demo GIF with v1.0.2 brew binary (clean output, no
2>/dev/nullworkarounds)
- Inference backend switched from candle to llama.cpp — via
llama-cpp-2Rust bindings. Gets full Metal GPU acceleration on macOS (88 files indexed in 70s vs 37+ minutes on CPU with candle). Same backend as qmd. - Default embedding model produces 256-dim vectors via embeddinggemma-300M (Matryoshka truncation)
- BERT GGUF architecture support added alongside Gemma (future model flexibility)
- Progress bar during indexing via indicatif (was silent for minutes)
- CI workflow installs CMake on Ubuntu (required for llama.cpp build)
- Prompt format applied during embedding —
embed_oneuses search_query prefix,embed_batchuses search_document prefix. Without this, embeddinggemma operated in wrong symmetric mode. - GGUF tokenizer fallback — added
shimmytokcrate to extract tokenizer from GGUF metadata when tokenizer.json is unavailable (Google Gemma repos are gated) - LlamaBackend singleton — global
OnceLockprevents double-initialization crash when loading multiple models - Orchestrator/reranker use built-in tokenizer — llama.cpp reads tokenizer from GGUF metadata, no external tokenizer.json needed
- Dimension migration clears FTS —
reset_for_reindexnow also clearschunks_ftsto prevent duplicate entries - LLM cache wired into search —
search_with_intelligencechecks/populatesllm_cachetable - MCP server wires intelligence — search handler passes orchestrator + reranker via
SearchConfig - CLI search wires intelligence —
run_searchloads models when intelligence enabled - Qwen3 GGUF filename — fixed case sensitivity (was 404)
- Embedding batch params —
n_ubatch >= n_tokensassertion, useencode()notdecode(),AddBos::Never(PromptFormat adds<bos>)
candle-core,candle-nn,candle-transformersdependencies (replaced byllama-cpp-2)
Intelligence release. Replaced ONNX with GGUF model inference, added LLM-powered search intelligence. Immediately followed by v1.0.1 which switched the inference backend from candle to llama.cpp for Metal GPU support.
- GGUF model inference — replaced ONNX (
ort) with GGUF quantized models for all ML inference - Research orchestrator — LLM-based query classification (exact/conceptual/relationship/exploratory) with adaptive lane weights. Single LLM call returns intent + 2-4 query expansions.
- Cross-encoder reranker — 4th RRF lane using Qwen3-Reranker for relevance scoring. Two-pass fusion: 3-lane retrieval → reranker scores top 30 → 4-lane RRF.
- Query expansion — each search runs multiple expanded queries through all retrieval lanes, merged via deduplication.
- Heuristic orchestrator — fast-path intent classification via pattern matching (docids, ticket IDs, "who" queries) when intelligence is disabled. Zero latency.
- Intelligence onboarding — opt-in prompt during
engraph initand firstengraph index. Downloads ~1.3GB of optional models. engraph configurecommand —--enable-intelligence,--disable-intelligence,--model embed|rerank|expand <uri>for model overrides.- Dimension migration — auto-detects embedding dimension changes and triggers re-index.
- LLM result cache — SQLite cache for orchestrator results (keyed by query SHA256).
- Model override support — configurable embedding, reranker, and expansion model URIs for multilingual support.
- Embedding model:
all-MiniLM-L6-v2(ONNX, 384-dim, 23MB) →embeddinggemma-300M(GGUF, 256-dim, ~300MB) - Search pipeline: hardcoded 3-lane weights → adaptive per-query-intent weights
--explainoutput now shows query intent and 4-lane breakdown (semantic, FTS, graph, rerank)statuscommand shows intelligence enabled/disabled state
ort(ONNX Runtime) dependencyndarraydependencysrc/embedder.rsandsrc/model.rs(replaced bysrc/llm.rs)ModelBackendtrait (replaced byEmbedModel)
- File watcher —
engraph servenow watches the vault for changes and re-indexes automatically (2s debounce) - Placement correction learning — detects when users move notes from suggested folders, updates centroids
- Fuzzy link matching — sliding window Levenshtein matching (0.92 threshold) during note creation
- First-name matching — matches "Steve" to
[[Steve Barbera]]for People folder notes (suggestion-only) created_bycolumn and filter — track note origin, filter withengraph context list --created-byplacement_correctionstable for observabilitylink_skiplisttable schema (reserved for future use)
- Centroid updates use true online mean (was EMA 0.9/0.1)
- Indexer refactored:
index_file,remove_file,rename_fileextracted as public functions - Bulk indexing uses batched transactions for performance
run_index_sharedvariant accepts external store/embedder references
- Content hash consistency between
diff_vaultandindex_file(BOM handling)
- Write pipeline — create, append, update_metadata, move, archive, unarchive notes
- sqlite-vec replaces HNSW for vector search (single SQLite database)
- Tag registry with fuzzy Levenshtein resolution
- Link discovery — exact basename and alias matching during note creation
- Folder placement — type rules, semantic centroids, inbox fallback
- Archive/unarchive — soft delete with metadata preservation
- 6 new MCP write tools (13 total)
- All vectors stored in SQLite vec0 virtual table (was HNSW + separate files)
- Atomic writes via temp file + rename for crash safety
- Mtime-based conflict detection for concurrent edits
- MCP server —
engraph servestarts stdio MCP server via rmcp SDK - 7 read-only MCP tools: search, read, list, vault_map, who, project, context
- Context engine — 6 functions: read, list, vault_map, who, project, topic
- Token-budgeted context bundles for AI agents
- Person and project context assembly from graph + search
- Vault graph — bidirectional wikilink + mention edges built during indexing
- Graph search agent — 3rd RRF lane with 1-2 hop expansion
- People detection from configured People folder
- Hybrid search — semantic (embeddings) + keyword (FTS5 BM25) fused via RRF
- Smart chunking with break-point scoring algorithm
- Docid system (6-char hex file IDs)
- Vault profiles with auto-detection (
engraph init) - Pluggable model layer (
ModelBackendtrait) --explainflag for per-lane score breakdown
- Initial release
- ONNX embedding model (all-MiniLM-L6-v2, 384-dim)
- SQLite metadata storage
- Incremental indexing
.gitignore-aware vault walking