@andespindola/brainlink 0.1.0-beta.137 → 0.1.0-beta.138

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.
@@ -815,14 +815,16 @@ const edgeRelevanceScore = edge => {
815
815
  return score
816
816
  }
817
817
 
818
- const collectVisibleEdgesForNodes = nodeIds => {
818
+ const collectVisibleEdgesForNodes = (nodeIds, options = { preferComplete: false }) => {
819
819
  if (nodeIds.size === 0) {
820
820
  return []
821
821
  }
822
822
 
823
823
  const seen = new Set()
824
824
  const candidates = []
825
- const limit = edgeBudgetForCurrentFrame()
825
+ const limit = options.preferComplete
826
+ ? hierarchyAbsoluteEdgeSafetyCap
827
+ : edgeBudgetForCurrentFrame()
826
828
 
827
829
  nodeIds.forEach(nodeId => {
828
830
  const candidateEdges = state.visibleEdgeByNode.get(nodeId) ?? []
@@ -1358,10 +1360,18 @@ const projectNodesIntoChildGraph = (nodes, focusRenderNode, group) => {
1358
1360
 
1359
1361
  const centerX = (minX + maxX) / 2
1360
1362
  const centerY = (minY + maxY) / 2
1361
- const spanX = Math.max(1, maxX - minX)
1362
- const spanY = Math.max(1, maxY - minY)
1363
- const targetDiameter = Math.max(1, childGraphRenderRadius(group) * 2 * 0.9)
1364
- const scale = targetDiameter / Math.max(spanX, spanY)
1363
+ const maxDistanceFromCenter = nodes.reduce((maxDistance, node) => {
1364
+ const distance = Math.hypot(node.x - centerX, node.y - centerY)
1365
+ return Math.max(maxDistance, distance)
1366
+ }, 1)
1367
+ const subgraphFillByNodeCount = (nodeCount) => {
1368
+ if (nodeCount <= 24) return 0.62
1369
+ if (nodeCount <= 80) return 0.7
1370
+ if (nodeCount <= 200) return 0.78
1371
+ return 0.84
1372
+ }
1373
+ const targetRadius = Math.max(1, childGraphRenderRadius(group) * subgraphFillByNodeCount(nodes.length))
1374
+ const scale = targetRadius / Math.max(maxDistanceFromCenter, 1)
1365
1375
 
1366
1376
  return nodes.map(node => ({
1367
1377
  ...node,
@@ -1715,7 +1725,7 @@ const computeHierarchyRenderVisibility = (viewport) => {
1715
1725
  const childEdges = (isMicroView || revealProgress > 0)
1716
1726
  ? focusChildGroups.length > 0
1717
1727
  ? groupEdgesForRenderedGroups(childNodes)
1718
- : collectVisibleEdgesForNodes(childIds).map(edge => ({
1728
+ : collectVisibleEdgesForNodes(childIds, { preferComplete: true }).map(edge => ({
1719
1729
  ...edge,
1720
1730
  sourceNode: childById.get(edge.source) ?? edge.sourceNode,
1721
1731
  targetNode: childById.get(edge.target) ?? edge.targetNode
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andespindola/brainlink",
3
- "version": "0.1.0-beta.137",
3
+ "version": "0.1.0-beta.138",
4
4
  "description": "Local-first knowledge memory for agents with Markdown, backlinks, indexing and context retrieval.",
5
5
  "type": "module",
6
6
  "license": "MIT",