What's Changed
- docs: changelog and blog post for v0.8.4 by @nicoloboschi in #2474
- fix(control-plane): show all mental models instead of capping at 100 by @nicoloboschi in #2512
- fix(codex): implement strict_schema via forced tool call + repair invalid \escape (#2504) by @nicoloboschi in #2513
- refactor(control-plane): drop the Graph view from memories by @nicoloboschi in #2517
- Blog: Devin Desktop persistent memory (formerly Windsurf) by @benfrank241 in #2483
- Update Devin Desktop blog cover image by @benfrank241 in #2524
- fix(control-plane) fix json viewer unicode output display by @ymybxx in #2531
- fix(control-plane): keep memory filters visible on empty results by @koriyoshi2041 in #2532
- fix(curation): drop archive search_vector column, recompute on revert (#2503) by @nicoloboschi in #2514
- feat(control-plane): animate the memories constellation & open memories in a dialog by @nicoloboschi in #2536
- test(retain): fix missing llm_temperature_retain in _build_request_body mock by @nicoloboschi in #2537
- Blog: architxt + Hindsight (Temporal Mosaic) — community post by @benfrank241 in #2526
- feat(eve): auto-memory mode (v0.2.0) — no model tool-calling by @benfrank241 in #2527
- feat(eve): retain the assistant reply by default by @benfrank241 in #2585
- Blog: Eve automatic memory (hindsight-eve v0.2.0) by @benfrank241 in #2584
- fix(agent-sdk): release recall token fix as 0.1.1 by @r266-tech in #2596
- Refresh search vector on memory curation edits by @koriyoshi2041 in #2552
- docs(eve): sync assistant reply default by @r266-tech in #2588
- fix(parsers): coerce non-bytes buffers before the UTF-8 charset probe in markitdown by @cdbartholomew in #2586
- fix(memory): return metadata from memory browse endpoints by @Sanderhoff-alt in #2583
- fix(retain): preserve JSON chunks during output retry by @koriyoshi2041 in #2579
- fix(api): let PATCH /memories clear occurred dates with null by @r266-tech in #2607
- feat(integrations): add recall score floors by @ishanmalik in #2575
- fix(opencode): install plugin SDK at runtime by @Sanderhoff-alt in #2574
- fix(api): accept verbatim extraction mode in bank manifests by @ishanmalik in #2576
- Fix chunk delete deadlock ordering by @oldnicke in #2570
- feat(recall): add opt-in BM25 query term cap by @r266-tech in #2567
- fix(control-plane): build local client before production build by @koriyoshi2041 in #2566
- docs(skill): sync configuration reference for BM25 term cap by @benfrank241 in #2609
- fix(consolidation): default invalid dedup actions to keep by @r266-tech in #2565
- fix(cli): set default User-Agent header by @koriyoshi2041 in #2564
- Fix _strip_code_fences truncating JSON when content contains inner backticks by @poog26 in #2563
- fix(minimax): disable thinking by default by @koriyoshi2041 in #2558
- feat(llm): recover outer JSON span when fence stripping yields non-JSON by @benfrank241 in #2610
- refactor(zed): port setup CLI to Node, drop the Python dependency by @benfrank241 in #2599
- Blog: Give Zed's AI Assistant a Persistent Memory by @benfrank241 in #2598
- docs: add Oracle Database setup guide by @DK09876 in #2612
- fix(oracle): don't await the synchronous cursor.close() in _set_session_schema by @DK09876 in #2613
- docs(oracle): document required schema, embedding-dimension matching, and start-oracle re-run by @DK09876 in #2615
- fix(worker): complete successful operations by @r266-tech in #2608
- fix(ollama): make native num_ctx opt-in by @r266-tech in #2589
- fix(recall): decouple temporal seed threshold by @Sanderhoff-alt in #2595
- fix(reflect): tolerate null-like tool integer limits by @r266-tech in #2639
- fix(claude-code): isolate MCP server cwd by @oldnicke in #2635
- fix(claude-code): skip primary + duplicate banks in recallAdditionalBanks by @benfrank241 in #2625
- Blog: Give Aider a Memory That Outlives the Session by @benfrank241 in #2642
- feat(anthropic): prompt caching via inline cache_control markers by @hb-cam in #2629
- feat(anthropic): implement the batch API interface via Message Batches (50% token discount) by @hb-cam in #2628
- fix: handle FK violation in observation_history during parallel consolidation by @handnewb in #2620
- fix(trace): skip LLM trace writes during daemon shutdown/pre-init races by @yingliang-zhang in #2618
- fix(codex): send client identity headers for GPT-5.6 by @JiehoonKwak in #2647
- Blog: One Memory, Three Surfaces (Cursor + OpenClaw + Vapi) by @benfrank241 in #2655
- deps(security): require LiteLLM 1.84.0 by @r266-tech in #2651
- fix(llm): raise OpenRouter Qwen3 verification budget by @r266-tech in #2633
- fix(consolidation): normalize dedup action case/whitespace before validation by @iRonin in #2611
- Include cookbook and integration docs in docs skill by @koriyoshi2041 in #2649
- Accept top-level fact arrays in retain parsing by @koriyoshi2041 in #2556
- fix(recall): scope entity fanout cap by fact type by @Sanderhoff-alt in #2681
- Preserve document metadata during append retains by @koriyoshi2041 in #2684
- fix(engine): clarify causal link compatibility by @Sanderhoff-alt in #2685
- fix(control-plane): forward document search q to dataplane by @benfrank241 in #2687
- fix(search): avoid year-0 crashes in Chinese rolling-window temporal extraction by @r266-tech in #2636
- fix(control-plane): tag/scope filter resets during consolidation polling in data view by @viliusdidit in #2680
- fix(recall): preserve combined graph activation scores by @Sanderhoff-alt in #2679
- fix(consolidation): request JSON dedup decisions by @r266-tech in #2663
- fix(migrations): install public maintenance routines on non-public schema runs by @benfrank241 in #2690
- Blog: Inside retain() — What Happens When Your Agent Remembers by @benfrank241 in #2689
- feat(devin-desktop): two-tier bank scoping + visible memory use (v0.2.0) by @DK09876 in #2692
- fix(worker): bound terminal operation history by @Tosko4 in #2708
- Fix Codex OAuth refresh sharing across managers by @koriyoshi2041 in #2706
- fix(claude-code): surface the CLI's real error text on is_error results by @ElanHasson in #2703
- Avoid slim embedded daemon startup without local ML deps by @koriyoshi2041 in #2676
- fix(claude-code): retain session deltas by @oldnicke in #2648
- docs(embed): expose local CPU workarounds by @yingliang-zhang in #2707
- fix(control-plane): show bank name (fallback bank_id) in bank selector by @benfrank241 in #2693
- fix(test): green main — update Oracle session-schema tests for #2708 reset behavior by @benfrank241 in #2722
- fix(retain): recover recoverable batch-extraction JSON instead of dropping facts by @benfrank241 in #2720
- fix(gemini): grammar-enforce batch structured output regardless of strict flag by @benfrank241 in #2719
- fix reranker heap release after local scoring by @oldnicke in #2530
- fix(embed): green main — use --target sibling binary unconditionally (#2676 vs #1240) by @benfrank241 in #2723
- feat(retain): optional fail-on-extraction-errors flag (issue #2700) by @benfrank241 in #2721
- fix: coerce non-string metadata values to strings in MemoryFact.parse_metadata by @handnewb in #2623
- fix(openclaw): gate append retention on stored text by @xmh1011 in #2511
- Blog: Give Every Agent You Run in Omnigent a Persistent Memory by @benfrank241 in #2709
- docs: Add Omnigent integration page by @benfrank241 in #2710
- chore(deps): bump langsmith and ws (security) by @dcbouius in #2743
- chore(deps): migrate pipecat integration to pipecat-ai 1.x (clears 4 high-severity alerts) by @dcbouius in #2380
- docs: fix conversation-scoped bank claim in Omnigent post by @benfrank241 in #2748
- chore(deps): npm transitive pins (1 critical + mediums) and pydantic-ai-slim by @dcbouius in #2751
- blog: One Bank or Many? A Field Guide to Structuring Agent Memory by @benfrank241 in #2747
- fix(reflect): keep horizontal rules inside fenced code blocks by @ebarkhordar in #2755
- fix(entity-resolver): keep every co-occurrence pair when canonicalising order by @ebarkhordar in #2750
- fix(test): seed torch._inductor.test_operators to fix test-api shard failures by @dcbouius in #2761
- test(fact-extraction): stop judging phrasing/attribution the system already captures by @dcbouius in #2769
- fix(reflect): pair each expanded memory_id with its own memory by @ebarkhordar in #2759
- fix(openai): record cached and reasoning tokens on the LLM metrics counters by @ebarkhordar in #2758
- fix(reflect): preserve bank attribution in provider calls by @Jordan-Jarvis in #2764
- fix(embed): defer provider credential validation by @oldnicke in #2746
- fix(api): decode memory observation scopes by @Jordan-Jarvis in #2735
- test(openrouter): set cached-token fields in mock to stop intermittent MagicMock crash by @dcbouius in #2776
- chore(deps): bump pydantic-settings, transformers, soupsieve (security) by @dcbouius in #2727
- chore(deps): bump mcp to 1.28.1 (clears 20 high-severity MCP SDK alerts) by @dcbouius in #2782
- docs(guides): add 44 integration memory guides by @benfrank241 in #2778
- blog: The Fully Open Agent Memory Stack (Hermes + Hindsight) by @benfrank241 in #2771
- perf+fix(graph-maintenance): catch the #2529 sweep deadlock in continuous perf, and drive dropped passes to zero by @nicoloboschi in #2534
- fix(embeddings): truncate oversized litellm-sdk inputs before embedding (#2501) by @nicoloboschi in #2516
- fix(mcp): prevent get_bank from creating banks by @Sanderhoff-alt in #2393
- feat(auth): add create bank validation hook by @Sanderhoff-alt in #2395
- chore: remove stray local state files by @Sanderhoff-alt in #2472
- feat(reflect): step-by-step context caching for the Gemini tool loop by @nicoloboschi in #2540
- fix(search): include proof_count in temporal spreading SQL SELECT by @Srujan-rai in #2479
- fix(reflect): thread max_completion_tokens into the structured-output extraction call (#2431) by @r266-tech in #2486
- docs(cli): describe explore memory detail view by @koriyoshi2041 in #2497
- revert(docs-skill): drop cookbook pages from the docs skill bundle by @nicoloboschi in #2818
- fix(control-plane): clear mental-model tags when the edit field is emptied (#2507) by @nicolas-vivot in #2508
- revert(migrations): drop advisory-lock maintenance-routines install (#2690) by @nicoloboschi in #2817
- fix(migrations): install maintenance routines into each run's own schema by @nicoloboschi in #2820
- perf(graph-maintenance): prune stale cooccurrences via INTERSECT, not a self-join (7.1x, 289x fewer buffers) by @sergattic in #2473
- style: apply ruff format to reflect/agent.py by @nicoloboschi in #2822
- feat(config): optional cap on planner parallelism for pool connections by @cdbartholomew in #2600
- feat(api): enrich refresh_mental_model result_metadata with semantic outcome by @hb-cam in #2627
- fix(trace): gate LLM trace writes on backend lifecycle, not error strings (reverts #2618) by @nicoloboschi in #2821
- feat(anthropic): carry the prompt-cache marker on batch system prompts by @hb-cam in #2652
- fix(recall): remove unused graph seed inputs by @Sanderhoff-alt in #2683
- fix(engine): consolidate duplicated engine definitions by @Sanderhoff-alt in #2691
- docs(retain): correct entity resolution (no nickname resolution) by @benfrank241 in #2694
- fix(migrations): install the maintenance routines once, in the configured schema by @nicoloboschi in #2824
- fix(engine): isolate operation completion from best-effort side-effects by @nicoloboschi in #2823
- fix(reflect): preserve required tools for custom OpenAI endpoints by @Jordan-Jarvis in #2734
- fix(migrations): preserve percent-encoded database URLs by @Jordan-Jarvis in #2733
- fix(ci): avoid rebuilding docs in verify-generated-files by @Sanderhoff-alt in #2739
- feat(api): attribute remote reranker calls by bank by @Jordan-Jarvis in #2740
- fix(reflect): cap done tool answers by @Sanjays2402 in #2757
- Fix day+month+year dates collapsing to the whole month by @dimonnld in #2791
- feat(zcode): add Hindsight long-term memory integration for ZCode by @benfrank241 in #2549
- fix(query-analyzer): pick strongest dateparser match, not the leftmost (#2768) by @benfrank241 in #2772
- fix(retain): reject degenerate fact text before storage (#2520) by @handnewb in #2794
- fix(audit): add missing @Audited decorator to api_update_memory by @handnewb in #2798
- fix(retain): make lazy bank creation atomic (#2695) by @ijevin in #2802
- fix(db): re-apply session GUCs on pool acquire (asyncpg RESET ALL wipes them) by @sireika in #2815
- feat(pg0): carry optional user/password in pg0:// URLs by @nicoloboschi in #2832
- test(recall): stop passing removed semantic_seeds into link expansion by @nicoloboschi in #2829
- fix(retain): make entities a plain list of strings (#2749) by @nicoloboschi in #2830
- fix(worker): discover expired-operation schemas in one query, default retention off by @nicoloboschi in #2819
- blog: Persistent memory for ZCode (Z.ai GLM coding agent) by @benfrank241 in #2838
- fix: remove vulnerable API runtime packages by @Jordan-Jarvis in #2851
- chore(db): remove the dead advisory_lock dialect helper by @nicoloboschi in #2855
- feat: add tags filtering to list_memories / list_memory_units by @superafun in #2848
- fix: disable built-in tools in ClaudeCodeLLM.call() to prevent ToolSearch deferral eating max_turns=1 by @peter216 in #2850
- fix(memory): preserve bank attribution during curation by @Jordan-Jarvis in #2847
- fix(llm): emit OpenAI strict JSON schemas by @Jordan-Jarvis in #2845
- feat(audit): make audit_log_enabled overridable per bank by @nicoloboschi in #2827
- fix(retain): reassert resolved entities before linking units (#2662) by @nicoloboschi in #2859
- fix(pg0): honor URL credentials during MemoryEngine startup by @r266-tech in #2836
- chore(deps): bump nltk to 3.10.0 (clears 2 high-severity path-traversal alerts) by @dcbouius in #2833
- fix(retain): preserve fact alignment when filtering degenerate text by @r266-tech in #2846
- Per-operation strict schema for consolidation by @nicoloboschi in #2825
- fix(#2808): make mental model tags_match configurable on all creation surfaces (MCP, TS client, CLI) by @nicoloboschi in #2858
- fix(mental-models): align stale checks with refresh tag scope by @r266-tech in #2804
- fix(retain): a zero retry budget must still perform the initial fact-extraction request by @chethanuk in #2779
- fix(integrations): keep auto-managed Hindsight daemons working on Python 3.14 hosts by @r266-tech in #2801
- fix(opencode): derive session-start recall query from user messages (#2856) by @nicoloboschi in #2860
- fix(docker): build official images from the committed workspace lock by @r266-tech in #2789
- feat(api): allow deleting terminal bank operations with control-plane support by @chethanuk in #2777
- fix(transfer): preserve JSONB and timestamp provenance by @Korayem in #2717
- fix(worker): count crash-recovery attempts toward max-retry budget (#2675) by @handnewb in #2834
- fix(retain): queue retain.completed webhook on boundary and zero-fact batches by @nicoloboschi in #2861
- fix(reflect): emit canonical OpenAI tool result messages by @Jordan-Jarvis in #2844
- fix: advance watermark after no-op delta refresh by @SunneeYang in #2866
- fix(cli): sync regenerated OpenAPI operation changes by @Sanderhoff-alt in #2867
- feat(llm): opt-in 4xx request-dump for diagnosing rejected calls (all providers) by @nicoloboschi in #2865
- fix(docs): sync generated documentation skill by @Sanderhoff-alt in #2870
- fix(vector-index): repair per-bank index coverage after restore/upgrade (#2645) by @nicoloboschi in #2872
- refactor(llm): type provider tool choices by @Jordan-Jarvis in #2843
- fix(llm): recover malformed JSON via json_repair (last-resort parse fallback) by @nicoloboschi in #2871
- chore(deps): pin adm-zip >=0.6.0 in zapier (clears last fixable high alert) by @dcbouius in #2880
- blog: Make Thinking Machines' Inkling your agent's memory (tutorial) by @benfrank241 in #2882
New Contributors
- @ymybxx made their first contribution in #2531
- @ishanmalik made their first contribution in #2575
- @oldnicke made their first contribution in #2570
- @poog26 made their first contribution in #2563
- @hb-cam made their first contribution in #2629
- @handnewb made their first contribution in #2620
- @yingliang-zhang made their first contribution in #2618
- @JiehoonKwak made their first contribution in #2647
- @iRonin made their first contribution in #2611
- @viliusdidit made their first contribution in #2680
- @ElanHasson made their first contribution in #2703
- @ebarkhordar made their first contribution in #2755
- @Jordan-Jarvis made their first contribution in #2764
- @Srujan-rai made their first contribution in #2479
- @nicolas-vivot made their first contribution in #2508
- @sergattic made their first contribution in #2473
- @Sanjays2402 made their first contribution in #2757
- @dimonnld made their first contribution in #2791
- @ijevin made their first contribution in #2802
- @superafun made their first contribution in #2848
- @peter216 made their first contribution in #2850
- @chethanuk made their first contribution in #2779
- @SunneeYang made their first contribution in #2866
Full Changelog: v0.8.4...v0.8.5