@andespindola/brainlink 0.1.0-beta.95 → 0.1.0-beta.96

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 alpha-particle 1000-note points, zoom-in keeps focused child clusters latent at the parent position before fading them in and only then separating them through 500-note, 250-note, 125-note, 60-note, 30-note, 15-note and 8-note subgraphs with aggregated real links plus local sibling mesh links, and in massive graphs keeps this subgraph mode active much longer with finer wheel steps so deep zoom does not abruptly switch to a broad sampled node cloud
605
+ - graph LOD progression: graphs up to 1000 notes render directly; larger graphs use a compact memory-hub-centered mesh where each 1000-note point already carries a faint connected 500-note micro-structure, then zoom-in keeps focused child clusters latent at the parent position before fading and separating them through 250-note, 125-note, 60-note, 30-note, 15-note and 8-note subgraphs with aggregated real links plus local sibling mesh links, and in massive graphs keeps this subgraph mode active much longer with finer wheel steps so deep zoom does not abruptly switch to a broad sampled node cloud
606
606
 
607
607
  The server indexes before starting by default. Use `--no-index` to skip that step:
608
608
 
@@ -901,9 +901,21 @@ const smoothStep = value => {
901
901
  const zoomProgress = (scale, start, end) =>
902
902
  smoothStep((scale - start) / Math.max(end - start, 0.0001))
903
903
 
904
- const semanticZoomSpread = progress => Math.pow(progress, 4.2)
904
+ const semanticZoomSpread = (progress, childSize) => {
905
+ const curve = Math.pow(progress, 4.2)
906
+ if (childSize >= 500) {
907
+ return 0.12 + curve * 0.88
908
+ }
909
+ return curve
910
+ }
905
911
 
906
- const opacityForProgress = progress => Math.pow(progress, 2.1)
912
+ const opacityForProgress = (progress, childSize) => {
913
+ const eased = Math.pow(progress, 2.1)
914
+ if (childSize >= 500) {
915
+ return 0.22 + eased * 0.78
916
+ }
917
+ return eased
918
+ }
907
919
 
908
920
  const expandFocusedClusters = (parentClusters, childSize, progress, spread, viewport) => {
909
921
  const focusPoint = ecosystemFocusPoint()
@@ -915,7 +927,7 @@ const expandFocusedClusters = (parentClusters, childSize, progress, spread, view
915
927
  const childClusters = state.ecosystemClustersBySize.get(childSize) ?? []
916
928
  const visibleChildClusters = childClusters
917
929
  .filter(cluster => expandedParentIds.has(cluster.parentId))
918
- .map(cluster => spreadChildClusterFromParent(cluster, progress, spread))
930
+ .map(cluster => spreadChildClusterFromParent(cluster, childSize, progress, spread))
919
931
  .filter(cluster => isClusterInViewport(cluster, viewport))
920
932
 
921
933
  return {
@@ -924,11 +936,11 @@ const expandFocusedClusters = (parentClusters, childSize, progress, spread, view
924
936
  }
925
937
  }
926
938
 
927
- const spreadChildClusterFromParent = (cluster, progress, spread) => {
939
+ const spreadChildClusterFromParent = (cluster, childSize, progress, spread) => {
928
940
  if (!Number.isFinite(cluster.parentX) || !Number.isFinite(cluster.parentY)) {
929
941
  return {
930
942
  ...cluster,
931
- lodOpacity: opacityForProgress(progress)
943
+ lodOpacity: opacityForProgress(progress, childSize)
932
944
  }
933
945
  }
934
946
 
@@ -936,7 +948,7 @@ const spreadChildClusterFromParent = (cluster, progress, spread) => {
936
948
  ...cluster,
937
949
  x: cluster.parentX + (cluster.x - cluster.parentX) * spread,
938
950
  y: cluster.parentY + (cluster.y - cluster.parentY) * spread,
939
- lodOpacity: opacityForProgress(progress)
951
+ lodOpacity: opacityForProgress(progress, childSize)
940
952
  }
941
953
  }
942
954
 
@@ -953,7 +965,7 @@ const selectHierarchicalEcosystemClusters = viewport => {
953
965
  continue
954
966
  }
955
967
  const progress = zoomProgress(state.transform.scale, level.start, level.end)
956
- const spread = semanticZoomSpread(progress)
968
+ const spread = semanticZoomSpread(progress, level.childSize)
957
969
  const expansion = expandFocusedClusters(parentClusters, level.childSize, progress, spread, viewport)
958
970
  visibleClusters.push(...expansion.childClusters)
959
971
  }
@@ -2535,25 +2547,25 @@ const clusterRadiusPx = cluster => {
2535
2547
  return 10
2536
2548
  }
2537
2549
  if (cluster.isHub) {
2538
- return 3.2
2550
+ return 3.8
2539
2551
  }
2540
2552
  if (String(cluster.id).startsWith('ecosystem-')) {
2541
2553
  const base = cluster.size >= 1000
2542
- ? 0.64
2554
+ ? 0.96
2543
2555
  : cluster.size >= 500
2544
- ? 0.6
2556
+ ? 0.9
2545
2557
  : cluster.size >= 250
2546
- ? 0.56
2558
+ ? 0.82
2547
2559
  : cluster.size >= 125
2548
- ? 0.52
2560
+ ? 0.74
2549
2561
  : cluster.size >= 60
2550
- ? 0.5
2562
+ ? 0.66
2551
2563
  : cluster.size >= 30
2552
- ? 0.58
2564
+ ? 0.62
2553
2565
  : cluster.size >= 15
2554
- ? 0.72
2555
- : 0.86
2556
- return Math.max(0.48, Math.min(1.75, base + Math.log10(cluster.count + 1) * 0.11))
2566
+ ? 0.74
2567
+ : 0.9
2568
+ return Math.max(0.62, Math.min(2.2, base + Math.log10(cluster.count + 1) * 0.14))
2557
2569
  }
2558
2570
  return Math.max(8, Math.min(28, 8 + Math.log2(cluster.count + 1) * 3))
2559
2571
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/brainlink",
3
- "version": "0.1.0-beta.95",
3
+ "version": "0.1.0-beta.96",
4
4
  "description": "Local-first knowledge memory for agents with Markdown, backlinks, indexing and context retrieval.",
5
5
  "type": "module",
6
6
  "license": "MIT",