@sleep2agi/agent-network-dashboard 0.5.3-preview.19 → 0.5.3-preview.191
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +7 -7
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +2 -2
- package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +2 -2
- package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +2 -2
- package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +2 -2
- package/.next/server/app/node.segments/_full.segment.rsc +2 -2
- package/.next/server/app/node.segments/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.segment.rsc +2 -2
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.segments/node.segment.rsc +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +2 -2
- package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +2 -2
- package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +2 -2
- package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/0-8bxlg9uqt.w.css +2 -0
- package/.next/static/chunks/0.lu5-z2x2qxy.js +1 -0
- package/.next/static/chunks/0fk9nvlx1auzw.js +4 -0
- package/.next/static/chunks/{0wyykzfwmrhap.js → 0p.5_o7o6bjen.js} +1 -1
- package/.next/static/chunks/0w7.1u4z8b8jm.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +4824 -177
- package/app/globals.css +58 -7
- package/package.json +4 -4
- package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
- package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
- package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
- package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
- package/scripts/topo-avatar-rotate-test.mjs +85 -0
- package/scripts/topo-avatar-scale-test.mjs +89 -0
- package/scripts/topo-badge-chat-gate-test.mjs +74 -0
- package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
- package/scripts/topo-brand-logo-breath-test.mjs +102 -0
- package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
- package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
- package/scripts/topo-brand-logo-hover-test.mjs +85 -0
- package/scripts/topo-card-chat-brightness-test.mjs +86 -0
- package/scripts/topo-chat-ring-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-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-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-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-particle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-pill-glow-test.mjs +67 -0
- package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
- package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
- package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
- package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-filter-pill-glow-test.mjs +90 -0
- package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
- package/scripts/topo-fullscreen-attr-test.mjs +73 -0
- package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
- package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
- package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
- package/scripts/topo-group-box-brightness-test.mjs +84 -0
- package/scripts/topo-group-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-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 +7 -2
- package/scripts/topo-hub-recede-test.mjs +124 -0
- package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
- package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
- package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
- package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -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-fill-opacity-test.mjs +91 -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-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-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-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-titleblock-h2-hover-fw-test.mjs +109 -0
- package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
- package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
- package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
- package/scripts/topo-vendor-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/0bx3~m~x7--es.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- package/.next/static/chunks/0ocjttuapm1j5.js +0 -1
- package/.next/static/chunks/0r_96qcg~al~l.js +0 -4
- /package/.next/static/{0CFKZXs8Nw_rdWAR3Ifpg → 2yThWRF33HXGChXf9v_Gj}/_buildManifest.js +0 -0
- /package/.next/static/{0CFKZXs8Nw_rdWAR3Ifpg → 2yThWRF33HXGChXf9v_Gj}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{0CFKZXs8Nw_rdWAR3Ifpg → 2yThWRF33HXGChXf9v_Gj}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* Round 654 — hub-spoke drop-shadow gains a SECOND outer layer at
|
|
2
|
+
* 3px + 0.2 alpha. CLOSES hub-cluster glow QUINTET at 5/5 multi-
|
|
3
|
+
* layer (R533 was the last single-layer hub element after R650-R653).
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 nodes → hub-spokes render (one per non-hub node)
|
|
7
|
+
* 2. rest: all spokes halo-layers='0', no drop-shadow filter
|
|
8
|
+
* 3. open chat with a·1 → R636 isHoveredSpoke fires → that spoke
|
|
9
|
+
* gets halo-layers='2', computed filter has 2 drop-shadow
|
|
10
|
+
* substrings with teal/cyan tint (rgba(34,211,238,...) on cyber)
|
|
11
|
+
* 4. source: both light + cyber branches stack 2 drop-shadows
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-hub-spoke-halo-layers]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const restSpokes = await page.evaluate(() => {
|
|
48
|
+
return Array.from(document.querySelectorAll('[data-topo-hub-spoke-halo-layers]')).map(el => ({
|
|
49
|
+
layers: el.getAttribute('data-topo-hub-spoke-halo-layers'),
|
|
50
|
+
glow: el.getAttribute('data-topo-hub-spoke-glow'),
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Open chat to fire isHoveredSpoke on a·1's spoke
|
|
55
|
+
await page.click('[data-node="a·1"]', { force: true });
|
|
56
|
+
await page.waitForTimeout(400);
|
|
57
|
+
|
|
58
|
+
const activeState = await page.evaluate(() => {
|
|
59
|
+
return Array.from(document.querySelectorAll('[data-topo-hub-spoke-halo-layers]')).map(el => {
|
|
60
|
+
const cs = getComputedStyle(el);
|
|
61
|
+
return {
|
|
62
|
+
layers: el.getAttribute('data-topo-hub-spoke-halo-layers'),
|
|
63
|
+
glow: el.getAttribute('data-topo-hub-spoke-glow'),
|
|
64
|
+
self: el.getAttribute('data-topo-hub-spoke-brightness-self'),
|
|
65
|
+
filter: cs.filter,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await browser.close();
|
|
71
|
+
|
|
72
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
73
|
+
const sourceLight = /'drop-shadow\(0 0 1\.5px rgba\(13, 148, 136, 0\.4\)\) drop-shadow\(0 0 3px rgba\(13, 148, 136, 0\.2\)\) brightness\(1\.15\)'/.test(src);
|
|
74
|
+
const sourceCyber = /'drop-shadow\(0 0 1\.5px rgba\(34, 211, 238, 0\.4\)\) drop-shadow\(0 0 3px rgba\(34, 211, 238, 0\.2\)\) brightness\(1\.15\)'/.test(src);
|
|
75
|
+
const sourceLayersAttr = /data-topo-hub-spoke-halo-layers=\{!reducedMotion && \(hoveredHub \|\| isHoveredSpoke\) \? '2' : '0'\}/.test(src);
|
|
76
|
+
|
|
77
|
+
const restAllZero = restSpokes.every(s => s.layers === '0' && s.glow === 'false');
|
|
78
|
+
const activeSpokes = activeState.filter(s => s.self === 'true');
|
|
79
|
+
const activeAllTwoLayers = activeSpokes.length >= 1
|
|
80
|
+
&& activeSpokes.every(s => s.layers === '2'
|
|
81
|
+
&& (s.filter?.match(/drop-shadow/g) || []).length === 2);
|
|
82
|
+
|
|
83
|
+
const results = {
|
|
84
|
+
spokes_present: restSpokes.length >= 2,
|
|
85
|
+
rest_all_zero: restAllZero,
|
|
86
|
+
active_exactly_one: activeSpokes.length === 1,
|
|
87
|
+
active_all_two_layers:activeAllTwoLayers,
|
|
88
|
+
source_light: sourceLight,
|
|
89
|
+
source_cyber: sourceCyber,
|
|
90
|
+
source_layers_attr: sourceLayersAttr,
|
|
91
|
+
};
|
|
92
|
+
const ok = Object.values(results).every(Boolean);
|
|
93
|
+
console.log(`${ok ? '✅' : '❌'} R654 hub-spoke multi-layer halo (CLOSES hub-cluster glow QUINTET at 5/5):`,
|
|
94
|
+
JSON.stringify(results, null, 2),
|
|
95
|
+
`\n rest: ${JSON.stringify(restSpokes)}`,
|
|
96
|
+
`\n active: ${JSON.stringify(activeState)}`);
|
|
97
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/* Round 636 — extend hub-spoke filter gate from hub-wide
|
|
2
|
+
* (hoveredHub) to per-spoke (isHoveredSpoke). Closes the 4-axis
|
|
3
|
+
* chat-target focus signature on the hub-spoke surface:
|
|
4
|
+
* R622 opacity 0.50 → 0.70 / 0.80 → 0.95 (per-spoke)
|
|
5
|
+
* R622 stroke-wd 1.00 → 1.25 / 2.25 → 2.50 (per-spoke)
|
|
6
|
+
* R580 drop-shadow halo (hub-wide only — pre-R636)
|
|
7
|
+
* R580 brightness 1.0 → 1.15 (hub-wide only — pre-R636)
|
|
8
|
+
* R636 drop-shadow + brightness ALSO on isHoveredSpoke (per-spoke)
|
|
9
|
+
*
|
|
10
|
+
* Test phases:
|
|
11
|
+
* 1. mock 2 nodes → spokes present, no hover/chat
|
|
12
|
+
* 2. rest: per-spoke brightness-self='false', brightness='1',
|
|
13
|
+
* glow='false'
|
|
14
|
+
* 3. open chat with one node (click) → that node's spoke
|
|
15
|
+
* brightness-self='true', brightness='1.15', glow='true';
|
|
16
|
+
* OTHER spoke stays brightness-self='false', brightness='1'
|
|
17
|
+
* 4. source: filter expression + attrs include
|
|
18
|
+
* (hoveredHub || isHoveredSpoke) OR-chain
|
|
19
|
+
*/
|
|
20
|
+
import { chromium } from 'playwright';
|
|
21
|
+
import { readFileSync } from 'node:fs';
|
|
22
|
+
|
|
23
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
24
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
25
|
+
|
|
26
|
+
const browser = await chromium.launch({ headless: true });
|
|
27
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
28
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
29
|
+
await ctx.addInitScript(() => {
|
|
30
|
+
try {
|
|
31
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
32
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
33
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
34
|
+
} catch {}
|
|
35
|
+
});
|
|
36
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
37
|
+
const r = await route.fetch();
|
|
38
|
+
const b = await r.json();
|
|
39
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
40
|
+
const mk = (alias) => ({
|
|
41
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
42
|
+
network_id: nid, project_dir: null,
|
|
43
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
44
|
+
});
|
|
45
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
46
|
+
});
|
|
47
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
48
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
49
|
+
const page = await ctx.newPage();
|
|
50
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
51
|
+
await page.waitForSelector('[data-topo-hub-spoke-brightness-self]', { timeout: 15000, state: 'attached' });
|
|
52
|
+
await page.waitForTimeout(500);
|
|
53
|
+
|
|
54
|
+
const restPerSpoke = await page.evaluate(() => {
|
|
55
|
+
const spokes = Array.from(document.querySelectorAll('[data-topo-hub-spoke-brightness-self]'));
|
|
56
|
+
return spokes.map(el => ({
|
|
57
|
+
self: el.getAttribute('data-topo-hub-spoke-brightness-self'),
|
|
58
|
+
brightness: el.getAttribute('data-topo-hub-spoke-brightness'),
|
|
59
|
+
glow: el.getAttribute('data-topo-hub-spoke-glow'),
|
|
60
|
+
}));
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Open chat with a·1
|
|
64
|
+
await page.click('[data-node="a·1"]', { force: true });
|
|
65
|
+
await page.waitForTimeout(400);
|
|
66
|
+
|
|
67
|
+
const chatPerSpoke = await page.evaluate(() => {
|
|
68
|
+
// Each spoke is paired with its node alias via path key (`hub-${alias}`)
|
|
69
|
+
// — but key isn't queryable. We look at all spokes and find the one
|
|
70
|
+
// whose brightness-self attr is now 'true'.
|
|
71
|
+
const spokes = Array.from(document.querySelectorAll('[data-topo-hub-spoke-brightness-self]'));
|
|
72
|
+
return spokes.map(el => ({
|
|
73
|
+
self: el.getAttribute('data-topo-hub-spoke-brightness-self'),
|
|
74
|
+
brightness: el.getAttribute('data-topo-hub-spoke-brightness'),
|
|
75
|
+
glow: el.getAttribute('data-topo-hub-spoke-glow'),
|
|
76
|
+
}));
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
await browser.close();
|
|
80
|
+
|
|
81
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
82
|
+
const sourceFilterGate = /filter: !reducedMotion && \(hoveredHub \|\| isHoveredSpoke\)\s*\n\s*\?\s*\(isLight/.test(src);
|
|
83
|
+
const sourceBrightnessAttr = /data-topo-hub-spoke-brightness=\{!reducedMotion && \(hoveredHub \|\| isHoveredSpoke\) \? '1\.15' : '1'\}/.test(src);
|
|
84
|
+
const sourceSelfAttr = /data-topo-hub-spoke-brightness-self=\{!reducedMotion && isHoveredSpoke \? 'true' : 'false'\}/.test(src);
|
|
85
|
+
const sourceGlowGate = /data-topo-hub-spoke-glow=\{!reducedMotion && \(hoveredHub \|\| isHoveredSpoke\) \? 'true' : 'false'\}/.test(src);
|
|
86
|
+
|
|
87
|
+
const restAllSelfFalse = restPerSpoke.every(s => s.self === 'false');
|
|
88
|
+
const restAllBrightness1 = restPerSpoke.every(s => s.brightness === '1');
|
|
89
|
+
const restAllGlowFalse = restPerSpoke.every(s => s.glow === 'false');
|
|
90
|
+
|
|
91
|
+
const chatActiveSpokes = chatPerSpoke.filter(s => s.self === 'true');
|
|
92
|
+
const chatIdleSpokes = chatPerSpoke.filter(s => s.self === 'false');
|
|
93
|
+
const chatExactlyOneActive = chatActiveSpokes.length === 1;
|
|
94
|
+
const chatActiveBrightness115 = chatActiveSpokes.every(s => s.brightness === '1.15');
|
|
95
|
+
const chatActiveGlowTrue = chatActiveSpokes.every(s => s.glow === 'true');
|
|
96
|
+
const chatIdleBrightness1 = chatIdleSpokes.every(s => s.brightness === '1');
|
|
97
|
+
const chatIdleGlowFalse = chatIdleSpokes.every(s => s.glow === 'false');
|
|
98
|
+
|
|
99
|
+
const results = {
|
|
100
|
+
spokes_present: restPerSpoke.length >= 2,
|
|
101
|
+
rest_all_self_false: restAllSelfFalse,
|
|
102
|
+
rest_all_brightness_1: restAllBrightness1,
|
|
103
|
+
rest_all_glow_false: restAllGlowFalse,
|
|
104
|
+
chat_exactly_one_active: chatExactlyOneActive,
|
|
105
|
+
chat_active_brightness: chatActiveBrightness115,
|
|
106
|
+
chat_active_glow: chatActiveGlowTrue,
|
|
107
|
+
chat_idle_brightness: chatIdleBrightness1,
|
|
108
|
+
chat_idle_glow_false: chatIdleGlowFalse,
|
|
109
|
+
source_filter_gate: sourceFilterGate,
|
|
110
|
+
source_brightness_attr: sourceBrightnessAttr,
|
|
111
|
+
source_self_attr: sourceSelfAttr,
|
|
112
|
+
source_glow_gate: sourceGlowGate,
|
|
113
|
+
};
|
|
114
|
+
const ok = Object.values(results).every(Boolean);
|
|
115
|
+
console.log(`${ok ? '✅' : '❌'} R636 hub-spoke per-spoke filter (chat-target / hover-self gate):`,
|
|
116
|
+
JSON.stringify(results, null, 2),
|
|
117
|
+
`\n rest: ${JSON.stringify(restPerSpoke)}`,
|
|
118
|
+
`\n chat: ${JSON.stringify(chatPerSpoke)}`);
|
|
119
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* Round 613 — per-node label card stacks brightness(1.15)
|
|
2
|
+
* onto R142's hover drop-shadow. 4th paint axis on the card's
|
|
3
|
+
* hover signature. Same banked R582/R583 stacked-filter pattern.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 idle nodes → label cards render
|
|
7
|
+
* 2. rest: filter contains rest drop-shadow but NO brightness,
|
|
8
|
+
* brightness-attr='1'
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: stacked filter conditional + data-attr
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
17
|
+
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
20
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
21
|
+
await ctx.addInitScript(() => {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
24
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
25
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
29
|
+
const r = await route.fetch();
|
|
30
|
+
const b = await r.json();
|
|
31
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
32
|
+
const mk = (alias) => ({
|
|
33
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
34
|
+
network_id: nid, project_dir: null,
|
|
35
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
36
|
+
});
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
43
|
+
await page.waitForSelector('[data-node-label-card-brightness]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-node-label-card-brightness]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
const cs = getComputedStyle(el);
|
|
50
|
+
return {
|
|
51
|
+
filter: cs.filter,
|
|
52
|
+
transitionProperty: cs.transitionProperty,
|
|
53
|
+
brightnessAttr: el.getAttribute('data-node-label-card-brightness'),
|
|
54
|
+
elevationAttr: el.getAttribute('data-node-label-card-elevation'),
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await browser.close();
|
|
59
|
+
|
|
60
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
61
|
+
const sourceCyberStack = /'drop-shadow\(0 4px 12px rgba\(0,0,0,0\.60\)\) brightness\(1\.15\)'/.test(src);
|
|
62
|
+
const sourceLightStack = /'drop-shadow\(0 3px 8px rgba\(15,23,42,0\.20\)\) brightness\(1\.15\)'/.test(src);
|
|
63
|
+
const sourceAttr = /data-node-label-card-brightness=\{!reducedMotion && hoveredAlias === session\.alias \? '1\.15' : '1'\}/.test(src);
|
|
64
|
+
|
|
65
|
+
const results = {
|
|
66
|
+
card_present: !!rest,
|
|
67
|
+
// At rest: rest-tier drop-shadow but no brightness
|
|
68
|
+
rest_has_drop_shadow: /drop-shadow/.test(rest?.filter || ''),
|
|
69
|
+
rest_no_brightness: !/brightness/.test(rest?.filter || ''),
|
|
70
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
71
|
+
rest_elevation_idle: rest?.elevationAttr === 'idle',
|
|
72
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
73
|
+
source_cyber_stack: sourceCyberStack,
|
|
74
|
+
source_light_stack: sourceLightStack,
|
|
75
|
+
source_attr: sourceAttr,
|
|
76
|
+
};
|
|
77
|
+
const ok = Object.values(results).every(Boolean);
|
|
78
|
+
console.log(`${ok ? '✅' : '❌'} R613 label card stacked brightness (4-axis hover paint signature):`,
|
|
79
|
+
JSON.stringify(results, null, 2),
|
|
80
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
81
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* Round 522 verification: chrome Ring/Grid layout toggle's inactive
|
|
2
|
+
* variant gains `hover:font-medium` typography preview. Closes chrome
|
|
3
|
+
* toggle group typography hover-fw family at the last remaining toggle.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. default (layout=ring): Ring active fw=500, Grid inactive fw=400
|
|
7
|
+
* + Grid data-attr = '500' (preview target)
|
|
8
|
+
* + Ring data-attr = null
|
|
9
|
+
* 2. hover Grid (inactive): fontWeight → 500 (preview lands)
|
|
10
|
+
* 3. source-side regex confirms hover:font-medium + transition wired
|
|
11
|
+
* for both buttons
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-layout]', { timeout: 15000 });
|
|
45
|
+
await page.waitForTimeout(800);
|
|
46
|
+
|
|
47
|
+
const buttons = await page.evaluate(() => {
|
|
48
|
+
const els = Array.from(document.querySelectorAll('[data-topo-chrome-layout]'));
|
|
49
|
+
return els.map((el) => ({
|
|
50
|
+
label: el.getAttribute('data-topo-chrome-layout'),
|
|
51
|
+
active: el.getAttribute('data-topo-chrome-layout-active'),
|
|
52
|
+
previewAttr: el.getAttribute('data-topo-chrome-layout-hover-preview-fw'),
|
|
53
|
+
fw: getComputedStyle(el).fontWeight,
|
|
54
|
+
}));
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Phase 2: hover the inactive (Grid since layout=ring default)
|
|
58
|
+
await page.hover('[data-topo-chrome-layout="grid"]');
|
|
59
|
+
await page.waitForTimeout(350);
|
|
60
|
+
const gridHoverFw = await page.evaluate(() =>
|
|
61
|
+
getComputedStyle(document.querySelector('[data-topo-chrome-layout="grid"]')).fontWeight
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
await browser.close();
|
|
65
|
+
|
|
66
|
+
// Source regex
|
|
67
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
68
|
+
const sourceWiredClassRing = /'ring' \? '.*font-medium.*' : '.*hover:font-medium'.*\$\{chromePopping === 'layout-ring'/.test(src);
|
|
69
|
+
const sourceWiredClassGrid = /'grid' \? '.*font-medium.*' : '.*hover:font-medium'.*\$\{chromePopping === 'layout-grid'/.test(src);
|
|
70
|
+
const sourceWiredAttrRing = /data-topo-chrome-layout-hover-preview-fw=\{layout === 'ring' \? null : '500'\}/.test(src);
|
|
71
|
+
const sourceWiredAttrGrid = /data-topo-chrome-layout-hover-preview-fw=\{layout === 'grid' \? null : '500'\}/.test(src);
|
|
72
|
+
const sourceWiredTransRing = /transition: '.*font-weight 150ms ease'.*\n.*Ring/.test(src) ||
|
|
73
|
+
/font-weight 150ms ease'\s*\}\}\s*>\s*\n\s*Ring/.test(src);
|
|
74
|
+
const sourceWiredTransGrid = /borderColor:.*containerBorder.*font-weight 150ms ease/.test(src);
|
|
75
|
+
|
|
76
|
+
const ring = buttons.find(b => b.label === 'ring');
|
|
77
|
+
const grid = buttons.find(b => b.label === 'grid');
|
|
78
|
+
|
|
79
|
+
const results = {
|
|
80
|
+
ring_active_true: ring?.active === 'true',
|
|
81
|
+
ring_active_fw_500: ring?.fw === '500',
|
|
82
|
+
ring_no_preview_attr: ring?.previewAttr === null,
|
|
83
|
+
grid_active_false: grid?.active === 'false',
|
|
84
|
+
grid_inactive_fw_400: grid?.fw === '400',
|
|
85
|
+
grid_preview_attr_500: grid?.previewAttr === '500',
|
|
86
|
+
grid_hover_fw_500: gridHoverFw === '500',
|
|
87
|
+
source_class_ring: sourceWiredClassRing,
|
|
88
|
+
source_class_grid: sourceWiredClassGrid,
|
|
89
|
+
source_attr_ring: sourceWiredAttrRing,
|
|
90
|
+
source_attr_grid: sourceWiredAttrGrid,
|
|
91
|
+
source_trans_grid: sourceWiredTransGrid,
|
|
92
|
+
};
|
|
93
|
+
const ok = Object.values(results).every(Boolean);
|
|
94
|
+
console.log(`${ok ? '✅' : '❌'} R522 layout hover-fw preview:`,
|
|
95
|
+
JSON.stringify(results, null, 2),
|
|
96
|
+
'\n buttons:', JSON.stringify(buttons),
|
|
97
|
+
'\n grid hover fw:', gridHoverFw);
|
|
98
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* Round 597 verification: Layout Ring/Grid segmented buttons
|
|
2
|
+
* gain hover:brightness-[1.15]. 37+38th anchors (6+7th HTML).
|
|
3
|
+
* Paired-anchor round closing the 2nd segmented control at
|
|
4
|
+
* brightness parity (R596 was zoom +/-).
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock nodes → chrome strip renders Ring + Grid buttons
|
|
8
|
+
* 2. rest: filter='none', brightness-hover-attr='1.15'
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: hover:brightness-[1.15] + 'filter 150ms ease' in
|
|
11
|
+
* inline transition list
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const rest = await page.evaluate(() => {
|
|
48
|
+
const ring = document.querySelector('[data-topo-chrome-layout="ring"]');
|
|
49
|
+
const grid = document.querySelector('[data-topo-chrome-layout="grid"]');
|
|
50
|
+
if (!ring || !grid) return null;
|
|
51
|
+
return {
|
|
52
|
+
ring: {
|
|
53
|
+
filter: getComputedStyle(ring).filter,
|
|
54
|
+
transitionProperty: getComputedStyle(ring).transitionProperty,
|
|
55
|
+
brightnessHoverAttr: ring.getAttribute('data-topo-chrome-layout-ring-brightness-hover'),
|
|
56
|
+
ariaLabel: ring.textContent,
|
|
57
|
+
},
|
|
58
|
+
grid: {
|
|
59
|
+
filter: getComputedStyle(grid).filter,
|
|
60
|
+
transitionProperty: getComputedStyle(grid).transitionProperty,
|
|
61
|
+
brightnessHoverAttr: grid.getAttribute('data-topo-chrome-layout-grid-brightness-hover'),
|
|
62
|
+
ariaLabel: grid.textContent,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await browser.close();
|
|
68
|
+
|
|
69
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
70
|
+
const sourceRingFilter = /data-topo-chrome-layout="ring"[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
|
|
71
|
+
const sourceGridFilter = /data-topo-chrome-layout="grid"[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
|
|
72
|
+
const sourceRingTransition = /data-topo-chrome-layout="ring"[\s\S]*?filter 150ms ease/.test(src);
|
|
73
|
+
const sourceGridTransition = /data-topo-chrome-layout="grid"[\s\S]*?filter 150ms ease/.test(src);
|
|
74
|
+
|
|
75
|
+
const results = {
|
|
76
|
+
both_buttons_present: !!rest,
|
|
77
|
+
ring_rest_filter_none: rest?.ring.filter === 'none',
|
|
78
|
+
grid_rest_filter_none: rest?.grid.filter === 'none',
|
|
79
|
+
ring_hover_attr_115: rest?.ring.brightnessHoverAttr === '1.15',
|
|
80
|
+
grid_hover_attr_115: rest?.grid.brightnessHoverAttr === '1.15',
|
|
81
|
+
ring_label: /ring/i.test(rest?.ring.ariaLabel || ''),
|
|
82
|
+
grid_label: /grid/i.test(rest?.grid.ariaLabel || ''),
|
|
83
|
+
ring_transition_filter: /filter/.test(rest?.ring.transitionProperty || ''),
|
|
84
|
+
grid_transition_filter: /filter/.test(rest?.grid.transitionProperty || ''),
|
|
85
|
+
source_ring_filter: sourceRingFilter,
|
|
86
|
+
source_grid_filter: sourceGridFilter,
|
|
87
|
+
source_ring_transition: sourceRingTransition,
|
|
88
|
+
source_grid_transition: sourceGridTransition,
|
|
89
|
+
};
|
|
90
|
+
const ok = Object.values(results).every(Boolean);
|
|
91
|
+
console.log(`${ok ? '✅' : '❌'} R597 Ring/Grid brightness (37+38th anchors, 2nd segmented control closure):`,
|
|
92
|
+
JSON.stringify(results, null, 2),
|
|
93
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
94
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* Round 674 — chrome Layout Ring/Grid toggle pair gain multi-layer
|
|
2
|
+
* halo on hover via new hoveredLayout state ('ring'|'grid'|null).
|
|
3
|
+
* Pre-R674 these buttons had only Tailwind hover:brightness-[1.15]
|
|
4
|
+
* (R597). Post-R674 inline filter uses the same 2+4 stride at pal.
|
|
5
|
+
* legendAccent tint as R667/R668/R673 chrome-control siblings,
|
|
6
|
+
* completing the chrome toggle-controls family closure.
|
|
7
|
+
*
|
|
8
|
+
* 33rd anchor in multi-layer halo family (paired sibling extension).
|
|
9
|
+
*
|
|
10
|
+
* Source assertions:
|
|
11
|
+
* - useState<'ring'|'grid'|null>
|
|
12
|
+
* - both buttons' onMouseEnter/Leave wired with value-typed setter
|
|
13
|
+
* - both inline filters use pal.legendAccent 2+4 stride alpha 80/40
|
|
14
|
+
* - data-topo-chrome-layout-{ring,grid}-halo-layers attrs toggle '2'/'0'
|
|
15
|
+
*
|
|
16
|
+
* Runtime assertions:
|
|
17
|
+
* - both buttons present in DOM
|
|
18
|
+
* - rest state: halo-layers='0' on both
|
|
19
|
+
*/
|
|
20
|
+
import { chromium } from 'playwright';
|
|
21
|
+
import { readFileSync } from 'node:fs';
|
|
22
|
+
|
|
23
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
24
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
25
|
+
|
|
26
|
+
const browser = await chromium.launch({ headless: true });
|
|
27
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
28
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
29
|
+
await ctx.addInitScript(() => {
|
|
30
|
+
try {
|
|
31
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
32
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
33
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
34
|
+
} catch {}
|
|
35
|
+
});
|
|
36
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
37
|
+
const r = await route.fetch();
|
|
38
|
+
const b = await r.json();
|
|
39
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
40
|
+
const mk = (alias) => ({
|
|
41
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
42
|
+
network_id: nid, project_dir: null,
|
|
43
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
44
|
+
});
|
|
45
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
46
|
+
});
|
|
47
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
48
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
49
|
+
const page = await ctx.newPage();
|
|
50
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
51
|
+
await page.waitForSelector('[data-topo-chrome-layout-ring-halo-layers]', { timeout: 15000, state: 'attached' });
|
|
52
|
+
await page.waitForTimeout(500);
|
|
53
|
+
|
|
54
|
+
const restState = await page.evaluate(() => {
|
|
55
|
+
const ring = document.querySelector('[data-topo-chrome-layout="ring"]');
|
|
56
|
+
const grid = document.querySelector('[data-topo-chrome-layout="grid"]');
|
|
57
|
+
return {
|
|
58
|
+
ring_present: !!ring,
|
|
59
|
+
grid_present: !!grid,
|
|
60
|
+
ring_layers: ring?.getAttribute('data-topo-chrome-layout-ring-halo-layers'),
|
|
61
|
+
grid_layers: grid?.getAttribute('data-topo-chrome-layout-grid-halo-layers'),
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await browser.close();
|
|
66
|
+
|
|
67
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
68
|
+
const sourceState = /const \[hoveredLayout, setHoveredLayout\] = useState<'ring' \| 'grid' \| null>\(null\);/.test(src);
|
|
69
|
+
const sourceRingHandler = /onMouseEnter=\{\(\) => setHoveredLayout\('ring'\)\}/.test(src) &&
|
|
70
|
+
/onMouseLeave=\{\(\) => setHoveredLayout\(\(prev\) => prev === 'ring' \? null : prev\)\}/.test(src);
|
|
71
|
+
const sourceGridHandler = /onMouseEnter=\{\(\) => setHoveredLayout\('grid'\)\}/.test(src) &&
|
|
72
|
+
/onMouseLeave=\{\(\) => setHoveredLayout\(\(prev\) => prev === 'grid' \? null : prev\)\}/.test(src);
|
|
73
|
+
const sourceRingFilter = /filter: hoveredLayout === 'ring' \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
74
|
+
const sourceGridFilter = /filter: hoveredLayout === 'grid' \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
75
|
+
const sourceRingAttr = /data-topo-chrome-layout-ring-halo-layers=\{hoveredLayout === 'ring' \? '2' : '0'\}/.test(src);
|
|
76
|
+
const sourceGridAttr = /data-topo-chrome-layout-grid-halo-layers=\{hoveredLayout === 'grid' \? '2' : '0'\}/.test(src);
|
|
77
|
+
|
|
78
|
+
const results = {
|
|
79
|
+
ring_present: restState.ring_present,
|
|
80
|
+
grid_present: restState.grid_present,
|
|
81
|
+
rest_ring_layers_0: restState.ring_layers === '0',
|
|
82
|
+
rest_grid_layers_0: restState.grid_layers === '0',
|
|
83
|
+
source_state: sourceState,
|
|
84
|
+
source_ring_handler: sourceRingHandler,
|
|
85
|
+
source_grid_handler: sourceGridHandler,
|
|
86
|
+
source_ring_filter: sourceRingFilter,
|
|
87
|
+
source_grid_filter: sourceGridFilter,
|
|
88
|
+
source_ring_attr: sourceRingAttr,
|
|
89
|
+
source_grid_attr: sourceGridAttr,
|
|
90
|
+
};
|
|
91
|
+
const ok = Object.values(results).every(Boolean);
|
|
92
|
+
console.log(`${ok ? '✅' : '❌'} R674 chrome Layout ring/grid toggle multi-layer halo:`,
|
|
93
|
+
JSON.stringify(results, null, 2),
|
|
94
|
+
`\n rest: ${JSON.stringify(restState)}`);
|
|
95
|
+
process.exit(ok ? 0 : 1);
|