Skip to content

Releases: heyhayes/annal

v0.7.0 — Search Improvements & Stale Memory Management

Choose a tag to compare

@heyhayes heyhayes released this 23 Feb 19:42

What's new

Spike 10-11: Memory supersession polish

  • Supersession polish, unified formatting, overfetch cap
  • supersedes param on store_memory and store_batch
  • Superseded memories hidden from search/browse by default, include_superseded flag to show them

Spike 13: Search improvements

  • Source-prefix filtering on search_memories (source param)
  • Hit tracking: hit_count and last_accessed_at on 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 memories
  • prune_stale MCP 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

Choose a tag to compare

@heyhayes heyhayes released this 22 Feb 17:49

What's new

Export/Import CLIannal 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-tag attributes + event delegation instead of inline onclick handlers
  • Thread safety: _tag_cache protected with threading.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 full to summary — cheaper for agents that just need a quick scan
  • Dead code removed: json.loads fallbacks, json_mod alias
  • 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

Choose a tag to compare

@heyhayes heyhayes released this 22 Feb 15:06

What's new

  • retag_memory tool — modify tags on existing memories without changing content. Supports add_tags, remove_tags (incremental), and set_tags (full replace). Metadata-only mutation, no re-embedding.
  • memory_updated event — both retag_memory and update_memory now 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

Choose a tag to compare

@heyhayes heyhayes released this 22 Feb 10:32

New

  • mode="summary" on search_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

Choose a tag to compare

@heyhayes heyhayes released this 22 Feb 09:46

Patch release from code review fixes.

  • Fix: Move OnnxEmbedder out of backend.py into embedder.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/score instead of 1-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

Choose a tag to compare

@heyhayes heyhayes released this 22 Feb 00:56

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: true

Defaults 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