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.