v2.17.0
v2.17.0 — 2026-06-28
Added
file://~/path expansion in*ApiKeyconfig fields —file://references with~(home directory) now work on Linux. Previouslynew URL()parsed~as the URL host and threw.~is now expanded before URL parsing. (#34)initConfig()empty-config guard — When both global and project config sources return empty (transient I/O failure, file lock, race condition), the existing CONFIG singleton is preserved instead of being silently overwritten with hardcoded defaults. (#35, #36)
Fixed
initConfig()silent CONFIG reset —buildConfig({})was called with an empty object when config files were transiently inaccessible, resetting all user-configured values (embedding model, dimensions, API endpoint) to defaults. The guard preserves the existing CONFIG from module-level initialization. (#35)file://~/throws on Linux —secret-resolver.tscallednew URL(value)before expanding~, causingfileURLToPathto throw "File URL host must be localhost or empty". (#34)- Vitest critical CVE (GHSA-5xrq-8626-4rwp) — Updated
vitestand@vitest/coverage-v8to 3.2.6, fixing arbitrary file read/execute via Vitest UI server. Dev-only dependency, not shipped to users.
Removed
- NSW vector backend —
NSWBackend(nsw-backend.ts, 321 lines) was production-unreachable: theVectorBackendConfigenum only allowsusearch-first/usearch/exact-scan, sonsw/nsw-firstwere factory-only dead branches. RemovedNSWBackend, thensw/nsw-firstfactory branches, thecreateNSWBackendinjection seam, andcosineDistance(only NSW caller). supportsSession()abstract method — Removed fromBaseAIProviderand all 4 provider overrides. Every implementation returnedtrueand no code branched on the result.profile-utils.ts— Deleted dead code (safeArray/safeObjectexports with zero importers).aiSessionManagerbackward-compatible Proxy export — Removed redundant singleton surface. All consumers usegetAISessionManager()via constructor injection.getSupportedProviders()onAIProviderFactory— Removed zero-caller method.startCleanupSchedule/stopCleanupSchedulestatic methods onAIProviderFactory— Inlined assetInterval/clearIntervalinindex.ts.ConflictCheckLockclass — Inlined as a module-levelSet<string>(single consumer).
Changed
iso-639-3full dataset replaced withIntl.DisplayNames— Language name lookup now uses the native API instead of importing the full ~9000-entry dataset.- Dynamic imports converted to static —
auto-capture.tsandhandlers/memory.tsnow use static imports, removing unnecessary async overhead. .gitignorereorganized — 280-line catch-all replaced with 73-line categorized file.- localStorage API key storage — Added comment documenting the accepted security tradeoff (localhost-only server).
Contributors
Thanks to the community contributors who reported issues and submitted fixes:
- @boyxil — Reported #34 (
file://~/expansion) - @bob56621517 — Reported #35 and opened #36 (initConfig guard)
- @kingrubic — Opened #37 (alternative config preservation approach)
Closed
- #34 — Support
file://with~expansion in*ApiKeyconfig fields - #35 —
initConfig()silently resets CONFIG to defaults when global config file is transiently inaccessible - #36 — Guard
initConfigagainst silent config reset on empty file load (approach applied directly) - #37 — Preserve global config during transient init misses (closed, over-engineered)
Full Changelog: v2.16.2...v2.17.0