@sleep2agi/agent-network-dashboard 0.4.6-preview.179 → 0.4.6-preview.180

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 (142) 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/{01iq~qjn.wiba.js → 0ia0~8uq23xxr.js} +1 -1
  133. package/.next/static/chunks/{05pqwkubvta73.js → 0tfbneqpxn9gw.js} +1 -1
  134. package/.next/static/chunks/{15he1e9gl6.g5.js → 17limi7in00fo.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +23 -3
  138. package/package.json +1 -1
  139. package/scripts/topo-groupbox-fadein-test.mjs +95 -0
  140. /package/.next/static/{lJBvGFN5KKDEoZclDBTDU → Bfq_NKAKfgisiPZVimIBB}/_buildManifest.js +0 -0
  141. /package/.next/static/{lJBvGFN5KKDEoZclDBTDU → Bfq_NKAKfgisiPZVimIBB}/_clientMiddlewareManifest.js +0 -0
  142. /package/.next/static/{lJBvGFN5KKDEoZclDBTDU → Bfq_NKAKfgisiPZVimIBB}/_ssgManifest.js +0 -0
@@ -2582,7 +2582,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2582
2582
  only — groupBoxes is empty in ring mode. Rendered behind the
2583
2583
  flow links + nodes; pointer-events off so they never intercept
2584
2584
  a node click. Restrained dashed container + group-name label. */}
