@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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +4 -4
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.html +1 -1
- package/.next/server/app/admin.rsc +1 -1
- package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/logs.html +1 -1
- package/.next/server/app/logs.rsc +1 -1
- package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
- package/.next/server/app/messages.html +1 -1
- package/.next/server/app/messages.rsc +1 -1
- package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
- package/.next/server/app/node.html +1 -1
- package/.next/server/app/node.rsc +1 -1
- package/.next/server/app/node.segments/_full.segment.rsc +1 -1
- package/.next/server/app/node.segments/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.segment.rsc +1 -1
- package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.segments/node.segment.rsc +1 -1
- package/.next/server/app/nodes.html +1 -1
- package/.next/server/app/nodes.rsc +1 -1
- package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +1 -1
- package/.next/server/app/server-logs.rsc +1 -1
- package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
- package/.next/server/app/settings/networks.html +1 -1
- package/.next/server/app/settings/networks.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +1 -1
- package/.next/server/app/settings/tokens.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tasks.html +1 -1
- package/.next/server/app/tasks.rsc +1 -1
- package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{0~jer7yzbdwyf.js → 07hqw58g.8eps.js} +1 -1
- package/.next/static/chunks/{13vck9~m4yc3u.js → 0e6l5gib16j~o.js} +1 -1
- package/.next/static/chunks/{0jbpaock6~g4b.js → 0qbdhso.l~gtw.js} +1 -1
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +19 -4
- package/package.json +1 -1
- package/scripts/topo-group-pip-fadein-test.mjs +100 -0
- /package/.next/static/{4jV5uu0TaA1Xfa8AyeD-x → ux1ffxSFMPz92f1lBLbOj}/_buildManifest.js +0 -0
- /package/.next/static/{4jV5uu0TaA1Xfa8AyeD-x → ux1ffxSFMPz92f1lBLbOj}/_clientMiddlewareManifest.js +0 -0
- /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
|
@@ -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);
|
|
File without changes
|
/package/.next/static/{4jV5uu0TaA1Xfa8AyeD-x → ux1ffxSFMPz92f1lBLbOj}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|