- Native Hermes Agent memory provider — Cortex can now be used as a first-class Hermes
memory.provider(a self-hosted alternative to Mem0) with automatic pre-turn recall and post-turn ingestion, instead of only the manual MCP path. A zero-dependency reference implementation targeting Hermes'agent/memory_provider.pyABC ships inintegrations/hermes/cortex, exposingcortex_search/cortex_remember/cortex_forgettools andhermes memory setupconfig. (requested by @Yat-mo, #23)
- sqlite-vec dimension change now actually rebuilds the vec0 table — Switching embedding models to a different dimension (e.g. default 1536 → bge-m3 1024) silently left the old
FLOAT[1536]virtual table in place, so every subsequent upsert/search failed with a dimension mismatch and semantic recall fell back to plain text. The dimension check read a non-existentdimensionskey from vec0's_infoshadow table and never matched, so the rebuild never ran — this is why a manual database wipe was the only workaround. The check now reads the declared dimension straight from the table'sCREATEstatement insqlite_master. Completes the partial v0.10.4 fix. (reported by @Miantiao1231, #21) - OpenClaw plugin install no longer blocked by the security scanner —
@cortexmem/openclawtripped OpenClaw's "environment variable access combined with network send — possible credential harvesting" install scanner because the bundled plugin readprocess.env.*(includingCORTEX_AUTH_TOKEN) in the same file as itsfetchcalls. The plugin now sources all configuration from OpenClaw's sanctionedpluginConfigchannel and reads no environment variables, so the heuristic no longer fires. NewauthTokenandpairingCodeconfig keys replace the formerCORTEX_AUTH_TOKEN/CORTEX_PAIRING_CODEenv vars. (reported by @southxs, #22)
- @cortexmem/openclaw@0.6.7 published (security-scanner fix; config-only, no env var reads)
- OpenClaw plugin ID mismatch fixed —
@cortexmem/openclawnow correctly declares plugin id"openclaw", resolving theplugin id mismatch (manifest uses "cortex-bridge", entry hints "openclaw")error on install (reported by @rollingshmily, #17) - Reindex now rebuilds vec0 table on dimension change — Clicking "重建向量索引" after switching embedding models (e.g. voyage-3.5 → text-embedding-3-large) no longer fails with
Expected 1536 dimensions but received 1024. The reindex endpoint now reinitializes the vector backend before re-embedding (reported by @rollingshmily, #17) - Embedding hot-reload reinitializes vector backend — Saving a new embedding config via Dashboard or
PATCH /api/v1/confignow immediately rebuilds the vec0 table if dimensions changed, no restart needed - Neo4j relation deduplication — Repeated extraction of the same
(subject, predicate, object, agent_id)tuple now updates a single edge instead of creating duplicate edges (contributed by @xieyuanqing, #16) - Correction cascade for state memories —
correctionmemories now correctly supersede relatedtodo,decision,goal,project_statememories; search coverage expanded to includetodo,constraint,policycategories (contributed by @xieyuanqing, #16)
- @cortexmem/openclaw@0.6.5 published (plugin id fix)
-
pairing_code: Agent namespace isolation — Solves multi-instance memory mixing. When multiple OpenClaw instances, MCP clients, or API callers share the same agent_id (e.g. "main"), memories would previously bleed into each other. With pairing_code, each client gets its own isolated namespace.
How it works: Optional
pairing_codefield in all recall/ingest requests. Memories stored/retrieved by composite key (agent_id + pairing_code). No pairing_code = backward-compatible unchanged behavior.Configuration:
- OpenClaw plugin: set
CORTEX_PAIRING_CODE=<unique-code>env var - MCP / API: pass
"pairing_code": "<code>"in request body
Database: migration 014 adds
pairing_codecolumn + composite index. - OpenClaw plugin: set
- Recall timeout: Configurable total recall timeout (
recallTimeoutMs, default 5000ms) — if expansion + search + rerank exceeds budget, returns partial results instead of blocking - Dashboard recall timeout setting: New field in Gate section with variant-count recommendations (1→3s, 3→5s, 6→8s, 10+→12s)
- Reranker instant failover: Auth errors (401/403) skip immediately instead of waiting for timeout
- Parallel variant embedding: Query expansion variants embedded in a single batch API call instead of sequential
- Budget-aware timeouts: Reranker and expansion respect remaining recall budget
- Timer leak: Recall timeout timer properly cleaned up in try/finally
- Reranker/expansion honor recallTimeoutMs: No longer use hardcoded timeouts that can overshoot the total budget
- Reindex auto-rebuilds vec table on dimension change: When embedding dimensions change (e.g. switching from
text-embedding-3-small1536d totext-embedding-3-large3072d), the vec0 virtual table is now automatically dropped and recreated with the correct dimensions on startup - Reindex reports upsert errors: Vector upsert failures during reindex are now caught and counted in the
errorsfield instead of being silently swallowed
- Memory Self-Improvement System: Feedback-driven importance auto-adjustment
- Feedback API:
POST /api/v1/memories/:id/feedback(+1/0/-1 scoring) - Implicit feedback via recall usage tracking (
POST /api/v1/recall/:recallId/usage) - Lifecycle Phase 6c: automatic importance adjustment with stability safeguards
- Configurable: window size, min feedbacks, max delta, implicit/explicit weights
- Full audit trail in
importance_adjustmentstable for rollback
- Feedback API:
- Dashboard UX/UI Redesign: Modern Linear/Vercel-inspired aesthetic
- New CSS design system with layered backgrounds, 4-level text hierarchy
- Redesigned sidebar with section dividers and refined navigation
- Stats page with improved charts and trend indicators
- Memory browser with category-colored cards and inline feedback buttons
- Settings page with self-improvement configuration panel
- All pages polished: Agents, ExtractionLogs, SystemLogs, LifecycleMonitor, SearchDebug
- Rate limiting on feedback API endpoints
- Input validation: maxLength on comments, maxItems on memory_ids arrays
- Recall session map size cap (10K) with TTL cleanup
- Self-improvement settings section in Dashboard
- i18n: 24 new strings in both English and Chinese
- Focus-visible CSS styles for keyboard accessibility
- Timing leak in safeCompare: Pad both strings to equal length before constant-time comparison, preventing length-based timing attacks.
- Deep merge for env overrides in loadConfig: Use
deepMergeinstead of shallow spread so env var overrides (e.g.CORTEX_DB_PATH) don't clobber nested file config. - PLUGIN_VERSION: Corrected cortex-bridge version from 0.5.1 to 0.6.1.
- README accuracy: Fixed Node.js requirement (≥ 20), removed speculative model names, added
cortex_relationsto MCP tools table, fixedpnpm start→pnpm dev. - CHANGELOG: Added missing v0.9.3 entry and dates.
- LICENSE: Added MIT license file.
- Multi-agent tool isolation: Bridge tools (
cortex_recall,cortex_remember,cortex_ingest) now accept an optionalagent_idparameter, enabling per-request agent switching in multi-agent orchestrators. - Dynamic agent ID in MCP client:
CORTEX_AGENT_IDenv var is re-read per request, supporting dynamic agent switching without restart. - Per-session agent resolution in bridge:
ctx.agentIdis resolved per session and cached, preventing race conditions in concurrent multi-agent scenarios.
- Selective engine rebuild on config change:
reloadProvidersnow only reconstructs engines whose configuration actually changed, instead of rebuilding all engines on any config update. - Settings key preservation: Switching providers in the dashboard Settings no longer loses previously configured API keys on the first switch; existing keys are tracked from initial config load.
- Fixed version display endpoint to return correct version string.
- Bump cortex-bridge to v0.6.1 for npm publish.
- Use
config.storage.dbPathinstead of non-existentconfig.dataDirinbackupDb().
- Bump
@cortexmem/mcpto 0.1.2 with auth-token support.
- Broaden fast channel coverage for diverse users.
- Comprehensive fast channel and prompt audit.