@sleep2agi/agent-network-dashboard 0.5.3-preview.211 → 0.5.3-preview.213
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 +5 -5
- package/.next/fallback-build-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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- 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 +2 -2
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +2 -2
- package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- 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 +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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 +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +2 -2
- package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +2 -2
- package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +2 -2
- package/.next/server/app/node.segments/_full.segment.rsc +2 -2
- package/.next/server/app/node.segments/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.segment.rsc +2 -2
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +2 -2
- package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +2 -2
- package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- 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 +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- 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/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +2 -2
- package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- 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/[root-of-the-server]__0sv~g.o._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +2 -2
- 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 +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/{0nklvgzpy80d0.css → 015ne37-~usss.css} +1 -1
- package/.next/static/chunks/{177da35-xmv.k.js → 06-jx~-.wzg2s.js} +2 -2
- package/.next/static/chunks/{0apd6mdrbto5c.js → 0d4rrvyt_4xsb.js} +1 -1
- package/.next/static/chunks/{0b0-7zxsflbws.js → 0f1-u9z-fnoq_.js} +1 -1
- package/.next/static/chunks/{0f8..rye42edf.js → 0ytqr~slwckm5.js} +1 -1
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +41 -1
- package/app/globals.css +71 -0
- package/package.json +1 -1
- package/scripts/topo-kicker-breath-test.mjs +100 -0
- package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
- /package/.next/static/{__WGpawYHaQmmhEB3M_Qh → vHmKzT0DqrnrFyPuv6VCa}/_buildManifest.js +0 -0
- /package/.next/static/{__WGpawYHaQmmhEB3M_Qh → vHmKzT0DqrnrFyPuv6VCa}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{__WGpawYHaQmmhEB3M_Qh → vHmKzT0DqrnrFyPuv6VCa}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* Round 699 — kicker "Network Topology" gains at-rest breathing fade.
|
|
2
|
+
* Pre-R699 the kicker eyebrow sat at fixed alpha (text-gray-500 token)
|
|
3
|
+
* — static, no sign of life. R699 adds a 6s opacity 0.78↔1 cycle via
|
|
4
|
+
* `.anet-topo-kicker-breath` (globals.css). Pure opacity → geometry
|
|
5
|
+
* stable → topo-overlap-test unaffected.
|
|
6
|
+
*
|
|
7
|
+
* Source assertions:
|
|
8
|
+
* - globals.css @keyframes anet-topo-kicker-breath-kf with 0/100% 1, 50% 0.78
|
|
9
|
+
* - globals.css .anet-topo-kicker-breath rule with 6s ease-in-out infinite
|
|
10
|
+
* - globals.css prefers-reduced-motion guard: animation: none
|
|
11
|
+
* - TopoGraph.tsx kicker element has class anet-topo-kicker-breath
|
|
12
|
+
* - TopoGraph.tsx kicker element has data-topo-section-kicker-breath="6s"
|
|
13
|
+
*
|
|
14
|
+
* Runtime assertions:
|
|
15
|
+
* - kicker element present
|
|
16
|
+
* - kicker has anet-topo-kicker-breath class
|
|
17
|
+
* - computed animation-name reflects the keyframe (or 'none' under reduced-motion)
|
|
18
|
+
* - computed animation-duration is 6s
|
|
19
|
+
*/
|
|
20
|
+
import { chromium } from 'playwright';
|
|
21
|
+
import { readFileSync } from 'node:fs';
|
|
22
|
+
|
|
23
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
24
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
25
|
+
|
|
26
|
+
const browser = await chromium.launch({ headless: true });
|
|
27
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
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
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
33
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
34
|
+
} catch {}
|
|
35
|
+
});
|
|
36
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
37
|
+
const r = await route.fetch();
|
|
38
|
+
const b = await r.json();
|
|
39
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
40
|
+
const mk = (alias) => ({
|
|
41
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
42
|
+
network_id: nid, project_dir: null,
|
|
43
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
44
|
+
});
|
|
45
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
46
|
+
});
|
|
47
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
48
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
49
|
+
const page = await ctx.newPage();
|
|
50
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
51
|
+
await page.waitForSelector('[data-topo-section-kicker]', { timeout: 15000, state: 'attached' });
|
|
52
|
+
await page.waitForTimeout(300);
|
|
53
|
+
|
|
54
|
+
const runtimeState = await page.evaluate(() => {
|
|
55
|
+
const k = document.querySelector('[data-topo-section-kicker]');
|
|
56
|
+
if (!k) return null;
|
|
57
|
+
const cs = getComputedStyle(k);
|
|
58
|
+
return {
|
|
59
|
+
has_class: k.classList.contains('anet-topo-kicker-breath'),
|
|
60
|
+
breath_attr: k.getAttribute('data-topo-section-kicker-breath'),
|
|
61
|
+
anim_name: cs.animationName,
|
|
62
|
+
anim_duration: cs.animationDuration,
|
|
63
|
+
anim_iter: cs.animationIterationCount,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await browser.close();
|
|
68
|
+
|
|
69
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
70
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
71
|
+
|
|
72
|
+
const cssKeyframes = /@keyframes anet-topo-kicker-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.78;/.test(cssSrc);
|
|
73
|
+
const cssRule = /\.anet-topo-kicker-breath\s*\{[\s\S]*?animation:\s*anet-topo-kicker-breath-kf\s+6s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
74
|
+
const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-kicker-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
75
|
+
const tsxClass = /anet-topo-kicker-breath text-xs uppercase/.test(tsxSrc);
|
|
76
|
+
const tsxAttr = /data-topo-section-kicker-breath="6s"/.test(tsxSrc);
|
|
77
|
+
|
|
78
|
+
// Runtime animation may be 'none' under prefers-reduced-motion. In default
|
|
79
|
+
// headless playwright, motion is allowed by default, so the keyframe should
|
|
80
|
+
// be active (anim_name === 'anet-topo-kicker-breath-kf').
|
|
81
|
+
const runtimeAnim = runtimeState?.anim_name === 'anet-topo-kicker-breath-kf' || runtimeState?.anim_name === 'none';
|
|
82
|
+
const runtimeDuration = runtimeState?.anim_duration === '6s' || runtimeState?.anim_name === 'none';
|
|
83
|
+
|
|
84
|
+
const results = {
|
|
85
|
+
kicker_present: !!runtimeState,
|
|
86
|
+
has_breath_class: runtimeState?.has_class === true,
|
|
87
|
+
breath_attr_6s: runtimeState?.breath_attr === '6s',
|
|
88
|
+
runtime_anim_ok: runtimeAnim,
|
|
89
|
+
runtime_duration_ok: runtimeDuration,
|
|
90
|
+
css_keyframes: cssKeyframes,
|
|
91
|
+
css_rule: cssRule,
|
|
92
|
+
css_reduced_motion: cssReducedMotion,
|
|
93
|
+
tsx_class: tsxClass,
|
|
94
|
+
tsx_breath_attr: tsxAttr,
|
|
95
|
+
};
|
|
96
|
+
const ok = Object.values(results).every(Boolean);
|
|
97
|
+
console.log(`${ok ? '✅' : '❌'} R699 kicker at-rest breathing fade (3rd respiratory rhythm — 6s eyebrow):`,
|
|
98
|
+
JSON.stringify(results, null, 2),
|
|
99
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
100
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/* Round 698 — vendor-distribution chip-row outer wrapper joins the
|
|
2
|
+
* R697 wrapper-level :has() halo family. Pre-R698 only the chrome-strip
|
|
3
|
+
* wrappers (Layout/nodeSize/zoom) echoed inner-button hover at the
|
|
4
|
+
* parent scope. R698 extends to a NEW parent: the vendor-distribution
|
|
5
|
+
* chip-row outer <span>. Inner vendor letter chips are <span role="button">
|
|
6
|
+
* (not real <button>), so the CSS uses :has([role="button"]:hover) — a
|
|
7
|
+
* new selector variant extending R697's vocabulary from real-button
|
|
8
|
+
* children to ARIA-button children.
|
|
9
|
+
*
|
|
10
|
+
* Source assertions:
|
|
11
|
+
* - globals.css :has([role="button"]:hover) rule on wrapper attr
|
|
12
|
+
* - globals.css transition rule for the wrapper includes filter
|
|
13
|
+
* - TopoGraph.tsx outer <span> has data-topo-chrome-vendor-distribution-wrapper
|
|
14
|
+
*
|
|
15
|
+
* Runtime assertions:
|
|
16
|
+
* - wrapper present when vendorDist.length > 2 (3+ vendors)
|
|
17
|
+
* - data-attr matches "true"
|
|
18
|
+
*
|
|
19
|
+
* Mock 3 vendors so vendorDist.length > 2 triggers the chip row.
|
|
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 fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
26
|
+
|
|
27
|
+
const browser = await chromium.launch({ headless: true });
|
|
28
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
29
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
30
|
+
await ctx.addInitScript(() => {
|
|
31
|
+
try {
|
|
32
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
33
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
34
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
35
|
+
} catch {}
|
|
36
|
+
});
|
|
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, model) => ({
|
|
42
|
+
alias, status: 'idle', model, runtime: 'claude-code-cli',
|
|
43
|
+
network_id: nid, project_dir: null,
|
|
44
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
45
|
+
});
|
|
46
|
+
// 3 distinct vendors → vendorDist.length === 3 → chip row renders.
|
|
47
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
48
|
+
mk('a·1', 'claude-opus-4'),
|
|
49
|
+
mk('a·2', 'gpt-5'),
|
|
50
|
+
mk('a·3', 'glm-4.6'),
|
|
51
|
+
] } });
|
|
52
|
+
});
|
|
53
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
54
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
55
|
+
const page = await ctx.newPage();
|
|
56
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
57
|
+
await page.waitForSelector('[data-topo-chrome-vendor-distribution-wrapper]', { timeout: 15000, state: 'attached' });
|
|
58
|
+
await page.waitForTimeout(300);
|
|
59
|
+
|
|
60
|
+
const runtimeState = await page.evaluate(() => {
|
|
61
|
+
const wrapper = document.querySelector('[data-topo-chrome-vendor-distribution-wrapper]');
|
|
62
|
+
if (!wrapper) return null;
|
|
63
|
+
// Count inner role="button" children (the vendor letter chips).
|
|
64
|
+
const innerChips = wrapper.querySelectorAll('[role="button"]');
|
|
65
|
+
return {
|
|
66
|
+
wrapper_present: true,
|
|
67
|
+
wrapper_attr: wrapper.getAttribute('data-topo-chrome-vendor-distribution-wrapper'),
|
|
68
|
+
inner_role_button_count: innerChips.length,
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await browser.close();
|
|
73
|
+
|
|
74
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
75
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
76
|
+
|
|
77
|
+
const cssHoverRule = /\[data-topo-chrome-vendor-distribution-wrapper\]:has\(\[role="button"\]:hover\)\s*\{[\s\S]*?drop-shadow\(0 0 2px rgba\(103, 232, 249, 0\.5\)\)[\s\S]*?drop-shadow\(0 0 4px rgba\(103, 232, 249, 0\.25\)\)/.test(cssSrc);
|
|
78
|
+
const cssTransition = /\[data-topo-chrome-vendor-distribution-wrapper\]\s*\{[\s\S]*?transition:[\s\S]*?filter 200ms/.test(cssSrc);
|
|
79
|
+
const tsxWrapperAttr = /data-topo-chrome-vendor-distribution-wrapper="true"/.test(tsxSrc);
|
|
80
|
+
|
|
81
|
+
const results = {
|
|
82
|
+
wrapper_present: !!runtimeState?.wrapper_present,
|
|
83
|
+
wrapper_attr_true: runtimeState?.wrapper_attr === 'true',
|
|
84
|
+
inner_chips_present: (runtimeState?.inner_role_button_count ?? 0) >= 3,
|
|
85
|
+
css_hover_rule: cssHoverRule,
|
|
86
|
+
css_transition: cssTransition,
|
|
87
|
+
tsx_wrapper_attr: tsxWrapperAttr,
|
|
88
|
+
};
|
|
89
|
+
const ok = Object.values(results).every(Boolean);
|
|
90
|
+
console.log(`${ok ? '✅' : '❌'} R698 vendor-distribution wrapper :has() multi-layer halo (54th anchor — 2nd wrapper-level :has() anchor):`,
|
|
91
|
+
JSON.stringify(results, null, 2),
|
|
92
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
93
|
+
process.exit(ok ? 0 : 1);
|
|
File without changes
|
/package/.next/static/{__WGpawYHaQmmhEB3M_Qh → vHmKzT0DqrnrFyPuv6VCa}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|