aboutsummaryrefslogtreecommitdiff
path: root/packages/memory-graph/src/hooks
diff options
context:
space:
mode:
authorDhravya Shah <[email protected]>2025-12-23 15:42:57 -0800
committerDhravya Shah <[email protected]>2025-12-23 15:42:57 -0800
commitc2a5cce02ca2c1dfcf2945aeb80f1885b0ad6e91 (patch)
treeadad08e6880491c5b88f13e26fcd26be364aeba4 /packages/memory-graph/src/hooks
parentadded a zero check before calculating maxDps, removed height and width from c... (diff)
downloadsupermemory-vrupak/main.tar.xz
supermemory-vrupak/main.zip
fix: show all memory relationsvrupak/main
Diffstat (limited to 'packages/memory-graph/src/hooks')
-rw-r--r--packages/memory-graph/src/hooks/use-graph-data.ts124
1 files changed, 78 insertions, 46 deletions
diff --git a/packages/memory-graph/src/hooks/use-graph-data.ts b/packages/memory-graph/src/hooks/use-graph-data.ts
index 4281742f..a33ddfe2 100644
--- a/packages/memory-graph/src/hooks/use-graph-data.ts
+++ b/packages/memory-graph/src/hooks/use-graph-data.ts
@@ -19,7 +19,16 @@ import type {
export function useGraphData(
data: DocumentsResponse | null,
selectedSpace: string,
- nodePositions: Map<string, { x: number; y: number; parentDocId?: string; offsetX?: number; offsetY?: number }>,
+ nodePositions: Map<
+ string,
+ {
+ x: number
+ y: number
+ parentDocId?: string
+ offsetX?: number
+ offsetY?: number
+ }
+ >,
draggingNodeId: string | null,
memoryLimit?: number,
maxNodes?: number,
@@ -60,35 +69,34 @@ export function useGraphData(
})
// Filter by space and prepare documents
- let processedDocs = sortedDocs
- .map((doc) => {
- let memories =
- selectedSpace === "all"
- ? doc.memoryEntries
- : doc.memoryEntries.filter(
- (memory) =>
- (memory.spaceContainerTag ?? memory.spaceId ?? "default") ===
- selectedSpace,
- )
-
- // Sort memories by relevance score (if available) or recency
- memories = memories.sort((a, b) => {
- // Prioritize sourceRelevanceScore if available
- if (a.sourceRelevanceScore != null && b.sourceRelevanceScore != null) {
- return b.sourceRelevanceScore - a.sourceRelevanceScore // Higher score first
- }
- // Fall back to most recent
- const dateA = new Date(a.updatedAt || a.createdAt).getTime()
- const dateB = new Date(b.updatedAt || b.createdAt).getTime()
- return dateB - dateA // Most recent first
- })
-
- return {
- ...doc,
- memoryEntries: memories,
+ let processedDocs = sortedDocs.map((doc) => {
+ let memories =
+ selectedSpace === "all"
+ ? doc.memoryEntries
+ : doc.memoryEntries.filter(
+ (memory) =>
+ (memory.spaceContainerTag ?? memory.spaceId ?? "default") ===
+ selectedSpace,
+ )
+
+ // Sort memories by relevance score (if available) or recency
+ memories = memories.sort((a, b) => {
+ // Prioritize sourceRelevanceScore if available
+ if (a.sourceRelevanceScore != null && b.sourceRelevanceScore != null) {
+ return b.sourceRelevanceScore - a.sourceRelevanceScore // Higher score first
}
+ // Fall back to most recent
+ const dateA = new Date(a.updatedAt || a.createdAt).getTime()
+ const dateB = new Date(b.updatedAt || b.createdAt).getTime()
+ return dateB - dateA // Most recent first
})
+ return {
+ ...doc,
+ memoryEntries: memories,
+ }
+ })
+
// Apply maxNodes limit using Option B (dynamic cap per document)
if (maxNodes && maxNodes > 0) {
const totalDocs = processedDocs.length
@@ -112,37 +120,57 @@ export function useGraphData(
// If we still have budget left, distribute remaining nodes to first docs
let remainingBudget = maxNodes - totalNodes
if (remainingBudget > 0) {
- for (let i = 0; i < processedDocs.length && remainingBudget > 0; i++) {
+ for (
+ let i = 0;
+ i < processedDocs.length && remainingBudget > 0;
+ i++
+ ) {
const doc = processedDocs[i]
if (!doc) continue
- const originalDoc = sortedDocs.find(d => d.id === doc.id)
+ const originalDoc = sortedDocs.find((d) => d.id === doc.id)
if (!originalDoc) continue
const currentMemCount = doc.memoryEntries.length
const originalMemCount = originalDoc.memoryEntries.filter(
- m => selectedSpace === "all" ||
- (m.spaceContainerTag ?? m.spaceId ?? "default") === selectedSpace
+ (m) =>
+ selectedSpace === "all" ||
+ (m.spaceContainerTag ?? m.spaceId ?? "default") ===
+ selectedSpace,
).length
// Can we add more memories to this doc?
const canAdd = originalMemCount - currentMemCount
if (canAdd > 0) {
const toAdd = Math.min(canAdd, remainingBudget)
- const additionalMems = doc.memoryEntries.slice(0, currentMemCount + toAdd)
+ const additionalMems = doc.memoryEntries.slice(
+ 0,
+ currentMemCount + toAdd,
+ )
processedDocs[i] = {
...doc,
memoryEntries: originalDoc.memoryEntries
- .filter(m => selectedSpace === "all" ||
- (m.spaceContainerTag ?? m.spaceId ?? "default") === selectedSpace)
+ .filter(
+ (m) =>
+ selectedSpace === "all" ||
+ (m.spaceContainerTag ?? m.spaceId ?? "default") ===
+ selectedSpace,
+ )
.sort((a, b) => {
- if (a.sourceRelevanceScore != null && b.sourceRelevanceScore != null) {
+ if (
+ a.sourceRelevanceScore != null &&
+ b.sourceRelevanceScore != null
+ ) {
return b.sourceRelevanceScore - a.sourceRelevanceScore
}
- const dateA = new Date(a.updatedAt || a.createdAt).getTime()
- const dateB = new Date(b.updatedAt || b.createdAt).getTime()
+ const dateA = new Date(
+ a.updatedAt || a.createdAt,
+ ).getTime()
+ const dateB = new Date(
+ b.updatedAt || b.createdAt,
+ ).getTime()
return dateB - dateA
})
- .slice(0, currentMemCount + toAdd)
+ .slice(0, currentMemCount + toAdd),
}
remainingBudget -= toAdd
}
@@ -238,8 +266,7 @@ export function useGraphData(
})
// Enhanced Layout with Space Separation
- const { centerX, centerY, clusterRadius } =
- LAYOUT_CONSTANTS
+ const { centerX, centerY, clusterRadius } = LAYOUT_CONSTANTS
/* 1. Build DOCUMENT nodes with space-aware clustering */
const documentNodes: GraphNode[] = []
@@ -255,8 +282,10 @@ export function useGraphData(
// Loose grid spacing - physics will organize it better
const spacing = 200
- const defaultX = centerX + (col - gridSize / 2) * spacing + (Math.random() - 0.5) * 50
- const defaultY = centerY + (row - gridSize / 2) * spacing + (Math.random() - 0.5) * 50
+ const defaultX =
+ centerX + (col - gridSize / 2) * spacing + (Math.random() - 0.5) * 50
+ const defaultY =
+ centerY + (row - gridSize / 2) * spacing + (Math.random() - 0.5) * 50
const customPos = nodePositions.get(doc.id)
@@ -318,9 +347,11 @@ export function useGraphData(
if (customMemPos) {
// If memory was manually positioned and has stored offset relative to parent
- if (customMemPos.parentDocId === docNode.id &&
+ if (
+ customMemPos.parentDocId === docNode.id &&
customMemPos.offsetX !== undefined &&
- customMemPos.offsetY !== undefined) {
+ customMemPos.offsetY !== undefined
+ ) {
// Apply the stored offset to the current document position
finalMemX = docNode.x + customMemPos.offsetX
finalMemY = docNode.y + customMemPos.offsetY
@@ -386,7 +417,8 @@ export function useGraphData(
data.documents.forEach((doc) => {
doc.memoryEntries.forEach((mem: MemoryEntry) => {
// Support both new object structure and legacy array/single parent fields
- let parentRelations: Record<string, MemoryRelation> = {}
+ let parentRelations: Record<string, MemoryRelation> =
+ mem.memoryRelations ?? ({} as Record<string, MemoryRelation>)
if (
mem.memoryRelations &&
@@ -436,4 +468,4 @@ export function useGraphData(
return { nodes: allNodes, edges: allEdges }
}, [data, filteredDocuments, nodePositions, draggingNodeId, similarityEdges])
-} \ No newline at end of file
+}