Releases: heyhayes/annal
Release list
v0.7.0 — Search Improvements & Stale Memory Management
What's new
Spike 10-11: Memory supersession polish
- Supersession polish, unified formatting, overfetch cap
supersedesparam onstore_memoryandstore_batch- Superseded memories hidden from search/browse by default,
include_supersededflag to show them
Spike 13: Search improvements
- Source-prefix filtering on
search_memories(sourceparam) - Hit tracking:
hit_countandlast_accessed_aton agent-memory results - Stale detection in
stats()output - Grouped search output separating agent memories from file-indexed chunks
Spike 14: Stale memory management
find_stale()store method identifies stale and never-accessed agent memoriesprune_staleMCP tool — dry-run by default, agents can self-maintain their memory stores- Dashboard: stale count column on project overview with clickable links
- Dashboard: "Show stale only" filter on memories browse page
- Dashboard: stale/never-accessed badges on memory rows
get_by_ids(track_hits=False)— dashboard views no longer mutate access timestamps
Other
- GitHub Actions CI workflows
v0.6.4 — Hardening + Export/Import
What's new
Export/Import CLI — annal export --project X writes JSONL to stdout, annal import --project X file.jsonl reads it back. Safe data portability without touching the vector backend directly.
Bug fixes & hardening
- XSS fix: Dashboard tag pills now use
data-tagattributes + event delegation instead of inlineonclickhandlers - Thread safety:
_tag_cacheprotected withthreading.Lock; pool shutdown snapshots watchers under lock before iterating - 9x overfetch fixed: Removed store-level 3x multiplier that compounded with backend-level 3x
- delete_memory: Now returns "not found" instead of silent success on missing IDs
- Default search mode: Changed from
fulltosummary— cheaper for agents that just need a quick scan - Dead code removed:
json.loadsfallbacks,json_modalias - SSE hardening: Newline stripping prevents injection in event stream
- Dashboard: Page param validation, watcher path warnings
Stats
212 tests passing, 11 files changed, +339 −63 lines.
v0.6.3
What's new
retag_memorytool — modify tags on existing memories without changing content. Supportsadd_tags,remove_tags(incremental), andset_tags(full replace). Metadata-only mutation, no re-embedding.memory_updatedevent — bothretag_memoryandupdate_memorynow emit SSE events, so the dashboard refreshes live on tag edits.- Dashboard UX — project table replaces card grid on index page (filterable by name), clickable tag pills throughout, cross-project search bar.
203 tests passing.
v0.6.2 — Search Summary Mode
New
mode="summary"onsearch_memories— returns first 200 chars of content with full metadata (tags, score, source, dates, ID). Sits between probe (one-liner) and full (complete content), eliminating the two-round-trip probe+expand pattern for most searches.- SERVER_INSTRUCTIONS updated to recommend summary as the default search mode.
Also
- Feature backlog expanded with memory quality items: contradiction detection,
store_batch, search-miss tracking. - First OpenSpec change archived (
search-summary-mode).
v0.6.1
Patch release from code review fixes.
- Fix: Move
OnnxEmbedderout ofbackend.pyintoembedder.py— protocol module no longer imports chromadb or numpy, fixing import failures for qdrant-only installs - Fix: RRF fusion scores in hybrid search now use
1/scoreinstead of1-score, producing meaningful distance values - Hardcode MiniLM-L6-V2 dimension to 384 instead of embedding "test" on startup
v0.6.0 — Vector Backend Abstraction + Qdrant
What's new
Vector Backend Abstraction
VectorBackend and Embedder protocols decouple storage from business logic. MemoryStore becomes a thin layer that delegates to whichever backend is configured.
Qdrant Backend
Native Qdrant support with server-side tag filtering via MatchAny, deterministic UUID point mapping, and concurrent read/write support. No more SQLite contention from ChromaDB under multi-agent workloads.
Hybrid BM25 + Vector Search
When using Qdrant, search combines dense vector similarity with BM25 keyword matching via reciprocal rank fusion. Enabled by default — transparent to the MCP tool interface.
Migration CLI
annal migrate --from chromadb --to qdrant --project <name> moves data between backends with batched inserts and progress reporting.
Config-driven Backend Selection
storage:
backend: qdrant
backends:
qdrant:
url: http://localhost:6333
hybrid: trueDefaults to ChromaDB for backwards compatibility. Install Qdrant support with pip install annal[qdrant].
Stats
- 10 commits, 12 files changed
- 185 tests passing (16 Qdrant backend + 10 Qdrant integration)
- New files:
backend.py,backends/chromadb.py,backends/qdrant.py,migrate.py