@sleep2agi/agent-network-dashboard 0.4.6-preview.213 → 0.4.6-preview.214

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/{0~jer7yzbdwyf.js → 07hqw58g.8eps.js} +1 -1
  133. package/.next/static/chunks/{13vck9~m4yc3u.js → 0e6l5gib16j~o.js} +1 -1
  134. package/.next/static/chunks/{0jbpaock6~g4b.js → 0qbdhso.l~gtw.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +19 -4
  138. package/package.json +1 -1
  139. package/scripts/topo-group-pip-fadein-test.mjs +100 -0
  140. /package/.next/static/{4jV5uu0TaA1Xfa8AyeD-x → ux1ffxSFMPz92f1lBLbOj}/_buildManifest.js +0 -0
  141. /package/.next/static/{4jV5uu0TaA1Xfa8AyeD-x → ux1ffxSFMPz92f1lBLbOj}/_clientMiddlewareManifest.js +0 -0
  142. /package/.next/static/{4jV5uu0TaA1Xfa8AyeD-x → ux1ffxSFMPz92f1lBLbOj}/_ssgManifest.js +0 -0
@@ -3001,15 +3001,30 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3001
3001
  the R27 label↔label and R19 node↔label guards intact.
3002
3002
  Each tier is colour-coded against the legend swatches
3003
3003
  and only renders when count > 0, so a healthy all-
3004
- working group reads simply " · 2w". */}
3004
+ working group reads simply " · 2w".
3005
+
3006
+ Round 207 / Loop: each tspan eases in on mount
3007
+ via anet-fade-in. Pre-R207 when a group's first
3008
+ working node went idle (or first idle node went
3009
+ working), the new tier's tspan snap-popped into
3010
+ the label. Same snap-on-mount issue R203 fixed
3011
+ for recent-signal rows, applied at the group-
3012
+ label scope. Each tier is keyed on its boolean
3013
+ mount, so the animation fires once when the
3014
+ tspan first appears (count crosses 0 → 1+),
3015
+ not on every count update (e.g., 1 → 2 working
3016
+ preserves the tspan via React reconciliation).
3017
+ Exit remains snap — matches R190's "fade-IN
3018
+ smooth, accept exit snap" trade-off used for
3019
+ the R129 hot-tail. */}
3005
3020
  {box.statuses.working > 0 && (
3006
- <tspan dx="8" fill={isLight ? '#059669' : '#22c55e'} fontSize="11" fontWeight="600">{box.statuses.working}w</tspan>
3021
+ <tspan dx="8" fill={isLight ? '#059669' : '#22c55e'} fontSize="11" fontWeight="600" className="anet-fade-in" data-group-pip="working">{box.statuses.working}w</tspan>
3007
3022
  )}
3008
3023
  {box.statuses.idle > 0 && (
3009
- <tspan dx="4" fill={isLight ? '#0d9488' : '#2dd4bf'} fontSize="11" fontWeight="600">{box.statuses.idle}i</tspan>
3024
+ <tspan dx="4" fill={isLight ? '#0d9488' : '#2dd4bf'} fontSize="11" fontWeight="600" className="anet-fade-in" data-group-pip="idle">{box.statuses.idle}i</tspan>
3010
3025
  )}
3011
3026
  {box.statuses.offline > 0 && (
3012
- <tspan dx="4" fill={isLight ? '#94a3b8' : '#6b7280'} fontSize="11" fontWeight="600">{box.statuses.offline}o</tspan>
3027
+ <tspan dx="4" fill={isLight ? '#94a3b8' : '#6b7280'} fontSize="11" fontWeight="600" className="anet-fade-in" data-group-pip="offline">{box.statuses.offline}o</tspan>
3013
3028
  )}
3014
3029
  </text>
3015
3030
  </g>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.213",
