Releases: shaqmughal/seekstone
Releases · shaqmughal/seekstone
Release list
seekstone@0.18.0
Minor Changes
- 5ff12c1: One-click semantic search (SHA-309): every release now ships a second MCP Bundle,
seekstone-semantic.mcpb, with the local embedding model packed inside the extension and semantic search enabled out of the box — no terminal, no Node.js, and nothing downloaded at runtime. The model ships as sub-cap shards (Claude Desktop rejects any packed file over ~108KB) that the server reassembles into the standard cache location at boot, verified against the same pinned SHA-256 hashesfetch-modeluses; the zero-network guarantee is unchanged and now also covers the reassembly path inno-network.test.ts.
Patch Changes
- e1da45b: fix(semantic): pair the embedding cache's manifest with the binary it describes, so a manifest left beside another build's binary is rejected instead of mapping every note to another note's vectors. Existing caches are invalidated once by the version bump and re-embedded on next boot.
- f02995d: docs: republish the benchmark figures on the fixture-v2 baseline (SHA-322) — 5.2 ms warm keyword search and ~26 ms shipped semantic search at 10k notes, obsidian-tc at ~514× — and check every published number in CI against the committed
benchmarks.json, generated from the harness baselines.
seekstone@0.17.2
Patch Changes
- f095146: Bump transitive
qsto 6.16.0 (via @modelcontextprotocol/sdk → express), resolving GHSA-4mjr-xmp4-gh2g (DoS via attacker-controlled isBuffer) and GHSA-x5fp-wj9c-mxmx (array-limit bypass via bracket-key comma parsing). - d75c9d8: Cold index build no longer quadratic on link-heavy vaults.
resolveLinkused to scan every indexed note for each non-exact wikilink target, making backlink indexing O(links × notes) — ~17 minutes on a 10k-note vault with 131k links. Loose resolution now goes through basename/path lookup maps built once per index build (and once per watcher event), bringing that same build to seconds. Resolution precedence is unchanged (exact → +.md → basename → path-without-extension); ambiguous targets (duplicate basenames) now resolve deterministically to the lexicographically smallest note path instead of depending on index insertion order.
seekstone@0.17.1
seekstone@0.17.0
Minor Changes
- fdb0a61: Structured audit logging. Set
SEEKSTONE_AUDIT_FILEand every write-tool call — successful or refused — appends one JSON-line record: tool, vault-relative paths, sha-256 before/after (the same valuesread_notereturns ascontentHash, so records are verifiable against the vault), outcome (ok,hash_conflict,undo_conflict,policy_denied,error), duration, and op metadata such as replacement counts, link-rewrite counts, or the.trash/destination. When the write journal is on, each record carries the journalseqit committed, so a row indexes straight intolist_writes/undo_write. Records never contain note content, frontmatter values, or search queries (frontmatter records list key names only), so the file is safe to share. Records are fsync'd after the vault write commits; the file rotates to<file>.1pastSEEKSTONE_AUDIT_MAX_SIZE(default 10 MB); an unwritable audit path fails boot, and a failed append reports the call as a structuredaudit_failederror rather than a clean success. Documented as Write-Safety guarantee 10 withjqrecipes in the README. - 76d8fdd: Semantic and hybrid search now rerank the top-50 candidates with a static late-interaction MaxSim stage: per query token, the max cosine over the winning chunk's token vectors (IDF-weighted over the candidate set) is fused with the stage-1 score. Recovers discriminating terms that mean-pooling dilutes — dev-split semantic hit@5 70.4% → 85.2% with lexical routing untouched, no new dependencies, and no embedding-cache format change. Core gains
maxsimScore/maxsimScoreAll/maxsimScoreTokens,candidateSetIdf, and per-token vector access (TokenEmbedder) on the Model2Vec loader. - 45f0bc7: Opt-in bigger embedding model for semantic search.
npx -y seekstone fetch-model --model potion-retrieval-32Mdownloads the 512-dim potion-retrieval-32M model (~129 MB, SHA-256-verified like the default), andSEEKSTONE_SEMANTIC_MODEL=potion-retrieval-32Mselects it at boot. On the committed 10k-note benchmark it lifts description-style queries noticeably over the shipped potion-base-8M at roughly 2× the (still tens-of-milliseconds) query latency. The default stays potion-base-8M; per-vault embedding caches are keyed on model id + dimension, so switching models re-embeds cleanly and switching back reuses the existing cache. An unknown model id is a clear boot/fetch error; a selected-but-not-fetched model gets the existing actionable error naming the exact fetch command. - 9aeb027: Every write is now reversible. Before any write tool changes a byte, it journals the pre-image of every file it is about to touch under
<vault>/.seekstone/history/(content-addressed, fsync'd before the write commits). Two new tools:list_writeslists the journal (seq, timestamp, tool, paths, undoable — metadata only) andundo_writerestores a write byte-for-byte — a multi-filemove_noteorrename_headingis restored whole (the note and every link rewrite), and adelete_noteis restored even if it waspermanent: true. An undo after an external edit is refused with a structuredundo_conflictunlessforce: true(the clobbered state is journaled first, so nothing is lost); undo is itself journaled, soundo_write({ seq })on an undo entry redoes it. New env vars:SEEKSTONE_HISTORY=0disables the journal,SEEKSTONE_HISTORY_MAX_SIZE(default 50 MB) andSEEKSTONE_HISTORY_MAX_ENTRIES(default 1000) cap retention — evicted entries stay listed asundoable: false..seekstone/is excluded from indexing and search like.trash/; add it to your vault's.gitignore. Tool count is now 21 (11 read, 10 write); read-only mode keepslist_writesand removesundo_write.
Patch Changes
- f01db39:
SemanticStoreaccepts a chunk-pooling strategy (default unchanged:max); the returned excerpt span is always the note's best chunk regardless of pooling. No behavior change for users — the SHA-313 dev-split eval found no pooling that improved retrieval without a matching loss, so the shipped ranking is untouched (writeup committed under the harness baseline reports).
seekstone@0.16.0
Minor Changes
- 4f9bdfc:
SEEKSTONE_WATCH_POLL=1no longer stat-polls every file in the vault every 50ms — that hardcoded interval could pin ~20–25% of a CPU core per running instance on the network/WSL/9p mounts polling exists for (#280, reported by @phizz82). The default poll interval is now 10s (binary files 20s), and a newSEEKSTONE_WATCH_POLL_INTERVALenv var (milliseconds) tunes it. Note this only affects how quickly external edits are picked up under polling mode — seekstone's own writes still update the index immediately, and native (non-polling) watching is unchanged.
seekstone@0.15.2
Patch Changes
- f5d6925: Fix Windows breaking basename wikilink resolution, backlinks, and path lookups for notes in subdirectories (#268). The vault scan stored platform-native
path.relative()output as the index key, so on Windows a nested note was keyedProjects\Core.mdwhile wikilink resolution, the file watcher, and MCP client paths all assume forward slashes —[[Core]]never resolved,get_backlinksreturned zero, and every path-keyed tool lookup missed. Index keys are now forward-slash vault-relative paths on every platform.
seekstone@0.15.1
Patch Changes
- dd883a9: Fix the .mcpb extension crashing at startup (
ERR_MODULE_NOT_FOUND: chunk-*.js). tsup's ESM code splitting (default-on) emitted separate chunk files for the dynamicimport()introduced with semantic search in 0.15.0, and the mcpb pipeline only ships the shardedindex.js— the chunks were silently dropped, so the installed extension died on launch. Both builds now setsplitting: false, andbuild-mcpb.mjsfails loudly if the build ever emits more than one file. - ea89043: The npm package description now owns both search latencies precisely: single-digit-ms keyword search and ~14 ms local semantic search (previously the unqualified "single-digit-ms search", which was no longer accurate for semantic mode).
- 2a8adfd: The
searchtool's advertised schema now matches its behavior: the long-documentedexcerptLengthoption (20–2000 characters, default 120) is exposed in the MCP input schema so clients can actually discover and use it, and the tool description's excerpt-size figure is corrected from ~200 to ~120 characters. Search'smodenow also appears in info-level logs' safe metadata. Theno-networkguarantee test additionally proves the semantic subsystem — index build, cache persistence, and semantic/hybrid queries — runs fully offline.
seekstone@0.15.0
Minor Changes
- c34c9e9: Local semantic search, opt-in and fully offline. With
SEEKSTONE_SEMANTIC=1, thesearchtool gainsmode: "semantic"(meaning-based search — a description like "instrument that measures wind speed" finds the Anemometer note even when no words match) andmode: "hybrid"(exact-title lookups stay lexical, everything else goes semantic). Powered by an in-process Model2Vec embedding model downloaded once via the newseekstone fetch-modelsubcommand — the running server never touches the network, keeping the zero-network guarantee intact. The vault embeds in the background at boot and is cached per-vault (keyed by content hash) so restarts are instant; the file watcher re-embeds changed notes incrementally. Semantic hits return the same lean ranked-excerpt payloads, with excerpts drawn from the matching passage rather than the note head. On the 10k-note benchmark vault, semantic mode answers description-style queries at 70% hit@5 vs lexical's 30%, at ~14 ms warm.
seekstone@0.14.0
Minor Changes
- 37c395d: Complete compare-and-swap coverage: every write tool now participates.
move_noteanddelete_noteaccept an optionalprevHashguarding the source note — a stale hash fails with the structuredhash_conflicterror before anything is moved or deleted, so you never destroy content you haven't seen. Every mutating result now returns acontentHash:move_notereturns the hash of the (unchanged) bytes at the new path,delete_notethe hash of the deleted content (byte-identical to the.trash/copy when recoverable), andreplace_in_notereturns the unchanged hash on dry runs and zero-match calls — so chained edits never need a re-read. The write-safety harness'scas-conflictop now also drives the move and delete guards.
seekstone@0.13.1
Patch Changes
- 87dc5b2: Advertise explicit MCP safety annotations for every tool so clients can distinguish read-only, additive, destructive, idempotent, and closed-world operations.