@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,102 @@
|
|
|
1
|
+
/* Round 498 verification: recent-signal row hot-count tspan gains a
|
|
2
|
+
* 3s opacity pulse (0.85↔1.0) when count >= 10 (isHot && !reducedMotion).
|
|
3
|
+
* Adds the 呼吸感 theme's second anchor after R497 hub idle-breath —
|
|
4
|
+
* gentle motion attracts glance to high-traffic lanes.
|
|
5
|
+
*
|
|
6
|
+
* Test scenarios — needs >= 10 messages between two aliases to trigger
|
|
7
|
+
* the hot threshold AND the recent-signal panel to render. Uses a
|
|
8
|
+
* messages fixture with 10 messages from alpha·a1 → alpha·a2.
|
|
9
|
+
*/
|
|
10
|
+
import { chromium } from 'playwright';
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
|
|
13
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
14
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
15
|
+
|
|
16
|
+
async function probe({ reducedMotion }) {
|
|
17
|
+
const browser = await chromium.launch({ headless: true });
|
|
18
|
+
const ctx = await browser.newContext({
|
|
19
|
+
viewport: { width: 1500, height: 1200 },
|
|
20
|
+
reducedMotion: reducedMotion ? 'reduce' : 'no-preference',
|
|
21
|
+
});
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try {
|
|
25
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
26
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
27
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
28
|
+
} catch {}
|
|
29
|
+
});
|
|
30
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
31
|
+
const r = await route.fetch();
|
|
32
|
+
const b = await r.json();
|
|
33
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
34
|
+
const mk = (alias, status) => ({
|
|
35
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
36
|
+
network_id: nid, project_dir: null,
|
|
37
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
38
|
+
});
|
|
39
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
40
|
+
mk('alpha·a1', 'working'),
|
|
41
|
+
mk('alpha·a2', 'idle'),
|
|
42
|
+
] } });
|
|
43
|
+
});
|
|
44
|
+
// 12 messages → count >= 10 → isHot true
|
|
45
|
+
const msgs = Array.from({ length: 12 }, (_, i) => ({
|
|
46
|
+
id: `m${i}`, from_alias: 'alpha·a1', to_alias: 'alpha·a2',
|
|
47
|
+
content: 'test', created_at: fresh,
|
|
48
|
+
}));
|
|
49
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: msgs } }));
|
|
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.waitForTimeout(2000);
|
|
54
|
+
|
|
55
|
+
const result = await page.evaluate(() => {
|
|
56
|
+
const tspans = Array.from(document.querySelectorAll('[data-recent-row-count]'));
|
|
57
|
+
const hotTspan = tspans.find((t) => t.getAttribute('data-recent-row-count-hot') === 'true');
|
|
58
|
+
if (!hotTspan) return { found: false, totalTspans: tspans.length };
|
|
59
|
+
const cs = window.getComputedStyle(hotTspan);
|
|
60
|
+
return {
|
|
61
|
+
found: true,
|
|
62
|
+
class_has_pulse: /anet-recent-hot-pulse/.test(hotTspan.getAttribute('class') || ''),
|
|
63
|
+
pulse_attr: hotTspan.getAttribute('data-recent-row-count-hot-pulse'),
|
|
64
|
+
animation_name: cs.animationName,
|
|
65
|
+
animation_duration: cs.animationDuration,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
await browser.close();
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const motion = await probe({ reducedMotion: false });
|
|
73
|
+
const a11y = await probe({ reducedMotion: true });
|
|
74
|
+
|
|
75
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
76
|
+
const css = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
77
|
+
const sourceClassWired = /className=\{isHot && !reducedMotion \? 'anet-recent-hot-pulse' : undefined\}/.test(src);
|
|
78
|
+
const sourceAttrWired = /data-recent-row-count-hot-pulse=\{isHot && !reducedMotion \? 'true' : 'false'\}/.test(src);
|
|
79
|
+
const cssKeyframeWired = /@keyframes anet-recent-hot-pulse-kf\s*\{[\s\S]*?opacity:\s*0\.85[\s\S]*?opacity:\s*1[\s\S]*?\}/.test(css);
|
|
80
|
+
const cssClassWired = /\.anet-recent-hot-pulse\s*\{\s*animation:\s*anet-recent-hot-pulse-kf 3s ease-in-out infinite/.test(css);
|
|
81
|
+
|
|
82
|
+
const results = {
|
|
83
|
+
// Motion fixture: tspan found + class applied + attr='true' + animation runs
|
|
84
|
+
motion_hot_found: motion.found,
|
|
85
|
+
motion_class_pulse: motion.found && motion.class_has_pulse,
|
|
86
|
+
motion_attr_true: motion.found && motion.pulse_attr === 'true',
|
|
87
|
+
motion_anim_name: motion.found && motion.animation_name === 'anet-recent-hot-pulse-kf',
|
|
88
|
+
// a11y fixture: class still absent (component-side gate) — attr='false'
|
|
89
|
+
a11y_hot_found: a11y.found,
|
|
90
|
+
a11y_no_class: a11y.found && !a11y.class_has_pulse,
|
|
91
|
+
a11y_attr_false: a11y.found && a11y.pulse_attr === 'false',
|
|
92
|
+
// Source/CSS
|
|
93
|
+
source_class_wired: sourceClassWired,
|
|
94
|
+
source_attr_wired: sourceAttrWired,
|
|
95
|
+
css_keyframe_wired: cssKeyframeWired,
|
|
96
|
+
css_class_wired: cssClassWired,
|
|
97
|
+
};
|
|
98
|
+
const ok = Object.values(results).every(Boolean);
|
|
99
|
+
console.log(`${ok ? '✅' : '❌'} R498 recent-row hot pulse:`, JSON.stringify(results),
|
|
100
|
+
'\n motion:', JSON.stringify(motion),
|
|
101
|
+
'\n a11y: ', JSON.stringify(a11y));
|
|
102
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/* Round 520 verification: `+N more flows` footer gains 5-axis hover
|
|
2
|
+
* signature by adding fontWeight 500 → 600 on hover. Closes R475
|
|
3
|
+
* panel-text cadence at this last 150ms holdout.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. rest: fw=500, attr='500', opacity=0.55, ls=0.2px, no underline
|
|
7
|
+
* + transition list includes opacity at 200ms (not 150ms)
|
|
8
|
+
* 2. hover: fw=600, attr='600', opacity=0.85, ls=0.3px, underline
|
|
9
|
+
* 3. source-side regex confirms fw ternary + cadence
|
|
10
|
+
*
|
|
11
|
+
* Needs flowLinks > 3 to render the footer — uses 5 working sessions
|
|
12
|
+
* with at least 1 inbound flow each via mock messages.
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from 'playwright';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
|
|
17
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
18
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
19
|
+
|
|
20
|
+
const browser = await chromium.launch({ headless: true });
|
|
21
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try {
|
|
25
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
26
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
27
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
28
|
+
} catch {}
|
|
29
|
+
});
|
|
30
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
31
|
+
const r = await route.fetch();
|
|
32
|
+
const b = await r.json();
|
|
33
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
34
|
+
const mk = (alias) => ({
|
|
35
|
+
alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
36
|
+
network_id: nid, project_dir: null,
|
|
37
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
38
|
+
});
|
|
39
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
40
|
+
mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'), mk('a·5'), mk('a·6'),
|
|
41
|
+
] } });
|
|
42
|
+
});
|
|
43
|
+
// Mock 6 recent messages → 6 flowLinks → "+ 3 more flows" footer (top-3 visible)
|
|
44
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: {
|
|
45
|
+
messages: [
|
|
46
|
+
{ id: 'm1', from_alias: 'a·1', to_alias: 'a·2', content: 't', created_at: fresh },
|
|
47
|
+
{ id: 'm2', from_alias: 'a·2', to_alias: 'a·3', content: 't', created_at: fresh },
|
|
48
|
+
{ id: 'm3', from_alias: 'a·3', to_alias: 'a·4', content: 't', created_at: fresh },
|
|
49
|
+
{ id: 'm4', from_alias: 'a·4', to_alias: 'a·5', content: 't', created_at: fresh },
|
|
50
|
+
{ id: 'm5', from_alias: 'a·5', to_alias: 'a·6', content: 't', created_at: fresh },
|
|
51
|
+
{ id: 'm6', from_alias: 'a·6', to_alias: 'a·1', content: 't', created_at: fresh },
|
|
52
|
+
]
|
|
53
|
+
} }));
|
|
54
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
55
|
+
const page = await ctx.newPage();
|
|
56
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
57
|
+
await page.waitForSelector('[data-recent-panel-more]', { timeout: 15000 });
|
|
58
|
+
await page.waitForTimeout(1000);
|
|
59
|
+
|
|
60
|
+
const sel = '[data-recent-panel-more]';
|
|
61
|
+
|
|
62
|
+
// Phase 1: rest
|
|
63
|
+
const rest = await page.evaluate((sel) => {
|
|
64
|
+
const el = document.querySelector(sel);
|
|
65
|
+
if (!el) return null;
|
|
66
|
+
const cs = getComputedStyle(el);
|
|
67
|
+
return {
|
|
68
|
+
attrFw: el.getAttribute('data-recent-panel-more-font-weight'),
|
|
69
|
+
attrHovered: el.getAttribute('data-recent-panel-more-hovered'),
|
|
70
|
+
attrTrans: el.getAttribute('data-recent-panel-more-transition'),
|
|
71
|
+
fontWeight: cs.fontWeight,
|
|
72
|
+
opacity: cs.opacity,
|
|
73
|
+
letterSpacing: cs.letterSpacing,
|
|
74
|
+
textDecoration:cs.textDecorationLine,
|
|
75
|
+
transition: cs.transition,
|
|
76
|
+
};
|
|
77
|
+
}, sel);
|
|
78
|
+
|
|
79
|
+
// Phase 2: hover the parent <g> (text is wrapped in a click-target <g>)
|
|
80
|
+
await page.hover('[data-recent-panel-more-nav]');
|
|
81
|
+
await page.waitForTimeout(350);
|
|
82
|
+
const hover = await page.evaluate((sel) => {
|
|
83
|
+
const el = document.querySelector(sel);
|
|
84
|
+
if (!el) return null;
|
|
85
|
+
const cs = getComputedStyle(el);
|
|
86
|
+
return {
|
|
87
|
+
attrFw: el.getAttribute('data-recent-panel-more-font-weight'),
|
|
88
|
+
attrHovered: el.getAttribute('data-recent-panel-more-hovered'),
|
|
89
|
+
fontWeight: cs.fontWeight,
|
|
90
|
+
opacity: cs.opacity,
|
|
91
|
+
letterSpacing: cs.letterSpacing,
|
|
92
|
+
textDecoration:cs.textDecorationLine,
|
|
93
|
+
};
|
|
94
|
+
}, sel);
|
|
95
|
+
|
|
96
|
+
await browser.close();
|
|
97
|
+
|
|
98
|
+
// Phase 3: source regex
|
|
99
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
100
|
+
const sourceWiredFw =
|
|
101
|
+
/fontWeight=\{hoveredRecentMore \? '600' : '500'\}/.test(src) &&
|
|
102
|
+
/data-recent-panel-more-font-weight=\{hoveredRecentMore \? '600' : '500'\}/.test(src);
|
|
103
|
+
const sourceWiredCadence =
|
|
104
|
+
/transition: 'opacity 200ms ease-out, fill 200ms ease-out, letter-spacing 200ms ease-out, font-weight 200ms ease-out'/.test(src);
|
|
105
|
+
|
|
106
|
+
const results = {
|
|
107
|
+
rest_attr_fw_500: rest?.attrFw === '500',
|
|
108
|
+
rest_attr_hovered_false: rest?.attrHovered === 'false',
|
|
109
|
+
rest_attr_trans_200: rest?.attrTrans === '200ms',
|
|
110
|
+
rest_fw_500: rest?.fontWeight === '500',
|
|
111
|
+
rest_underline_none: rest?.textDecoration === 'none' || rest?.textDecoration === '',
|
|
112
|
+
rest_transition_200: /(200ms|0\.2s).+font-weight|font-weight.+(200ms|0\.2s)/.test(rest?.transition || '') ||
|
|
113
|
+
/(200ms|0\.2s)/.test(rest?.transition || ''),
|
|
114
|
+
hover_attr_fw_600: hover?.attrFw === '600',
|
|
115
|
+
hover_attr_hovered_true: hover?.attrHovered === 'true',
|
|
116
|
+
hover_fw_600: hover?.fontWeight === '600',
|
|
117
|
+
hover_letter_spacing_3: hover?.letterSpacing === '0.3px',
|
|
118
|
+
hover_underline: /underline/.test(hover?.textDecoration || ''),
|
|
119
|
+
source_fw_ternary: sourceWiredFw,
|
|
120
|
+
source_cadence_4axis: sourceWiredCadence,
|
|
121
|
+
};
|
|
122
|
+
const ok = Object.values(results).every(Boolean);
|
|
123
|
+
console.log(`${ok ? '✅' : '❌'} R520 recent-panel-more 5-axis hover + 200ms cadence:`,
|
|
124
|
+
JSON.stringify(results, null, 2),
|
|
125
|
+
'\n rest:', JSON.stringify(rest), '\n hover:', JSON.stringify(hover));
|
|
126
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/* Round 670 — "+N more flows" footer in recent-signal panel extends
|
|
2
|
+
* its single-axis brightness(1.15) hover to the multi-layer drop-
|
|
3
|
+
* shadow halo vocabulary. 29th anchor in the family. The footer is
|
|
4
|
+
* the panel's primary nav into /messages — closing its hover signature
|
|
5
|
+
* at 7 axes (densest on any topology surface).
|
|
6
|
+
*
|
|
7
|
+
* Source assertions:
|
|
8
|
+
* - filter chain uses pal.legendAccent at 0x80 + 0x40 with 2+4 stride,
|
|
9
|
+
* gated on hoveredRecentMore
|
|
10
|
+
* - data-recent-panel-more-halo-layers attr toggles '2' ↔ '0' on hover
|
|
11
|
+
*
|
|
12
|
+
* Runtime assertions:
|
|
13
|
+
* - footer present (≥6 recent messages so "+N more" shows)
|
|
14
|
+
* - rest: halo-layers='0', brightness='1', hovered='false'
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
const browser = await chromium.launch({ headless: true });
|
|
23
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
24
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
25
|
+
await ctx.addInitScript(() => {
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
28
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
29
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
30
|
+
} catch {}
|
|
31
|
+
});
|
|
32
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
33
|
+
const r = await route.fetch();
|
|
34
|
+
const b = await r.json();
|
|
35
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
36
|
+
const mk = (alias) => ({
|
|
37
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
38
|
+
network_id: nid, project_dir: null,
|
|
39
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
40
|
+
});
|
|
41
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
42
|
+
mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'), mk('a·5'),
|
|
43
|
+
mk('a·6'), mk('a·7'), mk('a·8'),
|
|
44
|
+
] } });
|
|
45
|
+
});
|
|
46
|
+
// 10 unique edges across 8 nodes — enough that "+N more flows" footer renders
|
|
47
|
+
// (recent panel caps visible rows; surplus surfaces the footer).
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: Array.from({ length: 10 }, (_, i) => ({
|
|
49
|
+
id: `m${i}`,
|
|
50
|
+
from_alias: `a·${(i % 8) + 1}`,
|
|
51
|
+
to_alias: `a·${((i + 3) % 8) + 1}`,
|
|
52
|
+
kind: i % 2 ? 'task' : 'message',
|
|
53
|
+
content: `ping ${i}`,
|
|
54
|
+
network_id: 'default',
|
|
55
|
+
created_at: fresh,
|
|
56
|
+
})) } }));
|
|
57
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
58
|
+
const page = await ctx.newPage();
|
|
59
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
60
|
+
await page.waitForSelector('[data-recent-panel-more-hovered]', { timeout: 15000, state: 'attached' });
|
|
61
|
+
await page.waitForTimeout(500);
|
|
62
|
+
|
|
63
|
+
const restState = await page.evaluate(() => {
|
|
64
|
+
const el = document.querySelector('[data-recent-panel-more-hovered]');
|
|
65
|
+
return el ? {
|
|
66
|
+
layers: el.getAttribute('data-recent-panel-more-halo-layers'),
|
|
67
|
+
hovered: el.getAttribute('data-recent-panel-more-hovered'),
|
|
68
|
+
brightness: el.getAttribute('data-recent-panel-more-brightness'),
|
|
69
|
+
} : null;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await browser.close();
|
|
73
|
+
|
|
74
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
75
|
+
const sourceFilter = /hoveredRecentMore \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
76
|
+
const sourceLayersAttr = /data-recent-panel-more-halo-layers=\{hoveredRecentMore \? '2' : '0'\}/.test(src);
|
|
77
|
+
|
|
78
|
+
const results = {
|
|
79
|
+
footer_present: !!restState,
|
|
80
|
+
rest_layers_zero: restState?.layers === '0',
|
|
81
|
+
rest_hovered_false: restState?.hovered === 'false',
|
|
82
|
+
rest_brightness_1: restState?.brightness === '1',
|
|
83
|
+
source_filter: sourceFilter,
|
|
84
|
+
source_layers_attr: sourceLayersAttr,
|
|
85
|
+
};
|
|
86
|
+
const ok = Object.values(results).every(Boolean);
|
|
87
|
+
console.log(`${ok ? '✅' : '❌'} R670 +N more footer multi-layer halo (7-axis hover closure):`,
|
|
88
|
+
JSON.stringify(results, null, 2),
|
|
89
|
+
`\n rest: ${JSON.stringify(restState)}`);
|
|
90
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* Round 634 — panel header hot-count tspan joins hot-pulse family
|
|
2
|
+
* at the panel-aggregate tier. ClassName composition combines the
|
|
3
|
+
* one-shot 'anet-fade-in' mount fade with the continuous
|
|
4
|
+
* 'anet-recent-hot-pulse' breath when hotFlowCount > 0 &&
|
|
5
|
+
* !reducedMotion. 4th anchor in hot-pulse family.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. cold (3 messages on one edge → no hot lane): hot-count
|
|
9
|
+
* tspan present but hidden (opacity=0); pulse attr 'off';
|
|
10
|
+
* className === 'anet-fade-in' (no breath)
|
|
11
|
+
* 2. hot (12 messages on one edge → 1 hot lane): tspan visible
|
|
12
|
+
* (opacity=1); pulse attr 'on'; className contains
|
|
13
|
+
* 'anet-recent-hot-pulse'; computed animation-name resolves
|
|
14
|
+
* to anet-recent-hot-pulse-kf
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
async function shoot(messageCount, label) {
|
|
23
|
+
const browser = await chromium.launch({ headless: true });
|
|
24
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
25
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
26
|
+
await ctx.addInitScript(() => {
|
|
27
|
+
try {
|
|
28
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
29
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
30
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
31
|
+
} catch {}
|
|
32
|
+
});
|
|
33
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
34
|
+
const r = await route.fetch();
|
|
35
|
+
const b = await r.json();
|
|
36
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
37
|
+
const mk = (alias) => ({
|
|
38
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
39
|
+
network_id: nid, project_dir: null,
|
|
40
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
41
|
+
});
|
|
42
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
43
|
+
});
|
|
44
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages:
|
|
45
|
+
Array.from({ length: messageCount }, (_, i) => ({
|
|
46
|
+
from_alias: 'a·1', to_alias: 'a·2', content: `msg-${i}`, created_at: fresh,
|
|
47
|
+
}))
|
|
48
|
+
} }));
|
|
49
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
50
|
+
const page = await ctx.newPage();
|
|
51
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
52
|
+
await page.waitForSelector('[data-recent-panel-hot-count]', { timeout: 15000, state: 'attached' });
|
|
53
|
+
await page.waitForTimeout(500);
|
|
54
|
+
const state = await page.evaluate(() => {
|
|
55
|
+
const el = document.querySelector('[data-recent-panel-hot-count]');
|
|
56
|
+
if (!el) return null;
|
|
57
|
+
const cs = getComputedStyle(el);
|
|
58
|
+
return {
|
|
59
|
+
hotCount: el.getAttribute('data-recent-panel-hot-count'),
|
|
60
|
+
hotVisible: el.getAttribute('data-recent-panel-hot-visible'),
|
|
61
|
+
hotPulseAttr: el.getAttribute('data-recent-panel-hot-pulse'),
|
|
62
|
+
cls: el.getAttribute('class') || '',
|
|
63
|
+
opacity: el.getAttribute('opacity'),
|
|
64
|
+
animName: cs.animationName,
|
|
65
|
+
animDuration: cs.animationDuration,
|
|
66
|
+
animIter: cs.animationIterationCount,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
await browser.close();
|
|
70
|
+
return { label, state };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const cold = await shoot(3, 'cold');
|
|
74
|
+
const hot = await shoot(12, 'hot');
|
|
75
|
+
|
|
76
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
77
|
+
const sourceClassNameGate = /className=\{hotFlowCount > 0 && !reducedMotion\s*\?\s*'anet-fade-in anet-recent-hot-pulse'\s*:\s*'anet-fade-in'\}/.test(src);
|
|
78
|
+
const sourcePulseAttr = /data-recent-panel-hot-pulse=\{hotFlowCount > 0 && !reducedMotion \? 'on' : 'off'\}/.test(src);
|
|
79
|
+
|
|
80
|
+
const results = {
|
|
81
|
+
cold_present: !!cold.state,
|
|
82
|
+
cold_hot_count_0: cold.state?.hotCount === '0',
|
|
83
|
+
cold_visible_false: cold.state?.hotVisible === 'false',
|
|
84
|
+
cold_pulse_off: cold.state?.hotPulseAttr === 'off',
|
|
85
|
+
cold_opacity_0: cold.state?.opacity === '0',
|
|
86
|
+
cold_cls_no_pulse: !/anet-recent-hot-pulse/.test(cold.state?.cls || ''),
|
|
87
|
+
cold_cls_has_fade_in: /anet-fade-in/.test(cold.state?.cls || ''),
|
|
88
|
+
hot_present: !!hot.state,
|
|
89
|
+
hot_count_1: hot.state?.hotCount === '1',
|
|
90
|
+
hot_visible_true: hot.state?.hotVisible === 'true',
|
|
91
|
+
hot_pulse_on: hot.state?.hotPulseAttr === 'on',
|
|
92
|
+
hot_opacity_1: hot.state?.opacity === '1',
|
|
93
|
+
hot_cls_has_pulse: /anet-recent-hot-pulse/.test(hot.state?.cls || ''),
|
|
94
|
+
hot_cls_has_fade_in: /anet-fade-in/.test(hot.state?.cls || ''),
|
|
95
|
+
// CSS animation-name may include both anet-fade-in + anet-recent-hot-pulse-kf
|
|
96
|
+
hot_anim_name_includes_kf: /anet-recent-hot-pulse-kf/.test(hot.state?.animName || ''),
|
|
97
|
+
source_className_gate: sourceClassNameGate,
|
|
98
|
+
source_pulse_attr: sourcePulseAttr,
|
|
99
|
+
};
|
|
100
|
+
const ok = Object.values(results).every(Boolean);
|
|
101
|
+
console.log(`${ok ? '✅' : '❌'} R634 recent-panel hot-count pulse (4th hot-pulse anchor):`,
|
|
102
|
+
JSON.stringify(results, null, 2),
|
|
103
|
+
`\n cold: ${JSON.stringify(cold.state)}`,
|
|
104
|
+
`\n hot: ${JSON.stringify(hot.state)}`);
|
|
105
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* Round 647 — recent-row freshness pip filter gains a SECOND
|
|
2
|
+
* drop-shadow layer at 6px blur with halved alpha (R478 inner
|
|
3
|
+
* 0x80 + R647 outer 0x40). Extends multi-layer halo to first
|
|
4
|
+
* panel-tier anchor.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 1 fresh message → fresh pip alpha > 0.7
|
|
8
|
+
* 2. pip has halo-layers='2', computed filter has 2 drop-shadow
|
|
9
|
+
* substrings with pal.legendAccent (cyber #67e8f9 cyan) tint
|
|
10
|
+
* 3. source: filter expression stacks 2 drop-shadows fresh-gated
|
|
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() - 5 * 1000).toISOString(); // 5s old → very fresh
|
|
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
|
+
{ from_alias: 'a·1', to_alias: 'a·2', content: 'hello', created_at: fresh },
|
|
41
|
+
] } }));
|
|
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-recent-row-freshness]', { timeout: 15000, state: 'attached' });
|
|
46
|
+
await page.waitForTimeout(500);
|
|
47
|
+
|
|
48
|
+
const fresh_state = await page.evaluate(() => {
|
|
49
|
+
const el = document.querySelector('[data-recent-row-freshness]');
|
|
50
|
+
if (!el) return null;
|
|
51
|
+
const cs = getComputedStyle(el);
|
|
52
|
+
return {
|
|
53
|
+
alpha: el.getAttribute('data-recent-row-freshness-alpha'),
|
|
54
|
+
layers: el.getAttribute('data-recent-row-freshness-halo-layers'),
|
|
55
|
+
glow: el.getAttribute('data-recent-row-freshness-glow'),
|
|
56
|
+
filter: cs.filter,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceFilter = /`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 6px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)`/.test(src);
|
|
64
|
+
const sourceLayersAttr = /data-recent-row-freshness-halo-layers=\{alpha > 0\.7 \? '2' : '0'\}/.test(src);
|
|
65
|
+
|
|
66
|
+
const dropShadowCount = (fresh_state?.filter?.match(/drop-shadow/g) || []).length;
|
|
67
|
+
|
|
68
|
+
const results = {
|
|
69
|
+
fresh_present: !!fresh_state,
|
|
70
|
+
fresh_alpha_high: parseFloat(fresh_state?.alpha || '0') > 0.7,
|
|
71
|
+
fresh_layers_2: fresh_state?.layers === '2',
|
|
72
|
+
fresh_glow_true: fresh_state?.glow === 'true',
|
|
73
|
+
fresh_two_dropshadows: dropShadowCount === 2,
|
|
74
|
+
fresh_brightness: /brightness/.test(fresh_state?.filter || ''),
|
|
75
|
+
source_filter: sourceFilter,
|
|
76
|
+
source_layers_attr: sourceLayersAttr,
|
|
77
|
+
};
|
|
78
|
+
const ok = Object.values(results).every(Boolean);
|
|
79
|
+
console.log(`${ok ? '✅' : '❌'} R647 recent-row freshness pip multi-layer halo (panel-tier chromatic identity):`,
|
|
80
|
+
JSON.stringify(results, null, 2),
|
|
81
|
+
`\n fresh: ${JSON.stringify(fresh_state)}`);
|
|
82
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* Round 625 — extend isRowActive gate to include chat-target
|
|
2
|
+
* endpoint match. Recent-row tint rect (R611) brightens when
|
|
3
|
+
* row's from/to matches chatAlias. 11th anchor in chat-target-
|
|
4
|
+
* gated brightness family.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 1 flow message → recent-row + tint rect render
|
|
8
|
+
* 2. rest (no hover, no chat): tint rect at rest, no
|
|
9
|
+
* brightness, fill 'transparent'
|
|
10
|
+
* 3. source: isRowActive declaration includes
|
|
11
|
+
* isChatEndpointRow term
|
|
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
|
+
{ from_alias: 'a·1', to_alias: 'a·2', content: '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-tint-brightness]', { timeout: 15000, state: 'attached' });
|
|
47
|
+
await page.waitForTimeout(500);
|
|
48
|
+
|
|
49
|
+
const rest = await page.evaluate(() => {
|
|
50
|
+
const el = document.querySelector('[data-recent-row-tint-brightness]');
|
|
51
|
+
if (!el) return null;
|
|
52
|
+
return {
|
|
53
|
+
brightnessAttr: el.getAttribute('data-recent-row-tint-brightness'),
|
|
54
|
+
fill: el.getAttribute('fill'),
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await browser.close();
|
|
59
|
+
|
|
60
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
61
|
+
const sourceChatEndpoint = /const isChatEndpointRow = !!chatAlias && \(link\.from === chatAlias \|\| link\.to === chatAlias\)/.test(src);
|
|
62
|
+
const sourceRowActive = /const isRowActive\s+= isRowHovered \|\| isRowPinned \|\| isChatEndpointRow/.test(src);
|
|
63
|
+
|
|
64
|
+
const results = {
|
|
65
|
+
tint_present: !!rest,
|
|
66
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
67
|
+
rest_fill_transparent: rest?.fill === 'transparent',
|
|
68
|
+
source_chat_endpoint: sourceChatEndpoint,
|
|
69
|
+
source_row_active_with_chat: sourceRowActive,
|
|
70
|
+
};
|
|
71
|
+
const ok = Object.values(results).every(Boolean);
|
|
72
|
+
console.log(`${ok ? '✅' : '❌'} R625 recent-row chat-endpoint gate (chat-gated family 11th anchor):`,
|
|
73
|
+
JSON.stringify(results, null, 2),
|
|
74
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
75
|
+
process.exit(ok ? 0 : 1);
|