@sleep2agi/agent-network-dashboard 0.5.3-preview.14 → 0.5.3-preview.140
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 +32 -32
- 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 +12 -12
- package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
- package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
- package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +14 -14
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +14 -14
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +7 -7
- 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 +14 -14
- package/.next/server/app/login.segments/_full.segment.rsc +14 -14
- package/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/server/app/login.segments/_index.segment.rsc +7 -7
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/login.segments/login.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
- package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
- package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
- package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/node.segments/_full.segment.rsc +14 -14
- package/.next/server/app/node.segments/_head.segment.rsc +4 -4
- package/.next/server/app/node.segments/_index.segment.rsc +7 -7
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/node.segments/node.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
- package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
- package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +14 -14
- package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
- package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
- 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 +4 -4
- 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/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.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/006dxnaf1ojoc.js +1 -0
- package/.next/static/chunks/05-~ezd16iskp.css +2 -0
- package/.next/static/chunks/069b9-o1a2f0v.js +4 -0
- package/.next/static/chunks/{16p3.8p0yi.1p.js → 0bbv-sge~hmdb.js} +1 -1
- package/.next/static/chunks/0k930mbg_qx0j.js +1 -0
- package/.next/static/chunks/{03a4--7ncekmk.js → 0v4-5tng.uh.7.js} +2 -2
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/ServersDrawer.tsx +16 -3
- package/app/components/TopoGraph.tsx +3688 -162
- package/app/globals.css +58 -7
- package/package.json +4 -4
- package/scripts/p157-servers-copy-test.mjs +95 -0
- package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
- package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
- package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
- package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
- package/scripts/topo-avatar-rotate-test.mjs +85 -0
- package/scripts/topo-avatar-scale-test.mjs +89 -0
- package/scripts/topo-badge-chat-gate-test.mjs +74 -0
- package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
- package/scripts/topo-brand-logo-breath-test.mjs +102 -0
- package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
- package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
- package/scripts/topo-brand-logo-hover-test.mjs +85 -0
- package/scripts/topo-card-chat-brightness-test.mjs +86 -0
- package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
- package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
- package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
- package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
- package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
- package/scripts/topo-click-ripple-glow-test.mjs +86 -0
- package/scripts/topo-cluster-count-attr-test.mjs +80 -0
- package/scripts/topo-crescent-breath-test.mjs +104 -0
- package/scripts/topo-crescent-recede-test.mjs +111 -0
- package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
- package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
- package/scripts/topo-edge-chat-gate-test.mjs +71 -0
- package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-pill-glow-test.mjs +67 -0
- package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
- package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
- package/scripts/topo-filter-pill-glow-test.mjs +90 -0
- package/scripts/topo-fleet-density-tier-test.mjs +84 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
- package/scripts/topo-freshness-chip-fade-test.mjs +105 -0
- package/scripts/topo-fullscreen-attr-test.mjs +73 -0
- package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
- package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
- package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
- package/scripts/topo-group-box-brightness-test.mjs +84 -0
- package/scripts/topo-group-chat-gate-test.mjs +77 -0
- package/scripts/topo-group-label-brightness-test.mjs +84 -0
- package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
- package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
- package/scripts/topo-group-pill-glow-test.mjs +76 -0
- package/scripts/topo-group-tint-brightness-test.mjs +82 -0
- package/scripts/topo-halo-chat-gate-test.mjs +72 -0
- package/scripts/topo-hub-core-brightness-test.mjs +82 -0
- package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
- package/scripts/topo-hub-digit-ls-test.mjs +119 -0
- package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
- package/scripts/topo-hub-halo-glow-test.mjs +96 -0
- package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
- package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
- package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
- package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
- package/scripts/topo-hub-highlight-r-test.mjs +112 -0
- package/scripts/topo-hub-highlight-recede-test.mjs +144 -0
- package/scripts/topo-hub-highlight-theme-fill-test.mjs +83 -0
- package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
- package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
- package/scripts/topo-hub-idle-breath-test.mjs +7 -2
- package/scripts/topo-hub-recede-test.mjs +124 -0
- package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
- package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
- package/scripts/topo-label-card-brightness-test.mjs +81 -0
- package/scripts/topo-layout-hover-fw-test.mjs +98 -0
- package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
- package/scripts/topo-legend-count-brightness-test.mjs +80 -0
- package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
- package/scripts/topo-legend-label-fw-test.mjs +107 -0
- package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
- package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
- package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
- package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
- package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
- package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
- package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
- package/scripts/topo-more-footer-brightness-test.mjs +94 -0
- package/scripts/topo-node-alias-brightness-test.mjs +84 -0
- package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
- package/scripts/topo-nodesize-brightness-test.mjs +82 -0
- package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
- package/scripts/topo-orphan-box-dash-test.mjs +89 -0
- package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
- package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
- package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
- package/scripts/topo-panel-row-brightness-test.mjs +116 -0
- package/scripts/topo-panel-title-brightness-test.mjs +98 -0
- package/scripts/topo-panel-title-glow-test.mjs +111 -0
- package/scripts/topo-pill-x-rotate-test.mjs +96 -0
- package/scripts/topo-pinned-aspect-test.mjs +89 -0
- package/scripts/topo-pip-brightness-test.mjs +85 -0
- package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
- package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
- package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
- package/scripts/topo-recent-count-brightness-test.mjs +84 -0
- package/scripts/topo-recent-more-fw-test.mjs +126 -0
- package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
- package/scripts/topo-recent-row-fw-test.mjs +115 -0
- package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
- package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
- package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
- package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
- package/scripts/topo-reset-brightness-test.mjs +83 -0
- package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
- package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
- package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
- package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
- package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
- package/scripts/topo-starfield-hue-test.mjs +109 -0
- package/scripts/topo-status-ring-brightness-test.mjs +84 -0
- package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
- package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
- package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
- package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
- package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
- package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
- package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
- package/scripts/topo-watermark-breath-test.mjs +100 -0
- package/scripts/topo-watermark-recede-test.mjs +114 -0
- package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
- package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
- package/scripts/topo-zoom-level-color-test.mjs +105 -0
- package/.next/static/chunks/0ckoz2evm~lvq.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- package/.next/static/chunks/0qf8ynb6zk1~~.js +0 -4
- package/.next/static/chunks/10s69w5k6v8cr.js +0 -1
- /package/.next/static/{Q8lkSZiF_OETF8cugX0IW → AGbxLByQywWb5JcOo5dTf}/_buildManifest.js +0 -0
- /package/.next/static/{Q8lkSZiF_OETF8cugX0IW → AGbxLByQywWb5JcOo5dTf}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{Q8lkSZiF_OETF8cugX0IW → AGbxLByQywWb5JcOo5dTf}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* Round 533 verification: hub spokes gain drop-shadow glow on hub-hover
|
|
2
|
+
* — drop-shadow visual-polish family 9th anchor.
|
|
3
|
+
*
|
|
4
|
+
* Test phases:
|
|
5
|
+
* 1. rest: ALL spokes have data-topo-hub-spoke-glow='false',
|
|
6
|
+
* computed filter='none'
|
|
7
|
+
* 2. hover hub (mouse.move to hub center per R527 banked path):
|
|
8
|
+
* ALL spokes have glow='true', filter matches drop-shadow with
|
|
9
|
+
* cyber cyan-400 hue
|
|
10
|
+
* 3. transition list includes 'filter 250ms ease-out'
|
|
11
|
+
* 4. source-side regex confirms filter ternary + transition wiring
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
39
|
+
mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'),
|
|
40
|
+
] } });
|
|
41
|
+
});
|
|
42
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
43
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
44
|
+
const page = await ctx.newPage();
|
|
45
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
46
|
+
await page.waitForSelector('[data-topo-hub-spoke-glow]', { timeout: 15000 });
|
|
47
|
+
await page.waitForTimeout(800);
|
|
48
|
+
|
|
49
|
+
const readAll = async () => page.evaluate(() => {
|
|
50
|
+
const els = Array.from(document.querySelectorAll('[data-topo-hub-spoke-glow]'));
|
|
51
|
+
return els.map((el) => {
|
|
52
|
+
const cs = getComputedStyle(el);
|
|
53
|
+
return {
|
|
54
|
+
glow: el.getAttribute('data-topo-hub-spoke-glow'),
|
|
55
|
+
filter: cs.filter,
|
|
56
|
+
transition: cs.transition,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Phase 1: rest
|
|
62
|
+
const rest = await readAll();
|
|
63
|
+
|
|
64
|
+
// Phase 2: hover hub (mouse.move to hub center — bbox of hub-highlight
|
|
65
|
+
// or hub spoke origin near canvas center). Use hub-highlight bbox per
|
|
66
|
+
// R527 banked path.
|
|
67
|
+
const hubBbox = await page.locator('[data-topo-hub-highlight]').first().boundingBox();
|
|
68
|
+
if (hubBbox) {
|
|
69
|
+
await page.mouse.move(hubBbox.x + hubBbox.width / 2, hubBbox.y + hubBbox.height / 2);
|
|
70
|
+
}
|
|
71
|
+
await page.waitForTimeout(400);
|
|
72
|
+
const hover = await readAll();
|
|
73
|
+
|
|
74
|
+
await browser.close();
|
|
75
|
+
|
|
76
|
+
// Source regex
|
|
77
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
78
|
+
const sourceFilterTernary =
|
|
79
|
+
/filter: !reducedMotion && hoveredHub\s+\? \(isLight\s+\? 'drop-shadow\(0 0 1\.5px rgba\(13, 148, 136, 0\.4\)\)'\s+: 'drop-shadow\(0 0 1\.5px rgba\(34, 211, 238, 0\.4\)\)'\)\s+: undefined,/.test(src);
|
|
80
|
+
const sourceAttrWired =
|
|
81
|
+
/data-topo-hub-spoke-glow=\{!reducedMotion && hoveredHub \? 'true' : 'false'\}/.test(src);
|
|
82
|
+
const sourceTransitionExt =
|
|
83
|
+
/transition: 'stroke 250ms ease-out, stroke-width 250ms ease-out, opacity 250ms ease-out, filter 250ms ease-out'/.test(src);
|
|
84
|
+
|
|
85
|
+
const restAllFalse = rest.length > 0 && rest.every((s) => s.glow === 'false');
|
|
86
|
+
const restAllFilterNone = rest.length > 0 && rest.every((s) => s.filter === 'none' || s.filter === '');
|
|
87
|
+
const hoverAllTrue = hover.length > 0 && hover.every((s) => s.glow === 'true');
|
|
88
|
+
const hoverAllFilterDS = hover.length > 0 && hover.every((s) =>
|
|
89
|
+
/drop-shadow\(.+34,?\s*211,?\s*238/.test(s.filter || '')
|
|
90
|
+
);
|
|
91
|
+
const restTransitionHasFilter = rest.length > 0 && rest.every((s) =>
|
|
92
|
+
/\bfilter\b/.test(s.transition || '')
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const results = {
|
|
96
|
+
spokes_present: rest.length >= 3, // 4 nodes → 4 spokes
|
|
97
|
+
rest_all_glow_false: restAllFalse,
|
|
98
|
+
rest_all_filter_none: restAllFilterNone,
|
|
99
|
+
rest_transition_has_filter: restTransitionHasFilter,
|
|
100
|
+
hover_all_glow_true: hoverAllTrue,
|
|
101
|
+
hover_all_filter_drop_shadow: hoverAllFilterDS,
|
|
102
|
+
source_filter_ternary: sourceFilterTernary,
|
|
103
|
+
source_attr_wired: sourceAttrWired,
|
|
104
|
+
source_transition_ext: sourceTransitionExt,
|
|
105
|
+
};
|
|
106
|
+
const ok = Object.values(results).every(Boolean);
|
|
107
|
+
console.log(`${ok ? '✅' : '❌'} R533 hub-spoke hover-glow:`,
|
|
108
|
+
JSON.stringify(results, null, 2),
|
|
109
|
+
'\n spoke count:', rest.length,
|
|
110
|
+
'\n rest sample:', JSON.stringify(rest[0]),
|
|
111
|
+
'\n hover sample:', JSON.stringify(hover[0]));
|
|
112
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* Round 613 — per-node label card stacks brightness(1.15)
|
|
2
|
+
* onto R142's hover drop-shadow. 4th paint axis on the card's
|
|
3
|
+
* hover signature. Same banked R582/R583 stacked-filter pattern.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 idle nodes → label cards render
|
|
7
|
+
* 2. rest: filter contains rest drop-shadow but NO brightness,
|
|
8
|
+
* brightness-attr='1'
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: stacked filter conditional + data-attr
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
17
|
+
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
20
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
21
|
+
await ctx.addInitScript(() => {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
24
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
25
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
29
|
+
const r = await route.fetch();
|
|
30
|
+
const b = await r.json();
|
|
31
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
32
|
+
const mk = (alias) => ({
|
|
33
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
34
|
+
network_id: nid, project_dir: null,
|
|
35
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
36
|
+
});
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
43
|
+
await page.waitForSelector('[data-node-label-card-brightness]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-node-label-card-brightness]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
const cs = getComputedStyle(el);
|
|
50
|
+
return {
|
|
51
|
+
filter: cs.filter,
|
|
52
|
+
transitionProperty: cs.transitionProperty,
|
|
53
|
+
brightnessAttr: el.getAttribute('data-node-label-card-brightness'),
|
|
54
|
+
elevationAttr: el.getAttribute('data-node-label-card-elevation'),
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await browser.close();
|
|
59
|
+
|
|
60
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
61
|
+
const sourceCyberStack = /'drop-shadow\(0 4px 12px rgba\(0,0,0,0\.60\)\) brightness\(1\.15\)'/.test(src);
|
|
62
|
+
const sourceLightStack = /'drop-shadow\(0 3px 8px rgba\(15,23,42,0\.20\)\) brightness\(1\.15\)'/.test(src);
|
|
63
|
+
const sourceAttr = /data-node-label-card-brightness=\{!reducedMotion && hoveredAlias === session\.alias \? '1\.15' : '1'\}/.test(src);
|
|
64
|
+
|
|
65
|
+
const results = {
|
|
66
|
+
card_present: !!rest,
|
|
67
|
+
// At rest: rest-tier drop-shadow but no brightness
|
|
68
|
+
rest_has_drop_shadow: /drop-shadow/.test(rest?.filter || ''),
|
|
69
|
+
rest_no_brightness: !/brightness/.test(rest?.filter || ''),
|
|
70
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
71
|
+
rest_elevation_idle: rest?.elevationAttr === 'idle',
|
|
72
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
73
|
+
source_cyber_stack: sourceCyberStack,
|
|
74
|
+
source_light_stack: sourceLightStack,
|
|
75
|
+
source_attr: sourceAttr,
|
|
76
|
+
};
|
|
77
|
+
const ok = Object.values(results).every(Boolean);
|
|
78
|
+
console.log(`${ok ? '✅' : '❌'} R613 label card stacked brightness (4-axis hover paint signature):`,
|
|
79
|
+
JSON.stringify(results, null, 2),
|
|
80
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
81
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* Round 522 verification: chrome Ring/Grid layout toggle's inactive
|
|
2
|
+
* variant gains `hover:font-medium` typography preview. Closes chrome
|
|
3
|
+
* toggle group typography hover-fw family at the last remaining toggle.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. default (layout=ring): Ring active fw=500, Grid inactive fw=400
|
|
7
|
+
* + Grid data-attr = '500' (preview target)
|
|
8
|
+
* + Ring data-attr = null
|
|
9
|
+
* 2. hover Grid (inactive): fontWeight → 500 (preview lands)
|
|
10
|
+
* 3. source-side regex confirms hover:font-medium + transition wired
|
|
11
|
+
* for both buttons
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-layout]', { timeout: 15000 });
|
|
45
|
+
await page.waitForTimeout(800);
|
|
46
|
+
|
|
47
|
+
const buttons = await page.evaluate(() => {
|
|
48
|
+
const els = Array.from(document.querySelectorAll('[data-topo-chrome-layout]'));
|
|
49
|
+
return els.map((el) => ({
|
|
50
|
+
label: el.getAttribute('data-topo-chrome-layout'),
|
|
51
|
+
active: el.getAttribute('data-topo-chrome-layout-active'),
|
|
52
|
+
previewAttr: el.getAttribute('data-topo-chrome-layout-hover-preview-fw'),
|
|
53
|
+
fw: getComputedStyle(el).fontWeight,
|
|
54
|
+
}));
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Phase 2: hover the inactive (Grid since layout=ring default)
|
|
58
|
+
await page.hover('[data-topo-chrome-layout="grid"]');
|
|
59
|
+
await page.waitForTimeout(350);
|
|
60
|
+
const gridHoverFw = await page.evaluate(() =>
|
|
61
|
+
getComputedStyle(document.querySelector('[data-topo-chrome-layout="grid"]')).fontWeight
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
await browser.close();
|
|
65
|
+
|
|
66
|
+
// Source regex
|
|
67
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
68
|
+
const sourceWiredClassRing = /'ring' \? '.*font-medium.*' : '.*hover:font-medium'.*\$\{chromePopping === 'layout-ring'/.test(src);
|
|
69
|
+
const sourceWiredClassGrid = /'grid' \? '.*font-medium.*' : '.*hover:font-medium'.*\$\{chromePopping === 'layout-grid'/.test(src);
|
|
70
|
+
const sourceWiredAttrRing = /data-topo-chrome-layout-hover-preview-fw=\{layout === 'ring' \? null : '500'\}/.test(src);
|
|
71
|
+
const sourceWiredAttrGrid = /data-topo-chrome-layout-hover-preview-fw=\{layout === 'grid' \? null : '500'\}/.test(src);
|
|
72
|
+
const sourceWiredTransRing = /transition: '.*font-weight 150ms ease'.*\n.*Ring/.test(src) ||
|
|
73
|
+
/font-weight 150ms ease'\s*\}\}\s*>\s*\n\s*Ring/.test(src);
|
|
74
|
+
const sourceWiredTransGrid = /borderColor:.*containerBorder.*font-weight 150ms ease/.test(src);
|
|
75
|
+
|
|
76
|
+
const ring = buttons.find(b => b.label === 'ring');
|
|
77
|
+
const grid = buttons.find(b => b.label === 'grid');
|
|
78
|
+
|
|
79
|
+
const results = {
|
|
80
|
+
ring_active_true: ring?.active === 'true',
|
|
81
|
+
ring_active_fw_500: ring?.fw === '500',
|
|
82
|
+
ring_no_preview_attr: ring?.previewAttr === null,
|
|
83
|
+
grid_active_false: grid?.active === 'false',
|
|
84
|
+
grid_inactive_fw_400: grid?.fw === '400',
|
|
85
|
+
grid_preview_attr_500: grid?.previewAttr === '500',
|
|
86
|
+
grid_hover_fw_500: gridHoverFw === '500',
|
|
87
|
+
source_class_ring: sourceWiredClassRing,
|
|
88
|
+
source_class_grid: sourceWiredClassGrid,
|
|
89
|
+
source_attr_ring: sourceWiredAttrRing,
|
|
90
|
+
source_attr_grid: sourceWiredAttrGrid,
|
|
91
|
+
source_trans_grid: sourceWiredTransGrid,
|
|
92
|
+
};
|
|
93
|
+
const ok = Object.values(results).every(Boolean);
|
|
94
|
+
console.log(`${ok ? '✅' : '❌'} R522 layout hover-fw preview:`,
|
|
95
|
+
JSON.stringify(results, null, 2),
|
|
96
|
+
'\n buttons:', JSON.stringify(buttons),
|
|
97
|
+
'\n grid hover fw:', gridHoverFw);
|
|
98
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* Round 597 verification: Layout Ring/Grid segmented buttons
|
|
2
|
+
* gain hover:brightness-[1.15]. 37+38th anchors (6+7th HTML).
|
|
3
|
+
* Paired-anchor round closing the 2nd segmented control at
|
|
4
|
+
* brightness parity (R596 was zoom +/-).
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock nodes → chrome strip renders Ring + Grid buttons
|
|
8
|
+
* 2. rest: filter='none', brightness-hover-attr='1.15'
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: hover:brightness-[1.15] + 'filter 150ms ease' in
|
|
11
|
+
* inline transition list
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const rest = await page.evaluate(() => {
|
|
48
|
+
const ring = document.querySelector('[data-topo-chrome-layout="ring"]');
|
|
49
|
+
const grid = document.querySelector('[data-topo-chrome-layout="grid"]');
|
|
50
|
+
if (!ring || !grid) return null;
|
|
51
|
+
return {
|
|
52
|
+
ring: {
|
|
53
|
+
filter: getComputedStyle(ring).filter,
|
|
54
|
+
transitionProperty: getComputedStyle(ring).transitionProperty,
|
|
55
|
+
brightnessHoverAttr: ring.getAttribute('data-topo-chrome-layout-ring-brightness-hover'),
|
|
56
|
+
ariaLabel: ring.textContent,
|
|
57
|
+
},
|
|
58
|
+
grid: {
|
|
59
|
+
filter: getComputedStyle(grid).filter,
|
|
60
|
+
transitionProperty: getComputedStyle(grid).transitionProperty,
|
|
61
|
+
brightnessHoverAttr: grid.getAttribute('data-topo-chrome-layout-grid-brightness-hover'),
|
|
62
|
+
ariaLabel: grid.textContent,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await browser.close();
|
|
68
|
+
|
|
69
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
70
|
+
const sourceRingFilter = /data-topo-chrome-layout="ring"[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
|
|
71
|
+
const sourceGridFilter = /data-topo-chrome-layout="grid"[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
|
|
72
|
+
const sourceRingTransition = /data-topo-chrome-layout="ring"[\s\S]*?filter 150ms ease/.test(src);
|
|
73
|
+
const sourceGridTransition = /data-topo-chrome-layout="grid"[\s\S]*?filter 150ms ease/.test(src);
|
|
74
|
+
|
|
75
|
+
const results = {
|
|
76
|
+
both_buttons_present: !!rest,
|
|
77
|
+
ring_rest_filter_none: rest?.ring.filter === 'none',
|
|
78
|
+
grid_rest_filter_none: rest?.grid.filter === 'none',
|
|
79
|
+
ring_hover_attr_115: rest?.ring.brightnessHoverAttr === '1.15',
|
|
80
|
+
grid_hover_attr_115: rest?.grid.brightnessHoverAttr === '1.15',
|
|
81
|
+
ring_label: /ring/i.test(rest?.ring.ariaLabel || ''),
|
|
82
|
+
grid_label: /grid/i.test(rest?.grid.ariaLabel || ''),
|
|
83
|
+
ring_transition_filter: /filter/.test(rest?.ring.transitionProperty || ''),
|
|
84
|
+
grid_transition_filter: /filter/.test(rest?.grid.transitionProperty || ''),
|
|
85
|
+
source_ring_filter: sourceRingFilter,
|
|
86
|
+
source_grid_filter: sourceGridFilter,
|
|
87
|
+
source_ring_transition: sourceRingTransition,
|
|
88
|
+
source_grid_transition: sourceGridTransition,
|
|
89
|
+
};
|
|
90
|
+
const ok = Object.values(results).every(Boolean);
|
|
91
|
+
console.log(`${ok ? '✅' : '❌'} R597 Ring/Grid brightness (37+38th anchors, 2nd segmented control closure):`,
|
|
92
|
+
JSON.stringify(results, null, 2),
|
|
93
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
94
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* Round 588 verification: legend panel count <text> gains
|
|
2
|
+
* filter brightness(1.15) on hoveredPanel === 'legend'.
|
|
3
|
+
* 27th anchor in per-element brightness family. Closes
|
|
4
|
+
* title↔count parity at legend panel header.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock nodes → legend panel renders
|
|
8
|
+
* 2. rest (no panel hover): filter='none', brightness-attr='1'
|
|
9
|
+
* 3. transition-property contains 'filter'
|
|
10
|
+
* 4. source: filter conditional + data-attr
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
17
|
+
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
20
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
21
|
+
await ctx.addInitScript(() => {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
24
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
25
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
29
|
+
const r = await route.fetch();
|
|
30
|
+
const b = await r.json();
|
|
31
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
32
|
+
const mk = (alias) => ({
|
|
33
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
34
|
+
network_id: nid, project_dir: null,
|
|
35
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
36
|
+
});
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2'), mk('a·3')] } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
43
|
+
await page.waitForSelector('[data-legend-panel-count-brightness]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-legend-panel-count-brightness]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
const cs = getComputedStyle(el);
|
|
50
|
+
return {
|
|
51
|
+
filter: cs.filter,
|
|
52
|
+
transitionProperty: cs.transitionProperty,
|
|
53
|
+
brightnessAttr: el.getAttribute('data-legend-panel-count-brightness'),
|
|
54
|
+
letterSpacingAttr: el.getAttribute('data-legend-panel-count-letter-spacing'),
|
|
55
|
+
textContent: el.textContent,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await browser.close();
|
|
60
|
+
|
|
61
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
62
|
+
const sourceFilter = /filter: hoveredPanel === 'legend' \? 'brightness\(1\.15\)' : undefined/.test(src);
|
|
63
|
+
const sourceAttr = /data-legend-panel-count-brightness=\{hoveredPanel === 'legend' \? '1\.15' : '1'\}/.test(src);
|
|
64
|
+
const sourceTransition = /transition: 'fill 200ms ease-out, font-weight 200ms ease-out, letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
|
|
65
|
+
|
|
66
|
+
const results = {
|
|
67
|
+
count_present: !!rest,
|
|
68
|
+
rest_filter_none: rest?.filter === 'none',
|
|
69
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
70
|
+
rest_letter_spacing: rest?.letterSpacingAttr === '0.2',
|
|
71
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
72
|
+
source_filter: sourceFilter,
|
|
73
|
+
source_attr: sourceAttr,
|
|
74
|
+
source_transition: sourceTransition,
|
|
75
|
+
};
|
|
76
|
+
const ok = Object.values(results).every(Boolean);
|
|
77
|
+
console.log(`${ok ? '✅' : '❌'} R588 legend-panel-count brightness (27th anchor, panel-header parity):`,
|
|
78
|
+
JSON.stringify(results, null, 2),
|
|
79
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
80
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/* Round 518 verification: legend-row COUNT digit gains the same 3-tier
|
|
2
|
+
* hover-letter-spacing tween R433 added to the LABEL — symmetric row
|
|
3
|
+
* hover gesture. Also lifts transition list 150 → 200ms closing R475
|
|
4
|
+
* panel-row cadence at the count surface.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. rest: letter-spacing 0px, attr='0px', transition includes '200ms'
|
|
8
|
+
* 2. hover: letter-spacing 0.25px, attr='0.25px'
|
|
9
|
+
* 3. source-side regex confirms 3-tier wiring + 200ms cadence
|
|
10
|
+
*
|
|
11
|
+
* Pin tier (0.5px) requires real click + filter-pin localStorage —
|
|
12
|
+
* skip and rely on source-regex for the pinned tier.
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from 'playwright';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
|
|
17
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
18
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
19
|
+
|
|
20
|
+
const browser = await chromium.launch({ headless: true });
|
|
21
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try {
|
|
25
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
26
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
27
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
28
|
+
} catch {}
|
|
29
|
+
});
|
|
30
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
31
|
+
const r = await route.fetch();
|
|
32
|
+
const b = await r.json();
|
|
33
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
34
|
+
const mk = (alias, status) => ({
|
|
35
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
36
|
+
network_id: nid, project_dir: null,
|
|
37
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
38
|
+
});
|
|
39
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
40
|
+
mk('a·1', 'idle'),
|
|
41
|
+
mk('a·2', 'idle'),
|
|
42
|
+
mk('b·1', 'working'),
|
|
43
|
+
] } });
|
|
44
|
+
});
|
|
45
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
46
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
47
|
+
const page = await ctx.newPage();
|
|
48
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
49
|
+
await page.waitForSelector('[data-legend-count]', { timeout: 15000 });
|
|
50
|
+
await page.waitForTimeout(800);
|
|
51
|
+
|
|
52
|
+
// Pick the 'online' row's count (it'll have count > 0 so we see typography)
|
|
53
|
+
const targetSel = '[data-legend-count="idle"]';
|
|
54
|
+
|
|
55
|
+
// Phase 1: rest
|
|
56
|
+
const rest = await page.evaluate((sel) => {
|
|
57
|
+
const el = document.querySelector(sel);
|
|
58
|
+
if (!el) return null;
|
|
59
|
+
const cs = getComputedStyle(el);
|
|
60
|
+
return {
|
|
61
|
+
attrLS: el.getAttribute('data-legend-count-letter-spacing'),
|
|
62
|
+
attrTrans: el.getAttribute('data-legend-count-transition'),
|
|
63
|
+
letterSpacing: cs.letterSpacing,
|
|
64
|
+
transition: cs.transition,
|
|
65
|
+
};
|
|
66
|
+
}, targetSel);
|
|
67
|
+
|
|
68
|
+
// Phase 2: hover the row's hitbox (the parent g — but row hover is keyed
|
|
69
|
+
// on hoveredStatus which is set by mouseEnter on the row-hitbox rect.
|
|
70
|
+
// Easier: hover the LABEL text (also part of the row) and observe count.
|
|
71
|
+
await page.hover('[data-legend-row-label="idle"]');
|
|
72
|
+
await page.waitForTimeout(350);
|
|
73
|
+
const hover = await page.evaluate((sel) => {
|
|
74
|
+
const el = document.querySelector(sel);
|
|
75
|
+
if (!el) return null;
|
|
76
|
+
const cs = getComputedStyle(el);
|
|
77
|
+
return {
|
|
78
|
+
attrLS: el.getAttribute('data-legend-count-letter-spacing'),
|
|
79
|
+
letterSpacing: cs.letterSpacing,
|
|
80
|
+
};
|
|
81
|
+
}, targetSel);
|
|
82
|
+
|
|
83
|
+
await browser.close();
|
|
84
|
+
|
|
85
|
+
// Phase 3: source regex — verifies all 3 tiers + 200ms cadence
|
|
86
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
87
|
+
const sourceWiredLS =
|
|
88
|
+
/letterSpacing: isPinned \? '0\.5px' :\s*hoveredStatus === row\.key \? '0\.25px' : '0px',/.test(src);
|
|
89
|
+
const sourceWiredAttr =
|
|
90
|
+
/data-legend-count-letter-spacing=\{isPinned \? '0\.5px' : hoveredStatus === row\.key \? '0\.25px' : '0px'\}/.test(src);
|
|
91
|
+
const sourceWiredCadence =
|
|
92
|
+
/transition: 'opacity 200ms ease-out, fill 200ms ease-out, font-weight 200ms ease-out, letter-spacing 200ms ease-out',/.test(src);
|
|
93
|
+
|
|
94
|
+
const results = {
|
|
95
|
+
rest_attr_0: rest?.attrLS === '0px',
|
|
96
|
+
rest_attr_transition_200: rest?.attrTrans === '200ms',
|
|
97
|
+
rest_letter_spacing_0: rest?.letterSpacing === '0px' || rest?.letterSpacing === 'normal',
|
|
98
|
+
rest_transition_200ms: /(200ms|0\.2s)/.test(rest?.transition || ''),
|
|
99
|
+
hover_attr_025: hover?.attrLS === '0.25px',
|
|
100
|
+
hover_letter_spacing_025: hover?.letterSpacing === '0.25px',
|
|
101
|
+
source_3_tier_ls: sourceWiredLS,
|
|
102
|
+
source_attr_3_tier: sourceWiredAttr,
|
|
103
|
+
source_200ms_cadence: sourceWiredCadence,
|
|
104
|
+
};
|
|
105
|
+
const ok = Object.values(results).every(Boolean);
|
|
106
|
+
console.log(`${ok ? '✅' : '❌'} R518 legend-count 3-tier letter-spacing + 200ms:`, JSON.stringify(results, null, 2),
|
|
107
|
+
'\n rest:', JSON.stringify(rest), '\n hover:', JSON.stringify(hover));
|
|
108
|
+
process.exit(ok ? 0 : 1);
|