@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,85 @@
|
|
|
1
|
+
/* Round 709 — chrome zoom wrapper at-rest breath at 23s. Closes chrome
|
|
2
|
+
* control trio (R707 17s + R708 19s + R709 23s adjacent-prime coprime
|
|
3
|
+
* cadences). 23s slowest = "calm anchor for the viewport-control cluster".
|
|
4
|
+
* Same alpha (6%) + :has(button:hover) gate as R707/R708.
|
|
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-chrome-zoom-wrapper]', { timeout: 15000, state: 'attached' });
|
|
38
|
+
await page.waitForTimeout(300);
|
|
39
|
+
|
|
40
|
+
const runtimeState = await page.evaluate(() => {
|
|
41
|
+
const wrap = document.querySelector('[data-topo-chrome-zoom-wrapper]');
|
|
42
|
+
if (!wrap) return null;
|
|
43
|
+
const cs = getComputedStyle(wrap);
|
|
44
|
+
return {
|
|
45
|
+
has_class: wrap.classList.contains('anet-topo-chrome-zoom-wrapper-breath'),
|
|
46
|
+
breath_attr: wrap.getAttribute('data-topo-chrome-zoom-wrapper-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-chrome-zoom-wrapper-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.94;/.test(cssSrc);
|
|
59
|
+
const cssRule = /\.anet-topo-chrome-zoom-wrapper-breath\s*\{[\s\S]*?animation:\s*anet-topo-chrome-zoom-wrapper-breath-kf\s+23s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
60
|
+
const cssHoverGate = /\.anet-topo-chrome-zoom-wrapper-breath:has\(button:hover\)\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
61
|
+
const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-chrome-zoom-wrapper-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
62
|
+
const tsxClass = /anet-topo-chrome-zoom-wrapper-breath ml-1\.5/.test(tsxSrc);
|
|
63
|
+
const tsxAttr = /data-topo-chrome-zoom-wrapper-breath="23s"/.test(tsxSrc);
|
|
64
|
+
|
|
65
|
+
const runtimeAnim = runtimeState?.anim_name === 'anet-topo-chrome-zoom-wrapper-breath-kf' || runtimeState?.anim_name === 'none';
|
|
66
|
+
const runtimeDuration = runtimeState?.anim_duration === '23s' || runtimeState?.anim_name === 'none';
|
|
67
|
+
|
|
68
|
+
const results = {
|
|
69
|
+
wrapper_present: !!runtimeState,
|
|
70
|
+
has_breath_class: runtimeState?.has_class === true,
|
|
71
|
+
breath_attr_23s: runtimeState?.breath_attr === '23s',
|
|
72
|
+
runtime_anim_ok: runtimeAnim,
|
|
73
|
+
runtime_duration_ok: runtimeDuration,
|
|
74
|
+
css_keyframes: cssKeyframes,
|
|
75
|
+
css_rule: cssRule,
|
|
76
|
+
css_hover_gate: cssHoverGate,
|
|
77
|
+
css_reduced_motion: cssReducedMotion,
|
|
78
|
+
tsx_class: tsxClass,
|
|
79
|
+
tsx_breath_attr: tsxAttr,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R709 chrome zoom wrapper at-rest breath (23s prime, chrome control trio CLOSED — 17/19/23 adjacent primes):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* Round 608 — click-ripple gains drop-shadow glow that matches
|
|
2
|
+
* the ripple's stroke color. Expanding feedback ring now reads
|
|
3
|
+
* as a "lit pulse" rather than a plain stroke line.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 idle nodes → click first node → ripple renders
|
|
7
|
+
* 2. ripple element present with data-click-ripple attr
|
|
8
|
+
* 3. computed filter contains 'drop-shadow'
|
|
9
|
+
* 4. data-click-ripple-glow attr present with valid format
|
|
10
|
+
* 5. source: filter inline + data-attr extension
|
|
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
|
+
// Click hub group (role=button aria-label="Network hub...") to fire setClickRipple
|
|
44
|
+
await page.waitForSelector('[data-topo-hub-fade-delay]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
const hubBox = await page.evaluate(() => {
|
|
46
|
+
const el = document.querySelector('[data-topo-hub-fade-delay]');
|
|
47
|
+
if (!el) return null;
|
|
48
|
+
const r = el.getBoundingClientRect();
|
|
49
|
+
return { x: r.left + r.width / 2, y: r.top + r.height / 2 };
|
|
50
|
+
});
|
|
51
|
+
if (!hubBox) throw new Error('hub not found');
|
|
52
|
+
await page.mouse.click(hubBox.x, hubBox.y);
|
|
53
|
+
// Wait briefly so the ripple mounts but doesn't fully fade
|
|
54
|
+
await page.waitForSelector('[data-click-ripple]', { timeout: 5000, state: 'attached' });
|
|
55
|
+
await page.waitForTimeout(100);
|
|
56
|
+
|
|
57
|
+
const rippleState = await page.evaluate(() => {
|
|
58
|
+
const el = document.querySelector('[data-click-ripple]');
|
|
59
|
+
if (!el) return null;
|
|
60
|
+
const cs = getComputedStyle(el);
|
|
61
|
+
return {
|
|
62
|
+
filter: cs.filter,
|
|
63
|
+
glowAttr: el.getAttribute('data-click-ripple-glow'),
|
|
64
|
+
stroke: el.getAttribute('stroke'),
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await browser.close();
|
|
69
|
+
|
|
70
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
71
|
+
const sourceFilter = /filter: `drop-shadow\(0 0 4px \$\{clickRipple\.color\}99\)`/.test(src);
|
|
72
|
+
const sourceAttr = /data-click-ripple-glow=\{`0 0 4px \$\{clickRipple\.color\}99`\}/.test(src);
|
|
73
|
+
|
|
74
|
+
const results = {
|
|
75
|
+
ripple_present: !!rippleState,
|
|
76
|
+
has_drop_shadow: /drop-shadow/.test(rippleState?.filter || ''),
|
|
77
|
+
glow_attr_format: /^0 0 4px /.test(rippleState?.glowAttr || ''),
|
|
78
|
+
has_stroke: !!rippleState?.stroke,
|
|
79
|
+
source_filter: sourceFilter,
|
|
80
|
+
source_attr: sourceAttr,
|
|
81
|
+
};
|
|
82
|
+
const ok = Object.values(results).every(Boolean);
|
|
83
|
+
console.log(`${ok ? '✅' : '❌'} R608 click-ripple drop-shadow glow (click feedback enhancement):`,
|
|
84
|
+
JSON.stringify(results, null, 2),
|
|
85
|
+
`\n ripple: ${JSON.stringify(rippleState)}`);
|
|
86
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/* Round 657 — click-ripple drop-shadow gains a SECOND outer layer
|
|
2
|
+
* at 8px + 0x4c alpha (half R608 inner 0x99). 16th anchor in
|
|
3
|
+
* multi-layer halo family (1st click-feedback 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-node="a·1"]', { timeout: 15000 });
|
|
37
|
+
await page.waitForTimeout(500);
|
|
38
|
+
|
|
39
|
+
// rest: no ripple
|
|
40
|
+
const restRipple = await page.evaluate(() => !!document.querySelector('[data-click-ripple]'));
|
|
41
|
+
|
|
42
|
+
// click node → ripple mounts; poll to catch it before it self-cleans
|
|
43
|
+
await page.click('[data-node="a·1"]', { force: true });
|
|
44
|
+
let activeState = null;
|
|
45
|
+
for (let i = 0; i < 12; i++) {
|
|
46
|
+
await page.waitForTimeout(40);
|
|
47
|
+
const s = await page.evaluate(() => {
|
|
48
|
+
const el = document.querySelector('[data-click-ripple]');
|
|
49
|
+
if (!el) return null;
|
|
50
|
+
const cs = getComputedStyle(el);
|
|
51
|
+
return {
|
|
52
|
+
layers: el.getAttribute('data-click-ripple-halo-layers'),
|
|
53
|
+
filter: cs.filter,
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
if (s) { activeState = s; break; }
|
|
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: `drop-shadow\(0 0 4px \$\{clickRipple\.color\}99\) drop-shadow\(0 0 8px \$\{clickRipple\.color\}4c\)`/.test(src);
|
|
63
|
+
const sourceLayersAttr = /data-click-ripple-halo-layers="2"/.test(src);
|
|
64
|
+
|
|
65
|
+
const dropShadowCount = (activeState?.filter?.match(/drop-shadow/g) || []).length;
|
|
66
|
+
|
|
67
|
+
const results = {
|
|
68
|
+
rest_no_ripple: restRipple === false,
|
|
69
|
+
active_present: !!activeState,
|
|
70
|
+
active_layers_2: activeState?.layers === '2',
|
|
71
|
+
active_two_dropshadows: dropShadowCount === 2,
|
|
72
|
+
source_filter: sourceFilter,
|
|
73
|
+
source_layers_attr: sourceLayersAttr,
|
|
74
|
+
};
|
|
75
|
+
const ok = Object.values(results).every(Boolean);
|
|
76
|
+
console.log(`${ok ? '✅' : '❌'} R657 click-ripple multi-layer halo (1st click-feedback anchor):`,
|
|
77
|
+
JSON.stringify(results, null, 2),
|
|
78
|
+
`\n active: ${JSON.stringify(activeState)}`);
|
|
79
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* Round 631 — click-ripple gains a THIRD animate axis:
|
|
2
|
+
* stroke-width 2 → 0.5 over 500ms with the same R227 ease-out
|
|
3
|
+
* keySplines as r + opacity. Reads as a real-water-ripple thinning
|
|
4
|
+
* wavefront instead of a constant-thickness expanding line.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 2 nodes → no ripple at rest, no [data-click-ripple]
|
|
8
|
+
* 2. click a node → ripple mounts with 3 <animate> children:
|
|
9
|
+
* - r (R14/R227)
|
|
10
|
+
* - opacity (R227/R403)
|
|
11
|
+
* - stroke-width (R631 — this round)
|
|
12
|
+
* all dur=0.5s, calcMode=spline, keySplines='0.25 0.1 0.25 1',
|
|
13
|
+
* fill=freeze
|
|
14
|
+
* 3. ripple disappears after ~600ms (setClickRipple→null timeout)
|
|
15
|
+
* 4. source: stroke-width animate sits as a sibling of the opacity
|
|
16
|
+
* animate inside the [data-click-ripple] <circle>
|
|
17
|
+
*/
|
|
18
|
+
import { chromium } from 'playwright';
|
|
19
|
+
import { readFileSync } from 'node:fs';
|
|
20
|
+
|
|
21
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
22
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
23
|
+
|
|
24
|
+
const browser = await chromium.launch({ headless: true });
|
|
25
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
26
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
27
|
+
await ctx.addInitScript(() => {
|
|
28
|
+
try {
|
|
29
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
30
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
31
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
32
|
+
} catch {}
|
|
33
|
+
});
|
|
34
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
35
|
+
const r = await route.fetch();
|
|
36
|
+
const b = await r.json();
|
|
37
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
38
|
+
const mk = (alias) => ({
|
|
39
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
40
|
+
network_id: nid, project_dir: null,
|
|
41
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
42
|
+
});
|
|
43
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
44
|
+
});
|
|
45
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
46
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
47
|
+
const page = await ctx.newPage();
|
|
48
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
49
|
+
await page.waitForSelector('[data-node="a·1"]', { timeout: 15000 });
|
|
50
|
+
await page.waitForTimeout(500);
|
|
51
|
+
|
|
52
|
+
// 1. rest: no ripple
|
|
53
|
+
const restRipple = await page.evaluate(() => !!document.querySelector('[data-click-ripple]'));
|
|
54
|
+
|
|
55
|
+
// 2. click node — ripple mounts
|
|
56
|
+
await page.click('[data-node="a·1"]', { force: true });
|
|
57
|
+
// poll quickly to catch the ripple before it self-cleans
|
|
58
|
+
let activeState = null;
|
|
59
|
+
for (let i = 0; i < 12; i++) {
|
|
60
|
+
await page.waitForTimeout(40);
|
|
61
|
+
const s = await page.evaluate(() => {
|
|
62
|
+
const el = document.querySelector('[data-click-ripple]');
|
|
63
|
+
if (!el) return null;
|
|
64
|
+
const animates = Array.from(el.querySelectorAll('animate'));
|
|
65
|
+
return {
|
|
66
|
+
strokeWidth: el.getAttribute('stroke-width'),
|
|
67
|
+
animateCount: animates.length,
|
|
68
|
+
animateAttrs: animates.map(a => ({
|
|
69
|
+
attr: a.getAttribute('attributeName'),
|
|
70
|
+
dur: a.getAttribute('dur'),
|
|
71
|
+
vals: a.getAttribute('values'),
|
|
72
|
+
calc: a.getAttribute('calcMode'),
|
|
73
|
+
spl: a.getAttribute('keySplines'),
|
|
74
|
+
fill: a.getAttribute('fill'),
|
|
75
|
+
})),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
if (s) { activeState = s; break; }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
await browser.close();
|
|
82
|
+
|
|
83
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
84
|
+
const sourceSwAnimate = /<animate\s+attributeName="stroke-width"\s+values="2;0\.5"\s+dur="0\.5s"\s+calcMode="spline"\s+keyTimes="0;1"\s+keySplines="0\.25 0\.1 0\.25 1"\s+fill="freeze"/.test(src);
|
|
85
|
+
const sourceSwAttrs = /data-click-ripple-stroke-width-start="2"\s+data-click-ripple-stroke-width-end="0\.5"/.test(src);
|
|
86
|
+
|
|
87
|
+
const swAnimate = activeState?.animateAttrs?.find(a => a.attr === 'stroke-width');
|
|
88
|
+
const rAnimate = activeState?.animateAttrs?.find(a => a.attr === 'r');
|
|
89
|
+
const opAnimate = activeState?.animateAttrs?.find(a => a.attr === 'opacity');
|
|
90
|
+
|
|
91
|
+
const results = {
|
|
92
|
+
rest_no_ripple: restRipple === false,
|
|
93
|
+
active_ripple_present: activeState != null,
|
|
94
|
+
active_3_animates: activeState?.animateCount === 3,
|
|
95
|
+
active_has_r: rAnimate != null,
|
|
96
|
+
active_has_opacity: opAnimate != null,
|
|
97
|
+
active_has_sw: swAnimate != null,
|
|
98
|
+
active_sw_values: swAnimate?.vals === '2;0.5',
|
|
99
|
+
active_sw_dur: swAnimate?.dur === '0.5s',
|
|
100
|
+
active_sw_spline_easeout: swAnimate?.spl === '0.25 0.1 0.25 1',
|
|
101
|
+
active_sw_calc_spline: swAnimate?.calc === 'spline',
|
|
102
|
+
active_sw_fill_freeze: swAnimate?.fill === 'freeze',
|
|
103
|
+
source_sw_animate: sourceSwAnimate,
|
|
104
|
+
source_sw_attrs: sourceSwAttrs,
|
|
105
|
+
};
|
|
106
|
+
const ok = Object.values(results).every(Boolean);
|
|
107
|
+
console.log(`${ok ? '✅' : '❌'} R631 click-ripple stroke-width thinning (3-axis ripple):`,
|
|
108
|
+
JSON.stringify(results, null, 2),
|
|
109
|
+
`\n active: ${JSON.stringify(activeState)}`);
|
|
110
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/* Round 705 — canvas crescent moon wrapper envelope breath at 13s.
|
|
2
|
+
* Mirror to R704 watermark wrapper (15s), closing canvas-brand-pair
|
|
3
|
+
* envelope symmetry. Two coprime cadences (13 + 15) for independent
|
|
4
|
+
* voices. Tighter alpha range (0.30 ↔ 0.35) hugs the existing inline
|
|
5
|
+
* baseline.
|
|
6
|
+
*
|
|
7
|
+
* Source assertions:
|
|
8
|
+
* - TopoGraph.tsx crescent <g> has className + data-topo-brand-canvas-mark-envelope-breath
|
|
9
|
+
* - globals.css @keyframes + .class + 2 gate rules + reduced-motion guard
|
|
10
|
+
*
|
|
11
|
+
* Runtime assertions:
|
|
12
|
+
* - crescent visible (no flowLinks, default test scaffold)
|
|
13
|
+
* - data-topo-brand-canvas-mark-visible='true'
|
|
14
|
+
* - data-topo-brand-canvas-mark-envelope-breath='13s'
|
|
15
|
+
* - computed animation-name + duration 13s + iter infinite
|
|
16
|
+
*/
|
|
17
|
+
import { chromium } from 'playwright';
|
|
18
|
+
import { readFileSync } from 'node:fs';
|
|
19
|
+
|
|
20
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
21
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
22
|
+
|
|
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
|
+
// No messages → flowLinks.length === 0 → crescent visible
|
|
45
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
46
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
47
|
+
const page = await ctx.newPage();
|
|
48
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
49
|
+
await page.waitForSelector('[data-topo-brand-canvas-mark]', { timeout: 15000, state: 'attached' });
|
|
50
|
+
await page.waitForTimeout(300);
|
|
51
|
+
|
|
52
|
+
const runtimeState = await page.evaluate(() => {
|
|
53
|
+
const g = document.querySelector('[data-topo-brand-canvas-mark]');
|
|
54
|
+
if (!g) return null;
|
|
55
|
+
const cs = getComputedStyle(g);
|
|
56
|
+
return {
|
|
57
|
+
has_class: g.classList.contains('anet-topo-brand-canvas-mark-envelope-breath'),
|
|
58
|
+
breath_attr: g.getAttribute('data-topo-brand-canvas-mark-envelope-breath'),
|
|
59
|
+
visible_attr: g.getAttribute('data-topo-brand-canvas-mark-visible'),
|
|
60
|
+
recede_attr: g.getAttribute('data-topo-brand-canvas-mark-recede'),
|
|
61
|
+
anim_name: cs.animationName,
|
|
62
|
+
anim_duration: cs.animationDuration,
|
|
63
|
+
anim_iter: cs.animationIterationCount,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await browser.close();
|
|
68
|
+
|
|
69
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
70
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
71
|
+
|
|
72
|
+
const cssKeyframes = /@keyframes anet-topo-brand-canvas-mark-envelope-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*0\.35;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.30;/.test(cssSrc);
|
|
73
|
+
const cssRule = /\.anet-topo-brand-canvas-mark-envelope-breath\s*\{[\s\S]*?animation:\s*anet-topo-brand-canvas-mark-envelope-breath-kf\s+13s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
74
|
+
const cssVisibleGate = /\.anet-topo-brand-canvas-mark-envelope-breath\[data-topo-brand-canvas-mark-visible="false"\]\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
75
|
+
const cssRecedeGate = /\.anet-topo-brand-canvas-mark-envelope-breath\[data-topo-brand-canvas-mark-recede="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
76
|
+
const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-brand-canvas-mark-envelope-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
77
|
+
const tsxClass = /className="anet-topo-brand-canvas-mark-envelope-breath"/.test(tsxSrc);
|
|
78
|
+
const tsxAttr = /data-topo-brand-canvas-mark-envelope-breath="13s"/.test(tsxSrc);
|
|
79
|
+
|
|
80
|
+
const runtimeAnim = runtimeState?.anim_name === 'anet-topo-brand-canvas-mark-envelope-breath-kf' || runtimeState?.anim_name === 'none';
|
|
81
|
+
const runtimeDuration = runtimeState?.anim_duration === '13s' || runtimeState?.anim_name === 'none';
|
|
82
|
+
|
|
83
|
+
const results = {
|
|
84
|
+
wrapper_present: !!runtimeState,
|
|
85
|
+
has_breath_class: runtimeState?.has_class === true,
|
|
86
|
+
breath_attr_13s: runtimeState?.breath_attr === '13s',
|
|
87
|
+
visible_at_rest: runtimeState?.visible_attr === 'true',
|
|
88
|
+
rest_not_recede: runtimeState?.recede_attr === 'false',
|
|
89
|
+
runtime_anim_ok: runtimeAnim,
|
|
90
|
+
runtime_duration_ok: runtimeDuration,
|
|
91
|
+
css_keyframes: cssKeyframes,
|
|
92
|
+
css_rule: cssRule,
|
|
93
|
+
css_visible_gate: cssVisibleGate,
|
|
94
|
+
css_recede_gate: cssRecedeGate,
|
|
95
|
+
css_reduced_motion: cssReducedMotion,
|
|
96
|
+
tsx_class: tsxClass,
|
|
97
|
+
tsx_breath_attr: tsxAttr,
|
|
98
|
+
};
|
|
99
|
+
const ok = Object.values(results).every(Boolean);
|
|
100
|
+
console.log(`${ok ? '✅' : '❌'} R705 crescent wrapper envelope breath (13s, canvas-brand-pair envelope symmetry closed):`,
|
|
101
|
+
JSON.stringify(results, null, 2),
|
|
102
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
103
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* Round 691 — dense plain-text alias halo gate extends from hover-only
|
|
2
|
+
* (R680) to (hover || chat-target). Closes dense-mode + chat-target
|
|
3
|
+
* signaling parity at the per-node label scope — joins R616/R617/R645
|
|
4
|
+
* chat-target-gated brightness family.
|
|
5
|
+
*
|
|
6
|
+
* Source assertions:
|
|
7
|
+
* - dense alias halo-layers attr: (hoveredAlias || chatAlias) gate
|
|
8
|
+
* - dense alias filter: same OR-gate at status.primary tint 2+4
|
|
9
|
+
*
|
|
10
|
+
* Runtime assertions:
|
|
11
|
+
* - dense fleet renders (≥17 nodes → triggers dense fallback)
|
|
12
|
+
* - rest halo-layers='0' on all (no hover, no chat)
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from 'playwright';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
|
|
17
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
18
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
19
|
+
|
|
20
|
+
const browser = await chromium.launch({ headless: true });
|
|
21
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try {
|
|
25
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
26
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
27
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
28
|
+
} catch {}
|
|
29
|
+
});
|
|
30
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
31
|
+
const r = await route.fetch();
|
|
32
|
+
const b = await r.json();
|
|
33
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
34
|
+
const mk = (alias) => ({
|
|
35
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
36
|
+
network_id: nid, project_dir: null,
|
|
37
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
38
|
+
});
|
|
39
|
+
// 18 nodes → dense fallback (>16)
|
|
40
|
+
await route.fulfill({ response: r, json: { ...b, sessions: Array.from({ length: 18 }, (_, i) => mk(`a·${i + 1}`)) } });
|
|
41
|
+
});
|
|
42
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
43
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
44
|
+
const page = await ctx.newPage();
|
|
45
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
46
|
+
await page.waitForSelector('[data-node-dense-alias-text]', { timeout: 15000, state: 'attached' });
|
|
47
|
+
await page.waitForTimeout(300);
|
|
48
|
+
|
|
49
|
+
const runtimeState = await page.evaluate(() => {
|
|
50
|
+
const labels = Array.from(document.querySelectorAll('[data-node-dense-alias-text]'));
|
|
51
|
+
return {
|
|
52
|
+
count: labels.length,
|
|
53
|
+
all_layers_zero: labels.every(el => el.getAttribute('data-node-dense-alias-text-halo-layers') === '0'),
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await browser.close();
|
|
58
|
+
|
|
59
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
60
|
+
const sourceAttrGate = /data-node-dense-alias-text-halo-layers=\{\(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\) \? '2' : '0'\}/.test(src);
|
|
61
|
+
const sourceFilterGate = /filter: \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.primary\}80\) drop-shadow\(0 0 4px \$\{status\.primary\}40\)`/.test(src);
|
|
62
|
+
|
|
63
|
+
const results = {
|
|
64
|
+
dense_labels_present: runtimeState.count >= 10,
|
|
65
|
+
rest_all_layers_zero: runtimeState.all_layers_zero,
|
|
66
|
+
source_attr_gate: sourceAttrGate,
|
|
67
|
+
source_filter_gate: sourceFilterGate,
|
|
68
|
+
};
|
|
69
|
+
const ok = Object.values(results).every(Boolean);
|
|
70
|
+
console.log(`${ok ? '✅' : '❌'} R691 dense alias chat-target-gated halo (closes dense-mode chat signaling):`,
|
|
71
|
+
JSON.stringify(results, null, 2),
|
|
72
|
+
`\n runtime: ${runtimeState.count} dense labels rendered`);
|
|
73
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* Round 680 — dense plain-text alias (the >16-node fallback label)
|
|
2
|
+
* extends from group-hover:-translate-y geometry-only to 2-layer
|
|
3
|
+
* drop-shadow at status.primary tint with 2+4 stride, alpha 80/40.
|
|
4
|
+
* Closes the dense-mode alias hover signature parity with normal-
|
|
5
|
+
* mode card label (R645). 39th anchor in family — first dense-mode
|
|
6
|
+
* anchor.
|
|
7
|
+
*
|
|
8
|
+
* Source assertions:
|
|
9
|
+
* - filter uses status.primary at 0x80 + 0x40 with 2+4 stride,
|
|
10
|
+
* gated on hoveredAlias === session.alias
|
|
11
|
+
* - data-node-dense-alias-text-halo-layers attr toggles '2' ↔ '0'
|
|
12
|
+
* - transition extends with 'filter 200ms ease-out'
|
|
13
|
+
*
|
|
14
|
+
* Runtime assertions:
|
|
15
|
+
* - dense alias labels present (>16 nodes)
|
|
16
|
+
* - all rest: halo-layers='0'
|
|
17
|
+
*/
|
|
18
|
+
import { chromium } from 'playwright';
|
|
19
|
+
import { readFileSync } from 'node:fs';
|
|
20
|
+
|
|
21
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
22
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
23
|
+
|
|
24
|
+
const browser = await chromium.launch({ headless: true });
|
|
25
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
26
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
27
|
+
await ctx.addInitScript(() => {
|
|
28
|
+
try {
|
|
29
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
30
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
31
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
32
|
+
} catch {}
|
|
33
|
+
});
|
|
34
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
35
|
+
const r = await route.fetch();
|
|
36
|
+
const b = await r.json();
|
|
37
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
38
|
+
const mk = (alias) => ({
|
|
39
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
40
|
+
network_id: nid, project_dir: null,
|
|
41
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
42
|
+
});
|
|
43
|
+
// 18 nodes triggers dense fallback (>16 nodes)
|
|
44
|
+
await route.fulfill({ response: r, json: { ...b, sessions: Array.from({ length: 18 }, (_, i) => mk(`a·${i + 1}`)) } });
|
|
45
|
+
});
|
|
46
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
47
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
48
|
+
const page = await ctx.newPage();
|
|
49
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
50
|
+
await page.waitForSelector('[data-node-dense-alias-text-halo-layers]', { timeout: 15000, state: 'attached' });
|
|
51
|
+
await page.waitForTimeout(500);
|
|
52
|
+
|
|
53
|
+
const restState = await page.evaluate(() => {
|
|
54
|
+
return Array.from(document.querySelectorAll('[data-node-dense-alias-text]')).map(el => ({
|
|
55
|
+
alias: el.getAttribute('data-node-dense-alias-text'),
|
|
56
|
+
layers: el.getAttribute('data-node-dense-alias-text-halo-layers'),
|
|
57
|
+
}));
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceFilter = /filter: hoveredAlias === session\.alias\s*\?\s*`drop-shadow\(0 0 2px \$\{status\.primary\}80\) drop-shadow\(0 0 4px \$\{status\.primary\}40\)`/.test(src);
|
|
64
|
+
const sourceLayersAttr = /data-node-dense-alias-text-halo-layers=\{hoveredAlias === session\.alias \? '2' : '0'\}/.test(src);
|
|
65
|
+
const sourceTransition = /transition: 'transform 200ms ease-out, fill 300ms ease-out, filter 200ms ease-out'/.test(src);
|
|
66
|
+
|
|
67
|
+
const restAllZero = restState.every(e => e.layers === '0');
|
|
68
|
+
|
|
69
|
+
const results = {
|
|
70
|
+
dense_aliases_present: restState.length >= 10, // 18 nodes should yield ~18 dense labels
|
|
71
|
+
rest_all_layers_zero: restAllZero,
|
|
72
|
+
source_filter: sourceFilter,
|
|
73
|
+
source_layers_attr: sourceLayersAttr,
|
|
74
|
+
source_transition: sourceTransition,
|
|
75
|
+
};
|
|
76
|
+
const ok = Object.values(results).every(Boolean);
|
|
77
|
+
console.log(`${ok ? '✅' : '❌'} R680 dense plain-text alias multi-layer halo (first dense-mode anchor):`,
|
|
78
|
+
JSON.stringify(results, null, 2),
|
|
79
|
+
`\n count: ${restState.length}, sample: ${JSON.stringify(restState.slice(0, 3))}`);
|
|
80
|
+
process.exit(ok ? 0 : 1);
|