@sleep2agi/agent-network-dashboard 0.5.3-preview.99 → 0.5.4
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 +35 -35
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +29 -0
- package/.next/routes-manifest.json +12 -0
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- 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 +13 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
- 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 +15 -15
- package/.next/server/app/admin.segments/_full.segment.rsc +15 -15
- 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/upload/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/upload/route/build-manifest.json +9 -0
- package/.next/server/app/api/hub/upload/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/upload/route.js +7 -0
- package/.next/server/app/api/hub/upload/route.js.map +5 -0
- package/.next/server/app/api/hub/upload/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/upload/route_client-reference-manifest.js +3 -0
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +15 -15
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/login.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/logs.segments/_full.segment.rsc +15 -15
- 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/manifest.webmanifest/route/app-paths-manifest.json +3 -0
- package/.next/server/app/manifest.webmanifest/route/build-manifest.json +9 -0
- package/.next/server/app/manifest.webmanifest/route/server-reference-manifest.json +4 -0
- package/.next/server/app/manifest.webmanifest/route.js +8 -0
- package/.next/server/app/manifest.webmanifest/route.js.map +5 -0
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +3 -0
- package/.next/server/app/manifest.webmanifest.body +1 -0
- package/.next/server/app/manifest.webmanifest.meta +1 -0
- 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 +15 -15
- package/.next/server/app/messages.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/node.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/nodes.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/server-logs.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/settings.segments/_full.segment.rsc +15 -15
- 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 +15 -15
- package/.next/server/app/tasks.segments/_full.segment.rsc +15 -15
- 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/00jm_next_dist_0ju_ux9._.js +18 -0
- package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js.map +1 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_upload_route_actions_03_eqnf.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_manifest_webmanifest_route_actions_0m16rb8.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_manifest_webmanifest_route_actions_0m16rb8.js.map +1 -0
- package/.next/server/chunks/{[externals]__11vad82._.js → [externals]__036g1.i._.js} +2 -2
- package/.next/server/chunks/[externals]__036g1.i._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0-8_f0o._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0-8_f0o._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__08uyvdq._.js → [root-of-the-server]__0jndzts._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__08uyvdq._.js.map → [root-of-the-server]__0jndzts._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js.map +1 -1
- 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/00jm_next_dist_esm_build_templates_app-page_0..ddwm.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0..ddwm.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_02bxi6j.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_02bxi6j.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05oassd.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05oassd.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05vxtby.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05vxtby.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05~eml4.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05~eml4.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js.map +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_13mqkay.js +1 -1
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_13mqkay.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +4 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
- 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/middleware.js +2 -2
- package/.next/server/middleware.js.nft.json +1 -1
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/{07~8sx3_5uiox.js → 04wjx7vbxusw5.js} +4 -1
- package/.next/static/chunks/089t1exs6apb8.js +4 -0
- package/.next/static/chunks/{084e1mr6acfta.js → 09e8kxo30n5cf.js} +1 -1
- package/.next/static/chunks/{0v4-5tng.uh.7.js → 0k-c1chkvf78s.js} +2 -2
- package/.next/static/chunks/0v2~nlpk-cx6v.css +2 -0
- package/.next/static/chunks/0xsye-9kffdi0.js +1 -0
- package/.next/static/chunks/0~rx_~akeylmq.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/app/api/hub/send/route.ts +11 -2
- package/app/api/hub/servers/route.ts +3 -29
- package/app/api/hub/upload/route.ts +83 -0
- package/app/components/AppShell.tsx +3 -1
- package/app/components/MobileNav.tsx +45 -0
- package/app/components/TaskChatPanel.tsx +130 -6
- package/app/components/TopoGraph.tsx +4591 -216
- package/app/globals.css +839 -0
- package/app/layout.tsx +6 -0
- package/app/lib/serverDedupe.ts +122 -0
- package/app/lib/vendorIdentity.ts +74 -56
- package/app/manifest.ts +23 -0
- package/package.json +4 -4
- package/public/vendors/claude.svg +7 -8
- package/public/vendors/minimax.svg +8 -9
- package/public/vendors/openai.svg +8 -10
- package/scripts/p157-rc2-dedup-test.mjs +110 -0
- package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
- package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-animation-temporal-modes-catalog-test.mjs +144 -0
- package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
- package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
- package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
- package/scripts/topo-avatar-rotate-test.mjs +85 -0
- package/scripts/topo-avatar-scale-test.mjs +89 -0
- package/scripts/topo-badge-chat-gate-test.mjs +74 -0
- package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
- package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
- package/scripts/topo-canvas-desc-a11y-test.mjs +87 -0
- package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
- package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
- package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
- package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -0
- package/scripts/topo-card-chat-brightness-test.mjs +86 -0
- package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
- package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
- package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
- package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
- package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
- package/scripts/topo-chip-pin-halo-test.mjs +85 -0
- package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
- package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
- package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
- package/scripts/topo-chrome-strip-entrance-animation-test.mjs +115 -0
- package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
- package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
- package/scripts/topo-click-ripple-glow-test.mjs +86 -0
- package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
- package/scripts/topo-click-ripple-sw-test.mjs +110 -0
- package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
- package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
- package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
- package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
- package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
- package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
- package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
- package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
- package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
- package/scripts/topo-edge-chat-gate-test.mjs +71 -0
- package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
- package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
- package/scripts/topo-edge-pin-halo-test.mjs +99 -0
- package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
- package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
- package/scripts/topo-group-box-brightness-test.mjs +84 -0
- package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
- package/scripts/topo-group-chat-gate-test.mjs +77 -0
- package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
- package/scripts/topo-group-tint-brightness-test.mjs +82 -0
- package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
- package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
- package/scripts/topo-halo-chat-gate-test.mjs +72 -0
- package/scripts/topo-hover-detail-halo-test.mjs +76 -0
- package/scripts/topo-hub-a11y-title-test.mjs +95 -0
- package/scripts/topo-hub-core-brightness-test.mjs +82 -0
- package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
- package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
- package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
- package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
- package/scripts/topo-kicker-breath-test.mjs +100 -0
- package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
- package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
- package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
- package/scripts/topo-label-card-brightness-test.mjs +81 -0
- package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
- package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
- package/scripts/topo-legend-count-brightness-test.mjs +80 -0
- package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
- package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
- package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
- package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
- package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
- package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
- package/scripts/topo-live-lanes.mjs +48 -0
- package/scripts/topo-minimap-container-halo-test.mjs +82 -0
- package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
- package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
- package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
- package/scripts/topo-more-footer-brightness-test.mjs +94 -0
- package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
- package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
- package/scripts/topo-node-label-card-halo-test.mjs +76 -0
- package/scripts/topo-nodesize-brightness-test.mjs +82 -0
- package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
- package/scripts/topo-overlap-test.mjs +22 -8
- package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
- package/scripts/topo-panel-rect-halo-test.mjs +90 -0
- package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
- package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
- package/scripts/topo-panel-titles-triple-axis-breath-test.mjs +161 -0
- package/scripts/topo-pip-brightness-test.mjs +85 -0
- package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
- package/scripts/topo-r717-scan-beam-pair-pattern-test.mjs +100 -0
- package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
- package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -0
- package/scripts/topo-recent-count-brightness-test.mjs +84 -0
- package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
- package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
- package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
- package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
- package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
- package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
- package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
- package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
- package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
- package/scripts/topo-reset-brightness-test.mjs +83 -0
- package/scripts/topo-respiratory-axis-count-stats-test.mjs +154 -0
- package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -0
- package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
- package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
- package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
- package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
- package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
- package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
- package/scripts/topo-section-title-breath-test.mjs +83 -0
- package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
- package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
- package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
- package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
- package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
- package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
- package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
- package/scripts/topo-svg-title-a11y-r731-test.mjs +93 -0
- package/scripts/topo-svg-title-a11y-test.mjs +88 -0
- package/scripts/topo-title-block-entrance-animation-test.mjs +127 -0
- package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
- package/scripts/topo-tree-diag.mjs +95 -0
- package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
- package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
- package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
- package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
- package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
- package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
- package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
- package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
- package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
- package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
- package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
- package/scripts/topo-zoom-level-breath-test.mjs +87 -0
- package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
- package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
- package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
- package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +148 -0
- package/.next/static/chunks/09oxd2mm27b_n.js +0 -1
- package/.next/static/chunks/0ots8-uksxz9p.js +0 -4
- package/.next/static/chunks/0voxs92keb6tg.js +0 -1
- package/.next/static/chunks/13~aih56vx-cf.css +0 -2
- /package/.next/server/chunks/{[externals]__11vad82._.js.map → 0ykm__next-internal_server_app_api_hub_upload_route_actions_03_eqnf.js.map} +0 -0
- /package/.next/static/{Ha31LjrNJgJIEydZivRlp → xq88BMF7fMUHWh10yaKTn}/_buildManifest.js +0 -0
- /package/.next/static/{Ha31LjrNJgJIEydZivRlp → xq88BMF7fMUHWh10yaKTn}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{Ha31LjrNJgJIEydZivRlp → xq88BMF7fMUHWh10yaKTn}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* Round 737 — formalize the R735/R736 scan beam ambient pair as the
|
|
2
|
+
* 9TH entry in R717 patterns catalog. CROSS-FAMILY pattern entry:
|
|
3
|
+
* prior 8 patterns are all in the respiratory (breath) family;
|
|
4
|
+
* scan-beam-pair lives in the AMBIENT family but uses the same
|
|
5
|
+
* R717 "pattern axis" introspection vocabulary.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors R724's pattern-formalization round (which added the
|
|
8
|
+
* triple-axis-pair entry after R721/R722 established the surfaces).
|
|
9
|
+
*
|
|
10
|
+
* Assertions:
|
|
11
|
+
* - R717 patterns has exactly 9 entries
|
|
12
|
+
* - `scan-beam-pair` entry exists with:
|
|
13
|
+
* - cadences [23, 30]
|
|
14
|
+
* - anchors ["scan beam horizontal", "scan beam vertical"]
|
|
15
|
+
* - shape "coprime-crosshair"
|
|
16
|
+
* - Coprime invariant: gcd(23, 30) === 1
|
|
17
|
+
* - Pattern cadences match the actual SMIL animate durs on the
|
|
18
|
+
* two beams (regression: R735 y-anim dur === 30s, R736 x-anim
|
|
19
|
+
* dur === 23s)
|
|
20
|
+
* - Pattern anchors map to actual data-attr selectors that resolve
|
|
21
|
+
* to live DOM elements (semantic anchor-to-element correspondence)
|
|
22
|
+
* - All other 8 R717 entries preserved (regression)
|
|
23
|
+
*/
|
|
24
|
+
import { chromium } from 'playwright';
|
|
25
|
+
import { readFileSync } from 'node:fs';
|
|
26
|
+
|
|
27
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
28
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
29
|
+
|
|
30
|
+
const browser = await chromium.launch({ headless: true });
|
|
31
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
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
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
37
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
38
|
+
} catch {}
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
41
|
+
const r = await route.fetch();
|
|
42
|
+
const b = await r.json();
|
|
43
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
44
|
+
const mk = (alias) => ({
|
|
45
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
46
|
+
network_id: nid, project_dir: null,
|
|
47
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
48
|
+
});
|
|
49
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
50
|
+
});
|
|
51
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
52
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
53
|
+
const page = await ctx.newPage();
|
|
54
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
55
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
56
|
+
await page.waitForTimeout(300);
|
|
57
|
+
|
|
58
|
+
const state = await page.evaluate(() => {
|
|
59
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
60
|
+
const patternsAttr = svg?.getAttribute('data-topo-respiratory-patterns') ?? null;
|
|
61
|
+
const hbeam = document.querySelector('[data-topo-canvas-scan-beam]');
|
|
62
|
+
const vbeam = document.querySelector('[data-topo-canvas-scan-beam-vertical]');
|
|
63
|
+
return {
|
|
64
|
+
patterns_attr: patternsAttr,
|
|
65
|
+
hbeam_y_dur: hbeam?.querySelector('animate[attributeName="y"]')?.getAttribute('dur') ?? null,
|
|
66
|
+
vbeam_x_dur: vbeam?.querySelector('animate[attributeName="x"]')?.getAttribute('dur') ?? null,
|
|
67
|
+
hbeam_present: !!hbeam,
|
|
68
|
+
vbeam_present: !!vbeam,
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await browser.close();
|
|
73
|
+
|
|
74
|
+
let patterns = null;
|
|
75
|
+
try { patterns = JSON.parse(state.patterns_attr ?? ''); } catch {}
|
|
76
|
+
|
|
77
|
+
const sbpEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'scan-beam-pair') : null;
|
|
78
|
+
const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));
|
|
79
|
+
|
|
80
|
+
const expectedNames = ['background', 'canvas-brand-pair', 'chrome-strip', 'panel-pair', 'scan-beam-pair', 'title-block', 'triple-axis-pair', 'triple-axis-pair-8s', 'triple-axis-tier'];
|
|
81
|
+
const actualNames = Array.isArray(patterns) ? patterns.map(p => p.name).sort() : [];
|
|
82
|
+
|
|
83
|
+
const results = {
|
|
84
|
+
patterns_has_9_entries: Array.isArray(patterns) && patterns.length === 9,
|
|
85
|
+
pattern_names_complete: JSON.stringify(actualNames) === JSON.stringify(expectedNames),
|
|
86
|
+
scan_beam_pair_entry_present: !!sbpEntry,
|
|
87
|
+
cadences_23_30: !!sbpEntry && JSON.stringify(sbpEntry.cadences) === JSON.stringify([23, 30]),
|
|
88
|
+
anchors_horizontal_vertical: !!sbpEntry && JSON.stringify(sbpEntry.anchors) === JSON.stringify(['scan beam horizontal', 'scan beam vertical']),
|
|
89
|
+
shape_coprime_crosshair: sbpEntry?.shape === 'coprime-crosshair',
|
|
90
|
+
coprime_invariant_holds: gcd(23, 30) === 1,
|
|
91
|
+
pattern_matches_hbeam_dur: state.hbeam_y_dur === '30s' && Array.isArray(sbpEntry?.cadences) && sbpEntry.cadences.includes(30),
|
|
92
|
+
pattern_matches_vbeam_dur: state.vbeam_x_dur === '23s' && Array.isArray(sbpEntry?.cadences) && sbpEntry.cadences.includes(23),
|
|
93
|
+
both_beams_in_dom: state.hbeam_present && state.vbeam_present,
|
|
94
|
+
};
|
|
95
|
+
const ok = Object.values(results).every(Boolean);
|
|
96
|
+
console.log(`${ok ? '✅' : '❌'} R737 R717 patterns +1: scan-beam-pair (9th entry, first cross-family pattern from the ambient layer):`,
|
|
97
|
+
JSON.stringify(results, null, 2),
|
|
98
|
+
`\n sbp entry: ${JSON.stringify(sbpEntry)}`,
|
|
99
|
+
`\n gcd(23, 30) = ${gcd(23, 30)}`);
|
|
100
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* Round 724 — 6th entry added to R717 patterns catalog:
|
|
2
|
+
* `triple-axis-pair` with shape `6s-triple-pair`. Formalizes the
|
|
3
|
+
* structural motif previously implicit across R721/R722/R723:
|
|
4
|
+
* kicker + watermark text — both at 6 s, both with text-shadow as
|
|
5
|
+
* the 3rd axis, both sparse-hover read-target text.
|
|
6
|
+
*
|
|
7
|
+
* Cross-validates against R723 triple-axis-surfaces catalog (the
|
|
8
|
+
* authoritative axis-count index): the anchors in this pattern entry
|
|
9
|
+
* must equal R723's anchor set.
|
|
10
|
+
*
|
|
11
|
+
* Assertions:
|
|
12
|
+
* - R717 patterns has exactly 6 entries (was 5 before R724)
|
|
13
|
+
* - One entry named "triple-axis-pair" exists
|
|
14
|
+
* - Its cadences = [6]
|
|
15
|
+
* - Its shape = "6s-triple-pair"
|
|
16
|
+
* - Its anchors = ["kicker", "watermark text"] (order preserved)
|
|
17
|
+
* - Cross-check: R723 triple-axis-surfaces anchor set, after
|
|
18
|
+
* normalising "watermark" → "watermark text" (the R723 catalog
|
|
19
|
+
* uses the short anchor key; R717 uses the full rolodex anchor
|
|
20
|
+
* name), equals this pattern's anchors
|
|
21
|
+
* - Anchor non-exclusivity (intended): kicker also appears in
|
|
22
|
+
* "title-block" pattern; "watermark text" also appears in
|
|
23
|
+
* "canvas-brand-pair" pattern
|
|
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 fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
30
|
+
|
|
31
|
+
const browser = await chromium.launch({ headless: true });
|
|
32
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
33
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
34
|
+
await ctx.addInitScript(() => {
|
|
35
|
+
try {
|
|
36
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
37
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
38
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
39
|
+
} catch {}
|
|
40
|
+
});
|
|
41
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
42
|
+
const r = await route.fetch();
|
|
43
|
+
const b = await r.json();
|
|
44
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
45
|
+
const mk = (alias) => ({
|
|
46
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
47
|
+
network_id: nid, project_dir: null,
|
|
48
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
49
|
+
});
|
|
50
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
51
|
+
});
|
|
52
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
53
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
54
|
+
const page = await ctx.newPage();
|
|
55
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
56
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
57
|
+
await page.waitForTimeout(300);
|
|
58
|
+
|
|
59
|
+
const runtimeAttrs = await page.evaluate(() => {
|
|
60
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
61
|
+
return {
|
|
62
|
+
patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
|
|
63
|
+
triple: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await browser.close();
|
|
68
|
+
|
|
69
|
+
let patterns = null;
|
|
70
|
+
let triple = null;
|
|
71
|
+
try {
|
|
72
|
+
patterns = JSON.parse(runtimeAttrs.patterns ?? '');
|
|
73
|
+
triple = JSON.parse(runtimeAttrs.triple ?? '');
|
|
74
|
+
} catch {}
|
|
75
|
+
|
|
76
|
+
const pairEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-pair') : null;
|
|
77
|
+
const titleBlockEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'title-block') : null;
|
|
78
|
+
const canvasBrandPairEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'canvas-brand-pair') : null;
|
|
79
|
+
|
|
80
|
+
/* R725 extended R723 to 3 entries (H2 added at 10 s). The strict
|
|
81
|
+
* equality between R723's anchor set and the R717 pair anchors no
|
|
82
|
+
* longer holds — R723 is the full triple-axis SUPERSET now, the
|
|
83
|
+
* pair is a subset. Widen the cross-check: every pair anchor must
|
|
84
|
+
* exist in R723 (mapping watermark → watermark text), AND R723's
|
|
85
|
+
* 6 s subset (members with cadence_s === 6) must equal the pair. */
|
|
86
|
+
const r723AnchorsNormalised = Array.isArray(triple)
|
|
87
|
+
? triple.map(e => e.anchor === 'watermark' ? 'watermark text' : e.anchor)
|
|
88
|
+
: [];
|
|
89
|
+
const r723SixSecAnchorsNormalised = Array.isArray(triple)
|
|
90
|
+
? triple.filter(e => e.cadence_s === 6).map(e => e.anchor === 'watermark' ? 'watermark text' : e.anchor).sort()
|
|
91
|
+
: [];
|
|
92
|
+
const pairAnchorsSorted = pairEntry?.anchors ? [...pairEntry.anchors].sort() : [];
|
|
93
|
+
const pairSubsetOfR723 = Array.isArray(pairEntry?.anchors)
|
|
94
|
+
&& pairEntry.anchors.every(a => r723AnchorsNormalised.includes(a));
|
|
95
|
+
const r723SixSecondSubsetEqualsPair = JSON.stringify(r723SixSecAnchorsNormalised) === JSON.stringify(pairAnchorsSorted);
|
|
96
|
+
|
|
97
|
+
const results = {
|
|
98
|
+
patterns_has_6_entries: Array.isArray(patterns) && patterns.length === 6,
|
|
99
|
+
pair_entry_exists: !!pairEntry,
|
|
100
|
+
pair_cadences_is_6: JSON.stringify(pairEntry?.cadences) === JSON.stringify([6]),
|
|
101
|
+
pair_shape_correct: pairEntry?.shape === '6s-triple-pair',
|
|
102
|
+
pair_anchors_correct: JSON.stringify(pairEntry?.anchors) === JSON.stringify(['kicker', 'watermark text']),
|
|
103
|
+
pair_is_subset_of_r723: pairSubsetOfR723,
|
|
104
|
+
r723_6s_subset_equals_pair: r723SixSecondSubsetEqualsPair,
|
|
105
|
+
kicker_also_in_title_block: Array.isArray(titleBlockEntry?.anchors) && titleBlockEntry.anchors.includes('kicker'),
|
|
106
|
+
watermark_also_in_canvas_brand: Array.isArray(canvasBrandPairEntry?.anchors) && canvasBrandPairEntry.anchors.includes('watermark text'),
|
|
107
|
+
};
|
|
108
|
+
const ok = Object.values(results).every(Boolean);
|
|
109
|
+
console.log(`${ok ? '✅' : '❌'} R724 R717 patterns +1: triple-axis-pair (formalizes the 6s triple-axis pair structural motif):`,
|
|
110
|
+
JSON.stringify(results, null, 2),
|
|
111
|
+
`\n pair entry: ${JSON.stringify(pairEntry)}`,
|
|
112
|
+
`\n R723 anchors (normalised): ${JSON.stringify(r723AnchorsNormalised)}`);
|
|
113
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/* Round 726 — 7th entry added to R717 patterns catalog: `triple-axis-tier`
|
|
2
|
+
* (shape `tier-multi-cadence`). Companion to R724's `triple-axis-pair`
|
|
3
|
+
* (shape `6s-triple-pair`). R725 added H2 as the 3rd triple-axis surface
|
|
4
|
+
* at 10 s, proving the tier is multi-cadence; R726 documents the tier
|
|
5
|
+
* as its own pattern entry covering all 3 triple-axis members across
|
|
6
|
+
* both cadences.
|
|
7
|
+
*
|
|
8
|
+
* Pattern axis now has BOTH grain sizes:
|
|
9
|
+
* triple-axis-pair cadences [6] anchors [kicker, watermark text] — 6 s subset
|
|
10
|
+
* triple-axis-tier cadences [6, 10] anchors [kicker, watermark text, H2 section title] — full tier
|
|
11
|
+
*
|
|
12
|
+
* Assertions:
|
|
13
|
+
* - R717 patterns has exactly 7 entries (was 6 before R726)
|
|
14
|
+
* - One entry named "triple-axis-tier" exists
|
|
15
|
+
* - Its cadences = [6, 10]
|
|
16
|
+
* - Its shape = "tier-multi-cadence"
|
|
17
|
+
* - Its anchors = ["kicker", "watermark text", "H2 section title"]
|
|
18
|
+
* - PAIR ⊂ TIER: every pair anchor appears in tier anchors
|
|
19
|
+
* - PAIR cadences ⊂ TIER cadences: 6 ∈ tier.cadences
|
|
20
|
+
* - Cross-check with R723: tier anchors (normalised) equals
|
|
21
|
+
* R723 triple-axis-surfaces anchors (normalised)
|
|
22
|
+
*/
|
|
23
|
+
import { chromium } from 'playwright';
|
|
24
|
+
import { readFileSync } from 'node:fs';
|
|
25
|
+
|
|
26
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
27
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
28
|
+
|
|
29
|
+
const browser = await chromium.launch({ headless: true });
|
|
30
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
31
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
32
|
+
await ctx.addInitScript(() => {
|
|
33
|
+
try {
|
|
34
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
35
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
36
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
37
|
+
} catch {}
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
40
|
+
const r = await route.fetch();
|
|
41
|
+
const b = await r.json();
|
|
42
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
43
|
+
const mk = (alias) => ({
|
|
44
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
45
|
+
network_id: nid, project_dir: null,
|
|
46
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
47
|
+
});
|
|
48
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
49
|
+
});
|
|
50
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
51
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
52
|
+
const page = await ctx.newPage();
|
|
53
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
54
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
55
|
+
await page.waitForTimeout(300);
|
|
56
|
+
|
|
57
|
+
const runtimeAttrs = await page.evaluate(() => {
|
|
58
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
59
|
+
return {
|
|
60
|
+
patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
|
|
61
|
+
triple: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await browser.close();
|
|
66
|
+
|
|
67
|
+
let patterns = null;
|
|
68
|
+
let triple = null;
|
|
69
|
+
try {
|
|
70
|
+
patterns = JSON.parse(runtimeAttrs.patterns ?? '');
|
|
71
|
+
triple = JSON.parse(runtimeAttrs.triple ?? '');
|
|
72
|
+
} catch {}
|
|
73
|
+
|
|
74
|
+
const pairEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-pair') : null;
|
|
75
|
+
const tierEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-tier') : null;
|
|
76
|
+
|
|
77
|
+
const tierAnchorsCorrect = tierEntry
|
|
78
|
+
&& JSON.stringify(tierEntry.anchors) === JSON.stringify(['kicker', 'watermark text', 'recent title', 'legend title', 'zoom-level readout', 'H2 section title']);
|
|
79
|
+
const tierCadencesCorrect = tierEntry
|
|
80
|
+
&& JSON.stringify(tierEntry.cadences) === JSON.stringify([6, 8, 9, 10]);
|
|
81
|
+
const tierShapeCorrect = tierEntry?.shape === 'tier-multi-cadence';
|
|
82
|
+
|
|
83
|
+
const pairAnchorsSubsetOfTier = Array.isArray(pairEntry?.anchors) && Array.isArray(tierEntry?.anchors)
|
|
84
|
+
&& pairEntry.anchors.every(a => tierEntry.anchors.includes(a));
|
|
85
|
+
const pairCadencesSubsetOfTier = Array.isArray(pairEntry?.cadences) && Array.isArray(tierEntry?.cadences)
|
|
86
|
+
&& pairEntry.cadences.every(c => tierEntry.cadences.includes(c));
|
|
87
|
+
|
|
88
|
+
const r723AnchorsNormalisedSorted = Array.isArray(triple)
|
|
89
|
+
? triple.map(e => {
|
|
90
|
+
if (e.anchor === 'watermark') return 'watermark text';
|
|
91
|
+
if (e.anchor === 'H2') return 'H2 section title';
|
|
92
|
+
if (e.anchor === 'zoom-level') return 'zoom-level readout';
|
|
93
|
+
if (e.anchor === 'recent') return 'recent title';
|
|
94
|
+
if (e.anchor === 'legend') return 'legend title';
|
|
95
|
+
return e.anchor;
|
|
96
|
+
}).sort()
|
|
97
|
+
: [];
|
|
98
|
+
const tierAnchorsSorted = tierEntry?.anchors ? [...tierEntry.anchors].sort() : [];
|
|
99
|
+
const tierEqualsR723 = JSON.stringify(tierAnchorsSorted) === JSON.stringify(r723AnchorsNormalisedSorted);
|
|
100
|
+
|
|
101
|
+
const results = {
|
|
102
|
+
patterns_has_8_entries: Array.isArray(patterns) && patterns.length === 8,
|
|
103
|
+
tier_entry_exists: !!tierEntry,
|
|
104
|
+
tier_cadences_6_8_9_10: !!tierCadencesCorrect,
|
|
105
|
+
tier_shape_correct: tierShapeCorrect,
|
|
106
|
+
tier_anchors_correct: !!tierAnchorsCorrect,
|
|
107
|
+
pair_anchors_subset_of_tier: pairAnchorsSubsetOfTier,
|
|
108
|
+
pair_cadences_subset_of_tier: pairCadencesSubsetOfTier,
|
|
109
|
+
tier_equals_r723_anchor_set: tierEqualsR723,
|
|
110
|
+
};
|
|
111
|
+
const ok = Object.values(results).every(Boolean);
|
|
112
|
+
console.log(`${ok ? '✅' : '❌'} R726 R717 patterns +1: triple-axis-tier (companion to R724 pair, covers full multi-cadence tier):`,
|
|
113
|
+
JSON.stringify(results, null, 2),
|
|
114
|
+
`\n tier entry: ${JSON.stringify(tierEntry)}`,
|
|
115
|
+
`\n pair entry: ${JSON.stringify(pairEntry)}`,
|
|
116
|
+
`\n R723 anchors (normalised, sorted): ${JSON.stringify(r723AnchorsNormalisedSorted)}`);
|
|
117
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/* Round 589 verification: recent-signal panel count <text>
|
|
2
|
+
* root gains filter brightness(1.15) on hoveredPanel ===
|
|
3
|
+
* 'recent'. 28th anchor in per-element brightness family.
|
|
4
|
+
* Sibling to R588 at legend panel — closes panel-pair
|
|
5
|
+
* brightness symmetry at the header-count scope.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. mock 1 flow message → recent-signal panel renders count
|
|
9
|
+
* 2. rest (no panel hover): filter='none', brightness-attr='1'
|
|
10
|
+
* 3. transition-property contains 'filter'
|
|
11
|
+
* 4. source: filter conditional + data-attr + transition extension
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
// recent-signal panel renders only when flowLinks.length > 0
|
|
41
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
|
|
42
|
+
{ from_alias: 'a·1', to_alias: 'a·2', content: 'hi', created_at: fresh },
|
|
43
|
+
] } }));
|
|
44
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
45
|
+
const page = await ctx.newPage();
|
|
46
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
47
|
+
await page.waitForSelector('[data-recent-panel-count-brightness]', { timeout: 15000, state: 'attached' });
|
|
48
|
+
await page.waitForTimeout(500);
|
|
49
|
+
|
|
50
|
+
const rest = await page.evaluate(() => {
|
|
51
|
+
const el = document.querySelector('[data-recent-panel-count-brightness]');
|
|
52
|
+
if (!el) return null;
|
|
53
|
+
const cs = getComputedStyle(el);
|
|
54
|
+
return {
|
|
55
|
+
filter: cs.filter,
|
|
56
|
+
transitionProperty: cs.transitionProperty,
|
|
57
|
+
brightnessAttr: el.getAttribute('data-recent-panel-count-brightness'),
|
|
58
|
+
letterSpacingAttr: el.getAttribute('data-recent-panel-count-letter-spacing'),
|
|
59
|
+
textContent: el.textContent,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceFilter = /filter: hoveredPanel === 'recent' \? 'brightness\(1\.15\)' : undefined/.test(src);
|
|
67
|
+
const sourceAttr = /data-recent-panel-count-brightness=\{hoveredPanel === 'recent' \? '1\.15' : '1'\}/.test(src);
|
|
68
|
+
const sourceTransition = /transition: 'letter-spacing 200ms ease-out, filter 200ms ease-out'/.test(src);
|
|
69
|
+
|
|
70
|
+
const results = {
|
|
71
|
+
count_present: !!rest,
|
|
72
|
+
rest_filter_none: rest?.filter === 'none',
|
|
73
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
74
|
+
rest_letter_spacing: rest?.letterSpacingAttr === '0.2',
|
|
75
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
76
|
+
source_filter: sourceFilter,
|
|
77
|
+
source_attr: sourceAttr,
|
|
78
|
+
source_transition: sourceTransition,
|
|
79
|
+
};
|
|
80
|
+
const ok = Object.values(results).every(Boolean);
|
|
81
|
+
console.log(`${ok ? '✅' : '❌'} R589 recent-panel-count brightness (28th anchor, panel-pair symmetry closure):`,
|
|
82
|
+
JSON.stringify(results, null, 2),
|
|
83
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
84
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/* Round 670 — "+N more flows" footer in recent-signal panel extends
|
|
2
|
+
* its single-axis brightness(1.15) hover to the multi-layer drop-
|
|
3
|
+
* shadow halo vocabulary. 29th anchor in the family. The footer is
|
|
4
|
+
* the panel's primary nav into /messages — closing its hover signature
|
|
5
|
+
* at 7 axes (densest on any topology surface).
|
|
6
|
+
*
|
|
7
|
+
* Source assertions:
|
|
8
|
+
* - filter chain uses pal.legendAccent at 0x80 + 0x40 with 2+4 stride,
|
|
9
|
+
* gated on hoveredRecentMore
|
|
10
|
+
* - data-recent-panel-more-halo-layers attr toggles '2' ↔ '0' on hover
|
|
11
|
+
*
|
|
12
|
+
* Runtime assertions:
|
|
13
|
+
* - footer present (≥6 recent messages so "+N more" shows)
|
|
14
|
+
* - rest: halo-layers='0', brightness='1', hovered='false'
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
const browser = await chromium.launch({ headless: true });
|
|
23
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
24
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
25
|
+
await ctx.addInitScript(() => {
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
28
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
29
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
30
|
+
} catch {}
|
|
31
|
+
});
|
|
32
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
33
|
+
const r = await route.fetch();
|
|
34
|
+
const b = await r.json();
|
|
35
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
36
|
+
const mk = (alias) => ({
|
|
37
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
38
|
+
network_id: nid, project_dir: null,
|
|
39
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
40
|
+
});
|
|
41
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
42
|
+
mk('a·1'), mk('a·2'), mk('a·3'), mk('a·4'), mk('a·5'),
|
|
43
|
+
mk('a·6'), mk('a·7'), mk('a·8'),
|
|
44
|
+
] } });
|
|
45
|
+
});
|
|
46
|
+
// 10 unique edges across 8 nodes — enough that "+N more flows" footer renders
|
|
47
|
+
// (recent panel caps visible rows; surplus surfaces the footer).
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: Array.from({ length: 10 }, (_, i) => ({
|
|
49
|
+
id: `m${i}`,
|
|
50
|
+
from_alias: `a·${(i % 8) + 1}`,
|
|
51
|
+
to_alias: `a·${((i + 3) % 8) + 1}`,
|
|
52
|
+
kind: i % 2 ? 'task' : 'message',
|
|
53
|
+
content: `ping ${i}`,
|
|
54
|
+
network_id: 'default',
|
|
55
|
+
created_at: fresh,
|
|
56
|
+
})) } }));
|
|
57
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
58
|
+
const page = await ctx.newPage();
|
|
59
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
60
|
+
await page.waitForSelector('[data-recent-panel-more-hovered]', { timeout: 15000, state: 'attached' });
|
|
61
|
+
await page.waitForTimeout(500);
|
|
62
|
+
|
|
63
|
+
const restState = await page.evaluate(() => {
|
|
64
|
+
const el = document.querySelector('[data-recent-panel-more-hovered]');
|
|
65
|
+
return el ? {
|
|
66
|
+
layers: el.getAttribute('data-recent-panel-more-halo-layers'),
|
|
67
|
+
hovered: el.getAttribute('data-recent-panel-more-hovered'),
|
|
68
|
+
brightness: el.getAttribute('data-recent-panel-more-brightness'),
|
|
69
|
+
} : null;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await browser.close();
|
|
73
|
+
|
|
74
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
75
|
+
const sourceFilter = /hoveredRecentMore \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
76
|
+
const sourceLayersAttr = /data-recent-panel-more-halo-layers=\{hoveredRecentMore \? '2' : '0'\}/.test(src);
|
|
77
|
+
|
|
78
|
+
const results = {
|
|
79
|
+
footer_present: !!restState,
|
|
80
|
+
rest_layers_zero: restState?.layers === '0',
|
|
81
|
+
rest_hovered_false: restState?.hovered === 'false',
|
|
82
|
+
rest_brightness_1: restState?.brightness === '1',
|
|
83
|
+
source_filter: sourceFilter,
|
|
84
|
+
source_layers_attr: sourceLayersAttr,
|
|
85
|
+
};
|
|
86
|
+
const ok = Object.values(results).every(Boolean);
|
|
87
|
+
console.log(`${ok ? '✅' : '❌'} R670 +N more footer multi-layer halo (7-axis hover closure):`,
|
|
88
|
+
JSON.stringify(results, null, 2),
|
|
89
|
+
`\n rest: ${JSON.stringify(restState)}`);
|
|
90
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* Round 634 — panel header hot-count tspan joins hot-pulse family
|
|
2
|
+
* at the panel-aggregate tier. ClassName composition combines the
|
|
3
|
+
* one-shot 'anet-fade-in' mount fade with the continuous
|
|
4
|
+
* 'anet-recent-hot-pulse' breath when hotFlowCount > 0 &&
|
|
5
|
+
* !reducedMotion. 4th anchor in hot-pulse family.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. cold (3 messages on one edge → no hot lane): hot-count
|
|
9
|
+
* tspan present but hidden (opacity=0); pulse attr 'off';
|
|
10
|
+
* className === 'anet-fade-in' (no breath)
|
|
11
|
+
* 2. hot (12 messages on one edge → 1 hot lane): tspan visible
|
|
12
|
+
* (opacity=1); pulse attr 'on'; className contains
|
|
13
|
+
* 'anet-recent-hot-pulse'; computed animation-name resolves
|
|
14
|
+
* to anet-recent-hot-pulse-kf
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
async function shoot(messageCount, label) {
|
|
23
|
+
const browser = await chromium.launch({ headless: true });
|
|
24
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
25
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
26
|
+
await ctx.addInitScript(() => {
|
|
27
|
+
try {
|
|
28
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
29
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
30
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
31
|
+
} catch {}
|
|
32
|
+
});
|
|
33
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
34
|
+
const r = await route.fetch();
|
|
35
|
+
const b = await r.json();
|
|
36
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
37
|
+
const mk = (alias) => ({
|
|
38
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
39
|
+
network_id: nid, project_dir: null,
|
|
40
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
41
|
+
});
|
|
42
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
43
|
+
});
|
|
44
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages:
|
|
45
|
+
Array.from({ length: messageCount }, (_, i) => ({
|
|
46
|
+
from_alias: 'a·1', to_alias: 'a·2', content: `msg-${i}`, created_at: fresh,
|
|
47
|
+
}))
|
|
48
|
+
} }));
|
|
49
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
50
|
+
const page = await ctx.newPage();
|
|
51
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
52
|
+
await page.waitForSelector('[data-recent-panel-hot-count]', { timeout: 15000, state: 'attached' });
|
|
53
|
+
await page.waitForTimeout(500);
|
|
54
|
+
const state = await page.evaluate(() => {
|
|
55
|
+
const el = document.querySelector('[data-recent-panel-hot-count]');
|
|
56
|
+
if (!el) return null;
|
|
57
|
+
const cs = getComputedStyle(el);
|
|
58
|
+
return {
|
|
59
|
+
hotCount: el.getAttribute('data-recent-panel-hot-count'),
|
|
60
|
+
hotVisible: el.getAttribute('data-recent-panel-hot-visible'),
|
|
61
|
+
hotPulseAttr: el.getAttribute('data-recent-panel-hot-pulse'),
|
|
62
|
+
cls: el.getAttribute('class') || '',
|
|
63
|
+
opacity: el.getAttribute('opacity'),
|
|
64
|
+
animName: cs.animationName,
|
|
65
|
+
animDuration: cs.animationDuration,
|
|
66
|
+
animIter: cs.animationIterationCount,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
await browser.close();
|
|
70
|
+
return { label, state };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const cold = await shoot(3, 'cold');
|
|
74
|
+
const hot = await shoot(12, 'hot');
|
|
75
|
+
|
|
76
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
77
|
+
const sourceClassNameGate = /className=\{hotFlowCount > 0 && !reducedMotion\s*\?\s*'anet-fade-in anet-recent-hot-pulse'\s*:\s*'anet-fade-in'\}/.test(src);
|
|
78
|
+
const sourcePulseAttr = /data-recent-panel-hot-pulse=\{hotFlowCount > 0 && !reducedMotion \? 'on' : 'off'\}/.test(src);
|
|
79
|
+
|
|
80
|
+
const results = {
|
|
81
|
+
cold_present: !!cold.state,
|
|
82
|
+
cold_hot_count_0: cold.state?.hotCount === '0',
|
|
83
|
+
cold_visible_false: cold.state?.hotVisible === 'false',
|
|
84
|
+
cold_pulse_off: cold.state?.hotPulseAttr === 'off',
|
|
85
|
+
cold_opacity_0: cold.state?.opacity === '0',
|
|
86
|
+
cold_cls_no_pulse: !/anet-recent-hot-pulse/.test(cold.state?.cls || ''),
|
|
87
|
+
cold_cls_has_fade_in: /anet-fade-in/.test(cold.state?.cls || ''),
|
|
88
|
+
hot_present: !!hot.state,
|
|
89
|
+
hot_count_1: hot.state?.hotCount === '1',
|
|
90
|
+
hot_visible_true: hot.state?.hotVisible === 'true',
|
|
91
|
+
hot_pulse_on: hot.state?.hotPulseAttr === 'on',
|
|
92
|
+
hot_opacity_1: hot.state?.opacity === '1',
|
|
93
|
+
hot_cls_has_pulse: /anet-recent-hot-pulse/.test(hot.state?.cls || ''),
|
|
94
|
+
hot_cls_has_fade_in: /anet-fade-in/.test(hot.state?.cls || ''),
|
|
95
|
+
// CSS animation-name may include both anet-fade-in + anet-recent-hot-pulse-kf
|
|
96
|
+
hot_anim_name_includes_kf: /anet-recent-hot-pulse-kf/.test(hot.state?.animName || ''),
|
|
97
|
+
source_className_gate: sourceClassNameGate,
|
|
98
|
+
source_pulse_attr: sourcePulseAttr,
|
|
99
|
+
};
|
|
100
|
+
const ok = Object.values(results).every(Boolean);
|
|
101
|
+
console.log(`${ok ? '✅' : '❌'} R634 recent-panel hot-count pulse (4th hot-pulse anchor):`,
|
|
102
|
+
JSON.stringify(results, null, 2),
|
|
103
|
+
`\n cold: ${JSON.stringify(cold.state)}`,
|
|
104
|
+
`\n hot: ${JSON.stringify(hot.state)}`);
|
|
105
|
+
process.exit(ok ? 0 : 1);
|