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.