Releases: LuiggiVal08/toon-memory
Release list
v4.3.2: fix: archive/import header-format tolerance, absolute hook script paths
Fixed
memory_archiveno-oped on CLI-initialized projects —archiveOldEntriesandpruneExpiredEntriesonly recognized theentries[N|]header written by the MCP config writer, buttoon-memory initcreatesdata.toonwith a[N|]header. On those files both functions returned0silently, somemory_archive, the MAX_ENTRIES auto-trim, and TTL pruning never ran. They now accept both header conventions, and the count bump preserves theentries/archivedprefix (the archive writer also used to striparchivedfromarchive.toon, breaking subsequent runs).- Hook scripts referenced
capture.js/session-start.jsrelative to the hook CWD —constants.tsderived the CLI directory fromprocess.argv[1], which the entry points overwrite with"toon-memory", so generated hooks rannode "capture.js" ...resolved against whatever directory the agent executed the hook from. Script paths are now derived fromimport.meta.urland are absolute. toon-memory importleft the entry count stale — the header regex required a literal]right after the count (entries[\d+\|]), which no real header has, so the count never updated after importing. It now matches bothentries[N|]and[N|]headers and preserves the prefix.
Tests
archiveOldEntriesworks on[N|],entries[N|], and mixed files, and preserves thearchived[prefix across repeated runstoon-memory initwrites hook scripts with absolute paths;toon-memory importbumps the header count on a CLI-style[N|]file
v4.3.1
Fixes
- Windows:
ERR_UNSUPPORTED_ESM_URL_SCHEMEcrash —toon-memory(CLI and MCP mode) crashed on Windows because dynamic imports passed rawC:\...paths toimport(). Entry points now convert paths viapathToFileURL(new shared helpersrc/cli/entry.ts), so it works again on Windows. install.ps1pinned an ancient release — the Windows installer hard-codedtoon-memory@1.0.9with a placeholder checksum, so it installed a version whoseinitwrote the legacy OpenCode MCP format ({"command","args"}withouttype/enabled). OpenCode 1.17+ rejects that entry and blocks the wholeopencode.jsonfrom loading. The installer now resolves the latest version +dist.integrityfrom the npm registry at runtime and verifies the tarball with SHA-512.- No silent config wipe — config writers now skip (with a warning) instead of overwriting an existing agent config that isn't valid JSON, so other MCP servers and user settings are never destroyed.
If your opencode.json shows Expected { type: local } | { type: remote } or Missing key mcp.toon-memory.enabled
Install 4.3.1 and re-run toon-memory init --agent opencode --scope global — it repairs the entry in place while keeping every other MCP server. Or edit ~/.config/opencode/opencode.json (C:\Users\<you>\.opencode\opencode.json) and set:
"mcp": { "toon-memory": { "type": "local", "command": ["npx", "-y", "toon-memory", "mcp"], "enabled": true } }Full changelog: see CHANGELOG.md.
v4.3.0 — Explicit importance, continuity repositioning, docs sync
What's new
Added
- Explicit importance —
memory_remember({ importance })acceptscritical,high,medium, orlow. Empty = auto (recency + frequency). Ranking boosts: critical +0.3, high +0.15, medium 0, low −0.1, applied in both the graph and unified recall pipelines.mergeEntrieskeeps the higher explicit level on re-save.buildReason()reportsexplicit {level}and deep output shows· importance: {level}. Stored as the 19th TOON field (parts[18]).
Fixed
memory_remembermerge branch field alignment — the upsert path wrotepath_scopeinto thepriorityslot andorigininto thepath_scopeslot (both off by one). Now aligned withmergeEntries:priority, path_scope, origin, status, supersededOn, importance.
Docs & marketing
- TOON spec updated to the 19-field format (
… supersededOn | importance) in all 8 locales - Homepages repositioned around continuity — "Your AI coding agent keeps the context it needs — across every session", "A memory toolkit, not a protocol", 97.6% recall stat (R@5 0.861 rrf / 0.643 linear / 0.829 smart), WhatNew v4.3.0 — in EN + de/es/fr/ja/ko/pt-br/zh
- READMEs updated in all 8 locales with an explicit-importance example
Tests
- Explicit importance: parse, ranking boost ordering, merge max-level,
buildReasonexplicit reporting - Round-trip of the 19-field TOON line with
importancepopulated and empty - 345 tests passing ·
tsc --noEmitclean · benchmark re-verified
v4.2.0 — Explain WHY, token budgets, version supersession, negative memories
Added
- Explain WHY —
memory_recall/memory_smart_recallexplain: trueappends a deterministic reason line (↳ 100% relevance · used 14× · used today · importance HIGH) - Token budgets —
budget_tokensparam drops the tail of the recall that would exceed the estimate - Version supersession —
memory_consolidate mode: "versions"marks older library-version entries obsolete in favor of the newest - Negative memories — new
warningcategory recalled with +0.2 boost - Extended stats —
memory_statsreports Hit rate, Duplicate % and Dead % - Ranking factors — language-family (+0.1) and path_scope folder-match (+0.05) boosts
340 tests passing.
v4.1.2
What's Changed
Fixed
- Corrupt
data.toonentries — 3 entries written with unescaped|literals (field-shift corruption) repaired in place with the production serializer; content, dates, and TTLs restored - Dynamic entry-count limit in health warnings —
context_healthand the context brief now readMAX_ENTRIESfromconfig.jsonviagetMaxEntries()instead of a hardcoded100 - Malformed-entry detection —
generateContextHealthnow flags shifted/invaliddate/ttlfields as a Critical health issue (score −20), so unescaped-pipe corruption surfaces instead of silently parsing wrong
Tests
- 18-field
toToonLineround-trip with combined pipes/backslashes/multiline hazards - Field-shift exposure: unescaped pipe is visible as an invalid date field, not silent garbage
- Health detector flags malformed entries and leaves clean data unflagged
Full Changelog: v4.1.1...v4.1.2
v4.1.1
What's Changed
Fixed
- CLI
-h/--helphandling —toon-memory initandtoon-memory viewernow accept-h/--helpand print their usage instead of misparsing args viewer --export— no longer misparses a missing--portvalue; warns when--portis passed alongside--export- CLI help text — top-level help now documents the
viewersubcommand
Full Changelog: v4.1.0...v4.1.1
v4.1.0 — Retrieval benchmark + deterministic recall
What's new
LongMemEval-style retrieval benchmark
Retrieval is now measured against a frozen snapshot of real project memory — the first public retrieval benchmark for toon-memory.
- Corpus: 187 real
data.toonentries (snapshot2026-08-01) - Gold set: 42 hand-authored queries across 6 categories (core-fact, temporal, knowledge-updating, multi-hop, meta/session, distractor)
- Measured code = production pipeline (
src/lib), bundled in-memory with esbuild — no faithful copies - Artifacts:
benchmarks/retrieval-corpus.toon,gold-queries.json,retrieval-results.json· Reproducible vianpm run bench:retrieval
| Mode | R@5 | nDCG@5 | MRR@5 | answerable |
|---|---|---|---|---|
| linear | 0.643 | 0.654 | 0.776 | 81.0% |
| rrf | 0.861 | 0.764 | 0.788 | 97.6% |
| smart (unified) | 0.829 | 0.739 | 0.760 | 92.5% |
Deterministic recall
New optional today parameter on memory_recall / memory_smart_recall pins the reference date for recency, staleness decay, and TTL — fully reproducible results (default stays the wall clock, backward compatible).
Docs
Retrieval metrics block added to the docs home (English; other locales guarded).
v3.7.0
v3.7.0 — RRF ranking, memory_reflect, memory_supersede + as_of, typed edges, 40 tools
- memory_reflect: deterministic staleness/quality/over-connection reflection (zero LLM)
- memory_supersede + as_of: replace an entry with a newer one; point-in-time recall re-includes entries superseded after a date (reversible via memory_resolve)
- memory_promote: auto-promote low-confidence drafts (threshold 0.65, Jaccard dedup > 0.5, dryRun default)
- RRF ranking: recall fuses BM25 (x3) + graph centrality via Reciprocal Rank Fusion with adaptive k=sqrt(n);
rrf:falserestores the legacy linear score. Benchmarked parity (nDCG 0.776 / MRR 0.917 on 8 gold queries) - Typed graph edges: every edge carries a type written as
type:key(relates / superseded_by / supersedes) - MCP annotations: memory exposed as resources + inline graph viewer
- 40 MCP tools + 4 resources
Docs updated across all 8 i18n locales. 301 tests passing.