Skip to content

Releases: shaqmughal/seekstone

seekstone@0.18.0

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 11 Sep 12:37
ee6bdeb

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 hashes fetch-model uses; the zero-network guarantee is unchanged and now also covers the reassembly path in no-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

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 08 Sep 20:18
aead207

Patch Changes

  • f095146: Bump transitive qs to 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. resolveLink used 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

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 02 Sep 04:11
d40a922

Patch Changes

  • 9670b2a: chore: bump picomatch to ^4.0.7
  • fe96c45: chore: bump zod to ^4.5.4

seekstone@0.17.0

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 02 Sep 02:37
a8627bd

Minor Changes

  • fdb0a61: Structured audit logging. Set SEEKSTONE_AUDIT_FILE and every write-tool call — successful or refused — appends one JSON-line record: tool, vault-relative paths, sha-256 before/after (the same values read_note returns as contentHash, 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 journal seq it committed, so a row indexes straight into list_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>.1 past SEEKSTONE_AUDIT_MAX_SIZE (default 10 MB); an unwritable audit path fails boot, and a failed append reports the call as a structured audit_failed error rather than a clean success. Documented as Write-Safety guarantee 10 with jq recipes 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-32M downloads the 512-dim potion-retrieval-32M model (~129 MB, SHA-256-verified like the default), and SEEKSTONE_SEMANTIC_MODEL=potion-retrieval-32M selects 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_writes lists the journal (seq, timestamp, tool, paths, undoable — metadata only) and undo_write restores a write byte-for-byte — a multi-file move_note or rename_heading is restored whole (the note and every link rewrite), and a delete_note is restored even if it was permanent: true. An undo after an external edit is refused with a structured undo_conflict unless force: true (the clobbered state is journaled first, so nothing is lost); undo is itself journaled, so undo_write({ seq }) on an undo entry redoes it. New env vars: SEEKSTONE_HISTORY=0 disables the journal, SEEKSTONE_HISTORY_MAX_SIZE (default 50 MB) and SEEKSTONE_HISTORY_MAX_ENTRIES (default 1000) cap retention — evicted entries stay listed as undoable: 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 keeps list_writes and removes undo_write.

Patch Changes

  • f01db39: SemanticStore accepts 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

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 28 Aug 03:38
8def84c

Minor Changes

  • 4f9bdfc: SEEKSTONE_WATCH_POLL=1 no 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 new SEEKSTONE_WATCH_POLL_INTERVAL env 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

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 25 Aug 15:03
9810a04

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 keyed Projects\Core.md while wikilink resolution, the file watcher, and MCP client paths all assume forward slashes — [[Core]] never resolved, get_backlinks returned zero, and every path-keyed tool lookup missed. Index keys are now forward-slash vault-relative paths on every platform.

seekstone@0.15.1

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 24 Aug 14:17
8dc01d9

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 dynamic import() introduced with semantic search in 0.15.0, and the mcpb pipeline only ships the sharded index.js — the chunks were silently dropped, so the installed extension died on launch. Both builds now set splitting: false, and build-mcpb.mjs fails 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 search tool's advertised schema now matches its behavior: the long-documented excerptLength option (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's mode now also appears in info-level logs' safe metadata. The no-network guarantee test additionally proves the semantic subsystem — index build, cache persistence, and semantic/hybrid queries — runs fully offline.

seekstone@0.15.0

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 20 Aug 21:18
fc9825a

Minor Changes

  • c34c9e9: Local semantic search, opt-in and fully offline. With SEEKSTONE_SEMANTIC=1, the search tool gains mode: "semantic" (meaning-based search — a description like "instrument that measures wind speed" finds the Anemometer note even when no words match) and mode: "hybrid" (exact-title lookups stay lexical, everything else goes semantic). Powered by an in-process Model2Vec embedding model downloaded once via the new seekstone fetch-model subcommand — 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

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 20 Aug 00:01
1374a37

Minor Changes

  • 37c395d: Complete compare-and-swap coverage: every write tool now participates. move_note and delete_note accept an optional prevHash guarding the source note — a stale hash fails with the structured hash_conflict error before anything is moved or deleted, so you never destroy content you haven't seen. Every mutating result now returns a contentHash: move_note returns the hash of the (unchanged) bytes at the new path, delete_note the hash of the deleted content (byte-identical to the .trash/ copy when recoverable), and replace_in_note returns the unchanged hash on dry runs and zero-match calls — so chained edits never need a re-read. The write-safety harness's cas-conflict op now also drives the move and delete guards.

seekstone@0.13.1

Choose a tag to compare

@seekstone-release-bot seekstone-release-bot released this 18 Aug 04:20
c80f2bc

Patch Changes

  • 87dc5b2: Advertise explicit MCP safety annotations for every tool so clients can distinguish read-only, additive, destructive, idempotent, and closed-world operations.