3,348-line monolith → 6 modules with mixin classes resolving via MRO.
client.py retains __init__, internal helpers, and core CRUD (1,091 lines).
All backward-compat imports preserved for mcp_server.py and dev/migrate.py.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Closescal/claude-memory#3. All ID-based lookups now resolve partial
UUID prefixes (git-style) instead of requiring exact full UUIDs.
Affects _resolve_memory_path, _resolve_edge_path, edge_search, and
related(). Ambiguous prefixes raise ValueError with candidates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Daily and weekly timers fired simultaneously on Sundays, causing
decay() and reflect() to race on _state.json. Now merges top-level
keys before writing and uses atomic tempfile+rename to prevent
partial reads from triggering silent JSONDecodeError fallbacks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Normalize both signals to 0-1 range so semantic similarity scores
aren't drowned out by keyword position scores. Jellyfin DB recovery
now ranks #1 for "media server database broken sqlite error" instead
of being buried behind keyword noise matches on "error".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- embed --if-changed compares memory ID sets to skip when unchanged
- --ollama-model config flag to switch models without code changes
- _ollama_embed now accepts model param, respects config throughout
- Switched default to qwen3-embedding:8b (70+ MTEB vs nomic's ~52)
- Hourly systemd timer for embedding, daily timer no longer embeds
- Fixed PATH for uv in both systemd services
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add first-class edge files in graph/edges/ with bidirectional frontmatter
refs, hybrid Ollama/OpenAI embedding providers with fallback chain, and
native MCP server (18 tools) for direct Claude Code integration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Changed zero-access usage_factor from 0.5 to 1.0 in calculate_decay_score().
Previously, a freshly stored solution (importance=0.7, weight=1.2) scored
0.42 (Fading); now scores 0.84 (Active) as intended.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>