- author: change from string to object {name, url}
- hooks: remove field (auto-loaded by convention from hooks/hooks.json)
- skills: change from directory string to explicit file path array
- Update zod from ^3.23.0 to ^4.0.0 (claude-agent-sdk peer dep conflict)
- Mount iii-config.yaml in docker-compose.yml (missing /app/config.yaml)
- Change host binding from 127.0.0.1 to 0.0.0.0 for Docker compatibility
- Switch npm start from index.mjs to cli.mjs (auto-starts iii-engine)
- Fix CLI health check to detect engine via any HTTP response, not just worker route
- Handle EADDRINUSE on viewer port gracefully instead of crashing
- Fix README step numbering and version in health example
Actions tab:
- List view with status badges, priority, tags
- Status filter dropdown (pending/active/done/blocked/cancelled)
- Search across title, description, tags
- Frontier actions highlighted with lightning bolt
- Parallel fetch of actions + frontier data
Crystals tab:
- Card layout with narrative, key outcomes, lessons
- Files affected and source action IDs
- Reuses dashboard crystals data to avoid duplicate fetch
- Search across narrative, outcomes, lessons
Review fixes applied:
- Declared frontier: [] in state init
- Sort on copy (items.slice().sort) not in-place
- Escaped tags with .map(esc)
- Guarded c.keyOutcomes/c.lessons/c.narrative with || [] in search
- Reuse dashboard crystals to avoid duplicate API call
614 tests passing
marketplace.json was missing required top-level name and owner fields,
and plugins[].source was incorrectly named path. Fixes plugin install
validation error in Claude Code.
- Add two-paragraph technical pitch above the fold with 3-line quick start
- Update tool count 37→38 (memory_verify), function count 50→52, test count 573
- Add memory_verify to MCP tools table, mem::verify and mem::cascade-update to functions table
- Add citation provenance and cascading staleness to capabilities table
- Add cross-agent sync and memory trust to comparison table
- Update API endpoint count 93→95, version 0.6.0→0.6.1
* feat: v0.6.1 — citations, cascading updates, expanded mesh (#53#56#59)
Add JIT verification with citation chains, self-organizing memory via
cascading staleness propagation, and expand mesh sync to 7 scopes
(semantic, procedural, relations, graph nodes/edges).
- mem::verify traces memory/observation provenance back to source
- mem::cascade-update flags stale graph items and sibling memories
- Mesh default scopes expanded from 2 to 7 with project-based filtering
- Memory.sourceObservationIds, CompressedObservation.confidence fields
- GraphNode.stale, GraphEdge.stale for staleness tracking
- MeshPeer.syncFilter for project-scoped action sync
- 573 tests passing across 49 files
* fix: address code review — stale filtering, LWW clock, validation, scoping
- Filter stale nodes/edges in graph-retrieval.ts and graph.ts traversals
- Use updatedAt (not createdAt) as LWW clock for graph node mesh sync
- Set updatedAt in cascade.ts when flagging nodes as stale
- Skip non-project scopes (semantic, procedural, relations, graph) when
syncFilter.project is set to prevent leaking unscoped data
- Validate sourceObservationIds as array of strings in remember.ts
- Deduplicate observation IDs in consolidate.ts sourceObservationIds
- mesh-export endpoint uses updatedAt for graph nodes, accepts project param
- Extract shared test helpers into test/helpers/mocks.ts
- Assert memory_verify tool name in mcp-standalone.test.ts
Performance:
- auto-forget.ts (#29): concept-bucketed contradiction detection with
pre-tokenized cache, O(n * avg_bucket) instead of O(n^2)
- consolidate.ts (#28): cap LLM calls at 10, process largest concept
groups first
- vector-index.ts (#30): bounded min-heap search replaces full sort,
early skip for low-scoring entries
Scheduling (#36):
- index.ts: setInterval auto-forget (1h default) and consolidation
(2h, opt-in via CONSOLIDATION_ENABLED=true)
- Configurable via AUTO_FORGET_INTERVAL_MS, CONSOLIDATION_INTERVAL_MS
- Timers use .unref() to not prevent process exit
Memory TTL (#63):
- remember.ts: optional ttlDays parameter auto-sets forgetAfter
Plugin (#75):
- plugin.json: version 0.2.0 -> 0.6.0
Closes#28#29#30#36#63#75
- Add Real-Time Viewer section with feature list
- Update stats: 87 source files, ~11,300 LOC, 232KB bundled
- Add viewer port info to Quick Start and Configuration
- Add Viewer link to nav bar
- Viewer auth: use timing-safe HMAC comparison instead of string equality
- Viewer HTML: add Content-Security-Policy header
- Viewer POST/DELETE: validate Content-Type is application/json (415 on mismatch)
- Evolve: supersede old memory before saving new to prevent dual-latest on partial failure
- Timing-safe HMAC auth in api.ts, mcp/server.ts (eliminates length leak)
- Keyed mutexes for race conditions in observe, remember, relations
- Write ordering: supersede before save to prevent dual-latest
- Single VERSION constant replacing 11 hardcoded strings
- Input validation: governance filter guard, team itemType, maxObs, commitHash regex
- Future-proof import version validation with VERSION in supported set
- Circuit breaker configurable thresholds with positiveFinite validation
- Health monitor interval.unref(), telemetry dead exports removed
- 3 new secret patterns (npm_, glpat-, dop_v1_), shared CSP constant
* feat: viewer UI redesign with real-time streaming and newsprint design
Redesigned the agentmemory viewer with a newsprint-inspired design system
and added real-time live updates via iii-engine StreamModule.
Viewer UI:
- Newsprint design with Playfair Display / Lora / Inter typography
- Dashboard with semantic memory, procedural memory, consolidation status
- Knowledge graph with curved edges, node shapes, legend, search, tooltips
- Visual vertical timeline with alternating cards and type filter chips
- Activity tab with GitHub-style heatmap, type breakdown, activity feed
- Profile, Sessions, Audit, Memories tabs
Real-time streaming:
- Fixed stream event propagation (engine uses exact group_id matching)
- Added viewer broadcast group for cross-session live updates
- Switched from blocking trigger to fire-and-forget triggerVoid
- Viewer subscribes to 'viewer' group, handles create/update events
New files:
- iii-config.yaml: engine config with StreamModule, PubSub, Otel
- src/viewer/server.ts: standalone viewer HTTP server on port 3113
API additions:
- GET /agentmemory/memories endpoint with ?latest=true filter
- Viewer file resolution with multiple candidate paths
* fix: address review findings — CORS, 404 status, validation, cleanup
- Restrict CORS allowed_origins to local dev origins instead of wildcard
- Return 404 instead of 200 when viewer HTML file is not found
- Add /agentmemory/viewer path to standalone viewer server routing
- Validate sessionId in session/end handler before KV operations
- Clear stale graph nodes/edges before writing rebuilt data
- Capture viewer server and close gracefully on shutdown
* fix: dynamic CORS origin validation and memNode property accumulation
Replace static CORS wildcard with dynamic corsHeaders(req) that validates
the request Origin against an allowlist. Pass req to all json() call sites.
Change memNode.properties from scalar memoryId/memoryType to array-based
memoryIds/memoryTypes to prevent overwrite when multiple memories map to
the same graph node.
- Fix main/bin/start to use .mjs extension (tsdown outputs ESM)
- Remove duplicate shebang banner from standalone build config
- Update integration test: health status "healthy" (v0.4.0), viewer HTML check
- Add POST body to pre-compact hook for claude-bridge sync
* feat: agentmemory v0.4.0 — the memory layer for all AI coding agents
7 new features: Claude Code memory bridge, standalone cross-agent MCP server,
knowledge graph with entity extraction, 4-tier memory consolidation pipeline,
team/shared memory, memory governance with audit trail, git-versioned snapshots.
33 functions, 18 MCP tools, 6 MCP resources, 3 MCP prompts, 49 REST endpoints,
21 KV scopes, 216 tests. All features opt-in via env vars.
* fix: address 28 CodeRabbit findings across v0.4.0 codebase
Critical: Fix bin path mismatch (dist/mcp-standalone.mjs -> dist/standalone.mjs)
Bugs: Fix procedural decay, parseFloat||0.5 for zero values, snapshot restore
missing graphNodes/observations, git catch too broad, N+1 graph query, BFS
duplicate edges, array mutation in audit sort, date validation
Improvements: Lazy readline in transport, JSON-RPC validation, persist error
handling, ID collision prevention, defensive null coalescing for concepts/files,
Windows backslash support in config, direction required for bridge sync tool,
try-catch for audit/governance MCP, team profile fallback teamId, POST body for
bridge sync hook, observations validation for graph-extract endpoint, await in test
* feat: agentmemory v0.4.0 — MCP resources, prompts, enrichment, confidence
Add 4 MCP resources (status, project profile, recent sessions, latest memories),
3 MCP prompts (recall_context, session_handoff, detect_patterns), confidence-scored
memory relations, and a unified enrich endpoint that aggregates file context,
relevant observations, and past bug memories for PreToolUse hook injection.
- Add confidence field to MemoryRelation with auto-scoring from co-occurrence,
recency, and relation type
- Add mem::enrich function aggregating 3 sources with resilient .catch() fallbacks
- Add POST /agentmemory/enrich REST endpoint
- Switch PreToolUse hook from file-context to enrich endpoint with search term extraction
- Add minConfidence filter and confidence-desc sorting to mem::get-related
- 27 new tests (171 total), all passing
* fix: address review findings — input validation, XML escaping, confidence scoring
- enrich.ts: Sort bug memories by recency before slicing top 3; add escapeXml()
for narratives and bug content injected into XML tags
- relations.ts: Use filter+max instead of find() for matchingRelation to pick
highest confidence when multiple edges exist; normalize minConfidence with
Number.isFinite + clamp to [0,1]
- mcp/server.ts: Guard decodeURIComponent with try/catch returning 400 on
malformed percent-encoding; use typeof checks for prompt args instead of
truthy checks; normalize minConfidence/maxHops at MCP layer
- api.ts: Validate files[] and terms[] element types are strings before
calling mem::enrich
- Tests: Add malformed URI and non-string prompt arg test cases (173 total)
* docs: rewrite README for v0.3.0
- Add "Why agentmemory" section explaining what it provides and comparison table
- Add "Supported Agents" section with native hooks, MCP, and REST API paths
- Add integration decision matrix for choosing the right approach
- Document hybrid search, embedding providers, and progressive disclosure
- Document memory evolution, versioning, relationships, and auto-forget
- Document project profiles, timeline, export/import
- Update all stats (21 functions, 10 MCP tools, 28 endpoints, 144 tests)
- Update data model with new KV scopes (relations, profiles, embeddings, bm25)
- Update config section with embedding, fallback, and search weight env vars
* docs: add banner image to README
* docs: fix banner crop and size
Remove cream strip at bottom, cap width to 720px in README
* docs: include REST API in supported agents intro
Consistent wording in both the intro line and REST section
- remember: persist new memory before demoting old (write ordering)
- remember: capture superseded version during scan (no re-search)
- api: validate query/expandIds on smart-search endpoint (return 400)
- index: rebuild when vector index is empty (not just BM25)
- index: log persistence save failures on shutdown
- config: clamp embedding weights to [0, 1]
- config: validate fallback provider names against known set
- hybrid-search: parallelize KV fetches with Promise.all
- Extract shared circuit breaker call() helper in ResilientProvider
- Use COUNTER_NAMES/HISTOGRAM_NAMES arrays with shared noop objects in telemetry
- Add MS_PER_DAY constant to replace repeated 24*60*60*1000 in eviction
- metrics-store: track quality score calls separately to avoid diluted averages
- metrics-store: getAll() merges KV + cache for complete data
- summarize: reject and don't persist summaries that fail validation
- dedup: unref cleanup timer so it doesn't block process shutdown
- health/monitor: move connectionState into closure (no module-level mutation)
- health/monitor: compute real CPU percent via delta sampling
- health/thresholds: use heapUsed/heapTotal instead of rss/heapTotal
- providers/index: throw clear error on missing API keys instead of non-null assert
- remember: handle empty observationIds array explicitly in forget flow
- triggers/api: normalize dryRun to strict boolean
New hooks (7):
- PreToolUse: inject file history before edits (Edit/Write/Read/Glob/Grep)
- PostToolUseFailure: capture error patterns for learning
- PreCompact: preserve memory context through compaction
- SubagentStart/SubagentStop: track multi-agent workflows
- Notification: capture permission prompts (tool preferences)
- TaskCompleted: track team task completions
New functions (4):
- mem::file-context: file-centric memory index for PreToolUse
- mem::consolidate: merge observations into long-term memories via LLM
- mem::patterns + mem::generate-rules: detect co-change patterns and recurring errors
- mem::remember + mem::forget: explicit save/delete for long-term memory
MCP server (2 endpoints):
- GET /agentmemory/mcp/tools: list 5 MCP tools (recall, save, file_history, patterns, sessions)
- POST /agentmemory/mcp/call: dispatch tool calls to iii functions
Skills (4):
- /recall [query]: search past observations
- /remember [insight]: save to long-term memory
- /session-history: show past session timeline
- /forget [target]: delete specific memory data
New API endpoints (7):
- POST /agentmemory/file-context
- POST /agentmemory/remember
- POST /agentmemory/forget
- POST /agentmemory/consolidate
- POST /agentmemory/patterns
- POST /agentmemory/generate-rules
- GET/POST /agentmemory/mcp/*
Updated: types (7 new HookTypes, 3 new ObservationTypes), version 0.2.0