@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,127 @@
|
|
|
1
|
+
/* Round 723 — triple-axis surfaces catalog attr on canvas root. 5TH
|
|
2
|
+
* orthogonal meta-doc axis on the breath family, joining:
|
|
3
|
+
* R710 data-topo-respiratory-rolodex (cadence axis)
|
|
4
|
+
* R716 data-topo-respiratory-dual-axis-surfaces (axis axis)
|
|
5
|
+
* R717 data-topo-respiratory-patterns (pattern axis)
|
|
6
|
+
* R720 data-topo-respiratory-tiers (tier axis)
|
|
7
|
+
* R723 data-topo-respiratory-triple-axis-surfaces (multi-axis axis) ← this round
|
|
8
|
+
*
|
|
9
|
+
* Surfaces a STRICT SUBSET of R716's entries — every triple-axis
|
|
10
|
+
* surface here also appears in R716 with the same anchor + cadence +
|
|
11
|
+
* axes. Dedicated index for "give me only the >=3-axis surfaces".
|
|
12
|
+
*
|
|
13
|
+
* Assertions:
|
|
14
|
+
* - attr present on root <svg>
|
|
15
|
+
* - JSON parses to Array of exactly 2 entries (kicker + watermark)
|
|
16
|
+
* - each entry has {anchor, cadence_s, axes} shape with axes.length === 3
|
|
17
|
+
* - both at cadence_s 6
|
|
18
|
+
* - axes[0] === 'opacity' on every entry (preserved family rule)
|
|
19
|
+
* - text-shadow appears as the 3rd axis on every entry
|
|
20
|
+
* - anchor set sorted = ['kicker', 'watermark']
|
|
21
|
+
* - back-compat: every triple-axis entry also exists in R716 with
|
|
22
|
+
* same anchor, cadence_s, and axes array
|
|
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 runtimeAttrs = await page.evaluate(() => {
|
|
59
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
60
|
+
return {
|
|
61
|
+
triple: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
|
|
62
|
+
dual_axis: svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await browser.close();
|
|
67
|
+
|
|
68
|
+
let triple = null;
|
|
69
|
+
let dualAxis = null;
|
|
70
|
+
let parseError = null;
|
|
71
|
+
try {
|
|
72
|
+
triple = JSON.parse(runtimeAttrs.triple ?? '');
|
|
73
|
+
dualAxis = JSON.parse(runtimeAttrs.dual_axis ?? '');
|
|
74
|
+
} catch (e) {
|
|
75
|
+
parseError = String(e);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const validShape = Array.isArray(triple)
|
|
79
|
+
? triple.every(e => e && typeof e === 'object'
|
|
80
|
+
&& typeof e.anchor === 'string' && e.anchor.length > 0
|
|
81
|
+
&& typeof e.cadence_s === 'number' && e.cadence_s > 0
|
|
82
|
+
&& Array.isArray(e.axes) && e.axes.length === 3
|
|
83
|
+
&& e.axes.every(a => typeof a === 'string' && a.length > 0))
|
|
84
|
+
: false;
|
|
85
|
+
|
|
86
|
+
const anchors = Array.isArray(triple) ? triple.map(e => e.anchor).sort() : [];
|
|
87
|
+
const allOpacityFirst = Array.isArray(triple) ? triple.every(e => e.axes[0] === 'opacity') : false;
|
|
88
|
+
const allTextShadowThird = Array.isArray(triple) ? triple.every(e => e.axes[2] === 'text-shadow') : false;
|
|
89
|
+
/* R725 added H2 at 10 s as the 3rd triple-axis surface — the tier
|
|
90
|
+
* is now multi-cadence rather than 6 s-locked. The 6 s pair (kicker
|
|
91
|
+
* + watermark) SUBSET still exists; the all-6 s invariant is retired
|
|
92
|
+
* in favour of "every cadence ∈ rolodex" + "6 s pair intact". */
|
|
93
|
+
const cadencesInRolodex = Array.isArray(triple)
|
|
94
|
+
? triple.every(e => [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 21, 23, 25].includes(e.cadence_s))
|
|
95
|
+
: false;
|
|
96
|
+
const sixSecondAnchors = Array.isArray(triple)
|
|
97
|
+
? triple.filter(e => e.cadence_s === 6).map(e => e.anchor).sort()
|
|
98
|
+
: [];
|
|
99
|
+
const sixSecondPairIntact = JSON.stringify(sixSecondAnchors) === JSON.stringify(['kicker', 'watermark']);
|
|
100
|
+
|
|
101
|
+
const r716ByAnchor = new Map(Array.isArray(dualAxis)
|
|
102
|
+
? dualAxis.map(e => [e.anchor, e])
|
|
103
|
+
: []);
|
|
104
|
+
const backCompatStrict = Array.isArray(triple) && triple.every(e => {
|
|
105
|
+
const m = r716ByAnchor.get(e.anchor);
|
|
106
|
+
return !!m && m.cadence_s === e.cadence_s && JSON.stringify(m.axes) === JSON.stringify(e.axes);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
const results = {
|
|
110
|
+
attr_present: !!runtimeAttrs.triple,
|
|
111
|
+
json_parses: triple !== null && parseError === null,
|
|
112
|
+
is_array: Array.isArray(triple),
|
|
113
|
+
has_6_entries: Array.isArray(triple) && triple.length === 6,
|
|
114
|
+
shape_valid_three_axes: validShape,
|
|
115
|
+
anchors_match_expected: JSON.stringify(anchors) === JSON.stringify(['H2', 'kicker', 'legend', 'recent', 'watermark', 'zoom-level']),
|
|
116
|
+
all_opacity_first: allOpacityFirst,
|
|
117
|
+
all_text_shadow_third: allTextShadowThird,
|
|
118
|
+
all_cadences_in_rolodex: cadencesInRolodex,
|
|
119
|
+
six_second_pair_intact: sixSecondPairIntact,
|
|
120
|
+
back_compat_subset_of_r716: backCompatStrict,
|
|
121
|
+
};
|
|
122
|
+
const ok = Object.values(results).every(Boolean);
|
|
123
|
+
console.log(`${ok ? '✅' : '❌'} R723 triple-axis surfaces catalog (5th meta-doc — breath family pentagon):`,
|
|
124
|
+
JSON.stringify(results, null, 2),
|
|
125
|
+
`\n triple-axis: ${JSON.stringify(triple)}`,
|
|
126
|
+
parseError ? `\n parseError: ${parseError}` : '');
|
|
127
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* Round 586 verification: runtime badge outer <g> stacks
|
|
2
|
+
* brightness(1.15) onto the R559 drop-shadow on node hover.
|
|
3
|
+
* 25th anchor in per-element brightness family, 18th in
|
|
4
|
+
* stacked-filter sub-pattern.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 2 idle nodes → runtime badges render
|
|
8
|
+
* 2. rest: filter='none' on outer <g> (no hover), brightness-attr='1'
|
|
9
|
+
* 3. transition-property contains 'filter'
|
|
10
|
+
* 4. source: filter string contains 'brightness(1.15)' stacked
|
|
11
|
+
* onto drop-shadow + data-attr
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-runtime-badge-brightness]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const rest = await page.evaluate(() => {
|
|
48
|
+
const el = document.querySelector('[data-runtime-badge-brightness]');
|
|
49
|
+
if (!el) return null;
|
|
50
|
+
const cs = getComputedStyle(el);
|
|
51
|
+
return {
|
|
52
|
+
filter: cs.filter,
|
|
53
|
+
transitionProperty: cs.transitionProperty,
|
|
54
|
+
brightnessAttr: el.getAttribute('data-runtime-badge-brightness'),
|
|
55
|
+
glowAttr: el.getAttribute('data-runtime-badge-glow'),
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await browser.close();
|
|
60
|
+
|
|
61
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
62
|
+
const sourceFilter = /filter: isNodeActive\s*\?\s*`drop-shadow\(0 0 2px \$\{rt\.color\}99\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
|
|
63
|
+
const sourceAttr = /data-runtime-badge-brightness=\{isNodeActive \? '1\.15' : '1'\}/.test(src);
|
|
64
|
+
|
|
65
|
+
const results = {
|
|
66
|
+
badge_present: !!rest,
|
|
67
|
+
rest_filter_none: rest?.filter === 'none',
|
|
68
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
69
|
+
rest_glow_false: rest?.glowAttr === 'false',
|
|
70
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
71
|
+
source_filter: sourceFilter,
|
|
72
|
+
source_attr: sourceAttr,
|
|
73
|
+
};
|
|
74
|
+
const ok = Object.values(results).every(Boolean);
|
|
75
|
+
console.log(`${ok ? '✅' : '❌'} R586 runtime-badge brightness (25th anchor, badge 4-axis closure):`,
|
|
76
|
+
JSON.stringify(results, null, 2),
|
|
77
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
78
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* Round 656 — runtime badge filter gains a SECOND outer drop-shadow
|
|
2
|
+
* at 4px + 0x4c alpha (half R559 inner 0x99). 15th anchor in multi-
|
|
3
|
+
* layer halo family (1st per-node-badge anchor).
|
|
4
|
+
*/
|
|
5
|
+
import { chromium } from 'playwright';
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
|
|
8
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
9
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
10
|
+
|
|
11
|
+
const browser = await chromium.launch({ headless: true });
|
|
12
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
13
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
14
|
+
await ctx.addInitScript(() => {
|
|
15
|
+
try {
|
|
16
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
17
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
18
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
19
|
+
} catch {}
|
|
20
|
+
});
|
|
21
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
22
|
+
const r = await route.fetch();
|
|
23
|
+
const b = await r.json();
|
|
24
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
25
|
+
const mk = (alias) => ({
|
|
26
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
27
|
+
network_id: nid, project_dir: null,
|
|
28
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
29
|
+
});
|
|
30
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
31
|
+
});
|
|
32
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
33
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
34
|
+
const page = await ctx.newPage();
|
|
35
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
36
|
+
await page.waitForSelector('[data-runtime-badge-halo-layers]', { timeout: 15000, state: 'attached' });
|
|
37
|
+
await page.waitForTimeout(500);
|
|
38
|
+
|
|
39
|
+
const restBadges = await page.evaluate(() => {
|
|
40
|
+
return Array.from(document.querySelectorAll('[data-runtime-badge-halo-layers]')).map(el => ({
|
|
41
|
+
layers: el.getAttribute('data-runtime-badge-halo-layers'),
|
|
42
|
+
glow: el.getAttribute('data-runtime-badge-glow'),
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Open chat to fire isNodeActive (chat-gated per R620)
|
|
47
|
+
await page.click('[data-node="a·1"]', { force: true });
|
|
48
|
+
await page.waitForTimeout(400);
|
|
49
|
+
|
|
50
|
+
const activeState = await page.evaluate(() => {
|
|
51
|
+
const node = document.querySelector('[data-node="a·1"]');
|
|
52
|
+
if (!node) return null;
|
|
53
|
+
const badge = node.querySelector('[data-runtime-badge-halo-layers]');
|
|
54
|
+
if (!badge) return null;
|
|
55
|
+
const cs = getComputedStyle(badge);
|
|
56
|
+
return {
|
|
57
|
+
layers: badge.getAttribute('data-runtime-badge-halo-layers'),
|
|
58
|
+
glow: badge.getAttribute('data-runtime-badge-glow'),
|
|
59
|
+
filter: cs.filter,
|
|
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 = /`drop-shadow\(0 0 2px \$\{rt\.color\}99\) drop-shadow\(0 0 4px \$\{rt\.color\}4c\) brightness\(1\.15\)`/.test(src);
|
|
67
|
+
const sourceLayersAttr = /data-runtime-badge-halo-layers=\{isNodeActive \? '2' : '0'\}/.test(src);
|
|
68
|
+
|
|
69
|
+
const dropShadowCount = (activeState?.filter?.match(/drop-shadow/g) || []).length;
|
|
70
|
+
const restAllZero = restBadges.every(b => b.layers === '0' && b.glow === 'false');
|
|
71
|
+
|
|
72
|
+
const results = {
|
|
73
|
+
badges_present: restBadges.length >= 2,
|
|
74
|
+
rest_all_zero: restAllZero,
|
|
75
|
+
active_present: !!activeState,
|
|
76
|
+
active_layers_2: activeState?.layers === '2',
|
|
77
|
+
active_glow_true: activeState?.glow === 'true',
|
|
78
|
+
active_two_dropshadows: dropShadowCount === 2,
|
|
79
|
+
source_filter: sourceFilter,
|
|
80
|
+
source_layers_attr: sourceLayersAttr,
|
|
81
|
+
};
|
|
82
|
+
const ok = Object.values(results).every(Boolean);
|
|
83
|
+
console.log(`${ok ? '✅' : '❌'} R656 runtime badge multi-layer halo (1st per-node-badge anchor):`,
|
|
84
|
+
JSON.stringify(results, null, 2),
|
|
85
|
+
`\n rest: ${JSON.stringify(restBadges)}`,
|
|
86
|
+
`\n active: ${JSON.stringify(activeState)}`);
|
|
87
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 599 verification: runtime badge outer <g> gains
|
|
2
|
+
* hover-rotate-3 via CSS individual `rotate` property. 5th
|
|
3
|
+
* anchor in hover-rotate idiom (R350/R547/R549/R576/R599).
|
|
4
|
+
* Extends runtime badge hover signature to 6 axes.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 2 idle nodes → runtime badges render
|
|
8
|
+
* 2. rest: rotate='0deg' (or 'none'), rotate-attr='0'
|
|
9
|
+
* 3. computed transition-property contains 'rotate'
|
|
10
|
+
* 4. transform-origin set to badge center coords
|
|
11
|
+
* 5. source: rotate 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
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-runtime-badge-rotate]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const rest = await page.evaluate(() => {
|
|
48
|
+
const el = document.querySelector('[data-runtime-badge-rotate]');
|
|
49
|
+
if (!el) return null;
|
|
50
|
+
const cs = getComputedStyle(el);
|
|
51
|
+
return {
|
|
52
|
+
rotate: cs.rotate,
|
|
53
|
+
transformOrigin: cs.transformOrigin,
|
|
54
|
+
transitionProperty: cs.transitionProperty,
|
|
55
|
+
rotateAttr: el.getAttribute('data-runtime-badge-rotate'),
|
|
56
|
+
glowAttr: el.getAttribute('data-runtime-badge-glow'),
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceRotate = /rotate: isNodeActive \? '3deg' : '0deg'/.test(src);
|
|
64
|
+
const sourceAttr = /data-runtime-badge-rotate=\{isNodeActive \? '3' : '0'\}/.test(src);
|
|
65
|
+
const sourceTransformOrigin = /transformOrigin: `\$\{bx\}px \$\{by\}px`/.test(src);
|
|
66
|
+
const sourceTransition = /transition: 'filter 150ms ease-out, rotate 150ms ease-out'/.test(src);
|
|
67
|
+
|
|
68
|
+
const results = {
|
|
69
|
+
badge_present: !!rest,
|
|
70
|
+
// CSS rotate at rest = 'none' or '0deg' depending on browser
|
|
71
|
+
rest_rotate_zero: rest?.rotate === 'none' || rest?.rotate === '0deg',
|
|
72
|
+
rest_rotate_attr: rest?.rotateAttr === '0',
|
|
73
|
+
rest_glow_false: rest?.glowAttr === 'false',
|
|
74
|
+
has_transform_origin: !!rest?.transformOrigin && rest.transformOrigin !== '',
|
|
75
|
+
transition_has_rotate: /rotate/.test(rest?.transitionProperty || ''),
|
|
76
|
+
source_rotate: sourceRotate,
|
|
77
|
+
source_attr: sourceAttr,
|
|
78
|
+
source_transform_origin: sourceTransformOrigin,
|
|
79
|
+
source_transition: sourceTransition,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R599 runtime-badge rotate (5th hover-rotate anchor, badge 6-axis):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/* Round 702 — H2 "Command mesh" at-rest breathing fade. Completes the
|
|
2
|
+
* title-block respiratory trio: brand-logo (R553) 5s + kicker (R699) 6s
|
|
3
|
+
* + H2 (R702) 10s. Tighter alpha range (0.88↔1) than kicker for the
|
|
4
|
+
* heavier text weight.
|
|
5
|
+
*/
|
|
6
|
+
import { chromium } from 'playwright';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
|
|
9
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
10
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
11
|
+
|
|
12
|
+
const browser = await chromium.launch({ headless: true });
|
|
13
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
14
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
15
|
+
await ctx.addInitScript(() => {
|
|
16
|
+
try {
|
|
17
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
18
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
19
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
20
|
+
} catch {}
|
|
21
|
+
});
|
|
22
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
23
|
+
const r = await route.fetch();
|
|
24
|
+
const b = await r.json();
|
|
25
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
26
|
+
const mk = (alias) => ({
|
|
27
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
28
|
+
network_id: nid, project_dir: null,
|
|
29
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
30
|
+
});
|
|
31
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
32
|
+
});
|
|
33
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
34
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
35
|
+
const page = await ctx.newPage();
|
|
36
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
37
|
+
await page.waitForSelector('[data-topo-section-title]', { timeout: 15000, state: 'attached' });
|
|
38
|
+
await page.waitForTimeout(300);
|
|
39
|
+
|
|
40
|
+
const runtimeState = await page.evaluate(() => {
|
|
41
|
+
const h2 = document.querySelector('[data-topo-section-title]');
|
|
42
|
+
if (!h2) return null;
|
|
43
|
+
const cs = getComputedStyle(h2);
|
|
44
|
+
return {
|
|
45
|
+
has_class: h2.classList.contains('anet-topo-section-title-breath'),
|
|
46
|
+
breath_attr: h2.getAttribute('data-topo-section-title-breath'),
|
|
47
|
+
anim_name: cs.animationName,
|
|
48
|
+
anim_duration: cs.animationDuration,
|
|
49
|
+
anim_iter: cs.animationIterationCount,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
await browser.close();
|
|
54
|
+
|
|
55
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
56
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
57
|
+
|
|
58
|
+
const cssKeyframes = /@keyframes anet-topo-section-title-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.88;/.test(cssSrc);
|
|
59
|
+
const cssRule = /\.anet-topo-section-title-breath\s*\{[\s\S]*?animation:\s*anet-topo-section-title-breath-kf\s+10s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
60
|
+
const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-section-title-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
61
|
+
const tsxClass = /anet-topo-section-title-breath text-lg/.test(tsxSrc);
|
|
62
|
+
const tsxAttr = /data-topo-section-title-breath="10s"/.test(tsxSrc);
|
|
63
|
+
|
|
64
|
+
const runtimeAnim = runtimeState?.anim_name === 'anet-topo-section-title-breath-kf' || runtimeState?.anim_name === 'none';
|
|
65
|
+
const runtimeDuration = runtimeState?.anim_duration === '10s' || runtimeState?.anim_name === 'none';
|
|
66
|
+
|
|
67
|
+
const results = {
|
|
68
|
+
h2_present: !!runtimeState,
|
|
69
|
+
has_breath_class: runtimeState?.has_class === true,
|
|
70
|
+
breath_attr_10s: runtimeState?.breath_attr === '10s',
|
|
71
|
+
runtime_anim_ok: runtimeAnim,
|
|
72
|
+
runtime_duration_ok: runtimeDuration,
|
|
73
|
+
css_keyframes: cssKeyframes,
|
|
74
|
+
css_rule: cssRule,
|
|
75
|
+
css_reduced_motion: cssReducedMotion,
|
|
76
|
+
tsx_class: tsxClass,
|
|
77
|
+
tsx_breath_attr: tsxAttr,
|
|
78
|
+
};
|
|
79
|
+
const ok = Object.values(results).every(Boolean);
|
|
80
|
+
console.log(`${ok ? '✅' : '❌'} R702 H2 "Command mesh" at-rest breath (title-block trio closed — 10s):`,
|
|
81
|
+
JSON.stringify(results, null, 2),
|
|
82
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
83
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/* Round 684 — H2 title "Command mesh" extends from 2 typographic hover
|
|
2
|
+
* axes (R554 tracking-tighter + R556 font-bold via group-hover) to
|
|
3
|
+
* also include a multi-layer halo paint axis. Sibling to R683 brand
|
|
4
|
+
* logo (both lift together when ANY surface in the title-block cluster
|
|
5
|
+
* is hovered).
|
|
6
|
+
*
|
|
7
|
+
* Implemented via CSS rule targeting `[data-topo-section-titleblock-
|
|
8
|
+
* group]:hover [data-topo-section-title]` — 2-layer drop-shadow at
|
|
9
|
+
* currentColor (inherits H2 fill), 4+8px stride.
|
|
10
|
+
*
|
|
11
|
+
* Source assertions:
|
|
12
|
+
* - globals.css has the cluster-hover descendant rule with 2 drop-
|
|
13
|
+
* shadow layers
|
|
14
|
+
* - globals.css has transition on the H2 including 'filter 200ms'
|
|
15
|
+
* - TopoGraph.tsx H2 has data-topo-section-title-halo-layers="2"
|
|
16
|
+
*
|
|
17
|
+
* Runtime assertions:
|
|
18
|
+
* - H2 element present with data-topo-section-title-halo-layers="2"
|
|
19
|
+
* - title-block wrapper present (group hover target)
|
|
20
|
+
*/
|
|
21
|
+
import { chromium } from 'playwright';
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
|
|
24
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
25
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
26
|
+
|
|
27
|
+
const browser = await chromium.launch({ headless: true });
|
|
28
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
29
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
30
|
+
await ctx.addInitScript(() => {
|
|
31
|
+
try {
|
|
32
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
33
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
34
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
35
|
+
} catch {}
|
|
36
|
+
});
|
|
37
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
38
|
+
const r = await route.fetch();
|
|
39
|
+
const b = await r.json();
|
|
40
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
41
|
+
const mk = (alias) => ({
|
|
42
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
43
|
+
network_id: nid, project_dir: null,
|
|
44
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
45
|
+
});
|
|
46
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
47
|
+
});
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
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-topo-section-title]', { timeout: 15000, state: 'attached' });
|
|
53
|
+
await page.waitForTimeout(300);
|
|
54
|
+
|
|
55
|
+
const runtimeState = await page.evaluate(() => {
|
|
56
|
+
const title = document.querySelector('[data-topo-section-title]');
|
|
57
|
+
const wrap = document.querySelector('[data-topo-section-titleblock-group]');
|
|
58
|
+
return {
|
|
59
|
+
title_present: !!title,
|
|
60
|
+
wrap_present: !!wrap,
|
|
61
|
+
halo_layers: title?.getAttribute('data-topo-section-title-halo-layers'),
|
|
62
|
+
text: title?.textContent,
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await browser.close();
|
|
67
|
+
|
|
68
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
69
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
70
|
+
|
|
71
|
+
const cssHoverRule = /\[data-topo-section-titleblock-group\]:hover \[data-topo-section-title\]\s*\{[\s\S]*?drop-shadow\(0 0 4px currentColor\)[\s\S]*?drop-shadow\(0 0 8px currentColor\)/.test(cssSrc);
|
|
72
|
+
const cssTransition = /\[data-topo-section-title\]\s*\{[\s\S]*?transition:[\s\S]*?filter 200ms/.test(cssSrc);
|
|
73
|
+
const tsxHaloAttr = /data-topo-section-title-halo-layers="2"/.test(tsxSrc);
|
|
74
|
+
|
|
75
|
+
const results = {
|
|
76
|
+
title_present: runtimeState.title_present,
|
|
77
|
+
wrap_present: runtimeState.wrap_present,
|
|
78
|
+
runtime_halo_layers: runtimeState.halo_layers === '2',
|
|
79
|
+
runtime_text: runtimeState.text === 'Command mesh',
|
|
80
|
+
css_hover_rule: cssHoverRule,
|
|
81
|
+
css_transition: cssTransition,
|
|
82
|
+
tsx_halo_attr: tsxHaloAttr,
|
|
83
|
+
};
|
|
84
|
+
const ok = Object.values(results).every(Boolean);
|
|
85
|
+
console.log(`${ok ? '✅' : '❌'} R684 H2 title multi-layer halo (sibling to R683 brand logo):`,
|
|
86
|
+
JSON.stringify(results, null, 2),
|
|
87
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
88
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* Round 622 — extend hub-spoke isHoveredSpoke gate to include
|
|
2
|
+
* chatAlias. Single conceptual change cascades the spoke's
|
|
3
|
+
* opacity + sw axes to also fire on chat-target. 8th anchor in
|
|
4
|
+
* chat-target-gated brightness family.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 2 idle nodes → hub-spokes render
|
|
8
|
+
* 2. rest: spoke at idle opacity (0.50) + idle sw (1)
|
|
9
|
+
* 3. source: isHoveredSpoke declaration uses gate union
|
|
10
|
+
* (hoveredAlias || chatAlias)
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
|
|
15
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
16
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
17
|
+
|
|
18
|
+
const browser = await chromium.launch({ headless: true });
|
|
19
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
20
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
21
|
+
await ctx.addInitScript(() => {
|
|
22
|
+
try {
|
|
23
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
24
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
25
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
29
|
+
const r = await route.fetch();
|
|
30
|
+
const b = await r.json();
|
|
31
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
32
|
+
const mk = (alias) => ({
|
|
33
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
34
|
+
network_id: nid, project_dir: null,
|
|
35
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
36
|
+
});
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
43
|
+
await page.waitForSelector('[data-topo-hub-spoke-hovered]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-topo-hub-spoke-hovered]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
return {
|
|
50
|
+
hoveredAttr: el.getAttribute('data-topo-hub-spoke-hovered'),
|
|
51
|
+
opacityAttr: el.getAttribute('data-topo-hub-spoke-opacity'),
|
|
52
|
+
swAttr: el.getAttribute('data-topo-hub-spoke-stroke-width'),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
await browser.close();
|
|
57
|
+
|
|
58
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
59
|
+
const sourceGate = /const isHoveredSpoke = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
|
|
60
|
+
|
|
61
|
+
const results = {
|
|
62
|
+
spoke_present: !!rest,
|
|
63
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
64
|
+
rest_opacity_idle: rest?.opacityAttr === '0.5', // idle no-hover
|
|
65
|
+
rest_sw_idle: rest?.swAttr === '1', // idle no-hover
|
|
66
|
+
source_gate_or: sourceGate,
|
|
67
|
+
};
|
|
68
|
+
const ok = Object.values(results).every(Boolean);
|
|
69
|
+
console.log(`${ok ? '✅' : '❌'} R622 hub-spoke chat-target gate (chat-gated family 8th anchor):`,
|
|
70
|
+
JSON.stringify(results, null, 2),
|
|
71
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
72
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* Round 664 — status filter pin pill drop-shadow gains a 2nd outer
|
|
2
|
+
* layer at 6px + 0x4c alpha. 23rd anchor in multi-layer halo family
|
|
3
|
+
* (4th chip-row tier anchor, completing the chip-row tier).
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
|
|
7
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
8
|
+
// Source carries a 2-drop-shadow chain in the status pin pill filter
|
|
9
|
+
const sourceTwoDropShadows = /\}99\) drop-shadow\(0 0 6px \$\{[\s\S]{0,400}\}4c\)/.test(src);
|
|
10
|
+
|
|
11
|
+
const results = {
|
|
12
|
+
source_two_drop_shadows: sourceTwoDropShadows,
|
|
13
|
+
};
|
|
14
|
+
const ok = Object.values(results).every(Boolean);
|
|
15
|
+
console.log(`${ok ? '✅' : '❌'} R664 status filter pin pill multi-layer halo (completes chip-row tier 4/4):`,
|
|
16
|
+
JSON.stringify(results, null, 2));
|
|
17
|
+
process.exit(ok ? 0 : 1);
|