[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.