@sleep2agi/agent-network-dashboard 0.4.6 → 0.5.0
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/app-path-routes-manifest.json +2 -0
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +31 -31
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +16 -0
- 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/api/hub/server/[hostname]/agents/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/server/[hostname]/agents/route/build-manifest.json +9 -0
- package/.next/server/app/api/hub/server/[hostname]/agents/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/server/[hostname]/agents/route.js +7 -0
- package/.next/server/app/api/hub/server/[hostname]/agents/route.js.map +5 -0
- package/.next/server/app/api/hub/server/[hostname]/agents/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/server/[hostname]/agents/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route/build-manifest.json +9 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route.js +7 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route.js.map +5 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/server/[hostname]/health/route_client-reference-manifest.js +3 -0
- 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/app-paths-manifest.json +2 -0
- package/.next/server/chunks/0dk5_next-internal_server_app_api_hub_server_[hostname]_agents_route_actions_0vr92s4.js +3 -0
- package/.next/server/chunks/0dk5_next-internal_server_app_api_hub_server_[hostname]_agents_route_actions_0vr92s4.js.map +1 -0
- package/.next/server/chunks/0dk5_next-internal_server_app_api_hub_server_[hostname]_health_route_actions_0vr-bv5.js +3 -0
- package/.next/server/chunks/0dk5_next-internal_server_app_api_hub_server_[hostname]_health_route_actions_0vr-bv5.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__05nyivw._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__05nyivw._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0floe3h._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0floe3h._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -2
- 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/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0aauz~36q5n2a.css +2 -0
- package/.next/static/chunks/0f~0kgy2pycyc.js +1 -0
- package/.next/static/chunks/0l_~q07bhpkcx.js +7 -0
- package/.next/static/chunks/1175-dp18a1e_.js +1 -0
- package/.next/static/chunks/1552j0415oeal.js +4 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/app/api/hub/server/[hostname]/agents/route.ts +62 -0
- package/app/api/hub/server/[hostname]/health/route.ts +58 -0
- package/app/api/hub/servers/route.ts +88 -1
- package/app/components/CommandPalette.tsx +107 -0
- package/app/components/HelpOverlay.tsx +109 -1
- package/app/components/ServersDrawer.tsx +181 -5
- package/app/components/TopoGraph.tsx +6409 -286
- package/app/globals.css +110 -5
- package/app/lib/vendorIdentity.ts +14 -3
- package/docs/rfc/v0.10.0-hero3-dashboard-upgrade.md +230 -0
- package/package.json +2 -2
- package/public/sleep2agi-logo.svg +11 -0
- package/public/vendors/claude.svg +11 -0
- package/public/vendors/minimax.svg +11 -0
- package/public/vendors/openai.svg +12 -0
- package/screenshots/r293-p0/after-full.png +0 -0
- package/screenshots/r293-p0/after-topo.png +0 -0
- package/screenshots/r293-p0/baseline-full.png +0 -0
- package/screenshots/r293-p0/baseline-topo.png +0 -0
- package/screenshots/r293-p0/logo-integrated-full.png +0 -0
- package/screenshots/r293-p0/logo-integrated-topo.png +0 -0
- package/screenshots/r293-p0/servers-drawer-v0.10.0-full.png +0 -0
- package/screenshots/r293-p0/servers-drawer-v0.10.0.png +0 -0
- package/screenshots/r293-p0/wave1-after-full.png +0 -0
- package/screenshots/r293-p0/wave1-after-topo.png +0 -0
- package/scripts/p0-servers-drawer-screenshot.mjs +99 -0
- package/scripts/p0-topo-screenshot.mjs +82 -0
- package/scripts/topo-active-filter-pill-test.mjs +101 -0
- package/scripts/topo-active-links-chip-hover-test.mjs +103 -0
- package/scripts/topo-active-links-chip-nav-test.mjs +117 -0
- package/scripts/topo-active-links-chip-self-hover-test.mjs +171 -0
- package/scripts/topo-active-links-empty-recede-test.mjs +125 -0
- package/scripts/topo-active-links-freshness-test.mjs +113 -0
- package/scripts/topo-active-links-tooltip-test.mjs +79 -0
- package/scripts/topo-active-pulse-ease-test.mjs +120 -0
- package/scripts/topo-brand-logo-transition-test.mjs +94 -0
- package/scripts/topo-brand-watermark-test.mjs +97 -0
- package/scripts/topo-canvas-aria-test.mjs +108 -0
- package/scripts/topo-canvas-brand-fade-test.mjs +87 -0
- package/scripts/topo-chat-target-breath-test.mjs +84 -0
- package/scripts/topo-chat-target-ring-ease-test.mjs +82 -0
- package/scripts/topo-chat-target-ring-fade-test.mjs +124 -0
- package/scripts/topo-chip-empty-recede-test.mjs +116 -0
- package/scripts/topo-chip-focus-test.mjs +95 -0
- package/scripts/topo-chip-pin-mirror-test.mjs +113 -0
- package/scripts/topo-chip-row-gap-test.mjs +90 -0
- package/scripts/topo-chip-row-semantic-gap-test.mjs +97 -0
- package/scripts/topo-chip-row-tabular-test.mjs +111 -0
- package/scripts/topo-chip-unit-demotion-test.mjs +93 -0
- package/scripts/topo-chiprow-data-weight-test.mjs +94 -0
- package/scripts/topo-chrome-a11y-test.mjs +107 -0
- package/scripts/topo-chrome-active-weight-test.mjs +104 -0
- package/scripts/topo-chrome-focus-ring-unify-test.mjs +100 -0
- package/scripts/topo-chrome-gap-test.mjs +73 -0
- package/scripts/topo-chrome-icon-stroke-test.mjs +95 -0
- package/scripts/topo-chrome-inactive-color-test.mjs +90 -0
- package/scripts/topo-chrome-pop-extension-test.mjs +98 -0
- package/scripts/topo-chrome-pop-nodesize-test.mjs +88 -0
- package/scripts/topo-chrome-press-state-test.mjs +135 -0
- package/scripts/topo-chrome-strip-semantic-gap-test.mjs +99 -0
- package/scripts/topo-chrome-strip-theme-ease-test.mjs +99 -0
- package/scripts/topo-chrome-zoom-level-pop-test.mjs +122 -0
- package/scripts/topo-chrome-zoom-pop-test.mjs +130 -0
- package/scripts/topo-chrome-zoom-readout-weight-test.mjs +81 -0
- package/scripts/topo-click-ripple-ease-test.mjs +94 -0
- package/scripts/topo-cmdk-edge-clear-test.mjs +109 -0
- package/scripts/topo-cmdk-layout-view-test.mjs +108 -0
- package/scripts/topo-cmdk-pin-test.mjs +123 -0
- package/scripts/topo-cmdk-vendor-clear-test.mjs +133 -0
- package/scripts/topo-cmdk-vendor-pin-test.mjs +103 -0
- package/scripts/topo-corner-radius-unify-test.mjs +103 -0
- package/scripts/topo-dense-alias-fill-transition-test.mjs +133 -0
- package/scripts/topo-discrete-zoom-smooth-test.mjs +125 -0
- package/scripts/topo-edge-badge-click-pin-test.mjs +94 -0
- package/scripts/topo-edge-badge-crossfade-test.mjs +138 -0
- package/scripts/topo-edge-badge-hot-test.mjs +115 -0
- package/scripts/topo-edge-badge-hover-test.mjs +85 -0
- package/scripts/topo-edge-badge-lift-test.mjs +150 -0
- package/scripts/topo-edge-badge-ripple-test.mjs +111 -0
- package/scripts/topo-edge-badge-stroke-transition-test.mjs +118 -0
- package/scripts/topo-edge-badge-text-pin-test.mjs +121 -0
- package/scripts/topo-edge-badge-theme-ease-test.mjs +89 -0
- package/scripts/topo-edge-count-badge-test.mjs +86 -0
- package/scripts/topo-edge-endpoint-highlight-test.mjs +111 -0
- package/scripts/topo-edge-fadein-test.mjs +106 -0
- package/scripts/topo-edge-focus-test.mjs +113 -0
- package/scripts/topo-edge-hover-test.mjs +13 -5
- package/scripts/topo-edge-pill-hot-test.mjs +129 -0
- package/scripts/topo-edge-pill-test.mjs +105 -0
- package/scripts/topo-edge-ping-pulse-retired-test.mjs +119 -0
- package/scripts/topo-edge-stroke-ease-test.mjs +100 -0
- package/scripts/topo-edge-stroke-transition-test.mjs +132 -0
- package/scripts/topo-empty-hint-tracking-test.mjs +84 -0
- package/scripts/topo-empty-state-breath-test.mjs +150 -0
- package/scripts/topo-empty-state-crossfade-test.mjs +130 -0
- package/scripts/topo-empty-state-recenter-test.mjs +107 -0
- package/scripts/topo-empty-subhint-tracking-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-fade-test.mjs +132 -0
- package/scripts/topo-endpoint-ring-test.mjs +93 -0
- package/scripts/topo-endpoint-ring-thicken-test.mjs +112 -0
- package/scripts/topo-esc-clears-pin-test.mjs +98 -0
- package/scripts/topo-filter-pill-aliases-test.mjs +121 -0
- package/scripts/topo-filter-pill-body-click-test.mjs +112 -0
- package/scripts/topo-filter-pill-count-tabular-test.mjs +135 -0
- package/scripts/topo-filter-pill-count-test.mjs +110 -0
- package/scripts/topo-filter-pill-mobile-test.mjs +90 -0
- package/scripts/topo-freshness-chip-transition-test.mjs +80 -0
- package/scripts/topo-freshness-chip-weight-test.mjs +90 -0
- package/scripts/topo-freshness-conditional-render-test.mjs +92 -0
- package/scripts/topo-fullscreen-active-test.mjs +115 -0
- package/scripts/topo-group-box-pinned-state-test.mjs +95 -0
- package/scripts/topo-group-count-test.mjs +6 -1
- package/scripts/topo-group-label-a11y-test.mjs +113 -0
- package/scripts/topo-group-label-count-inherit-test.mjs +99 -0
- package/scripts/topo-group-label-hover-test.mjs +119 -0
- package/scripts/topo-group-label-pin-spacing-test.mjs +136 -0
- package/scripts/topo-group-label-tint-test.mjs +99 -0
- package/scripts/topo-group-label-title-test.mjs +83 -0
- package/scripts/topo-group-pin-test.mjs +119 -0
- package/scripts/topo-group-pip-fadein-test.mjs +104 -0
- package/scripts/topo-group-pip-singletier-drop-test.mjs +131 -0
- package/scripts/topo-group-pip-tabular-test.mjs +95 -0
- package/scripts/topo-group-status-pips-test.mjs +103 -0
- package/scripts/topo-groupbox-fadein-test.mjs +95 -0
- package/scripts/topo-groupbox-hover-lift-test.mjs +127 -0
- package/scripts/topo-groupbox-hubcore-ease-test.mjs +106 -0
- package/scripts/topo-groupbox-live-test.mjs +100 -0
- package/scripts/topo-groupbox-march-busyness-test.mjs +155 -0
- package/scripts/topo-groupbox-test.mjs +4 -2
- package/scripts/topo-header-gap-test.mjs +94 -0
- package/scripts/topo-help-overlay-r109-test.mjs +67 -0
- package/scripts/topo-help-overlay-r118-test.mjs +69 -0
- package/scripts/topo-help-overlay-r123-test.mjs +69 -0
- package/scripts/topo-help-overlay-r134-test.mjs +74 -0
- package/scripts/topo-help-overlay-r137-test.mjs +81 -0
- package/scripts/topo-help-overlay-r141-test.mjs +86 -0
- package/scripts/topo-help-overlay-r153-test.mjs +85 -0
- package/scripts/topo-help-overlay-r59-test.mjs +67 -0
- package/scripts/topo-help-overlay-r65-test.mjs +64 -0
- package/scripts/topo-help-overlay-r70-test.mjs +63 -0
- package/scripts/topo-help-overlay-r78-test.mjs +59 -0
- package/scripts/topo-help-overlay-r81-test.mjs +58 -0
- package/scripts/topo-help-overlay-r87-test.mjs +64 -0
- package/scripts/topo-help-overlay-r91-test.mjs +65 -0
- package/scripts/topo-hot-tail-crossfade-test.mjs +117 -0
- package/scripts/topo-html-overlay-padding-unify-test.mjs +120 -0
- package/scripts/topo-hub-a11y-test.mjs +112 -0
- package/scripts/topo-hub-busyness-test.mjs +100 -0
- package/scripts/topo-hub-center-crossfade-test.mjs +124 -0
- package/scripts/topo-hub-click-fit-test.mjs +137 -0
- package/scripts/topo-hub-digit-scale-test.mjs +129 -0
- package/scripts/topo-hub-fadein-test.mjs +88 -0
- package/scripts/topo-hub-hover-lift-test.mjs +101 -0
- package/scripts/topo-hub-hover-ring-test.mjs +82 -0
- package/scripts/topo-hub-pip-theme-ease-test.mjs +116 -0
- package/scripts/topo-hub-spoke-ease-test.mjs +120 -0
- package/scripts/topo-hub-title-test.mjs +7 -2
- package/scripts/topo-hub-working-count-test.mjs +99 -0
- package/scripts/topo-ingroup-edge-test.mjs +103 -0
- package/scripts/topo-inner-radar-ring-retired-test.mjs +89 -0
- package/scripts/topo-kicker-color-test.mjs +93 -0
- package/scripts/topo-kicker-tracking-test.mjs +101 -0
- package/scripts/topo-kicker-weight-test.mjs +98 -0
- package/scripts/topo-label-card-theme-ease-test.mjs +85 -0
- package/scripts/topo-label-lift-test.mjs +5 -1
- package/scripts/topo-layout-hover-text-preview-test.mjs +101 -0
- package/scripts/topo-layout-switch-crossfade-test.mjs +126 -0
- package/scripts/topo-layout-toggle-border-unify-test.mjs +104 -0
- package/scripts/topo-layout-toggle-test.mjs +131 -0
- package/scripts/topo-layout-trailer-mr-test.mjs +82 -0
- package/scripts/topo-legend-compress-test.mjs +107 -0
- package/scripts/topo-legend-count-empty-test.mjs +126 -0
- package/scripts/topo-legend-count-tabular-parity-test.mjs +90 -0
- package/scripts/topo-legend-count-tabular-test.mjs +87 -0
- package/scripts/topo-legend-count-test.mjs +88 -0
- package/scripts/topo-legend-count-tier-fill-test.mjs +121 -0
- package/scripts/topo-legend-count-weight-test.mjs +86 -0
- package/scripts/topo-legend-header-symmetric-inset-test.mjs +112 -0
- package/scripts/topo-legend-hitbox-swatch-center-test.mjs +93 -0
- package/scripts/topo-legend-hover-test.mjs +113 -0
- package/scripts/topo-legend-offline-delimiter-test.mjs +84 -0
- package/scripts/topo-legend-offline-label-simplify-test.mjs +86 -0
- package/scripts/topo-legend-panel-count-weight-test.mjs +89 -0
- package/scripts/topo-legend-panel-header-test.mjs +83 -0
- package/scripts/topo-legend-pin-ring-fade-test.mjs +112 -0
- package/scripts/topo-legend-pin-test.mjs +128 -0
- package/scripts/topo-legend-row-hover-lift-test.mjs +109 -0
- package/scripts/topo-legend-row-labels-simplify-test.mjs +80 -0
- package/scripts/topo-legend-row-pin-spacing-test.mjs +124 -0
- package/scripts/topo-legend-row-tint-test.mjs +95 -0
- package/scripts/topo-legend-row-title-test.mjs +102 -0
- package/scripts/topo-legend-swatch-grow-test.mjs +116 -0
- package/scripts/topo-legend-swatch-radius-test.mjs +78 -0
- package/scripts/topo-minimap-a11y-test.mjs +101 -0
- package/scripts/topo-minimap-dot-transition-test.mjs +113 -0
- package/scripts/topo-minimap-radius-test.mjs +88 -0
- package/scripts/topo-minimap-rect-stroke-test.mjs +94 -0
- package/scripts/topo-minimap-viewport-smooth-test.mjs +124 -0
- package/scripts/topo-monogram-font-test.mjs +112 -0
- package/scripts/topo-monogram-stroke-test.mjs +101 -0
- package/scripts/topo-more-flows-letterspacing-test.mjs +111 -0
- package/scripts/topo-node-a11y-test.mjs +107 -0
- package/scripts/topo-node-alias-chat-pin-test.mjs +95 -0
- package/scripts/topo-node-hover-lift-test.mjs +85 -0
- package/scripts/topo-node-label-card-elevation-test.mjs +157 -0
- package/scripts/topo-node-label-card-stroke-test.mjs +135 -0
- package/scripts/topo-node-stroke-transition-test.mjs +103 -0
- package/scripts/topo-node-text-fill-transition-test.mjs +119 -0
- package/scripts/topo-node-title-peers-test.mjs +107 -0
- package/scripts/topo-node-title-test.mjs +101 -0
- package/scripts/topo-nodesize-active-hover-test.mjs +109 -0
- package/scripts/topo-nodesize-crossfade-test.mjs +141 -0
- package/scripts/topo-online-chip-nav-test.mjs +143 -0
- package/scripts/topo-orbit-particles-retired-test.mjs +91 -0
- package/scripts/topo-panel-count-unit-test.mjs +112 -0
- package/scripts/topo-panel-elevation-test.mjs +76 -0
- package/scripts/topo-panel-fadein-test.mjs +102 -0
- package/scripts/topo-panel-hot-tail-fade-test.mjs +132 -0
- package/scripts/topo-panel-hover-elevation-test.mjs +118 -0
- package/scripts/topo-panel-rx-test.mjs +90 -0
- package/scripts/topo-panel-theme-ease-test.mjs +85 -0
- package/scripts/topo-panel-title-fill-ease-test.mjs +91 -0
- package/scripts/topo-panel-title-tracking-test.mjs +78 -0
- package/scripts/topo-particle-stagger-test.mjs +82 -0
- package/scripts/topo-pin-intersection-color-ease-test.mjs +111 -0
- package/scripts/topo-pin-intersection-empty-test.mjs +129 -0
- package/scripts/topo-pin-intersection-tabular-test.mjs +96 -0
- package/scripts/topo-pin-intersection-test.mjs +121 -0
- package/scripts/topo-pin-intersection-warning-crossfade-test.mjs +107 -0
- package/scripts/topo-pin-mirror-transition-test.mjs +101 -0
- package/scripts/topo-pin-persistence-test.mjs +105 -0
- package/scripts/topo-prefix-opacity-test.mjs +107 -0
- package/scripts/topo-prepublish-guard-test.mjs +95 -0
- package/scripts/topo-pressure-hover-test.mjs +123 -0
- package/scripts/topo-pressure-pin-test.mjs +119 -0
- package/scripts/topo-pressure-seg-self-hover-test.mjs +126 -0
- package/scripts/topo-pressure-seg-tooltip-test.mjs +98 -0
- package/scripts/topo-pressure-seg-transition-test.mjs +107 -0
- package/scripts/topo-pulse-dot-crossfade-test.mjs +122 -0
- package/scripts/topo-pulse-dot-retired-test.mjs +86 -0
- package/scripts/topo-recent-panel-count-freshness-test.mjs +109 -0
- package/scripts/topo-recent-panel-count-test.mjs +72 -0
- package/scripts/topo-recent-panel-count-weight-test.mjs +91 -0
- package/scripts/topo-recent-panel-footer-breath-test.mjs +142 -0
- package/scripts/topo-recent-panel-hot-header-test.mjs +132 -0
- package/scripts/topo-recent-panel-hot-tabular-test.mjs +113 -0
- package/scripts/topo-recent-panel-more-crossfade-test.mjs +124 -0
- package/scripts/topo-recent-panel-more-cyan-hover-test.mjs +151 -0
- package/scripts/topo-recent-panel-more-nav-test.mjs +127 -0
- package/scripts/topo-recent-panel-more-test.mjs +106 -0
- package/scripts/topo-recent-panel-readability-bump-test.mjs +151 -0
- package/scripts/topo-recent-row-count-fill-test.mjs +129 -0
- package/scripts/topo-recent-row-count-weight-test.mjs +112 -0
- package/scripts/topo-recent-row-fadein-test.mjs +107 -0
- package/scripts/topo-recent-row-freshness-test.mjs +102 -0
- package/scripts/topo-recent-row-hot-test.mjs +110 -0
- package/scripts/topo-recent-row-hover-lift-test.mjs +128 -0
- package/scripts/topo-recent-row-hover-test.mjs +122 -0
- package/scripts/topo-recent-row-pin-spacing-test.mjs +137 -0
- package/scripts/topo-recent-row-pin-test.mjs +126 -0
- package/scripts/topo-recent-row-tint-test.mjs +91 -0
- package/scripts/topo-recent-row-title-test.mjs +112 -0
- package/scripts/topo-recent-row-ts-alpha-test.mjs +100 -0
- package/scripts/topo-recent-row-ts-tabular-test.mjs +108 -0
- package/scripts/topo-recent-row-ts-test.mjs +95 -0
- package/scripts/topo-recent-row-typography-test.mjs +119 -0
- package/scripts/topo-recent-signal-empty-hint-test.mjs +73 -0
- package/scripts/topo-reset-spin-test.mjs +120 -0
- package/scripts/topo-runtime-badge-grow-test.mjs +114 -0
- package/scripts/topo-spokes-retired-test.mjs +93 -0
- package/scripts/topo-starfield-density-test.mjs +89 -0
- package/scripts/topo-status-chip-hover-test.mjs +101 -0
- package/scripts/topo-status-chip-tooltip-test.mjs +95 -0
- package/scripts/topo-statusbar-chips-self-hover-test.mjs +177 -0
- package/scripts/topo-svg-focus-test.mjs +112 -0
- package/scripts/topo-sweep-busyness-test.mjs +94 -0
- package/scripts/topo-tabular-nums-sweep-test.mjs +93 -0
- package/scripts/topo-tier-guide-dashes-test.mjs +86 -0
- package/scripts/topo-tier-ring-fadein-test.mjs +107 -0
- package/scripts/topo-tier-ring-occupancy-test.mjs +87 -0
- package/scripts/topo-tier-ring-test.mjs +69 -0
- package/scripts/topo-tier-ring-tint-test.mjs +110 -0
- package/scripts/topo-tier-stagger-test.mjs +89 -0
- package/scripts/topo-title-block-tight-leading-test.mjs +95 -0
- package/scripts/topo-title-tracking-test.mjs +98 -0
- package/scripts/topo-titleblock-gap-test.mjs +86 -0
- package/scripts/topo-titleblock-margin-test.mjs +83 -0
- package/scripts/topo-toggle-inactive-cyan-hover-test.mjs +110 -0
- package/scripts/topo-top-rail-theme-ease-test.mjs +89 -0
- package/scripts/topo-vendor-chip-hover-test.mjs +111 -0
- package/scripts/topo-vendor-chip-self-hover-test.mjs +131 -0
- package/scripts/topo-vendor-chip-tabular-test.mjs +92 -0
- package/scripts/topo-vendor-chip-threshold-test.mjs +78 -0
- package/scripts/topo-vendor-chip-weight-test.mjs +87 -0
- package/scripts/topo-vendor-count-suffix-test.mjs +95 -0
- package/scripts/topo-vendor-letter-tooltip-test.mjs +92 -0
- package/scripts/topo-vendor-pill-test.mjs +125 -0
- package/scripts/topo-vendor-pin-test.mjs +125 -0
- package/scripts/topo-view-smooth-test.mjs +131 -0
- package/scripts/topo-watermark-tracking-test.mjs +99 -0
- package/scripts/topo-working-chip-pin-test.mjs +154 -0
- package/scripts/topo-working-halo-breath-retired-test.mjs +99 -0
- package/scripts/topo-wrapper-flow-arrow-theme-test.mjs +97 -0
- package/scripts/topo-wrapper-radius-test.mjs +73 -0
- package/scripts/topo-wrapper-shadow-theme-ease-test.mjs +89 -0
- package/.next/static/chunks/088ouqy7tekty.js +0 -2
- package/.next/static/chunks/0hyl7mdapsz38.js +0 -1
- package/.next/static/chunks/0mqwn-l7wtcdo.js +0 -7
- package/.next/static/chunks/127kw7~wsnyu7.css +0 -2
- package/.next/static/chunks/16yfxp9ak2gdm.js +0 -1
- /package/.next/static/{23MxP0RBVA4BaOJ_HMYmM → 424zX3i80AJ_wHF_otKuP}/_buildManifest.js +0 -0
- /package/.next/static/{23MxP0RBVA4BaOJ_HMYmM → 424zX3i80AJ_wHF_otKuP}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{23MxP0RBVA4BaOJ_HMYmM → 424zX3i80AJ_wHF_otKuP}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* Round 137 verification: HelpOverlay catches up on R136 — the
|
|
2
|
+
* "N active links" chip in the chip row got a real onClick →
|
|
3
|
+
* /messages navigation (R136 fixed the cursor-pointer-lying bug:
|
|
4
|
+
* cursor:pointer existed since R77, but no click handler).
|
|
5
|
+
*
|
|
6
|
+
* Pairs with R134's footer-nav entry at a different surface:
|
|
7
|
+
* R133 footer-nav: canvas-side panel, only when flowLinks > 3
|
|
8
|
+
* R136 chip-nav: chip row, whenever flowLinks > 0 (broader)
|
|
9
|
+
*
|
|
10
|
+
* Stacks 13 docs generations now: R137 → R134 → R123 → R118 →
|
|
11
|
+
* R109 → R91 → R87 → R81 → R78 → R74 → R70 → R65 → R59. Any
|
|
12
|
+
* regression that drops an entry is caught by one of these.
|
|
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 browser = await chromium.launch({ headless: true });
|
|
19
|
+
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
24
|
+
});
|
|
25
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
26
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
27
|
+
const page = await ctx.newPage();
|
|
28
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
29
|
+
await page.waitForTimeout(800);
|
|
30
|
+
|
|
31
|
+
await page.keyboard.press('?');
|
|
32
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
33
|
+
|
|
34
|
+
const items = await page.evaluate(() => {
|
|
35
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
36
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
37
|
+
let active = null;
|
|
38
|
+
for (const g of groups) {
|
|
39
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
40
|
+
active = g.parentElement;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
await browser.close();
|
|
48
|
+
|
|
49
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
50
|
+
const results = {
|
|
51
|
+
r137_clickChip: has('See all flows — click the "N active links" chip in the chip row (R136)'),
|
|
52
|
+
// R134 prior
|
|
53
|
+
r134_clickFooter: has('See all flows — click "+ N more flows" in the recent-signal panel (R133)'),
|
|
54
|
+
// R123 prior
|
|
55
|
+
r123_clickBadge: has('Pin a flow filter from the canvas — click an edge midpoint count badge (R121)'),
|
|
56
|
+
// R118 priors
|
|
57
|
+
r118_rowClickPin: has('Pin a flow filter — click a recent-signal row to lock the edge (R116)'),
|
|
58
|
+
r118_cmdkClearEdge: has('Clear edge pin only via palette → "Clear topology edge pin" (R117)'),
|
|
59
|
+
// R109 prior
|
|
60
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
61
|
+
// R91 prior
|
|
62
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
63
|
+
// R87 prior
|
|
64
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
65
|
+
// R81 prior
|
|
66
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
67
|
+
// R78 prior
|
|
68
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
69
|
+
// R74 prior
|
|
70
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
71
|
+
// R70 prior
|
|
72
|
+
r70_cmdkPin: has('(R69)'),
|
|
73
|
+
// R65 prior
|
|
74
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
75
|
+
// R59 prior
|
|
76
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
77
|
+
};
|
|
78
|
+
const ok = Object.values(results).every(Boolean);
|
|
79
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R137:`, JSON.stringify(results),
|
|
80
|
+
`\n items=`, items);
|
|
81
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* Round 141 verification: HelpOverlay catches up on R139 + R140 —
|
|
2
|
+
* two new chip-row gestures landed since R137's last docs update.
|
|
3
|
+
*
|
|
4
|
+
* R139: click "N working" chip → pin pinnedStatus='working'
|
|
5
|
+
* (composes with R60 pressure-bar + R61 legend)
|
|
6
|
+
* R140: click "N online" chip → /nodes
|
|
7
|
+
* (pin 'idle' would misrepresent the chip semantically)
|
|
8
|
+
*
|
|
9
|
+
* Two entries added this round — usually one, but two gestures
|
|
10
|
+
* landed in consecutive rounds R139/R140.
|
|
11
|
+
*
|
|
12
|
+
* Stacks 14 docs generations now: R141 (×2) → R137 → R134 → R123
|
|
13
|
+
* → R118 → R109 → R91 → R87 → R81 → R78 → R74 → R70 → R65 → R59.
|
|
14
|
+
*/
|
|
15
|
+
import { chromium } from 'playwright';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
|
|
18
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
|
|
21
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
25
|
+
});
|
|
26
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
27
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
28
|
+
const page = await ctx.newPage();
|
|
29
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
30
|
+
await page.waitForTimeout(800);
|
|
31
|
+
|
|
32
|
+
await page.keyboard.press('?');
|
|
33
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
34
|
+
|
|
35
|
+
const items = await page.evaluate(() => {
|
|
36
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
37
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
38
|
+
let active = null;
|
|
39
|
+
for (const g of groups) {
|
|
40
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
41
|
+
active = g.parentElement;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await browser.close();
|
|
49
|
+
|
|
50
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
51
|
+
const results = {
|
|
52
|
+
// R141 NEW
|
|
53
|
+
r141_workingPin: has('Pin "working" status — click "N working" in the chip row (R139)'),
|
|
54
|
+
r141_onlineNav: has('Open the agent list — click "N online" in the chip row (R140)'),
|
|
55
|
+
// R137 prior
|
|
56
|
+
r137_clickChip: has('See all flows — click the "N active links" chip in the chip row (R136)'),
|
|
57
|
+
// R134 prior
|
|
58
|
+
r134_clickFooter: has('See all flows — click "+ N more flows" in the recent-signal panel (R133)'),
|
|
59
|
+
// R123 prior
|
|
60
|
+
r123_clickBadge: has('Pin a flow filter from the canvas — click an edge midpoint count badge (R121)'),
|
|
61
|
+
// R118 priors
|
|
62
|
+
r118_rowClickPin: has('Pin a flow filter — click a recent-signal row to lock the edge (R116)'),
|
|
63
|
+
r118_cmdkClearEdge: has('Clear edge pin only via palette → "Clear topology edge pin" (R117)'),
|
|
64
|
+
// R109 prior
|
|
65
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
66
|
+
// R91 prior
|
|
67
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
68
|
+
// R87 prior
|
|
69
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
70
|
+
// R81 prior
|
|
71
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
72
|
+
// R78 prior
|
|
73
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
74
|
+
// R74 prior
|
|
75
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
76
|
+
// R70 prior
|
|
77
|
+
r70_cmdkPin: has('(R69)'),
|
|
78
|
+
// R65 prior
|
|
79
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
80
|
+
// R59 prior
|
|
81
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
82
|
+
};
|
|
83
|
+
const ok = Object.values(results).every(Boolean);
|
|
84
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R141:`, JSON.stringify(results),
|
|
85
|
+
`\n items=`, items);
|
|
86
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 153 verification: HelpOverlay catches up on R151 — keyboard
|
|
2
|
+
* chat-open on a focused node. First true new gesture since R141's
|
|
3
|
+
* R139/R140 chip catch-up (R142 / R143 / R144 / R145 / R146 / R147 /
|
|
4
|
+
* R148 / R149 / R150 were visual / motion / hover-tooltip refinements
|
|
5
|
+
* with no new user gestures; R152 added an onKeyDown to the group
|
|
6
|
+
* label but that's just the keyboard parallel of the existing R63
|
|
7
|
+
* click-group entry, so it doesn't earn its own line).
|
|
8
|
+
*
|
|
9
|
+
* Stacks 15 docs generations now: R153 → R141 (×2) → R137 → R134 →
|
|
10
|
+
* R123 → R118 → R109 → R91 → R87 → R81 → R78 → R74 → R70 → R65 → R59.
|
|
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 browser = await chromium.launch({ headless: true });
|
|
17
|
+
|
|
18
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
19
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
20
|
+
await ctx.addInitScript(() => {
|
|
21
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
22
|
+
});
|
|
23
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
24
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
25
|
+
const page = await ctx.newPage();
|
|
26
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
27
|
+
await page.waitForTimeout(800);
|
|
28
|
+
|
|
29
|
+
await page.keyboard.press('?');
|
|
30
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
31
|
+
|
|
32
|
+
const items = await page.evaluate(() => {
|
|
33
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
34
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
35
|
+
let active = null;
|
|
36
|
+
for (const g of groups) {
|
|
37
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
38
|
+
active = g.parentElement;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
await browser.close();
|
|
46
|
+
|
|
47
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
48
|
+
const results = {
|
|
49
|
+
// R153 NEW — keyboard chat-open
|
|
50
|
+
r153_tabEnter: has('Open chat on a focused node (also Space) — keyboard parallel of click-to-chat (R151)'),
|
|
51
|
+
// R141 priors (2 entries)
|
|
52
|
+
r141_workingPin: has('Pin "working" status — click "N working" in the chip row (R139)'),
|
|
53
|
+
r141_onlineNav: has('Open the agent list — click "N online" in the chip row (R140)'),
|
|
54
|
+
// R137 prior
|
|
55
|
+
r137_clickChip: has('See all flows — click the "N active links" chip in the chip row (R136)'),
|
|
56
|
+
// R134 prior
|
|
57
|
+
r134_clickFooter: has('See all flows — click "+ N more flows" in the recent-signal panel (R133)'),
|
|
58
|
+
// R123 prior
|
|
59
|
+
r123_clickBadge: has('Pin a flow filter from the canvas — click an edge midpoint count badge (R121)'),
|
|
60
|
+
// R118 priors
|
|
61
|
+
r118_rowClickPin: has('Pin a flow filter — click a recent-signal row to lock the edge (R116)'),
|
|
62
|
+
r118_cmdkClearEdge: has('Clear edge pin only via palette → "Clear topology edge pin" (R117)'),
|
|
63
|
+
// R109 prior
|
|
64
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
65
|
+
// R91 prior
|
|
66
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
67
|
+
// R87 prior
|
|
68
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
69
|
+
// R81 prior
|
|
70
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
71
|
+
// R78 prior
|
|
72
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
73
|
+
// R74 prior
|
|
74
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
75
|
+
// R70 prior
|
|
76
|
+
r70_cmdkPin: has('(R69)'),
|
|
77
|
+
// R65 prior
|
|
78
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
79
|
+
// R59 prior
|
|
80
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
81
|
+
};
|
|
82
|
+
const ok = Object.values(results).every(Boolean);
|
|
83
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R153:`, JSON.stringify(results),
|
|
84
|
+
`\n items=`, items);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* Round 59 verification: HelpOverlay topology section documents the new
|
|
2
|
+
* R52 (hub click → fit) / R55 (legend hover) / R56 (recent-signal hover)
|
|
3
|
+
* interactions. R41 dbl-click clarification is also expected.
|
|
4
|
+
*
|
|
5
|
+
* Press "?" on the overview page → assert each of the three new entries
|
|
6
|
+
* shows up under the "Topology canvas" group heading.
|
|
7
|
+
*/
|
|
8
|
+
import { chromium } from 'playwright';
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
|
|
11
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
12
|
+
const browser = await chromium.launch({ headless: true });
|
|
13
|
+
|
|
14
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
15
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
16
|
+
await ctx.addInitScript(() => {
|
|
17
|
+
try {
|
|
18
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
19
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
20
|
+
} catch {}
|
|
21
|
+
});
|
|
22
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
23
|
+
const r = await route.fetch();
|
|
24
|
+
const b = await r.json();
|
|
25
|
+
await route.fulfill({ response: r, json: b });
|
|
26
|
+
});
|
|
27
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
28
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
29
|
+
const page = await ctx.newPage();
|
|
30
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
31
|
+
await page.waitForTimeout(800);
|
|
32
|
+
|
|
33
|
+
// Open help overlay via `?` (Shift + /).
|
|
34
|
+
await page.keyboard.press('?');
|
|
35
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
36
|
+
|
|
37
|
+
const topology = await page.evaluate(() => {
|
|
38
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
39
|
+
if (!dialog) return null;
|
|
40
|
+
// Walk the group divs — each starts with the group title text. Pick the
|
|
41
|
+
// one that says "Topology canvas" and capture its `<li>` items.
|
|
42
|
+
const groups = [...dialog.querySelectorAll('div')];
|
|
43
|
+
let active = null;
|
|
44
|
+
for (const g of groups) {
|
|
45
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
46
|
+
active = g.parentElement;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (!active) return null;
|
|
51
|
+
return [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim());
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await browser.close();
|
|
55
|
+
if (!topology) { console.log('❌ topology group not found in help overlay'); process.exit(1); }
|
|
56
|
+
|
|
57
|
+
const has = (s) => topology.some(t => t.includes(s));
|
|
58
|
+
const results = {
|
|
59
|
+
hasHubClickEntry: has('Fit topology to canvas (R52)'),
|
|
60
|
+
hasLegendHoverEntry: has('Highlight nodes of a status (R55)'),
|
|
61
|
+
hasSignalHoverEntry: has('Highlight one flow edge (R56)'),
|
|
62
|
+
hasDblClickClarified: has('(empty canvas only)'),
|
|
63
|
+
};
|
|
64
|
+
const ok = Object.values(results).every(Boolean);
|
|
65
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R59:`, JSON.stringify(results),
|
|
66
|
+
`\n topology items=`, topology);
|
|
67
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* Round 65 verification: HelpOverlay topology section catches up on
|
|
2
|
+
* R63 (group label pin) + R64 (active-filter pill ×).
|
|
3
|
+
*
|
|
4
|
+
* Press "?" → assert both new entries render under "Topology canvas".
|
|
5
|
+
* Also verify the R59/R62 prior entries still exist (no regression
|
|
6
|
+
* in the section).
|
|
7
|
+
*/
|
|
8
|
+
import { chromium } from 'playwright';
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
|
|
11
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
12
|
+
const browser = await chromium.launch({ headless: true });
|
|
13
|
+
|
|
14
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
15
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
16
|
+
await ctx.addInitScript(() => {
|
|
17
|
+
try {
|
|
18
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
19
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
20
|
+
} catch {}
|
|
21
|
+
});
|
|
22
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
23
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
24
|
+
const page = await ctx.newPage();
|
|
25
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
26
|
+
await page.waitForTimeout(800);
|
|
27
|
+
|
|
28
|
+
// Open help overlay via `?`.
|
|
29
|
+
await page.keyboard.press('?');
|
|
30
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
31
|
+
|
|
32
|
+
const items = await page.evaluate(() => {
|
|
33
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
34
|
+
if (!dialog) return [];
|
|
35
|
+
const groups = [...dialog.querySelectorAll('div')];
|
|
36
|
+
let active = null;
|
|
37
|
+
for (const g of groups) {
|
|
38
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
39
|
+
active = g.parentElement;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!active) return [];
|
|
44
|
+
return [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim());
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
await browser.close();
|
|
48
|
+
if (items.length === 0) { console.log('❌ topology section not found'); process.exit(1); }
|
|
49
|
+
|
|
50
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
51
|
+
const results = {
|
|
52
|
+
r63_groupPin: has('Pin a team focus (R63)'),
|
|
53
|
+
r64_clearOne: has('Clear one filter (R64) — Esc clears all'),
|
|
54
|
+
// R59 priors still present (no regression in section)
|
|
55
|
+
r52_clickHub: has('Fit topology to canvas (R52)'),
|
|
56
|
+
r55_legendHover: has('Highlight nodes of a status (R55)'),
|
|
57
|
+
r56_signalHover: has('Highlight one flow edge (R56)'),
|
|
58
|
+
r60_pinChip: has('Pin a status filter (R60/R61)'),
|
|
59
|
+
r62_esc: has('Clear pinned filter (R62)'),
|
|
60
|
+
};
|
|
61
|
+
const ok = Object.values(results).every(Boolean);
|
|
62
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R65:`, JSON.stringify(results),
|
|
63
|
+
`\n items=`, items);
|
|
64
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/* Round 70 verification: HelpOverlay topology section surfaces the R69
|
|
2
|
+
* Cmd+K palette pin actions. The 1 new entry sits alongside R65's R63
|
|
3
|
+
* + R64 entries; this test re-verifies the full chain so a future edit
|
|
4
|
+
* accidentally dropping any rung gets caught here.
|
|
5
|
+
*/
|
|
6
|
+
import { chromium } from 'playwright';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
|
|
9
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
10
|
+
const browser = await chromium.launch({ headless: true });
|
|
11
|
+
|
|
12
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
13
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
14
|
+
await ctx.addInitScript(() => {
|
|
15
|
+
try {
|
|
16
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
17
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
18
|
+
} catch {}
|
|
19
|
+
});
|
|
20
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
21
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
22
|
+
const page = await ctx.newPage();
|
|
23
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
24
|
+
await page.waitForTimeout(800);
|
|
25
|
+
|
|
26
|
+
await page.keyboard.press('?');
|
|
27
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
28
|
+
|
|
29
|
+
const items = await page.evaluate(() => {
|
|
30
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
31
|
+
if (!dialog) return [];
|
|
32
|
+
const groups = [...dialog.querySelectorAll('div')];
|
|
33
|
+
let active = null;
|
|
34
|
+
for (const g of groups) {
|
|
35
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
36
|
+
active = g.parentElement;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
await browser.close();
|
|
44
|
+
if (items.length === 0) { console.log('❌ topology section not found'); process.exit(1); }
|
|
45
|
+
|
|
46
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
47
|
+
const results = {
|
|
48
|
+
r70_cmdkPin: has('Pin / clear filters via palette') && has('(R69)'),
|
|
49
|
+
// R65 priors
|
|
50
|
+
r63_groupPin: has('Pin a team focus (R63)'),
|
|
51
|
+
r64_clearOne: has('Clear one filter (R64)'),
|
|
52
|
+
// R62 priors
|
|
53
|
+
r60_pinChip: has('Pin a status filter (R60/R61)'),
|
|
54
|
+
r62_esc: has('Clear pinned filter (R62)'),
|
|
55
|
+
// R59 priors
|
|
56
|
+
r52_clickHub: has('Fit topology to canvas (R52)'),
|
|
57
|
+
r55_legendHover: has('Highlight nodes of a status (R55)'),
|
|
58
|
+
r56_signalHover: has('Highlight one flow edge (R56)'),
|
|
59
|
+
};
|
|
60
|
+
const ok = Object.values(results).every(Boolean);
|
|
61
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R70:`, JSON.stringify(results),
|
|
62
|
+
`\n items=`, items);
|
|
63
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/* Round 78 verification: HelpOverlay surfaces the R73 (click pill body
|
|
2
|
+
* to clear) + R77 (hover N active links to brighten all flows) gestures.
|
|
3
|
+
* Both shipped as real user gestures but weren't in the discoverability
|
|
4
|
+
* surface.
|
|
5
|
+
*/
|
|
6
|
+
import { chromium } from 'playwright';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
|
|
9
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
10
|
+
const browser = await chromium.launch({ headless: true });
|
|
11
|
+
|
|
12
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
13
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
14
|
+
await ctx.addInitScript(() => {
|
|
15
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
16
|
+
});
|
|
17
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
18
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
19
|
+
const page = await ctx.newPage();
|
|
20
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
21
|
+
await page.waitForTimeout(800);
|
|
22
|
+
|
|
23
|
+
await page.keyboard.press('?');
|
|
24
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
25
|
+
|
|
26
|
+
const items = await page.evaluate(() => {
|
|
27
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
28
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
29
|
+
let active = null;
|
|
30
|
+
for (const g of groups) {
|
|
31
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
32
|
+
active = g.parentElement;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await browser.close();
|
|
40
|
+
|
|
41
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
42
|
+
const results = {
|
|
43
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
44
|
+
r78_chipHover: has('Brighten all active flows — hover'),
|
|
45
|
+
// R74 and R70 priors should still appear (no regression)
|
|
46
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
47
|
+
r70_cmdkPin: has('(R69)'),
|
|
48
|
+
// R65 priors
|
|
49
|
+
r63_groupPin: has('Pin a team focus (R63)'),
|
|
50
|
+
r64_clearOne: has('Clear one filter (R64)'),
|
|
51
|
+
// R59 priors
|
|
52
|
+
r52_clickHub: has('Fit topology to canvas (R52)'),
|
|
53
|
+
r55_legendHover: has('Highlight nodes of a status (R55)'),
|
|
54
|
+
r56_signalHover: has('Highlight one flow edge (R56)'),
|
|
55
|
+
};
|
|
56
|
+
const ok = Object.values(results).every(Boolean);
|
|
57
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R78:`, JSON.stringify(results),
|
|
58
|
+
`\n items=`, items);
|
|
59
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* Round 81 verification: HelpOverlay surfaces R79 (status chip hover) +
|
|
2
|
+
* R80 (vendor chip letter hover). Both gestures landed without entries
|
|
3
|
+
* in the discoverability surface. Continues the R59/R62/R65/R70/R78
|
|
4
|
+
* docs-catch-up cadence.
|
|
5
|
+
*/
|
|
6
|
+
import { chromium } from 'playwright';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
|
|
9
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
10
|
+
const browser = await chromium.launch({ headless: true });
|
|
11
|
+
|
|
12
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
13
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
14
|
+
await ctx.addInitScript(() => {
|
|
15
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
16
|
+
});
|
|
17
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
18
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
19
|
+
const page = await ctx.newPage();
|
|
20
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
21
|
+
await page.waitForTimeout(800);
|
|
22
|
+
|
|
23
|
+
await page.keyboard.press('?');
|
|
24
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
25
|
+
|
|
26
|
+
const items = await page.evaluate(() => {
|
|
27
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
28
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
29
|
+
let active = null;
|
|
30
|
+
for (const g of groups) {
|
|
31
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
32
|
+
active = g.parentElement;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await browser.close();
|
|
40
|
+
|
|
41
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
42
|
+
const results = {
|
|
43
|
+
r81_workingChip: has('Highlight working nodes — chip-row sibling of legend (R79)'),
|
|
44
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
45
|
+
// R78 priors
|
|
46
|
+
r73_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
47
|
+
r77_activeLinks: has('Brighten all active flows — hover'),
|
|
48
|
+
// R74 / R70 / R65 / R59 priors
|
|
49
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
50
|
+
r70_cmdkPin: has('(R69)'),
|
|
51
|
+
r63_groupPin: has('Pin a team focus (R63)'),
|
|
52
|
+
r60_pinChip: has('Pin a status filter (R60/R61)'),
|
|
53
|
+
r52_clickHub: has('Fit topology to canvas (R52)'),
|
|
54
|
+
};
|
|
55
|
+
const ok = Object.values(results).every(Boolean);
|
|
56
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R81:`, JSON.stringify(results),
|
|
57
|
+
`\n items=`, items);
|
|
58
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* Round 87 verification: HelpOverlay catches up on R83 (pressure-bar
|
|
2
|
+
* segment hover preview) + R86 (group-label hover preview). Continues
|
|
3
|
+
* the R59/R62/R65/R70/R78/R81 docs-catch-up cadence (~5 rounds).
|
|
4
|
+
*
|
|
5
|
+
* Stacks five generations of help-overlay assertions — any future
|
|
6
|
+
* regression that drops an entry will be caught by one of:
|
|
7
|
+
* R87 (this) → R81 → R78 → R74 → R70 → R65 → R59
|
|
8
|
+
*/
|
|
9
|
+
import { chromium } from 'playwright';
|
|
10
|
+
import { readFileSync } from 'node:fs';
|
|
11
|
+
|
|
12
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
13
|
+
const browser = await chromium.launch({ headless: true });
|
|
14
|
+
|
|
15
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
16
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
17
|
+
await ctx.addInitScript(() => {
|
|
18
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
19
|
+
});
|
|
20
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
21
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
22
|
+
const page = await ctx.newPage();
|
|
23
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
24
|
+
await page.waitForTimeout(800);
|
|
25
|
+
|
|
26
|
+
await page.keyboard.press('?');
|
|
27
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
28
|
+
|
|
29
|
+
const items = await page.evaluate(() => {
|
|
30
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
31
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
32
|
+
let active = null;
|
|
33
|
+
for (const g of groups) {
|
|
34
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
35
|
+
active = g.parentElement;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
await browser.close();
|
|
43
|
+
|
|
44
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
45
|
+
const results = {
|
|
46
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
47
|
+
r87_groupLabelHover: has('Preview a team focus — hover a group label (R86)'),
|
|
48
|
+
// R81 priors
|
|
49
|
+
r81_workingChip: has('Highlight working nodes — chip-row sibling of legend (R79)'),
|
|
50
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
51
|
+
// R78 priors
|
|
52
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
53
|
+
r78_activeLinks: has('Brighten all active flows — hover'),
|
|
54
|
+
// R74 / R70 / R65 / R59 priors — five generations of docs catch-up
|
|
55
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
56
|
+
r70_cmdkPin: has('(R69)'),
|
|
57
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
58
|
+
r62_pinChip: has('Pin a status filter (R60/R61)'),
|
|
59
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
60
|
+
};
|
|
61
|
+
const ok = Object.values(results).every(Boolean);
|
|
62
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R87:`, JSON.stringify(results),
|
|
63
|
+
`\n items=`, items);
|
|
64
|
+
process.exit(ok ? 0 : 1);
|