@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,89 @@
|
|
|
1
|
+
/* Round 504 verification: root svg surfaces `data-topo-pinned-aspect`
|
|
2
|
+
* categorical attribute. Sibling to R488's `data-topo-hovered-alias`
|
|
3
|
+
* (hover identity); R504 is the pin axis identity. Reflects WHICH
|
|
4
|
+
* pin state is active — paired with R467's any-pinned boolean.
|
|
5
|
+
*
|
|
6
|
+
* Tier values:
|
|
7
|
+
* none, status, group, vendor, edge, multi
|
|
8
|
+
*
|
|
9
|
+
* Test scenarios — seed pins via localStorage to reach each tier
|
|
10
|
+
* deterministically.
|
|
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
|
+
async function probe({ pins }) {
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript((p) => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
// Pins persist via sessionStorage (not localStorage) — verified
|
|
28
|
+
// by grep of TopoGraph.tsx useState initializers at lines
|
|
29
|
+
// 1033/1148/1187. pinnedEdgeKey starts null (no persistence;
|
|
30
|
+
// edge pin only reachable via click, skipped in this test).
|
|
31
|
+
if (p.status) sessionStorage.setItem('anet-topo-pinned-status', p.status);
|
|
32
|
+
if (p.group) sessionStorage.setItem('anet-topo-pinned-group', p.group);
|
|
33
|
+
if (p.vendor) sessionStorage.setItem('anet-topo-pinned-vendor', p.vendor);
|
|
34
|
+
} catch {}
|
|
35
|
+
}, pins);
|
|
36
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
37
|
+
const r = await route.fetch();
|
|
38
|
+
const b = await r.json();
|
|
39
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
40
|
+
const mk = (alias, status) => ({
|
|
41
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
42
|
+
network_id: nid, project_dir: null,
|
|
43
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
44
|
+
});
|
|
45
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
46
|
+
mk('alpha·1', 'working'),
|
|
47
|
+
mk('alpha·2', 'idle'),
|
|
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('svg[data-topo-pinned-aspect]', { timeout: 15000 });
|
|
55
|
+
await page.waitForTimeout(2800); // settle for localStorage-restore useEffect
|
|
56
|
+
const aspect = await page.evaluate(() => {
|
|
57
|
+
return document.querySelector('svg[viewBox="0 0 1000 680"]')?.getAttribute('data-topo-pinned-aspect');
|
|
58
|
+
});
|
|
59
|
+
await browser.close();
|
|
60
|
+
return aspect;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const none = await probe({ pins: {} });
|
|
64
|
+
const status = await probe({ pins: { status: 'working' } });
|
|
65
|
+
// Note: 'alpha' for group depends on actual alias-prefix derivation; valid
|
|
66
|
+
// because we seeded alpha·1 + alpha·2 (both have prefix 'alpha·')
|
|
67
|
+
const group = await probe({ pins: { group: 'alpha·' } });
|
|
68
|
+
// vendor uses initial letter — Anthropic = 'A' (from vendorIdentity.ts line 69)
|
|
69
|
+
// claude-opus-4 model resolves to Anthropic vendor; stale-purge keeps 'A' valid
|
|
70
|
+
const vendor = await probe({ pins: { vendor: 'A' } });
|
|
71
|
+
// edge needs from→to format; skip — edge pin keys are complex
|
|
72
|
+
// Multi: status + group together
|
|
73
|
+
const multi = await probe({ pins: { status: 'working', group: 'alpha·' } });
|
|
74
|
+
|
|
75
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
76
|
+
const sourceWired = /data-topo-pinned-aspect=\{\(\(\) => \{[\s\S]*?aspects\.push\('status'\)[\s\S]*?aspects\.push\('group'\)[\s\S]*?aspects\.push\('vendor'\)[\s\S]*?aspects\.push\('edge'\)/.test(src);
|
|
77
|
+
|
|
78
|
+
const results = {
|
|
79
|
+
none_resolves: none === 'none',
|
|
80
|
+
status_resolves: status === 'status',
|
|
81
|
+
group_resolves: group === 'group',
|
|
82
|
+
vendor_resolves: vendor === 'vendor',
|
|
83
|
+
multi_resolves: multi === 'multi',
|
|
84
|
+
source_wired: sourceWired,
|
|
85
|
+
};
|
|
86
|
+
const ok = Object.values(results).every(Boolean);
|
|
87
|
+
console.log(`${ok ? '✅' : '❌'} R504 pinned-aspect:`, JSON.stringify(results),
|
|
88
|
+
'\n raw:', { none, status, group, vendor, multi });
|
|
89
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 606 — recent-row freshness pip stacks brightness(1.15)
|
|
2
|
+
* onto R478 freshness-gated drop-shadow. Same alpha > 0.7 gate
|
|
3
|
+
* so both filter effects activate together for fresh signals.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 1 fresh message (~10s old, alpha > 0.7) → pip renders
|
|
7
|
+
* with glow + brightness filter
|
|
8
|
+
* 2. computed filter contains BOTH drop-shadow AND brightness
|
|
9
|
+
* 3. brightness-attr = '1.15' on fresh signal
|
|
10
|
+
* 4. source: stacked filter conditional + data-attr
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
// 10 seconds ago → freshness alpha ≈ 1.0 (well above 0.7 gate)
|
|
17
|
+
const fresh = new Date(Date.now() - 10 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
|
|
41
|
+
{ from_alias: 'a·1', to_alias: 'a·2', content: 'fresh hi', created_at: fresh },
|
|
42
|
+
] } }));
|
|
43
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
44
|
+
const page = await ctx.newPage();
|
|
45
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
46
|
+
await page.waitForSelector('[data-recent-row-freshness-brightness]', { timeout: 15000, state: 'attached' });
|
|
47
|
+
await page.waitForTimeout(500);
|
|
48
|
+
|
|
49
|
+
const fresh_state = await page.evaluate(() => {
|
|
50
|
+
const el = document.querySelector('[data-recent-row-freshness-brightness]');
|
|
51
|
+
if (!el) return null;
|
|
52
|
+
const cs = getComputedStyle(el);
|
|
53
|
+
return {
|
|
54
|
+
filter: cs.filter,
|
|
55
|
+
transitionProperty: cs.transitionProperty,
|
|
56
|
+
brightnessAttr: el.getAttribute('data-recent-row-freshness-brightness'),
|
|
57
|
+
glowAttr: el.getAttribute('data-recent-row-freshness-glow'),
|
|
58
|
+
alphaAttr: el.getAttribute('data-recent-row-freshness-alpha'),
|
|
59
|
+
opacity: cs.opacity,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceFilter = /filter: alpha > 0\.7\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
|
|
67
|
+
const sourceAttr = /data-recent-row-freshness-brightness=\{alpha > 0\.7 \? '1\.15' : '1'\}/.test(src);
|
|
68
|
+
|
|
69
|
+
const results = {
|
|
70
|
+
pip_present: !!fresh_state,
|
|
71
|
+
// Fresh signal: alpha ≈ 1.0 > 0.7 → both drop-shadow AND brightness in filter
|
|
72
|
+
fresh_filter_has_drop_shadow: /drop-shadow/.test(fresh_state?.filter || ''),
|
|
73
|
+
fresh_filter_has_brightness: /brightness/.test(fresh_state?.filter || ''),
|
|
74
|
+
fresh_brightness_115: fresh_state?.brightnessAttr === '1.15',
|
|
75
|
+
fresh_glow_true: fresh_state?.glowAttr === 'true',
|
|
76
|
+
fresh_alpha_above_0_7: parseFloat(fresh_state?.alphaAttr || '0') > 0.7,
|
|
77
|
+
transition_has_filter: /filter/.test(fresh_state?.transitionProperty || ''),
|
|
78
|
+
source_filter: sourceFilter,
|
|
79
|
+
source_attr: sourceAttr,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R606 freshness-pip stacked brightness (freshness-gated 4-axis):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n fresh: ${JSON.stringify(fresh_state)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* Round 662 — pressure-bar segment filter gains a 2nd outer drop-
|
|
2
|
+
* shadow at 4px + 0x4c alpha (half R542 inner 0x99). 21st anchor
|
|
3
|
+
* in multi-layer halo family (1st chip-bar anchor).
|
|
4
|
+
*
|
|
5
|
+
* Test: source-only — filter expression stacks 2 drop-shadows with
|
|
6
|
+
* tier-color (${color}) at 99 → 4c falloff.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
|
|
10
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
11
|
+
const sourceFilter = /isSegLit \? `brightness\(1\.2\) drop-shadow\(0 0 2px \$\{color\}99\) drop-shadow\(0 0 4px \$\{color\}4c\)` : undefined/.test(src);
|
|
12
|
+
|
|
13
|
+
const results = {
|
|
14
|
+
source_filter: sourceFilter,
|
|
15
|
+
};
|
|
16
|
+
const ok = Object.values(results).every(Boolean);
|
|
17
|
+
console.log(`${ok ? '✅' : '❌'} R662 pressure-bar segment multi-layer halo (1st chip-bar anchor):`,
|
|
18
|
+
JSON.stringify(results, null, 2));
|
|
19
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* Round 542 verification: pressure-bar segments gain drop-shadow tier-
|
|
2
|
+
* color glow on hover, stacked with R210 brightness(1.2). Chip-row
|
|
3
|
+
* tier-color glow sub-family 3rd anchor.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. rest: filter='none', data-pressure-seg-hovered='false'
|
|
7
|
+
* 2. hover the working seg: filter contains 'brightness(1.2)'
|
|
8
|
+
* AND 'drop-shadow(...)' with the working tier color (cyber
|
|
9
|
+
* #22c55e = rgb(34, 197, 94))
|
|
10
|
+
* 3. source-side regex confirms stacked filter syntax with hex+alpha
|
|
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, status) => ({
|
|
33
|
+
alias, status, 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: [
|
|
38
|
+
mk('a·1', 'working'), mk('a·2', 'idle'), mk('a·3', 'offline'),
|
|
39
|
+
] } });
|
|
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-pressure-seg="working"]', { timeout: 15000 });
|
|
46
|
+
await page.waitForTimeout(800);
|
|
47
|
+
|
|
48
|
+
const sel = '[data-pressure-seg="working"]';
|
|
49
|
+
|
|
50
|
+
const restRead = async () => page.evaluate((sel) => {
|
|
51
|
+
const el = document.querySelector(sel);
|
|
52
|
+
if (!el) return null;
|
|
53
|
+
const cs = getComputedStyle(el);
|
|
54
|
+
return {
|
|
55
|
+
hovered: el.getAttribute('data-pressure-seg-hovered'),
|
|
56
|
+
filter: cs.filter,
|
|
57
|
+
inlineFilter: el.style.filter,
|
|
58
|
+
};
|
|
59
|
+
}, sel);
|
|
60
|
+
|
|
61
|
+
// Phase 1: rest
|
|
62
|
+
const rest = await restRead();
|
|
63
|
+
|
|
64
|
+
// Phase 2: hover working seg
|
|
65
|
+
await page.hover(sel);
|
|
66
|
+
await page.waitForTimeout(400);
|
|
67
|
+
const hover = await restRead();
|
|
68
|
+
|
|
69
|
+
await browser.close();
|
|
70
|
+
|
|
71
|
+
// Source regex
|
|
72
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
73
|
+
const sourceFilter =
|
|
74
|
+
/filter: hoveredStatus === key \? `brightness\(1\.2\) drop-shadow\(0 0 2px \$\{color\}99\)` : undefined,/.test(src);
|
|
75
|
+
|
|
76
|
+
const results = {
|
|
77
|
+
rest_hovered_false: rest?.hovered === 'false',
|
|
78
|
+
rest_filter_none: rest?.filter === 'none' || rest?.filter === '',
|
|
79
|
+
hover_hovered_true: hover?.hovered === 'true',
|
|
80
|
+
hover_brightness: /brightness\(1\.2\)/.test(hover?.filter || ''),
|
|
81
|
+
hover_drop_shadow: /drop-shadow/.test(hover?.filter || ''),
|
|
82
|
+
// Cyber working color #22c55e → rgb(34, 197, 94) — accept any of the
|
|
83
|
+
// computed color() forms.
|
|
84
|
+
hover_working_color: /rgba?\(34,?\s*197,?\s*94/.test(hover?.filter || ''), // R537 banked: rgba? not rgb (hex+alpha → rgba)
|
|
85
|
+
source_filter: sourceFilter,
|
|
86
|
+
};
|
|
87
|
+
const ok = Object.values(results).every(Boolean);
|
|
88
|
+
console.log(`${ok ? '✅' : '❌'} R542 pressure-seg tier-color glow:`,
|
|
89
|
+
JSON.stringify(results, null, 2),
|
|
90
|
+
'\n rest:', JSON.stringify(rest),
|
|
91
|
+
'\n hover:', JSON.stringify(hover));
|
|
92
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/* Round 563 verification: pressure-bar segment lights up (R210
|
|
2
|
+
* brightness + R542 drop-shadow) when operator hovers a node alias
|
|
3
|
+
* whose status matches the segment's tier. 6th anchor in
|
|
4
|
+
* inspection-overrides-encoding family.
|
|
5
|
+
*
|
|
6
|
+
* Mock: alpha·1 (working) + alpha·2 (idle) + alpha·3 (offline).
|
|
7
|
+
* Hover alpha·1 → 'working' segment lights up; idle + offline rest.
|
|
8
|
+
*
|
|
9
|
+
* Test phases:
|
|
10
|
+
* 1. rest: all 3 segments filter='none', lit='false'
|
|
11
|
+
* 2. hover alpha·1 (working) → working seg filter contains
|
|
12
|
+
* brightness(1.2) and drop-shadow with green hex; idle +
|
|
13
|
+
* offline stay at rest
|
|
14
|
+
* 3. hover alpha·2 (idle) → idle seg lit
|
|
15
|
+
* 4. hover alpha·3 (offline) → offline seg lit
|
|
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', 'ring');
|
|
31
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
32
|
+
} catch {}
|
|
33
|
+
});
|
|
34
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
35
|
+
const r = await route.fetch();
|
|
36
|
+
const b = await r.json();
|
|
37
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
38
|
+
const mk = (alias, status) => ({
|
|
39
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
40
|
+
network_id: nid, project_dir: null,
|
|
41
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
42
|
+
});
|
|
43
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
44
|
+
mk('alpha·1', 'working'),
|
|
45
|
+
mk('alpha·2', 'idle'),
|
|
46
|
+
mk('alpha·3', 'offline'),
|
|
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-pressure-seg="working"]', { timeout: 15000 });
|
|
54
|
+
await page.waitForTimeout(500);
|
|
55
|
+
|
|
56
|
+
const probeSeg = (key) => page.evaluate((k) => {
|
|
57
|
+
const el = document.querySelector(`[data-pressure-seg="${k}"]`);
|
|
58
|
+
if (!el) return null;
|
|
59
|
+
const cs = getComputedStyle(el);
|
|
60
|
+
return {
|
|
61
|
+
filter: cs.filter,
|
|
62
|
+
matching: el.getAttribute('data-pressure-seg-member-alias-matching') === 'true',
|
|
63
|
+
lit: el.getAttribute('data-pressure-seg-lit') === 'true',
|
|
64
|
+
hovered: el.getAttribute('data-pressure-seg-hovered') === 'true',
|
|
65
|
+
};
|
|
66
|
+
}, key);
|
|
67
|
+
|
|
68
|
+
const restWorking = await probeSeg('working');
|
|
69
|
+
const restIdle = await probeSeg('idle');
|
|
70
|
+
const restOffline = await probeSeg('offline');
|
|
71
|
+
|
|
72
|
+
// Hover working node
|
|
73
|
+
await page.hover('g[data-node="alpha·1"]');
|
|
74
|
+
await page.waitForTimeout(400);
|
|
75
|
+
const hoverWorkingW = await probeSeg('working');
|
|
76
|
+
const hoverWorkingI = await probeSeg('idle');
|
|
77
|
+
const hoverWorkingO = await probeSeg('offline');
|
|
78
|
+
|
|
79
|
+
await page.mouse.move(0, 0);
|
|
80
|
+
await page.waitForTimeout(300);
|
|
81
|
+
await page.hover('g[data-node="alpha·2"]');
|
|
82
|
+
await page.waitForTimeout(400);
|
|
83
|
+
const hoverIdleI = await probeSeg('idle');
|
|
84
|
+
|
|
85
|
+
await page.mouse.move(0, 0);
|
|
86
|
+
await page.waitForTimeout(300);
|
|
87
|
+
await page.hover('g[data-node="alpha·3"]');
|
|
88
|
+
await page.waitForTimeout(400);
|
|
89
|
+
const hoverOfflineO = await probeSeg('offline');
|
|
90
|
+
|
|
91
|
+
await browser.close();
|
|
92
|
+
|
|
93
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
94
|
+
const sourceTierKey = /const hoveredAliasTierKey: 'working' \| 'idle' \| 'offline' \| null/.test(src);
|
|
95
|
+
const sourceMatching = /const isMemberAliasMatching = hoveredAliasTierKey === key;/.test(src);
|
|
96
|
+
const sourceLit = /const isSegLit = hoveredStatus === key \|\| isMemberAliasMatching;/.test(src);
|
|
97
|
+
const sourceFilter = /filter: isSegLit \? `brightness\(1\.2\) drop-shadow\(0 0 2px \$\{color\}99\)` : undefined/.test(src);
|
|
98
|
+
const sourceAttr = /data-pressure-seg-member-alias-matching=/.test(src);
|
|
99
|
+
|
|
100
|
+
const results = {
|
|
101
|
+
rest_working_filter_none: restWorking?.filter === 'none',
|
|
102
|
+
rest_working_lit_false: restWorking?.lit === false,
|
|
103
|
+
rest_idle_filter_none: restIdle?.filter === 'none',
|
|
104
|
+
rest_offline_filter_none: restOffline?.filter === 'none',
|
|
105
|
+
// Hover working node → working seg lit
|
|
106
|
+
hover_working_w_lit: hoverWorkingW?.lit === true,
|
|
107
|
+
hover_working_w_matching: hoverWorkingW?.matching === true,
|
|
108
|
+
hover_working_w_brightness: /brightness\(1\.2\)/.test(hoverWorkingW?.filter || ''),
|
|
109
|
+
hover_working_w_dropshadow: /drop-shadow\(/.test(hoverWorkingW?.filter || ''),
|
|
110
|
+
// idle + offline segments stay at rest
|
|
111
|
+
hover_working_i_lit_false: hoverWorkingI?.lit === false,
|
|
112
|
+
hover_working_o_lit_false: hoverWorkingO?.lit === false,
|
|
113
|
+
// Hover idle node → idle seg lit
|
|
114
|
+
hover_idle_i_lit: hoverIdleI?.lit === true,
|
|
115
|
+
hover_idle_i_matching: hoverIdleI?.matching === true,
|
|
116
|
+
// Hover offline node → offline seg lit
|
|
117
|
+
hover_offline_o_lit: hoverOfflineO?.lit === true,
|
|
118
|
+
hover_offline_o_matching: hoverOfflineO?.matching === true,
|
|
119
|
+
// Source
|
|
120
|
+
source_tier_key: sourceTierKey,
|
|
121
|
+
source_matching: sourceMatching,
|
|
122
|
+
source_lit: sourceLit,
|
|
123
|
+
source_filter: sourceFilter,
|
|
124
|
+
source_attr: sourceAttr,
|
|
125
|
+
};
|
|
126
|
+
const ok = Object.values(results).every(Boolean);
|
|
127
|
+
console.log(`${ok ? '✅' : '❌'} R563 pressure-seg inspection-overrides-encoding (6th anchor):`,
|
|
128
|
+
JSON.stringify(results, null, 2),
|
|
129
|
+
'\n rest working:', JSON.stringify(restWorking),
|
|
130
|
+
'\n hover alpha·1 (working) → working:', JSON.stringify(hoverWorkingW),
|
|
131
|
+
'\n hover alpha·2 (idle) → idle:', JSON.stringify(hoverIdleI),
|
|
132
|
+
'\n hover alpha·3 (offline) → offline:', JSON.stringify(hoverOfflineO));
|
|
133
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* Round 524 verification: pressure-bar segment width + filter motion
|
|
2
|
+
* restored — extends .anet-topo-chip-focus transition-property list
|
|
3
|
+
* to include `width` and `filter`, fixing the R165/R210 motion
|
|
4
|
+
* polishes silently broken by R490.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. computed transition on pressure-seg includes:
|
|
8
|
+
* - background-color (R510 family, R83 box-shadow already works)
|
|
9
|
+
* - width (R165 restoration ← R524)
|
|
10
|
+
* - filter (R210 brightness restoration ← R524)
|
|
11
|
+
* all at 200ms ease-out
|
|
12
|
+
* 2. globals.css source confirms width + filter in property list
|
|
13
|
+
* 3. hover the segment → filter brightness applied + transitioning
|
|
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
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
32
|
+
const r = await route.fetch();
|
|
33
|
+
const b = await r.json();
|
|
34
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
35
|
+
const mk = (alias, status) => ({
|
|
36
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
37
|
+
network_id: nid, project_dir: null,
|
|
38
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
39
|
+
});
|
|
40
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
41
|
+
mk('a·1', 'working'),
|
|
42
|
+
mk('a·2', 'idle'),
|
|
43
|
+
mk('a·3', 'offline'),
|
|
44
|
+
] } });
|
|
45
|
+
});
|
|
46
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
47
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
48
|
+
const page = await ctx.newPage();
|
|
49
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
50
|
+
await page.waitForSelector('[data-pressure-seg="working"]', { timeout: 15000 });
|
|
51
|
+
await page.waitForTimeout(800);
|
|
52
|
+
|
|
53
|
+
const rest = await page.evaluate(() => {
|
|
54
|
+
const el = document.querySelector('[data-pressure-seg="working"]');
|
|
55
|
+
if (!el) return null;
|
|
56
|
+
const cs = getComputedStyle(el);
|
|
57
|
+
return {
|
|
58
|
+
transition: cs.transition,
|
|
59
|
+
transitionProp: cs.transitionProperty,
|
|
60
|
+
transitionDur: cs.transitionDuration,
|
|
61
|
+
filter: cs.filter,
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Hover the segment → filter should apply
|
|
66
|
+
await page.hover('[data-pressure-seg="working"]');
|
|
67
|
+
await page.waitForTimeout(350);
|
|
68
|
+
const hover = await page.evaluate(() => {
|
|
69
|
+
const el = document.querySelector('[data-pressure-seg="working"]');
|
|
70
|
+
if (!el) return null;
|
|
71
|
+
const cs = getComputedStyle(el);
|
|
72
|
+
return {
|
|
73
|
+
filter: cs.filter,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await browser.close();
|
|
78
|
+
|
|
79
|
+
const css = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
80
|
+
const cssHasWidth =
|
|
81
|
+
/\.anet-topo-chip-focus[\s\S]*?transition-property:[\s\S]*?width[\s\S]*?!important/.test(css);
|
|
82
|
+
const cssHasFilter =
|
|
83
|
+
/\.anet-topo-chip-focus[\s\S]*?transition-property:[\s\S]*?filter[\s\S]*?!important/.test(css);
|
|
84
|
+
|
|
85
|
+
const results = {
|
|
86
|
+
has_width_in_prop: /(^|,\s*)width(,|$)/.test(rest?.transitionProp || '') ||
|
|
87
|
+
/\bwidth\b/.test(rest?.transitionProp || ''),
|
|
88
|
+
has_filter_in_prop: /\bfilter\b/.test(rest?.transitionProp || ''),
|
|
89
|
+
has_bg_color_in_prop: /background-color/.test(rest?.transitionProp || ''), // sanity
|
|
90
|
+
duration_200ms: /(200ms|0\.2s)/.test(rest?.transitionDur || ''),
|
|
91
|
+
rest_no_filter: rest?.filter === 'none' || rest?.filter === '',
|
|
92
|
+
hover_filter_brightness: /brightness\(1\.2\)/.test(hover?.filter || ''),
|
|
93
|
+
css_width_in_list: cssHasWidth,
|
|
94
|
+
css_filter_in_list: cssHasFilter,
|
|
95
|
+
};
|
|
96
|
+
const ok = Object.values(results).every(Boolean);
|
|
97
|
+
console.log(`${ok ? '✅' : '❌'} R524 pressure-seg motion restored:`,
|
|
98
|
+
JSON.stringify(results, null, 2),
|
|
99
|
+
'\n rest:', JSON.stringify(rest),
|
|
100
|
+
'\n hover.filter:', hover?.filter);
|
|
101
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/* Round 589 verification: recent-signal panel count <text>
|
|
2
|
+
* root gains filter brightness(1.15) on hoveredPanel ===
|
|
3
|
+
* 'recent'. 28th anchor in per-element brightness family.
|
|
4
|
+
* Sibling to R588 at legend panel — closes panel-pair
|
|
5
|
+
* brightness symmetry at the header-count scope.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. mock 1 flow message → recent-signal panel renders count
|
|
9
|
+
* 2. rest (no panel hover): filter='none', brightness-attr='1'
|
|
10
|
+
* 3. transition-property contains 'filter'
|
|
11
|
+
* 4. source: filter conditional + data-attr + transition extension
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
// recent-signal panel renders only when flowLinks.length > 0
|
|
41
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
|
|
42
|
+
{ from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
|
|
43
|
+
] } }));
|
|
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-recent-panel-count-brightness]', { timeout: 15000, state: 'attached' });
|
|
48
|
+
await page.waitForTimeout(500);
|
|
49
|
+
|
|
50
|
+
const rest = await page.evaluate(() => {
|
|
51
|
+
const el = document.querySelector('[data-recent-panel-count-brightness]');
|
|
52
|
+
if (!el) return null;
|
|
53
|
+
const cs = getComputedStyle(el);
|
|
54
|
+
return {
|
|
55
|
+
filter: cs.filter,
|
|
56
|
+
transitionProperty: cs.transitionProperty,
|
|
57
|
+
brightnessAttr: el.getAttribute('data-recent-panel-count-brightness'),
|
|
58
|
+
letterSpacingAttr: el.getAttribute('data-recent-panel-count-letter-spacing'),
|
|
59
|
+
textContent: el.textContent,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceFilter = /filter: hoveredPanel === 'recent' \? 'brightness\(1\.15\)' : undefined/.test(src);
|
|
67
|
+
const sourceAttr = /data-recent-panel-count-brightness=\{hoveredPanel === 'recent' \? '1\.15' : '1'\}/.test(src);
|
|
68
|
+
const sourceTransition = /transition: 'letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
|
|
69
|
+
|
|
70
|
+
const results = {
|
|
71
|
+
count_present: !!rest,
|
|
72
|
+
rest_filter_none: rest?.filter === 'none',
|
|
73
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
74
|
+
rest_letter_spacing: rest?.letterSpacingAttr === '0.2',
|
|
75
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
76
|
+
source_filter: sourceFilter,
|
|
77
|
+
source_attr: sourceAttr,
|
|
78
|
+
source_transition: sourceTransition,
|
|
79
|
+
};
|
|
80
|
+
const ok = Object.values(results).every(Boolean);
|
|
81
|
+
console.log(`${ok ? '✅' : '❌'} R589 recent-panel-count brightness (28th anchor, panel-pair symmetry closure):`,
|
|
82
|
+
JSON.stringify(results, null, 2),
|
|
83
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
84
|
+
process.exit(ok ? 0 : 1);
|