3
+ "version": "0.4.6-preview.214",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,100 @@
1
+ /* Round 207 verification: group box label status pip tspans
2
+ * (`2w`, `1i`, `1o`) get anet-fade-in on mount. Pre-R207 a tier
3
+ * crossing 0 → 1+ snap-popped its tspan into the group label;
4
+ * R207 eases the entrance the same way R203 did for recent rows.
5
+ *
6
+ * Group boxes only render in grid layout when sessions share a
7
+ * ≥2-char alias prefix (computeGroups union-find).
8
+ *
9
+ * Test:
10
+ * Mock 4 sessions: alpha-1 working, alpha-2 idle, beta-1 working,
11
+ * beta-2 working. Two groups form:
12
+ * alpha · 1 working + 1 idle (both pips fire)
13
+ * beta · 2 working (only working pip fires)
14
+ * Switch to grid layout via the R163 toggle, wait for group boxes.
15
+ * Probe:
16
+ * 1. >=3 [data-group-pip] elements present (alpha working +
17
+ * alpha idle + beta working)
18
+ * 2. No [data-group-pip="offline"] (offline tier is empty)
19
+ * 3. Every pip's className includes 'anet-fade-in'
20
+ * 4. CSS animationName resolves to 'anet-fade-in'
21
+ * 5. tspan textContent matches digit+letter pattern (e.g.
22
+ * '2w', '1i')
23
+ */
24
+ import { chromium } from 'playwright';
25
+ import { readFileSync } from 'node:fs';
26
+
27
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
28
+ const browser = await chromium.launch({ headless: true });
29
+
30
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
31
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
32
+ await ctx.addInitScript(() => {
33
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
34
+ });
35
+
36
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
37
+ await ctx.route('**/api/hub/status*', async (route) => {
38
+ const r = await route.fetch();
39
+ const b = await r.json();
40
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
41
+ const mk = (alias, status) => ({
42
+ alias, status, model: 'claude-opus-4', runtime: 'cli-claude-code',
43
+ network_id: nid, project_dir: null,
44
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
45
+ });
46
+ await route.fulfill({ response: r, json: { ...b, sessions: [
47
+ mk('alpha-1', 'working'),
48
+ mk('alpha-2', 'idle'),
49
+ mk('beta-1', 'working'),
50
+ mk('beta-2', 'working'),
51
+ ] } });
52
+ });
53
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: [] } }));
54
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.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-topo-chrome-layout="grid"]', { timeout: 10000 });
60
+ await page.waitForTimeout(200);
61
+
62
+ // Switch to grid layout to trigger groupBoxes rendering
63
+ await page.click('[data-topo-chrome-layout="grid"]');
64
+ await page.waitForTimeout(600); // R170 layout-switch crossfade + group derivation
65
+ await page.waitForSelector('[data-group-pip]', { timeout: 5000 });
66
+ await page.waitForTimeout(300);
67
+
68
+ const pips = await page.evaluate(() => {
69
+ return [...document.querySelectorAll('[data-group-pip]')].map(el => {
70
+ const cs = getComputedStyle(el);
71
+ return {
72
+ tier: el.getAttribute('data-group-pip'),
73
+ text: el.textContent,
74
+ className: el.getAttribute('class') || '',
75
+ animationName: cs.animationName,
76
+ };
77
+ });
78
+ });
79
+
80
+ await browser.close();
81
+
82
+ const working = pips.filter(p => p.tier === 'working');
83
+ const idleP = pips.filter(p => p.tier === 'idle');
84
+ const offline = pips.filter(p => p.tier === 'offline');
85
+
86
+ const has = (s, c) => (s || '').split(/\s+/).includes(c);
87
+
88
+ const results = {
89
+ at_least_three_pips: pips.length >= 3,
90
+ has_working_pip: working.length >= 2, // alpha + beta both have working
91
+ has_idle_pip: idleP.length >= 1, // alpha has 1 idle
92
+ no_offline_pip: offline.length === 0,
93
+ all_have_fadein_class: pips.every(p => has(p.className, 'anet-fade-in')),
94
+ all_have_animation_bound: pips.every(p => /anet-fade-in/i.test(p.animationName)),
95
+ text_format_correct: pips.every(p => /^\d+[wio]$/.test(p.text || '')),
96
+ };
97
+ const ok = Object.values(results).every(Boolean);
98
+ console.log(`${ok ? '✅' : '❌'} group pip fade-in:`, JSON.stringify(results),
99
+ `\n pips:`, pips);
100
+ process.exit(ok ? 0 : 1);