Sensory retention — raw sensory memory content can now be summarized, tombstoned, or protected while durable recall text and dashboard totals remain intact.
Reflection surfaces — retention-aware reflection logs and a new dashboard reflection route make distilled memory state easier to inspect.
Universal installer — cloud, local, and self-hosted flows now cover OpenClaw, Claude, Codex, Factory Droid, generic MCP, and local backend targets with Codex hook support.
Provider-key separation — `GEMINI_API_KEY` and optional `OPENROUTER_API_KEY` are backend provider keys; `MEMORY_CRYSTAL_API_KEY` remains client bearer auth.
Local backend artifacts — installers default to release-versioned v0.8.2 backend packages and print the local Convex dashboard URL/admin key after setup.
Dashboard refresh — memory/message rendering, Organic pages, telemetry, admin, and the sharp flat visual hierarchy were updated together.
Backend-owned recall — legacy OpenClaw recall hooks now send query text to `/api/mcp/recall` so hosted/self-hosted backends own embedding and search.
Plugin version bump — OpenClaw plugin manifest/package metadata moved to v0.8.2 for this release.
v0.8.1 — 2026-04-27
Capture hygiene — leading recalled-context envelopes are stripped before user turns are written to STM across the OpenClaw plugin, shared hooks, web-served hook assets, and Convex backend.
Cleanup tooling — admins can dry-run or apply recalled-context STM cleanup with safe scope validation, malformed-row deletion, stale index reset, and exact-scope duplicate merge-delete handling.
Quota fix — MCP log writes skip wrapper-only synthetic user payloads before checking STM storage limits.
Dashboard readability — memory and message cards now render known pseudo-tag sections cleanly and keep a raw/full text disclosure for inspection.
Removed obsolete Morrow purge code — the unused Convex purge module and admin wrappers are gone.
v0.8.0 — 2026-04-25
Major local Convex developer backend — Docker-primary self-hosted Convex stack with pinned backend/dashboard images, local dashboard, health checks, reset/down/up lifecycle, and documented version pins.
One-switch local wiring — managed env overlays retarget the web app, MCP server, scripts, and OpenClaw plugin together while preserving production/cloud defaults.
Seeded local memory data — deterministic fixture memories, local-only seed functions, dry-run validation, and a gated vector-search canary make local recall testing repeatable.
Self-hosting prep — local auth JWT/JWKS provisioning, deployment-env stubs, dry-run email logging, and side-effect guards let contributors exercise actions/crons without sending real email or touching production credentials.
Docs — docs/LOCAL_DEV.md now covers local Convex setup, seeding, doctor checks, rollback to cloud defaults, troubleshooting, and version-pin updates.
Included 0.7.17 capture observability — capture-stall telemetry, /api/mcp/metric ingestion, doctor smoke callback dumps, and assistant-side duplicate suppression are part of this 0.8.0 release note set.
v0.7.18 — 2026-04-25
Capture telemetry hardening — `crystalTelemetry` rows now expire, cleanup removes old telemetry, and `/api/mcp/metric` validates metric names, payload size, and scope length before insert.
Organic contradiction flow — contradiction scans now wait for ensemble writes, recently resolved pairs suppress re-alerts for 30 days, and daily alert budget is checked before expensive LLM work.
MCP contradiction passthrough — stdio and hosted write tools preserve backend `contradiction` / `contradictionCheck` metadata through text and structured responses.
Brain dashboard loading now uses the full page skeleton, and the public mirror filter explicitly excludes the private `packages/` workspace.
Scoped deferral — this is a hardening release; the structural LTM extraction/content-hash backfill remains deferred to a follow-up release rather than being silently overclaimed.
v0.7.16 — 2026-04-21
Infrastructure — default Convex HTTP host updated to `https://convex.memorycrystal.ai`. OAuth consent, MCP endpoints, and the plugin's default `convexUrl` now use the Memory Crystal custom domain instead of the Convex-generated subdomain. Existing installs require no action — the old URL continues to work; plugins organically upgrade on next installer run.
Security — patched 10 Dependabot advisories (2 HIGH, 8 MEDIUM) via root npm overrides: vite 7.3.2, hono 4.12.14, @hono/node-server 1.19.13. Supply-chain hygiene only — call-graph trace confirmed no runtime exposure (vulnerable vite dev server, hono serveStatic/toSSG/ipRestriction/cookie helpers are not invoked by Memory Crystal). No backend redeploy required.
Convex trigger lookup now uses indexed trigger rows instead of broad memory scans, with resumable production backfill support.
Organic Pulse Engine intervals now clamp to one hour or longer; supported tiers are 1h, 2h, 4h, 8h, 12h, and 24h.
Each user can pause or resume their own Pulse Engine without affecting other tenants.
Maintenance read paths for duplicate checks, salience, consolidation, and decay now use targeted indexes and tighter budgets.
New crystal_update and crystal_supersede / crystal_supercede tools support in-place memory edits and atomic memory replacement with lineage.
v0.7.15 — April 19, 2026
Peer-first `guardChannel` fallback — recall, session KB listing, MCP filter-visible-memories, and both knowledge-base query paths no longer fall back to the management sentinel when a peer caller omits channel. Missing channel now fails-closed on KBs with a concrete peer scope instead of silently upgrading to management visibility.
`getKBMemoriesInternal` chunk-level peer scope filter — the internal KB-chunk reader now mirrors `runKnowledgeBaseQuery`'s admission rules so permissive shared KBs no longer leak cross-peer chunks on `by_knowledge_base` index reads.
Shared-mode agent writes now route to `scope:main-<agentId>` — two shared agents under the same scope stop bleeding captures into one bucket. Single-shared-agent installs stay on `scope:main` (backward compatible).
KB-scoped BM25 candidate pool — `runKnowledgeBaseQuery` forwards `knowledgeBaseId` into `searchMemoriesByText` so lexical candidates are filtered to the target KB instead of competing with the user's entire corpus.
MCP API-key paths forward `channel` filter — `crystal_why_did_we`, `crystal_who_owns`, `crystal_dependency_chain`, and `crystal_explain_connection` now respect the channel argument on the HTTP recall branch. Hosted MCP consumers previously saw unscoped, cross-channel results from these four tools.
Server-side error logs sanitized — `crystal_recall`, `crystal_trace`, and the HTTP listener run error messages through an inline redactor that scrubs Bearer tokens, `sk-*` keys, and query-string secrets before writing to stderr.
`stdio` is the default MCP mode — `CRYSTAL_MCP_MODE` defaults to stdio; operators who want the HTTP listener must set `CRYSTAL_MCP_MODE=http` explicitly.
Obsidian writer hardened — category is validated against the Convex enum and filenames include the memory id suffix to prevent same-millisecond collision.
Pressure-log Maps bounded — `pressureEventState` and `hostCompactState` evict via stale-first / oldest-first policy when they exceed 500 entries (2h staleness window). Closes a slow heap-growth path on long-lived gateway processes.
`/api/mcp-auth` proxy no longer forwards cookie / set-cookie — the proxy uses Authorization: Bearer only. Blanket cookie forwarding created a confused-deputy credential-relay risk.
Polar checkout `plan` param validated against an allowlist (free, pro, ultra, starter) before PRODUCT_IDS lookup. Invalid plans redirect without reflecting attacker-supplied value.
Login `redirectTo` guard — rejects any redirectTo that does not start with a single `/` (blocks `//`, `/\`, non-relative paths) and falls back to `/dashboard`.
`morrowPurge.scanCandidates` bounded — 10 unbounded `.collect()` calls now `.take(SCAN_ROW_CAP)` with `warn()` when the cap is hit.
`kbCounterReconcile` uses full composite-index predicate — `countKnowledgeBaseChunksPage` now scopes by `(knowledgeBaseId, userId, archived)` instead of scan-and-filter.
Small DX fixes — memory-formatter regex footgun removed, agent-scope policy Map memoized via WeakMap, `crystal_search_messages` forwards `agentId`, no-context Convex client cached in stdio mode.
v0.7.14 — April 16, 2026
One-key mixed agent scoping — OpenClaw/plugin installs can now combine peer-scoped agents and shared/open agents via `agentScopePolicies`, so coach-style agents stay private while dm-replies/content agents use shared `:main` memory under the same API key.
Installer/enabler now auto-upgrade to full context-engine mode when local SQLite is actually available, while preserving explicit user config if you already set `contextEngineMode`, `localStoreEnabled`, or `dbPath`.
Shared-main KB access from coach — training KBs moved to scopes like `morrow-team:main` with `peerScopePolicy: "permissive"` are now reachable through the MCP recall path even from peer-scoped coach sessions, while Client Notes stays private.
One-shot KB reassignment action — production-safe internal migration can retarget shared KBs and remove duplicate/dead KBs without manual per-KB patching.
Per-user isolation hardening for coach-style knowledge bases. If you use multi-tenant Telegram/Discord coaches, review our migration note.
New peerScopePolicy flag for explicit opt-in to cross-peer shared knowledge bases. Default is strict per-user isolation.
Observability metrics for KB peer-scoping enforcement — mc.metric.kb-peer-block and mc.metric.kb-chunk-drop track cross-peer access attempts and filtering events.
Kill-switch available via MC_KB_PEER_STRICT=false env var for rollback if needed without redeploy.
KB counter drift fixed — archiving a KB chunk now correctly decrements memoryCount and totalChars on the parent knowledge base. Historical drift on existing accounts repaired via the new kbCounterReconcile action.
KB vector recall scoped at the index — queries against a knowledge base now filter the vector search by knowledgeBaseId and archived=false up front, so small KBs aren't crowded out by the rest of the user's corpus.
crystal_trace reason wording — memories written via direct API (crystal_remember and similar) no longer falsely report as 'predates conversation tracking'; the handler distinguishes direct-API writes from genuinely pre-tracking memories.
v0.7.13 — April 15, 2026
Per-turn Convex recall now fires in reduced mode — assemble() previously gated recall on mode === 'full', which meant default installs (localStoreEnabled: false) silently dropped per-turn memory injection and answered from training-data inference instead. Only 'hook-only' mode skips recall now; 'reduced' and 'full' both fetch. Regression test locks the contract.
Hard assemble-path injection ceiling — the plugin caps per-turn injected context at 12k chars combined (system context + local messages), dropping oldest local messages first and then truncating the convex context. Prevents runaway prompt growth on hot long-lived sessions regardless of host compaction behavior.
Tier-aware per-memory cap with sentence-boundary slicing — recall content caps at 1200 chars for knowledge-base chunks (book/course/podcast excerpts) and 600 chars for auto-extracted notes, replacing the previous flat 350-char trim. Truncation prefers paragraph breaks and sentence terminators inside the cap window so KB definitions no longer end mid-sentence.
Transient-channel metadata — assemble() returns additive `contextUsage: { crystalInjectedChars, crystalInjectedMessageCount, ephemeral: true }` alongside the existing contract. Hosts that honor it can exclude Crystal injection from session persistence; no-op if the host ignores.
Rate-limited pressure telemetry — new one-line `crystal_pressure` log per session per minute when injection is trimmed or exceeds 60% of the ceiling. Attribution fields (`hostCompactInvoked`, `hostCompactTokensReclaimed`) let us tell whether the host compaction trigger fires at all.
Safer defaults for hot lanes — `localSummaryInjection` defaults to `false` (opt in per-agent when you want it) and `defaultRecallLimit` defaults to `4` instead of `8`. Existing installs that explicitly set either key keep their behavior.
KB ranking weight restored to 0.25 — the per-memory cap absorbs the byte-budget concern that prompted yesterday's temporary rollback, so the full 'half rap'-class ranking margin from 0.7.12 is back in place.
Installer + updater fixes — 0.7.13's two new plugin modules (pressure-log.js and memory-formatter.js) are now included in install.sh, the three parity-locked update.sh copies, and the /install-assets/plugin/ route allowlist. Earlier 0.7.13 installs crashed with 'Cannot find module ./pressure-log' until this landed; force-reinstall once to pick up the fix.
Post-install verification now checks the context-engine capability binding and the before_agent_start hook instead of grepping for tool names. OpenClaw's context-aware tool factory produces anonymous tool closures, so the old name-based verification always reported failure on 0.7.12+ installs even when the plugin was healthy.
Convex client bumped to ^1.35.1 across root, apps/web, and mcp-server workspaces.
v0.7.12 — April 14, 2026
OpenClaw tool-context compatibility — Memory Crystal now registers cloud-backed tools through OpenClaw’s context-aware tool factory so sessionKey and delivery context survive into tool execution even when the execute-time ctx is sparse. Stock OpenClaw main sessions like `agent:main:main` now retain enough identity for shared-lane recall without requiring a peer id or client-specific config override.
Shared-lane recall unblocked — read-path tools (crystal_recall, crystal_search_messages, crystal_what_do_i_know, crystal_why_did_we, crystal_debug_recall, crystal_preflight, crystal_recent, crystal_wake, memory_search) now accept session channels with `main`/`default`/`unknown` peer suffixes instead of hard-erroring on `Cannot resolve a safe channel scope for this session`. Captures remain strict so multi-peer content still cannot cross-pollinate a named scope.
Trusted shared-agent recall fallback — read-path recall/startup flows can reuse scoped :main/:default/:unknown channels for trusted agent:* sessions like agent:main:main without widening write-path inference.
Optional `channel` parameter added to the read-path tools so callers can pin a session-specific channel explicitly when the automatic resolver cannot infer one.
Backend persistence hardened — crystal-enable now treats explicit memory backend overrides as the deliberate migration lever, keeps persisted plugin config authoritative over generic CONVEX_URL drift, validates MCP routes before persisting, and rejects HTTP 404 targets by default.
Doctor backend provenance — crystal_doctor now reports backend source and classifies route validation failures more clearly.
Updater parity restored — plugin/update.sh, scripts/update.sh, and apps/web/public/update.sh now pull from the same public mirror source and stay byte-identical under test.
Dashboard Knowledge Base detail panel now renders an explicit `no longer available on the server` notice when the list row refers to a KB the backend doesn't return, instead of spinning in an infinite `Loading…` state.
Regression coverage expanded — tests now prove context-aware registration preserves shared-lane recall when execute-time ctx is empty.
v0.7.9 — April 13, 2026
Transport contract rewrite — legacy SSE MCP transport was removed; hosted Memory Crystal now standardizes on Streamable HTTP `/mcp`, while command-launched local MCP uses explicit `stdio` wiring
Knowledge Bases dashboard hardening — legacy or partially backfilled knowledge-base rows are now normalized server-side and rendered safely client-side, preventing the `toLocaleString` crash on the KB page
Auth and hosted parity fixes — API-key recall semantics were tightened, graph-style MCP tools no longer degrade API-key clients into hard errors, and MCP auth proxy header forwarding is more complete
Runtime/config hardening — doctor and generated OpenClaw/plugin configs now emit `stdio`/`http` intentionally instead of legacy `sse`, local live health checks are auth-aware, and hook-config dry runs redact secrets
Security and convergence fixes — device authorization now rate-limits brute-force attempts, impersonation targets are revalidated, purge/cleanup flows converge correctly, and email/template paths no longer leak placeholders or full-table scan admin logs
Installer verification pass — OpenClaw, Claude Code, Codex CLI, and Factory Droid install/uninstall flows were revalidated in temp-home simulations, including safe `--purge` behavior and Codex TOML repair
v0.7.8 — April 11, 2026
Claude Code, Codex, and Factory Droid hook integrations now install shared Memory Crystal auto-capture and auto-recall paths with browser-based device auth and scoped channel/session propagation
Peer-scoped coach memory reliability fixes — malformed scoped writes are normalized, same-peer message fallback is restored at session start, and cross-client leakage protections remain intact
Installer hardening — Codex/Claude/Droid hook installers now preserve unrelated hooks, repair invalid Codex hook layouts, and public hook assets are served directly from the web app
SessionStart noise reduction — startup hooks now emit a compact memory-active summary instead of dumping the full wake briefing and long-form instructions
Knowledge base imports now auto-chunk raw text while preserving explicit JSON chunk arrays and delimiter-based chunk boundaries
Gateway-safe local store mitigation — local SQLite compaction is now explicit via `localStoreEnabled`, defaults off for non-opted-in runtimes, and uses WAL/file-cache guardrails when enabled
HTTP auth and MCP test refresh — stale API-key mock paths were updated for the current auth contract so the full release audit suite runs green again
Docs/publishing workflow improvements — public docs pull now fails fast on dirty local docs, and main/stable/release alignment is ready for the `0.7.8` release lane
v0.7.6 — April 4, 2026
Gemini cost guardrails — cron throttling (~96% reduction in graph enrichment frequency), circuit breaker (3-failure abort), daily call cap via GEMINI_DAILY_CALL_CAP env var
Embedding error logging — embedText logs status code, model, and truncated error; batchEmbedTexts returns all-null on 429/5xx to prevent amplification
Peer-scoped recall isolation — replaced ad-hoc channel filter with isNonKnowledgeBaseMemoryVisibleInChannel for consistent behavior
Fix: bare-prefix memory leakage blocked — memories under agent: no longer leak into agent:user-1
Fix: agent-prefix memories now surface correctly in peer channel recalls
Fix: global memories excluded from peer-scoped recall results
Unified CRYSTAL_API_KEY env var — single API key for all Gemini access; GEMINI_API_KEY remains as fallback
Per-tier Gemini controls — Free=no managed Gemini, Pro=500 calls/day cap, Ultra=unlimited with BYOK support
v0.7.5 — April 3, 2026
Gemini-native embeddings — all embedding paths unified on Gemini; OpenAI embedding codepath hard-disabled
Recall Query Logging — every recall is logged to organicRecallLog for training signal; actual usage feeds back into trace generation and validation
Conversation-Reactive Pulses — plugin fires an Organic pulse every 5 user turns, triggering background inference on active conversations
Procedural Memory Auto-Extraction — Organic engine extracts skill-structured procedural memories with triggers, steps, pitfalls, and verification criteria
Skills Dashboard — new /organic/skills page with filterable skill cards showing structured metadata (triggers, steps, pitfalls)
Dashboard Sub-Navigation — Organic section split into Overview, Ideas, Traces, Ensembles, Skills, and Settings sub-routes with horizontal tab navigation
Content Security Scanner — regex-based scanning on all memory create and update paths blocks prompt injection, encoded payloads, and credential patterns
Admin Notification Emails — lifecycle emails for new signups, subscriptions, cancellations, and trial events via SendGrid
Idea Email Digests — hourly cron checks for pending ideas past configurable delay, sends digest with lease mechanism to prevent double-sends
MCP crystal_ideas + crystal_idea_action tools — list, star, dismiss, and mark ideas as read from any MCP client
Fix: trace dedup — duplicate predictions now boost existing trace confidence instead of creating new rows
Fix: prediction quality gate — blocks traces under 5 words plus 15-pattern generic blocklist
Fix: archiveMemoryById ownership check — cross-tenant access now properly blocked
Fix: Unicode normalization bypass in content scanner — NFKC normalization applied before scanning
Fix: title field scanning on create paths — content scanner now covers title in captureMemory, createMemory, and createMemoryInternal
Fix: permanent delete updates dashboard totals
Fix: NaN display guards with Number.isFinite() fallback in frontend
Fix: email opt-in by default — no emails sent until user explicitly enables in settings
v0.6.4 — March 30, 2026
Recall Confidence Scoring — recall results now include composite confidence scores with 7 ranking signal breakdown (vector, strength, freshness, salience, text match, continuity, access)
Confidence labels — memories tagged [HIGH CONFIDENCE] (>= 0.85) or [low confidence] (< 0.5) in both plugin injection and MCP server output
Mandatory Recall Acknowledgment — high-confidence memories trigger a directive requiring agents to reference them; prevents agents from ignoring recalled context
Intent-Triggered Deep Recall — plugin proactive recall now varies depth by classified intent: questions get 8 results, reflect gets 6, commands get 5 in decision mode, general gets 3
crystal_forget tool — archive or permanently delete memories via tool call; supports both soft archive (recoverable) and permanent deletion
MCP server parity — confidence labels, mandatory acknowledgment, and permanent delete ported to MCP server (v0.3.1) for Claude Code, Codex, and Factory Droid users
Expandable trace viewer — Organic dashboard traces now click-to-expand with full predicted query, context, source pattern, and timestamps
View All Predictions — lazy-loaded view showing up to 1,000 active prospective traces (raised from 200/500 cap)
Fix: pulse interval buttons no longer stuck disabled after first save
Fix: spend estimates re-price dynamically when model selection changes
Fix: sensory noise purge now scans all memories correctly with broadened pattern matching
Fix: full memory scan for telemetry stats with loading indicator
OpenRouter integration — organic model calls routed through OpenRouter for unified cost tracking across all providers
Standalone Knowledge Bases page with dedicated nav entry
v0.6.3 — March 29, 2026
Organic Memory Engine v2 — self-scheduling pulse engine replaces cron-based ticks for sub-minute intervals down to real-time (Live mode)
Multi-provider model selection — choose from 6 tiers across OpenAI, Google, and Anthropic: Potato (GPT-5 Nano), Low (Gemini 2.0 Flash-Lite), Medium (Gemini 2.5 Flash), High (GPT-4.1 Mini), Ultra (Gemini 3.1 Pro), Sonnet (Claude Sonnet 4.6)
Spend telemetry — estimated per-pulse cost in USD with daily/weekly/monthly projections on the Organic dashboard
Per-user pulse intervals — configurable from Live (0ms) through 60 minutes with clean tier selector UI
Knowledge Bases — first-class agent-scoped knowledge collections that are enrichable but never decay; replaces local training files with MC-backed queryable memory
Pulse terminology — renamed 'tick' to 'pulse' across UI and backend wrappers for cohesive product language
Inline help icons — tap-friendly metric explanations on all Organic dashboard cards (mobile-safe, no hover dependency)
Run history — recent pulse runs with duration, trace count, and cost visible on the dashboard
Open-sourced Organic Memory Engine, Knowledge Bases, crons, and schema — everything except the web app is now public
v0.6.2 — March 28, 2026
Organic Memory Engine — memory ensembles, contradiction detection, and resonance analysis run as background intelligence on your memory graph
Prospective traces — Memory Crystal now anticipates likely follow-up questions and pre-stages context before you ask
Parallel recall pipeline — organic traces serve alongside standard recall for richer, more anticipatory responses
Parallelized tick engine — ensemble clustering, contradiction scanning, and resonance detection now run concurrently per user
Safety caps on all background query paths — bounded collection prevents unbounded memory growth
Schema robustness — crystalSessions and crystalWakeState userId fields made optional for forward compatibility
joinedAt tracking on ensemble memberships — new/existing member classification now uses actual join time
v0.6.1 — March 27, 2026
Dynamic per-session channelScope override — agents can now switch channel scope at session start without changing plugin config
Per-call channel parameter on all MCP tools — pass channel on individual tool calls for fine-grained memory isolation
peekRateLimit utility and /api/mcp/rate-limit-check endpoint — check remaining rate limit budget before making calls
v0.6.0 — March 25, 2026
Lossless pre-compaction snapshots: full conversation is now saved before compaction runs — even if summarization loses nuance, the original is recoverable
crystal_trace tool: trace any memory back to the conversation snapshot that created it — drill from summary to raw messages
Prompt-aware context injection: local summaries are searched for relevance to the current prompt and injected before the LLM sees the context — surfaces buried but relevant memories
FTS5 with porter stemming: local summary search now uses proper full-text search with stemming, query sanitization, and bm25 ranking
Session-scoped search: local summary relevance search is now scoped to the active conversation — prevents cross-session context leakage
Snapshot validation: message arrays are validated (non-empty, valid roles, size cap), quota checks include incoming message count
Snapshot access control hardened: server-side userId enforcement, unauthorized access throws instead of returning null
Config flags wired: localSummaryInjection and localSummaryMaxTokens now actually control behavior (were declared but unused)
FTS backfill on upgrade: existing summaries are automatically indexed for search after plugin update
Fixed: install script 404 on openclaw-capture-plugin.js (removed in audit cleanup, reference not updated)
Test coverage: 85 plugin tests, 31 Convex tests (up from 54 and 14)
v0.5.4 — March 24, 2026
Recent message window: agents now get the last ~30 messages (7k char budget) injected chronologically on every turn, not just semantic matches — solves post-compaction amnesia for in-flight work
Media capture: images, audio, video, and PDFs are now automatically captured alongside conversation turns — plugin detects attachments and uploads them to cloud storage fire-and-forget
Dashboard docs rewritten: 7 tool references, install guide for OpenClaw/Claude Code/Codex, MCP config examples, and troubleshooting section
Email verification now sends a 6-digit OTP instead of a long random token — fixes spam filter hits and gives users a clean code to type
Install command generator — paste your API key on the install page to get a ready-to-run personalized command for your platform
API key lastUsedAt tracking — dashboard now shows when each key was last used
Context engine ingest hook never fired — renamed ingestBatch to match OpenClaw's actual API. This is the root cause fix for context not accumulating in the local store.
tokenBudget field name — assemble and afterTurn now read payload.tokenBudget instead of payload.budget to match what OpenClaw actually sends.
Leaf compaction threshold lowered from 20,000 to 4,000 tokens — sessions were overflowing the context window before compaction ever triggered. Now fires after ~15-20 exchanges.
assemble tail-replacement — when local summaries exist, assemble now replaces older raw messages with summaries and keeps only the last 6 messages raw. Previously summaries were prepended but raw messages still all went through, so context size never actually dropped.
JSON schema fix — removed invalid required: false from channelScope field in openclaw.plugin.json (was crashing gateway config validator on update).
v0.4.1 — March 18, 2026
Install script updated to fetch all 14 v0.4.0 files including subdirectory structure (store/, compaction/, tools/, utils/) — was broken since v0.4.0, only fetched 7 flat files from the old layout.
Update script same fix, plus compaction/package.json added to file list.
Install-assets route renamed from [file] to [...file] catch-all to serve subdirectory paths; fixed path resolution from process.cwd() to import.meta.url anchor.
Non-ASCII box-drawing characters stripped from install.sh success banner.
channelScope config — set "channelScope": "myapp" (or any string) to namespace all captures and recalls as {channelScope}:{peerId}. Enables multi-tenant and per-client memory isolation.
migrate.sh --ingest-dir — bulk ingest arbitrary directories: --ingest-dir DIR (repeatable), --store, --category, --tags, --channel flags. When set, skips OpenClaw memory scan and processes specified paths only.
Dependencies: better-sqlite3 npm install step added to install.sh and update.sh with graceful fallback.
v0.2.5 — March 14, 2026
Streamable HTTP MCP server — connect Claude Code, Codex, Factory, and any MCP client via https://api.memorycrystal.ai/mcp
Cross-platform install: tabbed setup commands for OpenClaw, Claude Code, Codex, and Factory with platform badges
Browser-based device auth — installer opens your browser, you log in, API key is provisioned automatically