Releases: rohitg00/agentmemory
Release list
v0.9.27
Wave release closing several breaking regressions reported against v0.9.26, plus an agent-scope isolation security fix, an iii version-pin audit fix, and a benchmark scorecard correction. No breaking changes; drop-in upgrade.
Security
AGENTMEMORY_AGENT_SCOPE=isolatednot enforced onmem::search/POST /agentmemory/search/memory_recall/recall_context(#817). PR #654's isolation work covered smart-search,/memories,/observations, and/sessionsbut missed the BM25-only recall path. An isolated worker booted withAGENT_ID=Bcould read agent A's memories via the standard MCPmemory_recalltool. Fail-closed: if isolated mode is on and no agent id resolves, the call throws rather than dropping the filter.
Fixed
/graph/queryand/graph/statstimed out with"Invocation stopped"on large existing corpora (#814, PR #816). Refactoredmem::graph-extractto maintain three side-indexes (graphNameIndex,graphEdgeKey,graphNodeDegree) so every extract path is O(1), never O(n). Hot path reads exclusively from a precomputed top-degree snapshot updated inline on every extract.- All data lost on
agentmemory stopfollowed by restart (#843). Stop order inverted: worker first with a 5s SIGTERM grace so index flush can land, engine second. mem::graph-snapshot-rebuildandmem::graph-resetheartbeat-crashed on legacy >25K-node corpora (#825). Rebuild now refuses pre-flight when no prior snapshot exists. Reset is now enumeration-free: writes empty snapshot withresetAtepoch marker. Future extracts treat any pre-resetAtrow as orphan.- Multi-instance port collisions on one host (#750, PR #815).
--port Nnow drags streams + engine. New--instance Nshortcut picks a 100-port block. - iii console install pulled latest engine instead of the pinned v0.11.2 (audit). Install command now passes
VERSION=${IIPINNED_VERSION}. Render path is platform-aware: Windows users get a PowerShell hint.
Added
POST /agentmemory/graph/snapshot-rebuild(≤25K nodes,force: trueto bypass).POST /agentmemory/graph/resetenumeration-free clean-restart.--instance NCLI flag for multi-daemon (max N=50).GraphSnapshot.topDegrees,GraphSnapshot.resetAt,GraphQueryResult.fromSnapshot,GraphQueryResult.warning.
Changed
- REST endpoint count: 126 → 128.
mem::graph-statsreads exclusively from snapshot.mem::graph-queryempty-body / nodeType path reads exclusively from snapshot.mem::searchover-fetch triggers on agentId filter too.
Docs
- Corrected coding-agent-life-v1 P@5 numbers (#796).
- README refresh: stats 174 files / 1,390+ tests / 258 functions; "New in vX.Y.Z" callout removed.
import-jsonlusers warned about Claude Code'scleanupPeriodDays30-day default.
Full changelog: CHANGELOG.md
v0.9.26 - hotfix for first-run load crash
Hotfix on top of v0.9.25. Closes #797.
Fixed
- First boot crash:
TypeError: Cannot read properties of undefined (reading 'v')(#797). The sharded index load path checkedmanifest.value !== nullbefore forwarding, but some iii-state adapters returnundefined(notnull) for a missing key.loadManifestData(undefined)then crashed onundefined.v. Now treats both null + undefined + non-object values as 'no manifest' and falls through to the legacy load path.
Self-healing was already in place — the next debounced save rebuilt a fresh manifest — but the crash on first boot scared every fresh upgrader.
Upgrade
npm install -g @agentmemory/agentmemory@0.9.26
If you already saw the warning on v0.9.25 and the daemon kept running, you're fine — the index was already rebuilt. v0.9.26 just makes the first-run boot quiet.
Verified
- 125 test files / 1381 tests pass
- Build clean
v0.9.25 - regression sweep + sharded index + graph pagination
Bug-fix wave closing every breaking 0.9.24 regression, plus a feature lane. Eleven issues closed. No breaking changes; drop-in upgrade.
Fixed
- Cross-provider fallback always 404'd and tripped the circuit breaker (#778). Fallback resolved each provider's own env-driven default model instead of inheriting the primary's.
import-jsonlaborted entire batch on legacy session row missingid(#775). Re-keys onparsed.sessionId, backfills missingexisting.id.parseSummaryXmlsilently dropped summaries wrapped in markdown fences (#783). NewstripXmlWrappers()peels fences + pre/postamble; final-merge parse retries once.sdk.triggerVoid is not a functionon iii-sdk 0.11.2 (#758 / #726). All 9 call sites migrated totrigger({ action: TriggerAction.Void() }).- pi integration recorded every observation as "No content provided" (#759). Field-name fix:
tool_input/tool_output. - Fresh global install refused to boot when PATH iii didn't match the runtime pin (#752). Private install at
~/.agentmemory/bin/+ auto-fallback. Existing user iii stays untouched. mem::obsidian-exportHTTP 500[object Object]on any record missingid(#729). Four-layer hardening + outer try/catch.- Concurrent agent-sdk summarize chunks failed with
too_many_chunks_skipped(#781).AsyncLocalStoragerecursion guard + reference-counted env marker. - Viewer #graph tab blank on large graphs (#753).
graph/querypagination + degree-ranked default cap + viewer error banner with Retry.
Upgrade
npm install -g @agentmemory/agentmemory@0.9.25iii-sdk and iii-engine pins stay at v0.11.2.
Full changelog: https://github.com/rohitg00/agentmemory/blob/main/CHANGELOG.md
v0.9.24 — hotfix: --version + iii hard-pin
0.9.24 — 2026-05-29
Hotfix
v0.9.23 — Copilot CLI + graph extraction fix
0.9.23 — 2026-05-28
Bug-fix + integration wave. GitHub Copilot CLI joins the supported agent matrix with plugin + hooks + MCP coverage. Three silent DX bugs fixed end-to-end: graph extraction never fired on session end, agentmemory status reported zero memories, consolidation defaulted off even with an LLM provider configured. Five additional adapters and a clearer local-LLM story for Ollama / LM Studio users. agentmemory connect now points users at npx skills add for the native-skills install path (50+ agents).
Added
- GitHub Copilot CLI (PR #534). Full first-class support:
plugin/plugin.jsonmanifest,hooks.copilot.jsonlifecycle hooks for all 11 Copilot events with camelCase payload normalization,agentmemory connect copilot-cliMCP path, first-run onboarding default-select viaCOPILOT_CLI/COPILOT_AGENT_SESSION_IDenv detection, Windows-safecmd.exe /d /s /c npxwrapper. Standalone MCP transport now speaks LSP-styleContent-Lengthframed JSON-RPC alongside the existing newline-delimited form so Copilot's stdio init handshake works. - Five new MCP adapters (PR #677). Warp, Cline, Continue, Zed, and Droid.
createJsonMcpAdapterextended withwrapperKey(Zed usescontext_serversinstead ofmcpServers) andextraEntryFields(Droid requirestype: "stdio").ADAPTERScount: 11 → 17. /agentmemory/graph/buildendpoint (PR #698). Backfills the knowledge graph from existing compressed observations across every session in configurable batches. Wires up the viewer's "Build Graph" button that previously returned 404.- 11 README translations + language picker (PR #675). zh-CN, zh-TW, ja-JP, ko-KR, es-ES, pt-BR, fr-FR, de-DE, ru-RU, tr-TR, hi-IN.
npx skills addhint in connect output (PR #709). After a successfulagentmemory connect <agent>, the CLI now prints the matchingnpx skills add rohitg00/agentmemory -ycommand so users get the native-skills install alongside MCP wiring. TheskillsCLI covers 50+ agents including the 5 added in PR #677. README "Other agents" section gains a dedicated subsection explaining the two-step pattern (connectwrites MCP config,skills addinstalls the 8 SKILL.md files into the agent's native skill directory).
Changed
- Consolidation auto-enables when an LLM provider is configured (PR #696, closes #612).
CONSOLIDATION_ENABLEDdefaulted tofalse, so users with a working provider got compression + summarization but zero graph nodes / crystals / lessons. Now defaultstruewhenever any ofANTHROPIC_API_KEY/OPENAI_API_KEY/OPENROUTER_API_KEY/GEMINI_API_KEY/GOOGLE_API_KEY/MINIMAX_API_KEY/OPENAI_BASE_URLis set, orAGENTMEMORY_PROVIDER=agent-sdk. Explicit=false/AGENTMEMORY_PROVIDER=noopstill opt out.OPENAI_API_KEY_FOR_LLM=falsehonored (key scoped to embeddings). - Fire-and-forget telemetry hooks (PR #688, closes #573). Nine telemetry-only hooks (notification, post-tool-failure, post-tool-use, prompt-submit, stop, session-end, subagent-start, subagent-stop, task-completed) switched to unawaited
fetch(...).catch(() => {})paired withsetTimeout(() => process.exit(0), 500).unref()(1500ms for the multi-fetchstop+session-endhooks). No longer blocks Claude Code's next-prompt boundary on every assistant turn. - Observability defaults tamed (PR #686, closes #519).
iii-config.yamldefaults:sampling_ratio: 0.1,logs_console_output: false.findIiiConfig()precedence reversed soAGENTMEMORY_III_CONFIGenv > cwd >~/.agentmemory/iii-config.yaml> bundled.
Fixed
- Graph extraction never fires automatically (PR #698, closes #666).
event::session::stoppedlistens onagentmemory.session.stoppedbut nothing in the codebase ever published that topic.api::session::endnow directly callssdk.triggerVoid("event::session::stopped", { sessionId })(try/catch guarded so a fan-out error doesn't fail the HTTP response). Knowledge graphs now materialize automatically when sessions end. agentmemory statusshows Memories/Observations = 0 (PR #698, closes #666). CLI fetched/agentmemory/exportfor counts but that endpoint times out (>5s) on iii-engine's file-based KV under concurrentkv.list(). Switched to/memories?count=true(count-only, constant-time) + sum ofsessions[].observationCount.- Hooks send full filesystem path as
projectinstead of repo basename (PR #687, closes #474). Native sessions, replay-import, andmemory_lesson_saveall use repo basename — the path/basename mismatch silently filtered out the bulk of relevant lessons from auto-injected context. NewresolveProject(cwd?)helper:AGENTMEMORY_PROJECT_NAMEenv >git rev-parse --show-toplevelbasename >basename(cwd). Applied to 9 hooks. - Cross-project memory leakage (PR #662). Memories created in one project leaking into recall on another. Wildcard guard pattern
(!project || !m.project || m.project === project)preserves backward-compat for legacy unscoped memories while scoping new ones strictly. - Graph parser tolerates reordered XML attributes (PR #685, closes #635). Order-dependent regex replaced with order-independent
parseAttrshelper. Self-closing trailing-/handling preserved. - Defensive null guards on
Memory.sessionIds(PR #684). Older exports + hand-edited dumps can omit this field; now treated as empty array on read. - Vector index Buffer slice metadata round-trip (PR #683, closes #587, #584).
byteOffset+byteLengthpreserved onBuffer.fromandFloat32Arrayconstruction so base64 round-trips don't corrupt vectors stored as slices. - Slots HTTP triggers return 503 not 500 (PR #682, closes #678). Feature-flag-disabled responses now use the documented 503 shape with
enableHow+docsHref..envpropagation fixed (now reads viagetEnvVar()not rawprocess.env). agentmemory doctorpoints to correct iii install URL (PR #681).- Separate
OPENAI_EMBEDDING_BASE_URL+OPENAI_EMBEDDING_API_KEY(PR #503). Lets users route embeddings and LLM calls to different OpenAI-compatible endpoints (e.g. cloud OpenAI for embeddings + local LM Studio for LLM, or vice versa). - Viewer Memories tab sorts newest first (PR #701, closes #674). Memories list rendered in KV-insertion order, hiding just-saved entries at the bottom of long lists.
loadMemories()now sorts oncreatedAtdesc (fallbackupdatedAt) before items reach state — matches thelocaleComparepattern Sessions / Metrics tabs already use.
Docs
- Local-LLM section in README (PR #697, closes #671). Dedicated "Local models (Ollama / LM Studio / vLLM)" subsection with copy-paste configs, model-pick table (qwen2.5-coder:7b, llama3.2:3b, mistral:7b-instruct, deepseek-r1:7b), and reasoning-model empty-content callout. Existing OpenAI-compatible support was buried in a one-line env comment.
- Three pipeline layers, not three primitives (PR #690). Website + README copy: the three primitives are worker / function / trigger (iii). HOOKS / RECALL / CONSOLIDATE are pipeline layers. Section anchor renamed
#primitives→#stackto match the nav label.
Infrastructure
- Hook scripts now bundle per-entry instead of sharing chunks, so
plugin/scripts/_project-*.mjshashed artifacts no longer churn the diff on every build. AGENTS.md"Hook Scripts" section documents the two patterns (context-injecting vs telemetry-only) and the 500ms / 1500ms exit-delay rule for single vs multi-fetch hooks.- Test suite: 1271 → 1291 (+20 new tests covering project basename resolver, fire-and-forget wiring, consolidation default behavior, session-end → graph extraction, the graph-build endpoint, and the viewer memories sort).
v0.9.22
Stability + ecosystem wave. Three install-broken bugs (npm install ERESOLVE, non-OpenAI base URLs, broken Claude bridge path) closed. Six runtime bugs from active users fixed end-to-end. Three new agent integrations (Qwen Code, Antigravity, Kiro). New AGENT_ID scope for multi-agent setups. Port mapping documented.
Fixed
-
npm installERESOLVE on fresh install (PR #649, closes #631).@anthropic-ai/sdkbumped from^0.39.0to^0.93.0soclaude-agent-sdk's peer is satisfied. Verified clean install with only the publisheddependenciesblock. -
Non-OpenAI base URLs silent-404 (PR #649, closes #646, #628).
buildChatUrl+buildEmbeddingUrlno longer blindly prepend/v1/. DeepSeek, SiliconFlow, Zhipu (/api/paas/v4), vLLM, LM Studio, Ollama all resolve correctly. -
CLAUDE_MEMORY_BRIDGEwrites to a path Claude Code reads (PR #649, closes #625). Slug now preserves the leading-on POSIX absolute paths and drops the spurious/memory/subdir, matching~/.claude/projects/<slug>/MEMORY.md. -
OpenAI provider reads
reasoning_contentfor thinking models (PR #648, closes #627). DeepSeek V4 / Qwen3 / GLM / Kimi returnmessage.reasoning_content. Previously onlymessage.reasoningwas checked — compress silently failed every call and tripped the circuit breaker. -
agentmemory stopreaps the worker process (PR #648, closes #640, #474). Worker pid is written to~/.agentmemory/worker.pidon boot;stopsignals both engine + worker. -
OpenCode plugin implicit-creates the session on first observation (PR #648, closes #638).
mem::observecreates the session row when one doesn't exist. No more orphan observations orSession not found for summarize. -
OpenCode plugin zero-config auto-context injection (PR #648, closes #431).
POST /session/startcontext is cached per-session; the existingexperimental.chat.system.transformhook reads from the cache. -
Viewer graph settles on 1000+ node graphs (PR #648, closes #563). Tick-decayed damping, per-node velocity cap, raf park on quiescence. Mousedown / wheel / zoom / recenter re-wake the parked loop.
-
/memories+/exportpaginate (PR #648, closes #544). New?count=trueand?limit=N&offset=Mon/memories./exportforwards?maxSessions+?offset. Stops large corpora (8K+ memories) from timing out at the iii-engine invocation boundary. -
Claude Code drops the MCP server silently (PR #650, closes #510).
plugin/.mcp.jsonenv block uses${VAR:-default}form. Unset required vars no longer fail config parse. -
Full 51-tool MCP surface by default (PR #650, closes #553).
getVisibleTools()default flipped fromcore(8) toall(51) to match what every plugin manifest advertises.AGENTMEMORY_TOOLS=corestill gives the lean set. -
Connect adapters write
${VAR:-default}env block (PR #650).agentmemory connectfor Claude Code / Cursor / Gemini CLI / Windsurf writes the same default form. -
Hermes
memory statusno longer reports the plugin as Missing (PR #643, closes #520). Hermes plugin seedsAGENTMEMORY_URLtohttp://localhost:3111at import. Works for systemd-managed agentmemory where the env file is loaded viaEnvironmentFile=and never reaches the interactive shell. -
Deleted memories cleared from BM25 + vector indices (PR #636 by @abhinav-m22, closes #632).
SearchIndex.remove()added and called from every delete path. Snapshot flushed synchronously so a SIGKILL between mutation + debounce can't resurrect deleted entries. -
PostToolUse hook reads
tool_response, falls back totool_output(PR #561 by @faraz152, closes #539). Claude Code's PostToolUse payload usestool_response. Now readstool_response ?? tool_outputso legacy integrations keep working. -
iii-sdk pinned to exact
0.11.2(PR #567, closes #555).iii-sdk@0.11.6introduced a routing regression where every/agentmemory/*route returned 404. Pin removes the caret. -
OpenAI provider sends explicit
stream: false(PR #526 by @Ptah-CT). Some OpenAI-compatible proxies default totext/event-streamwhenstreamis absent. -
Viewer search uses NFKC normalisation for CJK / fullwidth input (PR #542 by @kaushalrog).
-
Viewer splash shows actual bound viewer port (PR #560 by @Tanmay-008, closes #521).
/agentmemory/liveznow returnsviewerPort+viewerSkipped. -
Viewer tab bar height stable across tab switches (PR #325 by @hungtd119, closes #324).
-
Graph parser accepts self-closing
<entity .../>tags (PR #494 by @Rex57, closes #492). -
Plugin MCP server inherits remote/auth env (PR #386 by @LaplaceYoung, closes #375).
-
@agentmemory/mcprejects literal${VAR}placeholders. AnyAGENTMEMORY_URL/AGENTMEMORY_SECRETvalue of the form${...}is treated as unset and falls back tohttp://localhost:3111. -
Codex
stophook closes session (PR #579, closes #493).Stopwas missing from the Codex bundle; session never got marked completed. -
Claude Code
--with-hooksworks for MCP-standalone users (PR #581, closes #508).
Added
-
AGENT_IDmulti-agent memory isolation (PR #654, closes #554). OptionalAGENT_IDenv tags every Session / RawObservation / CompressedObservation / Memory.AGENTMEMORY_AGENT_SCOPE=isolated(opt-in;shareddefault) also filters every recall path (mem::smart-search,/memories,/observations,/sessions). Per-call overrides via request body +?agentId=<role>/?agentId=*query params.?includeOrphans=truesurfaces pre-tag rows. -
Qwen Code connect adapter (PR #651, closes #647).
agentmemory connect qwenwrites the standardmcpServersblock to~/.qwen/settings.json. -
Antigravity connect adapter (PR #651, closes #614). Replacement for Gemini CLI (sunset 2026-06-18). Writes
mcp_config.jsonto the platform-specific User dir. -
Kiro connect adapter (PR #651, closes #618). Writes user-level
~/.kiro/settings/mcp.json. -
Cost-aware model selection (PR #654, closes #613). Runtime warning when
OPENROUTER_MODELmatches the premium pattern. README cost-tier table with measured workload data. Suppress viaAGENTMEMORY_SUPPRESS_COST_WARNING=1. -
Pluggable benchmark harness (PR #562). New
eval/directory with thecoding-agent-life-v1corpus (15 sessions + 15 graded queries) and three adapters (grep, OpenAI embeddings + cosine, agentmemory hybrid). LongMemEval support. Sandboxed agentmemory + iii-engine on alt ports viaeval/scripts/sandbox.sh. Dev-only — no runtime impact. -
agentmemory connect codex --with-hooksopt-in flag ([PR #564](https://github.com/rohit...
v0.9.21 — quality + integration wave (OpenCode plugin + 9 bug fixes)
0.9.21 — 2026-05-19
Quality + integration wave. Headline: native OpenCode plugin with full Claude Code hook parity (#237 by @cl0ckt0wer). Ten more PRs alongside: memory_recall returning the wrong shape, env-file AGENTMEMORY_DROP_STALE_INDEX silently ignored, hook scripts crashing on Windows usernames with spaces, viewer search inputs interrupting CJK IME composition, large sessions silently failing at the LLM context limit, lessons invisible to smart-search, Hermes plugin manifest missing hooks, cli onboarding crashing in non-TTY contexts, rebuildIndex blocking boot on large corpora, 25h embed-loop bottleneck during rebuild, and the v0.9.19 iii-console installer workaround can come out now that upstream is fixed.
Added
- OpenCode plugin with 22 auto-capture hooks (PR #237 by @cl0ckt0wer, closes #236 + #244). Complete OpenCode plugin in
plugin/opencode/matching Claude Code hook parity. Covers session lifecycle (8 hooks), messages (3), tool lifecycle (2), part tracking, permissions, task tracking, plus a two-layer enrichment pipeline (memory context on first turn, file enrichment on subsequent turns) and two slash commands (/recall,/remember). Full gap analysis inplugin/opencode/README.md.
Fixed
-
memory_recallendpoint + format/token_budget forwarding (PR #516 by @serhiizghama, closes #507 + #440). MCPmemory_recallalways returned compact mode and droppedformat+token_budgetparams. Two root causes fixed: standalone shim routed through/agentmemory/smart-searchinstead of/agentmemory/search, and the local-fallback path didn't read either param. Now routes correctly, forwards both params end-to-end, defaultsformatto"full"matching the MCP schema. -
env-file
AGENTMEMORY_DROP_STALE_INDEXflag now honored (PR #461 by @honor2030, closes #456). Setting the flag in~/.agentmemory/.envwas silently ignored because the boot path readprocess.envdirectly. NewisDropStaleIndexEnabled()helper reads merged env. Combined with #455 + #469 reports, this is the unblock path for the stale-index server-crash recovery loop. -
Windows hook scripts quote plugin paths correctly (PR #487 by @honor2030, closes #477). Hook command strings referenced
${CLAUDE_PLUGIN_ROOT}/scripts/*.mjswithout quotes — Windows users with spaces in their username had every hook crash. Quotes added + regression test. -
Viewer search inputs honor IME composition (PR #517 by @jonathanzhan1975). CJK users typing in the viewer's search inputs hit mid-character interruption — every keystroke fired the
oninput=re-render handler, breaking IME composition mid-syllable. NewbindImeSafeSearchhelper defers re-render untilcompositionend. -
Chunk large sessions to fit LLM context window (PR #472 by @efenex). Sessions with >7000 observations silently failed at the LLM provider's context limit — the consolidation pipeline silently skipped the session. New chunking splits oversized sessions across multiple compress calls + restitches the narrative via a
REDUCE_SYSTEMprompt. Legacy single-call path preserved when obs count is under the chunk size. Backfill script underscripts/for users hitting the pre-fix bug. -
Surface lessons in smart-search + diagnose tally (PR #473 by @efenex). Closes the lesson round-trip with #458 (lessons auto-injected into
mem::context): lessons are now also returned alongside hybrid search results in a separatelessonsfield onsmart-search, and thediagnosehealth surface tallies per-store counts so the trust-shock pattern (save succeeds, recall empty, diagnose says 0) goes away. -
Declare all Hermes plugin hooks (PR #486 by @honor2030). The Hermes
plugin.yamlmanifest only declared 3 of the 6 implemented hooks. All 6 now declared (prefetch,sync_turn,on_session_end,on_pre_compress,on_memory_write,system_prompt_block). -
rebuildIndexnon-blocking on boot (PR #500 by @efenex). Boot path previouslyawait-edrebuildIndex(kv), so the viewer + later boot steps stalled — on large corpora this was 25h+ of blocked startup. Replaced withvoid rebuildIndex(kv).then(...).catch(...)so the rebuild runs in the background. -
Batched embed calls in
rebuildIndex(25h → 3h on large corpora) (PR #504 by @efenex). The rebuild loop made one embed call per observation, paying full HTTP RTT per item. NewvectorIndexAddBatchGuardedhelper batches embeds (default 32, configurable viaREBUILD_EMBED_BATCH_SIZE) and try/catches per-item failures. Measured 25h → 3h on a 250k-observation corpus. -
CLI skips onboarding prompts without a tty (PR #491 by @honor2030). Onboarding prompts crashed in non-interactive contexts (CI,
docker run -d, piped input). New guard short-circuits with sensible defaults when stdin/stdout aren't TTYs orCI=1.
Changed
- Drop iii-console installer
--nextworkaround (PR #546). v0.9.19 routed first-run iii-console install throughbash -s -- --nextto dodge an upstream tag-prefix bug at iii-hq/iii#1652. Upstream iii-hq/iii#1660 shipped 2026-05-19;install.iii.dev/console/main/install.shis a CDN proxy serving upstream main HEAD so the fix is live without an iii release tag. Reverted to canonical barecurl ... | sh.
Infrastructure
- 95 test files (was 92), 1067 tests pass (was 1038) on
chore(release): v0.9.21. - Bundles 11 PRs: 1 contributor feature + 9 bug fixes across MCP / hooks / viewer / summarize / lessons / Hermes / rebuildIndex / CLI + 1 upstream-installer revert.
- New contributors landing first PRs this release: @cl0ckt0wer, @serhiizghama, @jonathanzhan1975.
v0.9.20 — hotfix: revert Codex Stop session-end
0.9.20 — 2026-05-18
Hotfix: revert the Codex Stop → session-end chain shipped in v0.9.19.
Fixed
- Revert Codex Stop hook session-end chain (PR #501 by @Rex57, reverts v0.9.19's #495, re-opens #493). Post-merge field-testing surfaced the underlying issue: Codex
Stopfires before the overall conversation is truly finished — multiple Stops bracket each assistant turn within one session. Chainingsession-end.mjsfrom Stop marked sessions completed too early, with later observations still arriving against anendedAt-stamped record. Restored to summarize-only Stop; the SessionEnd-shaped solution stays open as #493.
v0.9.19 — commit linking, Azure v1, Dijkstra, installer workaround
0.9.19 — 2026-05-18
Feature + hardening wave. Sessions now link to the git commits they shipped (forward + reverse lookup, REST + MCP surfaces). OpenAI provider transport collapses into one shared module with auto-detected Azure URL style (legacy /openai/deployments/<dep> and v1 /openai/v1 both supported). Graph retrieval switches from BFS to Dijkstra over the weighted edge graph. Codex Stop hook chains session-end. Plugin MCP server inherits AGENTMEMORY_URL / AGENTMEMORY_SECRET from the shell. Point fix routes the bundled iii-console installer around an upstream tag-prefix bug. 1007+ tests pass.
Added
-
Session-to-commit linking (PR #498). New
KV.commitsnamespace keyed by full SHA holdsCommitLinkrecords (sha, shortSha, branch, repo, message, author, authoredAt, files, sessionIds).Session.commitShas[]provides the forward back-reference. REST:POST /agentmemory/session/commitupserts links (mergessessionIdson re-link, preserveslinkedAt);GET /agentmemory/commits/:shaandGET /agentmemory/commitsround-trip. MCP:memory_commit_lookupandmemory_commitstools. Post-commit hook auto-captures the link on every commit in the working directory. Closes the loop on "what session wrote this code" / "what commits did this session ship" without leaving agentmemory. -
Azure OpenAI v1 URL pattern auto-detection (PR #462, closes #371). Both the LLM and embedding providers now route through
_openai-shared.tsand auto-detect Azure URL style:OPENAI_BASE_URL=https://r.openai.azure.com/openai/deployments/<dep>→ legacy URL pattern,api-versionquery param viaOPENAI_API_VERSION(default2024-08-01-preview).OPENAI_BASE_URL=https://r.openai.azure.com(bare host, or/openai, or/openai/v1) → v1 GA pattern,/openai/v1/<route>, deployment name carried in the request body asmodel.- Net effect: Azure embeddings work for the first time (LLM-side Azure shipped in v0.9.17; embedding was still hardcoded to
/v1/embeddings+ Bearer). Closes #199 (consolidation) as superseded.
Changed
-
Graph retrieval: BFS → Dijkstra over weighted edges (PR #463, closes #328 filed by @Tanmay-008 with benchmark numbers showing the BFS edge-count semantics + O(n)
Array.shift()profile). Memory graph edges carry weights 0.1–1.0; BFS visited by edge-count regardless, so a one-hop weak edge ranked the same as a two-hop strong chain. Dijkstra overcost = 1/max(weight, 0.01)selects weight-optimal paths instead. Adjacency map built once in O(V+E) and min-heap dequeue at O(log V) replace the prior O(V·E) + O(n)Array.shift()profile.maxDepthsemantics preserved (still edge-count bound). ThestartNodepath is excluded from returned paths so the dedicatedscore=1.0fallback loop insearchByEntitiesfires as designed (regression catch from the inline review). -
Codex Stop hook chains session-end (PR #495 by @Rex57, fixes #493 also filed by @Rex57).
hooks.codex.jsonStop now runsstop.mjsfollowed bysession-end.mjs. Codex doesn't ship a separateSessionEndlifecycle event, so the session would otherwise stay open after the user terminated the Codex session. Tests assert both commands appear in the Stop chain. -
Plugin MCP entry inherits shell env via passthrough (PR #460, closes #375 filed by @anthony-spruyt).
plugin/.mcp.jsonandAGENTMEMORY_MCP_BLOCK(the templateagentmemory connect <agent>writes into~/.claude.json,~/.cursor/mcp.json, etc.) now declareenv: { AGENTMEMORY_URL: "${AGENTMEMORY_URL}", AGENTMEMORY_SECRET: "${AGENTMEMORY_SECRET}" }. The MCP host substitutes shell values at server launch. When the vars are unset, the host passes empty strings; the standalone shim'sprocess.env["AGENTMEMORY_URL"] || "http://localhost:3111"falls back to localhost. One wired entry now covers both local and remote (k8s / reverse-proxied) deployments without/doctor"duplicate server" warnings.
Fixed
ensureIiiConsole()install path (src/cli.ts). The upstreaminstall.iii.dev/console/main/install.shscript's jq predicate filters releases withstartswith("v")whileiii-hq/iiitags asiii/v0.12.0. The script bails withno stable iii release foundon every fresh install. Switched the install command tocurl ... | bash -s -- --nextuntil upstream patches the script — the--nextcodepath uses a regex on-next.without the buggystartswithconstraint, so it succeeds against the same tag set. Inline comment documents the upstream bug + revert condition.
Infrastructure
v0.9.18 — hardening + DX wave
[0.9.18] — 2026-05-17
Hardening + DX wave. Five fixes land together: lessons now flow into the auto-inject context payload (closes a half-finished loop from earlier releases — see #381 / #457), the viewer drops data: from its img-src CSP by self-hosting its favicon, the filesystem watcher redacts PEM private-key blocks and standalone JWTs before transport, the mcp-standalone livez probe gets a dependency-injection seam that kills a flaky test, and the OpenAI timeout precedence is documented + tightened (strict integer parse, OPENAI_TIMEOUT_MS keeps its v0.9.17 meaning as an alias of the global AGENTMEMORY_LLM_TIMEOUT_MS). 1007/1007 tests pass.
Added
-
Lessons auto-injected into
mem::contextpayload (PR #458, closes #457, surfaced in discussion #381). Lessons were generated + stored but only retrievable via an explicitmemory_lesson_recallMCP call — agents rarely thought to invoke it, so the loop was half-done.mem::contextnow readsKV.lessonsalongside slots + profile, ranks by(project-relevance × confidence)(project-scoped lessons get a 1.5× boost), filters tombstoned + cross-project entries, caps at top-10, and emits a## Lessons Learnedblock competing fairly for the token budget. Block recency tracks the most-recentlastReinforcedAt || updatedAt, so hot lessons survive when budget tightens. -
Self-hosted viewer favicon (PR #452, closes #447). The viewer's inline-SVG
data:favicon (added in #313) requireddata:inimg-src— a broader allowance than the viewer actually needed. The favicon now lives at/favicon.svgserved by the viewer withContent-Type: image/svg+xmlandCache-Control: public, max-age=3600; build script copies the asset intodist/viewer/alongsideindex.html. CSP reverts to bareimg-src 'self'.
Changed
-
OPENAI_TIMEOUT_MSis now an alias ofAGENTMEMORY_LLM_TIMEOUT_MS(PR #453, closes #446). v0.9.17 shippedOPENAI_TIMEOUT_MSas the OpenAI-scoped knob, then PR #379 introduced the globalAGENTMEMORY_LLM_TIMEOUT_MSshared across all raw-fetch providers. The OpenAI provider now resolves them in precedence order:OPENAI_TIMEOUT_MS→AGENTMEMORY_LLM_TIMEOUT_MS→60_000msdefault. v0.9.17 configs keep working unchanged; new configs should prefer the global. The provider's request also moved onto the sharedfetchWithTimeouthelper that owns AbortController +clearTimeoutcleanup for every raw-fetch path (minimax, openrouter, gemini, embedding providers). -
Strict integer parse for timeout env vars (PR #453, CodeRabbit catch).
parsePositiveIntrejects values like"30ms","1_000","60s","30abc","-30","0"via/^\d+$/(after trim) instead of lettingparseInt's lenience silently swallow trailing units / underscores / signs as a number. Malformed values fall back to the 60s default with no surprise truncation.
Fixed
-
Filesystem watcher redacts PEM private-key blocks + standalone JWTs in previews (PR #450, closes #448). Continues the redaction surface opened in PR #332. PEM blocks (
-----BEGIN ... PRIVATE KEY-----through-----END ... PRIVATE KEY-----, including encrypted, RSA, EC, DSA, OpenSSH, PGP variants) get a state-machine pass that replaces the whole block with a single[REDACTED ... PRIVATE KEY]marker; standalone JWT-shaped tokens (three base64url segments separated by dots, length ≥ ~32 chars) are masked to their last 4 chars. Both run before any transport-layer write. -
mcp-standalone livez probe DI seam kills the test flake (PR #451, closes #449). The standalone shim's livez probe used a fixed
fetchagainstlocalhost:3111which made the test suite depend on no other agentmemory instance running on the host. NewsetLivezProbe()injection seam lets tests provide a deterministic probe; default behaviour for production users is unchanged.
Infrastructure
-
91 test files (was 90), 1007 tests (was 992). New
test/context-lessons.test.ts(8 cases) covers lessons-auto-inject inclusion, empty-state no-op, project ranking, cross-project isolation, soft-delete skip, top-10 cap, confidence rendering, optionalcontextstring append. -
Bundled the four follow-up issues filed during the v0.9.17 audit wave (#446, #447, #448, #449) plus the cross-project lesson-injection gap surfaced in discussion #381 into a single patch release — no behaviour changes for existing users beyond the hardening above.