@sleep2agi/agent-network-dashboard 0.5.3-preview.2 → 0.5.3-preview.200
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/{05zlv0iopwd40.js → 01he.jfmupx6b.js} +1 -1
- package/.next/static/chunks/047xfmz-_yklx.js +1 -0
- package/.next/static/chunks/08.zg.lu3fwqw.js +4 -0
- package/.next/static/chunks/0_c5~297u5j0p.js +1 -0
- package/.next/static/chunks/{03a4--7ncekmk.js → 0v4-5tng.uh.7.js} +2 -2
- package/.next/static/chunks/17if82x7mcn4j.css +2 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/ServersDrawer.tsx +16 -3
- package/app/components/TopoGraph.tsx +5343 -182
- package/app/globals.css +228 -6
- 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-active-links-chip-halo-layers-test.mjs +81 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-alias-glow-test.mjs +121 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-avatar-brightness-test.mjs +116 -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-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-row-digit-ls-test.mjs +135 -0
- package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
- package/scripts/topo-chip-row-press-test.mjs +93 -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-press-fullstrip-test.mjs +105 -0
- package/scripts/topo-chrome-press-scale-test.mjs +100 -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-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-dense-alias-halo-layers-test.mjs +80 -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-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-filter-pills-press-test.mjs +96 -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-focus-outline-transition-test.mjs +107 -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-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-halo-chat-gate-test.mjs +72 -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-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-halo-layers-test.mjs +78 -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-hover-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-hub-idle-breath-test.mjs +109 -0
- 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-hub-spoke-halo-layers-test.mjs +97 -0
- package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
- package/scripts/topo-kicker-halo-layers-test.mjs +82 -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-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-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-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-box-dash-test.mjs +89 -0
- package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
- package/scripts/topo-orphan-label-italic-test.mjs +90 -0
- package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
- 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-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-halo-layers-test.mjs +23 -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-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-recent-count-brightness-test.mjs +84 -0
- package/scripts/topo-recent-hot-pulse-test.mjs +102 -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-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-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-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-focus-transition-test.mjs +105 -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-activelinks-press-test.mjs +100 -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-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-recede-test.mjs +114 -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-brightness-test.mjs +83 -0
- package/scripts/topo-zoom-level-color-test.mjs +105 -0
- package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
- package/.next/static/chunks/0a4hmfvj-81x5.css +0 -2
- package/.next/static/chunks/0a~3lmgl2.3sm.js +0 -4
- package/.next/static/chunks/0w_zjois27-bj.js +0 -1
- package/.next/static/chunks/11vp-~kvgz81f.js +0 -1
- /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_buildManifest.js +0 -0
- /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* Round 598 verification: nodeSize S/M/L segmented buttons gain
|
|
2
|
+
* hover:brightness-[1.15]. 39+40+41st anchors (8+9+10th HTML).
|
|
3
|
+
* 3-anchor sibling edit closing the FINAL segmented chrome
|
|
4
|
+
* control at brightness parity (R596 zoom + R597 layout +
|
|
5
|
+
* R598 nodeSize = full segmented coverage 8/8 buttons).
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. mock nodes → chrome strip renders S + M + L buttons
|
|
9
|
+
* 2. rest: filter='none', brightness-hover-attr='1.15' on all 3
|
|
10
|
+
* 3. computed transition-property contains 'filter' on all 3
|
|
11
|
+
* 4. source: hover:brightness-[1.15] + arbitrary
|
|
12
|
+
* [transition-property:...,filter] in className
|
|
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-topo-chrome-nodesize="S"]', { timeout: 15000, state: 'attached' });
|
|
46
|
+
await page.waitForTimeout(500);
|
|
47
|
+
|
|
48
|
+
const rest = await page.evaluate(() => {
|
|
49
|
+
const els = ['S','M','L'].map(k => document.querySelector(`[data-topo-chrome-nodesize="${k}"]`));
|
|
50
|
+
if (els.some(e => !e)) return null;
|
|
51
|
+
return els.map(el => ({
|
|
52
|
+
key: el.getAttribute('data-topo-chrome-nodesize'),
|
|
53
|
+
filter: getComputedStyle(el).filter,
|
|
54
|
+
transitionProperty: getComputedStyle(el).transitionProperty,
|
|
55
|
+
brightnessHoverAttr: el.getAttribute('data-topo-chrome-nodesize-brightness-hover'),
|
|
56
|
+
textContent: el.textContent,
|
|
57
|
+
}));
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceFilter = /hover:brightness-\[1\.15\][^"]*\}\$\{idx > 0 \? 'border-l'/.test(src) ||
|
|
64
|
+
/hover:brightness-\[1\.15\]/.test(src.split('data-topo-chrome-nodesize=\\{lbl\\}')[1] || src);
|
|
65
|
+
const sourceTransition = /\[transition-property:color,background-color,transform,font-weight,filter\]/.test(src);
|
|
66
|
+
const sourceAttr = /data-topo-chrome-nodesize-brightness-hover="1\.15"/.test(src);
|
|
67
|
+
|
|
68
|
+
const results = {
|
|
69
|
+
all_three_present: !!rest && rest.length === 3,
|
|
70
|
+
rest_filter_all_none: !!rest && rest.every(r => r.filter === 'none'),
|
|
71
|
+
hover_attr_all_115: !!rest && rest.every(r => r.brightnessHoverAttr === '1.15'),
|
|
72
|
+
labels_S_M_L: !!rest && rest.map(r => r.textContent).join('') === 'SML',
|
|
73
|
+
transition_all_filter: !!rest && rest.every(r => /filter/.test(r.transitionProperty || '')),
|
|
74
|
+
source_filter_class: /hover:brightness-\[1\.15\]/.test(src),
|
|
75
|
+
source_transition: sourceTransition,
|
|
76
|
+
source_attr: sourceAttr,
|
|
77
|
+
};
|
|
78
|
+
const ok = Object.values(results).every(Boolean);
|
|
79
|
+
console.log(`${ok ? '✅' : '❌'} R598 nodeSize S/M/L brightness (39+40+41st anchors, all-segmented-closed):`,
|
|
80
|
+
JSON.stringify(results, null, 2),
|
|
81
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
82
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* Round 675 — chrome nodeSize S/M/L segmented trio gains multi-layer
|
|
2
|
+
* halo on hover via new hoveredNodeSize state ('S'|'M'|'L'|null).
|
|
3
|
+
* Pre-R675 the trio had only Tailwind hover:brightness-[1.15] (R598).
|
|
4
|
+
* Post-R675 inline filter uses the same 2+4 stride at pal.legendAccent
|
|
5
|
+
* tint as R667/R668/R673/R674 chrome-control siblings. With R675 the
|
|
6
|
+
* chrome strip is FULLY halo-extended across ALL 10 interactive
|
|
7
|
+
* controls.
|
|
8
|
+
*
|
|
9
|
+
* 34th anchor in multi-layer halo family (triplet sibling extension).
|
|
10
|
+
*
|
|
11
|
+
* Source assertions:
|
|
12
|
+
* - useState<'S'|'M'|'L'|null>
|
|
13
|
+
* - mouse handlers wire lbl into the value-typed setter w/ leave-guard
|
|
14
|
+
* - inline filter uses pal.legendAccent 2+4 stride alpha 80/40
|
|
15
|
+
* - data-topo-chrome-nodesize-halo-layers attr toggles '2'/'0'
|
|
16
|
+
*
|
|
17
|
+
* Runtime assertions:
|
|
18
|
+
* - all 3 buttons (S/M/L) present
|
|
19
|
+
* - rest state: halo-layers='0' on all
|
|
20
|
+
*/
|
|
21
|
+
import { chromium } from 'playwright';
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
|
|
24
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
25
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
26
|
+
|
|
27
|
+
const browser = await chromium.launch({ headless: true });
|
|
28
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
29
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
30
|
+
await ctx.addInitScript(() => {
|
|
31
|
+
try {
|
|
32
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
33
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
34
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
35
|
+
} catch {}
|
|
36
|
+
});
|
|
37
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
38
|
+
const r = await route.fetch();
|
|
39
|
+
const b = await r.json();
|
|
40
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
41
|
+
const mk = (alias) => ({
|
|
42
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
43
|
+
network_id: nid, project_dir: null,
|
|
44
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
45
|
+
});
|
|
46
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
47
|
+
});
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
49
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
50
|
+
const page = await ctx.newPage();
|
|
51
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
52
|
+
await page.waitForSelector('[data-topo-chrome-nodesize-halo-layers]', { timeout: 15000, state: 'attached' });
|
|
53
|
+
await page.waitForTimeout(500);
|
|
54
|
+
|
|
55
|
+
const restState = await page.evaluate(() => {
|
|
56
|
+
return Array.from(document.querySelectorAll('[data-topo-chrome-nodesize]')).map(el => ({
|
|
57
|
+
lbl: el.getAttribute('data-topo-chrome-nodesize'),
|
|
58
|
+
layers: el.getAttribute('data-topo-chrome-nodesize-halo-layers'),
|
|
59
|
+
active: el.getAttribute('data-topo-chrome-nodesize-active'),
|
|
60
|
+
}));
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceState = /const \[hoveredNodeSize, setHoveredNodeSize\] = useState<'S' \| 'M' \| 'L' \| null>\(null\);/.test(src);
|
|
67
|
+
const sourceMouseHandlers = /onMouseEnter=\{\(\) => setHoveredNodeSize\(lbl\)\}/.test(src) &&
|
|
68
|
+
/onMouseLeave=\{\(\) => setHoveredNodeSize\(\(prev\) => prev === lbl \? null : prev\)\}/.test(src);
|
|
69
|
+
const sourceFilter = /filter: hoveredNodeSize === lbl \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
70
|
+
const sourceLayersAttr = /data-topo-chrome-nodesize-halo-layers=\{hoveredNodeSize === lbl \? '2' : '0'\}/.test(src);
|
|
71
|
+
|
|
72
|
+
const trio = restState.map(e => e.lbl).join(',');
|
|
73
|
+
const trioComplete = ['S', 'M', 'L'].every(k => restState.some(e => e.lbl === k));
|
|
74
|
+
const restAllZero = restState.every(e => e.layers === '0');
|
|
75
|
+
|
|
76
|
+
const results = {
|
|
77
|
+
trio_complete: trioComplete,
|
|
78
|
+
three_buttons: restState.length === 3,
|
|
79
|
+
rest_all_layers_zero: restAllZero,
|
|
80
|
+
source_state: sourceState,
|
|
81
|
+
source_handlers: sourceMouseHandlers,
|
|
82
|
+
source_filter: sourceFilter,
|
|
83
|
+
source_layers_attr: sourceLayersAttr,
|
|
84
|
+
};
|
|
85
|
+
const ok = Object.values(results).every(Boolean);
|
|
86
|
+
console.log(`${ok ? '✅' : '❌'} R675 chrome nodeSize S/M/L multi-layer halo (completes chrome strip 10/10):`,
|
|
87
|
+
JSON.stringify(results, null, 2),
|
|
88
|
+
`\n trio: ${trio}\n rest: ${JSON.stringify(restState)}`);
|
|
89
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* Round 521 verification: chrome nodeSize S/M/L inactive variant gains
|
|
2
|
+
* hover-fw preview — fw 400 (default) → 500 (font-medium, matches active
|
|
3
|
+
* variant). Extends R270 hover-preview idiom to the typography axis.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. inactive rest: fontWeight = 400, data-attr = '500' (preview target)
|
|
7
|
+
* 2. inactive hover: fontWeight = 500 (preview lands at active fw)
|
|
8
|
+
* 3. active rest: fontWeight = 500 (existing font-medium class)
|
|
9
|
+
* 4. source-side regex confirms hover:font-medium class + attr wiring
|
|
10
|
+
*/
|
|
11
|
+
import { chromium } from 'playwright';
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
|
|
14
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
15
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
16
|
+
|
|
17
|
+
const browser = await chromium.launch({ headless: true });
|
|
18
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
19
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
20
|
+
await ctx.addInitScript(() => {
|
|
21
|
+
try {
|
|
22
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
23
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
24
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
25
|
+
} catch {}
|
|
26
|
+
});
|
|
27
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
28
|
+
const r = await route.fetch();
|
|
29
|
+
const b = await r.json();
|
|
30
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
31
|
+
const mk = (alias) => ({
|
|
32
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
33
|
+
network_id: nid, project_dir: null,
|
|
34
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
35
|
+
});
|
|
36
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
|
|
37
|
+
});
|
|
38
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
39
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
40
|
+
const page = await ctx.newPage();
|
|
41
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
42
|
+
await page.waitForSelector('[data-topo-chrome-nodesize]', { timeout: 15000 });
|
|
43
|
+
await page.waitForTimeout(800);
|
|
44
|
+
|
|
45
|
+
// Find the inactive + active buttons via attrs
|
|
46
|
+
const buttons = await page.evaluate(() => {
|
|
47
|
+
const els = Array.from(document.querySelectorAll('[data-topo-chrome-nodesize]'));
|
|
48
|
+
return els.map((el) => ({
|
|
49
|
+
label: el.getAttribute('data-topo-chrome-nodesize'),
|
|
50
|
+
active: el.getAttribute('data-topo-chrome-nodesize-active'),
|
|
51
|
+
previewAttr: el.getAttribute('data-topo-chrome-nodesize-hover-preview-fw'),
|
|
52
|
+
fw: getComputedStyle(el).fontWeight,
|
|
53
|
+
}));
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Find an inactive one. Default nodeScale is M (1) so S + L should be inactive.
|
|
57
|
+
const inactiveLabel = buttons.find(b => b.active === 'false')?.label;
|
|
58
|
+
if (!inactiveLabel) {
|
|
59
|
+
console.log('❌ R521 — no inactive nodeSize button found');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
const inactiveSel = `[data-topo-chrome-nodesize="${inactiveLabel}"]`;
|
|
63
|
+
|
|
64
|
+
// Phase 2: hover the inactive button
|
|
65
|
+
await page.hover(inactiveSel);
|
|
66
|
+
await page.waitForTimeout(350);
|
|
67
|
+
const hoverFw = await page.evaluate((sel) => getComputedStyle(document.querySelector(sel)).fontWeight, inactiveSel);
|
|
68
|
+
|
|
69
|
+
// Phase 3: find active button
|
|
70
|
+
const active = buttons.find(b => b.active === 'true');
|
|
71
|
+
|
|
72
|
+
await browser.close();
|
|
73
|
+
|
|
74
|
+
// Phase 4: source regex
|
|
75
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
76
|
+
const sourceWiredClass = /hover:bg-cyan-500\/5 active:bg-cyan-500\/15 hover:font-medium/.test(src);
|
|
77
|
+
const sourceWiredAttr =
|
|
78
|
+
/data-topo-chrome-nodesize-hover-preview-fw=\{nodeScale === v \? null : '500'\}/.test(src);
|
|
79
|
+
const sourceWiredTransition = /transition-\[font-weight\]/.test(src);
|
|
80
|
+
|
|
81
|
+
const inactiveRest = buttons.find(b => b.label === inactiveLabel);
|
|
82
|
+
|
|
83
|
+
const results = {
|
|
84
|
+
inactive_rest_fw_400: inactiveRest?.fw === '400',
|
|
85
|
+
inactive_rest_attr_500: inactiveRest?.previewAttr === '500',
|
|
86
|
+
inactive_active_attr_false: inactiveRest?.active === 'false',
|
|
87
|
+
inactive_hover_fw_500: hoverFw === '500',
|
|
88
|
+
active_rest_fw_500: active?.fw === '500',
|
|
89
|
+
active_no_preview_attr: active?.previewAttr === null || active?.previewAttr === undefined,
|
|
90
|
+
source_class_wired: sourceWiredClass,
|
|
91
|
+
source_attr_wired: sourceWiredAttr,
|
|
92
|
+
source_transition_wired: sourceWiredTransition,
|
|
93
|
+
};
|
|
94
|
+
const ok = Object.values(results).every(Boolean);
|
|
95
|
+
console.log(`${ok ? '✅' : '❌'} R521 nodeSize hover-fw preview:`,
|
|
96
|
+
JSON.stringify(results, null, 2),
|
|
97
|
+
'\n buttons:', JSON.stringify(buttons),
|
|
98
|
+
'\n inactive(', inactiveLabel, ')hover fw:', hoverFw);
|
|
99
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* Round 503 verification: orphan band rect (data-group-box-orphan="true")
|
|
2
|
+
* uses strokeDasharray='3 6' at rest, while prefix-group bands keep
|
|
3
|
+
* '6 6'. Pinned/hovered orphan still gets 'none' (solid stroke) — the
|
|
4
|
+
* differentiation lives ONLY in the rest state.
|
|
5
|
+
*
|
|
6
|
+
* Category-differentiation family 2nd anchor:
|
|
7
|
+
* R499 orphan label fontStyle: italic (1st anchor, R499)
|
|
8
|
+
* R503 orphan rect '3 6' dash pattern (2nd anchor, this round)
|
|
9
|
+
*
|
|
10
|
+
* Fixture: 2 prefix groups (alpha×3, beta×2) + 3 orphans (zeta/omega/lonely)
|
|
11
|
+
* — same shape as R499 test. Drives #150 orphan-band creation with
|
|
12
|
+
* prefix groups for differential assertion.
|
|
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', 'grid');
|
|
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('alpha·1', 'working'), mk('alpha·2', 'idle'), mk('alpha·3', 'idle'),
|
|
41
|
+
mk('beta·1', 'working'), mk('beta·2', 'idle'),
|
|
42
|
+
mk('zeta', 'idle'),
|
|
43
|
+
mk('omega', 'idle'),
|
|
44
|
+
mk('lonely', 'idle'),
|
|
45
|
+
] } });
|
|
46
|
+
});
|
|
47
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
48
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
49
|
+
const page = await ctx.newPage();
|
|
50
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
51
|
+
await page.waitForSelector('[data-group-box-orphan]', { timeout: 15000 });
|
|
52
|
+
await page.waitForTimeout(1500);
|
|
53
|
+
|
|
54
|
+
const rects = await page.evaluate(() => {
|
|
55
|
+
const els = Array.from(document.querySelectorAll('[data-group-box-orphan]'));
|
|
56
|
+
return els.map((el) => {
|
|
57
|
+
const cs = window.getComputedStyle(el);
|
|
58
|
+
return {
|
|
59
|
+
orphan_attr: el.getAttribute('data-group-box-orphan'),
|
|
60
|
+
dasharray: el.getAttribute('stroke-dasharray') || cs.strokeDasharray || '',
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await browser.close();
|
|
66
|
+
|
|
67
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
68
|
+
const sourceTernary = /\(isPinned \|\| isHovered\) \? 'none' :\s*box\.isOrphan \? '3 6' : '6 6'/.test(src);
|
|
69
|
+
const sourceAttr = /data-group-box-orphan=\{box\.isOrphan \? 'true' : 'false'\}/.test(src);
|
|
70
|
+
|
|
71
|
+
const orphanRect = rects.find((r) => r.orphan_attr === 'true');
|
|
72
|
+
const prefixRects = rects.filter((r) => r.orphan_attr === 'false');
|
|
73
|
+
|
|
74
|
+
// Computed strokeDasharray comes back as 'px-suffixed' or raw — normalize
|
|
75
|
+
const normalize = (s) => (s || '').replace(/px/g, '').replace(/,\s*/g, ' ').trim();
|
|
76
|
+
|
|
77
|
+
const results = {
|
|
78
|
+
rects_found: rects.length >= 2,
|
|
79
|
+
orphan_rect_present: !!orphanRect,
|
|
80
|
+
orphan_dash_3_6: orphanRect && (normalize(orphanRect.dasharray) === '3 6' || normalize(orphanRect.dasharray) === '3 6'),
|
|
81
|
+
prefix_rects_present: prefixRects.length >= 1,
|
|
82
|
+
prefix_dash_6_6: prefixRects.length > 0 && prefixRects.every((r) => normalize(r.dasharray) === '6 6'),
|
|
83
|
+
source_ternary_wired: sourceTernary,
|
|
84
|
+
source_attr_wired: sourceAttr,
|
|
85
|
+
};
|
|
86
|
+
const ok = Object.values(results).every(Boolean);
|
|
87
|
+
console.log(`${ok ? '✅' : '❌'} R503 orphan box dash:`, JSON.stringify(results),
|
|
88
|
+
'\n rects:', JSON.stringify(rects));
|
|
89
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* Round 506 verification: orphan band rect rest-state fillOpacity
|
|
2
|
+
* drops slightly below prefix-group rest (0.025/0.045 → 0.015/0.028).
|
|
3
|
+
* Category-differentiation family 3rd anchor.
|
|
4
|
+
*
|
|
5
|
+
* R499 orphan label fontStyle italic (1st anchor)
|
|
6
|
+
* R503 orphan rect '3 6' dasharray (2nd anchor)
|
|
7
|
+
* R506 orphan rect lower fillOpacity (3rd anchor)
|
|
8
|
+
*
|
|
9
|
+
* Pin and hover branches UNCHANGED (full inspection affordance).
|
|
10
|
+
* Differentiation lives ONLY in the rest state.
|
|
11
|
+
*
|
|
12
|
+
* Fixture: 2 prefix groups (alpha×3 + beta×2) + 3 orphans (zeta/omega/
|
|
13
|
+
* lonely) — same shape as R499/R503 tests for cross-round consistency.
|
|
14
|
+
* Cyber theme drives the 0.045 (prefix) vs 0.028 (orphan) comparison.
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
const browser = await chromium.launch({ headless: true });
|
|
23
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
24
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
25
|
+
await ctx.addInitScript(() => {
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
28
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
29
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
30
|
+
} catch {}
|
|
31
|
+
});
|
|
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, status) => ({
|
|
37
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
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: [
|
|
42
|
+
mk('alpha·1', 'working'), mk('alpha·2', 'idle'), mk('alpha·3', 'idle'),
|
|
43
|
+
mk('beta·1', 'working'), mk('beta·2', 'idle'),
|
|
44
|
+
mk('zeta', 'idle'),
|
|
45
|
+
mk('omega', 'idle'),
|
|
46
|
+
mk('lonely', 'idle'),
|
|
47
|
+
] } });
|
|
48
|
+
});
|
|
49
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
50
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
51
|
+
const page = await ctx.newPage();
|
|
52
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
53
|
+
await page.waitForSelector('[data-group-box-orphan]', { timeout: 15000 });
|
|
54
|
+
await page.waitForTimeout(1500);
|
|
55
|
+
|
|
56
|
+
const rects = await page.evaluate(() => {
|
|
57
|
+
const els = Array.from(document.querySelectorAll('[data-group-box-orphan]'));
|
|
58
|
+
return els.map((el) => ({
|
|
59
|
+
orphan_attr: el.getAttribute('data-group-box-orphan'),
|
|
60
|
+
fill_opacity_attr: el.getAttribute('data-group-box-fill-opacity'),
|
|
61
|
+
fill_opacity_dom: el.getAttribute('fill-opacity'),
|
|
62
|
+
}));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await browser.close();
|
|
66
|
+
|
|
67
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
68
|
+
const sourceTernary = /box\.isOrphan \? \(isLight \? 0\.015 : 0\.028\)\s*:\s*\(isLight \? 0\.025 : 0\.045\)/.test(src);
|
|
69
|
+
const sourceAttr = /data-group-box-fill-opacity=\{[\s\S]*?box\.isOrphan \? \(isLight \? 0\.015 : 0\.028\)/.test(src);
|
|
70
|
+
|
|
71
|
+
const orphanRect = rects.find((r) => r.orphan_attr === 'true');
|
|
72
|
+
const prefixRects = rects.filter((r) => r.orphan_attr === 'false');
|
|
73
|
+
|
|
74
|
+
// Cyber theme: prefix = 0.045, orphan = 0.028
|
|
75
|
+
const approxEq = (a, b) => Math.abs(parseFloat(a) - b) < 1e-9;
|
|
76
|
+
|
|
77
|
+
const results = {
|
|
78
|
+
rects_found: rects.length >= 2,
|
|
79
|
+
orphan_rect_present: !!orphanRect,
|
|
80
|
+
orphan_fill_028: orphanRect && approxEq(orphanRect.fill_opacity_attr, 0.028),
|
|
81
|
+
orphan_dom_fill_028: orphanRect && approxEq(orphanRect.fill_opacity_dom, 0.028),
|
|
82
|
+
prefix_rects_present: prefixRects.length >= 1,
|
|
83
|
+
prefix_fill_045: prefixRects.length > 0 && prefixRects.every((r) => approxEq(r.fill_opacity_attr, 0.045)),
|
|
84
|
+
prefix_dom_fill_045: prefixRects.length > 0 && prefixRects.every((r) => approxEq(r.fill_opacity_dom, 0.045)),
|
|
85
|
+
source_ternary_wired: sourceTernary,
|
|
86
|
+
source_attr_wired: sourceAttr,
|
|
87
|
+
};
|
|
88
|
+
const ok = Object.values(results).every(Boolean);
|
|
89
|
+
console.log(`${ok ? '✅' : '❌'} R506 orphan fill-opacity:`, JSON.stringify(results),
|
|
90
|
+
'\n rects:', JSON.stringify(rects));
|
|
91
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/* Round 499 verification: orphan band "其他" label gets fontStyle:
|
|
2
|
+
* italic, while prefix-group labels (alpha/beta/etc.) stay roman.
|
|
3
|
+
* Pure typography differentiation — no opacity / weight / fill / bbox
|
|
4
|
+
* change. data-group-label-orphan attr surfaces the gate for tests.
|
|
5
|
+
*
|
|
6
|
+
* Fixture: 2 prefix groups (alpha×3, beta×2) + 3 orphans (zeta/omega/
|
|
7
|
+
* lonely) — forces #150 orphan-band creation with at least 1 orphan
|
|
8
|
+
* and ≥ 1 prefix-group for differential assertion.
|
|
9
|
+
*/
|
|
10
|
+
import { chromium } from 'playwright';
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
|
|
13
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
14
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
15
|
+
|
|
16
|
+
const browser = await chromium.launch({ headless: true });
|
|
17
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
18
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
19
|
+
await ctx.addInitScript(() => {
|
|
20
|
+
try {
|
|
21
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
22
|
+
// grid layout required for groupBoxes to render
|
|
23
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
24
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
25
|
+
} catch {}
|
|
26
|
+
});
|
|
27
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
28
|
+
const r = await route.fetch();
|
|
29
|
+
const b = await r.json();
|
|
30
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
31
|
+
const mk = (alias, status) => ({
|
|
32
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
33
|
+
network_id: nid, project_dir: null,
|
|
34
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
35
|
+
});
|
|
36
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
37
|
+
mk('alpha·1', 'working'), mk('alpha·2', 'idle'), mk('alpha·3', 'idle'),
|
|
38
|
+
mk('beta·1', 'working'), mk('beta·2', 'idle'),
|
|
39
|
+
mk('zeta', 'idle'),
|
|
40
|
+
mk('omega', 'idle'),
|
|
41
|
+
mk('lonely', 'idle'),
|
|
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
|
+
await page.waitForSelector('[data-group-label]', { timeout: 15000 });
|
|
49
|
+
await page.waitForTimeout(1500);
|
|
50
|
+
|
|
51
|
+
const labels = await page.evaluate(() => {
|
|
52
|
+
const els = Array.from(document.querySelectorAll('[data-group-label]'));
|
|
53
|
+
return els.map((el) => {
|
|
54
|
+
const cs = window.getComputedStyle(el);
|
|
55
|
+
return {
|
|
56
|
+
key: el.getAttribute('data-group-label'),
|
|
57
|
+
orphan_attr:el.getAttribute('data-group-label-orphan'),
|
|
58
|
+
font_style: cs.fontStyle,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceTypeWired = /groupBoxes: \[\] as \{ key: string; isOrphan\?: boolean;/.test(src);
|
|
67
|
+
const sourceFieldWired = /isOrphan: !!band\.isOrphan,/.test(src);
|
|
68
|
+
const sourceStyleWired = /fontStyle: box\.isOrphan \? 'italic' : undefined/.test(src);
|
|
69
|
+
const sourceAttrWired = /data-group-label-orphan=\{box\.isOrphan \? 'true' : 'false'\}/.test(src);
|
|
70
|
+
|
|
71
|
+
const orphanLabel = labels.find((l) => l.key === '其他');
|
|
72
|
+
const prefixLabels = labels.filter((l) => l.key !== '其他' && l.key !== '');
|
|
73
|
+
|
|
74
|
+
const results = {
|
|
75
|
+
found_labels: labels.length >= 2,
|
|
76
|
+
orphan_label_present: !!orphanLabel,
|
|
77
|
+
orphan_attr_true: orphanLabel && orphanLabel.orphan_attr === 'true',
|
|
78
|
+
orphan_font_italic: orphanLabel && orphanLabel.font_style === 'italic',
|
|
79
|
+
prefix_labels_present: prefixLabels.length >= 1,
|
|
80
|
+
prefix_attrs_false: prefixLabels.length > 0 && prefixLabels.every((p) => p.orphan_attr === 'false'),
|
|
81
|
+
prefix_font_normal: prefixLabels.length > 0 && prefixLabels.every((p) => p.font_style !== 'italic'),
|
|
82
|
+
source_type_wired: sourceTypeWired,
|
|
83
|
+
source_field_wired: sourceFieldWired,
|
|
84
|
+
source_style_wired: sourceStyleWired,
|
|
85
|
+
source_attr_wired: sourceAttrWired,
|
|
86
|
+
};
|
|
87
|
+
const ok = Object.values(results).every(Boolean);
|
|
88
|
+
console.log(`${ok ? '✅' : '❌'} R499 orphan label italic:`, JSON.stringify(results),
|
|
89
|
+
'\n labels:', JSON.stringify(labels));
|
|
90
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* Round 551 verification: orphan band ("其他") rest-state LABEL opacity
|
|
2
|
+
* drops 0.55 → 0.4. 4th channel in the category-differentiation family
|
|
3
|
+
* (R499 italic, R503 dash, R506 rect fill, R551 label paint).
|
|
4
|
+
*
|
|
5
|
+
* Needs an orphan group to exist. The cluster-by-prefix logic creates
|
|
6
|
+
* an orphan band whenever there are sessions without a recognizable
|
|
7
|
+
* prefix (alias with no separator). Mock with a mix: 6 sessions with
|
|
8
|
+
* "alpha-" prefix (groups together) + 2 sessions with no separator
|
|
9
|
+
* (orphan).
|
|
10
|
+
*
|
|
11
|
+
* Test phases:
|
|
12
|
+
* 1. confirm grid layout active
|
|
13
|
+
* 2. locate orphan group-label vs prefix group-label
|
|
14
|
+
* 3. orphan rest opacity = 0.4, opacity attr surfaces value
|
|
15
|
+
* 4. prefix-group rest opacity = 0.55 (unchanged)
|
|
16
|
+
* 5. source-side regex confirms wiring
|
|
17
|
+
*/
|
|
18
|
+
import { chromium } from 'playwright';
|
|
19
|
+
import { readFileSync } from 'node:fs';
|
|
20
|
+
|
|
21
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
22
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
23
|
+
|
|
24
|
+
const browser = await chromium.launch({ headless: true });
|
|
25
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
26
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
27
|
+
await ctx.addInitScript(() => {
|
|
28
|
+
try {
|
|
29
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
30
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
31
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
32
|
+
} catch {}
|
|
33
|
+
});
|
|
34
|
+
// Mock: 6 alpha-prefix sessions (prefix group) + 3 standalone (orphan band).
|
|
35
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
36
|
+
const r = await route.fetch();
|
|
37
|
+
const b = await r.json();
|
|
38
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
39
|
+
const mk = (alias, status = 'idle') => ({
|
|
40
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
41
|
+
network_id: nid, project_dir: null,
|
|
42
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
43
|
+
});
|
|
44
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
45
|
+
mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
|
|
46
|
+
mk('alpha·4'), mk('alpha·5'), mk('alpha·6'),
|
|
47
|
+
mk('foo'), mk('bar'), mk('baz'),
|
|
48
|
+
] } });
|
|
49
|
+
});
|
|
50
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
51
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
52
|
+
const page = await ctx.newPage();
|
|
53
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
54
|
+
await page.waitForSelector('[data-group-label]', { timeout: 15000 });
|
|
55
|
+
await page.waitForTimeout(500);
|
|
56
|
+
|
|
57
|
+
const groups = await page.evaluate(() => {
|
|
58
|
+
const els = Array.from(document.querySelectorAll('[data-group-label]'));
|
|
59
|
+
return els.map(el => ({
|
|
60
|
+
key: el.getAttribute('data-group-label'),
|
|
61
|
+
orphan: el.getAttribute('data-group-label-orphan') === 'true',
|
|
62
|
+
opacityAttr: el.getAttribute('data-group-label-opacity'),
|
|
63
|
+
computedOpacity: getComputedStyle(el).opacity,
|
|
64
|
+
pinned: el.getAttribute('data-group-label-pinned') === 'true',
|
|
65
|
+
hovered: el.getAttribute('data-group-label-hovered') === 'true',
|
|
66
|
+
}));
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await browser.close();
|
|
70
|
+
|
|
71
|
+
const orphan = groups.find(g => g.orphan);
|
|
72
|
+
const prefix = groups.find(g => !g.orphan);
|
|
73
|
+
|
|
74
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
75
|
+
const sourceWired =
|
|
76
|
+
/opacity=\{isPinned \|\| isHovered \? 1 : box\.isOrphan \? 0\.4 : 0\.55\}/.test(src);
|
|
77
|
+
const sourceAttrWired =
|
|
78
|
+
/data-group-label-opacity=\{isPinned \|\| isHovered \? 1 : box\.isOrphan \? 0\.4 : 0\.55\}/.test(src);
|
|
79
|
+
|
|
80
|
+
const results = {
|
|
81
|
+
orphan_present: !!orphan,
|
|
82
|
+
prefix_present: !!prefix,
|
|
83
|
+
orphan_attr_0_4: orphan?.opacityAttr === '0.4',
|
|
84
|
+
orphan_computed_0_4: orphan ? Math.abs(parseFloat(orphan.computedOpacity) - 0.4) < 0.001 : false,
|
|
85
|
+
prefix_attr_0_55: prefix?.opacityAttr === '0.55',
|
|
86
|
+
prefix_computed_0_55: prefix ? Math.abs(parseFloat(prefix.computedOpacity) - 0.55) < 0.001 : false,
|
|
87
|
+
orphan_rest_state: orphan ? !orphan.pinned && !orphan.hovered : false,
|
|
88
|
+
prefix_rest_state: prefix ? !prefix.pinned && !prefix.hovered : false,
|
|
89
|
+
source_wired: sourceWired,
|
|
90
|
+
source_attr_wired: sourceAttrWired,
|
|
91
|
+
};
|
|
92
|
+
const ok = Object.values(results).every(Boolean);
|
|
93
|
+
console.log(`${ok ? '✅' : '❌'} R551 orphan label opacity 0.55→0.4 (category-differentiation 4th channel):`,
|
|
94
|
+
JSON.stringify(results, null, 2),
|
|
95
|
+
'\n orphan:', JSON.stringify(orphan),
|
|
96
|
+
'\n prefix:', JSON.stringify(prefix),
|
|
97
|
+
'\n all groups:', JSON.stringify(groups, null, 2));
|
|
98
|
+
process.exit(ok ? 0 : 1);
|