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

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 clusters to preserve whole-vault shape, 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
@@ -1810,6 +1811,17 @@ const computeRenderVisibility = () => {
1810
1811
 
1811
1812
  if (state.visibleNodes.length > massiveGraphNodeThreshold) {
1812
1813
  const viewportNodes = viewportNodesFromSpatialIndex(viewport)
1814
+ if (state.transform.scale <= massiveOverviewClusterScaleThreshold) {
1815
+ const overviewClusters = filterOverviewClustersByViewport(viewport)
1816
+ .sort((left, right) => right.count - left.count)
1817
+ .slice(0, Math.min(renderNodeBudget, clusterBudgetForScale(state.transform.scale)))
1818
+ if (overviewClusters.length > 0) {
1819
+ state.renderClusters = overviewClusters
1820
+ state.renderNodes = overviewClusters.map((cluster) => cluster.representative)
1821
+ state.renderEdges = []
1822
+ return
1823
+ }
1824
+ }
1813
1825
  const sourceNodes = viewportNodes.length > 0 ? viewportNodes : state.visibleNodes
1814
1826
  const sampleLimit = nodeBudgetForScale(state.transform.scale)
1815
1827
  const carryMargin = Math.max(240, Math.min(1200, 340 / Math.max(state.transform.scale, 0.0001)))
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.74",
4
4
  "description": "Local-first knowledge memory for agents with Markdown, backlinks, indexing and context retrieval.",
5
5
  "type": "module",
6
6
  "license": "MIT",