@andespindola/brainlink 0.1.0-beta.73 → 0.1.0-beta.75

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.
package/README.md CHANGED
@@ -594,7 +594,7 @@ The graph UI shows:
594
594
  - double-click on canvas zooms in at cursor position
595
595
  - floating graph totals (notes, links, tags) below the Brainlink title
596
596
  - large-graph rendering safeguards (edge draw caps, lower redraw rate, zoom-aware interaction)
597
- - massive-graph LOD progression: zoomed-out views prefer lightweight clusters, then progressively reveal nodes and edges as zoom increases
597
+ - massive-graph LOD progression: very low zoom uses spatial overview sampling to preserve whole-vault shape while keeping node visuals consistent, then progressively reveals nodes and edges as zoom increases
598
598
 
599
599
  The server indexes before starting by default. Use `--no-index` to skip that step:
600
600
 
@@ -26,6 +26,7 @@ const meshEdgeScaleThreshold = 0.09
26
26
  const meshEdgeMinBudget = 140
27
27
  const meshEdgeMaxBudget = 1400
28
28
  const layeredCoreScaleThreshold = 0.55
29
+ const massiveOverviewClusterScaleThreshold = 0.035
29
30
  const dragNeighborhoodMaxAffected = 180
30
31
  const dragSettleRounds = 3
31
32
  const wheelZoomExponent = 0.0018
@@ -1757,6 +1758,18 @@ const clusterViewportNodes = viewportNodes => {
1757
1758
  }))
1758
1759
  }
1759
1760
 
1761
+ const representativeNodesFromClusters = (clusters, limit) => {
1762
+ const representatives = clusters
1763
+ .map((cluster) => cluster.representative)
1764
+ .filter((node) => Boolean(node))
1765
+ const merged = mergeUniqueNodes(
1766
+ representatives,
1767
+ state.renderNodes ?? [],
1768
+ Math.max(1, limit)
1769
+ )
1770
+ return ensureHubNodesInRenderedSet(merged)
1771
+ }
1772
+
1760
1773
  const computeRenderVisibility = () => {
1761
1774
  if (!hasValidTransform()) {
1762
1775
  fitView({ useFiltered: true })
@@ -1810,6 +1823,20 @@ const computeRenderVisibility = () => {
1810
1823
 
1811
1824
  if (state.visibleNodes.length > massiveGraphNodeThreshold) {
1812
1825
  const viewportNodes = viewportNodesFromSpatialIndex(viewport)
1826
+ if (state.transform.scale <= massiveOverviewClusterScaleThreshold) {
1827
+ const overviewClusters = filterOverviewClustersByViewport(viewport)
1828
+ .sort((left, right) => right.count - left.count)
1829
+ .slice(0, Math.min(renderNodeBudget, clusterBudgetForScale(state.transform.scale)))
1830
+ if (overviewClusters.length > 0) {
1831
+ state.renderClusters = []
1832
+ state.renderNodes = representativeNodesFromClusters(
1833
+ overviewClusters,
1834
+ Math.min(renderNodeBudget, clusterBudgetForScale(state.transform.scale))
1835
+ )
1836
+ state.renderEdges = []
1837
+ return
1838
+ }
1839
+ }
1813
1840
  const sourceNodes = viewportNodes.length > 0 ? viewportNodes : state.visibleNodes
1814
1841
  const sampleLimit = nodeBudgetForScale(state.transform.scale)
1815
1842
  const carryMargin = Math.max(240, Math.min(1200, 340 / Math.max(state.transform.scale, 0.0001)))
@@ -1865,8 +1892,8 @@ const computeRenderVisibility = () => {
1865
1892
  const viewportNodes = viewportNodesFromSpatialIndex(viewport)
1866
1893
  const clusters = clusterViewportNodes(viewportNodes)
1867
1894
  if (clusters.length > 0) {
1868
- state.renderClusters = clusters
1869
- state.renderNodes = clusters.map(cluster => cluster.representative)
1895
+ state.renderClusters = []
1896
+ state.renderNodes = representativeNodesFromClusters(clusters, Math.min(renderNodeBudget, 900))
1870
1897
  state.renderEdges = []
1871
1898
  return
1872
1899
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/brainlink",
3
- "version": "0.1.0-beta.73",
3
+ "version": "0.1.0-beta.75",
4
4
  "description": "Local-first knowledge memory for agents with Markdown, backlinks, indexing and context retrieval.",
5
5
  "type": "module",
6
6
  "license": "MIT",