@sleep2agi/agent-network-dashboard 0.4.6-preview.8 → 0.4.6-preview.9

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.
Files changed (144) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +4 -4
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/index.html +2 -2
  30. package/.next/server/app/index.rsc +2 -2
  31. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/login.html +2 -2
  38. package/.next/server/app/login.rsc +2 -2
  39. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  40. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  45. package/.next/server/app/logs.html +1 -1
  46. package/.next/server/app/logs.rsc +1 -1
  47. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  53. package/.next/server/app/messages.html +1 -1
  54. package/.next/server/app/messages.rsc +1 -1
  55. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  61. package/.next/server/app/node.html +1 -1
  62. package/.next/server/app/node.rsc +1 -1
  63. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  69. package/.next/server/app/nodes.html +1 -1
  70. package/.next/server/app/nodes.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  77. package/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/server-logs.html +1 -1
  79. package/.next/server/app/server-logs.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  86. package/.next/server/app/settings/networks.html +1 -1
  87. package/.next/server/app/settings/networks.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  95. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/settings/tokens.html +1 -1
  97. package/.next/server/app/settings/tokens.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  105. package/.next/server/app/settings.html +2 -2
  106. package/.next/server/app/settings.rsc +2 -2
  107. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  108. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  112. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/tasks.html +1 -1
  114. package/.next/server/app/tasks.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  126. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  127. package/.next/server/middleware-build-manifest.js +3 -3
  128. package/.next/server/pages/404.html +1 -1
  129. package/.next/server/pages/500.html +1 -1
  130. package/.next/server/server-reference-manifest.js +1 -1
  131. package/.next/server/server-reference-manifest.json +1 -1
  132. package/.next/static/chunks/{0cbezu61m-e~z.js → 0kgak.tfh2-~i.js} +1 -1
  133. package/.next/static/chunks/131.zrqhdbu5x.js +1 -0
  134. package/.next/static/chunks/{0mn0ruf0g4op5.js → 165lqf5.z.n10.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +47 -33
  138. package/package.json +1 -1
  139. package/scripts/topo-overlap-test.mjs +137 -0
  140. package/scripts/topo-p0round-test.mjs +2 -2
  141. package/.next/static/chunks/0y9subfnntv1s.js +0 -1
  142. /package/.next/static/{7xem03-473G3qw-fC160p → T0hK2WE0kVtyFouPsSpos}/_buildManifest.js +0 -0
  143. /package/.next/static/{7xem03-473G3qw-fC160p → T0hK2WE0kVtyFouPsSpos}/_clientMiddlewareManifest.js +0 -0
  144. /package/.next/static/{7xem03-473G3qw-fC160p → T0hK2WE0kVtyFouPsSpos}/_ssgManifest.js +0 -0
@@ -422,10 +422,14 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
422
422
  const all = [...online, ...offline];
423
423
  const groupKeys = computeGroups(all);
424
424
  const cols = Math.max(1, Math.ceil(Math.sqrt(all.length)));
425
- // #112: gy0 starts below the recent-signal / legend overlay panels so
426
- // grid row 0 is never occluded by them (Vincent 4727).
427
- const gx0 = 150, gx1 = 850, gy0 = 184, gy1 = 588;
425
+ // #112: gy0 starts below the (now compact) recent-signal / legend
426
+ // overlay panels their max bottom edge is y≈112 so grid row 0 is
427
+ // never occluded; gy1 extends near the canvas bottom for breathing room.
428
+ const gx0 = 150, gx1 = 850, gy0 = 126, gy1 = 652;
428
429
  const cellW = (gx1 - gx0) / cols;
430
+ // largest node radius at the current size scale — drives the group
431
+ // label band + the row-height floor so nothing ever overlaps.
432
+ const nodeR = Math.round(26 * nodeScale);
429
433
 
430
434
  // ordered runs of consecutive same-group-key nodes (≥2 = real group)
431
435
  const runs: { key: string; members: Session[] }[] = [];
@@ -459,9 +463,18 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
459
463
  }
460
464
  }
461
465
  const totalRows = Math.max(1, row);
462
- // Adaptive row height so every band fits the canvas many small groups
463
- // would overflow a fixed height; zoom/pan still works past the floor.
464
- const cellH = Math.min(100, (gy1 - gy0) / totalRows);
466
+ // #112: the group label sits in a band ABOVE the topmost node, so the
467
+ // band must clear the node radius GROUP_TOP is node-relative, never
468
+ // cellH-derived (cellH-derived was the label↔node overlap bug Vincent
469
+ // hit). cellH then floors at GROUP_TOP + 30 so the label band + bottom
470
+ // padding always fit and stacked group boxes never touch; past the
471
+ // floor the grid overflows and zoom/pan handles it.
472
+ const GROUP_TOP = nodeR + 20;
473
+ // Row-height floor = the tightest of: a node + its label below it
474
+ // (2·nodeR + ~22), and the label band + min box padding (GROUP_TOP + 12).
475
+ // Below this, rows would overlap; past it the grid overflows and
476
+ // zoom/pan covers the rest.
477
+ const cellH = Math.max(2 * nodeR + 22, GROUP_TOP + 12, Math.min(100, (gy1 - gy0) / totalRows));
465
478
 
466
479
  // Pass 2 — place each band's members.
467
480
  for (const band of bands) {
@@ -481,11 +494,10 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
481
494
  const active = new Set<string>();
482
495
  links.forEach(link => { active.add(link.from); active.add(link.to); });
483
496
  // #111: one bounding box per multi-member group (Vincent 4722). Each
484
- // group owns its rows, so the box is a clean rect with no overlap.
485
- // Padding scales with the (adaptive) row height so stacked group boxes
486
- // stay clear of each other even when many bands compress the grid.
487
- const GROUP_TOP = Math.max(22, Math.min(44, cellH * 0.4)); // label band
488
- const GROUP_PAD = Math.max(16, Math.min(32, cellH * 0.3)); // side/bottom
497
+ // group owns its rows; GROUP_PAD fills the row space left below the
498
+ // nodes after the label band, so stacked group boxes always have a
499
+ // gap between them (GROUP_TOP is defined above, with cellH).
500
+ const GROUP_PAD = Math.max(8, Math.min(26, cellH - GROUP_TOP - 8)); // side/bottom
489
501
  const groupBoxes = bands
490
502
  .filter(b => b.isGroup)
491
503
  .map(band => {
@@ -592,7 +604,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
592
604
  // ring nodes can't be cleanly boxed. Ring keeps the #83 prefix hue.
593
605
  groupBoxes: [] as { key: string; x: number; y: number; w: number; h: number }[],
594
606
  };
595
- }, [messages, sessions, sseSessions, layout]);
607
+ }, [messages, sessions, sseSessions, layout, nodeScale]);
596
608
 
597
609
  const workingCount = onlineNodes.filter(s => s.status === 'working').length;
598
610
  // Round 109 (Vincent 4582 P0): hover-gated labels above this node count
@@ -970,7 +982,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
970
982
  />
971
983
  <text
972
984
  x={box.x + 12}
973
- y={box.y + 21}
985
+ y={box.y + 14}
974
986
  fill={pal.legendText}
975
987
  fontSize="13"
976
988
  fontFamily="monospace"
@@ -1241,32 +1253,34 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1241
1253
  </g>
1242
1254
 
1243
1255
  {/* #112: overlay panels (recent-signal + legend) render OUTSIDE the
1244
- zoom/pan <g> they stay fixed in the viewBox corners while the
1245
- topology pans/zooms (previously they drifted with the content).
1246
- Grid layout insets its rows below them (gy0) so nodes are never
1247
- occluded. */}
1256
+ zoom/pan <g> so they stay fixed while the topology pans/zooms.
1257
+ They're sized + tucked into the top corners so every corner of
1258
+ each panel is >325px from the canvas centre i.e. fully outside
1259
+ the outermost (offline) ring. No node on any ring can reach the
1260
+ corner triangles, so the panels never overlap a node, in ring
1261
+ OR grid layout (Vincent 4727 zero-overlap criterion). */}
1248
1262
  {/* latest flow labels */}
1249
- <g transform="translate(28, 34)">
1250
- <rect x="0" y="0" width="285" height={60 + Math.min(flowLinks.length, 4) * 20} rx="10" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 0.97 : 0.92} />
1251
- <text x="16" y="26" fill={pal.legendHeadline} fontSize="13" fontFamily="monospace" fontWeight="700">recent signal</text>
1252
- <text x="178" y="26" fill={pal.legendAccent} fontSize="11" fontFamily="monospace">{messages.length} messages</text>
1253
- {flowLinks.slice(0, 4).map((link, index) => (
1254
- <text key={link.key} x="16" y={54 + index * 20} fill={pal.legendText} fontSize="10" fontFamily="monospace">
1255
- {truncate(link.from, 8)} {'->'} {truncate(link.to, 8)} / {link.count} / {truncate(link.content, 18)}
1263
+ <g transform="translate(16, 16)">
1264
+ <rect x="0" y="0" width="230" height="84" rx="10" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 0.97 : 0.92} />
1265
+ <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700">recent signal</text>
1266
+ <text x="150" y="21" fill={pal.legendAccent} fontSize="10" fontFamily="monospace">{messages.length} msgs</text>
1267
+ {flowLinks.slice(0, 3).map((link, index) => (
1268
+ <text key={link.key} x="13" y={38 + index * 16} fill={pal.legendText} fontSize="9" fontFamily="monospace">
1269
+ {truncate(link.from, 6)} {'->'} {truncate(link.to, 6)} / {link.count} / {truncate(link.content, 12)}
1256
1270
  </text>
1257
1271
  ))}
1258
1272
  </g>
1259
1273
 
1260
1274
  {/* legend */}
1261
- <g transform="translate(720, 34)">
1262
- <rect x="0" y="0" width="250" height="112" rx="10" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 0.97 : 0.92} />
1263
- <circle cx="18" cy="26" r="6" fill={isLight ? '#059669' : '#22c55e'} />
1264
- <text x="34" y="30" fill={pal.legendText} fontSize="11" fontFamily="monospace">working node</text>
1265
- <circle cx="18" cy="52" r="6" fill={isLight ? '#0d9488' : '#2dd4bf'} />
1266
- <text x="34" y="56" fill={pal.legendText} fontSize="11" fontFamily="monospace">online idle</text>
1267
- <circle cx="18" cy="78" r="6" fill={isLight ? '#94a3b8' : '#6b7280'} />
1268
- <text x="34" y="82" fill={pal.legendText} fontSize="11" fontFamily="monospace">offline / no SSE</text>
1269
- <path d="M150,78 Q176,52 210,78" fill="none" stroke={pal.flowEdge} strokeWidth="3" markerEnd="url(#topo-arrow)" />
1275
+ <g transform="translate(760, 16)">
1276
+ <rect x="0" y="0" width="224" height="96" rx="10" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 0.97 : 0.92} />
1277
+ <circle cx="16" cy="24" r="5.5" fill={isLight ? '#059669' : '#22c55e'} />
1278
+ <text x="30" y="28" fill={pal.legendText} fontSize="11" fontFamily="monospace">working node</text>
1279
+ <circle cx="16" cy="48" r="5.5" fill={isLight ? '#0d9488' : '#2dd4bf'} />
1280
+ <text x="30" y="52" fill={pal.legendText} fontSize="11" fontFamily="monospace">online idle</text>
1281
+ <circle cx="16" cy="72" r="5.5" fill={isLight ? '#94a3b8' : '#6b7280'} />
1282
+ <text x="30" y="76" fill={pal.legendText} fontSize="11" fontFamily="monospace">offline / no SSE</text>
1283
+ <path d="M140,72 Q164,48 196,72" fill="none" stroke={pal.flowEdge} strokeWidth="3" markerEnd="url(#topo-arrow)" />
1270
1284
  </g>
1271
1285
  </svg>
