Skip to content

Releases: rohitg00/agentmemory

v0.9.27

Choose a tag to compare

@rohitg00 rohitg00 released this 07 Jun 08:58
2515851

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=isolated not enforced on mem::search / POST /agentmemory/search / memory_recall / recall_context (#817). PR #654's isolation work covered smart-search, /memories, /observations, and /sessions but missed the BM25-only recall path. An isolated worker booted with AGENT_ID=B could read agent A's memories via the standard MCP memory_recall tool. Fail-closed: if isolated mode is on and no agent id resolves, the call throws rather than dropping the filter.

Fixed

  • /graph/query and /graph/stats timed out with "Invocation stopped" on large existing corpora (#814, PR #816). Refactored mem::graph-extract to 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 stop followed by restart (#843). Stop order inverted: worker first with a 5s SIGTERM grace so index flush can land, engine second.
  • mem::graph-snapshot-rebuild and mem::graph-reset heartbeat-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 with resetAt epoch marker. Future extracts treat any pre-resetAt row as orphan.
  • Multi-instance port collisions on one host (#750, PR #815). --port N now drags streams + engine. New --instance N shortcut 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: true to bypass).
  • POST /agentmemory/graph/reset enumeration-free clean-restart.
  • --instance N CLI flag for multi-daemon (max N=50).
  • GraphSnapshot.topDegrees, GraphSnapshot.resetAt, GraphQueryResult.fromSnapshot, GraphQueryResult.warning.

Changed

  • REST endpoint count: 126 → 128.
  • mem::graph-stats reads exclusively from snapshot.
  • mem::graph-query empty-body / nodeType path reads exclusively from snapshot.
  • mem::search over-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-jsonl users warned about Claude Code's cleanupPeriodDays 30-day default.

Full changelog: CHANGELOG.md

v0.9.26 - hotfix for first-run load crash

Choose a tag to compare

@rohitg00 rohitg00 released this 03 Jun 09:16
7446bde

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 checked manifest.value !== null before forwarding, but some iii-state adapters return undefined (not null) for a missing key. loadManifestData(undefined) then crashed on undefined.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

Choose a tag to compare

@rohitg00 rohitg00 released this 02 Jun 23:33
d442fee

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-jsonl aborted entire batch on legacy session row missing id (#775). Re-keys on parsed.sessionId, backfills missing existing.id.
  • parseSummaryXml silently dropped summaries wrapped in markdown fences (#783). New stripXmlWrappers() peels fences + pre/postamble; final-merge parse retries once.
  • sdk.triggerVoid is not a function on iii-sdk 0.11.2 (#758 / #726). All 9 call sites migrated to trigger({ 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-export HTTP 500 [object Object] on any record missing id (#729). Four-layer hardening + outer try/catch.
  • Concurrent agent-sdk summarize chunks failed with too_many_chunks_skipped (#781). AsyncLocalStorage recursion guard + reference-counted env marker.
  • Viewer #graph tab blank on large graphs (#753). graph/query pagination + degree-ranked default cap + viewer error banner with Retry.

Upgrade

npm install -g @agentmemory/agentmemory@0.9.25

iii-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

Choose a tag to compare

@rohitg00 rohitg00 released this 29 May 09:23
fd9e3bd

0.9.24 — 2026-05-29

Hotfix

v0.9.23 — Copilot CLI + graph extraction fix

Choose a tag to compare

@rohitg00 rohitg00 released this 29 May 08:50
a9bc129

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.json manifest, hooks.copilot.json lifecycle hooks for all 11 Copilot events with camelCase payload normalization, agentmemory connect copilot-cli MCP path, first-run onboarding default-select via COPILOT_CLI / COPILOT_AGENT_SESSION_ID env detection, Windows-safe cmd.exe /d /s /c npx wrapper. Standalone MCP transport now speaks LSP-style Content-Length framed 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. createJsonMcpAdapter extended with wrapperKey (Zed uses context_servers instead of mcpServers) and extraEntryFields (Droid requires type: "stdio"). ADAPTERS count: 11 → 17.
  • /agentmemory/graph/build endpoint (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 add hint in connect output (PR #709). After a successful agentmemory connect <agent>, the CLI now prints the matching npx skills add rohitg00/agentmemory -y command so users get the native-skills install alongside MCP wiring. The skills CLI covers 50+ agents including the 5 added in PR #677. README "Other agents" section gains a dedicated subsection explaining the two-step pattern (connect writes MCP config, skills add installs 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_ENABLED defaulted to false, so users with a working provider got compression + summarization but zero graph nodes / crystals / lessons. Now defaults true whenever any of ANTHROPIC_API_KEY / OPENAI_API_KEY / OPENROUTER_API_KEY / GEMINI_API_KEY / GOOGLE_API_KEY / MINIMAX_API_KEY / OPENAI_BASE_URL is set, or AGENTMEMORY_PROVIDER=agent-sdk. Explicit =false / AGENTMEMORY_PROVIDER=noop still opt out. OPENAI_API_KEY_FOR_LLM=false honored (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 with setTimeout(() => process.exit(0), 500).unref() (1500ms for the multi-fetch stop + session-end hooks). No longer blocks Claude Code's next-prompt boundary on every assistant turn.
  • Observability defaults tamed (PR #686, closes #519). iii-config.yaml defaults: sampling_ratio: 0.1, logs_console_output: false. findIiiConfig() precedence reversed so AGENTMEMORY_III_CONFIG env > cwd > ~/.agentmemory/iii-config.yaml > bundled.

Fixed

  • Graph extraction never fires automatically (PR #698, closes #666). event::session::stopped listens on agentmemory.session.stopped but nothing in the codebase ever published that topic. api::session::end now directly calls sdk.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 status shows Memories/Observations = 0 (PR #698, closes #666). CLI fetched /agentmemory/export for counts but that endpoint times out (>5s) on iii-engine's file-based KV under concurrent kv.list(). Switched to /memories?count=true (count-only, constant-time) + sum of sessions[].observationCount.
  • Hooks send full filesystem path as project instead of repo basename (PR #687, closes #474). Native sessions, replay-import, and memory_lesson_save all use repo basename — the path/basename mismatch silently filtered out the bulk of relevant lessons from auto-injected context. New resolveProject(cwd?) helper: AGENTMEMORY_PROJECT_NAME env > git rev-parse --show-toplevel basename > 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 parseAttrs helper. 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 + byteLength preserved on Buffer.from and Float32Array construction 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. .env propagation fixed (now reads via getEnvVar() not raw process.env).
  • agentmemory doctor points 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 on createdAt desc (fallback updatedAt) before items reach state — matches the localeCompare pattern 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#stack to match the nav label.

Infrastructure

  • Hook scripts now bundle per-entry instead of sharing chunks, so plugin/scripts/_project-*.mjs hashed 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

Choose a tag to compare

@rohitg00 rohitg00 released this 26 May 09:53
fd197df

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 install ERESOLVE on fresh install (PR #649, closes #631). @anthropic-ai/sdk bumped from ^0.39.0 to ^0.93.0 so claude-agent-sdk's peer is satisfied. Verified clean install with only the published dependencies block.

  • Non-OpenAI base URLs silent-404 (PR #649, closes #646, #628). buildChatUrl + buildEmbeddingUrl no longer blindly prepend /v1/. DeepSeek, SiliconFlow, Zhipu (/api/paas/v4), vLLM, LM Studio, Ollama all resolve correctly.

  • CLAUDE_MEMORY_BRIDGE writes 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_content for thinking models (PR #648, closes #627). DeepSeek V4 / Qwen3 / GLM / Kimi return message.reasoning_content. Previously only message.reasoning was checked — compress silently failed every call and tripped the circuit breaker.

  • agentmemory stop reaps the worker process (PR #648, closes #640, #474). Worker pid is written to ~/.agentmemory/worker.pid on boot; stop signals both engine + worker.

  • OpenCode plugin implicit-creates the session on first observation (PR #648, closes #638). mem::observe creates the session row when one doesn't exist. No more orphan observations or Session not found for summarize.

  • OpenCode plugin zero-config auto-context injection (PR #648, closes #431). POST /session/start context is cached per-session; the existing experimental.chat.system.transform hook 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 + /export paginate (PR #648, closes #544). New ?count=true and ?limit=N&offset=M on /memories. /export forwards ?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.json env 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 from core (8) to all (51) to match what every plugin manifest advertises. AGENTMEMORY_TOOLS=core still gives the lean set.

  • Connect adapters write ${VAR:-default} env block (PR #650). agentmemory connect for Claude Code / Cursor / Gemini CLI / Windsurf writes the same default form.

  • Hermes memory status no longer reports the plugin as Missing (PR #643, closes #520). Hermes plugin seeds AGENTMEMORY_URL to http://localhost:3111 at import. Works for systemd-managed agentmemory where the env file is loaded via EnvironmentFile= 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 to tool_output (PR #561 by @faraz152, closes #539). Claude Code's PostToolUse payload uses tool_response. Now reads tool_response ?? tool_output so legacy integrations keep working.

  • iii-sdk pinned to exact 0.11.2 (PR #567, closes #555). iii-sdk@0.11.6 introduced 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 to text/event-stream when stream is 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/livez now returns viewerPort + 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/mcp rejects literal ${VAR} placeholders. Any AGENTMEMORY_URL / AGENTMEMORY_SECRET value of the form ${...} is treated as unset and falls back to http://localhost:3111.

  • Codex stop hook closes session (PR #579, closes #493). Stop was missing from the Codex bundle; session never got marked completed.

  • Claude Code --with-hooks works for MCP-standalone users (PR #581, closes #508).

Added

  • AGENT_ID multi-agent memory isolation (PR #654, closes #554). Optional AGENT_ID env tags every Session / RawObservation / CompressedObservation / Memory. AGENTMEMORY_AGENT_SCOPE=isolated (opt-in; shared default) also filters every recall path (mem::smart-search, /memories, /observations, /sessions). Per-call overrides via request body + ?agentId=<role> / ?agentId=* query params. ?includeOrphans=true surfaces pre-tag rows.

  • Qwen Code connect adapter (PR #651, closes #647). agentmemory connect qwen writes the standard mcpServers block to ~/.qwen/settings.json.

  • Antigravity connect adapter (PR #651, closes #614). Replacement for Gemini CLI (sunset 2026-06-18). Writes mcp_config.json to 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_MODEL matches the premium pattern. README cost-tier table with measured workload data. Suppress via AGENTMEMORY_SUPPRESS_COST_WARNING=1.

  • Pluggable benchmark harness (PR #562). New eval/ directory with the coding-agent-life-v1 corpus (15 sessions + 15 graded queries) and three adapters (grep, OpenAI embeddings + cosine, agentmemory hybrid). LongMemEval support. Sandboxed agentmemory + iii-engine on alt ports via eval/scripts/sandbox.sh. Dev-only — no runtime impact.

  • agentmemory connect codex --with-hooks opt-in flag ([PR #564](https://github.com/rohit...

Read more

v0.9.21 — quality + integration wave (OpenCode plugin + 9 bug fixes)

Choose a tag to compare

@rohitg00 rohitg00 released this 19 May 18:45
1838f4d

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 in plugin/opencode/README.md.

Fixed

  • memory_recall endpoint + format/token_budget forwarding (PR #516 by @serhiizghama, closes #507 + #440). MCP memory_recall always returned compact mode and dropped format + token_budget params. Two root causes fixed: standalone shim routed through /agentmemory/smart-search instead of /agentmemory/search, and the local-fallback path didn't read either param. Now routes correctly, forwards both params end-to-end, defaults format to "full" matching the MCP schema.

  • env-file AGENTMEMORY_DROP_STALE_INDEX flag now honored (PR #461 by @honor2030, closes #456). Setting the flag in ~/.agentmemory/.env was silently ignored because the boot path read process.env directly. New isDropStaleIndexEnabled() 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/*.mjs without 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. New bindImeSafeSearch helper defers re-render until compositionend.

  • 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_SYSTEM prompt. Legacy single-call path preserved when obs count is under the chunk size. Backfill script under scripts/ 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 separate lessons field on smart-search, and the diagnose health 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.yaml manifest 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).

  • rebuildIndex non-blocking on boot (PR #500 by @efenex). Boot path previously await-ed rebuildIndex(kv), so the viewer + later boot steps stalled — on large corpora this was 25h+ of blocked startup. Replaced with void 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. New vectorIndexAddBatchGuarded helper batches embeds (default 32, configurable via REBUILD_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 or CI=1.

Changed

  • Drop iii-console installer --next workaround (PR #546). v0.9.19 routed first-run iii-console install through bash -s -- --next to 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.sh is a CDN proxy serving upstream main HEAD so the fix is live without an iii release tag. Reverted to canonical bare curl ... | 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

Choose a tag to compare

@rohitg00 rohitg00 released this 18 May 19:15

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 Stop fires before the overall conversation is truly finished — multiple Stops bracket each assistant turn within one session. Chaining session-end.mjs from Stop marked sessions completed too early, with later observations still arriving against an endedAt-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

Choose a tag to compare

@rohitg00 rohitg00 released this 18 May 12:57

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.commits namespace keyed by full SHA holds CommitLink records (sha, shortSha, branch, repo, message, author, authoredAt, files, sessionIds). Session.commitShas[] provides the forward back-reference. REST: POST /agentmemory/session/commit upserts links (merges sessionIds on re-link, preserves linkedAt); GET /agentmemory/commits/:sha and GET /agentmemory/commits round-trip. MCP: memory_commit_lookup and memory_commits tools. 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.ts and auto-detect Azure URL style:

    • OPENAI_BASE_URL=https://r.openai.azure.com/openai/deployments/<dep> → legacy URL pattern, api-version query param via OPENAI_API_VERSION (default 2024-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 as model.
    • 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 over cost = 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. maxDepth semantics preserved (still edge-count bound). The startNode path is excluded from returned paths so the dedicated score=1.0 fallback loop in searchByEntities fires 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.json Stop now runs stop.mjs followed by session-end.mjs. Codex doesn't ship a separate SessionEnd lifecycle 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.json and AGENTMEMORY_MCP_BLOCK (the template agentmemory connect <agent> writes into ~/.claude.json, ~/.cursor/mcp.json, etc.) now declare env: { 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's process.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 upstream install.iii.dev/console/main/install.sh script's jq predicate filters releases with startswith("v") while iii-hq/iii tags as iii/v0.12.0. The script bails with no stable iii release found on every fresh install. Switched the install command to curl ... | bash -s -- --next until upstream patches the script — the --next codepath uses a regex on -next. without the buggy startswith constraint, so it succeeds against the same tag set. Inline comment documents the upstream bug + revert condition.

Infrastructure

  • 91 test files, 1007 tests pass on chore(release): v0.9.19.
  • Bundles five PRs (#460, #462, #463, #495, #498) plus the inline iii-console installer workaround into one patch release.

v0.9.18 — hardening + DX wave

Choose a tag to compare

@rohitg00 rohitg00 released this 17 May 13:08
9061da5

[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::context payload (PR #458, closes #457, surfaced in discussion #381). Lessons were generated + stored but only retrievable via an explicit memory_lesson_recall MCP call — agents rarely thought to invoke it, so the loop was half-done. mem::context now reads KV.lessons alongside 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 Learned block competing fairly for the token budget. Block recency tracks the most-recent lastReinforcedAt || 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) required data: in img-src — a broader allowance than the viewer actually needed. The favicon now lives at /favicon.svg served by the viewer with Content-Type: image/svg+xml and Cache-Control: public, max-age=3600; build script copies the asset into dist/viewer/ alongside index.html. CSP reverts to bare img-src 'self'.

Changed

  • OPENAI_TIMEOUT_MS is now an alias of AGENTMEMORY_LLM_TIMEOUT_MS (PR #453, closes #446). v0.9.17 shipped OPENAI_TIMEOUT_MS as the OpenAI-scoped knob, then PR #379 introduced the global AGENTMEMORY_LLM_TIMEOUT_MS shared across all raw-fetch providers. The OpenAI provider now resolves them in precedence order: OPENAI_TIMEOUT_MSAGENTMEMORY_LLM_TIMEOUT_MS60_000ms default. v0.9.17 configs keep working unchanged; new configs should prefer the global. The provider's request also moved onto the shared fetchWithTimeout helper that owns AbortController + clearTimeout cleanup for every raw-fetch path (minimax, openrouter, gemini, embedding providers).

  • Strict integer parse for timeout env vars (PR #453, CodeRabbit catch). parsePositiveInt rejects values like "30ms", "1_000", "60s", "30abc", "-30", "0" via /^\d+$/ (after trim) instead of letting parseInt'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 fetch against localhost:3111 which made the test suite depend on no other agentmemory instance running on the host. New setLivezProbe() 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, optional context string 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.