@andespindola/brainlink 0.1.0-beta.60 → 0.1.0-beta.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,6 +22,7 @@ const zoomCapTargetViewportShare = 0.72
22
22
  const meshEdgeScaleThreshold = 0.09
23
23
  const meshEdgeMinBudget = 140
24
24
  const meshEdgeMaxBudget = 1400
25
+ const layeredCoreScaleThreshold = 0.55
25
26
  const state = {
26
27
  graph: { nodes: [], edges: [] },
27
28
  nodes: [],
@@ -567,6 +568,70 @@ const nodeBudgetForScale = (scale) => {
567
568
  return renderNodeBudget
568
569
  }
569
570
 
571
+ const layerWindowForScale = (scale) => {
572
+ if (scale < 0.08) return { inner: 0.78, outer: 1 }
573
+ if (scale < 0.14) return { inner: 0.62, outer: 0.9 }
574
+ if (scale < 0.24) return { inner: 0.46, outer: 0.74 }
575
+ if (scale < 0.36) return { inner: 0.3, outer: 0.58 }
576
+ if (scale < layeredCoreScaleThreshold) return { inner: 0.16, outer: 0.42 }
577
+ if (scale < 0.9) return { inner: 0.06, outer: 0.26 }
578
+ return { inner: 0, outer: 0.14 }
579
+ }
580
+
581
+ const selectLayeredNodesForScale = (sourceNodes) => {
582
+ const hub = state.primaryHub
583
+ if (!hub || sourceNodes.length <= 1200 || state.visibleNodes.length <= massiveGraphNodeThreshold) {
584
+ return sourceNodes
585
+ }
586
+
587
+ let maxDistance = 0
588
+ const distances = sourceNodes.map((node) => {
589
+ const distance = Math.hypot(node.x - hub.x, node.y - hub.y)
590
+ if (distance > maxDistance) {
591
+ maxDistance = distance
592
+ }
593
+ return { node, distance }
594
+ })
595
+
596
+ if (maxDistance <= 0.001) {
597
+ return sourceNodes
598
+ }
599
+
600
+ const window = layerWindowForScale(state.transform.scale)
601
+ const inner = window.inner * maxDistance
602
+ const outer = window.outer * maxDistance
603
+ const layered = distances
604
+ .filter((item) => item.distance >= inner && item.distance <= outer)
605
+ .map((item) => item.node)
606
+
607
+ if (state.transform.scale >= layeredCoreScaleThreshold && !layered.some((node) => node.id === hub.id)) {
608
+ layered.push(hub)
609
+ }
610
+
611
+ if (layered.length > 0) {
612
+ return layered
613
+ }
614
+
615
+ const midpoint = (window.inner + window.outer) / 2
616
+ const fallback = [...distances]
617
+ .sort((left, right) => {
618
+ const leftNorm = left.distance / maxDistance
619
+ const rightNorm = right.distance / maxDistance
620
+ const leftDelta = Math.abs(leftNorm - midpoint)
621
+ const rightDelta = Math.abs(rightNorm - midpoint)
622
+ if (leftDelta !== rightDelta) return leftDelta - rightDelta
623
+ return left.node.id.localeCompare(right.node.id)
624
+ })
625
+ .slice(0, Math.min(900, sourceNodes.length))
626
+ .map((item) => item.node)
627
+
628
+ if (state.transform.scale >= layeredCoreScaleThreshold && !fallback.some((node) => node.id === hub.id)) {
629
+ fallback.push(hub)
630
+ }
631
+
632
+ return fallback
633
+ }
634
+
570
635
  const edgeIdentityKey = edge => {
571
636
  if (!edge.target) return ''
572
637
  const pair = edge.source < edge.target
@@ -1465,10 +1530,11 @@ const computeRenderVisibility = () => {
1465
1530
  if (state.visibleNodes.length > massiveGraphNodeThreshold) {
1466
1531
  const viewportNodes = viewportNodesFromSpatialIndex(viewport)
1467
1532
  const sourceNodes = viewportNodes.length > 0 ? viewportNodes : state.visibleNodes
1533
+ const layeredNodes = selectLayeredNodesForScale(sourceNodes)
1468
1534
  const sampleLimit = nodeBudgetForScale(state.transform.scale)
1469
- const sampled = sourceNodes.length > sampleLimit
1470
- ? sampleVisibleNodes(Math.min(sampleLimit, renderNodeBudget), sourceNodes)
1471
- : sourceNodes.slice(0, Math.min(sourceNodes.length, renderNodeBudget))
1535
+ const sampled = layeredNodes.length > sampleLimit
1536
+ ? sampleVisibleNodes(Math.min(sampleLimit, renderNodeBudget), layeredNodes)
1537
+ : layeredNodes.slice(0, Math.min(layeredNodes.length, renderNodeBudget))
1472
1538
  const sampledIds = new Set(sampled.map((node) => node.id))
1473
1539
  let sampledEdges = state.transform.scale >= 0.035 ? collectVisibleEdgesForNodes(sampledIds) : []
1474
1540
  let sampledNodes = ensureHubNodesInRenderedSet(sampled)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/brainlink",
3
- "version": "0.1.0-beta.60",
3
+ "version": "0.1.0-beta.61",
4
4
  "description": "Local-first knowledge memory for agents with Markdown, backlinks, indexing and context retrieval.",
5
5
  "type": "module",
6
6
  "license": "MIT",