1272
1286
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.8",
3
+ "version": "0.4.6-preview.9",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,137 @@
1
+ /* Issue #112 acceptance: ZERO overlap in the topology (Vincent's hard
2
+ * done-criterion). At ~30 nodes, in both ring and grid layouts, asserts:
3
+ * - node ↔ node — status rings don't intersect
4
+ * - node ↔ panel — no node circle intersects an overlay panel rect
5
+ * - node ↔ group-label — no group-box label text covers a node
6
+ * - group-box ↔ box — no two group boxes overlap */
7
+ import { chromium } from 'playwright';
8
+ import { readFileSync, mkdirSync } from 'node:fs';
9
+
10
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
11
+ mkdirSync('/tmp/anet-issue-112', { recursive: true });
12
+ const browser = await chromium.launch({ headless: true });
13
+
14
+ // ~30 nodes: 4 prefix groups + a workdir group + singletons
15
+ const FLEET = [
16
+ ...['A站内容', 'A站评测', 'A站数据', 'A站设计', 'A站运营', 'A站工程'].map(a => ({ alias: a })),
17
+ ...['B站产品', 'B站工程', 'B站测试', 'B站运维', 'B站运营'].map(a => ({ alias: a })),
18
+ ...['P站产品', 'P站工程', 'P站测试', 'P站运维'].map(a => ({ alias: a })),
19
+ ...['通信龙', '通信牛', '通信马', '通信SDK马'].map(a => ({ alias: a })),
20
+ ...['srv-a', 'srv-b', 'srv-c'].map(a => ({ alias: a, project_dir: '/home/v/agent-orchestra' })),
21
+ ...['群星马', '书生1号', '微信马', '飞书马', '独立节点', '研究员1号', '研究员2号', '游侠马'].map(a => ({ alias: a })),
22
+ ];
23
+
24
+ const overlaps1D = (a0, a1, b0, b1, tol) => a0 < b1 - tol && b0 < a1 - tol;
25
+
26
+ async function check(layout) {
27
+ const ctx = await browser.newContext({ viewport: { width: 1280, height: 920 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript((lay) => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ localStorage.removeItem('anet-brand');
33
+ localStorage.removeItem('anet-topo-view');
34
+ localStorage.removeItem('anet-topo-nodescale'); // default M
35
+ localStorage.setItem('anet-topo-layout', lay);
36
+ sessionStorage.setItem('anet_v3_auth', '1');
37
+ } catch {}
38
+ }, layout);
39
+ await ctx.route('**/api/hub/status*', async (route) => {
40
+ const r = await route.fetch();
41
+ const b = await r.json();
42
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
43
+ const sessions = FLEET.map((f, i) => ({
44
+ alias: f.alias, status: i % 5 === 0 ? 'working' : 'idle', network_id: nid,
45
+ project_dir: f.project_dir ?? null,
46
+ created_at: '2026-05-15T00:00:00Z', updated_at: '2026-05-15T00:00:00Z', last_seen_at: new Date().toISOString(),
47
+ }));
48
+ await route.fulfill({ response: r, json: { ...b, sessions } });
49
+ });
50
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
51
+ const page = await ctx.newPage();
52
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
53
+ await page.waitForFunction(() => {
54
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
55
+ return !!svg && svg.querySelectorAll('g[data-node]').length > 20;
56
+ }, { timeout: 30000 }).catch(() => {});
57
+ await page.waitForTimeout(800);
58
+
59
+ const data = await page.evaluate(() => {
60
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
61
+ // node status rings: stroke-width 3 (online) / 1.5 (offline), centred on the node
62
+ const nodes = [...svg.querySelectorAll('g[data-node]')].map(g => {
63
+ const ring = g.querySelector('circle[stroke-width="3"], circle[stroke-width="1.5"]');
64
+ if (!ring) return null;
65
+ return { alias: g.getAttribute('data-node'), cx: +ring.getAttribute('cx'), cy: +ring.getAttribute('cy'), r: +ring.getAttribute('r') };
66
+ }).filter(Boolean);
67
+ // overlay panels (direct svg children, fixed)
68
+ const panels = [...svg.querySelectorAll(':scope > g[transform^="translate(28, 34)"], :scope > g[transform^="translate(720, 34)"]')].map(g => {
69
+ const m = g.getAttribute('transform').match(/translate\(([\d.]+),\s*([\d.]+)\)/);
70
+ const rect = g.querySelector('rect');
71
+ return { x: +m[1], y: +m[2], w: +rect.getAttribute('width'), h: +rect.getAttribute('height') };
72
+ });
73
+ // group boxes + their label text bounding boxes
74
+ const groups = [...svg.querySelectorAll('g[data-group]')].map(g => {
75
+ const rect = g.querySelector('rect');
76
+ const text = g.querySelector('text');
77
+ const bb = text.getBBox();
78
+ return {
79
+ box: { x: +rect.getAttribute('x'), y: +rect.getAttribute('y'), w: +rect.getAttribute('width'), h: +rect.getAttribute('height') },
80
+ label: { x: bb.x, y: bb.y, w: bb.width, h: bb.height },
81
+ };
82
+ });
83
+ return { nodes, panels, groups };
84
+ });
85
+
86
+ const TOL = 2; // px slack — touching edges is fine, real overlap is not
87
+ let nodeNode = 0, nodePanel = 0, nodeLabel = 0, boxBox = 0;
88
+
89
+ // node ↔ node
90
+ for (let i = 0; i < data.nodes.length; i++) {
91
+ for (let j = i + 1; j < data.nodes.length; j++) {
92
+ const a = data.nodes[i], b = data.nodes[j];
93
+ const d = Math.hypot(a.cx - b.cx, a.cy - b.cy);
94
+ if (d < a.r + b.r - TOL) nodeNode++;
95
+ }
96
+ }
97
+ // node ↔ panel (circle vs rect)
98
+ for (const n of data.nodes) {
99
+ for (const p of data.panels) {
100
+ const qx = Math.max(p.x, Math.min(n.cx, p.x + p.w));
101
+ const qy = Math.max(p.y, Math.min(n.cy, p.y + p.h));
102
+ if (Math.hypot(n.cx - qx, n.cy - qy) < n.r - TOL) nodePanel++;
103
+ }
104
+ }
105
+ // node ↔ group label (circle vs label text bbox)
106
+ for (const n of data.nodes) {
107
+ for (const g of data.groups) {
108
+ const L = g.label;
109
+ const qx = Math.max(L.x, Math.min(n.cx, L.x + L.w));
110
+ const qy = Math.max(L.y, Math.min(n.cy, L.y + L.h));
111
+ if (Math.hypot(n.cx - qx, n.cy - qy) < n.r - TOL) nodeLabel++;
112
+ }
113
+ }
114
+ // group box ↔ group box
115
+ for (let i = 0; i < data.groups.length; i++) {
116
+ for (let j = i + 1; j < data.groups.length; j++) {
117
+ const a = data.groups[i].box, b = data.groups[j].box;
118
+ if (overlaps1D(a.x, a.x + a.w, b.x, b.x + b.w, TOL) &&
119
+ overlaps1D(a.y, a.y + a.h, b.y, b.y + b.h, TOL)) boxBox++;
120
+ }
121
+ }
122
+
123
+ await page.screenshot({ path: `/tmp/anet-issue-112/overlap-${layout}.png` });
124
+ await ctx.close();
125
+ const ok = nodeNode === 0 && nodePanel === 0 && nodeLabel === 0 && boxBox === 0;
126
+ console.log(`${ok ? '✅' : '❌'} [${layout}] nodes=${data.nodes.length} groups=${data.groups.length} — ` +
127
+ `node↔node:${nodeNode} node↔panel:${nodePanel} node↔label:${nodeLabel} box↔box:${boxBox}`);
128
+ return ok;
129
+ }
130
+
131
+ const all = [];
132
+ all.push(await check('grid'));
133
+ all.push(await check('ring'));
134
+ await browser.close();
135
+ const pass = all.every(Boolean);
136
+ console.log(pass ? '\n✅ ZERO OVERLAP' : '\n❌ OVERLAP DETECTED');
137
+ process.exit(pass ? 0 : 1);
@@ -68,7 +68,7 @@ const results = {};
68
68
  results.panelOcclusion = await page.evaluate(() => {
69
69
  const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
70
70
  // overlay panels: <g transform="translate(28, 34)"> and translate(720, 34)
71
- const panels = [...svg.querySelectorAll(':scope > g[transform^="translate(28, 34)"], :scope > g[transform^="translate(720, 34)"]')]
71
+ const panels = [...svg.querySelectorAll(':scope > g[transform^="translate(16, 16)"], :scope > g[transform^="translate(760, 16)"]')]
72
72
  .map(g => {
73
73
  const m = g.getAttribute('transform').match(/translate\(([\d.]+),\s*([\d.]+)\)/);
74
74
  const rect = g.querySelector('rect');
@@ -92,7 +92,7 @@ const results = {};
92
92
  // panels exist and are OUTSIDE the zoom/pan transform group (direct svg children)
93
93
  results.panelsOutsideTransform = await page.evaluate(() => {
94
94
  const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
95
- const panels = [...svg.querySelectorAll(':scope > g[transform^="translate(28, 34)"], :scope > g[transform^="translate(720, 34)"]')];
95
+ const panels = [...svg.querySelectorAll(':scope > g[transform^="translate(16, 16)"], :scope > g[transform^="translate(760, 16)"]')];
96
96
  return panels.length === 2; // :scope > = direct children, not inside the view <g>
97
97
  });
98
98
  await page.screenshot({ path: '/tmp/anet-issue-112/grid-occlusion.png' });
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,136,(e,t,r)=>{},7454,(e,t,r)=>{var a=e.i(20888);e.r(136);var s=e.r(23910),n=s&&"object"==typeof s&&"default"in s?s:{default:s},l=void 0!==a.default&&a.default.env&&!0,i=function(e){return"[object String]"===Object.prototype.toString.call(e)},o=function(){function e(e){var t=void 0===e?{}:e,r=t.name,a=void 0===r?"stylesheet":r,s=t.optimizeForSpeed,n=void 0===s?l:s;d(i(a),"`name` must be a string"),this._name=a,this._deletedRulePlaceholder="#"+a+"-deleted-rule____{}",d("boolean"==typeof n,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=n,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0;var o="u">typeof window&&document.querySelector('meta[property="csp-nonce"]');this._nonce=o?o.getAttribute("content"):null}var t,r=e.prototype;return r.setOptimizeForSpeed=function(e){d("boolean"==typeof e,"`setOptimizeForSpeed` accepts a boolean"),d(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=e,this.inject()},r.isOptimizeForSpeed=function(){return this._optimizeForSpeed},r.inject=function(){var e=this;if(d(!this._injected,"sheet already injected"),this._injected=!0,"u">typeof window&&this._optimizeForSpeed){this._tags[0]=this.makeStyleTag(this._name),this._optimizeForSpeed="insertRule"in this.getSheet(),this._optimizeForSpeed||(l||console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."),this.flush(),this._injected=!0);return}this._serverSheet={cssRules:[],insertRule:function(t,r){return"number"==typeof r?e._serverSheet.cssRules[r]={cssText:t}:e._serverSheet.cssRules.push({cssText:t}),r},deleteRule:function(t){e._serverSheet.cssRules[t]=null}}},r.getSheetForTag=function(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]},r.getSheet=function(){return this.getSheetForTag(this._tags[this._tags.length-1])},r.insertRule=function(e,t){if(d(i(e),"`insertRule` accepts only strings"),"u"<typeof window)return"number"!=typeof t&&(t=this._serverSheet.cssRules.length),this._serverSheet.insertRule(e,t),this._rulesCount++;if(this._optimizeForSpeed){var r=this.getSheet();"number"!=typeof t&&(t=r.cssRules.length);try{r.insertRule(e,t)}catch(t){return l||console.warn("StyleSheet: illegal rule: \n\n"+e+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),-1}}else{var a=this._tags[t];this._tags.push(this.makeStyleTag(this._name,e,a))}return this._rulesCount++},r.replaceRule=function(e,t){if(this._optimizeForSpeed||"u"<typeof window){var r="u">typeof window?this.getSheet():this._serverSheet;if(t.trim()||(t=this._deletedRulePlaceholder),!r.cssRules[e])return e;r.deleteRule(e);try{r.insertRule(t,e)}catch(a){l||console.warn("StyleSheet: illegal rule: \n\n"+t+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),r.insertRule(this._deletedRulePlaceholder,e)}}else{var a=this._tags[e];d(a,"old rule at index `"+e+"` not found"),a.textContent=t}return e},r.deleteRule=function(e){if("u"<typeof window)return void this._serverSheet.deleteRule(e);if(this._optimizeForSpeed)this.replaceRule(e,"");else{var t=this._tags[e];d(t,"rule at index `"+e+"` not found"),t.parentNode.removeChild(t),this._tags[e]=null}},r.flush=function(){this._injected=!1,this._rulesCount=0,"u">typeof window?(this._tags.forEach(function(e){return e&&e.parentNode.removeChild(e)}),this._tags=[]):this._serverSheet.cssRules=[]},r.cssRules=function(){var e=this;return"u"<typeof window?this._serverSheet.cssRules:this._tags.reduce(function(t,r){return r?t=t.concat(Array.prototype.map.call(e.getSheetForTag(r).cssRules,function(t){return t.cssText===e._deletedRulePlaceholder?null:t})):t.push(null),t},[])},r.makeStyleTag=function(e,t,r){t&&d(i(t),"makeStyleTag accepts only strings as second parameter");var a=document.createElement("style");this._nonce&&a.setAttribute("nonce",this._nonce),a.type="text/css",a.setAttribute("data-"+e,""),t&&a.appendChild(document.createTextNode(t));var s=document.head||document.getElementsByTagName("head")[0];return r?s.insertBefore(a,r):s.appendChild(a),a},t=[{key:"length",get:function(){return this._rulesCount}}],function(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}(e.prototype,t),e}();function d(e,t){if(!e)throw Error("StyleSheet: "+t+".")}var c=function(e){for(var t=5381,r=e.length;r;)t=33*t^e.charCodeAt(--r);return t>>>0},h={};function x(e,t){if(!t)return"jsx-"+e;var r=String(t),a=e+r;return h[a]||(h[a]="jsx-"+c(e+"-"+r)),h[a]}function u(e,t){"u"<typeof window&&(t=t.replace(/\/style/gi,"\\/style"));var r=e+t;return h[r]||(h[r]=t.replace(/__jsx-style-dynamic-selector/g,e)),h[r]}var m=function(){function e(e){var t=void 0===e?{}:e,r=t.styleSheet,a=void 0===r?null:r,s=t.optimizeForSpeed,n=void 0!==s&&s;this._sheet=a||new o({name:"styled-jsx",optimizeForSpeed:n}),this._sheet.inject(),a&&"boolean"==typeof n&&(this._sheet.setOptimizeForSpeed(n),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer=void 0,this._indices={},this._instancesCounts={}}var t=e.prototype;return t.add=function(e){var t=this;void 0===this._optimizeForSpeed&&(this._optimizeForSpeed=Array.isArray(e.children),this._sheet.setOptimizeForSpeed(this._optimizeForSpeed),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),"u">typeof window&&!this._fromServer&&(this._fromServer=this.selectFromServer(),this._instancesCounts=Object.keys(this._fromServer).reduce(function(e,t){return e[t]=0,e},{}));var r=this.getIdAndRules(e),a=r.styleId,s=r.rules;if(a in this._instancesCounts){this._instancesCounts[a]+=1;return}var n=s.map(function(e){return t._sheet.insertRule(e)}).filter(function(e){return -1!==e});this._indices[a]=n,this._instancesCounts[a]=1},t.remove=function(e){var t=this,r=this.getIdAndRules(e).styleId;if(function(e,t){if(!e)throw Error("StyleSheetRegistry: "+t+".")}(r in this._instancesCounts,"styleId: `"+r+"` not found"),this._instancesCounts[r]-=1,this._instancesCounts[r]<1){var a=this._fromServer&&this._fromServer[r];a?(a.parentNode.removeChild(a),delete this._fromServer[r]):(this._indices[r].forEach(function(e){return t._sheet.deleteRule(e)}),delete this._indices[r]),delete this._instancesCounts[r]}},t.update=function(e,t){this.add(t),this.remove(e)},t.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},t.cssRules=function(){var e=this,t=this._fromServer?Object.keys(this._fromServer).map(function(t){return[t,e._fromServer[t]]}):[],r=this._sheet.cssRules();return t.concat(Object.keys(this._indices).map(function(t){return[t,e._indices[t].map(function(e){return r[e].cssText}).join(e._optimizeForSpeed?"":"\n")]}).filter(function(e){return!!e[1]}))},t.styles=function(e){var t,r;return t=this.cssRules(),void 0===(r=e)&&(r={}),t.map(function(e){var t=e[0],a=e[1];return n.default.createElement("style",{id:"__"+t,key:"__"+t,nonce:r.nonce?r.nonce:void 0,dangerouslySetInnerHTML:{__html:a}})})},t.getIdAndRules=function(e){var t=e.children,r=e.dynamic,a=e.id;if(r){var s=x(a,r);return{styleId:s,rules:Array.isArray(t)?t.map(function(e){return u(s,e)}):[u(s,t)]}}return{styleId:x(a),rules:Array.isArray(t)?t:[t]}},t.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(e,t){return e[t.id.slice(2)]=t,e},{})},e}(),f=s.createContext(null);function p(){return new m}function g(){return s.useContext(f)}f.displayName="StyleSheetContext";var b=n.default.useInsertionEffect||n.default.useLayoutEffect,y="u">typeof window?p():void 0;function v(e){var t=y||g();return t&&("u"<typeof window?t.add(e):b(function(){return t.add(e),function(){t.remove(e)}},[e.id,String(e.dynamic)])),null}v.dynamic=function(e){return e.map(function(e){return x(e[0],e[1])}).join(" ")},r.StyleRegistry=function(e){var t=e.registry,r=e.children,a=s.useContext(f),l=s.useState(function(){return a||t||p()})[0];return n.default.createElement(f.Provider,{value:l},r)},r.createStyleRegistry=p,r.style=v,r.useStyleRegistry=g},6694,(e,t,r)=>{t.exports=e.r(7454).style},18722,e=>{"use strict";var t=e.i(20888),r=e.i(22381),a=e.i(23910),s=e.i(56839),n=e.i(3479);function l({online:e,working:t,total:a,version:s,uptime:n}){let o=a>0?Math.round(e/a*100):0,d=0===a;return(0,r.jsxs)("div",{className:d?"mb-4":"mb-8",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-3 mb-4",children:[(0,r.jsx)("h1",{className:"text-2xl font-bold text-white tracking-tight",children:"Agent Network"}),(0,r.jsxs)("span",{className:"text-xs text-gray-500",children:["CommHub ",s," · ",n]})]}),d?(0,r.jsxs)("div",{className:"anet-stat-strip flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-gray-500 border-t border-b border-[#2a2a4a] py-2",children:[(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,r.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full bg-gray-600"}),(0,r.jsx)("span",{className:"text-gray-300 tabular-nums",children:"0"})," online"]}),(0,r.jsx)("span",{className:"text-gray-700",children:"·"}),(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,r.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full bg-gray-600"}),(0,r.jsx)("span",{className:"text-gray-300 tabular-nums",children:"0"})," working"]}),(0,r.jsx)("span",{className:"text-gray-700",children:"·"}),(0,r.jsxs)("span",{className:"inline-flex items-center gap-1.5",children:[(0,r.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full bg-gray-600"}),(0,r.jsx)("span",{className:"text-gray-300 tabular-nums",children:"0"})," registered"]})]}):(0,r.jsxs)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3",children:[(0,r.jsx)(i,{value:e,label:"Online",sub:`${o}% of fleet`,color:"text-green-400",accent:"from-green-500/20 to-green-500/0",border:"border-green-500/15"}),(0,r.jsx)(i,{value:t,label:"Working",sub:e>0?`${Math.round(t/e*100)}% utilization`:"--",color:"text-cyan-400",accent:"from-cyan-500/20 to-cyan-500/0",border:"border-cyan-500/15"}),(0,r.jsx)(i,{value:a-e,label:"Offline",sub:a-e==0?"All systems go":`${a-e} disconnected`,color:"text-gray-400",accent:"from-gray-500/10 to-gray-500/0",border:"border-gray-500/15"}),(0,r.jsx)(i,{value:a,label:"Total",sub:"Registered nodes",color:"text-white",accent:"from-blue-500/15 to-blue-500/0",border:"border-blue-500/15"})]})]})}function i({value:e,label:t,sub:a,color:s,accent:n,border:l}){let o=s.replace("text-","").split("-")[0];return(0,r.jsxs)("div",{"data-anet-stat-card":o,className:`anet-stat-card relative overflow-hidden rounded-xl border ${l} bg-[#111128] px-4 py-3 transition-all`,children:[(0,r.jsx)("div",{className:`absolute inset-0 bg-gradient-to-br ${n} pointer-events-none`}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("div",{className:`text-3xl font-bold ${s} tabular-nums leading-tight`,children:e}),(0,r.jsx)("div",{className:"text-sm text-gray-300 mt-0.5",children:t}),(0,r.jsx)("div",{className:"text-xs text-gray-600 mt-1",children:a})]})]})}function o(){let[e,t]=(0,a.useState)(""),[s,n]=(0,a.useState)(!1),[l,i]=(0,a.useState)(""),o=async()=>{if(e.trim()){n(!0),i("");try{let r=await fetch("/api/hub/broadcast",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:e})}),a=await r.json();a.ok?(i(`Broadcast sent to ${a.recipients} node(s)`),t("")):i(`Failed: ${a.error||"Send error"}`)}catch(e){i(`Failed: ${e instanceof Error?e.message:"Send error"}`)}n(!1),setTimeout(()=>i(""),5e3)}};return(0,r.jsxs)("div",{className:"mb-6",children:[(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)("input",{type:"text",value:e,onChange:e=>t(e.target.value),onKeyDown:e=>"Enter"===e.key&&o(),placeholder:"Broadcast message to all online agents...",maxLength:500,"aria-label":"Broadcast message",className:"flex-1 bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-2.5 text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:ring-1 focus:ring-blue-500/20 focus:outline-none transition-colors"}),(0,r.jsx)("button",{onClick:o,disabled:s||!e.trim(),"aria-label":"Send broadcast",className:"flex items-center gap-2 px-5 py-2.5 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-all font-medium cursor-pointer disabled:cursor-not-allowed",children:s?(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4 animate-spin",viewBox:"0 0 24 24",fill:"none",children:[(0,r.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),(0,r.jsx)("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),(0,r.jsx)("span",{children:"Sending…"})]}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"M3 11v3a1 1 0 0 0 1 1h2l3.29 3.29a1 1 0 0 0 1.71-.71V7.42a1 1 0 0 0-1.71-.71L6 10H4a1 1 0 0 0-1 1Z"}),(0,r.jsx)("path",{d:"M16 8a5 5 0 0 1 0 6",opacity:"0.7"}),(0,r.jsx)("path",{d:"M19 5a9 9 0 0 1 0 12",opacity:"0.45"})]}),(0,r.jsx)("span",{children:"Broadcast"})]})})]}),e.length>0&&(0,r.jsxs)("div",{className:"text-right text-xs text-gray-600 mt-1 tabular-nums",children:[e.length,"/500"]}),l&&(0,r.jsx)("div",{className:`mt-3 text-sm text-center anet-fade-in ${l.startsWith("Failed")?"text-red-400":"text-green-400/80"}`,children:l})]})}var d=e.i(46228),c=e.i(43058);function h({alias:e,onClose:t}){let[s,n]=(0,a.useState)({x:0,y:0}),[l,i]=(0,a.useState)({w:380,h:520}),o=(0,a.useRef)({active:!1,startX:0,startY:0,baseX:0,baseY:0}),x=(0,a.useRef)({active:!1,startX:0,startY:0,baseW:0,baseH:0}),u=(0,a.useCallback)((e,t,r,a)=>({x:Math.min(Math.max(16,e),Math.max(16,window.innerWidth-r-16)),y:Math.min(Math.max(16,t),Math.max(16,window.innerHeight-a-16))}),[]);(0,a.useEffect)(()=>{let e=()=>{let e=window.innerWidth,t=window.innerHeight,r=Math.min(380,e-32),a=Math.min(520,t-96);i({w:r,h:a});let s=e<640;n(u(s?16:e-r-24,s?t-a-16:96,r,a))};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[u]),(0,a.useEffect)(()=>{let e=e=>{"Escape"===e.key&&t()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[t]);let m=e=>{if(o.current.active){o.current.active=!1;try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}},f=e=>{if(x.current.active){x.current.active=!1,e.stopPropagation();try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}};return(0,r.jsxs)("div",{className:"fixed z-50 flex flex-col overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg)] shadow-2xl shadow-black/60 anet-fade-in",style:{left:s.x,top:s.y,width:l.w,height:l.h},role:"dialog","aria-label":`Chat with ${e}`,children:[(0,r.jsxs)("div",{onPointerDown:e=>{0===e.button&&(e.currentTarget.setPointerCapture?.(e.pointerId),o.current={active:!0,startX:e.clientX,startY:e.clientY,baseX:s.x,baseY:s.y})},onPointerMove:e=>{let t=o.current;t.active&&n(u(t.baseX+(e.clientX-t.startX),t.baseY+(e.clientY-t.startY),l.w,l.h))},onPointerUp:m,onPointerCancel:m,className:"flex items-center justify-between px-3 py-2.5 border-b border-[var(--border)] bg-[var(--bg-secondary)] rounded-t-xl cursor-grab active:cursor-grabbing select-none touch-none",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2.5 min-w-0",children:[(0,r.jsx)(d.AliasAvatar,{alias:e,size:28}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("div",{className:"text-sm font-semibold text-[var(--fg)] truncate",children:e}),(0,r.jsx)("div",{className:"text-[10px] text-[var(--fg-muted)]",children:"Drag to move · Esc to close"})]})]}),(0,r.jsx)("button",{onClick:t,onPointerDown:e=>e.stopPropagation(),"aria-label":"Close chat",className:"text-[var(--fg-muted)] hover:text-[var(--fg)] p-1.5 rounded-lg hover:bg-[var(--bg-elevated)] shrink-0",children:(0,r.jsx)("svg",{className:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),(0,r.jsx)("div",{className:"flex-1 min-h-0",children:(0,r.jsx)(c.TaskChatPanel,{alias:e,onClose:t,inline:!0})}),(0,r.jsx)("div",{onPointerDown:e=>{0===e.button&&(e.stopPropagation(),e.currentTarget.setPointerCapture?.(e.pointerId),x.current={active:!0,startX:e.clientX,startY:e.clientY,baseW:l.w,baseH:l.h})},onPointerMove:e=>{let t=x.current;if(!t.active)return;e.stopPropagation();let r=Math.max(300,window.innerWidth-s.x-16),a=Math.max(320,window.innerHeight-s.y-16);i({w:Math.min(r,Math.max(300,t.baseW+(e.clientX-t.startX))),h:Math.min(a,Math.max(320,t.baseH+(e.clientY-t.startY)))})},onPointerUp:f,onPointerCancel:f,"aria-label":"Resize chat",className:"absolute bottom-0 right-0 w-5 h-5 cursor-nwse-resize touch-none z-10",style:{touchAction:"none"},children:(0,r.jsx)("svg",{className:"absolute bottom-0.5 right-0.5 w-3 h-3 text-[var(--fg-dim)]",viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round","aria-hidden":!0,children:(0,r.jsx)("path",{d:"M11 5L5 11M11 9L9 11"})})})]})}let x={id:"unknown",label:"Unknown vendor",mono:{bg:"hsl(220 10% 26%)",ring:"hsl(220 10% 46%)",text:"hsl(220 14% 82%)"},initial:"?",logo:null},u=[{test:e=>e.startsWith("intern"),vendor:{id:"intern",label:"书生 · 上海 AI 实验室",mono:{bg:"hsl(28 38% 24%)",ring:"hsl(32 45% 52%)",text:"hsl(34 60% 82%)"},initial:"书",logo:"/intern_avatar.png"}},{test:e=>e.startsWith("minimax"),vendor:{id:"minimax",label:"MiniMax",mono:{bg:"hsl(18 50% 26%)",ring:"hsl(18 65% 52%)",text:"hsl(20 80% 82%)"},initial:"M",logo:null}},{test:e=>e.startsWith("claude"),vendor:{id:"anthropic",label:"Anthropic",mono:{bg:"hsl(16 32% 26%)",ring:"hsl(16 48% 54%)",text:"hsl(18 60% 84%)"},initial:"A",logo:null}},{test:e=>e.startsWith("gpt")||e.startsWith("codex")||e.startsWith("o1")||e.startsWith("o3")||e.startsWith("o4"),vendor:{id:"openai",label:"OpenAI",mono:{bg:"hsl(165 26% 22%)",ring:"hsl(165 40% 44%)",text:"hsl(165 45% 80%)"},initial:"O",logo:null}}];function m(e){if(!e)return x;let t=e.toLowerCase();for(let e of u)if(e.test(t))return e.vendor;return x}let f={"claude-code-cli":{label:"Claude Code CLI",iconPath:"M4 5h16v14H4z M7 9l3 3-3 3 M13 15h4",color:"#a78bfa"},"codex-sdk":{label:"Codex SDK",iconPath:"M9 7l-5 5 5 5 M15 7l5 5-5 5",color:"#38bdf8"},"claude-agent-sdk":{label:"Claude Agent SDK",iconPath:"M4 7h16v10H4z M8 11h8 M8 14h5",color:"#34d399"},"http-api":{label:"HTTP API",iconPath:"M7 18a4 4 0 010-8 5 5 0 019.6-1.3A3.5 3.5 0 0118 18z",color:"#fbbf24"}};function p(e){return e?f[e]??null:null}function g(e,t,r,a=0){let s=t<=2?Math.PI:1.78*Math.PI,n=-Math.PI/2-s/2,l=t<=1?-Math.PI/2:n+s*e/(t-1)+a;return{x:500+r*Math.cos(l),y:330+r*Math.sin(l)}}function b(e,t,r=0){let a=(e.x+t.x)/2,s=(e.y+t.y)/2,n=t.x-e.x,l=t.y-e.y,i=Math.hypot(n,l)||1,o={x:a+-l/i*r,y:s+n/i*r};return`M${e.x},${e.y} Q${o.x},${o.y} ${t.x},${t.y}`}function y(e,t){return e.length>t?`${e.slice(0,t-1)}...`:e}let v={panelStops:["#0b1220","#080814","#101018"],radarStops:[{color:"#22d3ee",opacity:.18},{color:"#22c55e",opacity:.045},{color:"#020617",opacity:0}],arrowFill:"#67e8f9",ringStroke:"#164e63",spokeStroke:{active:"#22d3ee",idle:"#155e75"},flowEdge:"#67e8f9",flowPath:"#e0f2fe",flowParticle:"#fef08a",nodeFill:{online:"#020617",offline:"#080814"},labelBox:{fill:"#020617",stroke:"#1f2937"},legendBox:{fill:"#020617",stroke:"#1f2937"},legendText:"#94a3b8",legendHeadline:"#e5e7eb",legendAccent:"#67e8f9",containerBg:"#080814",containerBorder:"#2a2a4a",topRailGradient:"from-transparent via-cyan-400/70 to-transparent"},j={panelStops:["#f8fafc","#ffffff","#f1f5f9"],radarStops:[{color:"#10b981",opacity:.06},{color:"#3b82f6",opacity:.03},{color:"#ffffff",opacity:0}],arrowFill:"#10b981",ringStroke:"#cbd5e1",spokeStroke:{active:"#10b981",idle:"#cbd5e1"},flowEdge:"#10b981",flowPath:"#475569",flowParticle:"#f59e0b",nodeFill:{online:"#ffffff",offline:"#f8fafc"},labelBox:{fill:"#ffffff",stroke:"#e2e8f0"},legendBox:{fill:"#ffffff",stroke:"#e2e8f0"},legendText:"#475569",legendHeadline:"#0f172a",legendAccent:"#0d9488",containerBg:"#ffffff",containerBorder:"#e3e6eb",topRailGradient:"from-transparent via-emerald-500/40 to-transparent"};function w(e,t){let r=0;for(;r<e.length&&r<t.length&&e[r]===t[r];)r++;return e.slice(0,r)}function k(e){let t=e.length,r=e.map((e,t)=>t),a=e=>{for(;r[e]!==e;)r[e]=r[r[e]],e=r[e];return e},s=(e,t)=>{let s=a(e),n=a(t);s!==n&&(r[s]=n)},n={};for(let t of(e.forEach((e,t)=>{let r=e.project_dir?.trim();r&&(n[r]||=[]).push(t)}),Object.values(n)))for(let e=1;e<t.length;e++)s(t[0],t[e]);let l=e.map((e,t)=>t).sort((t,r)=>e[t].alias.localeCompare(e[r].alias));for(let t=0;t+1<l.length;t++)w(e[l[t]].alias,e[l[t+1]].alias).length>=2&&s(l[t],l[t+1]);let i={};for(let e=0;e<t;e++)(i[a(e)]||=[]).push(e);let o={};for(let t of Object.values(i)){let r;if(1===t.length)r=e[t[0]].alias;else{let a=new Set(t.map(t=>e[t].project_dir?.trim()).filter(Boolean));if(1===a.size){let e=[...a][0];r=e.split("/").filter(Boolean).pop()||e}else(r=t.map(t=>e[t].alias).reduce((e,t)=>w(e,t))).length<2&&(r=e[t[0]].alias)}for(let a of t)o[e[a].alias]=r}return o}function N(e,t){let r=new Map;return e.forEach(e=>{if(!t[e.from_alias]||!t[e.to_alias]||e.from_alias===e.to_alias)return;let a=`${e.from_alias}->${e.to_alias}`,s=r.get(a);r.set(a,{key:a,from:e.from_alias,to:e.to_alias,count:(s?.count||0)+1,content:s?.content||e.content})}),[...r.values()].slice(0,18)}function S({sessions:e,sseSessions:t,renameSignal:s}){let n="light"===function(){let[e,t]=(0,a.useState)("dark");return(0,a.useEffect)(()=>{let e=()=>{let e=document.documentElement.getAttribute("data-theme")||"cyber";t("light"===e||"mint"===e?"light":"dark")};e();let r=new MutationObserver(e);return r.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>r.disconnect()},[]),e}(),l=n?j:v,i="intern"===function(){let[e,t]=(0,a.useState)(null);return(0,a.useEffect)(()=>{try{let e=new URL(window.location.href).searchParams.get("brand");null!==e?""===e||"none"===e?(localStorage.removeItem("anet-brand"),t(null)):(localStorage.setItem("anet-brand",e),t(e)):t(localStorage.getItem("anet-brand"))}catch{}},[]),e}(),[o,c]=(0,a.useState)([]),[x,u]=(0,a.useState)("ring");(0,a.useEffect)(()=>{try{let e=localStorage.getItem("anet-topo-layout");("grid"===e||"ring"===e)&&u(e)}catch{}},[]);let f=()=>u(e=>{let t="ring"===e?"grid":"ring";try{localStorage.setItem("anet-topo-layout",t)}catch{}return t}),[w,_]=(0,a.useState)(.84);(0,a.useEffect)(()=>{try{let e=parseFloat(localStorage.getItem("anet-topo-nodescale")||"");(.7===e||.84===e||1===e)&&_(e)}catch{}},[]),(0,a.useEffect)(()=>{let e=async()=>{try{let e=await fetch("/api/hub/messages?limit=50");if(401===e.status)return void window.location.assign("/login");let t=await e.json();c(t.messages||[])}catch{}};e();let t=setInterval(e,5e3);return()=>clearInterval(t)},[]);let{onlineNodes:C,offlineNodes:M,nodePositions:z,flowLinks:$,activeAliases:P,groupKeys:E,groupBoxes:T}=(0,a.useMemo)(()=>{let r=e=>(e.network_id?t[`${e.network_id}:${e.alias}`]:void 0)??t[e.alias],a=(e,t)=>e.alias.localeCompare(t.alias),s=Date.now(),n=e.filter(e=>"offline"!==e.status||r(e)).sort(a),l=e.filter(e=>"offline"===e.status&&!r(e)&&!(e=>{if("offline"!==e.status||r(e)||!e.last_seen_at)return!1;let t=Date.parse(e.last_seen_at);return!Number.isNaN(t)&&s-t>864e5})(e)).sort(a),i={};if("grid"===x){let e=[...n,...l],t=k(e),r=Math.max(1,Math.ceil(Math.sqrt(e.length))),a=700/r,s=[];for(let r of e){let e=t[r.alias],a=s[s.length-1];a&&a.key===e?a.members.push(r):s.push({key:e,members:[r]})}let d=[],c=0,h=0;for(;h<s.length;)if(s[h].members.length>=2)d.push({members:s[h].members,startRow:c,centred:!1,isGroup:!0}),c+=Math.ceil(s[h].members.length/r),h++;else{let e=[];for(;h<s.length&&s[h].members.length<2;)e.push(s[h].members[0]),h++;d.push({members:e,startRow:c,centred:!0,isGroup:!1}),c+=Math.ceil(e.length/r)}let x=Math.min(100,404/Math.max(1,c));for(let e of d)e.members.forEach((t,s)=>{let n=Math.floor(s/r),l=s%r,o=Math.min(r,e.members.length-n*r),d=e.centred?(r-o)*a/2:0;i[t.alias]={x:150+d+(l+.5)*a,y:184+(e.startRow+n+.5)*x}});let u=N(o,i),m=new Set;u.forEach(e=>{m.add(e.from),m.add(e.to)});let f=Math.max(22,Math.min(44,.4*x)),p=Math.max(16,Math.min(32,.3*x)),g=d.filter(e=>e.isGroup).map(e=>{let r=e.members.map(e=>i[e.alias]).filter(Boolean),a=r.map(e=>e.x),s=r.map(e=>e.y),n=Math.min(...a),l=Math.min(...s);return{key:e.members.length?t[e.members[0].alias]:"",x:n-p,y:l-f,w:Math.max(...a)-n+2*p,h:Math.max(...s)-l+f+p}});return{onlineNodes:n,offlineNodes:l,nodePositions:i,flowLinks:u,activeAliases:m,groupKeys:t,groupBoxes:g}}let d=n.length>14,c=!d&&n.length>8,h=n.length;if(d){let e=Math.ceil(n.length/3),t=n.slice(0,e),r=n.slice(e,2*e),a=n.slice(2*e);t.forEach((e,r)=>{i[e.alias]=g(r,Math.max(t.length,1),145)});let s=t.length<=2?Math.PI:1.78*Math.PI,l=t.length>1?s/(t.length-1):0;r.forEach((e,t)=>{i[e.alias]=g(t,Math.max(r.length,1),215,l/2)}),a.forEach((e,t)=>{i[e.alias]=g(t,Math.max(a.length,1),285)}),h=a.length}else if(c){let e=Math.ceil(n.length/2),t=n.length-e,r=n.slice(0,e),a=n.slice(e);r.forEach((t,r)=>{i[t.alias]=g(r,Math.max(e,1),175)});let s=e<=2?Math.PI:1.78*Math.PI,l=e>1?s/(e-1):0;a.forEach((e,r)=>{i[e.alias]=g(r,Math.max(t,1),260,l/2)}),h=t}else n.forEach((e,t)=>{i[e.alias]=g(t,Math.max(n.length,1),220)});let u=h<=2?Math.PI:1.78*Math.PI,m=h>1?u/(h-1):0,f=h>0?m/2:0,p=325+6*Math.max(0,l.length-4);l.forEach((e,t)=>{i[e.alias]=g(t,Math.max(l.length,1),p,f)});let b=N(o,i),y=new Set;b.forEach(e=>{y.add(e.from),y.add(e.to)});let v=k([...n,...l]);return{onlineNodes:n,offlineNodes:l,nodePositions:i,flowLinks:b,activeAliases:y,groupKeys:v,groupBoxes:[]}},[o,e,t,x]),A=C.filter(e=>"working"===e.status).length,F=C.length+M.length>16,[L,R]=(0,a.useState)(null),B=(0,a.useRef)(null),I=(0,a.useRef)(null),[W,O]=(0,a.useState)({zoom:1,x:0,y:0}),H=(0,a.useRef)(W),D=(0,a.useRef)({active:!1,startX:0,startY:0,baseX:0,baseY:0}),[Y,X]=(0,a.useState)(!1),[U,G]=(0,a.useState)(null);(0,a.useEffect)(()=>{s&&s.from===U&&G(s.to)},[s]),(0,a.useEffect)(()=>{H.current=W},[W]),(0,a.useEffect)(()=>{try{let e=localStorage.getItem("anet-topo-view");if(e){let t=JSON.parse(e);"number"==typeof t?.zoom&&O({zoom:Math.min(4,Math.max(.5,t.zoom)),x:"number"==typeof t.x?t.x:0,y:"number"==typeof t.y?t.y:0})}}catch{}},[]),(0,a.useEffect)(()=>{try{localStorage.setItem("anet-topo-view",JSON.stringify(W))}catch{}},[W]),(0,a.useEffect)(()=>{let e=()=>X(document.fullscreenElement===B.current);return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[]),(0,a.useEffect)(()=>{let e=I.current;if(!e)return;let t=t=>{t.preventDefault();let r=e.getBoundingClientRect(),a=(t.clientX-r.left)/r.width*1e3,s=(t.clientY-r.top)/r.height*680;O(e=>{let r=Math.min(1.08,Math.max(.926,Math.exp(-(6e-4*t.deltaY)))),n=Math.min(4,Math.max(.5,e.zoom*r)),l=n/e.zoom;return{zoom:n,x:a-(a-e.x)*l,y:s-(s-e.y)*l}})};return e.addEventListener("wheel",t,{passive:!1}),()=>e.removeEventListener("wheel",t)},[]);let J=e=>{if(D.current.active){D.current.active=!1;try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}}},V=e=>{O(t=>{let r=Math.min(4,Math.max(.5,t.zoom*e)),a=r/t.zoom;return{zoom:r,x:500-(500-t.x)*a,y:340-(340-t.y)*a}})};return(0,r.jsxs)("section",{className:"w-full max-w-6xl mx-auto mb-8",children:[(0,r.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between mb-3 px-1",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-xs uppercase text-gray-600 tracking-wider",children:"Network Topology"}),(0,r.jsx)("h2",{className:"text-lg text-white font-semibold",children:"Command mesh"})]}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,r.jsxs)("div",{className:"inline-flex rounded-md border border-gray-500/25 overflow-hidden",role:"group","aria-label":"Topology layout",children:[(0,r.jsx)("button",{onClick:()=>{"ring"!==x&&f()},"aria-pressed":"ring"===x,className:`px-2.5 py-1 transition-colors ${"ring"===x?"bg-cyan-500/15 text-cyan-300":"text-gray-500 hover:text-gray-400"}`,children:"Ring"}),(0,r.jsx)("button",{onClick:()=>{"grid"!==x&&f()},"aria-pressed":"grid"===x,className:`px-2.5 py-1 border-l border-gray-500/25 transition-colors ${"grid"===x?"bg-cyan-500/15 text-cyan-300":"text-gray-500 hover:text-gray-400"}`,children:"Grid"})]}),(0,r.jsxs)("span",{className:"px-2.5 py-1 rounded-md bg-green-500/10 text-green-300 border border-green-500/20",children:[A," working"]}),(0,r.jsxs)("span",{className:"px-2.5 py-1 rounded-md bg-cyan-500/10 text-cyan-300 border border-cyan-500/20",children:[C.length," online"]}),(0,r.jsxs)("span",{className:"px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20",children:[$.length," active links"]})]})]}),(0,r.jsxs)("div",{ref:B,className:`relative overflow-hidden rounded-lg border shadow-2xl ${n?"shadow-zinc-900/5":"shadow-cyan-950/30"} ${Y?"flex items-center justify-center":""}`,style:{background:l.containerBg,borderColor:l.containerBorder},children:[(0,r.jsx)("div",{className:`absolute inset-x-0 top-0 h-px bg-gradient-to-r ${l.topRailGradient}`}),(0,r.jsxs)("svg",{ref:I,viewBox:"0 0 1000 680",className:"w-full h-auto block",preserveAspectRatio:"xMidYMid meet",onPointerDown:e=>{0===e.button&&(e.currentTarget.setPointerCapture?.(e.pointerId),D.current={active:!0,startX:e.clientX,startY:e.clientY,baseX:H.current.x,baseY:H.current.y})},onPointerMove:e=>{let t=D.current;if(!t.active)return;let r=I.current;if(!r)return;let a=r.getBoundingClientRect(),s=(e.clientX-t.startX)/a.width*1e3,n=(e.clientY-t.startY)/a.height*680;O(e=>({...e,x:t.baseX+s,y:t.baseY+n}))},onPointerUp:J,onPointerLeave:J,style:{cursor:"grab",touchAction:"none"},children:[(0,r.jsxs)("defs",{children:[(0,r.jsxs)("linearGradient",{id:"topo-panel",x1:"0",x2:"1",y1:"0",y2:"1",children:[(0,r.jsx)("stop",{offset:"0%",stopColor:l.panelStops[0]}),(0,r.jsx)("stop",{offset:"48%",stopColor:l.panelStops[1]}),(0,r.jsx)("stop",{offset:"100%",stopColor:l.panelStops[2]})]}),(0,r.jsxs)("radialGradient",{id:"topo-radar",cx:"50%",cy:"50%",r:"55%",children:[(0,r.jsx)("stop",{offset:"0%",stopColor:l.radarStops[0].color,stopOpacity:l.radarStops[0].opacity}),(0,r.jsx)("stop",{offset:"45%",stopColor:l.radarStops[1].color,stopOpacity:l.radarStops[1].opacity}),(0,r.jsx)("stop",{offset:"100%",stopColor:l.radarStops[2].color,stopOpacity:l.radarStops[2].opacity})]}),!n&&(0,r.jsxs)("filter",{id:"topo-glow",children:[(0,r.jsx)("feGaussianBlur",{stdDeviation:"4",result:"blur"}),(0,r.jsxs)("feMerge",{children:[(0,r.jsx)("feMergeNode",{in:"blur"}),(0,r.jsx)("feMergeNode",{in:"SourceGraphic"})]})]}),(0,r.jsx)("marker",{id:"topo-arrow",viewBox:"0 0 10 10",refX:"8",refY:"5",markerWidth:"5",markerHeight:"5",orient:"auto-start-reverse",children:(0,r.jsx)("path",{d:"M 0 0 L 10 5 L 0 10 z",fill:l.arrowFill})}),(0,r.jsxs)("radialGradient",{id:"topo-sweep",cx:"0%",cy:"50%",r:"100%",children:[(0,r.jsx)("stop",{offset:"0%",stopColor:n?"#0d9488":"#22d3ee",stopOpacity:n?.18:.32}),(0,r.jsx)("stop",{offset:"70%",stopColor:n?"#0d9488":"#22d3ee",stopOpacity:n?.1:.18}),(0,r.jsx)("stop",{offset:"100%",stopColor:n?"#0d9488":"#22d3ee",stopOpacity:"0"})]})]}),(0,r.jsx)("rect",{width:"1000",height:"680",fill:"url(#topo-panel)"}),(0,r.jsxs)("g",{transform:`translate(${W.x} ${W.y}) scale(${W.zoom})`,children:["ring"===x&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("circle",{cx:500,cy:330,r:"330",fill:"url(#topo-radar)"}),!n&&(0,r.jsx)("g",{opacity:"0.5",children:Array.from({length:28}).map((e,t)=>{let a=9301*t+49297;return(0,r.jsx)("circle",{cx:13*a%1e3,cy:7*a%680,r:t%3==0?1.2:.7,fill:"#a5b4fc",opacity:.35+t%4*.05},t)})}),(0,r.jsx)("g",{style:{transformOrigin:"500px 330px",transformBox:"view-box"},className:"anet-topo-sweep",opacity:n?.7:1,children:(0,r.jsx)("path",{d:`M 500 330 L 830 330 A 330 330 0 0 0 ${500+330*Math.cos(-Math.PI/4.5)} ${330+330*Math.sin(-Math.PI/4.5)} Z`,fill:"url(#topo-sweep)"})}),[90,170,250,330].map(e=>(0,r.jsx)("circle",{cx:500,cy:330,r:e,fill:"none",stroke:l.ringStroke,strokeWidth:"1",opacity:n?.6:.35},e)),!n&&[0,.25,.5,.75].map((e,t)=>(0,r.jsx)("g",{children:(0,r.jsx)("circle",{cx:830,cy:330,r:0===t?2.8:2.2,fill:"#22d3ee",opacity:.9,filter:"url(#topo-glow)",children:(0,r.jsx)("animateTransform",{attributeName:"transform",type:"rotate",from:`${360*e} 500 330`,to:`${360*e+360} 500 330`,dur:"16s",repeatCount:"indefinite"})})},`orbit-${t}`)),[0,30,60,90,120,150].map(e=>(0,r.jsx)("line",{x1:500-360*Math.cos(e*Math.PI/180),y1:330-360*Math.sin(e*Math.PI/180),x2:500+360*Math.cos(e*Math.PI/180),y2:330+360*Math.sin(e*Math.PI/180),stroke:l.ringStroke,strokeWidth:"1",opacity:n?.35:.18},e))]}),"ring"===x&&C.map((e,t)=>{let a=z[e.alias];if(!a)return null;let s=b({x:500,y:330},a,0),n=P.has(e.alias);return(0,r.jsx)("path",{d:s,fill:"none",stroke:n?l.spokeStroke.active:l.spokeStroke.idle,strokeWidth:n?2:1,strokeDasharray:n?"none":"6 14",opacity:n?.7:.45,className:n?void 0:"anet-topo-spoke-flow",style:n?void 0:{animationDelay:`${-(.25*t)}s`}},`hub-${e.alias}`)}),T.map(e=>(0,r.jsxs)("g",{"data-group":e.key,style:{pointerEvents:"none"},children:[(0,r.jsx)("rect",{x:e.x,y:e.y,width:e.w,height:e.h,rx:"14",fill:n?"#0f172a":"#a5b4fc",fillOpacity:n?.025:.045,stroke:l.ringStroke,strokeWidth:"1.5",strokeDasharray:"6 6"}),(0,r.jsx)("text",{x:e.x+12,y:e.y+21,fill:l.legendText,fontSize:"13",fontFamily:"monospace",fontWeight:"700",children:e.key})]},`grp-${e.key}`)),$.map((e,t)=>{let a=z[e.from],s=z[e.to];if(!a||!s)return null;let i=b(a,s,t%2==0?36:-36),o=Math.min(2+e.count,7);return(0,r.jsxs)("g",{children:[(0,r.jsx)("path",{d:i,fill:"none",stroke:l.flowEdge,strokeWidth:o,opacity:n?.22:.28,filter:n?void 0:"url(#topo-glow)",markerEnd:"url(#topo-arrow)"}),(0,r.jsx)("path",{id:`flow-path-${t}`,d:i,fill:"none",stroke:l.flowPath,strokeWidth:"1",strokeDasharray:"2 12",opacity:n?.4:.75}),(0,r.jsx)("circle",{r:"4",fill:l.flowParticle,filter:n?void 0:"url(#topo-glow)",children:(0,r.jsx)("animateMotion",{dur:`${2.2+t%5*.32}s`,repeatCount:"indefinite",path:i})})]},e.key)}),"ring"===x&&(0,r.jsxs)("g",{children:[(0,r.jsx)("circle",{cx:500,cy:330,r:"18",fill:n?"#d1fae5":"#10b981",opacity:n?.35:.1}),(0,r.jsxs)("circle",{cx:500,cy:330,r:"10",fill:"none",stroke:"#10b981",strokeWidth:"1.5",children:[(0,r.jsx)("animate",{attributeName:"r",values:"10;38;10",dur:"2.4s",repeatCount:"indefinite"}),(0,r.jsx)("animate",{attributeName:"opacity",values:"0.55;0;0.55",dur:"2.4s",repeatCount:"indefinite"})]}),(0,r.jsxs)("circle",{cx:500,cy:330,r:"10",fill:"none",stroke:"#10b981",strokeWidth:"1.5",opacity:"0",children:[(0,r.jsx)("animate",{attributeName:"r",values:"10;38;10",dur:"2.4s",begin:"1.2s",repeatCount:"indefinite"}),(0,r.jsx)("animate",{attributeName:"opacity",values:"0.45;0;0.45",dur:"2.4s",begin:"1.2s",repeatCount:"indefinite"})]}),(0,r.jsx)("circle",{cx:500,cy:330,r:"10",fill:n?"#059669":"#10b981"}),(0,r.jsx)("circle",{cx:500,cy:330,r:"5",fill:"#d1fae5",opacity:"0.9"})]}),[...C,...M].map(e=>{var a,s;let o,c,h,x=z[e.alias];if(!x)return null;let u=(e.network_id?t[`${e.network_id}:${e.alias}`]:void 0)??t[e.alias],f="offline"!==e.status||!!u,g=f?"working"===e.status?{label:"working",primary:n?"#059669":"#22c55e",halo:n?"#d1fae5":"#14532d",text:n?"#065f46":"#dcfce7"}:"idle"===e.status?{label:"idle",primary:n?"#0d9488":"#2dd4bf",halo:n?"#ccfbf1":"#134e4a",text:n?"#115e59":"#ccfbf1"}:{label:e.status||"online",primary:n?"#0284c7":"#38bdf8",halo:n?"#dbeafe":"#0c4a6e",text:n?"#0c4a6e":"#e0f2fe"}:{label:"offline",primary:n?"#94a3b8":"#6b7280",halo:n?"#e2e8f0":"#111827",text:n?"#475569":"#9ca3af"},b=P.has(e.alias),v=Math.round((f?26:18)*w),j=!F||L===e.alias||W.zoom>=1.4;return(0,r.jsxs)("g",{"data-node":e.alias,className:"transition-opacity",style:{cursor:"pointer"},onPointerDown:e=>e.stopPropagation(),onPointerEnter:()=>F&&R(e.alias),onPointerLeave:()=>F&&R(t=>t===e.alias?null:t),onClick:()=>G(e.alias),children:[(0,r.jsx)("title",{children:(a=e.model,s=e.runtime,o=m(a),c=p(s),h=[],"unknown"!==o.id&&h.push(o.label),a&&h.push(a),c&&h.push(c.label),h.join(" · ")||e.alias)}),b&&(0,r.jsxs)("circle",{cx:x.x,cy:x.y,r:v+14,fill:g.primary,opacity:n?.08:.12,children:[(0,r.jsx)("animate",{attributeName:"r",values:`${v+8};${v+22};${v+8}`,dur:"2.4s",repeatCount:"indefinite"}),(0,r.jsx)("animate",{attributeName:"opacity",values:n?"0.12;0.02;0.12":"0.18;0.04;0.18",dur:"2.4s",repeatCount:"indefinite"})]}),(0,r.jsx)("circle",{cx:x.x,cy:x.y,r:v+8,fill:g.halo,opacity:f?n?.85:.65:n?.4:.25}),(0,r.jsx)("circle",{cx:x.x,cy:x.y,r:v,fill:f?l.nodeFill.online:l.nodeFill.offline,stroke:g.primary,strokeWidth:f?3:1.5,strokeDasharray:f?"none":"5 5",filter:f&&!n?"url(#topo-glow)":void 0}),(()=>{let t=Math.round((f?14:10)*w),a=2*v,s=m(e.model),n=/书生|书小生|intern/i.test(e.alias);if(i||n||s.logo)return(0,r.jsx)("image",{href:s.logo??"/intern_avatar.png",x:x.x-a/2,y:x.y-a/2,width:a,height:a,preserveAspectRatio:"xMidYMid meet"});if("unknown"!==s.id)return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("circle",{cx:x.x,cy:x.y,r:t,fill:s.mono.bg,stroke:s.mono.ring,strokeWidth:"1"}),(0,r.jsx)("text",{x:x.x,y:x.y,dy:"0.34em",textAnchor:"middle",fill:s.mono.text,fontSize:t,fontFamily:"monospace",fontWeight:"700",children:s.initial})]});let l=(0,d.aliasAvatarColors)(E[e.alias]||e.alias);return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("circle",{cx:x.x,cy:x.y,r:t,fill:l.bg,stroke:l.ring,strokeWidth:"1"}),(0,r.jsx)("text",{x:x.x,y:x.y,dy:"0.34em",textAnchor:"middle",fill:l.text,fontSize:t,fontFamily:"monospace",fontWeight:"700",children:(0,d.aliasInitial)(e.alias)})]})})(),(()=>{let t=p(e.runtime);if(!t)return null;let a=f?7:5.5,s=x.x+.72*v,n=x.y+.72*v,i=2*a*.62;return(0,r.jsxs)("g",{style:{pointerEvents:"none"},children:[(0,r.jsx)("circle",{cx:s,cy:n,r:a,fill:l.containerBg,stroke:t.color,strokeWidth:"1.5"}),(0,r.jsx)("g",{transform:`translate(${s-i/2} ${n-i/2}) scale(${i/24})`,children:(0,r.jsx)("path",{d:t.iconPath,fill:"none",stroke:t.color,strokeWidth:"2.4",strokeLinecap:"round",strokeLinejoin:"round"})})]})})(),"working"===e.status&&(0,r.jsx)("circle",{cx:x.x,cy:x.y-(v-6),r:"2.5",fill:l.flowParticle,children:(0,r.jsx)("animate",{attributeName:"opacity",values:"1;0.25;1",dur:"1.1s",repeatCount:"indefinite"})}),j?(0,r.jsxs)("g",{transform:`translate(${x.x}, ${x.y+v+22})`,style:{pointerEvents:"none"},children:[(0,r.jsx)("rect",{x:"-50",y:"-14",width:"100",height:"42",rx:"6",fill:l.labelBox.fill,stroke:l.labelBox.stroke,opacity:n?1:.94}),(0,r.jsx)("text",{x:"0",y:"1",textAnchor:"middle",fill:g.text,fontSize:"12",fontFamily:"monospace",fontWeight:"700",children:y(e.alias,12)}),(0,r.jsxs)("text",{x:"0",y:"17",textAnchor:"middle",fill:g.primary,fontSize:"9",fontFamily:"monospace",children:[g.label,f&&null!=u?` sse:${u}`:""]})]}):(0,r.jsx)("text",{x:x.x,y:x.y+v+14,textAnchor:"middle",fill:g.text,fontSize:"10",fontFamily:"monospace",fontWeight:"700",opacity:.9,style:{pointerEvents:"none",paintOrder:"stroke"},stroke:l.containerBg,strokeWidth:"3",children:y(e.alias,10)})]},e.alias)})]}),(0,r.jsxs)("g",{transform:"translate(28, 34)",children:[(0,r.jsx)("rect",{x:"0",y:"0",width:"285",height:60+20*Math.min($.length,4),rx:"10",fill:l.legendBox.fill,stroke:l.legendBox.stroke,opacity:n?.97:.92}),(0,r.jsx)("text",{x:"16",y:"26",fill:l.legendHeadline,fontSize:"13",fontFamily:"monospace",fontWeight:"700",children:"recent signal"}),(0,r.jsxs)("text",{x:"178",y:"26",fill:l.legendAccent,fontSize:"11",fontFamily:"monospace",children:[o.length," messages"]}),$.slice(0,4).map((e,t)=>(0,r.jsxs)("text",{x:"16",y:54+20*t,fill:l.legendText,fontSize:"10",fontFamily:"monospace",children:[y(e.from,8)," ","->"," ",y(e.to,8)," / ",e.count," / ",y(e.content,18)]},e.key))]}),(0,r.jsxs)("g",{transform:"translate(720, 34)",children:[(0,r.jsx)("rect",{x:"0",y:"0",width:"250",height:"112",rx:"10",fill:l.legendBox.fill,stroke:l.legendBox.stroke,opacity:n?.97:.92}),(0,r.jsx)("circle",{cx:"18",cy:"26",r:"6",fill:n?"#059669":"#22c55e"}),(0,r.jsx)("text",{x:"34",y:"30",fill:l.legendText,fontSize:"11",fontFamily:"monospace",children:"working node"}),(0,r.jsx)("circle",{cx:"18",cy:"52",r:"6",fill:n?"#0d9488":"#2dd4bf"}),(0,r.jsx)("text",{x:"34",y:"56",fill:l.legendText,fontSize:"11",fontFamily:"monospace",children:"online idle"}),(0,r.jsx)("circle",{cx:"18",cy:"78",r:"6",fill:n?"#94a3b8":"#6b7280"}),(0,r.jsx)("text",{x:"34",y:"82",fill:l.legendText,fontSize:"11",fontFamily:"monospace",children:"offline / no SSE"}),(0,r.jsx)("path",{d:"M150,78 Q176,52 210,78",fill:"none",stroke:l.flowEdge,strokeWidth:"3",markerEnd:"url(#topo-arrow)"})]})]}),(0,r.jsxs)("div",{className:"absolute bottom-3 right-3 flex items-center gap-1.5 text-xs select-none",children:[(0,r.jsx)("div",{className:"flex items-center rounded-md border overflow-hidden",style:{background:l.legendBox.fill,borderColor:l.containerBorder},role:"group","aria-label":"Node size",children:[["S",.7],["M",.84],["L",1]].map(([e,t],a)=>(0,r.jsx)("button",{onClick:()=>(e=>{_(e);try{localStorage.setItem("anet-topo-nodescale",String(e))}catch{}})(t),"aria-pressed":w===t,title:`Node size: ${"S"===e?"small":"M"===e?"medium":"large"}`,className:`px-2 py-1 transition-colors ${a>0?"border-l":""} ${w===t?"bg-cyan-500/15 text-cyan-300":"hover:bg-white/5"}`,style:{color:w===t?void 0:l.legendText,borderColor:l.containerBorder},children:e},e))}),(0,r.jsxs)("div",{className:"flex items-center rounded-md border overflow-hidden",style:{background:l.legendBox.fill,borderColor:l.containerBorder},children:[(0,r.jsx)("button",{onClick:()=>V(1/1.2),className:"px-2 py-1 hover:bg-white/5 transition-colors",style:{color:l.legendText},"aria-label":"Zoom out",children:(0,r.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:(0,r.jsx)("path",{d:"M5 12h14"})})}),(0,r.jsxs)("span",{className:"px-2 py-1 tabular-nums border-x text-center",style:{color:l.legendText,borderColor:l.containerBorder,minWidth:46},title:"Current zoom level",children:[Math.round(100*W.zoom),"%"]}),(0,r.jsx)("button",{onClick:()=>V(1.2),className:"px-2 py-1 hover:bg-white/5 transition-colors",style:{color:l.legendText},"aria-label":"Zoom in",children:(0,r.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round","aria-hidden":!0,children:(0,r.jsx)("path",{d:"M12 5v14M5 12h14"})})})]}),(0,r.jsx)("button",{onClick:()=>O({zoom:1,x:0,y:0}),className:"p-1.5 rounded-md border hover:bg-white/5 transition-colors",style:{background:l.legendBox.fill,borderColor:l.containerBorder,color:l.legendText},"aria-label":"Reset view",title:"Reset zoom + pan (or double-click the canvas)",children:(0,r.jsxs)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[(0,r.jsx)("path",{d:"M3 12a9 9 0 1 0 9-9 9 9 0 0 0-6.4 2.6L3 8"}),(0,r.jsx)("path",{d:"M3 3v5h5"})]})}),(0,r.jsx)("button",{onClick:()=>{let e=B.current;if(e)if(document.fullscreenElement)document.exitFullscreen?.();else{let t=e.requestFullscreen||e.webkitRequestFullscreen;t?.call(e)}},className:"p-1.5 rounded-md border hover:bg-white/5 transition-colors",style:{background:l.legendBox.fill,borderColor:l.containerBorder,color:l.legendText},"aria-label":Y?"Exit fullscreen":"Enter fullscreen",title:Y?"Exit fullscreen":"Fullscreen",children:Y?(0,r.jsx)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:(0,r.jsx)("path",{d:"M8 3v4a1 1 0 0 1-1 1H3M21 8h-4a1 1 0 0 1-1-1V3M3 16h4a1 1 0 0 1 1 1v4M16 21v-4a1 1 0 0 1 1-1h4"})}):(0,r.jsx)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:(0,r.jsx)("path",{d:"M3 8V5a2 2 0 0 1 2-2h3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M21 16v3a2 2 0 0 1-2 2h-3"})})})]}),U&&(0,r.jsx)(h,{alias:U,onClose:()=>G(null)})]})]})}let _={working:{bg:"bg-green-900/30 border-green-800/30",text:"text-green-300",dot:"bg-green-500",glow:"shadow-green-500/10"},idle:{bg:"bg-cyan-900/30 border-cyan-800/30",text:"text-cyan-300",dot:"bg-cyan-400",glow:"shadow-cyan-500/5"},blocked:{bg:"bg-yellow-900/30 border-yellow-800/30",text:"text-yellow-300",dot:"bg-yellow-500",glow:""},error:{bg:"bg-red-900/30 border-red-800/30",text:"text-red-300",dot:"bg-red-500",glow:""}},C={bg:"bg-gray-800/50 border-gray-700/30",text:"text-gray-500",dot:"bg-gray-500",glow:""};function M({session:e,hasSse:t,sseCount:a,onChat:l}){let i=t&&_[e.status]||C;return(0,r.jsxs)(s.default,{href:`/node?alias=${encodeURIComponent(e.alias)}`,prefetch:!1,className:`anet-agent-card group relative block rounded-xl border p-4 transition-all duration-300 cursor-pointer hover:-translate-y-0.5 ${t?`bg-[#111128] border-[#2a2a4a] hover:border-cyan-500/30 hover:shadow-lg ${i.glow}`:"bg-[#0d0d1a] border-[#1a1a2a] opacity-40"}`,children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,r.jsx)(d.AliasAvatar,{alias:e.alias,size:22}),(0,r.jsx)("span",{className:"font-semibold text-white truncate text-sm",title:e.alias,children:e.alias}),(0,r.jsx)("span",{className:`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${i.dot} ${t&&"working"===e.status?"animate-pulse":""}`})]}),(0,r.jsx)("span",{className:`text-[11px] px-2 py-0.5 rounded-md border shrink-0 ${i.bg} ${i.text}`,children:t?e.status:"offline"})]}),(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,r.jsx)("span",{className:"text-xs text-gray-600 bg-[#0a0a15] px-2 py-0.5 rounded border border-[#1a1a2a]",children:e.agent||"unknown"}),t&&(0,r.jsxs)("span",{className:"text-[10px] text-green-500",children:["SSE:",a]})]}),e.task?(0,r.jsx)("div",{className:"text-xs text-gray-400 bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a] line-clamp-2",title:e.task,children:e.task}):(0,r.jsx)("div",{className:"text-xs text-gray-700 italic",children:"No active task"}),e.progress>0&&(0,r.jsxs)("div",{className:"mt-3",children:[(0,r.jsxs)("div",{className:"flex justify-between text-[10px] mb-1",children:[(0,r.jsx)("span",{className:"text-gray-600",children:"Progress"}),(0,r.jsxs)("span",{className:i.text,children:[e.progress,"%"]})]}),(0,r.jsx)("div",{className:"w-full bg-gray-800 rounded-full h-1.5 overflow-hidden",children:(0,r.jsx)("div",{className:`h-1.5 rounded-full transition-all duration-700 ${"working"===e.status?"bg-green-500":"bg-cyan-500"}`,style:{width:`${Math.min(e.progress,100)}%`}})})]}),(0,r.jsxs)("div",{className:"mt-3 flex justify-between items-center text-[10px] text-gray-600",children:[(0,r.jsx)("span",{className:"truncate",title:e.server||"",children:e.server||"--"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[l&&t&&(0,r.jsx)("button",{onClick:t=>{t.preventDefault(),t.stopPropagation(),l(e.alias)},className:"text-cyan-400 hover:text-cyan-300 px-1.5 py-0.5 rounded border border-cyan-500/20 hover:bg-cyan-500/10 transition-colors",children:"Chat"}),(0,r.jsx)("span",{children:(0,n.timeAgo)(e.updated_at)}),(0,r.jsx)("svg",{"aria-hidden":!0,className:"w-3 h-3 text-gray-700 opacity-0 -translate-x-1 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-200",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,r.jsx)("path",{d:"M9 18l6-6-6-6"})})]})]})]})}function z({messages:e}){return 0===e.length?null:(0,r.jsxs)("div",{className:"mt-8",children:[(0,r.jsxs)("h2",{className:"text-lg font-semibold text-white mb-3 flex items-center gap-2",children:[(0,r.jsx)("span",{className:"text-gray-500",children:"Inbox"}),(0,r.jsx)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30",children:e.length})]}),(0,r.jsx)("div",{className:"space-y-2 max-h-96 overflow-y-auto pr-1 scrollbar-thin",children:e.map(e=>(0,r.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-3 text-sm transition-colors hover:border-[#3a3a5a]",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs mb-1.5",children:[e.from_session&&(0,r.jsx)(d.AliasAvatar,{alias:e.from_session,size:16}),(0,r.jsx)("span",{className:"text-gray-200 font-medium truncate",children:e.from_session}),(0,r.jsx)("span",{className:"ml-auto text-gray-600 shrink-0",title:e.created_at,children:(0,n.timeAgo)(e.created_at)})]}),(0,r.jsx)("div",{className:"text-gray-300 leading-relaxed line-clamp-3",title:e.content||"",children:(0,n.previewContent)(e.content)})]},e.id))})]})}function $(){return(0,r.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,r.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3 mb-8 anet-skeleton-pulse",children:[1,2,3,4].map(e=>(0,r.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] px-4 py-3",children:[(0,r.jsx)(P,{w:"2.5rem",h:"1.75rem"}),(0,r.jsx)(P,{w:"3.5rem",h:"0.75rem",className:"mt-2"}),(0,r.jsx)(P,{w:"5rem",h:"0.625rem",className:"mt-1"})]},e))}),(0,r.jsxs)("div",{className:"flex items-center gap-3 mb-3 anet-skeleton-pulse",children:[(0,r.jsx)(P,{w:"6rem",h:"2.5rem",rounded:"0.75rem"}),(0,r.jsxs)("div",{className:"flex-1 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-2.5 flex items-center gap-3",children:[(0,r.jsx)("div",{className:"w-8 h-8 rounded-full anet-skeleton-bar"}),(0,r.jsxs)("div",{className:"flex-1",children:[(0,r.jsx)(P,{w:"6rem",h:"0.875rem"}),(0,r.jsx)(P,{w:"10rem",h:"0.625rem",className:"mt-1"})]})]})]}),(0,r.jsx)("div",{className:"mb-6 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 anet-skeleton-pulse",children:(0,r.jsx)(P,{w:"14rem",h:"0.875rem"})}),(0,r.jsx)("div",{className:"grid grid-cols-3 gap-2 sm:gap-3 mb-3 anet-skeleton-pulse",children:[1,2,3].map(e=>(0,r.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] px-3 py-3",children:[(0,r.jsx)(P,{w:"2rem",h:"1.25rem"}),(0,r.jsx)(P,{w:"2.5rem",h:"0.75rem",className:"mt-1"}),(0,r.jsx)(P,{w:"3.5rem",h:"0.625rem",className:"mt-px"})]},e))}),(0,r.jsx)("div",{className:"grid grid-cols-3 gap-2 sm:gap-3 mb-6 anet-skeleton-pulse",children:[1,2,3].map(e=>(0,r.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] px-3 py-2.5 flex items-center justify-center gap-2",children:[(0,r.jsx)("div",{className:"w-4 h-4 rounded anet-skeleton-bar"}),(0,r.jsx)(P,{w:"4rem",h:"0.75rem"})]},e))}),(0,r.jsxs)("div",{className:"mb-6 flex gap-2 anet-skeleton-pulse",children:[(0,r.jsx)("div",{className:"flex-1 h-10 rounded-lg border border-[#2a2a4a] bg-[#111128]"}),(0,r.jsx)("div",{className:"w-28 h-10 rounded-lg anet-skeleton-bar"})]}),(0,r.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-3 sm:gap-4 anet-skeleton-pulse",children:[1,2,3,4].map(e=>(0,r.jsxs)("div",{className:"rounded-xl border border-[#2a2a4a] bg-[#111128] p-4",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,r.jsx)("div",{className:"w-2 h-2 rounded-full anet-skeleton-bar"}),(0,r.jsx)(P,{w:"6rem",h:"0.875rem"})]}),(0,r.jsxs)("div",{className:"space-y-2",children:[(0,r.jsx)(P,{w:"100%",h:"0.625rem"}),(0,r.jsx)(P,{w:"75%",h:"0.625rem"}),(0,r.jsx)(P,{w:"55%",h:"0.625rem"})]})]},e))})]})}function P({w:e,h:t,rounded:a,className:s}){return(0,r.jsx)("div",{className:`anet-skeleton-bar ${s||""}`,style:{width:e,height:t,borderRadius:a||"0.375rem"}})}var E=e.i(76161),T=e.i(98025),A=e.i(11449);function F(){let{setNetworkId:e}=(0,A.useNetworkId)(),[t,s]=(0,a.useState)({user:null,networks:[],currentNetwork:"",token:""}),[n,l]=(0,a.useState)(!1),[i,o]=(0,a.useState)(""),[d,c]=(0,a.useState)(""),[h,x]=(0,a.useState)(""),[u,m]=(0,a.useState)(!1);(0,a.useEffect)(()=>{let e=sessionStorage.getItem("anet_v3_auth");if(e)try{s(JSON.parse(e))}catch{}},[]);let[f,p]=(0,a.useState)(!1),[g,b]=(0,a.useState)(""),[y,v]=(0,a.useState)(""),j=async()=>{try{await fetch(`/api/hub/auth?token=${t.token}&endpoint=/api/auth/me`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"update_profile",token:t.token,display_name:g,email:y})});let e=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"update_profile",token:t.token,display_name:g,email:y})}),r=await e.json();if(r.ok&&r.user){let e={...t,user:r.user};s(e),sessionStorage.setItem("anet_v3_auth",JSON.stringify(e)),p(!1)}}catch{}};if(!t.user)return null;let w=(t.user.display_name||t.user.username).slice(0,2).toUpperCase();return(0,r.jsxs)("div",{className:"flex items-center justify-between bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-2.5 mb-4",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:"w-8 h-8 rounded-full bg-gradient-to-br from-cyan-500 to-blue-600 flex items-center justify-center text-xs font-bold text-white",children:w}),(0,r.jsxs)("div",{children:[(0,r.jsx)("div",{className:"text-sm text-white font-medium",children:t.user.display_name||t.user.username}),(0,r.jsxs)("div",{className:"text-[10px] text-gray-500",children:[t.user.role," · ",t.user.user_id]})]})]}),(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[t.networks.length>0&&(0,r.jsx)("select",{value:t.currentNetwork,onChange:r=>{let a={...t,currentNetwork:r.target.value};s(a),e(r.target.value),sessionStorage.setItem("anet_v3_auth",JSON.stringify(a))},className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white focus:outline-none",children:t.networks.map(e=>(0,r.jsx)("option",{value:e.network_id,children:e.network_name},e.network_id))}),(0,r.jsxs)("button",{onClick:()=>{b(t.user?.display_name||""),v(""),p(!f)},className:"text-xs text-gray-500 hover:text-gray-300 whitespace-nowrap","aria-label":"Edit profile",children:[(0,r.jsx)("span",{className:"hidden sm:inline",children:"Edit"}),(0,r.jsx)("svg",{className:"sm:hidden w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.862 4.487z"})})]}),(0,r.jsxs)("button",{onClick:()=>{s({user:null,networks:[],currentNetwork:"",token:""}),sessionStorage.removeItem("anet_v3_auth")},className:"text-xs text-gray-500 hover:text-gray-300 whitespace-nowrap","aria-label":"Sign out",children:[(0,r.jsx)("span",{className:"hidden sm:inline",children:"Sign out"}),(0,r.jsx)("svg",{className:"sm:hidden w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9"})})]})]}),f&&(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 mt-2 pt-2 border-t border-[#2a2a4a]",children:[(0,r.jsx)("input",{type:"text",value:g,onChange:e=>b(e.target.value),placeholder:"Display name",className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white placeholder-gray-600 focus:outline-none w-32"}),(0,r.jsx)("input",{type:"email",value:y,onChange:e=>v(e.target.value),placeholder:"Email",className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white placeholder-gray-600 focus:outline-none w-40"}),(0,r.jsx)("button",{onClick:j,className:"px-2 py-1 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded",children:"Save"})]})]})}var L=e.i(6694);function R({tabs:e,activeTab:t,onOpenTab:a,onCloseTab:s,onSetActive:n,onClose:l}){return 0===e.length?null:(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{onClick:l,className:"jsx-f7cf3d1a6fdfc074 fixed inset-0 bg-black/30 z-40 lg:hidden"}),(0,r.jsxs)("div",{className:"jsx-f7cf3d1a6fdfc074 fixed top-0 right-0 h-full w-full lg:w-[500px] bg-[#0a0a1a] border-l border-[#2a2a4a] z-50 flex flex-col shadow-2xl shadow-black/60 animate-slide-in",children:[(0,r.jsxs)("div",{className:"jsx-f7cf3d1a6fdfc074 flex items-center border-b border-[#2a2a4a] bg-[#0d0d1a] overflow-x-auto",children:[(0,r.jsx)("div",{className:"jsx-f7cf3d1a6fdfc074 flex-1 flex min-w-0",children:e.map(e=>(0,r.jsxs)("button",{onClick:()=>n(e),className:`jsx-f7cf3d1a6fdfc074 flex items-center gap-1.5 px-3 py-2.5 text-xs border-b-2 transition-colors shrink-0 ${t===e?"border-cyan-400 text-cyan-300 bg-cyan-500/5":"border-transparent text-gray-500 hover:text-gray-300"}`,children:[(0,r.jsx)("div",{className:`jsx-f7cf3d1a6fdfc074 w-2 h-2 rounded-full ${t===e?"bg-cyan-400":"bg-gray-600"}`}),(0,r.jsx)("span",{className:"jsx-f7cf3d1a6fdfc074 max-w-[80px] truncate",children:e}),(0,r.jsx)("button",{onClick:t=>{t.stopPropagation(),s(e)},className:"jsx-f7cf3d1a6fdfc074 ml-1 text-gray-600 hover:text-gray-300 p-0.5",children:"×"})]},e))}),(0,r.jsx)("button",{onClick:l,className:"jsx-f7cf3d1a6fdfc074 text-gray-500 hover:text-white px-3 py-2.5 shrink-0 border-l border-[#2a2a4a]",children:(0,r.jsx)("svg",{fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,className:"jsx-f7cf3d1a6fdfc074 w-4 h-4",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12",className:"jsx-f7cf3d1a6fdfc074"})})})]}),(0,r.jsx)("div",{className:"jsx-f7cf3d1a6fdfc074 flex-1 relative overflow-hidden",children:e.map(e=>(0,r.jsx)("div",{className:`jsx-f7cf3d1a6fdfc074 absolute inset-0 ${t===e?"block":"hidden"}`,children:(0,r.jsx)(B,{alias:e})},e))})]}),(0,r.jsx)(L.default,{id:"f7cf3d1a6fdfc074",children:"@keyframes slide-in{0%{transform:translate(100%)}to{transform:translate(0)}}.animate-slide-in{animation:.2s ease-out slide-in}"})]})}function B({alias:e}){return(0,r.jsx)(c.TaskChatPanel,{alias:e,onClose:()=>{},inline:!0})}function I({sessions:e,onClose:t}){let[s,n]=(0,a.useState)(new Set),[l,i]=(0,a.useState)(""),[o,c]=(0,a.useState)("normal"),[h,x]=(0,a.useState)(!1),[u,m]=(0,a.useState)([]),[f,p]=(0,a.useState)(""),g=e.filter(e=>"offline"!==e.status).filter(e=>!f||e.alias.toLowerCase().includes(f.toLowerCase())||(e.agent||"").toLowerCase().includes(f.toLowerCase())),b=async()=>{if(!l.trim()||0===s.size||h)return;x(!0),m([]);let e=[...s].map(async e=>{try{let t=await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:e,task:l,priority:o})}),r=await t.json();return{alias:e,ok:!!r.ok,error:r.error}}catch(t){return{alias:e,ok:!1,error:"send failed"}}});m(await Promise.all(e)),x(!1)},y=u.filter(e=>e.ok).length;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"fixed inset-0 bg-black/50 z-40 anet-fade-in",onClick:t}),(0,r.jsxs)("div",{className:"fixed inset-4 lg:inset-x-[15%] lg:inset-y-[5%] bg-[#0a0a1a] border border-[#2a2a4a] rounded-2xl z-50 flex flex-col shadow-2xl shadow-black/70 overflow-hidden anet-fade-in",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between px-6 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a]",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("h2",{className:"text-lg font-bold text-white",children:"Dispatch Task"}),(0,r.jsx)("p",{className:"text-xs text-gray-500 mt-0.5",children:"Send a task to one or more agents"})]}),(0,r.jsx)("button",{onClick:t,className:"text-gray-500 hover:text-white p-1.5 rounded-lg hover:bg-[#1a1a2a]",children:(0,r.jsx)("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),(0,r.jsxs)("div",{className:"flex-1 flex flex-col lg:flex-row overflow-hidden",children:[(0,r.jsxs)("div",{className:"lg:w-[280px] border-b lg:border-b-0 lg:border-r border-[#2a2a4a] flex flex-col",children:[(0,r.jsxs)("div",{className:"px-4 py-3 border-b border-[#2a2a4a]",children:[(0,r.jsx)("input",{type:"text",value:f,onChange:e=>p(e.target.value),placeholder:"Filter agents...",className:"w-full bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none"}),(0,r.jsxs)("div",{className:"flex items-center justify-between mt-2",children:[(0,r.jsx)("button",{onClick:()=>{s.size===g.length?n(new Set):n(new Set(g.map(e=>e.alias)))},className:"text-[10px] text-cyan-400 hover:text-cyan-300",children:s.size===g.length?"Deselect all":`Select all (${g.length})`}),(0,r.jsxs)("span",{className:"text-[10px] text-gray-600",children:[s.size," selected"]})]})]}),(0,r.jsxs)("div",{className:"flex-1 overflow-y-auto px-2 py-2 space-y-0.5 max-h-[200px] lg:max-h-none",children:[g.map(e=>(0,r.jsxs)("button",{onClick:()=>{var t;return t=e.alias,void n(e=>{let r=new Set(e);return r.has(t)?r.delete(t):r.add(t),r})},className:`w-full flex items-center gap-2 px-3 py-2 rounded-lg text-xs text-left transition-colors ${s.has(e.alias)?"bg-cyan-500/10 text-cyan-300 border border-cyan-500/20":"text-gray-400 hover:bg-[#1a1a2a]"}`,children:[(0,r.jsx)(d.AliasAvatar,{alias:e.alias,size:16}),(0,r.jsx)("div",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${"working"===e.status?"bg-green-400":"idle"===e.status?"bg-cyan-400":"bg-gray-500"}`}),(0,r.jsx)("span",{className:"truncate flex-1",children:e.alias}),(0,r.jsx)("span",{className:"text-[9px] text-gray-600",children:e.agent||"--"})]},e.alias)),0===g.length&&(0,r.jsx)("div",{className:"text-center text-xs text-gray-600 py-4",children:"No online agents"})]})]}),(0,r.jsxs)("div",{className:"flex-1 flex flex-col",children:[(0,r.jsxs)("div",{className:"flex-1 px-6 py-4 flex flex-col",children:[(0,r.jsx)("label",{className:"text-xs text-gray-500 uppercase mb-2",children:"Task Prompt"}),(0,r.jsx)("textarea",{value:l,onChange:e=>i(e.target.value),placeholder:"Enter the task you want to dispatch...",className:"flex-1 min-h-[120px] bg-[#111128] border border-[#2a2a4a] rounded-xl px-4 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none resize-none"}),(0,r.jsxs)("div",{className:"flex items-center gap-3 mt-4",children:[(0,r.jsxs)("select",{value:o,onChange:e=>c(e.target.value),className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-xs text-white focus:outline-none",children:[(0,r.jsx)("option",{value:"normal",children:"Normal priority"}),(0,r.jsx)("option",{value:"high",children:"High priority"}),(0,r.jsx)("option",{value:"low",children:"Low priority"})]}),(0,r.jsx)("div",{className:"flex-1"}),(0,r.jsx)("button",{onClick:b,disabled:h||!l.trim()||0===s.size,className:"px-6 py-2.5 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-xl transition-all shadow-lg shadow-cyan-500/10 disabled:shadow-none active:scale-95",children:h?(0,r.jsxs)("span",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"w-4 h-4 border-2 border-white/30 border-t-white rounded-full animate-spin"}),"Sending..."]}):`Dispatch to ${s.size} agent${s.size>1?"s":""}`})]})]}),u.length>0&&(0,r.jsxs)("div",{className:"px-6 py-3 border-t border-[#2a2a4a] bg-[#0d0d1a]",children:[(0,r.jsxs)("div",{className:"text-xs text-gray-500 mb-2",children:[y,"/",u.length," dispatched successfully"]}),(0,r.jsx)("div",{className:"flex flex-wrap gap-1.5",children:u.map(e=>(0,r.jsxs)("span",{className:`flex items-center gap-1.5 text-[10px] pl-1 pr-2 py-0.5 rounded-full border ${e.ok?"text-green-300 border-green-500/20 bg-green-500/5":"text-red-300 border-red-500/20 bg-red-500/5"}`,children:[(0,r.jsx)(d.AliasAvatar,{alias:e.alias,size:14}),(0,r.jsx)("span",{children:e.alias}),(0,r.jsx)("span",{"aria-hidden":!0,children:e.ok?"✓":e.error||"✗"})]},e.alias))})]})]})]})]})]})}var W=e.i(59276),O=e.i(2684),H=e.i(50111);e.s(["default",0,function(){let e,i,c,h,x;(0,a.useEffect)(()=>{sessionStorage.getItem("anet_v3_auth")||(fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),window.location.assign("/login"))},[]);let{sessions:u,hint:m,error:f,isLoading:p}=(0,W.useSessions)(),{health:g}=(0,W.useHealth)(),{config:b}=(0,W.useAnetConfig)(),{tasks:y}=(0,W.useTasks)({limit:"500"}),{stats:v}=(0,W.useStats)(),[j,w]=(0,a.useState)(window.innerWidth>=1024),[k,N]=(0,a.useState)(!1),_=function(){let[e,t]=(0,a.useState)([]),[r,s]=(0,a.useState)("");return{tabs:e,activeTab:r,openTab:e=>{t(t=>t.includes(e)?t:[...t,e]),s(e)},closeTab:e=>{t(t=>{let a=t.filter(t=>t!==e);return r===e&&s(a[a.length-1]||""),a})},closeAll:()=>{t([]),s("")},setActiveTab:s}}(),[C,P]=(0,a.useState)(!1),[A,L]=(0,a.useState)([]),[B,D]=(0,a.useState)("all"),[Y,X]=(0,a.useState)(null),{mutate:U}=(0,H.useSWRConfig)(),G="1"!==t.default.env.NEXT_PUBLIC_DISABLE_SSE,{connected:J,supported:V}=(0,O.useSSE)({url:"/api/hub/events",enabled:G,onEvent:e=>{if("node.renamed"===e.type){U("/api/hub/status");let t=e.data;t?.old_alias&&t?.new_alias&&X({from:t.old_alias,to:t.new_alias,ts:Date.now()});return}["new_task","new_message","new_reply","node_status_changed","broadcast"].includes(e.type)&&(U("/api/hub/status"),U(e=>"string"==typeof e&&e.startsWith("/api/hub/tasks"),void 0,{revalidate:!0}))}});if((0,a.useEffect)(()=>{let e=()=>{fetch("/api/hub/inbox").then(e=>e.json()).then(e=>{e.messages?.length&&L(t=>{let r=new Set(t.map(e=>e.id));return[...e.messages.filter(e=>!r.has(e.id)),...t].slice(0,100)})}).catch(()=>{})};e();let t=setInterval(e,1e4);return()=>clearInterval(t)},[]),p)return(0,r.jsx)($,{});let q=g?.sse_sessions||{},K=e=>(e.network_id?q[`${e.network_id}:${e.alias}`]:void 0)??q[e.alias],Z=e=>"offline"!==e.status||!!K(e),Q=u.filter(Z).length,ee=u.length,et=u.filter(e=>"working"===e.status).length,er=g?(0,n.formatUptime)(g.uptime):"--",ea=g?.version||"--",es=!!(b?.hub&&b.tokenConfigured),en=b?.source==="file"?"Local config":b?.source==="runtime-env"?"Runtime env":"Config missing",el={};if(v?.tasks?.by_status?.length)for(let e of v.tasks.by_status)el[e.status]=e.count;else for(let e of y)el[e.status]=(el[e.status]||0)+1;let ei=[...u].sort((e,t)=>{let r=+!!Z(e),a=+!!Z(t);if(r!==a)return a-r;let s=+("working"===e.status);return("working"===t.status)-s}),eo=0===u.length&&!f;return(0,r.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,r.jsx)("div",{className:"lg:ml-0 ml-10",children:(0,r.jsx)(l,{online:Q,working:et,total:ee,version:ea,uptime:er})}),(0,r.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[!eo&&(0,r.jsx)("button",{onClick:()=>P(!0),className:"px-4 py-2 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 text-white text-sm font-medium rounded-xl shadow-lg shadow-cyan-500/10 transition-all active:scale-95 shrink-0",children:"⚡ Dispatch"}),(0,r.jsx)("div",{className:"flex-1",children:(0,r.jsx)(F,{})})]}),(0,r.jsxs)("section",{className:"mb-6 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 shadow-lg shadow-black/20",children:[(0,r.jsxs)("button",{onClick:()=>N(!k),className:"w-full flex items-center justify-between text-left",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,r.jsx)("span",{className:"uppercase text-gray-600",children:"Config"}),(0,r.jsx)("span",{className:`w-2 h-2 rounded-full ${es?"bg-green-400":"bg-red-400"}`}),(0,r.jsx)("span",{className:"text-gray-500",children:en})]}),(0,r.jsx)("svg",{className:`w-4 h-4 text-gray-600 transition-transform ${k?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),k&&(0,r.jsxs)("div",{className:"mt-3 pt-3 border-t border-[#2a2a4a]",children:[(0,r.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,r.jsx)("div",{className:"min-w-0",children:(0,r.jsxs)("div",{className:"text-gray-100 truncate text-sm",title:b?.hub||void 0,children:["Hub: ",(0,r.jsx)("span",{className:b?.hub?"text-cyan-300":"text-red-300",children:b?.hub?.trim()||"not configured"})]})}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2 text-xs",children:(0,r.jsxs)("span",{className:`px-2.5 py-1 rounded-md border ${b?.tokenConfigured?"bg-blue-500/5 text-blue-300 border-blue-500/20":"bg-gray-500/5 text-gray-400 border-gray-500/20"}`,children:["Token: ",b?.tokenPreview||"not configured"]})})]}),b?.error&&(0,r.jsx)("div",{className:"mt-2 text-xs text-gray-600",children:b.error})]})]}),Object.keys(el).length>0&&(0,r.jsxs)("section",{className:"mb-6 rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 shadow-lg shadow-black/20",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,r.jsx)("div",{className:"text-xs uppercase text-gray-600",children:"Task Status"}),(0,r.jsx)(s.default,{href:"/tasks",prefetch:!1,className:"text-xs text-cyan-400 hover:text-cyan-300",children:"View all →"})]}),(0,r.jsx)("div",{className:"flex flex-wrap gap-2",children:["running","delivered","acked","replied","created","failed","cancelled","expired","closed"].filter(e=>el[e]).map(e=>(0,r.jsxs)(s.default,{href:`/tasks?status=${e}`,prefetch:!1,className:`px-2.5 py-1 rounded-md border text-xs ${T.STATUS_CHIP_CLASS[e]} hover:opacity-80 transition-opacity`,children:[e,": ",el[e]]},e))})]}),!eo&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"text-[10px] uppercase tracking-[0.12em] text-gray-600 mb-2",children:"Quick navigation"}),(0,r.jsx)("section",{className:"mb-3 grid grid-cols-3 gap-2 sm:gap-3",children:(e=u.filter(e=>Z(e)&&"working"!==e.status).length,i=ee-Q,c=y.filter(e=>"failed"===e.status).length,[{href:"/nodes",label:"Nodes",value:`${Q}/${ee}`,sub:`${ee>0?Math.round(Q/ee*100):0}% online`,color:"text-green-400 border-green-500/20",popover:0===ee?null:[{k:"working",v:et,dot:"",color:"#4ade80"},{k:"idle",v:e,dot:"",color:"#22d3ee"},{k:"offline",v:i,dot:"",color:"#9ca3af"}]},{href:"/tasks",label:"Tasks",value:String(Object.values(el).reduce((e,t)=>e+t,0)||0),sub:"all-time",color:"text-cyan-400 border-cyan-500/20",popover:0===Object.keys(el).length?null:["running","replied","failed","cancelled","expired","closed","created","delivered","acked"].filter(e=>el[e]).map(e=>({k:e,v:el[e],dot:"",color:({running:"#4ade80",replied:"#a78bfa",failed:"#f87171",cancelled:"#facc15",expired:"#fb923c",closed:"#9ca3af",created:"#9ca3af",delivered:"#60a5fa",acked:"#22d3ee"})[e]||"#9ca3af"}))},{href:"/tasks?status=failed",label:"Failed",value:String(el.failed||0),sub:el.failed?"needs review":"none",color:el.failed?"text-red-400 border-red-500/25":"text-gray-500 border-gray-700/30",popover:c?[{k:`${c} in current view`,v:"",dot:"",color:"#f87171"}]:[{k:"no failures yet",v:"",dot:"",color:"#4b5563"}]}].map(e=>(0,r.jsxs)(s.default,{href:e.href,prefetch:!1,className:`anet-stat-link group relative rounded-xl border ${e.color} bg-[#111128] px-3 py-3 transition-all hover:-translate-y-px`,children:[(0,r.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,r.jsx)("div",{className:`text-xl font-semibold tabular-nums ${e.color.split(" ")[0]}`,children:e.value}),(0,r.jsx)("div",{className:"hidden sm:block text-[10px] text-gray-600 group-hover:text-gray-400 transition-colors",children:"View →"})]}),(0,r.jsx)("div",{className:"text-[11px] text-gray-400 mt-0.5",children:e.label}),(0,r.jsx)("div",{className:"text-[10px] text-gray-600 mt-px",children:e.sub}),e.popover&&e.popover.length>0&&(0,r.jsxs)("div",{className:"anet-stat-popover hidden md:block pointer-events-none absolute left-2 right-2 top-full mt-1 z-20 rounded-lg border border-[#2a2a4a] bg-[#0d0d1a] shadow-lg shadow-black/30 px-3 py-2 opacity-0 translate-y-[-2px] group-hover:opacity-100 group-hover:translate-y-0 transition-all duration-150 delay-100",children:[(0,r.jsx)("div",{className:"text-[10px] text-gray-600 uppercase tracking-wider mb-1.5",children:"Breakdown"}),(0,r.jsx)("ul",{className:"space-y-1",children:e.popover.map(e=>(0,r.jsxs)("li",{className:"flex items-center gap-2 text-[11px]",children:[(0,r.jsx)("span",{className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:e.color},"aria-hidden":!0}),(0,r.jsx)("span",{className:"text-gray-400 capitalize",children:e.k}),""!==e.v&&(0,r.jsx)("span",{className:"ml-auto text-gray-300 tabular-nums font-medium",children:e.v})]},e.k))})]})]},e.href)))}),(0,r.jsx)("section",{className:"mb-6 grid grid-cols-3 gap-2 sm:gap-3",children:[{href:"/messages",label:"Messages",icon:"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"},{href:"/logs",label:"Audit log",icon:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8"},{href:"/admin",label:"Admin",icon:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4z M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2"}].map(e=>(0,r.jsxs)(s.default,{href:e.href,prefetch:!1,className:"anet-nav-tile flex items-center justify-center gap-2 rounded-xl border border-[#2a2a4a] bg-[#111128] px-3 py-2.5 text-[12px] text-gray-400 hover:text-gray-200 transition-colors",children:[(0,r.jsx)("svg",{className:"w-4 h-4 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,r.jsx)("path",{d:e.icon})}),(0,r.jsx)("span",{children:e.label})]},e.href))}),(0,r.jsx)(o,{}),y.length>0&&(0,r.jsxs)("section",{className:"mb-6 bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Recent Activity"}),(0,r.jsx)(s.default,{href:"/tasks",className:"text-xs text-cyan-400 hover:text-cyan-300",children:"All tasks →"})]}),(0,r.jsx)("div",{className:"space-y-2 max-h-40 overflow-y-auto",children:y.slice(0,5).map(e=>(0,r.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,r.jsx)("span",{className:"w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:T.STATUS_DOT_HEX[e.status]||"#6b7280"}}),e.from_name&&(0,r.jsx)(d.AliasAvatar,{alias:e.from_name,size:14}),(0,r.jsx)("span",{className:"text-gray-300 shrink-0 max-w-[20%] truncate",children:e.from_name||"?"}),(0,r.jsx)("span",{className:"text-gray-600",children:"→"}),e.to_name&&(0,r.jsx)(d.AliasAvatar,{alias:e.to_name,size:14}),(0,r.jsx)("span",{className:"text-gray-300 shrink-0 max-w-[20%] truncate",children:e.to_name||"?"}),(0,r.jsx)("span",{className:"text-gray-500 truncate flex-1",title:e.content||"",children:(0,n.previewContent)(e.content).slice(0,60)}),(0,r.jsx)("span",{className:`shrink-0 px-1.5 py-0.5 rounded text-[10px] border ${T.STATUS_CHIP_CLASS[e.status]||"text-gray-500 border-gray-700/30"}`,children:e.status})]},e.task_id))})]})]}),f&&(0,r.jsxs)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-4 py-3 rounded-lg mb-6 text-sm flex items-center justify-between",role:"alert",children:[(0,r.jsx)("span",{children:String(f)}),(0,r.jsx)("span",{className:"text-gray-500 text-xs",children:"Check CommHub connection"})]}),u.length>0&&(0,r.jsx)("div",{className:"flex justify-center mb-4",children:(0,r.jsx)("button",{onClick:()=>w(!j),className:"text-xs text-gray-500 hover:text-gray-300 border border-gray-700/50 px-4 py-1.5 rounded-lg transition-colors hover:border-gray-600 cursor-pointer",children:j?"Hide Topology":"Show Topology"})}),!j&&u.length>0&&(0,r.jsx)("div",{className:"lg:hidden text-center text-xs text-gray-600 mb-4",children:"Topology hidden on mobile for better readability"}),j&&u.length>0&&(0,r.jsx)(S,{sessions:u,sseSessions:q,renameSignal:Y}),0!==u.length||f?(h={all:ei.length,working:ei.filter(e=>Z(e)&&"working"===e.status).length,idle:ei.filter(e=>Z(e)&&"working"!==e.status).length,offline:ei.filter(e=>!Z(e)).length},x=ei.filter(e=>"all"===B||("offline"===B?!Z(e):"working"===B?Z(e)&&"working"===e.status:"idle"!==B||Z(e)&&"working"!==e.status)),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"mb-3 flex flex-wrap items-center gap-1",children:[{key:"all",label:"All"},{key:"working",label:"Working",dot:"#4ade80"},{key:"idle",label:"Idle",dot:"#22d3ee"},{key:"offline",label:"Offline",dot:"#6b7280"}].map(e=>(0,r.jsxs)("button",{type:"button",onClick:()=>D(e.key),disabled:0===h[e.key]&&"all"!==e.key,className:`flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs transition-colors disabled:opacity-30 disabled:cursor-not-allowed ${B===e.key?"bg-cyan-500/10 text-cyan-300 border border-cyan-500/30":"text-gray-500 hover:text-gray-200 hover:bg-[#1a1a2a] border border-transparent"}`,children:[e.dot&&(0,r.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full",style:{backgroundColor:e.dot}}),(0,r.jsx)("span",{children:e.label}),(0,r.jsx)("span",{className:`text-[10px] tabular-nums ${B===e.key?"text-cyan-400":"text-gray-600"}`,children:h[e.key]})]},e.key))}),(0,r.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-3 sm:gap-4",children:x.map(e=>(0,r.jsx)(M,{session:e,hasSse:Z(e),sseCount:K(e)||0,onChat:_.openTab},e.alias))}),0===x.length&&(0,r.jsxs)("div",{className:"mt-4 text-center text-xs text-gray-600",children:['No agents match "',B,'" — ',(0,r.jsx)("button",{onClick:()=>D("all"),className:"underline hover:text-gray-400",children:"Show all"})]})]})):(0,r.jsx)(E.NodesEmptyState,{hint:m,taskHistoryCount:Object.values(el).reduce((e,t)=>e+t,0)}),(0,r.jsx)(z,{messages:A}),(0,r.jsx)("div",{className:"mt-8 text-center text-xs text-gray-600 flex items-center justify-center gap-2 flex-wrap",children:V&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${J?"bg-green-400":"bg-gray-600"}`}),J?"SSE live":"SWR polling"]})}),C&&(0,r.jsx)(I,{sessions:u,onClose:()=>P(!1)}),_.tabs.length>0&&(0,r.jsx)(R,{tabs:_.tabs,activeTab:_.activeTab,onOpenTab:_.openTab,onCloseTab:_.closeTab,onSetActive:_.setActiveTab,onClose:_.closeAll})]})}],18722)}]);