@sleep2agi/agent-network-dashboard 0.5.3-preview.26 → 0.5.3-preview.261
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 +7 -7
- 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/[root-of-the-server]__0tx8s8i._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +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 +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/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/{05uydm8okqgqe.js → 0-vlr8~b0f-cx.js} +1 -1
- package/.next/static/chunks/08.pwokcpknmp.js +1 -0
- package/.next/static/chunks/0nd-y~i5proep.js +1 -0
- package/.next/static/chunks/0ztakmtfxkgya.js +4 -0
- package/.next/static/chunks/16-7qr7qx9zrz.css +2 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/api/hub/servers/route.ts +3 -29
- package/app/components/TopoGraph.tsx +6588 -201
- package/app/globals.css +897 -7
- package/app/lib/serverDedupe.ts +122 -0
- package/app/lib/vendorIdentity.ts +74 -56
- package/package.json +4 -4
- package/public/vendors/claude.svg +7 -8
- package/public/vendors/minimax.svg +8 -9
- package/public/vendors/openai.svg +8 -10
- package/scripts/p157-rc2-dedup-test.mjs +110 -0
- package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
- package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
- package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-animation-temporal-modes-catalog-test.mjs +144 -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-halo-layers-test.mjs +85 -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-canvas-desc-a11y-test.mjs +87 -0
- package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
- package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
- package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
- package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -0
- package/scripts/topo-card-chat-brightness-test.mjs +86 -0
- package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
- package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
- package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
- package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
- package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
- package/scripts/topo-chip-pin-halo-test.mjs +85 -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-chrome-control-halo-layers-test.mjs +22 -0
- package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
- package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
- package/scripts/topo-chrome-strip-entrance-animation-test.mjs +115 -0
- package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
- package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
- package/scripts/topo-click-ripple-glow-test.mjs +86 -0
- package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
- package/scripts/topo-click-ripple-sw-test.mjs +110 -0
- package/scripts/topo-crescent-breath-test.mjs +104 -0
- package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
- package/scripts/topo-crescent-recede-test.mjs +111 -0
- package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
- package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
- package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
- package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
- package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
- package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
- package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
- package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -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-flow-rail-halo-layers-test.mjs +89 -0
- package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
- package/scripts/topo-edge-pill-glow-test.mjs +67 -0
- package/scripts/topo-edge-pin-halo-test.mjs +99 -0
- package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
- package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
- package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
- package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-filter-pill-glow-test.mjs +90 -0
- package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-flow-rail-brightness-test.mjs +80 -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-box-halo-layers-test.mjs +91 -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-halo-layers-test.mjs +78 -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-h2-dual-axis-breath-test.mjs +92 -0
- package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
- package/scripts/topo-halo-chat-gate-test.mjs +72 -0
- package/scripts/topo-hover-detail-halo-test.mjs +76 -0
- package/scripts/topo-hub-a11y-title-test.mjs +95 -0
- package/scripts/topo-hub-core-brightness-test.mjs +82 -0
- package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
- package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
- package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -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-halo-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
- package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
- package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
- package/scripts/topo-hub-highlight-r-test.mjs +112 -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-hover-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
- package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
- package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
- package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
- package/scripts/topo-kicker-breath-test.mjs +100 -0
- package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
- package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
- package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -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-layout-toggle-halo-layers-test.mjs +95 -0
- package/scripts/topo-legend-count-brightness-test.mjs +80 -0
- package/scripts/topo-legend-count-halo-layers-test.mjs +79 -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-panel-title-breath-test.mjs +86 -0
- package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
- package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -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-legend-trio-halo-layers-test.mjs +22 -0
- package/scripts/topo-minimap-container-halo-test.mjs +82 -0
- package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
- package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
- package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
- package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -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-avatar-halo-layers-test.mjs +25 -0
- package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
- package/scripts/topo-node-label-card-halo-test.mjs +76 -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-halo-layers-test.mjs +89 -0
- package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
- package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
- package/scripts/topo-overlap-test.mjs +22 -8
- package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
- package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
- package/scripts/topo-panel-rect-halo-test.mjs +90 -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-panel-titles-dual-axis-breath-test.mjs +94 -0
- package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
- package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
- package/scripts/topo-pill-x-rotate-test.mjs +96 -0
- package/scripts/topo-pip-brightness-test.mjs +85 -0
- package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -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-r717-scan-beam-pair-pattern-test.mjs +100 -0
- package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
- package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -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-more-halo-layers-test.mjs +90 -0
- package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
- package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
- package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
- package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
- package/scripts/topo-recent-row-content-lift-test.mjs +140 -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-row-text-halo-layers-test.mjs +67 -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-respiratory-axis-count-stats-test.mjs +154 -0
- package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -0
- package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
- package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
- package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -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-halo-layers-test.mjs +87 -0
- package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
- package/scripts/topo-section-title-breath-test.mjs +83 -0
- package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
- package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
- package/scripts/topo-starfield-hue-test.mjs +109 -0
- package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -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-status-ring-halo-layers-test.mjs +105 -0
- package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
- package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
- package/scripts/topo-svg-title-a11y-r731-test.mjs +93 -0
- package/scripts/topo-svg-title-a11y-test.mjs +88 -0
- package/scripts/topo-title-block-entrance-animation-test.mjs +127 -0
- package/scripts/topo-title-block-envelope-breath-test.mjs +87 -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-tree-diag.mjs +95 -0
- package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
- package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
- package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
- package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
- package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
- package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
- package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
- package/scripts/topo-watermark-breath-test.mjs +100 -0
- package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
- package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
- package/scripts/topo-watermark-recede-test.mjs +114 -0
- package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
- package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
- package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
- package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
- package/scripts/topo-zoom-level-breath-test.mjs +87 -0
- package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
- package/scripts/topo-zoom-level-color-test.mjs +105 -0
- package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
- package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
- package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
- package/.next/static/chunks/0b57cx-~yee9s.js +0 -1
- package/.next/static/chunks/0c5ux9rrl-j.a.js +0 -4
- package/.next/static/chunks/0ixrbcha76lse.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → CLsgsYpGMRUiIcJJK3xkR}/_buildManifest.js +0 -0
- /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → CLsgsYpGMRUiIcJJK3xkR}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → CLsgsYpGMRUiIcJJK3xkR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* Round 605 — per-node avatar gains drop-shadow on hover,
|
|
2
|
+
* stacked with brightness via banked R582/R583 stacked-filter
|
|
3
|
+
* pattern. 4th hover axis on avatar (brightness + rotate +
|
|
4
|
+
* scale + drop-shadow). 3-element sibling edit (image + 2
|
|
5
|
+
* fallback branches).
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. mock 2 idle nodes → avatar renders
|
|
9
|
+
* 2. rest: filter='none', drop-shadow attr 'none'
|
|
10
|
+
* 3. computed transition-property contains 'filter'
|
|
11
|
+
* 4. source: stacked filter conditional + data-attr on all
|
|
12
|
+
* 3 branches
|
|
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) => ({
|
|
35
|
+
alias, status: 'idle', 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: [mk('a·1'), mk('a·2')] } });
|
|
40
|
+
});
|
|
41
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
42
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
43
|
+
const page = await ctx.newPage();
|
|
44
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
45
|
+
await page.waitForSelector('[data-node-avatar-drop-shadow]', { timeout: 15000, state: 'attached' });
|
|
46
|
+
await page.waitForTimeout(500);
|
|
47
|
+
|
|
48
|
+
const rest = await page.evaluate(() => {
|
|
49
|
+
const el = document.querySelector('[data-node-avatar-drop-shadow]');
|
|
50
|
+
if (!el) return null;
|
|
51
|
+
const cs = getComputedStyle(el);
|
|
52
|
+
return {
|
|
53
|
+
filter: cs.filter,
|
|
54
|
+
transitionProperty: cs.transitionProperty,
|
|
55
|
+
dropShadowAttr: el.getAttribute('data-node-avatar-drop-shadow'),
|
|
56
|
+
brightnessAttr: el.getAttribute('data-node-avatar-brightness') || null,
|
|
57
|
+
rotateAttr: el.getAttribute('data-node-avatar-rotate'),
|
|
58
|
+
scaleAttr: el.getAttribute('data-node-avatar-scale'),
|
|
59
|
+
hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceImageDS = /data-node-avatar-drop-shadow=\{isAvatarHovered \? `0 0 4px \$\{pal\.legendAccent\}99` : 'none'\}/.test(src);
|
|
67
|
+
const sourceMonogramDS = /data-node-avatar-monogram-drop-shadow=\{isAvatarFallbackHovered \? `0 0 4px \$\{pal\.legendAccent\}99` : 'none'\}/.test(src);
|
|
68
|
+
const sourceFallbackDS = /data-node-avatar-fallback-drop-shadow=\{isAvatarFallbackHovered \? `0 0 4px \$\{pal\.legendAccent\}99` : 'none'\}/.test(src);
|
|
69
|
+
const sourceStackedFilters = (src.match(/`drop-shadow\(0 0 4px \$\{pal\.legendAccent\}99\) brightness\(1\.15\)`/g) || []).length >= 3;
|
|
70
|
+
|
|
71
|
+
const results = {
|
|
72
|
+
avatar_present: !!rest,
|
|
73
|
+
rest_filter_none: rest?.filter === 'none',
|
|
74
|
+
rest_drop_shadow_none: rest?.dropShadowAttr === 'none',
|
|
75
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
76
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
77
|
+
source_image_ds_attr: sourceImageDS,
|
|
78
|
+
source_monogram_ds: sourceMonogramDS,
|
|
79
|
+
source_fallback_ds: sourceFallbackDS,
|
|
80
|
+
source_3_stacked: sourceStackedFilters,
|
|
81
|
+
};
|
|
82
|
+
const ok = Object.values(results).every(Boolean);
|
|
83
|
+
console.log(`${ok ? '✅' : '❌'} R605 avatar drop-shadow (3/3 branches, 4-axis hover signature):`,
|
|
84
|
+
JSON.stringify(results, null, 2),
|
|
85
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
86
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/* Round 558 verification: per-node avatar hover-brightness family
|
|
2
|
+
* closes at 3 anchors. R501 already covers the vendor.logo image
|
|
3
|
+
* branch; R558 adds the monogram + prefix-group fallback branches.
|
|
4
|
+
*
|
|
5
|
+
* Mock with claude-code-cli runtime and no recognized vendor model
|
|
6
|
+
* → triggers the prefix-group fallback branch (hue-hashed initial).
|
|
7
|
+
*
|
|
8
|
+
* Test phases:
|
|
9
|
+
* 1. wait for [data-node-avatar-fallback] to render
|
|
10
|
+
* 2. rest filter = 'none', hovered attr = 'false'
|
|
11
|
+
* 3. hover the node → filter contains 'brightness(1.15)',
|
|
12
|
+
* hovered attr = 'true'
|
|
13
|
+
* 4. source-side regex confirms both fallback branches wired
|
|
14
|
+
*/
|
|
15
|
+
import { chromium } from 'playwright';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
|
|
18
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
19
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
20
|
+
|
|
21
|
+
const browser = await chromium.launch({ headless: true });
|
|
22
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
23
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
24
|
+
await ctx.addInitScript(() => {
|
|
25
|
+
try {
|
|
26
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
27
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
28
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
29
|
+
} catch {}
|
|
30
|
+
});
|
|
31
|
+
// model=null → vendor=unknown → prefix-group fallback branch.
|
|
32
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
33
|
+
const r = await route.fetch();
|
|
34
|
+
const b = await r.json();
|
|
35
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
36
|
+
const mk = (alias) => ({
|
|
37
|
+
alias, status: 'idle', model: null, runtime: null,
|
|
38
|
+
network_id: nid, project_dir: null,
|
|
39
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
40
|
+
});
|
|
41
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('foo·1'), mk('foo·2')] } });
|
|
42
|
+
});
|
|
43
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
44
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
45
|
+
const page = await ctx.newPage();
|
|
46
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
47
|
+
await page.waitForSelector('[data-node-avatar-fallback="foo·1"]', { timeout: 15000 });
|
|
48
|
+
await page.waitForTimeout(500);
|
|
49
|
+
|
|
50
|
+
const avatarSel = '[data-node-avatar-fallback="foo·1"]';
|
|
51
|
+
const nodeSel = 'g[data-node="foo·1"]';
|
|
52
|
+
|
|
53
|
+
const rest = await page.evaluate((s) => {
|
|
54
|
+
const el = document.querySelector(s);
|
|
55
|
+
if (!el) return null;
|
|
56
|
+
const cs = getComputedStyle(el);
|
|
57
|
+
return {
|
|
58
|
+
filter: cs.filter,
|
|
59
|
+
transitionProperty: cs.transitionProperty,
|
|
60
|
+
transitionDuration: cs.transitionDuration,
|
|
61
|
+
hoveredAttr: el.getAttribute('data-node-avatar-fallback-hovered'),
|
|
62
|
+
};
|
|
63
|
+
}, avatarSel);
|
|
64
|
+
|
|
65
|
+
// Hover the parent node group (the avatar is pointerEvents:none inside,
|
|
66
|
+
// but the node group handles hover; node-hovered state is what we test).
|
|
67
|
+
await page.hover(nodeSel);
|
|
68
|
+
await page.waitForTimeout(400);
|
|
69
|
+
const hover = await page.evaluate((s) => {
|
|
70
|
+
const el = document.querySelector(s);
|
|
71
|
+
if (!el) return null;
|
|
72
|
+
const cs = getComputedStyle(el);
|
|
73
|
+
return {
|
|
74
|
+
filter: cs.filter,
|
|
75
|
+
hoveredAttr: el.getAttribute('data-node-avatar-fallback-hovered'),
|
|
76
|
+
};
|
|
77
|
+
}, avatarSel);
|
|
78
|
+
|
|
79
|
+
await browser.close();
|
|
80
|
+
|
|
81
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
82
|
+
const sourceMonogramG = /data-node-avatar-monogram-hovered=\{isAvatarFallbackHovered/.test(src);
|
|
83
|
+
const sourceFallbackG = /data-node-avatar-fallback-hovered=\{isAvatarFallbackHovered/.test(src);
|
|
84
|
+
const sourceBrightnessExpr = /filter: isAvatarFallbackHovered \? 'brightness\(1\.15\)' : undefined/.test(src);
|
|
85
|
+
const sourceTransitionExpr = /transition: 'filter 200ms ease-out'/.test(src);
|
|
86
|
+
|
|
87
|
+
const results = {
|
|
88
|
+
rest_filter_none: rest?.filter === 'none',
|
|
89
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
90
|
+
hover_filter_brightness: /brightness\(1\.15\)/.test(hover?.filter || ''),
|
|
91
|
+
hover_hovered_true: hover?.hoveredAttr === 'true',
|
|
92
|
+
transition_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
93
|
+
transition_duration: rest?.transitionDuration === '0.2s',
|
|
94
|
+
source_monogram_group: sourceMonogramG,
|
|
95
|
+
source_fallback_group: sourceFallbackG,
|
|
96
|
+
source_brightness_expr: sourceBrightnessExpr,
|
|
97
|
+
source_transition_expr: sourceTransitionExpr,
|
|
98
|
+
};
|
|
99
|
+
const ok = Object.values(results).every(Boolean);
|
|
100
|
+
console.log(`${ok ? '✅' : '❌'} R558 per-node avatar fallback hover-brightness (closes 3-anchor family):`,
|
|
101
|
+
JSON.stringify(results, null, 2),
|
|
102
|
+
`\n rest: ${JSON.stringify(rest)}`,
|
|
103
|
+
`\n hover: ${JSON.stringify(hover)}`);
|
|
104
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* Round 601 — extends R600 hover-rotate-3 to the 2 avatar
|
|
2
|
+
* fallback branches (vendor monogram + prefix-group initial),
|
|
3
|
+
* closing per-node avatar rotate coverage at 3/3 branches.
|
|
4
|
+
* Same R558 brightness-coverage closure pattern, now for rotate.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock node with non-vendor-logo runtime → monogram branch
|
|
8
|
+
* renders OR fallback branch renders (depends on vendor map)
|
|
9
|
+
* 2. rest: rotate='0deg' or 'none', rotate-attr='0'
|
|
10
|
+
* 3. computed transition-property contains 'rotate'
|
|
11
|
+
* 4. transform-origin set to node center coords
|
|
12
|
+
* 5. source: rotate conditional on BOTH branch elements
|
|
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
|
+
// Use an unknown vendor model to force fallback branch render
|
|
35
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
36
|
+
{ alias: 'unknown·1', status: 'idle', model: 'mystery-model-3000',
|
|
37
|
+
runtime: 'claude-code-cli', network_id: nid, project_dir: null,
|
|
38
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
39
|
+
{ alias: 'unknown·2', status: 'idle', model: 'mystery-model-3000',
|
|
40
|
+
runtime: 'claude-code-cli', network_id: nid, project_dir: null,
|
|
41
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
42
|
+
] } });
|
|
43
|
+
});
|
|
44
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
45
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
46
|
+
const page = await ctx.newPage();
|
|
47
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
48
|
+
// Either monogram or fallback should render based on vendor resolution
|
|
49
|
+
await page.waitForSelector('[data-node-avatar-fallback-rotate], [data-node-avatar-monogram-rotate]', { timeout: 15000, state: 'attached' });
|
|
50
|
+
await page.waitForTimeout(500);
|
|
51
|
+
|
|
52
|
+
const rest = await page.evaluate(() => {
|
|
53
|
+
const fallback = document.querySelector('[data-node-avatar-fallback-rotate]');
|
|
54
|
+
const monogram = document.querySelector('[data-node-avatar-monogram-rotate]');
|
|
55
|
+
const el = fallback || monogram;
|
|
56
|
+
if (!el) return null;
|
|
57
|
+
const cs = getComputedStyle(el);
|
|
58
|
+
return {
|
|
59
|
+
branch: fallback ? 'fallback' : 'monogram',
|
|
60
|
+
rotate: cs.rotate,
|
|
61
|
+
transformOrigin: cs.transformOrigin,
|
|
62
|
+
transitionProperty: cs.transitionProperty,
|
|
63
|
+
rotateAttr: el.getAttribute('data-node-avatar-fallback-rotate') || el.getAttribute('data-node-avatar-monogram-rotate'),
|
|
64
|
+
hoveredAttr: el.getAttribute('data-node-avatar-fallback-hovered') || el.getAttribute('data-node-avatar-monogram-hovered'),
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await browser.close();
|
|
69
|
+
|
|
70
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
71
|
+
const sourceMonogramRotate = /data-node-avatar-monogram-rotate=\{isAvatarFallbackHovered \? '3' : '0'\}/.test(src);
|
|
72
|
+
const sourceFallbackRotate = /data-node-avatar-fallback-rotate=\{isAvatarFallbackHovered \? '3' : '0'\}/.test(src);
|
|
73
|
+
const sourceBothBranches = (src.match(/rotate: isAvatarFallbackHovered \? '3deg' : '0deg'/g) || []).length >= 2;
|
|
74
|
+
const sourceBothTransitions = (src.match(/transition: 'filter 200ms ease-out, rotate 200ms ease-out'/g) || []).length >= 3;
|
|
75
|
+
|
|
76
|
+
const results = {
|
|
77
|
+
branch_present: !!rest,
|
|
78
|
+
rest_rotate_zero: rest?.rotate === 'none' || rest?.rotate === '0deg',
|
|
79
|
+
rest_rotate_attr: rest?.rotateAttr === '0',
|
|
80
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
81
|
+
has_transform_origin: !!rest?.transformOrigin && rest.transformOrigin !== '',
|
|
82
|
+
transition_has_rotate: /rotate/.test(rest?.transitionProperty || ''),
|
|
83
|
+
source_monogram_rotate: sourceMonogramRotate,
|
|
84
|
+
source_fallback_rotate: sourceFallbackRotate,
|
|
85
|
+
source_both_branches: sourceBothBranches,
|
|
86
|
+
source_both_transitions: sourceBothTransitions,
|
|
87
|
+
};
|
|
88
|
+
const ok = Object.values(results).every(Boolean);
|
|
89
|
+
console.log(`${ok ? '✅' : '❌'} R601 avatar fallback rotate (3/3 branches closure):`,
|
|
90
|
+
JSON.stringify(results, null, 2),
|
|
91
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
92
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 600 milestone — node vendor avatar gains hover-rotate-3
|
|
2
|
+
* via CSS individual `rotate` property. 6th anchor in hover-
|
|
3
|
+
* rotate idiom. Brings per-node hover signature to 11 axes.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 idle nodes → avatar <image> renders
|
|
7
|
+
* 2. rest: rotate='0deg' or 'none', rotate-attr='0'
|
|
8
|
+
* 3. computed transition-property contains 'rotate'
|
|
9
|
+
* 4. transform-origin set to node center coords
|
|
10
|
+
* 5. source: rotate conditional + data-attr + transition extension
|
|
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-avatar-rotate]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-node-avatar-rotate]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
const cs = getComputedStyle(el);
|
|
50
|
+
return {
|
|
51
|
+
rotate: cs.rotate,
|
|
52
|
+
transformOrigin: cs.transformOrigin,
|
|
53
|
+
transitionProperty: cs.transitionProperty,
|
|
54
|
+
rotateAttr: el.getAttribute('data-node-avatar-rotate'),
|
|
55
|
+
hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
|
|
56
|
+
alias: el.getAttribute('data-node-avatar'),
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceRotate = /rotate: isAvatarHovered \? '3deg' : '0deg'/.test(src);
|
|
64
|
+
const sourceAttr = /data-node-avatar-rotate=\{isAvatarHovered \? '3' : '0'\}/.test(src);
|
|
65
|
+
const sourceTransformOrigin = /transformOrigin: `\$\{pos\.x\}px \$\{pos\.y\}px`/.test(src);
|
|
66
|
+
const sourceTransition = /transition: 'filter 200ms ease-out, rotate 200ms ease-out'/.test(src);
|
|
67
|
+
|
|
68
|
+
const results = {
|
|
69
|
+
avatar_present: !!rest,
|
|
70
|
+
rest_rotate_zero: rest?.rotate === 'none' || rest?.rotate === '0deg',
|
|
71
|
+
rest_rotate_attr: rest?.rotateAttr === '0',
|
|
72
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
73
|
+
has_transform_origin: !!rest?.transformOrigin && rest.transformOrigin !== '',
|
|
74
|
+
has_alias: !!rest?.alias,
|
|
75
|
+
transition_has_rotate: /rotate/.test(rest?.transitionProperty || ''),
|
|
76
|
+
source_rotate: sourceRotate,
|
|
77
|
+
source_attr: sourceAttr,
|
|
78
|
+
source_transform_origin: sourceTransformOrigin,
|
|
79
|
+
source_transition: sourceTransition,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R600 MILESTONE — node avatar rotate (6th hover-rotate anchor, 11-axis per-node):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* Round 602 — per-node avatar gains hover-scale-1.05 across
|
|
2
|
+
* all 3 branches (image + monogram + fallback). Avatar now
|
|
3
|
+
* has 3-axis hover signature: rotate (R600/R601) + brightness
|
|
4
|
+
* (R501/R558) + scale (R602). Mirrors R548 brand 书生 logo
|
|
5
|
+
* scale-105 idiom at the per-node tier.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. mock 2 idle nodes → avatar renders
|
|
9
|
+
* 2. rest: scale='none' or '1', scale-attr='1'
|
|
10
|
+
* 3. computed transition-property contains 'scale'
|
|
11
|
+
* 4. source: scale conditional + data-attr + transition extension
|
|
12
|
+
* on all 3 branches
|
|
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) => ({
|
|
35
|
+
alias, status: 'idle', 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: [mk('a·1'), mk('a·2')] } });
|
|
40
|
+
});
|
|
41
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
42
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
43
|
+
const page = await ctx.newPage();
|
|
44
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
45
|
+
await page.waitForSelector('[data-node-avatar-scale]', { timeout: 15000, state: 'attached' });
|
|
46
|
+
await page.waitForTimeout(500);
|
|
47
|
+
|
|
48
|
+
const rest = await page.evaluate(() => {
|
|
49
|
+
const el = document.querySelector('[data-node-avatar-scale]');
|
|
50
|
+
if (!el) return null;
|
|
51
|
+
const cs = getComputedStyle(el);
|
|
52
|
+
return {
|
|
53
|
+
scale: cs.scale,
|
|
54
|
+
transitionProperty: cs.transitionProperty,
|
|
55
|
+
scaleAttr: el.getAttribute('data-node-avatar-scale'),
|
|
56
|
+
rotateAttr: el.getAttribute('data-node-avatar-rotate'),
|
|
57
|
+
hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await browser.close();
|
|
62
|
+
|
|
63
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
64
|
+
const sourceImageScale = /data-node-avatar-scale=\{isAvatarHovered \? '1\.05' : '1'\}/.test(src);
|
|
65
|
+
const sourceMonogramScale = /data-node-avatar-monogram-scale=\{isAvatarFallbackHovered \? '1\.05' : '1'\}/.test(src);
|
|
66
|
+
const sourceFallbackScale = /data-node-avatar-fallback-scale=\{isAvatarFallbackHovered \? '1\.05' : '1'\}/.test(src);
|
|
67
|
+
const sourceBothBranchesScale = (src.match(/scale: isAvatarFallbackHovered \? '1\.05' : '1'/g) || []).length >= 2;
|
|
68
|
+
const sourceImageBranchScale = /scale: isAvatarHovered \? '1\.05' : '1'/.test(src);
|
|
69
|
+
const sourceAllTransitions = (src.match(/transition: 'filter 200ms ease-out, rotate 200ms ease-out, scale 200ms ease-out'/g) || []).length >= 3;
|
|
70
|
+
|
|
71
|
+
const results = {
|
|
72
|
+
avatar_present: !!rest,
|
|
73
|
+
// CSS scale at rest = 'none' or '1' depending on browser
|
|
74
|
+
rest_scale_one: rest?.scale === 'none' || rest?.scale === '1',
|
|
75
|
+
rest_scale_attr: rest?.scaleAttr === '1',
|
|
76
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
77
|
+
transition_has_scale: /scale/.test(rest?.transitionProperty || ''),
|
|
78
|
+
source_image_attr: sourceImageScale,
|
|
79
|
+
source_monogram_attr: sourceMonogramScale,
|
|
80
|
+
source_fallback_attr: sourceFallbackScale,
|
|
81
|
+
source_image_branch: sourceImageBranchScale,
|
|
82
|
+
source_both_fallback: sourceBothBranchesScale,
|
|
83
|
+
source_all_3_transitions: sourceAllTransitions,
|
|
84
|
+
};
|
|
85
|
+
const ok = Object.values(results).every(Boolean);
|
|
86
|
+
console.log(`${ok ? '✅' : '❌'} R602 avatar scale (3/3 branches, 3-axis hover signature):`,
|
|
87
|
+
JSON.stringify(results, null, 2),
|
|
88
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
89
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/* Round 620 — extend runtime badge isNodeActive gate to include
|
|
2
|
+
* chatAlias === session.alias. Single conceptual change cascades
|
|
3
|
+
* across ALL 6 badge axes (r/sw/icon-sw/drop-shadow/brightness/
|
|
4
|
+
* rotate). 6th anchor in chat-target-gated brightness family.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 2 idle nodes → runtime badge renders
|
|
8
|
+
* 2. rest (no hover, no chat): badge attrs reflect idle state
|
|
9
|
+
* 3. source: isNodeActive declaration uses gate union
|
|
10
|
+
* (hoveredAlias || chatAlias)
|
|
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-runtime-badge]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-runtime-badge]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
return {
|
|
50
|
+
activeAttr: el.getAttribute('data-runtime-badge-active'),
|
|
51
|
+
glowAttr: document.querySelector('[data-runtime-badge-glow]')?.getAttribute('data-runtime-badge-glow'),
|
|
52
|
+
brightnessAttr: document.querySelector('[data-runtime-badge-brightness]')?.getAttribute('data-runtime-badge-brightness'),
|
|
53
|
+
rotateAttr: document.querySelector('[data-runtime-badge-rotate]')?.getAttribute('data-runtime-badge-rotate'),
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await browser.close();
|
|
58
|
+
|
|
59
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
60
|
+
const sourceGate = /const isNodeActive = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
|
|
61
|
+
|
|
62
|
+
const results = {
|
|
63
|
+
badge_present: !!rest,
|
|
64
|
+
rest_active_false: rest?.activeAttr === 'false',
|
|
65
|
+
rest_glow_false: rest?.glowAttr === 'false',
|
|
66
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
67
|
+
rest_rotate_zero: rest?.rotateAttr === '0',
|
|
68
|
+
source_gate_or: sourceGate,
|
|
69
|
+
};
|
|
70
|
+
const ok = Object.values(results).every(Boolean);
|
|
71
|
+
console.log(`${ok ? '✅' : '❌'} R620 runtime badge chat-target gate (chat-gated family 6th anchor):`,
|
|
72
|
+
JSON.stringify(results, null, 2),
|
|
73
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
74
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* Round 604 — brand 书生 logo gains hover:drop-shadow-[0_0_8px_
|
|
2
|
+
* currentColor] as 5th axis (scale + rotate + brightness +
|
|
3
|
+
* breath + drop-shadow). Tailwind v4 filter utilities stack
|
|
4
|
+
* via CSS-var system, so drop-shadow composes with brightness.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. dashboard mounts → brand logo renders in title block
|
|
8
|
+
* 2. rest: filter does NOT contain drop-shadow (no hover)
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: hover:drop-shadow-[0_0_8px_currentColor] in
|
|
11
|
+
* className + data-attr
|
|
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
|
+
|
|
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
|
+
const page = await ctx.newPage();
|
|
29
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
30
|
+
await page.waitForSelector('[data-topo-brand-logo]', { timeout: 15000, state: 'attached' });
|
|
31
|
+
await page.waitForTimeout(500);
|
|
32
|
+
|
|
33
|
+
const rest = await page.evaluate(() => {
|
|
34
|
+
const el = document.querySelector('[data-topo-brand-logo]');
|
|
35
|
+
if (!el) return null;
|
|
36
|
+
const cs = getComputedStyle(el);
|
|
37
|
+
return {
|
|
38
|
+
filter: cs.filter,
|
|
39
|
+
transitionProperty: cs.transitionProperty,
|
|
40
|
+
dropShadowAttr: el.getAttribute('data-topo-brand-logo-hover-drop-shadow'),
|
|
41
|
+
brightnessAttr: el.getAttribute('data-topo-brand-logo-hover-brightness'),
|
|
42
|
+
scaleAttr: el.getAttribute('data-topo-brand-logo-hover-scale'),
|
|
43
|
+
rotateAttr: el.getAttribute('data-topo-brand-logo-hover-rotate'),
|
|
44
|
+
breathAttr: el.getAttribute('data-topo-brand-logo-breath'),
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await browser.close();
|
|
49
|
+
|
|
50
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
51
|
+
const sourceClass = /hover:drop-shadow-\[0_0_8px_currentColor\]/.test(src);
|
|
52
|
+
const sourceAttr = /data-topo-brand-logo-hover-drop-shadow="0_0_8px_currentColor"/.test(src);
|
|
53
|
+
|
|
54
|
+
const results = {
|
|
55
|
+
logo_present: !!rest,
|
|
56
|
+
// At rest, no hover so no drop-shadow filter active
|
|
57
|
+
rest_no_drop_shadow: !/drop-shadow/.test(rest?.filter || ''),
|
|
58
|
+
has_drop_shadow_attr: rest?.dropShadowAttr === '0_0_8px_currentColor',
|
|
59
|
+
has_brightness_attr: rest?.brightnessAttr === '1.1',
|
|
60
|
+
has_scale_attr: rest?.scaleAttr === '1.05',
|
|
61
|
+
has_rotate_attr: rest?.rotateAttr === '6deg',
|
|
62
|
+
has_breath_attr: rest?.breathAttr === 'true' || rest?.breathAttr === 'false',
|
|
63
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
64
|
+
source_class: sourceClass,
|
|
65
|
+
source_attr: sourceAttr,
|
|
66
|
+
};
|
|
67
|
+
const ok = Object.values(results).every(Boolean);
|
|
68
|
+
console.log(`${ok ? '✅' : '❌'} R604 brand logo drop-shadow (5-axis hover signature):`,
|
|
69
|
+
JSON.stringify(results, null, 2),
|
|
70
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
71
|
+
process.exit(ok ? 0 : 1);
|