diff --git a/packages/memory-graph/README.md b/packages/memory-graph/README.md index 9d240d4b..18f8fefc 100644 --- a/packages/memory-graph/README.md +++ b/packages/memory-graph/README.md @@ -66,6 +66,7 @@ function App() { | `error` | `Error \| null` | Error to display | | `loadMoreDocuments` | `() => Promise` | Function to load more data | | `highlightDocumentIds` | `string[]` | IDs of documents to highlight | +| `onNodeSelect` | `(nodeId: string \| null) => void` | Called when the selected node changes (click, keyboard, slideshow, or cleared) | Console mode uses the supplied theme colors for its surface, 16px dot grid, document icons, and node fills and strokes. Consumer mode keeps its transparent surface and cluster colors. diff --git a/packages/memory-graph/src/components/memory-graph.tsx b/packages/memory-graph/src/components/memory-graph.tsx index df8e7936..276d6066 100644 --- a/packages/memory-graph/src/components/memory-graph.tsx +++ b/packages/memory-graph/src/components/memory-graph.tsx @@ -73,6 +73,7 @@ export function MemoryGraph({ colors: colorOverrides, totalCount, onOpenDocument: externalOnOpenDocument, + onNodeSelect, labels: labelOverrides, layering, appearance, @@ -97,6 +98,15 @@ export function MemoryGraph({ // React state only for things that affect DOM const [hoveredNode, setHoveredNode] = useState(null) const [selectedNode, setSelectedNode] = useState(null) + const onNodeSelectRef = useRef(onNodeSelect) + onNodeSelectRef.current = onNodeSelect + const lastSelectedRef = useRef(selectedNode) + // Compares against the last value so mount and StrictMode re-runs do not emit. + useEffect(() => { + if (lastSelectedRef.current === selectedNode) return + lastSelectedRef.current = selectedNode + onNodeSelectRef.current?.(selectedNode) + }, [selectedNode]) const [zoomDisplay, setZoomDisplay] = useState(50) // Monotonic counter that increments on any viewport change (pan or zoom) // Used as a dependency proxy to recalculate popover positions diff --git a/packages/memory-graph/src/types.ts b/packages/memory-graph/src/types.ts index 6a53f78c..e83f1398 100644 --- a/packages/memory-graph/src/types.ts +++ b/packages/memory-graph/src/types.ts @@ -226,6 +226,8 @@ export interface MemoryGraphProps { totalCount?: number /** Callback when user wants to view full document content */ onOpenDocument?: (documentId: string) => void + /** Called when the selected node changes; null when cleared */ + onNodeSelect?: (nodeId: string | null) => void /** Custom user-facing labels (partial) - merged with defaults */ labels?: MemoryGraphLabels /** Overlay layering controls */