@andespindola/brainlink 0.1.0-beta.91 → 0.1.0-beta.92

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
@@ -602,7 +602,7 @@ The graph UI shows:
602
602
  - WebGL node and edge acceleration when supported, falling back to Canvas 2D without changing graph behavior
603
603
  - compact macro-to-micro density progression so reset keeps the graph mass oriented and zoom-in separates local neighborhoods progressively
604
604
  - graph camera treats hub-centered navigation as structural only when the hub is dominant; diffuse stress graphs reset and zoom around the full graph mass
605
- - graph LOD progression: graphs up to 1000 notes render directly; larger graphs use a compact memory-hub-centered mesh of connected 1000-note points, zoom-in continuously spreads and fades only focused clusters through 500-note, 250-note, 125-note and 60-note subgraphs with aggregated real links plus local sibling mesh links, keeps parent points during expansion to avoid visual jumps, then progressively raises the focused node budget so local areas keep nearby notes and links visible
605
+ - graph LOD progression: graphs up to 1000 notes render directly; larger graphs use a compact memory-hub-centered mesh of small connected 1000-note points, zoom-in delays expansion until the focused cluster is visually close, then continuously spreads and fades only focused clusters through 500-note, 250-note, 125-note and 60-note subgraphs with aggregated real links plus local sibling mesh links, keeps parent points during expansion to avoid visual jumps, then progressively raises the focused node budget so local areas keep nearby notes and links visible
606
606
 
607
607
  The server indexes before starting by default. Use `--no-index` to skip that step:
608
608
 
@@ -27,15 +27,15 @@ const ecosystemGroupSizes = [1000, 500, 250, 125, 60]
27
27
  const ecosystemClusterEdgeLimit = 520
28
28
  const ecosystemHubEdgeLimit = 120
29
29
  const ecosystemSiblingEdgeLimit = 180
30
- const ecosystemClusterScaleThreshold = 0.32
30
+ const ecosystemClusterScaleThreshold = 0.78
31
31
  const ecosystemSubgraphScaleThreshold = 0.18
32
32
  const ecosystemMicroScaleThreshold = 0.08
33
- const ecosystemFocusedParentLimit = 3
33
+ const ecosystemFocusedParentLimit = 2
34
34
  const ecosystemExpansionLevels = [
35
- { parentSize: 1000, childSize: 500, start: 0.035, end: 0.105 },
36
- { parentSize: 500, childSize: 250, start: 0.075, end: 0.165 },
37
- { parentSize: 250, childSize: 125, start: 0.135, end: 0.245 },
38
- { parentSize: 125, childSize: 60, start: 0.205, end: 0.32 }
35
+ { parentSize: 1000, childSize: 500, start: 0.16, end: 0.34 },
36
+ { parentSize: 500, childSize: 250, start: 0.3, end: 0.5 },
37
+ { parentSize: 250, childSize: 125, start: 0.46, end: 0.66 },
38
+ { parentSize: 125, childSize: 60, start: 0.62, end: 0.78 }
39
39
  ]
40
40
  const zoomRecoveryGuardMs = 4200
41
41
  const zoomCapTargetViewportShare = 0.72
@@ -743,11 +743,11 @@ const selectEcosystemRepresentative = nodes => {
743
743
  }
744
744
 
745
745
  const ecosystemLayoutSpacingForSize = size => {
746
- if (size >= 1000) return 360
747
- if (size >= 500) return 160
748
- if (size >= 250) return 92
749
- if (size >= 125) return 48
750
- return 28
746
+ if (size >= 1000) return 260
747
+ if (size >= 500) return 92
748
+ if (size >= 250) return 52
749
+ if (size >= 125) return 28
750
+ return 16
751
751
  }
752
752
 
753
753
  const ecosystemCompactPoint = (index, total, center, spacing) => {
@@ -894,7 +894,9 @@ const smoothStep = value => {
894
894
  const zoomProgress = (scale, start, end) =>
895
895
  smoothStep((scale - start) / Math.max(end - start, 0.0001))
896
896
 
897
- const opacityForSpread = spread => 0.05 + smoothStep(spread) * 0.95
897
+ const semanticZoomSpread = progress => Math.pow(progress, 2.6)
898
+
899
+ const opacityForSpread = spread => 0.03 + smoothStep(spread) * 0.97
898
900
 
899
901
  const expandFocusedClusters = (parentClusters, childSize, spread, viewport) => {
900
902
  const focusPoint = ecosystemFocusPoint()
@@ -943,10 +945,11 @@ const selectHierarchicalEcosystemClusters = viewport => {
943
945
  if (parentClusters.length === 0) {
944
946
  continue
945
947
  }
946
- const spread = zoomProgress(state.transform.scale, level.start, level.end)
947
- if (spread <= 0.015) {
948
+ const progress = zoomProgress(state.transform.scale, level.start, level.end)
949
+ if (progress <= 0.025) {
948
950
  continue
949
951
  }
952
+ const spread = semanticZoomSpread(progress)
950
953
  const expansion = expandFocusedClusters(parentClusters, level.childSize, spread, viewport)
951
954
  visibleClusters.push(...expansion.childClusters)
952
955
  }
@@ -2527,11 +2530,11 @@ const clusterRadiusPx = cluster => {
2527
2530
  return 10
2528
2531
  }
2529
2532
  if (cluster.isHub) {
2530
- return 5.2
2533
+ return 4.2
2531
2534
  }
2532
2535
  if (String(cluster.id).startsWith('ecosystem-')) {
2533
- const base = cluster.size >= 1000 ? 2.4 : cluster.size >= 500 ? 2.25 : cluster.size >= 250 ? 2.1 : cluster.size >= 125 ? 1.95 : 1.8
2534
- return Math.max(1.8, Math.min(4.2, base + Math.log10(cluster.count + 1) * 0.28))
2536
+ const base = cluster.size >= 1000 ? 1.2 : cluster.size >= 500 ? 1.1 : cluster.size >= 250 ? 1 : cluster.size >= 125 ? 0.92 : 0.86
2537
+ return Math.max(0.85, Math.min(2.45, base + Math.log10(cluster.count + 1) * 0.18))
2535
2538
  }
2536
2539
  return Math.max(8, Math.min(28, 8 + Math.log2(cluster.count + 1) * 3))
2537
2540
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/brainlink",
3
- "version": "0.1.0-beta.91",
3
+ "version": "0.1.0-beta.92",
4
4
  "description": "Local-first knowledge memory for agents with Markdown, backlinks, indexing and context retrieval.",
5
5
  "type": "module",
6
6
  "license": "MIT",