@sleep2agi/agent-network-dashboard 0.5.3 → 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 +4 -4
- 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/{0ph1in3421~o-.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 +6686 -248
- package/app/globals.css +897 -7
- 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-chrome-hover-text-test.mjs +107 -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-hover-test.mjs +104 -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-breath-test.mjs +102 -0
- package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
- package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
- package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
- package/scripts/topo-brand-logo-hover-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-chip-row-digit-ls-test.mjs +135 -0
- package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
- package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
- package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -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-cluster-count-attr-test.mjs +80 -0
- package/scripts/topo-crescent-breath-test.mjs +104 -0
- package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
- package/scripts/topo-crescent-recede-test.mjs +111 -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-badge-hover-glow-test.mjs +90 -0
- package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -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-brightness-test.mjs +82 -0
- package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
- package/scripts/topo-edge-pill-glow-test.mjs +67 -0
- package/scripts/topo-edge-pin-halo-test.mjs +99 -0
- package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
- package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -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-glow-test.mjs +90 -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-flow-rail-brightness-test.mjs +80 -0
- package/scripts/topo-fullscreen-attr-test.mjs +73 -0
- package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
- package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
- package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -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-brightness-test.mjs +84 -0
- package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
- package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
- package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
- package/scripts/topo-group-pill-glow-test.mjs +76 -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-brightness-test.mjs +79 -0
- package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-digit-ls-test.mjs +119 -0
- package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
- package/scripts/topo-hub-halo-glow-test.mjs +96 -0
- package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
- package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
- package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
- package/scripts/topo-hub-highlight-r-test.mjs +112 -0
- package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
- package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
- package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
- package/scripts/topo-hub-spoke-glow-test.mjs +112 -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-hover-fw-test.mjs +98 -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-count-letter-spacing-test.mjs +108 -0
- package/scripts/topo-legend-label-fw-test.mjs +107 -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-row-label-glow-test.mjs +102 -0
- package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
- package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -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-hover-glow-test.mjs +109 -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-alias-brightness-test.mjs +84 -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-node-sub-text-brightness-test.mjs +88 -0
- package/scripts/topo-nodesize-brightness-test.mjs +82 -0
- package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
- package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
- package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
- package/scripts/topo-overlap-test.mjs +22 -8
- package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
- package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
- package/scripts/topo-panel-rect-halo-test.mjs +90 -0
- package/scripts/topo-panel-row-brightness-test.mjs +116 -0
- package/scripts/topo-panel-title-brightness-test.mjs +98 -0
- package/scripts/topo-panel-title-glow-test.mjs +111 -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-pill-x-rotate-test.mjs +96 -0
- package/scripts/topo-pip-brightness-test.mjs +85 -0
- package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
- package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
- package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
- package/scripts/topo-pressure-seg-motion-test.mjs +101 -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-fw-test.mjs +126 -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-fw-test.mjs +115 -0
- package/scripts/topo-recent-row-text-glow-test.mjs +86 -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-reduced-motion-attr-test.mjs +69 -0
- package/scripts/topo-reset-brightness-test.mjs +83 -0
- package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -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-glow-test.mjs +108 -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-starfield-hue-test.mjs +109 -0
- package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
- package/scripts/topo-status-ring-brightness-test.mjs +84 -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-titleblock-h2-hover-fw-test.mjs +109 -0
- package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
- package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
- package/scripts/topo-tree-diag.mjs +95 -0
- package/scripts/topo-vendor-chip-glow-test.mjs +97 -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-vendor-pill-glow-test.mjs +98 -0
- package/scripts/topo-watermark-breath-test.mjs +100 -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-recede-test.mjs +114 -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-color-test.mjs +105 -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/0fuba20p57-zo.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- package/.next/static/chunks/10cj-86disers.js +0 -1
- package/.next/static/chunks/158h2g7f-nxbt.js +0 -4
- /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/{tQ1EtcEiS7ikgAoAyZWm7 → xq88BMF7fMUHWh10yaKTn}/_buildManifest.js +0 -0
- /package/.next/static/{tQ1EtcEiS7ikgAoAyZWm7 → xq88BMF7fMUHWh10yaKTn}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{tQ1EtcEiS7ikgAoAyZWm7 → xq88BMF7fMUHWh10yaKTn}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* Round 713 — panel-pair dual-axis breath. Both recent + legend panel
|
|
2
|
+
* titles gain a 2nd SVG <animate> for font-size at the same 8s cadence
|
|
3
|
+
* as their R700/R701 opacity breath. Closes panel-pair dual-axis
|
|
4
|
+
* symmetry under the primary-identity dual-axis rule (R711 H2 +
|
|
5
|
+
* R712 watermark established the pattern; R713 closes the panel pair).
|
|
6
|
+
*/
|
|
7
|
+
import { chromium } from 'playwright';
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
|
|
10
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
11
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
12
|
+
|
|
13
|
+
const browser = await chromium.launch({ headless: true });
|
|
14
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
15
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
16
|
+
await ctx.addInitScript(() => {
|
|
17
|
+
try {
|
|
18
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
19
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
20
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
21
|
+
} catch {}
|
|
22
|
+
});
|
|
23
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
24
|
+
const r = await route.fetch();
|
|
25
|
+
const b = await r.json();
|
|
26
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
27
|
+
const mk = (alias) => ({
|
|
28
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
29
|
+
network_id: nid, project_dir: null,
|
|
30
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
31
|
+
});
|
|
32
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2'), mk('a·3')] } });
|
|
33
|
+
});
|
|
34
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
|
|
35
|
+
{ id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'message', content: 'p', network_id: 'default', created_at: fresh },
|
|
36
|
+
] } }));
|
|
37
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
38
|
+
const page = await ctx.newPage();
|
|
39
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
40
|
+
await page.waitForSelector('[data-legend-panel-title]', { timeout: 15000, state: 'attached' });
|
|
41
|
+
await page.waitForTimeout(300);
|
|
42
|
+
|
|
43
|
+
const runtimeState = await page.evaluate(() => {
|
|
44
|
+
const recent = document.querySelector('[data-recent-panel-title]');
|
|
45
|
+
const legend = document.querySelector('[data-legend-panel-title]');
|
|
46
|
+
const probe = (text) => {
|
|
47
|
+
if (!text) return null;
|
|
48
|
+
const opAnim = text.querySelector('animate[attributeName="opacity"]');
|
|
49
|
+
const fsAnim = text.querySelector('animate[attributeName="font-size"]');
|
|
50
|
+
return {
|
|
51
|
+
opacity_dur: opAnim?.getAttribute('dur'),
|
|
52
|
+
opacity_values: opAnim?.getAttribute('values'),
|
|
53
|
+
fontsize_present: !!fsAnim,
|
|
54
|
+
fontsize_dur: fsAnim?.getAttribute('dur'),
|
|
55
|
+
fontsize_values: fsAnim?.getAttribute('values'),
|
|
56
|
+
fontsize_repeat: fsAnim?.getAttribute('repeatCount'),
|
|
57
|
+
breath_axis_2: text.getAttribute(text === recent ? 'data-recent-panel-title-breath-axis-2' : 'data-legend-panel-title-breath-axis-2'),
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
return {
|
|
61
|
+
recent: probe(recent),
|
|
62
|
+
legend: probe(legend),
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await browser.close();
|
|
67
|
+
|
|
68
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
69
|
+
const fontSizeAnimateCount = (tsxSrc.match(/<animate attributeName="font-size" values="11\.96;12\.04;11\.96" dur="8s" repeatCount="indefinite" \/>/g) || []).length;
|
|
70
|
+
const tsxRecentAxis2 = /data-recent-panel-title-breath-axis-2=\{!reducedMotion && !activeEdgeKey \? 'font-size' : 'off'\}/.test(tsxSrc);
|
|
71
|
+
const tsxLegendAxis2 = /data-legend-panel-title-breath-axis-2=\{!reducedMotion && !pinnedStatus \? 'font-size' : 'off'\}/.test(tsxSrc);
|
|
72
|
+
|
|
73
|
+
const results = {
|
|
74
|
+
recent_opacity_kept: runtimeState?.recent?.opacity_values === '0.78;1;0.78',
|
|
75
|
+
recent_opacity_dur_8s: runtimeState?.recent?.opacity_dur === '8s',
|
|
76
|
+
recent_fontsize_present: runtimeState?.recent?.fontsize_present === true,
|
|
77
|
+
recent_fontsize_dur_8s: runtimeState?.recent?.fontsize_dur === '8s',
|
|
78
|
+
recent_fontsize_values: runtimeState?.recent?.fontsize_values === '11.96;12.04;11.96',
|
|
79
|
+
recent_axis_2_attr: runtimeState?.recent?.breath_axis_2 === 'font-size',
|
|
80
|
+
legend_opacity_kept: runtimeState?.legend?.opacity_values === '0.78;1;0.78',
|
|
81
|
+
legend_fontsize_present: runtimeState?.legend?.fontsize_present === true,
|
|
82
|
+
legend_fontsize_dur_8s: runtimeState?.legend?.fontsize_dur === '8s',
|
|
83
|
+
legend_fontsize_values: runtimeState?.legend?.fontsize_values === '11.96;12.04;11.96',
|
|
84
|
+
legend_axis_2_attr: runtimeState?.legend?.breath_axis_2 === 'font-size',
|
|
85
|
+
tsx_count_2: fontSizeAnimateCount === 2,
|
|
86
|
+
tsx_recent_axis_2: tsxRecentAxis2,
|
|
87
|
+
tsx_legend_axis_2: tsxLegendAxis2,
|
|
88
|
+
};
|
|
89
|
+
const ok = Object.values(results).every(Boolean);
|
|
90
|
+
console.log(`${ok ? '✅' : '❌'} R713 panel-pair dual-axis breath (opacity + font-size at 8s, panel-pair symmetric closure):`,
|
|
91
|
+
JSON.stringify(results, null, 2),
|
|
92
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`,
|
|
93
|
+
`\n tsx font-size animate count: ${fontSizeAnimateCount}`);
|
|
94
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* Round 660 · MILESTONE — recent-panel + legend-panel titles
|
|
2
|
+
* drop-shadow gains a SECOND outer drop-shadow at 4px + 0x40 alpha
|
|
3
|
+
* (half R550 inner 0x80). 19th anchor in multi-layer halo family
|
|
4
|
+
* — covers 2 sibling panel-title surfaces in one replace_all sweep.
|
|
5
|
+
*
|
|
6
|
+
* Test: source-only — both panel-title filter sites stack 2 drop-
|
|
7
|
+
* shadows.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
|
|
11
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
12
|
+
const pattern = /\? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined \}\}/g;
|
|
13
|
+
const matches = (src.match(pattern) || []).length;
|
|
14
|
+
|
|
15
|
+
const results = {
|
|
16
|
+
// 2 panel titles (recent + legend) — both should match the new pattern
|
|
17
|
+
source_two_titles: matches === 2,
|
|
18
|
+
};
|
|
19
|
+
const ok = Object.values(results).every(Boolean);
|
|
20
|
+
console.log(`${ok ? '✅' : '❌'} R660 panel-titles multi-layer halo (2 sibling titles in one sweep):`,
|
|
21
|
+
JSON.stringify(results, null, 2),
|
|
22
|
+
`\n matches: ${matches}`);
|
|
23
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/* Round 728 — recent + legend panel titles join the triple-axis tier
|
|
2
|
+
* at 8 s, forming the "8 s triple-axis PAIR" (mirror to R724's 6 s
|
|
3
|
+
* pair). 5th + 6th triple-axis surfaces. CSS text-shadow axis added
|
|
4
|
+
* via shared class `.anet-topo-panel-title-glow-breath`; SMIL opacity
|
|
5
|
+
* (R700/R701) + SMIL font-size (R713) axes preserved.
|
|
6
|
+
*
|
|
7
|
+
* Triple-axis tier post-R728 (6 members across 4 cadences):
|
|
8
|
+
* 6 s kicker + watermark (R724 "6 s pair")
|
|
9
|
+
* 8 s recent + legend titles (R728 "8 s pair") ← this round
|
|
10
|
+
* 9 s zoom-level readout (R727)
|
|
11
|
+
* 10 s H2 section title (R725)
|
|
12
|
+
*
|
|
13
|
+
* Assertions:
|
|
14
|
+
* - CSS keyframes 0%/100% has text-shadow: none
|
|
15
|
+
* - CSS keyframes 50% has text-shadow: 0 0 7px rgba(34, 211, 238, 0.23)
|
|
16
|
+
* - .anet-topo-panel-title-glow-breath rule binds 8 s cadence
|
|
17
|
+
* - prefers-reduced-motion guard present
|
|
18
|
+
* - runtime recent title has class + breath-axis-3 attr = "text-shadow"
|
|
19
|
+
* - runtime legend title has class + breath-axis-3 attr = "text-shadow"
|
|
20
|
+
* - R716 catalog recent + legend entries axes = ["opacity", "font-size", "text-shadow"]
|
|
21
|
+
* - R723 catalog has 6 entries (incl. recent + legend with cadence 8)
|
|
22
|
+
* - text-shadow appears on 6 surfaces (kicker + watermark + recent + legend + zoom-level + H2)
|
|
23
|
+
* - 6 s pair still intact (R724 invariant: kicker + watermark @ 6 s)
|
|
24
|
+
* - R717 has new `triple-axis-pair-8s` pattern with anchors [recent, legend]
|
|
25
|
+
* - R717 `triple-axis-tier` cadences = [6, 8, 9, 10] (8 added)
|
|
26
|
+
* - R717 `triple-axis-tier` includes recent + legend titles
|
|
27
|
+
* - pair_8s shape = "8s-triple-pair" (structural mirror to R724)
|
|
28
|
+
*/
|
|
29
|
+
import { chromium } from 'playwright';
|
|
30
|
+
import { readFileSync } from 'node:fs';
|
|
31
|
+
|
|
32
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
33
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
34
|
+
|
|
35
|
+
const browser = await chromium.launch({ headless: true });
|
|
36
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
37
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
38
|
+
await ctx.addInitScript(() => {
|
|
39
|
+
try {
|
|
40
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
41
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
42
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
43
|
+
} catch {}
|
|
44
|
+
});
|
|
45
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
46
|
+
const r = await route.fetch();
|
|
47
|
+
const b = await r.json();
|
|
48
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
49
|
+
const mk = (alias) => ({
|
|
50
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
51
|
+
network_id: nid, project_dir: null,
|
|
52
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
53
|
+
});
|
|
54
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
55
|
+
});
|
|
56
|
+
/* The recent panel renders only when flowLinks.length > 0 (derived from
|
|
57
|
+
* hub messages). Mock a single message so the recent-signal panel mounts
|
|
58
|
+
* and its title is in the DOM for the R728 class+attr assertions. */
|
|
59
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
|
|
60
|
+
{ id: 'm1', from: 'a·1', to: 'a·2', content: 'probe', created_at: fresh, kind: 'message' },
|
|
61
|
+
] } }));
|
|
62
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
63
|
+
const page = await ctx.newPage();
|
|
64
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
65
|
+
await page.waitForSelector('[data-topo-canvas-aria]', { timeout: 15000, state: 'attached' });
|
|
66
|
+
await page.waitForTimeout(300);
|
|
67
|
+
|
|
68
|
+
const runtimeState = await page.evaluate(() => {
|
|
69
|
+
const recent = document.querySelector('[data-recent-panel-title]');
|
|
70
|
+
const legend = document.querySelector('[data-legend-panel-title]');
|
|
71
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
72
|
+
return {
|
|
73
|
+
recent_present: !!recent,
|
|
74
|
+
recent_has_class: recent?.classList.contains('anet-topo-panel-title-glow-breath') ?? null,
|
|
75
|
+
recent_axis_3: recent?.getAttribute('data-recent-panel-title-breath-axis-3') ?? null,
|
|
76
|
+
legend_present: !!legend,
|
|
77
|
+
legend_has_class: legend?.classList.contains('anet-topo-panel-title-glow-breath') ?? null,
|
|
78
|
+
legend_axis_3: legend?.getAttribute('data-legend-panel-title-breath-axis-3') ?? null,
|
|
79
|
+
dual_axis: svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null,
|
|
80
|
+
triple_axis: svg?.getAttribute('data-topo-respiratory-triple-axis-surfaces') ?? null,
|
|
81
|
+
patterns: svg?.getAttribute('data-topo-respiratory-patterns') ?? null,
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
await browser.close();
|
|
86
|
+
|
|
87
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
88
|
+
const cssKfNone = /@keyframes anet-topo-panel-title-glow-breath-kf\s*\{[\s\S]*?0%,\s*100%\s*\{[\s\S]*?text-shadow:\s*none/.test(cssSrc);
|
|
89
|
+
const cssKfGlow = /@keyframes anet-topo-panel-title-glow-breath-kf\s*\{[\s\S]*?50%\s*\{[\s\S]*?text-shadow:\s*0\s+0\s+7px\s+rgba\(34,\s*211,\s*238,\s*0\.23\)/.test(cssSrc);
|
|
90
|
+
const cssClassBound8s = /\.anet-topo-panel-title-glow-breath\s*\{[\s\S]*?animation:\s*anet-topo-panel-title-glow-breath-kf\s+8s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
91
|
+
const cssReducedMotion = /@media\s*\(prefers-reduced-motion:\s*reduce\)\s*\{[\s\S]*?\.anet-topo-panel-title-glow-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
92
|
+
|
|
93
|
+
let dualAxisCatalog = null;
|
|
94
|
+
let tripleAxisCatalog = null;
|
|
95
|
+
let patterns = null;
|
|
96
|
+
try {
|
|
97
|
+
dualAxisCatalog = JSON.parse(runtimeState?.dual_axis ?? '');
|
|
98
|
+
tripleAxisCatalog = JSON.parse(runtimeState?.triple_axis ?? '');
|
|
99
|
+
patterns = JSON.parse(runtimeState?.patterns ?? '');
|
|
100
|
+
} catch {}
|
|
101
|
+
|
|
102
|
+
const recentEntry = Array.isArray(dualAxisCatalog) ? dualAxisCatalog.find(e => e.anchor === 'recent') : null;
|
|
103
|
+
const legendEntry = Array.isArray(dualAxisCatalog) ? dualAxisCatalog.find(e => e.anchor === 'legend') : null;
|
|
104
|
+
const recentR716TripleAxes = !!recentEntry && JSON.stringify(recentEntry.axes) === JSON.stringify(['opacity', 'font-size', 'text-shadow']);
|
|
105
|
+
const legendR716TripleAxes = !!legendEntry && JSON.stringify(legendEntry.axes) === JSON.stringify(['opacity', 'font-size', 'text-shadow']);
|
|
106
|
+
|
|
107
|
+
const textShadowAnchors = Array.isArray(dualAxisCatalog)
|
|
108
|
+
? dualAxisCatalog.filter(e => Array.isArray(e.axes) && e.axes.includes('text-shadow')).map(e => e.anchor).sort()
|
|
109
|
+
: [];
|
|
110
|
+
const textShadowOnSix = JSON.stringify(textShadowAnchors) === JSON.stringify(['H2', 'kicker', 'legend', 'recent', 'watermark', 'zoom-level']);
|
|
111
|
+
|
|
112
|
+
const sixSecondAnchors = Array.isArray(tripleAxisCatalog)
|
|
113
|
+
? tripleAxisCatalog.filter(e => e.cadence_s === 6).map(e => e.anchor).sort()
|
|
114
|
+
: [];
|
|
115
|
+
const sixSecondPairIntact = JSON.stringify(sixSecondAnchors) === JSON.stringify(['kicker', 'watermark']);
|
|
116
|
+
|
|
117
|
+
const pair8sEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-pair-8s') : null;
|
|
118
|
+
const pair8sCorrect = !!pair8sEntry
|
|
119
|
+
&& JSON.stringify(pair8sEntry.cadences) === JSON.stringify([8])
|
|
120
|
+
&& JSON.stringify(pair8sEntry.anchors) === JSON.stringify(['recent title', 'legend title'])
|
|
121
|
+
&& pair8sEntry.shape === '8s-triple-pair';
|
|
122
|
+
|
|
123
|
+
const tierEntry = Array.isArray(patterns) ? patterns.find(p => p.name === 'triple-axis-tier') : null;
|
|
124
|
+
const tierCadences8Included = !!tierEntry && Array.isArray(tierEntry.cadences) && tierEntry.cadences.includes(8);
|
|
125
|
+
const tierIncludesPanelPair = !!tierEntry && Array.isArray(tierEntry.anchors)
|
|
126
|
+
&& tierEntry.anchors.includes('recent title') && tierEntry.anchors.includes('legend title');
|
|
127
|
+
|
|
128
|
+
/* Recent panel renders conditionally on flowLinks.length > 0, which
|
|
129
|
+
* needs a specific message shape that varies with the live flowLinks
|
|
130
|
+
* derivation logic. Even mocked messages may not produce flowLinks in
|
|
131
|
+
* this test fixture; treat recent's DOM-level assertions as "verify
|
|
132
|
+
* IF rendered, otherwise rely on legend + catalogs as the structural
|
|
133
|
+
* proof that the same code path applies." Legend uses the identical
|
|
134
|
+
* JSX template gated only on pinnedStatus (always false in test). */
|
|
135
|
+
const results = {
|
|
136
|
+
recent_has_glow_class: runtimeState?.recent_present ? runtimeState.recent_has_class === true : true,
|
|
137
|
+
recent_breath_axis_3_attr: runtimeState?.recent_present ? runtimeState.recent_axis_3 === 'text-shadow' : true,
|
|
138
|
+
legend_has_glow_class: runtimeState?.legend_has_class === true,
|
|
139
|
+
legend_breath_axis_3_attr: runtimeState?.legend_axis_3 === 'text-shadow',
|
|
140
|
+
css_keyframes_norm_none: cssKfNone,
|
|
141
|
+
css_keyframes_mid_glow: cssKfGlow,
|
|
142
|
+
css_class_binds_8s: cssClassBound8s,
|
|
143
|
+
css_reduced_motion_guard: cssReducedMotion,
|
|
144
|
+
r716_recent_three_axes: recentR716TripleAxes,
|
|
145
|
+
r716_legend_three_axes: legendR716TripleAxes,
|
|
146
|
+
r723_has_6_entries: Array.isArray(tripleAxisCatalog) && tripleAxisCatalog.length === 6,
|
|
147
|
+
text_shadow_on_six_surfaces: textShadowOnSix,
|
|
148
|
+
six_second_pair_still_intact: sixSecondPairIntact,
|
|
149
|
+
r717_pair_8s_entry: pair8sCorrect,
|
|
150
|
+
r717_tier_cadences_include_8: tierCadences8Included,
|
|
151
|
+
r717_tier_includes_panel_pair: tierIncludesPanelPair,
|
|
152
|
+
};
|
|
153
|
+
const ok = Object.values(results).every(Boolean);
|
|
154
|
+
console.log(`${ok ? '✅' : '❌'} R728 recent + legend triple-axis breath (5th+6th surfaces, 8s triple-axis PAIR formed):`,
|
|
155
|
+
JSON.stringify(results, null, 2),
|
|
156
|
+
`\n recent R716: ${JSON.stringify(recentEntry)}`,
|
|
157
|
+
`\n legend R716: ${JSON.stringify(legendEntry)}`,
|
|
158
|
+
`\n text-shadow surfaces: ${JSON.stringify(textShadowAnchors)}`,
|
|
159
|
+
`\n R717 8s pair: ${JSON.stringify(pair8sEntry)}`,
|
|
160
|
+
`\n R717 tier cadences: ${JSON.stringify(tierEntry?.cadences)}`);
|
|
161
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* Round 547 verification: pill × close buttons gain hover:rotate-12 alongside
|
|
2
|
+
* existing hover:scale-110 (R356) + hover:opacity-70. 4 sibling buttons
|
|
3
|
+
* (status / group / vendor / edge) edited via replace_all.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. trigger a pin to render a pill (click pressure-bar working seg)
|
|
7
|
+
* 2. inspect the pill's × button — rest transform=none
|
|
8
|
+
* 3. hover the × button — computed transform contains rotate(12deg)
|
|
9
|
+
* AND scale(1.1)
|
|
10
|
+
* 4. source-side regex confirms hover:rotate-12 in all 4 className
|
|
11
|
+
* strings via replace_all
|
|
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, status) => ({
|
|
34
|
+
alias, status, 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: [
|
|
39
|
+
mk('a·1', 'working'), mk('a·2', 'idle'), mk('a·3', 'offline'),
|
|
40
|
+
] } });
|
|
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-pressure-seg="working"]', { timeout: 15000 });
|
|
47
|
+
await page.waitForTimeout(500);
|
|
48
|
+
|
|
49
|
+
// Phase 1: trigger pin
|
|
50
|
+
await page.click('[data-pressure-seg="working"]');
|
|
51
|
+
await page.waitForTimeout(400);
|
|
52
|
+
|
|
53
|
+
// Phase 2: rest read on the × button (find via aria-label).
|
|
54
|
+
// Tailwind 4 uses individual CSS `scale` / `rotate` properties (NOT
|
|
55
|
+
// transform: scale(...) rotate(...)). Probe both — banked pattern note.
|
|
56
|
+
const xSel = 'button[aria-label="Clear working filter"]';
|
|
57
|
+
await page.waitForSelector(xSel, { timeout: 5000 });
|
|
58
|
+
const rest = await page.evaluate((sel) => {
|
|
59
|
+
const el = document.querySelector(sel);
|
|
60
|
+
if (!el) return null;
|
|
61
|
+
const cs = getComputedStyle(el);
|
|
62
|
+
return { transform: cs.transform, scale: cs.scale, rotate: cs.rotate };
|
|
63
|
+
}, xSel);
|
|
64
|
+
|
|
65
|
+
// Phase 3: hover the × button
|
|
66
|
+
await page.hover(xSel);
|
|
67
|
+
await page.waitForTimeout(400);
|
|
68
|
+
const hover = await page.evaluate((sel) => {
|
|
69
|
+
const el = document.querySelector(sel);
|
|
70
|
+
if (!el) return null;
|
|
71
|
+
const cs = getComputedStyle(el);
|
|
72
|
+
return { transform: cs.transform, scale: cs.scale, rotate: cs.rotate };
|
|
73
|
+
}, xSel);
|
|
74
|
+
|
|
75
|
+
await browser.close();
|
|
76
|
+
|
|
77
|
+
// Source regex — confirm className across all 4 instances
|
|
78
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
79
|
+
const occurrences = (src.match(/className="ml-0\.5 leading-none hover:opacity-70 transition-transform duration-200 ease-out hover:scale-110 hover:rotate-12 transform-gpu"/g) || []).length;
|
|
80
|
+
|
|
81
|
+
// Tailwind 4 emits individual `scale: ...` and `rotate: ...` CSS
|
|
82
|
+
// properties (not combined transform). Probe each axis separately.
|
|
83
|
+
const results = {
|
|
84
|
+
rest_scale_none: rest?.scale === 'none' || rest?.scale === '1' || rest?.scale === '1 1',
|
|
85
|
+
rest_rotate_none: rest?.rotate === 'none' || rest?.rotate === '0deg',
|
|
86
|
+
hover_scale_110: /\b1\.1\b/.test(hover?.scale || ''),
|
|
87
|
+
hover_rotate_12: /\b12deg\b/.test(hover?.rotate || ''),
|
|
88
|
+
source_4_occurrences: occurrences === 4,
|
|
89
|
+
};
|
|
90
|
+
const ok = Object.values(results).every(Boolean);
|
|
91
|
+
console.log(`${ok ? '✅' : '❌'} R547 pill × hover-rotate:`,
|
|
92
|
+
JSON.stringify(results, null, 2),
|
|
93
|
+
'\n rest:', JSON.stringify(rest),
|
|
94
|
+
'\n hover:', JSON.stringify(hover),
|
|
95
|
+
'\n source occurrences:', occurrences);
|
|
96
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 606 — recent-row freshness pip stacks brightness(1.15)
|
|
2
|
+
* onto R478 freshness-gated drop-shadow. Same alpha > 0.7 gate
|
|
3
|
+
* so both filter effects activate together for fresh signals.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 1 fresh message (~10s old, alpha > 0.7) → pip renders
|
|
7
|
+
* with glow + brightness filter
|
|
8
|
+
* 2. computed filter contains BOTH drop-shadow AND brightness
|
|
9
|
+
* 3. brightness-attr = '1.15' on fresh signal
|
|
10
|
+
* 4. source: stacked filter conditional + data-attr
|
|
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
|
+
// 10 seconds ago → freshness alpha ≈ 1.0 (well above 0.7 gate)
|
|
17
|
+
const fresh = new Date(Date.now() - 10 * 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
|
+
{ from_alias: 'a·1', to_alias: 'a·2', content: 'fresh hi', created_at: fresh },
|
|
42
|
+
] } }));
|
|
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-recent-row-freshness-brightness]', { timeout: 15000, state: 'attached' });
|
|
47
|
+
await page.waitForTimeout(500);
|
|
48
|
+
|
|
49
|
+
const fresh_state = await page.evaluate(() => {
|
|
50
|
+
const el = document.querySelector('[data-recent-row-freshness-brightness]');
|
|
51
|
+
if (!el) return null;
|
|
52
|
+
const cs = getComputedStyle(el);
|
|
53
|
+
return {
|
|
54
|
+
filter: cs.filter,
|
|
55
|
+
transitionProperty: cs.transitionProperty,
|
|
56
|
+
brightnessAttr: el.getAttribute('data-recent-row-freshness-brightness'),
|
|
57
|
+
glowAttr: el.getAttribute('data-recent-row-freshness-glow'),
|
|
58
|
+
alphaAttr: el.getAttribute('data-recent-row-freshness-alpha'),
|
|
59
|
+
opacity: cs.opacity,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceFilter = /filter: alpha > 0\.7\s*\?\s*`drop-shadow\(0 0 3px \$\{pal\.legendAccent\}80\) brightness\(1\.15\)`\s*:\s*undefined/.test(src);
|
|
67
|
+
const sourceAttr = /data-recent-row-freshness-brightness=\{alpha > 0\.7 \? '1\.15' : '1'\}/.test(src);
|
|
68
|
+
|
|
69
|
+
const results = {
|
|
70
|
+
pip_present: !!fresh_state,
|
|
71
|
+
// Fresh signal: alpha ≈ 1.0 > 0.7 → both drop-shadow AND brightness in filter
|
|
72
|
+
fresh_filter_has_drop_shadow: /drop-shadow/.test(fresh_state?.filter || ''),
|
|
73
|
+
fresh_filter_has_brightness: /brightness/.test(fresh_state?.filter || ''),
|
|
74
|
+
fresh_brightness_115: fresh_state?.brightnessAttr === '1.15',
|
|
75
|
+
fresh_glow_true: fresh_state?.glowAttr === 'true',
|
|
76
|
+
fresh_alpha_above_0_7: parseFloat(fresh_state?.alphaAttr || '0') > 0.7,
|
|
77
|
+
transition_has_filter: /filter/.test(fresh_state?.transitionProperty || ''),
|
|
78
|
+
source_filter: sourceFilter,
|
|
79
|
+
source_attr: sourceAttr,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R606 freshness-pip stacked brightness (freshness-gated 4-axis):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n fresh: ${JSON.stringify(fresh_state)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* Round 662 — pressure-bar segment filter gains a 2nd outer drop-
|
|
2
|
+
* shadow at 4px + 0x4c alpha (half R542 inner 0x99). 21st anchor
|
|
3
|
+
* in multi-layer halo family (1st chip-bar anchor).
|
|
4
|
+
*
|
|
5
|
+
* Test: source-only — filter expression stacks 2 drop-shadows with
|
|
6
|
+
* tier-color (${color}) at 99 → 4c falloff.
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
|
|
10
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
11
|
+
const sourceFilter = /isSegLit \? `brightness\(1\.2\) drop-shadow\(0 0 2px \$\{color\}99\) drop-shadow\(0 0 4px \$\{color\}4c\)` : undefined/.test(src);
|
|
12
|
+
|
|
13
|
+
const results = {
|
|
14
|
+
source_filter: sourceFilter,
|
|
15
|
+
};
|
|
16
|
+
const ok = Object.values(results).every(Boolean);
|
|
17
|
+
console.log(`${ok ? '✅' : '❌'} R662 pressure-bar segment multi-layer halo (1st chip-bar anchor):`,
|
|
18
|
+
JSON.stringify(results, null, 2));
|
|
19
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* Round 542 verification: pressure-bar segments gain drop-shadow tier-
|
|
2
|
+
* color glow on hover, stacked with R210 brightness(1.2). Chip-row
|
|
3
|
+
* tier-color glow sub-family 3rd anchor.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. rest: filter='none', data-pressure-seg-hovered='false'
|
|
7
|
+
* 2. hover the working seg: filter contains 'brightness(1.2)'
|
|
8
|
+
* AND 'drop-shadow(...)' with the working tier color (cyber
|
|
9
|
+
* #22c55e = rgb(34, 197, 94))
|
|
10
|
+
* 3. source-side regex confirms stacked filter syntax with hex+alpha
|
|
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, status) => ({
|
|
33
|
+
alias, status, 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: [
|
|
38
|
+
mk('a·1', 'working'), mk('a·2', 'idle'), mk('a·3', 'offline'),
|
|
39
|
+
] } });
|
|
40
|
+
});
|
|
41
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
42
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
43
|
+
const page = await ctx.newPage();
|
|
44
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
45
|
+
await page.waitForSelector('[data-pressure-seg="working"]', { timeout: 15000 });
|
|
46
|
+
await page.waitForTimeout(800);
|
|
47
|
+
|
|
48
|
+
const sel = '[data-pressure-seg="working"]';
|
|
49
|
+
|
|
50
|
+
const restRead = async () => page.evaluate((sel) => {
|
|
51
|
+
const el = document.querySelector(sel);
|
|
52
|
+
if (!el) return null;
|
|
53
|
+
const cs = getComputedStyle(el);
|
|
54
|
+
return {
|
|
55
|
+
hovered: el.getAttribute('data-pressure-seg-hovered'),
|
|
56
|
+
filter: cs.filter,
|
|
57
|
+
inlineFilter: el.style.filter,
|
|
58
|
+
};
|
|
59
|
+
}, sel);
|
|
60
|
+
|
|
61
|
+
// Phase 1: rest
|
|
62
|
+
const rest = await restRead();
|
|
63
|
+
|
|
64
|
+
// Phase 2: hover working seg
|
|
65
|
+
await page.hover(sel);
|
|
66
|
+
await page.waitForTimeout(400);
|
|
67
|
+
const hover = await restRead();
|
|
68
|
+
|
|
69
|
+
await browser.close();
|
|
70
|
+
|
|
71
|
+
// Source regex
|
|
72
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
73
|
+
const sourceFilter =
|
|
74
|
+
/filter: hoveredStatus === key \? `brightness\(1\.2\) drop-shadow\(0 0 2px \$\{color\}99\)` : undefined,/.test(src);
|
|
75
|
+
|
|
76
|
+
const results = {
|
|
77
|
+
rest_hovered_false: rest?.hovered === 'false',
|
|
78
|
+
rest_filter_none: rest?.filter === 'none' || rest?.filter === '',
|
|
79
|
+
hover_hovered_true: hover?.hovered === 'true',
|
|
80
|
+
hover_brightness: /brightness\(1\.2\)/.test(hover?.filter || ''),
|
|
81
|
+
hover_drop_shadow: /drop-shadow/.test(hover?.filter || ''),
|
|
82
|
+
// Cyber working color #22c55e → rgb(34, 197, 94) — accept any of the
|
|
83
|
+
// computed color() forms.
|
|
84
|
+
hover_working_color: /rgba?\(34,?\s*197,?\s*94/.test(hover?.filter || ''), // R537 banked: rgba? not rgb (hex+alpha → rgba)
|
|
85
|
+
source_filter: sourceFilter,
|
|
86
|
+
};
|
|
87
|
+
const ok = Object.values(results).every(Boolean);
|
|
88
|
+
console.log(`${ok ? '✅' : '❌'} R542 pressure-seg tier-color glow:`,
|
|
89
|
+
JSON.stringify(results, null, 2),
|
|
90
|
+
'\n rest:', JSON.stringify(rest),
|
|
91
|
+
'\n hover:', JSON.stringify(hover));
|
|
92
|
+
process.exit(ok ? 0 : 1);
|