- Collapsible legend: click "Legend" to expand/collapse (caret rotates,
pointer-events re-enabled now that the legend has something clickable).
- "Isolate connected component" detail-panel action: a pure
_componentNodeIds() BFS (undirected, no DOM dependency) feeds into
_applyFilters() alongside the existing category filter, with a toggle
button and a banner reporting how many memories are shown. Clears on
background click and on every graph reload.
- Keyboard shortcuts: `f` focuses the search box; arrow keys cycle
selection through the currently visible (filter-respecting) nodes and
re-center the camera. Both guarded against firing while typing or
while the modal is minimized.
- MODULE_SUMMARY.md: documented the memoryGraph.js module.
Cytoscape.js-based interactive graph over the memory system's
derived edges (similarity/session/manual), following the repo's
no-bundler vendoring and lazy-modal conventions.
- static/js/memoryGraph.js: modal shell, lazy Cytoscape load, fetch +
client-side filter/search, node/edge styling with dark/light theme
support via CSS custom properties, node selection + neighborhood
highlighting, link-mode manual relationship editing, detail panel
(pin/edit/delete/link management), demo-data fallback.
- static/lib/cytoscape.min.js: vendored 3.34.0 (MIT) via npm pack.
- static/index.html, static/app.js, static/js/init.js: "Memory Graph"
nav item (mirrors the Calendar entry), privilege gating
(can_manage_memory), Customize-UI visibility entry, /memory-graph
deep link.
- static/style.css: .memory-graph-* block, appended only.
Visually verified end-to-end against a real seeded dataset (render,
node click + neighborhood highlight, detail panel, inline edit,
search, category filters, similarity slider, link-mode create,
theme switch) — fixed two bugs found in that pass along the way:
the detail panel's `hidden` class was never removed on selection,
and search left stale selection-highlight opacity masking matches.