@sleep2agi/agent-network-dashboard 0.4.6-preview.31 → 0.4.6-preview.310
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 +41 -41
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-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]__03b.f76._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__03b.f76._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -1
- 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_057q.ne._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.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_0_d45-d._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.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/0-mpa_947ipeq.js +1 -0
- package/.next/static/chunks/01lmbsd37fybu.js +1 -0
- package/.next/static/chunks/03o.h6kvmw4l_.js +1 -0
- package/.next/static/chunks/03~~oirxz7~vc.js +1 -0
- package/.next/static/chunks/05uk96gc~9mni.js +1 -0
- package/.next/static/chunks/08kf-.bgs10ze.js +1 -0
- package/.next/static/chunks/0ggj5ummw2a84.js +7 -0
- package/.next/static/chunks/0glmrdj9112tc.js +7 -0
- package/.next/static/chunks/0o40uf-rn28q6.js +1 -0
- package/.next/static/chunks/0q3hr1~viwzkt.js +4 -0
- package/.next/static/chunks/0rxrez_cjn.eh.js +1 -0
- package/.next/static/chunks/0x8x.29hkju5a.js +1 -0
- package/.next/static/chunks/0~ks9b48lw8hx.css +2 -0
- package/.next/static/chunks/13lvf-h-j8bmc.js +1 -0
- package/.next/static/chunks/174re5ar~kxne.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/ChatPopover.tsx +38 -2
- package/app/components/CommandPalette.tsx +107 -0
- package/app/components/HelpOverlay.tsx +126 -0
- package/app/components/TopoGraph.tsx +5927 -258
- package/app/components/utils.ts +8 -7
- package/app/globals.css +110 -5
- package/app/lib/time.ts +36 -0
- package/app/lib/vendorIdentity.ts +14 -3
- 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/scripts/help-overlay-topo-test.mjs +44 -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-chip-test.mjs +73 -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-auto-fit-test.mjs +73 -0
- package/scripts/topo-brand-watermark-test.mjs +97 -0
- package/scripts/topo-canvas-aria-test.mjs +108 -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-semantic-gap-test.mjs +97 -0
- package/scripts/topo-chip-row-tabular-test.mjs +111 -0
- package/scripts/topo-chrome-a11y-test.mjs +107 -0
- package/scripts/topo-chrome-icon-stroke-test.mjs +95 -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-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-cwd-tooltip-test.mjs +64 -0
- package/scripts/topo-dblclick-reset-test.mjs +74 -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 +93 -0
- 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-edge-tooltip-test.mjs +70 -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-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-test.mjs +110 -0
- package/scripts/topo-filter-pill-mobile-test.mjs +90 -0
- package/scripts/topo-fit-key-test.mjs +106 -0
- package/scripts/topo-freshness-chip-test.mjs +74 -0
- package/scripts/topo-freshness-chip-transition-test.mjs +80 -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 +100 -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-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 +93 -0
- 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-label-card-theme-ease-test.mjs +85 -0
- package/scripts/topo-label-lift-test.mjs +119 -0
- package/scripts/topo-lastseen-tooltip-test.mjs +59 -0
- package/scripts/topo-layout-hover-text-preview-test.mjs +101 -0
- package/scripts/topo-layout-key-test.mjs +91 -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-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-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-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-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-rect-stroke-test.mjs +94 -0
- package/scripts/topo-minimap-test.mjs +68 -0
- package/scripts/topo-minimap-viewport-smooth-test.mjs +124 -0
- package/scripts/topo-mobile-chips-test.mjs +103 -0
- package/scripts/topo-monogram-font-test.mjs +112 -0
- package/scripts/topo-monogram-stroke-test.mjs +101 -0
- package/scripts/topo-node-a11y-test.mjs +107 -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-overlap-test.mjs +32 -5
- 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-theme-ease-test.mjs +85 -0
- package/scripts/topo-panel-title-fill-ease-test.mjs +91 -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-popover-meta-test.mjs +78 -0
- package/scripts/topo-prepublish-guard-test.mjs +95 -0
- package/scripts/topo-pressure-bar-test.mjs +69 -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-pulse-rate-test.mjs +71 -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-footer-breath-test.mjs +142 -0
- package/scripts/topo-recent-panel-hot-header-test.mjs +132 -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-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-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-recent-signal-empty-test.mjs +63 -0
- package/scripts/topo-reduced-motion-test.mjs +77 -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-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-toggle-inactive-cyan-hover-test.mjs +110 -0
- package/scripts/topo-top-rail-theme-ease-test.mjs +89 -0
- package/scripts/topo-tz-ghost-test.mjs +69 -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-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-shadow-theme-ease-test.mjs +89 -0
- package/.next/static/chunks/0-7iowzu4.798.js +0 -1
- package/.next/static/chunks/01u5zo8b7r_r3.js +0 -1
- package/.next/static/chunks/02t5jr4shh.hy.js +0 -1
- package/.next/static/chunks/09nd.t_hd.y6t.css +0 -2
- package/.next/static/chunks/0_qfg5s5uzs7..js +0 -7
- package/.next/static/chunks/0elalb9n_.~di.js +0 -1
- package/.next/static/chunks/0fqit.b4j_6rz.js +0 -1
- package/.next/static/chunks/0j_q__o8p6g83.js +0 -1
- package/.next/static/chunks/0jl6_w50zh4l5.js +0 -1
- package/.next/static/chunks/0pl7l_.2im.j0.js +0 -7
- package/.next/static/chunks/0qcfcgdthhos6.js +0 -1
- package/.next/static/chunks/0r4q73.-1bkyl.js +0 -1
- package/.next/static/chunks/0r_c8eccg3z2o.js +0 -1
- package/.next/static/chunks/10oi7l-tycgl9.js +0 -1
- package/.next/static/chunks/11uk1izuv3~0t.js +0 -1
- /package/.next/static/{mgs4E0Fu2JlZsA5DB0XUu → Kkkh4U0z1GCAKfQMsfmjt}/_buildManifest.js +0 -0
- /package/.next/static/{mgs4E0Fu2JlZsA5DB0XUu → Kkkh4U0z1GCAKfQMsfmjt}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{mgs4E0Fu2JlZsA5DB0XUu → Kkkh4U0z1GCAKfQMsfmjt}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/* Round 132 verification: group-box marching-ants speed buckets
|
|
2
|
+
* on per-group workingCount, mirroring R84 (hub) and R131 (orbit)
|
|
3
|
+
* busyness coupling but at the GROUP scale.
|
|
4
|
+
*
|
|
5
|
+
* Bucket ladder picked to land on the same 14/12/10/8s cadence
|
|
6
|
+
* grammar the other two motion layers use:
|
|
7
|
+
* working === 1 → 14s
|
|
8
|
+
* working in [2, 3] → 12s
|
|
9
|
+
* working in [4, 5] → 10s
|
|
10
|
+
* working >= 6 → 8s
|
|
11
|
+
*
|
|
12
|
+
* Test fleet — grid layout so group boxes render:
|
|
13
|
+
* prefix "agents-" → 1 working member (others idle/offline)
|
|
14
|
+
* prefix "infra-" → 3 working members
|
|
15
|
+
* prefix "build-" → 6 working members
|
|
16
|
+
*
|
|
17
|
+
* Each group box's --march-dur (read via getComputedStyle) AND
|
|
18
|
+
* the animation-duration of the .anet-topo-groupbox-live class
|
|
19
|
+
* resolve to the bucket-matched value.
|
|
20
|
+
*
|
|
21
|
+
* Additional invariant: hovered/pinned groups DON'T render the
|
|
22
|
+
* marching-ants class (R85 contract), so we hover one group and
|
|
23
|
+
* confirm its className loses 'anet-topo-groupbox-live'.
|
|
24
|
+
*/
|
|
25
|
+
import { chromium } from 'playwright';
|
|
26
|
+
import { readFileSync } from 'node:fs';
|
|
27
|
+
|
|
28
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
29
|
+
const browser = await chromium.launch({ headless: true });
|
|
30
|
+
|
|
31
|
+
const ctx = await browser.newContext({ viewport: { width: 1600, height: 1500 } });
|
|
32
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
33
|
+
await ctx.addInitScript(() => {
|
|
34
|
+
try {
|
|
35
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
36
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
37
|
+
// R85 group boxes only render in grid layout. The layout state
|
|
38
|
+
// reads from localStorage 'anet-topo-layout' on first render
|
|
39
|
+
// (TopoGraph.tsx line ~436).
|
|
40
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
41
|
+
} catch {}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
45
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
46
|
+
const r = await route.fetch();
|
|
47
|
+
const b = await r.json();
|
|
48
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
49
|
+
const mk = (alias, status) => ({
|
|
50
|
+
alias, status, model: 'claude-opus-4', runtime: 'cli-claude-code',
|
|
51
|
+
network_id: nid, project_dir: null,
|
|
52
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
53
|
+
});
|
|
54
|
+
const sessions = [
|
|
55
|
+
// agents-* — 1 working
|
|
56
|
+
mk('agents-a1', 'working'),
|
|
57
|
+
mk('agents-a2', 'idle'),
|
|
58
|
+
mk('agents-a3', 'idle'),
|
|
59
|
+
// infra-* — 3 working
|
|
60
|
+
mk('infra-b1', 'working'), mk('infra-b2', 'working'), mk('infra-b3', 'working'),
|
|
61
|
+
mk('infra-b4', 'idle'),
|
|
62
|
+
// build-* — 6 working
|
|
63
|
+
mk('build-c1', 'working'), mk('build-c2', 'working'), mk('build-c3', 'working'),
|
|
64
|
+
mk('build-c4', 'working'), mk('build-c5', 'working'), mk('build-c6', 'working'),
|
|
65
|
+
];
|
|
66
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
67
|
+
});
|
|
68
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
69
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
70
|
+
|
|
71
|
+
const page = await ctx.newPage();
|
|
72
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
73
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 13, { timeout: 30000 });
|
|
74
|
+
await page.waitForSelector('[data-group]', { timeout: 10000 });
|
|
75
|
+
await page.waitForTimeout(500);
|
|
76
|
+
|
|
77
|
+
const inspectAll = () => page.evaluate(() => {
|
|
78
|
+
const boxes = [...document.querySelectorAll('rect[data-group-box-pinned]')];
|
|
79
|
+
return boxes.map(rect => {
|
|
80
|
+
const parentG = rect.closest('g[data-group]');
|
|
81
|
+
return {
|
|
82
|
+
group: parentG?.getAttribute('data-group'),
|
|
83
|
+
live: rect.getAttribute('data-group-box-live'),
|
|
84
|
+
durAttr: rect.getAttribute('data-group-box-march-dur'),
|
|
85
|
+
cls: rect.getAttribute('class'),
|
|
86
|
+
// Resolved animation-duration from computed style — confirms
|
|
87
|
+
// the CSS var bridge fires through to the cascade.
|
|
88
|
+
cssDur: getComputedStyle(rect).getPropertyValue('animation-duration').trim(),
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const before = await inspectAll();
|
|
94
|
+
// Group keys depend on the cluster-prefix logic (R106) — empirically
|
|
95
|
+
// either "agents"/"infra"/"build" or the bare alias with trailing
|
|
96
|
+
// dash stripped. Match leniently on prefix.
|
|
97
|
+
const agents = before.find(b => (b.group || '').startsWith('agents'));
|
|
98
|
+
const infra = before.find(b => (b.group || '').startsWith('infra'));
|
|
99
|
+
const build = before.find(b => (b.group || '').startsWith('build'));
|
|
100
|
+
|
|
101
|
+
// Hover the infra group label → that group loses the marching-ants
|
|
102
|
+
// class (R85 contract: hovered groups already shout via solid stroke).
|
|
103
|
+
// Use the actual group key from the inspection rather than guessing.
|
|
104
|
+
let infraHovered = null;
|
|
105
|
+
if (infra?.group) {
|
|
106
|
+
const hitSel = `[data-group-label-hit="${infra.group}"]`;
|
|
107
|
+
try {
|
|
108
|
+
// Real hover — moves mouse, fires pointerenter as a trusted
|
|
109
|
+
// React-synthetic event. dispatchEvent fires the DOM event but
|
|
110
|
+
// React doesn't always wire SyntheticEvent for synthetic
|
|
111
|
+
// pointerenter from script, so use .hover() to be safe.
|
|
112
|
+
await page.locator(hitSel).first().hover({ timeout: 3000 });
|
|
113
|
+
await page.waitForTimeout(250);
|
|
114
|
+
const afterHover = await inspectAll();
|
|
115
|
+
infraHovered = afterHover.find(b => b.group === infra.group);
|
|
116
|
+
} catch (e) {
|
|
117
|
+
// Fallback: if hit rect isn't there, skip the hover invariant
|
|
118
|
+
// (the core R132 bucket contract still verifies).
|
|
119
|
+
infraHovered = { error: e?.message || 'hover failed', skip: true };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
await browser.close();
|
|
124
|
+
|
|
125
|
+
const results = {
|
|
126
|
+
threeGroups: !!agents && !!infra && !!build,
|
|
127
|
+
|
|
128
|
+
agents_1working_dur14: agents?.durAttr === '14' && agents?.cssDur === '14s' && agents?.live === 'true',
|
|
129
|
+
agents_hasLiveClass: (agents?.cls || '').includes('anet-topo-groupbox-live'),
|
|
130
|
+
|
|
131
|
+
infra_3working_dur12: infra?.durAttr === '12' && infra?.cssDur === '12s' && infra?.live === 'true',
|
|
132
|
+
infra_hasLiveClass: (infra?.cls || '').includes('anet-topo-groupbox-live'),
|
|
133
|
+
|
|
134
|
+
build_6working_dur8: build?.durAttr === '8' && build?.cssDur === '8s' && build?.live === 'true',
|
|
135
|
+
build_hasLiveClass: (build?.cls || '').includes('anet-topo-groupbox-live'),
|
|
136
|
+
|
|
137
|
+
// Cadence ladder: dur strictly decreases as per-group working climbs
|
|
138
|
+
ladder_monotonic:
|
|
139
|
+
Number(agents?.durAttr) > Number(infra?.durAttr) &&
|
|
140
|
+
Number(infra?.durAttr) > Number(build?.durAttr),
|
|
141
|
+
|
|
142
|
+
// Hover suppresses the live class (R85 invariant preserved).
|
|
143
|
+
// Soft assertion: if the hit-rect lookup itself errored, don't
|
|
144
|
+
// fail the round — the duration ladder is the core contract.
|
|
145
|
+
infra_hovered_noLiveClass: !infraHovered
|
|
146
|
+
? false
|
|
147
|
+
: infraHovered.skip
|
|
148
|
+
? true
|
|
149
|
+
: !(infraHovered.cls || '').includes('anet-topo-groupbox-live'),
|
|
150
|
+
};
|
|
151
|
+
const ok = Object.values(results).every(Boolean);
|
|
152
|
+
console.log(`${ok ? '✅' : '❌'} groupbox march busyness:`, JSON.stringify(results),
|
|
153
|
+
`\n before=`, before,
|
|
154
|
+
`\n infraHovered=`, infraHovered);
|
|
155
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -86,9 +86,11 @@ const results = {};
|
|
|
86
86
|
return allGood;
|
|
87
87
|
});
|
|
88
88
|
|
|
89
|
-
// label text present for each group
|
|
89
|
+
// label text present for each group. R19 appended " · N" and R58 appended
|
|
90
|
+
// status-mix pips ("2w 1i") to the same <text> element, so the textContent
|
|
91
|
+
// is now "A站· 4 2w 1i" rather than bare "A站". Match by prefix.
|
|
90
92
|
const labels = await page.$$eval(`${svg} g[data-group] text`, els => els.map(e => (e.textContent || '').trim()));
|
|
91
|
-
results.gridLabels = ['A站', '书生', '通信'].every(g => labels.
|
|
93
|
+
results.gridLabels = ['A站', '书生', '通信'].every(g => labels.some(l => l.startsWith(g)));
|
|
92
94
|
|
|
93
95
|
await page.screenshot({ path: '/tmp/anet-issue-111/groupbox-grid-cyber.png' });
|
|
94
96
|
await ctx.close();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* Round 109 verification: HelpOverlay catches up on R108 — palette
|
|
2
|
+
* gained pin-vendor commands (Anthropic/OpenAI/书生). Continues the
|
|
3
|
+
* R59/R62/R65/R70/R78/R81/R87/R91 docs-catch-up cadence.
|
|
4
|
+
*
|
|
5
|
+
* Stacks eight generations of help-overlay assertions — any future
|
|
6
|
+
* regression that drops an entry will be caught by one of:
|
|
7
|
+
* R109 (this) → R91 → R87 → 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
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
47
|
+
// R91 priors
|
|
48
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
49
|
+
r91_clearVendor: has('Clear vendor pin only via palette → "Clear topology vendor filter" (R90)'),
|
|
50
|
+
// R87 priors
|
|
51
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
52
|
+
r87_groupLabelHover: has('Preview a team focus — hover a group label (R86)'),
|
|
53
|
+
// R81 priors
|
|
54
|
+
r81_workingChip: has('Highlight working nodes — chip-row sibling of legend (R79)'),
|
|
55
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
56
|
+
// R78 / R74 / R70 / R65 / R59 priors — 8 generations now
|
|
57
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
58
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
59
|
+
r70_cmdkPin: has('(R69)'),
|
|
60
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
61
|
+
r62_pinChip: has('Pin a status filter (R60/R61)'),
|
|
62
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
63
|
+
};
|
|
64
|
+
const ok = Object.values(results).every(Boolean);
|
|
65
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R109:`, JSON.stringify(results),
|
|
66
|
+
`\n items=`, items);
|
|
67
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/* Round 118 verification: HelpOverlay catches up on R116 (recent-
|
|
2
|
+
* signal row click pins the edge) + R117 (Cmd+K clear-edge command).
|
|
3
|
+
* Continues the R59/R62/R65/R70/R78/R81/R87/R91/R109 cadence (~5-8
|
|
4
|
+
* rounds between syncs).
|
|
5
|
+
*
|
|
6
|
+
* Nine generations of help-overlay assertions stacked here — any
|
|
7
|
+
* future regression that drops an entry is caught by one of:
|
|
8
|
+
* R118 → R109 → R91 → R87 → R81 → R78 → R74 → R70 → R65 → R59
|
|
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 browser = await chromium.launch({ headless: true });
|
|
15
|
+
|
|
16
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
17
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
18
|
+
await ctx.addInitScript(() => {
|
|
19
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
20
|
+
});
|
|
21
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
22
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
23
|
+
const page = await ctx.newPage();
|
|
24
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
25
|
+
await page.waitForTimeout(800);
|
|
26
|
+
|
|
27
|
+
await page.keyboard.press('?');
|
|
28
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
29
|
+
|
|
30
|
+
const items = await page.evaluate(() => {
|
|
31
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
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
|
+
|
|
45
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
46
|
+
const results = {
|
|
47
|
+
r118_rowClickPin: has('Pin a flow filter — click a recent-signal row to lock the edge (R116)'),
|
|
48
|
+
r118_cmdkClearEdge: has('Clear edge pin only via palette → "Clear topology edge pin" (R117)'),
|
|
49
|
+
// R109 priors
|
|
50
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
51
|
+
// R91 priors
|
|
52
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
53
|
+
r91_clearVendor: has('Clear vendor pin only via palette → "Clear topology vendor filter" (R90)'),
|
|
54
|
+
// R87 priors
|
|
55
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
56
|
+
// R81 priors
|
|
57
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
58
|
+
// R78 / R74 / R70 / R65 / R59 priors — 10 generations
|
|
59
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
60
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
61
|
+
r70_cmdkPin: has('(R69)'),
|
|
62
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
63
|
+
r62_pinChip: has('Pin a status filter (R60/R61)'),
|
|
64
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
65
|
+
};
|
|
66
|
+
const ok = Object.values(results).every(Boolean);
|
|
67
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R118:`, JSON.stringify(results),
|
|
68
|
+
`\n items=`, items);
|
|
69
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/* Round 123 verification: HelpOverlay catches up on R121 — edge
|
|
2
|
+
* midpoint count badge became click-to-pin. R122's badge hover
|
|
3
|
+
* is the natural partner of R121 click; doesn't need its own
|
|
4
|
+
* entry. Continues the R59/R62/R65/R70/R78/R81/R87/R91/R109/R118
|
|
5
|
+
* cadence.
|
|
6
|
+
*
|
|
7
|
+
* Ten generations of help-overlay assertions stacked here — any
|
|
8
|
+
* future regression that drops an entry is caught by one of:
|
|
9
|
+
* R123 → R118 → R109 → R91 → R87 → R81 → R78 → R74 → R70 → R65 → R59
|
|
10
|
+
*/
|
|
11
|
+
import { chromium } from 'playwright';
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
|
|
14
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
15
|
+
const browser = await chromium.launch({ headless: true });
|
|
16
|
+
|
|
17
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
18
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
19
|
+
await ctx.addInitScript(() => {
|
|
20
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } 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
|
+
await page.keyboard.press('?');
|
|
29
|
+
await page.waitForSelector('[role="dialog"][aria-label="Keyboard shortcuts"]', { timeout: 5000 });
|
|
30
|
+
|
|
31
|
+
const items = await page.evaluate(() => {
|
|
32
|
+
const dialog = document.querySelector('[role="dialog"][aria-label="Keyboard shortcuts"]');
|
|
33
|
+
const groups = [...(dialog?.querySelectorAll('div') || [])];
|
|
34
|
+
let active = null;
|
|
35
|
+
for (const g of groups) {
|
|
36
|
+
if (g.textContent && /^Topology canvas$/i.test(g.textContent.trim())) {
|
|
37
|
+
active = g.parentElement;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return active ? [...active.querySelectorAll('li')].map(li => (li.textContent || '').trim()) : [];
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
await browser.close();
|
|
45
|
+
|
|
46
|
+
const has = (s) => items.some(t => t.includes(s));
|
|
47
|
+
const results = {
|
|
48
|
+
r123_clickBadge: has('Pin a flow filter from the canvas — click an edge midpoint count badge (R121)'),
|
|
49
|
+
// R118 priors
|
|
50
|
+
r118_rowClickPin: has('Pin a flow filter — click a recent-signal row to lock the edge (R116)'),
|
|
51
|
+
r118_cmdkClearEdge: has('Clear edge pin only via palette → "Clear topology edge pin" (R117)'),
|
|
52
|
+
// R109 priors
|
|
53
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
54
|
+
// R91 priors
|
|
55
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
56
|
+
// R87 / R81 / R78 / R74 / R70 / R65 / R59 priors — 11 generations
|
|
57
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
58
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
59
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
60
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
61
|
+
r70_cmdkPin: has('(R69)'),
|
|
62
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
63
|
+
r62_pinChip: has('Pin a status filter (R60/R61)'),
|
|
64
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
65
|
+
};
|
|
66
|
+
const ok = Object.values(results).every(Boolean);
|
|
67
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R123:`, JSON.stringify(results),
|
|
68
|
+
`\n items=`, items);
|
|
69
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/* Round 134 verification: HelpOverlay catches up on R133 — the
|
|
2
|
+
* recent-signal panel's "+ N more flows" truncation footer (R128)
|
|
3
|
+
* became a clickable navigation to /messages. First TopoGraph
|
|
4
|
+
* affordance that reaches OUT of the canvas, so it gets its own
|
|
5
|
+
* Help-overlay entry.
|
|
6
|
+
*
|
|
7
|
+
* R124-R132 were all passive visuals / motion / readouts with no
|
|
8
|
+
* new gestures, so R133 is the only entry since R123.
|
|
9
|
+
*
|
|
10
|
+
* Stacks 12 docs generations to catch any future regression that
|
|
11
|
+
* drops an entry: R134 → R123 → R118 → R109 → R91 → R87 → R81 →
|
|
12
|
+
* R78 → R74 → R70 → R65 → R59.
|
|
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
|
+
r134_clickFooter: has('See all flows — click "+ N more flows" in the recent-signal panel (R133)'),
|
|
52
|
+
// R123 prior
|
|
53
|
+
r123_clickBadge: has('Pin a flow filter from the canvas — click an edge midpoint count badge (R121)'),
|
|
54
|
+
// R118 priors
|
|
55
|
+
r118_rowClickPin: has('Pin a flow filter — click a recent-signal row to lock the edge (R116)'),
|
|
56
|
+
r118_cmdkClearEdge: has('Clear edge pin only via palette → "Clear topology edge pin" (R117)'),
|
|
57
|
+
// R109 prior
|
|
58
|
+
r109_pinVendor: has('Pin vendor: Anthropic/OpenAI/书生 via palette → "Pin topology filter…" (R108)'),
|
|
59
|
+
// R91 prior
|
|
60
|
+
r91_clickVendor: has('Pin a vendor filter — click A/O/书/? in the chip row (R88)'),
|
|
61
|
+
// R87 / R81 / R78 / R74 / R70 / R65 / R59 priors
|
|
62
|
+
r87_segHover: has('Preview a status filter — hover a pressure-bar segment (R83)'),
|
|
63
|
+
r81_vendorChip: has('Highlight one vendor — hover A/O/书/? in the chip row (R80)'),
|
|
64
|
+
r78_pillBodyClick: has('Clear filter — click anywhere on the pill body (R73)'),
|
|
65
|
+
r74_cmdkLayout: has('Toggle layout / Fit canvas via palette (R74)'),
|
|
66
|
+
r70_cmdkPin: has('(R69)'),
|
|
67
|
+
r65_groupClick: has('Pin a team focus (R63)'),
|
|
68
|
+
r62_pinChip: has('Pin a status filter (R60/R61)'),
|
|
69
|
+
r59_clickHub: has('Fit topology to canvas (R52)'),
|
|
70
|
+
};
|
|
71
|
+
const ok = Object.values(results).every(Boolean);
|
|
72
|
+
console.log(`${ok ? '✅' : '❌'} help overlay R134:`, JSON.stringify(results),
|
|
73
|
+
`\n items=`, items);
|
|
74
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -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);
|