2585
- {groupBoxes.map(box => {
2585
+ {groupBoxes.map((box, boxIdx) => {
2586
2586
  const isHovered = activeGroup === box.key;
2587
2587
  // R68: distinguish "locked by click" from "currently hovered".
2588
2588
  // R63 made pinned and hovered identical (both hit isHovered
@@ -2607,14 +2607,34 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2607
2607
  <g
2608
2608
  key={`grp-${box.key}`}
2609
2609
  data-group={box.key}
2610
- className="transition-opacity"
2610
+ // Round 173 / Loop: group boxes pick up the first-paint
2611
+ // fade-in wave alongside R9 staggered nodes (0-540ms)
2612
+ // and R172 staggered edges (280-980ms). Pre-R173 the
2613
+ // structural box frames appeared instantly while the
2614
+ // nodes inside eased in — the reveal felt like
2615
+ // 'frame slams down, nodes drift in'. The .anet-fade-in
2616
+ // CSS animation (R3 origin, 0.15s ease-out, mount-once)
2617
+ // plays alongside the node R9 stagger; each box offset
2618
+ // by boxIdx × 60ms (cap at 8 indices so a fleet with
2619
+ // many groups still finishes within ~500ms) so boxes
2620
+ // appear like a soft sweep across the grid rather than
2621
+ // a single pop. animation-fill-mode default 'none' →
2622
+ // post-animation control reverts to the inline opacity
2623
+ // style below (1 / 0.28 based on filter pin state).
2624
+ // data-group-fade-delay exposes the computed delay for
2625
+ // test probes.
2626
+ className="transition-opacity anet-fade-in"
2627
+ data-group-fade-delay={Math.min(boxIdx, 8) * 60}
2611
2628
  // R63: drop the blanket pointerEvents:'none' that
2612
2629
  // previously sat here. Chrome's SVG impl doesn't let a
2613
2630
  // child override a parent's `none` even though the spec
2614
2631
  // says it should — moving the property onto just the
2615
2632
  // rect (where it's needed so nodes underneath stay
2616
2633
  // clickable) lets the label text receive its own click.
2617
- style={{ opacity: !activeGroup || isHovered ? 1 : 0.28 }}
2634
+ style={{
2635
+ opacity: !activeGroup || isHovered ? 1 : 0.28,
2636
+ animationDelay: `${Math.min(boxIdx, 8) * 60}ms`,
2637
+ }}
2618
2638
  >
2619
2639
  <rect
2620
2640
  x={box.x}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.179",
3
+ "version": "0.4.6-preview.180",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,95 @@
1
+ /* Round 173 verification: group boxes (grid layout) fade-in
2
+ * alongside the R9/R172 first-paint wave.
3
+ *
4
+ * Pre-R173 the structural box frames appeared instantly while
5
+ * nodes inside eased in via R9 (0-540ms) and edges via R172
6
+ * (280-980ms). The reveal felt like 'frame slams down, nodes
7
+ * drift in'.
8
+ *
9
+ * R173 wraps each group box <g> in:
10
+ * className="transition-opacity anet-fade-in"
11
+ * style={{ animationDelay: 'boxIdx × 60ms (cap 8)' }}
12
+ * data-group-fade-delay={boxIdx × 60}
13
+ *
14
+ * Test:
15
+ * 1. Force grid layout
16
+ * 2. Mock 4 prefix-clustered sessions → 2 groups
17
+ * 3. Probe each [data-group] wrapper
18
+ * 4. Assert anet-fade-in className present
19
+ * 5. Assert animation-delay 0ms, 60ms
20
+ */
21
+ import { chromium } from 'playwright';
22
+ import { readFileSync } from 'node:fs';
23
+
24
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
25
+ const browser = await chromium.launch({ headless: true });
26
+
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try {
31
+ localStorage.setItem('anet-theme', 'cyber');
32
+ sessionStorage.setItem('anet_v3_auth', '1');
33
+ localStorage.setItem('anet-topo-layout', 'grid');
34
+ } catch {}
35
+ });
36
+
37
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
38
+ await ctx.route('**/api/hub/status*', async (route) => {
39
+ const r = await route.fetch();
40
+ const b = await r.json();
41
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
42
+ const mk = (alias) => ({
43
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
44
+ network_id: nid, project_dir: null,
45
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
46
+ });
47
+ // 2 distinct prefix groups, 2 sessions each → 2 group boxes
48
+ await route.fulfill({ response: r, json: { ...b, sessions: [
49
+ mk('agents-a1'), mk('agents-a2'),
50
+ mk('infra-b1'), mk('infra-b2'),
51
+ ] } });
52
+ });
53
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
54
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
55
+
56
+ const page = await ctx.newPage();
57
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
58
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
59
+ await page.waitForSelector('[data-group]', { timeout: 10000 });
60
+ await page.waitForTimeout(400);
61
+
62
+ const probe = await page.evaluate(() => {
63
+ const boxes = [...document.querySelectorAll('g[data-group]')];
64
+ return boxes.map(b => ({
65
+ key: b.getAttribute('data-group'),
66
+ hasFadeClass: (b.getAttribute('class') || '').includes('anet-fade-in'),
67
+ fadeDelayAttr: parseFloat(b.getAttribute('data-group-fade-delay') || ''),
68
+ animationDelay: b.style.animationDelay || getComputedStyle(b).animationDelay,
69
+ }));
70
+ });
71
+
72
+ await browser.close();
73
+
74
+ const parseDelay = (s) => {
75
+ if (!s) return null;
76
+ if (s.endsWith('ms')) return parseFloat(s);
77
+ if (s.endsWith('s')) return parseFloat(s) * 1000;
78
+ return parseFloat(s);
79
+ };
80
+ const delays = probe.map(p => parseDelay(p.animationDelay));
81
+
82
+ const results = {
83
+ two_boxes_found: probe.length === 2,
84
+ all_have_fade_class: probe.every(p => p.hasFadeClass),
85
+ box0_delay_attr_0: probe[0]?.fadeDelayAttr === 0,
86
+ box1_delay_attr_60: probe[1]?.fadeDelayAttr === 60,
87
+ box0_anim_delay_0ms: delays[0] === 0,
88
+ box1_anim_delay_60ms: Math.abs(delays[1] - 60) < 0.5,
89
+ delays_strictly_increase: delays[0] < delays[1],
90
+ };
91
+ const ok = Object.values(results).every(Boolean);
92
+ console.log(`${ok ? '✅' : '❌'} groupbox fade-in:`, JSON.stringify(results),
93
+ `\n boxes =`, probe,
94
+ `\n delays (ms) =`, delays);
95
+ process.exit(ok ? 0 : 1);