@sleep2agi/agent-network-dashboard 0.4.6-preview.7 → 0.4.6-preview.71
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 +1 -0
- package/.next/build/chunks/{node_modules_13sb.px._.js → 00jm_02mlcew._.js} +167 -167
- package/.next/build/chunks/00jm_02mlcew._.js.map +47 -0
- package/.next/build/chunks/{[root-of-the-server]__0ubbtyl._.js → [root-of-the-server]__0tgc-8p._.js} +3 -3
- package/.next/build/chunks/{[root-of-the-server]__0d-m0h0._.js → [root-of-the-server]__13z64y.._.js} +7 -7
- package/.next/build/chunks/{[root-of-the-server]__0d-m0h0._.js.map → [root-of-the-server]__13z64y.._.js.map} +2 -2
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0r4x5ys._.js +13 -0
- package/.next/build/chunks/[turbopack]_runtime.js +1 -1
- package/.next/build/postcss.js +4 -4
- package/.next/build-manifest.json +8 -8
- package/.next/diagnostics/route-bundle-stats.json +157 -143
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +4 -4
- package/.next/required-server-files.json +4 -4
- package/.next/routes-manifest.json +6 -0
- package/.next/server/app/_global-error/page/build-manifest.json +5 -5
- package/.next/server/app/_global-error/page.js +9 -9
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +8 -8
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
- package/.next/server/app/_global-error.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +5 -5
- package/.next/server/app/_not-found/page/next-font-manifest.json +1 -1
- package/.next/server/app/_not-found/page.js +12 -12
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +12 -12
- package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin/page/build-manifest.json +5 -5
- package/.next/server/app/admin/page/next-font-manifest.json +1 -1
- package/.next/server/app/admin/page.js +13 -13
- package/.next/server/app/admin/page.js.nft.json +1 -1
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +14 -14
- package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
- package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
- package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
- package/.next/server/app/api/anet/config/route.js +6 -6
- package/.next/server/app/api/anet/config/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/login/route.js +7 -7
- package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/logout/route.js +7 -7
- package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/server/app/api/auth/v3/route.js +7 -7
- package/.next/server/app/api/auth/v3/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/audit-log/route.js +6 -6
- package/.next/server/app/api/hub/audit-log/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/auth/route.js +7 -7
- package/.next/server/app/api/hub/auth/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/broadcast/route.js +6 -6
- package/.next/server/app/api/hub/broadcast/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/events/route.js +6 -6
- package/.next/server/app/api/hub/events/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/health/route.js +6 -6
- package/.next/server/app/api/hub/health/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/inbox/route.js +6 -6
- package/.next/server/app/api/hub/inbox/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/license/route.js +6 -6
- package/.next/server/app/api/hub/license/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/messages/route.js +6 -6
- package/.next/server/app/api/hub/messages/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/networks/route.js +6 -6
- package/.next/server/app/api/hub/networks/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/nodes/route.js +6 -6
- package/.next/server/app/api/hub/nodes/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/register/route.js +6 -6
- package/.next/server/app/api/hub/register/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/send/route.js +6 -6
- package/.next/server/app/api/hub/send/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/server-logs/route.js +6 -6
- package/.next/server/app/api/hub/server-logs/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/servers/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/hub/servers/route/build-manifest.json +9 -0
- package/.next/server/app/api/hub/servers/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/hub/servers/route.js +7 -0
- package/.next/server/app/api/hub/servers/route.js.map +5 -0
- package/.next/server/app/api/hub/servers/route.js.nft.json +1 -0
- package/.next/server/app/api/hub/servers/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/hub/session/route.js +6 -6
- package/.next/server/app/api/hub/session/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/stats/route.js +6 -6
- package/.next/server/app/api/hub/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/status/route.js +6 -6
- package/.next/server/app/api/hub/status/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/task-events/route.js +6 -6
- package/.next/server/app/api/hub/task-events/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/tasks/route.js +6 -6
- package/.next/server/app/api/hub/tasks/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/tmux/route.js +6 -6
- package/.next/server/app/api/hub/tmux/route.js.nft.json +1 -1
- package/.next/server/app/api/hub/tokens/route.js +6 -6
- package/.next/server/app/api/hub/tokens/route.js.nft.json +1 -1
- package/.next/server/app/favicon.ico/route.js +6 -6
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +14 -14
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +14 -14
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +7 -7
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page/build-manifest.json +5 -5
- package/.next/server/app/login/page/next-font-manifest.json +1 -1
- package/.next/server/app/login/page.js +13 -13
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +14 -14
- package/.next/server/app/login.segments/_full.segment.rsc +14 -14
- package/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/server/app/login.segments/_index.segment.rsc +7 -7
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/login.segments/login.segment.rsc +3 -3
- package/.next/server/app/logs/page/build-manifest.json +5 -5
- package/.next/server/app/logs/page/next-font-manifest.json +1 -1
- package/.next/server/app/logs/page.js +13 -13
- package/.next/server/app/logs/page.js.nft.json +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +14 -14
- package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
- package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
- package/.next/server/app/messages/page/build-manifest.json +5 -5
- package/.next/server/app/messages/page/next-font-manifest.json +1 -1
- package/.next/server/app/messages/page.js +13 -13
- package/.next/server/app/messages/page.js.nft.json +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +14 -14
- package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
- package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
- package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
- package/.next/server/app/node/page/build-manifest.json +5 -5
- package/.next/server/app/node/page/next-font-manifest.json +1 -1
- package/.next/server/app/node/page.js +13 -13
- package/.next/server/app/node/page.js.nft.json +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +14 -14
- package/.next/server/app/node.segments/_full.segment.rsc +14 -14
- package/.next/server/app/node.segments/_head.segment.rsc +4 -4
- package/.next/server/app/node.segments/_index.segment.rsc +7 -7
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/node.segments/node.segment.rsc +3 -3
- package/.next/server/app/nodes/page/build-manifest.json +5 -5
- package/.next/server/app/nodes/page/next-font-manifest.json +1 -1
- package/.next/server/app/nodes/page.js +13 -13
- package/.next/server/app/nodes/page.js.nft.json +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +14 -14
- package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
- package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
- package/.next/server/app/page/build-manifest.json +5 -5
- package/.next/server/app/page/next-font-manifest.json +1 -1
- package/.next/server/app/page.js +13 -13
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs/page/build-manifest.json +5 -5
- package/.next/server/app/server-logs/page/next-font-manifest.json +1 -1
- package/.next/server/app/server-logs/page.js +13 -13
- package/.next/server/app/server-logs/page.js.nft.json +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +14 -14
- package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
- package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
- package/.next/server/app/settings/networks/page/build-manifest.json +5 -5
- package/.next/server/app/settings/networks/page/next-font-manifest.json +1 -1
- package/.next/server/app/settings/networks/page.js +13 -13
- package/.next/server/app/settings/networks/page.js.nft.json +1 -1
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +14 -14
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings/page/build-manifest.json +5 -5
- package/.next/server/app/settings/page/next-font-manifest.json +1 -1
- package/.next/server/app/settings/page.js +13 -13
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page/build-manifest.json +5 -5
- package/.next/server/app/settings/tokens/page/next-font-manifest.json +1 -1
- package/.next/server/app/settings/tokens/page.js +13 -13
- package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +14 -14
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +14 -14
- package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/app/tasks/[id]/page/build-manifest.json +5 -5
- package/.next/server/app/tasks/[id]/page/next-font-manifest.json +1 -1
- package/.next/server/app/tasks/[id]/page.js +13 -13
- package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page/build-manifest.json +5 -5
- package/.next/server/app/tasks/page/next-font-manifest.json +1 -1
- package/.next/server/app/tasks/page.js +13 -13
- package/.next/server/app/tasks/page.js.nft.json +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +14 -14
- package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
- package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
- package/.next/server/app-paths-manifest.json +1 -0
- package/.next/server/chunks/00jm_next_04f3gac._.js +10 -0
- package/.next/server/chunks/00jm_next_04f3gac._.js.map +1 -0
- package/.next/server/chunks/00jm_next_dist_esm_build_templates_app-route_02f430o.js +3 -0
- package/.next/server/chunks/00jm_next_dist_esm_build_templates_app-route_02f430o.js.map +1 -0
- package/.next/server/chunks/0ci9_nt-network-dashboard__next-internal_server_app_api_auth_v3_route_actions_0f5nbzr.js +3 -0
- package/.next/server/chunks/0ci9_nt-network-dashboard__next-internal_server_app_favicon_ico_route_actions_0t0eu9r.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_anet_config_route_actions_0a~v55_.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_auth_login_route_actions_0xnxfs4.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_auth_logout_route_actions_0p8p0rn.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_audit-log_route_actions_06uquwi.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_auth_route_actions_0f_y1ey.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_broadcast_route_actions_0ao3j43.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_events_route_actions_0_5ndld.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_health_route_actions_0mpzl74.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_inbox_route_actions_0stoyto.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_messages_route_actions_059rw1o.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_networks_route_actions_03sehpn.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_nodes_route_actions_11fbp28.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_register_route_actions_0l.d7~n.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_send_route_actions_0.p82vy.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_server-logs_route_actions_05~c5lb.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_servers_route_actions_08-m-cs.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_session_route_actions_0b9ef2i.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_stats_route_actions_03u65u0.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_status_route_actions_0_71ear.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_task-events_route_actions_07md_ee.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_tasks_route_actions_0er3uvk.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_tmux_route_actions_0o_1-8u.js +3 -0
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_tokens_route_actions_09doluz.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0-2le8-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0-2le8-._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0-g~15e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0-g~15e._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__00194.t._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__03ueci3._.js.map → [root-of-the-server]__00194.t._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__02p2n3n._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__02p2n3n._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__02y-i-p._.js +6 -0
- package/.next/server/chunks/[root-of-the-server]__02y-i-p._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__043tnx2._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0o4qfn9._.js.map → [root-of-the-server]__043tnx2._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__04z62zk._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__04z62zk._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__06p6kkp._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__06p6kkp._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__07ztet2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__07ztet2._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__08uyvdq._.js +20 -0
- package/.next/server/chunks/[root-of-the-server]__08uyvdq._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0b7v51y._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0b7v51y._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0e3ucl1._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0rg9ifx._.js.map → [root-of-the-server]__0e3ucl1._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0e6yail._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0e6yail._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0gx2_6a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0gx2_6a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0hcnyp.._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0o29v8c._.js.map → [root-of-the-server]__0hcnyp.._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0hg3_8r._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0hg3_8r._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0mzopco._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0mzopco._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0o45a4q._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0p6tutt._.js.map → [root-of-the-server]__0o45a4q._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0q-teo6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0q-teo6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0qcxxzf._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0qcxxzf._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__0~h2uqi._.js.map → [root-of-the-server]__0tx8s8i._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__0xtp-et._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0xtp-et._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__10pvabe._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__10pvabe._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__10t11zq._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__10t11zq._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__12r~omy._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__12r~omy._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1389~cs._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1389~cs._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__13n8t..._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__13n8t..._.js.map +1 -0
- package/.next/server/chunks/[turbopack]_runtime.js +1 -1
- package/.next/server/chunks/ssr/{node_modules_0r_.s40._.js → 00jm_03rn9vn._.js} +2 -2
- package/.next/server/chunks/ssr/00jm_03rn9vn._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_09w7yel._.js → 00jm_059ns68._.js} +3 -3
- package/.next/server/chunks/ssr/00jm_059ns68._.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_09ae-q0._.js +3 -0
- package/.next/server/chunks/ssr/00jm_09ae-q0._.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_0j7__z.._.js +3 -0
- package/.next/server/chunks/ssr/00jm_0j7__z.._.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_01-0urn._.js +6 -0
- package/.next/server/chunks/ssr/00jm_next_01-0urn._.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_05rlh5d._.js +6 -0
- package/.next/server/chunks/ssr/00jm_next_dist_05rlh5d._.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_0gkudcq._.js +3 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_0gkudcq._.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_forbidden_0ecus3e.js +3 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_forbidden_0ecus3e.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_global-error_07n8pg2.js +3 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_global-error_07n8pg2.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_unauthorized_0r0uq4j.js +3 -0
- package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_unauthorized_0r0uq4j.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_002l7yi.js → 00jm_next_dist_esm_build_templates_app-page_0..ddwm.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0..ddwm.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0qm1-a1.js → 00jm_next_dist_esm_build_templates_app-page_02bxi6j.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_02bxi6j.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_02suzhc.js → 00jm_next_dist_esm_build_templates_app-page_05oassd.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05oassd.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0dm~kj8.js → 00jm_next_dist_esm_build_templates_app-page_05vxtby.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05vxtby.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0uccf9z.js → 00jm_next_dist_esm_build_templates_app-page_05~eml4.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05~eml4.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0l-fh0i.js → 00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0uv6jyc.js → 00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js +4 -0
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_13s07li.js → 00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0o9vt1n.js → 00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0nsg22r.js → 00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0d2yq5t.js → 00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0foejvu.js → 00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js.map +1 -0
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js +4 -0
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_07uu-xq.js → 00jm_next_dist_esm_build_templates_app-page_13mqkay.js} +3 -3
- package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_13mqkay.js.map +1 -0
- package/.next/server/chunks/ssr/0dwh_ent-network-dashboard__next-internal_server_app_server-logs_page_actions_0hkk815.js +3 -0
- package/.next/server/chunks/ssr/0yas_gent-network-dashboard__next-internal_server_app__not-found_page_actions_0u.f-rz.js +3 -0
- package/.next/server/chunks/ssr/0yas_gent-network-dashboard__next-internal_server_app_tasks_[id]_page_actions_0r3~lho.js +3 -0
- package/.next/server/chunks/ssr/0ykm__next-internal_server_app__global-error_page_actions_100fxls.js +3 -0
- package/.next/server/chunks/ssr/0ykm__next-internal_server_app_settings_networks_page_actions_0jgy57m.js +3 -0
- package/.next/server/chunks/ssr/0ykm__next-internal_server_app_settings_tokens_page_actions_0l5h.k~.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__03b.f76._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__03b.f76._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__063~dul._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__063~dul._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__07io.d8._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__07io.d8._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__08d6lp4._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__08d6lp4._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09f1wn6._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__09f1wn6._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0c4xtkg._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0c4xtkg._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0erfzjn._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0erfzjn._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ezjwje._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ezjwje._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__08qr2ji._.js → [root-of-the-server]__0gc.4uk._.js} +3 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0gc.4uk._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0h_p~-4._.js +19 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0h_p~-4._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0jdr1e5._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0jdr1e5._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0lw16mu._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0lw16mu._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0mjly~-._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0mjly~-._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0p-95r_._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0p-95r_._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js +8 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ue5.fy._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0ue5.fy._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0uggxvx._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0uggxvx._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0zjk5ro._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0zjk5ro._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0zz3v7a._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0zz3v7a._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0~y12ef._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0~y12ef._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__129sc_9._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__129sc_9._.js.map +1 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_admin_page_actions_0i~.x~j.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_login_page_actions_0frwl15.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_logs_page_actions_0xa2ox_.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_messages_page_actions_10j3tg4.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_node_page_actions_0sl4ntd.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_nodes_page_actions_0cpgkfs.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_page_actions_08nuo36.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_settings_page_actions_0iv.lmk.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_tasks_page_actions_08c7qlx.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_tasks_page_actions_08c7qlx.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +9 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_components_08ys5y3._.js → agent-network-dashboard_app_components_0mvyi-4._.js} +3 -3
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js.map +1 -0
- package/.next/server/chunks/ssr/{app_server-logs_page_tsx_0_kpp1p._.js → agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js} +2 -2
- package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map +1 -0
- package/.next/server/middleware-build-manifest.js +8 -8
- package/.next/server/middleware.js +3 -3
- package/.next/server/middleware.js.nft.json +1 -1
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +14 -14
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0-mpa_947ipeq.js +1 -0
- package/.next/static/chunks/{0gtbwcilfu6b7.js → 0.66f3.rtcybb.js} +1 -1
- package/.next/static/chunks/01lmbsd37fybu.js +1 -0
- package/.next/static/chunks/039-b.v_9-_rm.js +1 -0
- package/.next/static/chunks/03o.h6kvmw4l_.js +1 -0
- package/.next/static/chunks/03~~oirxz7~vc.js +1 -0
- package/.next/static/chunks/05oi25hh7b81r.js +31 -0
- package/.next/static/chunks/05uk96gc~9mni.js +1 -0
- package/.next/static/chunks/07~8sx3_5uiox.js +1 -0
- package/.next/static/chunks/08kf-.bgs10ze.js +1 -0
- package/.next/static/chunks/{0pqt~8bl3ukh4.js → 0_pxg.4pebw__.js} +2 -2
- package/.next/static/chunks/0b8wnt4put-5n.js +2 -0
- package/.next/static/chunks/{01xlw8hd842-c.js → 0eov~nkwaf-qa.js} +1 -1
- package/.next/static/chunks/0glmrdj9112tc.js +7 -0
- package/.next/static/chunks/0ihb4j2px4pj6.js +1 -0
- package/.next/static/chunks/0i~_5k19v1-0q.css +2 -0
- package/.next/static/chunks/{0w1zwt8kq_7nb.js → 0ku0fjqlm9mca.js} +1 -1
- package/.next/static/chunks/{0-hlcuoemhe7w.js → 0pu117ktqke6..js} +2 -2
- package/.next/static/chunks/0rxrez_cjn.eh.js +1 -0
- package/.next/static/chunks/0sev.kqx9f.1x.js +2 -0
- package/.next/static/chunks/0tvn2l1pc.h65.js +1 -0
- package/.next/static/chunks/0u3b93reo9xci.js +1 -0
- package/.next/static/chunks/0u7v~vrs7ikg..js +1 -0
- package/.next/static/chunks/0x8x.29hkju5a.js +1 -0
- package/.next/static/chunks/174re5ar~kxne.js +1 -0
- package/.next/static/chunks/{turbopack-01f1xs~cq_~si.js → turbopack-0.7dvsf9rllt0.js} +1 -1
- 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/servers/route.ts +39 -0
- package/app/components/AppShell.tsx +2 -0
- package/app/components/ChatPopover.tsx +38 -2
- package/app/components/HelpOverlay.tsx +30 -0
- package/app/components/ServersDrawer.tsx +206 -0
- package/app/components/TopoGraph.tsx +1423 -177
- package/app/components/types.ts +3 -0
- package/app/components/utils.ts +8 -7
- package/app/lib/time.ts +36 -0
- package/package.json +1 -1
- package/scripts/chat-popover-test.mjs +2 -0
- package/scripts/chat-theme-test.mjs +1 -0
- package/scripts/help-overlay-topo-test.mjs +44 -0
- package/scripts/servers-drawer-live-test.mjs +96 -0
- package/scripts/topo-active-filter-pill-test.mjs +101 -0
- package/scripts/topo-active-links-chip-test.mjs +73 -0
- package/scripts/topo-arrow-tier-test.mjs +61 -0
- package/scripts/topo-auto-fit-test.mjs +73 -0
- package/scripts/topo-chat-focus-ring-test.mjs +77 -0
- package/scripts/topo-click-ripple-test.mjs +66 -0
- package/scripts/topo-cwd-tooltip-test.mjs +64 -0
- package/scripts/topo-dblclick-reset-test.mjs +74 -0
- package/scripts/topo-edge-endpoint-highlight-test.mjs +111 -0
- package/scripts/topo-edge-focus-test.mjs +113 -0
- package/scripts/topo-edge-hover-test.mjs +93 -0
- package/scripts/topo-edge-tooltip-test.mjs +70 -0
- package/scripts/topo-esc-clears-pin-test.mjs +98 -0
- package/scripts/topo-fit-key-test.mjs +106 -0
- package/scripts/topo-freshness-chip-test.mjs +74 -0
- package/scripts/topo-group-count-test.mjs +68 -0
- package/scripts/topo-group-hover-test.mjs +82 -0
- package/scripts/topo-group-pin-test.mjs +119 -0
- package/scripts/topo-group-status-pips-test.mjs +103 -0
- package/scripts/topo-groupbox-test.mjs +5 -2
- package/scripts/topo-help-overlay-r59-test.mjs +67 -0
- package/scripts/topo-hub-click-fit-test.mjs +137 -0
- package/scripts/topo-hub-title-test.mjs +93 -0
- package/scripts/topo-ingroup-edge-test.mjs +103 -0
- package/scripts/topo-label-lift-test.mjs +119 -0
- package/scripts/topo-label-scale-test.mjs +78 -0
- package/scripts/topo-lastseen-tooltip-test.mjs +59 -0
- package/scripts/topo-layout-key-test.mjs +91 -0
- package/scripts/topo-layout-test.mjs +1 -0
- package/scripts/topo-legend-hover-test.mjs +113 -0
- package/scripts/topo-legend-pin-test.mjs +128 -0
- package/scripts/topo-minimap-test.mjs +68 -0
- package/scripts/topo-mobile-chips-test.mjs +103 -0
- package/scripts/topo-node-hover-lift-test.mjs +85 -0
- package/scripts/topo-offline-dim-test.mjs +70 -0
- package/scripts/topo-overlap-test.mjs +164 -0
- package/scripts/topo-p0round-test.mjs +166 -0
- package/scripts/topo-pan-cursor-test.mjs +62 -0
- package/scripts/topo-panel-elevation-test.mjs +76 -0
- package/scripts/topo-popover-meta-test.mjs +78 -0
- package/scripts/topo-pressure-bar-test.mjs +69 -0
- package/scripts/topo-pressure-pin-test.mjs +112 -0
- package/scripts/topo-pulse-rate-test.mjs +71 -0
- package/scripts/topo-recent-row-hover-test.mjs +122 -0
- package/scripts/topo-recent-signal-empty-test.mjs +63 -0
- package/scripts/topo-reduced-motion-test.mjs +77 -0
- package/scripts/topo-rename-test.mjs +1 -0
- package/scripts/topo-tier-ring-test.mjs +69 -0
- package/scripts/topo-tz-ghost-test.mjs +69 -0
- package/scripts/topo-vendor-test.mjs +1 -0
- package/scripts/topo-wheel-zoom-test.mjs +79 -0
- package/scripts/topo-zoom-keys-test.mjs +89 -0
- package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_06e.r3r._.js +0 -13
- package/.next/build/chunks/node_modules_13sb.px._.js.map +0 -47
- package/.next/server/chunks/[root-of-the-server]__0-mykaf._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0-mykaf._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0.d_kqy._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0.d_kqy._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__02pocyg._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02pocyg._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__03ueci3._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__04aud7x._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__04aud7x._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__05fnt3n._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__05fnt3n._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__077tsd.._.js +0 -20
- package/.next/server/chunks/[root-of-the-server]__077tsd.._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__08wy1jr._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__08wy1jr._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0adhu1m._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0adhu1m._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0aqv02v._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0aqv02v._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0cawhfq._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0cawhfq._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0d_-_k.._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0d_-_k.._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0f6bxfl._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0f6bxfl._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0h15edq._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0h15edq._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0k.vegl._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0k.vegl._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0kltbce._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0kltbce._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0mn04fw._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0mn04fw._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0o29v8c._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0o4qfn9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0o7ya7r._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0o7ya7r._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0p3fo6l._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__0p3fo6l._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0p6tutt._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0pn3wsx._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0pn3wsx._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0rg9ifx._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0x.-194._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0x.-194._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0x.a_yh._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0x.a_yh._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0~h2uqi._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__139~d6a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__139~d6a._.js.map +0 -1
- package/.next/server/chunks/_next-internal_server_app_api_anet_config_route_actions_0xzy73j.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_auth_login_route_actions_0zukc38.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0fm~3ij.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_auth_v3_route_actions_0ndzs5l.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_audit-log_route_actions_11k8fqt.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_auth_route_actions_0gs7ttk.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_broadcast_route_actions_0ads-kd.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_events_route_actions_0opktby.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_health_route_actions_0tzzt~x.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_inbox_route_actions_0xvslrg.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_license_route_actions_0i3tlr3.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_messages_route_actions_08-gi-s.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_networks_route_actions_02vejq2.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_nodes_route_actions_0nx8ryn.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_register_route_actions_086wi_3.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_send_route_actions_0-ga_ug.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_server-logs_route_actions_00euexv.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_session_route_actions_041wa62.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_stats_route_actions_1242~od.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_status_route_actions_0aml09a.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_task-events_route_actions_02v1tmm.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_tasks_route_actions_0nl77v4.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_tmux_route_actions_0u~aaza.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_api_hub_tokens_route_actions_09hzf_1.js +0 -3
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +0 -3
- package/.next/server/chunks/node_modules_next_11synfn._.js +0 -10
- package/.next/server/chunks/node_modules_next_11synfn._.js.map +0 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0yubv2d.js +0 -3
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0yubv2d.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__014uja_._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__014uja_._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__02hi65f._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__02hi65f._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__02xqa5z._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__02xqa5z._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__04ph1de._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__04ph1de._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__05wc5-z._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__05wc5-z._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__06-2p1a._.js +0 -33
- package/.next/server/chunks/ssr/[root-of-the-server]__06-2p1a._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__08qr2ji._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__09l8xaa._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__09l8xaa._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +0 -19
- package/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0a0ffmv._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0a0ffmv._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0b7uu-_._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0b7uu-_._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0bl_wqk._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0bl_wqk._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0ft0rpu._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0ft0rpu._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0i~g-2t._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0i~g-2t._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0mook08._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0mook08._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0n46s~k._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0n46s~k._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0qchqb~._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0qchqb~._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0rrm~-q._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0rrm~-q._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0xjish~._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0xjish~._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0ywihy_._.js +0 -8
- package/.next/server/chunks/ssr/[root-of-the-server]__0ywihy_._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__12ad1n.._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__12ad1n.._.js.map +0 -1
- package/.next/server/chunks/ssr/_0nne7mz._.js +0 -3
- package/.next/server/chunks/ssr/_0nne7mz._.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_admin_page_actions_0ycnu8f.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_login_page_actions_02kefem.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_logs_page_actions_0rvsl~d.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_messages_page_actions_0gsqep_.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_node_page_actions_0wd8cgl.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_nodes_page_actions_0-.rv67.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_server-logs_page_actions_0g1gb5c.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_networks_page_actions_09uw.sw.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_settings_tokens_page_actions_0yi54x8.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_tasks_[id]_page_actions_0k_hm9g.js +0 -3
- package/.next/server/chunks/ssr/_next-internal_server_app_tasks_page_actions_0_2o_cr.js +0 -3
- package/.next/server/chunks/ssr/app_0.zbtn5._.js +0 -9
- package/.next/server/chunks/ssr/app_0.zbtn5._.js.map +0 -1
- package/.next/server/chunks/ssr/app_01y-~mp._.js +0 -3
- package/.next/server/chunks/ssr/app_01y-~mp._.js.map +0 -1
- package/.next/server/chunks/ssr/app_04n78pr._.js +0 -3
- package/.next/server/chunks/ssr/app_04n78pr._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0_agk0r._.js +0 -3
- package/.next/server/chunks/ssr/app_0_agk0r._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0aenxef._.js +0 -3
- package/.next/server/chunks/ssr/app_0aenxef._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0aum_g5._.js +0 -3
- package/.next/server/chunks/ssr/app_0aum_g5._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0emvkn2._.js +0 -3
- package/.next/server/chunks/ssr/app_0emvkn2._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0esuljp._.js +0 -3
- package/.next/server/chunks/ssr/app_0esuljp._.js.map +0 -1
- package/.next/server/chunks/ssr/app_0izi28j._.js +0 -3
- package/.next/server/chunks/ssr/app_0izi28j._.js.map +0 -1
- package/.next/server/chunks/ssr/app_components_08ys5y3._.js.map +0 -1
- package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js.map +0 -1
- package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js +0 -3
- package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_0r_.s40._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_0vtdjw7._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_0vtdjw7._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_0w2y7fz._.js +0 -6
- package/.next/server/chunks/ssr/node_modules_next_0w2y7fz._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +0 -6
- package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_002l7yi.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02suzhc.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07uu-xq.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0d2yq5t.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dm~kj8.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0foejvu.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0l-fh0i.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0nsg22r.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0o9vt1n.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qm1-a1.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uccf9z.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uv6jyc.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10~~o-h.js +0 -4
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10~~o-h.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13leyhk.js +0 -4
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13leyhk.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13s07li.js.map +0 -1
- package/.next/static/chunks/01fk_e9tpe4cr.js +0 -1
- package/.next/static/chunks/0257pdz1-imal.js +0 -2
- package/.next/static/chunks/02_zpo7taex9o.js +0 -7
- package/.next/static/chunks/06n3d~fbbtagk.js +0 -1
- package/.next/static/chunks/07eba1lz2u3p4.js +0 -1
- package/.next/static/chunks/0_rmxom9~1lmk.css +0 -2
- package/.next/static/chunks/0av2~0.96~d~g.js +0 -1
- package/.next/static/chunks/0e-.zgw81gela.js +0 -31
- package/.next/static/chunks/0e0c5hzwhvzje.js +0 -1
- package/.next/static/chunks/0g9aof0ob_fcj.js +0 -1
- package/.next/static/chunks/0j6t.m1a6._pk.js +0 -1
- package/.next/static/chunks/0s8jo6jypzkx5.js +0 -1
- package/.next/static/chunks/0u359llqm1_01.js +0 -1
- package/.next/static/chunks/0ubqqhhpsaez4.js +0 -1
- package/.next/static/chunks/0yz2othu-3th..js +0 -1
- package/.next/static/chunks/0~qw9kxksr1v2.js +0 -1
- package/.next/static/chunks/12gprw3l0kvvf.js +0 -1
- package/.next/static/chunks/12yuo353giomx.js +0 -1
- package/.next/static/chunks/14bsg3_-taiw4.js +0 -1
- /package/.next/build/chunks/{[root-of-the-server]__0ubbtyl._.js.map → [root-of-the-server]__0tgc-8p._.js.map} +0 -0
- /package/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_06e.r3r._.js.map → [turbopack-node]_transforms_postcss_ts_0r4x5ys._.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_anet_config_route_actions_0xzy73j.js.map → 0ci9_nt-network-dashboard__next-internal_server_app_api_auth_v3_route_actions_0f5nbzr.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_auth_login_route_actions_0zukc38.js.map → 0ci9_nt-network-dashboard__next-internal_server_app_favicon_ico_route_actions_0t0eu9r.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_auth_logout_route_actions_0fm~3ij.js.map → 0ykm__next-internal_server_app_api_anet_config_route_actions_0a~v55_.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_auth_v3_route_actions_0ndzs5l.js.map → 0ykm__next-internal_server_app_api_auth_login_route_actions_0xnxfs4.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_audit-log_route_actions_11k8fqt.js.map → 0ykm__next-internal_server_app_api_auth_logout_route_actions_0p8p0rn.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_auth_route_actions_0gs7ttk.js.map → 0ykm__next-internal_server_app_api_hub_audit-log_route_actions_06uquwi.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_broadcast_route_actions_0ads-kd.js.map → 0ykm__next-internal_server_app_api_hub_auth_route_actions_0f_y1ey.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_events_route_actions_0opktby.js.map → 0ykm__next-internal_server_app_api_hub_broadcast_route_actions_0ao3j43.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_health_route_actions_0tzzt~x.js.map → 0ykm__next-internal_server_app_api_hub_events_route_actions_0_5ndld.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_inbox_route_actions_0xvslrg.js.map → 0ykm__next-internal_server_app_api_hub_health_route_actions_0mpzl74.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_license_route_actions_0i3tlr3.js.map → 0ykm__next-internal_server_app_api_hub_inbox_route_actions_0stoyto.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_messages_route_actions_08-gi-s.js.map → 0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_networks_route_actions_02vejq2.js.map → 0ykm__next-internal_server_app_api_hub_messages_route_actions_059rw1o.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_nodes_route_actions_0nx8ryn.js.map → 0ykm__next-internal_server_app_api_hub_networks_route_actions_03sehpn.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_register_route_actions_086wi_3.js.map → 0ykm__next-internal_server_app_api_hub_nodes_route_actions_11fbp28.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_send_route_actions_0-ga_ug.js.map → 0ykm__next-internal_server_app_api_hub_register_route_actions_0l.d7~n.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_server-logs_route_actions_00euexv.js.map → 0ykm__next-internal_server_app_api_hub_send_route_actions_0.p82vy.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_session_route_actions_041wa62.js.map → 0ykm__next-internal_server_app_api_hub_server-logs_route_actions_05~c5lb.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_stats_route_actions_1242~od.js.map → 0ykm__next-internal_server_app_api_hub_servers_route_actions_08-m-cs.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_status_route_actions_0aml09a.js.map → 0ykm__next-internal_server_app_api_hub_session_route_actions_0b9ef2i.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_task-events_route_actions_02v1tmm.js.map → 0ykm__next-internal_server_app_api_hub_stats_route_actions_03u65u0.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_tasks_route_actions_0nl77v4.js.map → 0ykm__next-internal_server_app_api_hub_status_route_actions_0_71ear.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_tmux_route_actions_0u~aaza.js.map → 0ykm__next-internal_server_app_api_hub_task-events_route_actions_07md_ee.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_hub_tokens_route_actions_09hzf_1.js.map → 0ykm__next-internal_server_app_api_hub_tasks_route_actions_0er3uvk.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_favicon_ico_route_actions_095lj93.js.map → 0ykm__next-internal_server_app_api_hub_tmux_route_actions_0o_1-8u.js.map} +0 -0
- /package/.next/server/chunks/{ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js.map → 0ykm__next-internal_server_app_api_hub_tokens_route_actions_09doluz.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app__not-found_page_actions_0eq97pa.js.map → 0dwh_ent-network-dashboard__next-internal_server_app_server-logs_page_actions_0hkk815.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_admin_page_actions_0ycnu8f.js.map → 0yas_gent-network-dashboard__next-internal_server_app__not-found_page_actions_0u.f-rz.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_login_page_actions_02kefem.js.map → 0yas_gent-network-dashboard__next-internal_server_app_tasks_[id]_page_actions_0r3~lho.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_logs_page_actions_0rvsl~d.js.map → 0ykm__next-internal_server_app__global-error_page_actions_100fxls.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_messages_page_actions_0gsqep_.js.map → 0ykm__next-internal_server_app_settings_networks_page_actions_0jgy57m.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_node_page_actions_0wd8cgl.js.map → 0ykm__next-internal_server_app_settings_tokens_page_actions_0l5h.k~.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_nodes_page_actions_0-.rv67.js.map → agent-network-dashboard__next-internal_server_app_admin_page_actions_0i~.x~j.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_page_actions_09-gtaw.js.map → agent-network-dashboard__next-internal_server_app_login_page_actions_0frwl15.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_server-logs_page_actions_0g1gb5c.js.map → agent-network-dashboard__next-internal_server_app_logs_page_actions_0xa2ox_.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_settings_networks_page_actions_09uw.sw.js.map → agent-network-dashboard__next-internal_server_app_messages_page_actions_10j3tg4.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_settings_page_actions_0mr68ai.js.map → agent-network-dashboard__next-internal_server_app_node_page_actions_0sl4ntd.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_settings_tokens_page_actions_0yi54x8.js.map → agent-network-dashboard__next-internal_server_app_nodes_page_actions_0cpgkfs.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_tasks_[id]_page_actions_0k_hm9g.js.map → agent-network-dashboard__next-internal_server_app_page_actions_08nuo36.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_tasks_page_actions_0_2o_cr.js.map → agent-network-dashboard__next-internal_server_app_settings_page_actions_0iv.lmk.js.map} +0 -0
- /package/.next/static/{wi8v9sMITbvGOeqsOVwUq → fRqnaYLZjeQTx1-47Rbd5}/_buildManifest.js +0 -0
- /package/.next/static/{wi8v9sMITbvGOeqsOVwUq → fRqnaYLZjeQTx1-47Rbd5}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{wi8v9sMITbvGOeqsOVwUq → fRqnaYLZjeQTx1-47Rbd5}/_ssgManifest.js +0 -0
package/app/components/types.ts
CHANGED
|
@@ -12,6 +12,9 @@ export interface Session {
|
|
|
12
12
|
last_seen_at?: string;
|
|
13
13
|
config_path?: string;
|
|
14
14
|
network_id?: string;
|
|
15
|
+
// #111: working directory — nodes sharing a project_dir are one group
|
|
16
|
+
// (a more precise "same project" signal than the alias prefix).
|
|
17
|
+
project_dir?: string | null;
|
|
15
18
|
// #96: model vendor + execution runtime. Added to /api/status sessions in
|
|
16
19
|
// commhub-server 0.8.1-preview.0; null on older nodes / older hubs.
|
|
17
20
|
model?: string | null;
|
package/app/components/utils.ts
CHANGED
|
@@ -11,14 +11,15 @@ export function previewContent(raw: string | null | undefined): string {
|
|
|
11
11
|
.trim() || '--';
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
// Round 44 / Loop: timeAgo now delegates to the shared lib/time helper.
|
|
15
|
+
// The old in-line `replace + 'Z'` parse appended a Z to already-ISO
|
|
16
|
+
// inputs (producing "…ZZ", browser-fragile) — strict-superset semantics
|
|
17
|
+
// preserved for SQL-style inputs, fixed for ISO. Plus a 'just now' fallback
|
|
18
|
+
// when clock skew puts the timestamp in the future. Five callers benefit:
|
|
19
|
+
// /admin · /logs · /settings/networks · InboxPanel · /messages.
|
|
20
|
+
import { relativeAgo } from '../lib/time';
|
|
14
21
|
export function timeAgo(dateStr: string): string {
|
|
15
|
-
|
|
16
|
-
const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();
|
|
17
|
-
const s = Math.floor(diff / 1000);
|
|
18
|
-
if (s < 60) return `${s}s ago`;
|
|
19
|
-
if (s < 3600) return `${Math.floor(s / 60)}m ago`;
|
|
20
|
-
if (s < 86400) return `${Math.floor(s / 3600)}h ago`;
|
|
21
|
-
return `${Math.floor(s / 86400)}d ago`;
|
|
22
|
+
return relativeAgo(dateStr) ?? '--';
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
export function statusColor(status: string, hasSse: boolean): string {
|
package/app/lib/time.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Shared timestamp helpers for hub-sourced data.
|
|
2
|
+
*
|
|
3
|
+
* Background — the CommHub serialises timestamps SQL-style without a
|
|
4
|
+
* zone ("2026-05-15 06:00:28"), but some test data uses full ISO
|
|
5
|
+
* ("…T06:00:28Z"). `Date.parse` on bare SQL is **local-time** in every
|
|
6
|
+
* browser the dashboard supports, so a UTC+8 operator silently sees
|
|
7
|
+
* every timestamp 8 h older than reality (Round 35 dug this out via
|
|
8
|
+
* the `isGhost` filter mis-fire).
|
|
9
|
+
*
|
|
10
|
+
* Round 38 / Loop consolidates parsing — TopoGraph (R35), ChatPopover
|
|
11
|
+
* (R37) and utils.ts::timeAgo all mirrored the same SQL→UTC rewrite;
|
|
12
|
+
* one source of truth here. */
|
|
13
|
+
|
|
14
|
+
/** Parse a hub timestamp to ms-since-epoch, treating SQL-style strings
|
|
15
|
+
* as UTC. ISO strings (with `T`) bypass the rewrite and are parsed as-is.
|
|
16
|
+
* Returns null for empty / unparseable input. */
|
|
17
|
+
export function parseHubTime(dateStr: string | null | undefined): number | null {
|
|
18
|
+
if (!dateStr) return null;
|
|
19
|
+
const iso = dateStr.includes('T') ? dateStr : dateStr.replace(' ', 'T') + 'Z';
|
|
20
|
+
const t = Date.parse(iso);
|
|
21
|
+
return Number.isFinite(t) ? t : null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Format `dateStr` as a short relative-time string ("6m ago" / "2h ago").
|
|
25
|
+
* Future timestamps (clock skew) collapse to "just now". Returns null when
|
|
26
|
+
* the input doesn't parse — callers can decide on a fallback. */
|
|
27
|
+
export function relativeAgo(dateStr: string | null | undefined): string | null {
|
|
28
|
+
const t = parseHubTime(dateStr);
|
|
29
|
+
if (t === null) return null;
|
|
30
|
+
const s = Math.floor((Date.now() - t) / 1000);
|
|
31
|
+
if (s < 0) return 'just now';
|
|
32
|
+
if (s < 60) return `${s}s ago`;
|
|
33
|
+
if (s < 3600) return `${Math.floor(s / 60)}m ago`;
|
|
34
|
+
if (s < 86400) return `${Math.floor(s / 3600)}h ago`;
|
|
35
|
+
return `${Math.floor(s / 86400)}d ago`;
|
|
36
|
+
}
|
package/package.json
CHANGED
|
@@ -17,6 +17,7 @@ async function run(nodeCount, viewport, label) {
|
|
|
17
17
|
await ctx.addInitScript(() => {
|
|
18
18
|
try {
|
|
19
19
|
localStorage.setItem('anet-theme', 'cyber');
|
|
20
|
+
localStorage.setItem('anet-topo-nodescale', '1');
|
|
20
21
|
localStorage.removeItem('anet-brand');
|
|
21
22
|
localStorage.removeItem('anet-topo-view');
|
|
22
23
|
sessionStorage.setItem('anet_v3_auth', '1');
|
|
@@ -140,6 +141,7 @@ async function runFullscreen() {
|
|
|
140
141
|
await ctx.addInitScript(() => {
|
|
141
142
|
try {
|
|
142
143
|
localStorage.setItem('anet-theme', 'cyber');
|
|
144
|
+
localStorage.setItem('anet-topo-nodescale', '1');
|
|
143
145
|
localStorage.removeItem('anet-brand');
|
|
144
146
|
localStorage.removeItem('anet-topo-view');
|
|
145
147
|
sessionStorage.setItem('anet_v3_auth', '1');
|
|
@@ -23,6 +23,7 @@ async function run(theme, expectLight) {
|
|
|
23
23
|
await ctx.addInitScript((th) => {
|
|
24
24
|
try {
|
|
25
25
|
localStorage.setItem('anet-theme', th);
|
|
26
|
+
localStorage.setItem('anet-topo-nodescale', '1');
|
|
26
27
|
localStorage.removeItem('anet-brand');
|
|
27
28
|
localStorage.removeItem('anet-topo-view');
|
|
28
29
|
localStorage.setItem('anet-topo-layout', 'grid');
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* Round 25 verification: pressing `?` opens the help overlay, and the
|
|
2
|
+
* new "Topology canvas" section is present with the documented keys. */
|
|
3
|
+
import { chromium } from 'playwright';
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
|
|
6
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
7
|
+
const browser = await chromium.launch({ headless: true });
|
|
8
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
9
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
10
|
+
await ctx.addInitScript(() => {
|
|
11
|
+
try { sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
12
|
+
});
|
|
13
|
+
await ctx.route('**/api/hub/status*', (route) => route.fulfill({ json: { sessions: [] } }));
|
|
14
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
15
|
+
const page = await ctx.newPage();
|
|
16
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
17
|
+
await page.waitForTimeout(400);
|
|
18
|
+
|
|
19
|
+
await page.keyboard.press('?');
|
|
20
|
+
await page.waitForTimeout(200);
|
|
21
|
+
|
|
22
|
+
// The overlay contains group headings; find the Topology canvas group + its rows.
|
|
23
|
+
const data = await page.evaluate(() => {
|
|
24
|
+
// The group heading is a <div>; its parent wraps heading + the <ul> of items.
|
|
25
|
+
const heading = [...document.querySelectorAll('[role="dialog"] div')].find(el => el.textContent === 'Topology canvas');
|
|
26
|
+
if (!heading) return null;
|
|
27
|
+
return {
|
|
28
|
+
headingPresent: true,
|
|
29
|
+
sectionText: (heading.parentElement?.textContent || '').replace(/\s+/g, ' ').trim(),
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
await browser.close();
|
|
34
|
+
const results = {
|
|
35
|
+
overlayOpened: !!data,
|
|
36
|
+
topologySectionPresent: !!data?.headingPresent,
|
|
37
|
+
hasZoomKeys: !!data && /Zoom in/.test(data.sectionText) && /Zoom out/.test(data.sectionText) && /Reset zoom/.test(data.sectionText),
|
|
38
|
+
hasMouseGestures: !!data && /wheel/.test(data.sectionText) && /Pan the canvas/.test(data.sectionText),
|
|
39
|
+
hasClickHint: !!data && /chat popover/.test(data.sectionText) && /dbl-click/.test(data.sectionText),
|
|
40
|
+
};
|
|
41
|
+
const ok = Object.values(results).every(Boolean);
|
|
42
|
+
console.log(`${ok ? '✅' : '❌'} help overlay topology section:`, JSON.stringify(results));
|
|
43
|
+
if (!ok && data) console.log('section text:', data.sectionText.slice(0, 300));
|
|
44
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/* Round 20 / #119 step 3: ServersDrawer now consumes /api/hub/servers via
|
|
2
|
+
* useSWR. Verifies:
|
|
3
|
+
* 1. drawer renders live cards from the proxied endpoint (3 hosts)
|
|
4
|
+
* 2. polling fires (refreshInterval 5s) — second snapshot reflects an
|
|
5
|
+
* updated payload after >5.2s
|
|
6
|
+
* 3. when the hub predates 0.8.1-preview.2 the proxy returns
|
|
7
|
+
* `{ servers: [], unavailable: true }` and the drawer shows the
|
|
8
|
+
* friendly upgrade hint instead of an angry empty state
|
|
9
|
+
* 4. hub-down (502) shows the retry chip */
|
|
10
|
+
import { chromium } from 'playwright';
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
|
|
13
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
14
|
+
const browser = await chromium.launch({ headless: true });
|
|
15
|
+
|
|
16
|
+
async function load({ payload, status = 200 }) {
|
|
17
|
+
const ctx = await browser.newContext({ viewport: { width: 1400, height: 900 } });
|
|
18
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
19
|
+
await ctx.addInitScript(() => {
|
|
20
|
+
try {
|
|
21
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
22
|
+
localStorage.setItem('anet-servers-drawer', '1'); // start expanded so SWR fires
|
|
23
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
24
|
+
} catch {}
|
|
25
|
+
});
|
|
26
|
+
let calls = 0;
|
|
27
|
+
await ctx.route('**/api/hub/servers', async (route) => {
|
|
28
|
+
calls++;
|
|
29
|
+
const body = typeof payload === 'function' ? payload(calls) : payload;
|
|
30
|
+
await route.fulfill({ status, contentType: 'application/json', body: JSON.stringify(body) });
|
|
31
|
+
});
|
|
32
|
+
// keep the rest of the dashboard quiet
|
|
33
|
+
await ctx.route('**/api/hub/status*', (route) => route.fulfill({ json: { sessions: [] } }));
|
|
34
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
35
|
+
const page = await ctx.newPage();
|
|
36
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
37
|
+
await page.waitForSelector('aside[aria-label="Servers panel"]', { timeout: 30000 });
|
|
38
|
+
return { ctx, page, getCalls: () => calls };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const results = {};
|
|
42
|
+
|
|
43
|
+
// 1+2: live cards + polling
|
|
44
|
+
{
|
|
45
|
+
const seed = (n) => ({
|
|
46
|
+
servers: [
|
|
47
|
+
{ hostname: 'srv-01', ip: '10.0.0.1', cpu_load_1min: 1.2, cpu_cores: 4, mem_used_gb: 3, mem_total_gb: 16, agent_count: n, status: 'online' },
|
|
48
|
+
{ hostname: 'srv-02', cpu_load_1min: 0.4, cpu_cores: 8, mem_used_gb: 6, mem_total_gb: 32, agent_count: 2, status: 'online' },
|
|
49
|
+
{ hostname: 'srv-03', cpu_load_1min: null, cpu_cores: 0, mem_used_gb: null, mem_total_gb: null, agent_count: 1, status: 'offline' },
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
const { ctx, page, getCalls } = await load({ payload: seed });
|
|
53
|
+
await page.waitForFunction(() => {
|
|
54
|
+
const cards = document.querySelectorAll('aside[aria-label="Servers panel"] [data-servers-body] > div[title]');
|
|
55
|
+
return cards.length >= 3;
|
|
56
|
+
}, { timeout: 10000 });
|
|
57
|
+
const hostnames = await page.$$eval(
|
|
58
|
+
'aside[aria-label="Servers panel"] [data-servers-body] span.font-semibold',
|
|
59
|
+
els => els.map(e => e.textContent),
|
|
60
|
+
);
|
|
61
|
+
results.rendersLiveCards = hostnames.includes('srv-01') && hostnames.includes('srv-02') && hostnames.includes('srv-03');
|
|
62
|
+
|
|
63
|
+
// wait past one poll cycle (5s + slack) and confirm the proxy was hit again
|
|
64
|
+
await page.waitForTimeout(5400);
|
|
65
|
+
results.polls = getCalls() >= 2;
|
|
66
|
+
await ctx.close();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 3: hub predates 0.8.1-preview.2 → unavailable hint
|
|
70
|
+
{
|
|
71
|
+
const { ctx, page } = await load({ payload: { servers: [], unavailable: true } });
|
|
72
|
+
await page.waitForFunction(() => {
|
|
73
|
+
const el = document.querySelector('aside[aria-label="Servers panel"] [data-servers-body]');
|
|
74
|
+
return el && el.textContent.includes('host telemetry not available');
|
|
75
|
+
}, { timeout: 10000 }).catch(() => {});
|
|
76
|
+
const body = await page.$eval('aside[aria-label="Servers panel"] [data-servers-body]', el => el.textContent);
|
|
77
|
+
results.showsUpgradeHint = /host telemetry not available/.test(body) && /commhub-server/.test(body);
|
|
78
|
+
await ctx.close();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 4: hub-down 502 → retry chip
|
|
82
|
+
{
|
|
83
|
+
const { ctx, page } = await load({ payload: { error: 'hub unreachable' }, status: 502 });
|
|
84
|
+
await page.waitForFunction(() => {
|
|
85
|
+
const el = document.querySelector('aside[aria-label="Servers panel"] [data-servers-body]');
|
|
86
|
+
return el && /hub unreachable/.test(el.textContent || '');
|
|
87
|
+
}, { timeout: 10000 }).catch(() => {});
|
|
88
|
+
const body = await page.$eval('aside[aria-label="Servers panel"] [data-servers-body]', el => el.textContent);
|
|
89
|
+
results.showsRetryChip = /hub unreachable/.test(body) && /every 5s/.test(body);
|
|
90
|
+
await ctx.close();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
await browser.close();
|
|
94
|
+
const ok = Object.values(results).every(Boolean);
|
|
95
|
+
console.log(`${ok ? '✅' : '❌'} servers drawer live:`, JSON.stringify(results));
|
|
96
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* Round 64 verification: active-filter pills appear in chip row when
|
|
2
|
+
* pins are set and clear their pin on × click.
|
|
3
|
+
*
|
|
4
|
+
* - No pin → no pill rendered.
|
|
5
|
+
* - Pin status (via legend) → pill labelled "filter: working" with
|
|
6
|
+
* aria-label that includes "Clear working filter".
|
|
7
|
+
* - × button click → pin clears + node opacities restore.
|
|
8
|
+
* - Both pins independent: pin a status + pin a group → two pills.
|
|
9
|
+
*/
|
|
10
|
+
import { chromium } from 'playwright';
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
|
|
13
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
14
|
+
const browser = await chromium.launch({ headless: true });
|
|
15
|
+
|
|
16
|
+
const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
|
|
17
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
18
|
+
await ctx.addInitScript(() => {
|
|
19
|
+
try {
|
|
20
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
21
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
22
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
23
|
+
} catch {}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
27
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
28
|
+
const r = await route.fetch();
|
|
29
|
+
const b = await r.json();
|
|
30
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
31
|
+
const sessions = [
|
|
32
|
+
{ alias: 'alpha1', status: 'working', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
33
|
+
{ alias: 'alpha2', status: 'idle', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
34
|
+
{ alias: 'alpha3', status: 'idle', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
35
|
+
{ alias: 'beta', status: 'idle', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
36
|
+
];
|
|
37
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
43
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const readPills = () => page.evaluate(() => {
|
|
47
|
+
return [...document.querySelectorAll('[data-active-filter]')].map(el => ({
|
|
48
|
+
kind: el.getAttribute('data-active-filter'),
|
|
49
|
+
text: (el.textContent || '').trim(),
|
|
50
|
+
}));
|
|
51
|
+
});
|
|
52
|
+
const readWkrOpacity = () => page.evaluate(() => +(document.querySelector('g[data-node="alpha1"]')?.style.opacity || '1'));
|
|
53
|
+
|
|
54
|
+
const pillsBefore = await readPills();
|
|
55
|
+
|
|
56
|
+
// Pin working via legend.
|
|
57
|
+
await page.locator('g[data-legend-status="working"]').first().click({ force: true });
|
|
58
|
+
await page.mouse.move(10, 10);
|
|
59
|
+
await page.waitForTimeout(250);
|
|
60
|
+
const pillsAfterStatus = await readPills();
|
|
61
|
+
const wkrAfterStatus = await readWkrOpacity();
|
|
62
|
+
|
|
63
|
+
// Pin alpha group via label click.
|
|
64
|
+
await page.locator('g[data-group-label-hit="alpha"]').first().click({ force: true });
|
|
65
|
+
await page.mouse.move(10, 10);
|
|
66
|
+
await page.waitForTimeout(250);
|
|
67
|
+
const pillsBothPinned = await readPills();
|
|
68
|
+
|
|
69
|
+
// Click × on the status pill.
|
|
70
|
+
await page.locator('[data-active-filter="status"] button[aria-label*="working"]').first().click({ force: true });
|
|
71
|
+
await page.waitForTimeout(250);
|
|
72
|
+
const pillsAfterStatusClear = await readPills();
|
|
73
|
+
const wkrAfterStatusClear = await readWkrOpacity();
|
|
74
|
+
|
|
75
|
+
// Click × on the group pill.
|
|
76
|
+
await page.locator('[data-active-filter="group"] button[aria-label*="alpha"]').first().click({ force: true });
|
|
77
|
+
await page.waitForTimeout(250);
|
|
78
|
+
const pillsFinal = await readPills();
|
|
79
|
+
|
|
80
|
+
await browser.close();
|
|
81
|
+
|
|
82
|
+
const results = {
|
|
83
|
+
before_noPills: pillsBefore.length === 0,
|
|
84
|
+
statusPin_oneStatusPill: pillsAfterStatus.length === 1
|
|
85
|
+
&& pillsAfterStatus[0].kind === 'status'
|
|
86
|
+
&& /filter:\s*working/.test(pillsAfterStatus[0].text),
|
|
87
|
+
statusPin_dimsBeta: wkrAfterStatus >= 0.55, // alpha1 IS working — should stay
|
|
88
|
+
bothPinned_twoPills: pillsBothPinned.length === 2
|
|
89
|
+
&& pillsBothPinned.some(p => p.kind === 'status')
|
|
90
|
+
&& pillsBothPinned.some(p => p.kind === 'group'),
|
|
91
|
+
statusClear_only_group_remains: pillsAfterStatusClear.length === 1
|
|
92
|
+
&& pillsAfterStatusClear[0].kind === 'group',
|
|
93
|
+
statusClear_restoredOpacity: wkrAfterStatusClear >= 0.55,
|
|
94
|
+
groupClear_noPills: pillsFinal.length === 0,
|
|
95
|
+
};
|
|
96
|
+
const ok = Object.values(results).every(Boolean);
|
|
97
|
+
console.log(`${ok ? '✅' : '❌'} active-filter pill:`, JSON.stringify(results),
|
|
98
|
+
`\n pillsAfterStatus=`, pillsAfterStatus,
|
|
99
|
+
`\n pillsBothPinned=`, pillsBothPinned,
|
|
100
|
+
`\n pillsAfterStatusClear=`, pillsAfterStatusClear);
|
|
101
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* Round 42 verification: "X active links" chip in the header includes
|
|
2
|
+
* "· last <relative>" when flow links exist, drops the `· last …` tail
|
|
3
|
+
* when no flow links are present, and renders singular/plural correctly. */
|
|
4
|
+
import { chromium } from 'playwright';
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
|
|
7
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
8
|
+
const browser = await chromium.launch({ headless: true });
|
|
9
|
+
|
|
10
|
+
async function probe({ msgs }) {
|
|
11
|
+
const ctx = await browser.newContext({ viewport: { width: 1400, height: 1000 } });
|
|
12
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
13
|
+
await ctx.addInitScript(() => {
|
|
14
|
+
try {
|
|
15
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
16
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
17
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
18
|
+
} catch {}
|
|
19
|
+
});
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
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 sessions = ['alpha', 'beta', 'gamma'].map(a => ({
|
|
26
|
+
alias: a, status: 'idle', network_id: nid, project_dir: null,
|
|
27
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
28
|
+
}));
|
|
29
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
30
|
+
});
|
|
31
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: msgs } }));
|
|
32
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
33
|
+
const page = await ctx.newPage();
|
|
34
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
35
|
+
await page.waitForSelector('svg[viewBox="0 0 1000 680"]', { timeout: 30000 });
|
|
36
|
+
await page.waitForTimeout(500);
|
|
37
|
+
const text = await page.evaluate(() => {
|
|
38
|
+
// The active-links chip is the LAST chip in the topo header row (after
|
|
39
|
+
// pressure-bar + vendor + working/online). Match by `active link`.
|
|
40
|
+
const spans = [...document.querySelectorAll('span')];
|
|
41
|
+
return spans.find(s => /active link/.test(s.textContent || ''))?.textContent?.replace(/\s+/g, ' ').trim() || null;
|
|
42
|
+
});
|
|
43
|
+
await ctx.close();
|
|
44
|
+
return text;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 1. No messages → 0 active links, no "· last X" tail
|
|
48
|
+
const empty = await probe({ msgs: [] });
|
|
49
|
+
// 2. One message just now → 1 active link · last Ns ago
|
|
50
|
+
const recent = await probe({ msgs: [
|
|
51
|
+
{ from_alias: 'alpha', to_alias: 'beta', content: 'hi', created_at: new Date(Date.now() - 30 * 1000).toISOString() },
|
|
52
|
+
] });
|
|
53
|
+
// 3. Five messages, latest 4 min ago → 5 active links · last 4m ago (singular link uses "link", plural "links")
|
|
54
|
+
const fourMinAgo = new Date(Date.now() - 4 * 60 * 1000).toISOString();
|
|
55
|
+
const eightMinAgo = new Date(Date.now() - 8 * 60 * 1000).toISOString();
|
|
56
|
+
const five = await probe({ msgs: [
|
|
57
|
+
{ from_alias: 'alpha', to_alias: 'beta', content: '1', created_at: eightMinAgo },
|
|
58
|
+
{ from_alias: 'alpha', to_alias: 'gamma', content: '2', created_at: eightMinAgo },
|
|
59
|
+
{ from_alias: 'alpha', to_alias: 'gamma', content: '3', created_at: eightMinAgo },
|
|
60
|
+
{ from_alias: 'beta', to_alias: 'gamma', content: '4', created_at: eightMinAgo },
|
|
61
|
+
{ from_alias: 'beta', to_alias: 'gamma', content: '5', created_at: fourMinAgo }, // latest
|
|
62
|
+
] });
|
|
63
|
+
|
|
64
|
+
await browser.close();
|
|
65
|
+
const results = {
|
|
66
|
+
emptyChipHasNoTail: empty === '0 active links',
|
|
67
|
+
recentSingularChip: recent !== null && /^1 active link · last \d+s ago$/.test(recent),
|
|
68
|
+
pluralChipShowsLatest: five !== null && /active links · last [34]m ago/.test(five),
|
|
69
|
+
};
|
|
70
|
+
const ok = Object.values(results).every(Boolean);
|
|
71
|
+
console.log(`${ok ? '✅' : '❌'} active-links chip:`, JSON.stringify(results),
|
|
72
|
+
`\n empty=${JSON.stringify(empty)}\n recent=${JSON.stringify(recent)}\n five=${JSON.stringify(five)}`);
|
|
73
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/* Round 16 verification: three flow-link arrow markers exist with the
|
|
2
|
+
* right sizes, all using userSpaceOnUse so they're decoupled from stroke. */
|
|
3
|
+
import { chromium } from 'playwright';
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
|
|
6
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
7
|
+
const browser = await chromium.launch({ headless: true });
|
|
8
|
+
|
|
9
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
10
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
11
|
+
await ctx.addInitScript(() => {
|
|
12
|
+
try {
|
|
13
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
14
|
+
localStorage.removeItem('anet-brand');
|
|
15
|
+
localStorage.removeItem('anet-topo-view');
|
|
16
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
17
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
18
|
+
} catch {}
|
|
19
|
+
});
|
|
20
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
21
|
+
const r = await route.fetch();
|
|
22
|
+
const b = await r.json();
|
|
23
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
24
|
+
const sessions = ['a', 'b', 'c'].map(a => ({
|
|
25
|
+
alias: a, status: 'idle', network_id: nid, project_dir: null,
|
|
26
|
+
created_at: '2026-05-15T00:00:00Z', updated_at: '2026-05-15T00:00:00Z',
|
|
27
|
+
last_seen_at: new Date().toISOString(),
|
|
28
|
+
}));
|
|
29
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
30
|
+
});
|
|
31
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
32
|
+
const page = await ctx.newPage();
|
|
33
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
34
|
+
await page.waitForFunction(() => {
|
|
35
|
+
const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
|
|
36
|
+
return !!svg && svg.querySelectorAll('g[data-node]').length === 3;
|
|
37
|
+
}, { timeout: 30000 }).catch(() => {});
|
|
38
|
+
await page.waitForTimeout(400);
|
|
39
|
+
|
|
40
|
+
const m = await page.evaluate(() => {
|
|
41
|
+
const reads = (id) => {
|
|
42
|
+
const el = document.querySelector(`marker#${id}`);
|
|
43
|
+
if (!el) return null;
|
|
44
|
+
return {
|
|
45
|
+
width: +el.getAttribute('markerWidth'),
|
|
46
|
+
units: el.getAttribute('markerUnits'),
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
return { s: reads('topo-arrow-s'), m: reads('topo-arrow'), l: reads('topo-arrow-l') };
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
await browser.close();
|
|
53
|
+
const results = {
|
|
54
|
+
smallExists: m.s?.width === 12 && m.s?.units === 'userSpaceOnUse',
|
|
55
|
+
mediumExists: m.m?.width === 16 && m.m?.units === 'userSpaceOnUse',
|
|
56
|
+
largeExists: m.l?.width === 22 && m.l?.units === 'userSpaceOnUse',
|
|
57
|
+
legendCompatible: m.m !== null, // legend uses url(#topo-arrow); medium tier must exist by that id
|
|
58
|
+
};
|
|
59
|
+
const ok = Object.values(results).every(Boolean);
|
|
60
|
+
console.log(`${ok ? '✅' : '❌'} arrow tiers:`, JSON.stringify(results), 'sizes:', m);
|
|
61
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* Round 28 verification: first-paint auto-fit zoom when grid content
|
|
2
|
+
* would overflow viewBox; respects persisted view; doesn't fire on
|
|
3
|
+
* small fleets (no overflow). */
|
|
4
|
+
import { chromium } from 'playwright';
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
|
|
7
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
8
|
+
const browser = await chromium.launch({ headless: true });
|
|
9
|
+
|
|
10
|
+
async function probe({ fleetSize, persisted }) {
|
|
11
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 1600 } });
|
|
12
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
13
|
+
await ctx.addInitScript(([pers]) => {
|
|
14
|
+
try {
|
|
15
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
16
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
17
|
+
if (pers) localStorage.setItem('anet-topo-view', JSON.stringify(pers));
|
|
18
|
+
else localStorage.removeItem('anet-topo-view');
|
|
19
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
20
|
+
} catch {}
|
|
21
|
+
}, [persisted]);
|
|
22
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
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
|
+
// Use prefix groups with 5 members each — 7 bands stack vertically
|
|
28
|
+
// and overflow the 680-px viewBox at cellH ≥ 81 (Round 27 floor).
|
|
29
|
+
const aliases = Array.from({ length: fleetSize }, (_, i) => {
|
|
30
|
+
const groups = ['A站', 'B站', 'C站', 'D站', 'E站', 'F站', 'G站', 'H站', 'I站', 'J站'];
|
|
31
|
+
const group = groups[Math.floor(i / 5) % groups.length];
|
|
32
|
+
return `${group}n${i + 1}`;
|
|
33
|
+
});
|
|
34
|
+
const sessions = aliases.map(a => ({
|
|
35
|
+
alias: a, status: 'idle', 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
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
41
|
+
const page = await ctx.newPage();
|
|
42
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
43
|
+
await page.waitForFunction((n) => {
|
|
44
|
+
const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
|
|
45
|
+
return !!svg && svg.querySelectorAll('g[data-node]').length === n;
|
|
46
|
+
}, fleetSize, { timeout: 30000 }).catch(() => {});
|
|
47
|
+
await page.waitForTimeout(600);
|
|
48
|
+
const zoom = await page.evaluate(() => {
|
|
49
|
+
const span = document.querySelector('button[aria-label="Zoom in"]').parentElement.querySelector('span[title*="zoom level"]');
|
|
50
|
+
return +span.textContent.replace('%', '');
|
|
51
|
+
});
|
|
52
|
+
await ctx.close();
|
|
53
|
+
return zoom;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 1. Big fleet (35 nodes / 7 bands → overflows ~680-px viewBox at cellH≥81)
|
|
57
|
+
// with no persisted view → auto-fit triggers (zoom < 100%)
|
|
58
|
+
const bigFresh = await probe({ fleetSize: 35 });
|
|
59
|
+
// 2. Big fleet, user has persisted view (zoom=1) → respect it, no auto-fit
|
|
60
|
+
const bigPersisted = await probe({ fleetSize: 35, persisted: { zoom: 1, x: 0, y: 0 } });
|
|
61
|
+
// 3. Small fleet, no persisted view → no overflow, zoom stays 100%
|
|
62
|
+
const smallFresh = await probe({ fleetSize: 6 });
|
|
63
|
+
|
|
64
|
+
await browser.close();
|
|
65
|
+
const results = {
|
|
66
|
+
bigFleetAutoFits: bigFresh < 100 && bigFresh >= 50,
|
|
67
|
+
persistedRespected: bigPersisted === 100,
|
|
68
|
+
smallFleetStays100: smallFresh === 100,
|
|
69
|
+
};
|
|
70
|
+
const ok = Object.values(results).every(Boolean);
|
|
71
|
+
console.log(`${ok ? '✅' : '❌'} auto-fit:`, JSON.stringify(results),
|
|
72
|
+
`bigFresh=${bigFresh}% bigPersisted=${bigPersisted}% smallFresh=${smallFresh}%`);
|
|
73
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* Round 11 verification: clicking a node opens the ChatPopover AND draws a
|
|
2
|
+
* persistent chat-focus ring on that node (strokeWidth=2.5, status colour).
|
|
3
|
+
* Closing the popover removes the ring. The ring's strokeWidth stays clear
|
|
4
|
+
* of the overlap-test selectors (1.5 / 3). */
|
|
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 browser = await chromium.launch({ headless: true });
|
|
10
|
+
|
|
11
|
+
const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } });
|
|
12
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
13
|
+
await ctx.addInitScript(() => {
|
|
14
|
+
try {
|
|
15
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
16
|
+
localStorage.removeItem('anet-brand');
|
|
17
|
+
localStorage.removeItem('anet-topo-view');
|
|
18
|
+
localStorage.setItem('anet-topo-layout', 'grid');
|
|
19
|
+
localStorage.setItem('anet-topo-nodescale', '1'); // L so radius=26
|
|
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 sessions = ['A站马', 'B站马', 'C站马'].map(a => ({
|
|
28
|
+
alias: a, status: 'idle', network_id: nid,
|
|
29
|
+
project_dir: null,
|
|
30
|
+
created_at: '2026-05-15T00:00:00Z', updated_at: '2026-05-15T00:00:00Z',
|
|
31
|
+
last_seen_at: new Date().toISOString(),
|
|
32
|
+
}));
|
|
33
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
34
|
+
});
|
|
35
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
36
|
+
const page = await ctx.newPage();
|
|
37
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
38
|
+
await page.waitForFunction(() => {
|
|
39
|
+
const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
|
|
40
|
+
return !!svg && svg.querySelectorAll('g[data-node]').length >= 3;
|
|
41
|
+
}, { timeout: 30000 }).catch(() => {});
|
|
42
|
+
await page.waitForTimeout(400);
|
|
43
|
+
|
|
44
|
+
// Pre-click: NO chat-focus ring on any node (strokeWidth=2.5, no group-hover class)
|
|
45
|
+
const ringsBefore = await page.$$eval('svg[viewBox="0 0 1000 680"] g[data-node] circle[stroke-width="2.5"]', els => els.length);
|
|
46
|
+
|
|
47
|
+
// Click A站马 → opens chat popover
|
|
48
|
+
await page.locator('g[data-node="A站马"]').click();
|
|
49
|
+
await page.waitForTimeout(300);
|
|
50
|
+
|
|
51
|
+
const ringsAfter = await page.$$eval('svg[viewBox="0 0 1000 680"] g[data-node] circle[stroke-width="2.5"]', els => els.length);
|
|
52
|
+
const ringOnTarget = await page.$eval(
|
|
53
|
+
'g[data-node="A站马"] circle[stroke-width="2.5"]',
|
|
54
|
+
el => ({ r: +el.getAttribute('r'), opacity: +el.getAttribute('opacity') })
|
|
55
|
+
).catch(() => null);
|
|
56
|
+
|
|
57
|
+
// Confirm popover is open
|
|
58
|
+
const popover = await page.locator('[role="dialog"], [data-chat-popover]').count();
|
|
59
|
+
|
|
60
|
+
// Ring should be ONLY on the clicked node, not on the others
|
|
61
|
+
const ringOnOther = await page.$$eval('g[data-node="B站马"] circle[stroke-width="2.5"], g[data-node="C站马"] circle[stroke-width="2.5"]', els => els.length);
|
|
62
|
+
|
|
63
|
+
const results = {
|
|
64
|
+
noRingBefore: ringsBefore === 0,
|
|
65
|
+
oneRingAfter: ringsAfter === 1,
|
|
66
|
+
ringOnTargetNode: !!ringOnTarget && ringOnTarget.r === 40, // radius=26 + 14
|
|
67
|
+
ringNotOnOthers: ringOnOther === 0,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Re-run the overlap selector to confirm the chat-focus ring isn't mis-counted as a status ring
|
|
71
|
+
const statusRings = await page.$$eval('svg[viewBox="0 0 1000 680"] g[data-node] circle[stroke-width="3"], svg[viewBox="0 0 1000 680"] g[data-node] circle[stroke-width="1.5"]', els => els.length);
|
|
72
|
+
results.statusRingCountUnchanged = statusRings === 3; // exactly one per online node
|
|
73
|
+
|
|
74
|
+
await browser.close();
|
|
75
|
+
const ok = Object.values(results).every(Boolean);
|
|
76
|
+
console.log(`${ok ? '✅' : '❌'} chat-focus ring:`, JSON.stringify(results));
|
|
77
|
+
process.exit(ok ? 0 : 1);
|