All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Biome lint: sorted imports and used optional chaining in
node-sidecar-store.ts - Biome format: wrapped long
rejectAllcall for line-length compliance
- Bun on Windows now keeps core archive/retrieval functionality by routing SQLite-backed work through a Node sidecar instead of loading SQLite in the Bun host process
- Config-only unsafe overrides no longer bypass the Bun/Windows sidecar;
OPENCODE_LCM_ALLOW_UNSAFE_BUN_WINDOWS=1is reserved for deliberate in-process debugging
- New
lcm_retrieval_debugMCP tool surfaces the latest automatic-retrieval recall decision per session: status, query tokens, scope budgets, raw/selected hit counts, stop reason, and hit previews lcm_statusnow reportsdb_bytes,wal_bytes,shm_bytes,total_bytes,prunable_events, top-10 prunable event-type breakdowns, and FTS row counts (message_fts,summary_fts,artifact_fts)StoreStatstype extended with storage-size, prunable-event, and FTS-index diagnostic fields
- Merged
fix/corrupted-json-row-loads-originbranch:readSessionSync,readMessageSync,readMessageSyncV2, and grep scan paths now skip stored messages/parts with corruptedinfo_jsonorpart_jsoninstead of throwing lcm_doctordetects and reports malformed stored rows and orphaned message-fts entries
- Bun on Windows now leaves the plugin in a pre-SQLite safe mode by default and requires an explicit override to enable the full archive hooks
- Restored schema-v2 compatibility for persisted stores after the PR #6 merge
- Removed the unfinished
llm-clisummary configuration surface before shipping it - Restored Biome-clean formatting so the full cross-platform CI matrix passes again
- Publish validation now keeps the Bun-on-Windows lightweight capture regression test portable across non-Windows CI runners
- Republish the current malformed-message and Bun Windows capture fixes to npm after the failed 0.13.3 release check
- Bun on Windows now tolerates part-update capture when the parent message has not been materialized yet
- Additional malformed-message hardening now covers
message.info.time.createdreads and grep scan fallback paths - Restored CI-clean formatting after the PR #5 merge so release validation and publish can complete
- Republish of 0.13.1 malformed-message hardening through CI with provenance
- Archive transform now removes malformed messages from the outbound message array before returning control to OpenCode, preventing follow-on backend
Bad Requestfailures - Archive, resume, describe, search indexing, and capture paths now skip malformed
message.infometadata defensively instead of throwing when required fields are missing
- Opt-in
perf:archiveharness for large-archive regression coverage across transform, grep, snapshot, reopen, resume, and retention paths - Separate advisory
Archive Performanceworkflow for scheduled/manual perf runs with JSON artifact upload
- Cross-platform CI matrix for Linux, Windows, and macOS on Node 22 and 24
- Opt-in CI dogfood smoke job for the existing
dogfood:opencodeflow, including workflow-managed OpenCode CLI installation - Privacy controls for excluding tool payloads, suppressing matching file-path capture, and redacting configured regex patterns before archive storage/indexing
lcm_statusnow reports configured privacy-control counts and excluded tool prefixestests/store.test.mjscleanup now retries transient Windows SQLite file-lock races- Archived recall and summary reminders now use terse inline formatting and attach after the active user text instead of leading it
- Automatic-retrieval sanitization now strips archived reminder boilerplate before indexing and artifact externalization
- Pasted reminder text no longer pollutes retrieval candidates or dominates later archive recall
- Initial release of opencode-lcm plugin
- SQLite-based session storage with FTS5 full-text search
- Hierarchical summary graph for message archiving
- Artifact deduplication via content hashing
- Snapshot export/import for portable session data
- Automatic retrieval with TF-IDF query weighting
- Session lineage tracking (parent/child/root relationships)
- Retention policy enforcement (stale sessions, deleted sessions, orphan blobs)
- Resume notes for session continuation
- Doctor command for diagnosing and repairing store integrity
- Binary preview providers for file artifacts (image dimensions, PDF metadata, ZIP entries)
- Context-mode interop for sandboxed command execution
- Worktree-aware scoping for multi-workspace projects
- 141 tests covering core functionality
CHANGELOG.mdfor tracking release history- Direct regression coverage for scoped FTS refresh and snapshot replace-import stale-row cleanup
parseJson()now wraps errors with input preview and original message for easier debugging- Silent
catch {}blocks instore-search.tsreplaced withgetLogger().debug()logging - Bun SQLite import replaced with direct
await import('bun:sqlite')+ ambient type declaration (bun-sqlite.d.ts) - Duplicated artifact hydration switch/case extracted into
hydratePartFromArtifacts()helper - All manual
BEGIN/COMMIT/ROLLBACKblocks replaced withwithTransaction()helper - Row type definitions unified —
store-snapshot.tsis the canonical source validateRow()added tosql-utils.tsfor runtime SQL result validation; applied to allstats()method queries- Dead modules (
store-schema.ts,store-session-read.ts) folded intostore.tsas private functions with re-exports for test compatibility - TF-IDF
filterTokensByTfidf()doc-frequency ratio fixed to use actualdocFreq/totalDocs computeTfidfWeights()return type extended withdocFreqfieldbuildFtsQuery()now preserves quoted phrases as FTS5 phrase clausesresolveWorkspacePath()absolute-path bypass fixed — absolute paths now validated against workspace root- Duplicate
COUNT(*)queries in TF-IDF eliminated — extractedgetTotalDocCount()helper importStoreSnapshot()manual transaction replaced withwithTransaction()- Deduplicated
truncate(),shortNodeID()fromarchive-transform.ts→ imported fromutils.ts - Deduplicated
clamp()fromstore.ts→ imported fromutils.ts - Snapshot paths now support absolute paths (portable snapshots) and relative paths resolved from workspace with traversal guard
resolveWorkspacePath()false-positive fix: names like..hiddenno longer rejected- Search index maintenance can now refresh only selected sessions instead of always rebuilding every FTS table
- Binary preview providers now use async file reads, and session/message externalization awaits preview generation before writing transactionally
- Test workspace cleanup now retries transient Windows SQLite file-lock races
- TF-IDF retrieval filtering bug where document frequency ratio was computed incorrectly
- Phrase query support broken in FTS5 — quoted strings now passed through as phrase clauses
- Workspace path security bypass where absolute paths skipped containment check
- Snapshot path resolution broke portable snapshot imports
store-retention.tsmodule recreated after accidental deletion- Snapshot replace-import left stale FTS rows behind for replaced sessions
- Fixed workspace path validation bypass that allowed absolute paths to escape the workspace root
- Added
validateRow()runtime validation for all SQL query results instats()method