@sleep2agi/agent-network-dashboard 0.5.7-preview.6 → 0.5.7-preview.66
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 +0 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +65 -65
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +0 -6
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/next-font-manifest.json +2 -1
- package/.next/server/app/_not-found/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/_not-found.rsc +16 -16
- package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +9 -9
- 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 +3 -3
- package/.next/server/app/admin/page/next-font-manifest.json +2 -1
- package/.next/server/app/admin/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/admin.rsc +20 -19
- package/.next/server/app/admin.segments/_full.segment.rsc +20 -19
- package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
- package/.next/server/app/admin.segments/_index.segment.rsc +9 -9
- package/.next/server/app/admin.segments/_tree.segment.rsc +5 -4
- 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/index.html +4 -4
- package/.next/server/app/index.rsc +20 -19
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +20 -19
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +9 -9
- package/.next/server/app/index.segments/_tree.segment.rsc +5 -4
- package/.next/server/app/login/page/next-font-manifest.json +2 -1
- package/.next/server/app/login/page.js +1 -1
- 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 +20 -19
- package/.next/server/app/login.segments/_full.segment.rsc +20 -19
- package/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/server/app/login.segments/_index.segment.rsc +9 -9
- package/.next/server/app/login.segments/_tree.segment.rsc +5 -4
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/logs/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/logs.rsc +20 -19
- package/.next/server/app/logs.segments/_full.segment.rsc +20 -19
- package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/logs.segments/_index.segment.rsc +9 -9
- package/.next/server/app/logs.segments/_tree.segment.rsc +5 -4
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
- package/.next/server/app/manifest.webmanifest.body +1 -1
- package/.next/server/app/messages/page/next-font-manifest.json +2 -1
- package/.next/server/app/messages/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/messages.rsc +20 -19
- package/.next/server/app/messages.segments/_full.segment.rsc +20 -19
- package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
- package/.next/server/app/messages.segments/_index.segment.rsc +9 -9
- package/.next/server/app/messages.segments/_tree.segment.rsc +5 -4
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/node/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/node.rsc +20 -19
- package/.next/server/app/node.segments/_full.segment.rsc +20 -19
- package/.next/server/app/node.segments/_head.segment.rsc +4 -4
- package/.next/server/app/node.segments/_index.segment.rsc +9 -9
- package/.next/server/app/node.segments/_tree.segment.rsc +5 -4
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/nodes/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/nodes.rsc +20 -19
- package/.next/server/app/nodes.segments/_full.segment.rsc +20 -19
- package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/_index.segment.rsc +9 -9
- package/.next/server/app/nodes.segments/_tree.segment.rsc +5 -4
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/page.js +1 -1
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/server-logs/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/server-logs.rsc +20 -19
- package/.next/server/app/server-logs.segments/_full.segment.rsc +20 -19
- package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/_index.segment.rsc +9 -9
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +5 -4
- 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/servers/page/next-font-manifest.json +2 -1
- package/.next/server/app/servers/page.js +1 -1
- package/.next/server/app/servers/page.js.nft.json +1 -1
- package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/servers.html +4 -4
- package/.next/server/app/servers.rsc +20 -19
- package/.next/server/app/servers.segments/_full.segment.rsc +20 -19
- package/.next/server/app/servers.segments/_head.segment.rsc +4 -4
- package/.next/server/app/servers.segments/_index.segment.rsc +9 -9
- package/.next/server/app/servers.segments/_tree.segment.rsc +5 -4
- package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/servers.segments/servers.segment.rsc +3 -3
- package/.next/server/app/settings/networks/page/next-font-manifest.json +2 -1
- package/.next/server/app/settings/networks/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/settings/networks.rsc +20 -19
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +20 -19
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +5 -4
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/settings/page.js +1 -1
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/settings/tokens/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/settings/tokens.rsc +20 -19
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +20 -19
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +5 -4
- 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 +4 -4
- package/.next/server/app/settings.rsc +20 -19
- package/.next/server/app/settings.segments/_full.segment.rsc +20 -19
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +9 -9
- package/.next/server/app/settings.segments/_tree.segment.rsc +5 -4
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/tasks/[id]/page.js +1 -1
- 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/next-font-manifest.json +2 -1
- package/.next/server/app/tasks/page.js +1 -1
- 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 +4 -4
- package/.next/server/app/tasks.rsc +20 -19
- package/.next/server/app/tasks.segments/_full.segment.rsc +20 -19
- package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/_index.segment.rsc +9 -9
- package/.next/server/app/tasks.segments/_tree.segment.rsc +5 -4
- 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 +0 -1
- package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js +1 -1
- package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__04gz75y._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__04gz75y._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__05kf31s._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__05kf31s._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__096ytyk._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__096ytyk._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0u4-66w._.js +8 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0u4-66w._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_870i8._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_870i8._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0fjlnh~._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0fjlnh~._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js +9 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0wn4jc5._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0wn4jc5._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0r7kb.o._.js +9 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0r7kb.o._.js.map +1 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_servers_page_tsx_0jib5qm._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_servers_page_tsx_0jib5qm._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +30 -15
- package/.next/server/pages/404.html +4 -4
- 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/{0jp~cs9-zkmqa.js → 00b4y77vxfabl.js} +1 -1
- package/.next/static/chunks/00y0qgigxb62-.js +1 -0
- package/.next/static/chunks/049vx3qljs1tt.js +1 -0
- package/.next/static/chunks/04cf.98_cyxen.js +1 -0
- package/.next/static/chunks/066jf0nk75nic.css +2 -0
- package/.next/static/chunks/07sj5zwg46-5~.css +1 -0
- package/.next/static/chunks/0_bn~gcrgo.4n.js +1 -0
- package/.next/static/chunks/0g4d-_fi-d9hg.js +1 -0
- package/.next/static/chunks/0t4lpxu4ny9-3.js +1 -0
- package/.next/static/chunks/0vgrwqsgja19l.js +1 -0
- package/.next/static/chunks/0wz0122ym_gr3.js +1 -0
- package/.next/static/chunks/0xxx7yeapw~2a.js +1 -0
- package/.next/static/chunks/0y5gol09tlu63.js +1 -0
- package/.next/static/chunks/143g3n8za083f.js +7 -0
- package/.next/static/chunks/149a4l50_3vw-.js +7 -0
- package/.next/static/chunks/14lac~_cpjlh..js +1 -0
- package/.next/static/chunks/152_p6jt7txp6.js +1 -0
- package/.next/static/chunks/165v74i3j-wk0.js +1 -0
- package/.next/static/chunks/16glr1c4nc85n.js +4 -0
- package/.next/static/chunks/17-7ama~oijou.js +1 -0
- package/.next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
- package/.next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
- package/.next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
- package/.next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
- package/.next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
- package/.next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
- package/.next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
- package/.next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
- package/.next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
- package/.next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
- package/.next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +1 -2
- package/.next/types/validator.ts +0 -9
- package/app/admin/page.tsx +53 -38
- package/app/components/AgentCard.tsx +20 -9
- package/app/components/AppShell.tsx +7 -1
- package/app/components/ChatPopover.tsx +1 -1
- package/app/components/CollapsibleSearch.tsx +127 -0
- package/app/components/CommandCenter.tsx +14 -4
- package/app/components/CommandPalette.tsx +6 -6
- package/app/components/DispatchPanel.tsx +13 -10
- package/app/components/EmptyState.tsx +11 -4
- package/app/components/HealthBanner.tsx +28 -4
- package/app/components/HelpOverlay.tsx +4 -7
- package/app/components/LoadingSkeleton.tsx +31 -21
- package/app/components/MobileNav.tsx +28 -21
- package/app/components/Sidebar.tsx +30 -23
- package/app/components/StatsBar.tsx +40 -42
- package/app/components/TaskChatPanel.tsx +19 -5
- package/app/components/TaskDrawer.tsx +9 -7
- package/app/components/ThemeSwitcher.tsx +15 -79
- package/app/components/TopoGraph.tsx +31 -21
- package/app/components/UserBar.tsx +5 -5
- package/app/globals.css +1757 -1776
- package/app/layout.tsx +37 -4
- package/app/lib/hooks.ts +0 -5
- package/app/lib/status.ts +24 -17
- package/app/login/page.tsx +7 -7
- package/app/logs/page.tsx +12 -6
- package/app/manifest.ts +2 -2
- package/app/messages/page.tsx +84 -57
- package/app/node/page.tsx +27 -17
- package/app/nodes/page.tsx +62 -49
- package/app/page.tsx +40 -269
- package/app/server-logs/page.tsx +40 -14
- package/app/servers/page.tsx +33 -12
- package/app/settings/networks/page.tsx +17 -15
- package/app/settings/page.tsx +90 -95
- package/app/settings/tokens/page.tsx +5 -5
- package/app/tasks/[id]/page.tsx +10 -10
- package/app/tasks/page.tsx +58 -34
- package/bin/start.js +0 -0
- package/package.json +1 -1
- package/public/favicon.svg +1 -1
- package/public/manifest.webmanifest +24 -0
- package/public/robots.txt +7 -0
- package/.next/server/app/api/hub/license/route/app-paths-manifest.json +0 -3
- package/.next/server/app/api/hub/license/route/build-manifest.json +0 -9
- package/.next/server/app/api/hub/license/route/server-reference-manifest.json +0 -4
- package/.next/server/app/api/hub/license/route.js +0 -7
- package/.next/server/app/api/hub/license/route.js.map +0 -5
- package/.next/server/app/api/hub/license/route.js.nft.json +0 -1
- package/.next/server/app/api/hub/license/route_client-reference-manifest.js +0 -3
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js +0 -3
- package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js +0 -8
- package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__11fu-5m._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__11fu-5m._.js.map +0 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js +0 -3
- package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js.map +0 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +0 -3
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +0 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +0 -9
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +0 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0s5uqlp._.js +0 -9
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0s5uqlp._.js.map +0 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js +0 -3
- package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map +0 -1
- package/.next/static/chunks/0-mpa_947ipeq.js +0 -1
- package/.next/static/chunks/00zay6nmw22rq.js +0 -1
- package/.next/static/chunks/03~5pxwbxxw-b.js +0 -1
- package/.next/static/chunks/04~fkia6-79k3.js +0 -1
- package/.next/static/chunks/0561vp5-q5.zp.js +0 -1
- package/.next/static/chunks/05uk96gc~9mni.js +0 -1
- package/.next/static/chunks/0a.9~-nf0gpec.js +0 -1
- package/.next/static/chunks/0dlmr1dhvv6mu.js +0 -1
- package/.next/static/chunks/0im751o4n61c7.js +0 -1
- package/.next/static/chunks/0inql3s9ldyx5.js +0 -1
- package/.next/static/chunks/0ku0fjqlm9mca.js +0 -1
- package/.next/static/chunks/0mcamnu4w_x1r.js +0 -4
- package/.next/static/chunks/0nqm.7w9_inwd.js +0 -7
- package/.next/static/chunks/0tn~avb7mn01c.css +0 -1
- package/.next/static/chunks/0ynu45t2_2dxl.js +0 -1
- package/.next/static/chunks/13yktdzuatx3d.js +0 -1
- package/.next/static/chunks/15-ltfhot3b4n.js +0 -7
- package/.next/static/chunks/17sxlwlx5fhrp.css +0 -1
- package/.next/static/chunks/181u38qblp8lz.js +0 -1
- package/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
- package/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
- package/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
- package/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
- package/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
- package/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
- package/app/api/hub/license/route.ts +0 -33
- package/app/components/BroadcastBar.tsx +0 -84
- package/app/components/InboxPanel.tsx +0 -36
- /package/.next/static/{ZeU15JAI2Ap6fZ675phhF → 2dHfsg3G4Q4tXXzlz3hFv}/_buildManifest.js +0 -0
- /package/.next/static/{ZeU15JAI2Ap6fZ675phhF → 2dHfsg3G4Q4tXXzlz3hFv}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{ZeU15JAI2Ap6fZ675phhF → 2dHfsg3G4Q4tXXzlz3hFv}/_ssgManifest.js +0 -0
|
@@ -5,19 +5,19 @@ import { usePathname } from 'next/navigation';
|
|
|
5
5
|
import { useState } from 'react';
|
|
6
6
|
import useSWR from 'swr';
|
|
7
7
|
import { useNetworkId } from '../lib/network-context';
|
|
8
|
-
import { ThemeSwitcher } from './ThemeSwitcher';
|
|
9
8
|
|
|
10
9
|
const networkFetcher = (url: string) => fetch(url).then(r => r.ok ? r.json() : { networks: [] });
|
|
11
10
|
|
|
11
|
+
// Cleanup (issue #4): sidebar collapsed to the 6 core destinations. The
|
|
12
|
+
// low-frequency / unverified entries (Messages, Networks, Audit Log,
|
|
13
|
+
// Server Logs) were removed from primary nav — those pages still exist
|
|
14
|
+
// and stay reachable via direct URL and the command palette (⌘K); they
|
|
15
|
+
// were just cluttering the main rail. Restore here if usage warrants.
|
|
12
16
|
const NAV_ITEMS = [
|
|
13
17
|
{ href: '/', label: 'Overview', icon: 'M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6' },
|
|
14
18
|
{ href: '/tasks', label: 'Tasks', icon: 'M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4' },
|
|
15
19
|
{ href: '/nodes', label: 'Nodes', icon: 'M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01' },
|
|
16
20
|
{ href: '/servers', label: 'Servers', icon: 'M4 6.5A2.5 2.5 0 016.5 4h11A2.5 2.5 0 0120 6.5v1A2.5 2.5 0 0117.5 10h-11A2.5 2.5 0 014 7.5v-1zM4 16.5A2.5 2.5 0 016.5 14h11a2.5 2.5 0 012.5 2.5v1a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 014 17.5v-1zM7 7h.01M7 17h.01' },
|
|
17
|
-
{ href: '/messages', label: 'Messages', icon: 'M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z' },
|
|
18
|
-
{ href: '/settings/networks', label: 'Networks', icon: 'M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9' },
|
|
19
|
-
{ href: '/logs', label: 'Audit Log', icon: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' },
|
|
20
|
-
{ href: '/server-logs', label: 'Server Logs', icon: 'M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z' },
|
|
21
21
|
{ href: '/admin', label: 'Admin', icon: 'M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z' },
|
|
22
22
|
{ href: '/settings', label: 'Settings', icon: 'M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z' },
|
|
23
23
|
];
|
|
@@ -74,10 +74,10 @@ export function Sidebar() {
|
|
|
74
74
|
prefetch={false}
|
|
75
75
|
onClick={() => setMobileOpen(false)}
|
|
76
76
|
title={collapsed ? item.label : undefined}
|
|
77
|
-
className={`relative flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#
|
|
77
|
+
className={`relative flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#232327] ${
|
|
78
78
|
isActive(item.href)
|
|
79
79
|
? 'bg-cyan-500/10 text-cyan-300 border border-cyan-500/20 anet-nav-active'
|
|
80
|
-
: 'text-gray-400 hover:text-gray-200 hover:bg-[#
|
|
80
|
+
: 'text-gray-400 hover:text-gray-200 hover:bg-[#1c1c1f]'
|
|
81
81
|
} ${collapsed ? 'justify-center px-0' : ''}`}
|
|
82
82
|
>
|
|
83
83
|
<svg className="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={1.5}>
|
|
@@ -91,10 +91,12 @@ export function Sidebar() {
|
|
|
91
91
|
|
|
92
92
|
return (
|
|
93
93
|
<>
|
|
94
|
-
{/* Mobile hamburger
|
|
94
|
+
{/* Mobile hamburger — R13 of #190: was p-2.5 = ~40px tap target,
|
|
95
|
+
just below the iOS 44px guideline. Bump padding and add an
|
|
96
|
+
explicit min-w/min-h so it can never be miss-tapped. */}
|
|
95
97
|
<button
|
|
96
98
|
onClick={() => setMobileOpen(!mobileOpen)}
|
|
97
|
-
className="fixed top-
|
|
99
|
+
className="fixed top-3 left-3 z-50 lg:hidden bg-[#161618] border border-[#26262b] rounded-lg p-3 min-h-[44px] min-w-[44px] inline-flex items-center justify-center text-gray-400 hover:text-white active:bg-[#232327]"
|
|
98
100
|
aria-label="Toggle menu"
|
|
99
101
|
>
|
|
100
102
|
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
|
@@ -113,15 +115,15 @@ export function Sidebar() {
|
|
|
113
115
|
/>
|
|
114
116
|
)}
|
|
115
117
|
|
|
116
|
-
{/* Sidebar — `bg-[#
|
|
118
|
+
{/* Sidebar — `bg-[#111113]` resolves to var(--bg) in dark themes,
|
|
117
119
|
but in light/mint we want a distinct surface, so we layer
|
|
118
|
-
`lg:bg-white` / `lg:dark:bg-[#
|
|
120
|
+
`lg:bg-white` / `lg:dark:bg-[#111113]` via the theme attribute.
|
|
119
121
|
The CSS shim in globals.css upgrades sidebar bg to bg-secondary
|
|
120
122
|
in light themes so the sidebar reads as its own card.
|
|
121
123
|
Round 47: explicit ease-out curve + slight shadow so the drawer
|
|
122
124
|
edge "leaves a trail" as it slides in. */}
|
|
123
125
|
<aside data-anet-sidebar="true" className={`
|
|
124
|
-
fixed top-0 left-0 h-full z-40 bg-[#
|
|
126
|
+
fixed top-0 left-0 h-full z-40 bg-[#111113] border-r border-[#26262b]
|
|
125
127
|
transition-transform duration-200 ease-out
|
|
126
128
|
${collapsed ? 'w-16' : 'w-52'}
|
|
127
129
|
${mobileOpen ? 'translate-x-0 shadow-2xl shadow-black/40 lg:shadow-none' : '-translate-x-full'}
|
|
@@ -131,11 +133,11 @@ export function Sidebar() {
|
|
|
131
133
|
with an inline live "online" pulse so every page surfaces
|
|
132
134
|
fleet health without leaving for /nodes. */}
|
|
133
135
|
<SidebarBrand collapsed={collapsed} />
|
|
134
|
-
<div className={`border-b border-[#
|
|
136
|
+
<div className={`border-b border-[#26262b]`} />
|
|
135
137
|
|
|
136
138
|
{/* Network list */}
|
|
137
139
|
{!collapsed && networks.length > 0 && (
|
|
138
|
-
<div className="px-2 py-3 border-b border-[#
|
|
140
|
+
<div className="px-2 py-3 border-b border-[#26262b]">
|
|
139
141
|
<div className="px-3 text-[10px] text-gray-600 uppercase mb-2">Networks</div>
|
|
140
142
|
<div className="space-y-0.5 max-h-32 overflow-y-auto">
|
|
141
143
|
{networks.map((n: SidebarNetwork) => (
|
|
@@ -143,10 +145,10 @@ export function Sidebar() {
|
|
|
143
145
|
key={n.network_id}
|
|
144
146
|
onClick={() => { setNetworkId(n.network_id); setMobileOpen(false); }}
|
|
145
147
|
title={n.network_id}
|
|
146
|
-
className={`w-full flex items-center gap-2 px-3 py-1.5 rounded-md text-xs transition-colors text-left ${
|
|
148
|
+
className={`w-full flex items-center gap-2 px-3 py-2.5 lg:py-1.5 rounded-md text-xs transition-colors text-left ${
|
|
147
149
|
networkId === n.network_id
|
|
148
150
|
? 'bg-cyan-500/10 text-cyan-300'
|
|
149
|
-
: 'text-gray-500 hover:text-gray-300 hover:bg-[#
|
|
151
|
+
: 'text-gray-500 hover:text-gray-300 hover:bg-[#1c1c1f]'
|
|
150
152
|
}`}
|
|
151
153
|
>
|
|
152
154
|
<span>{ROLE_ICON[n.role || 'member'] || '👤'}</span>
|
|
@@ -164,21 +166,27 @@ export function Sidebar() {
|
|
|
164
166
|
</div>
|
|
165
167
|
)}
|
|
166
168
|
|
|
167
|
-
|
|
169
|
+
{/* #209 R26 (Vincent msg 540 screenshot — "设置页面没展示全"): the
|
|
170
|
+
absolute-bottom footer below stacks 3 rows (Quick search /
|
|
171
|
+
Sign out / collapse) ≈ 92-100px tall, but this spacer was
|
|
172
|
+
pb-20 (80px), so the last nav entry (Settings on /settings)
|
|
173
|
+
was being eaten by the footer overlay. Bump to pb-28 (112px)
|
|
174
|
+
to clear the actual footer height. */}
|
|
175
|
+
<div className="pb-28">
|
|
168
176
|
{nav}
|
|
169
177
|
</div>
|
|
170
178
|
|
|
171
179
|
{/* Sign out + collapse — round 27: collapsed-state gets icon-only
|
|
172
180
|
variants so users still have Sign out / Quick search access at
|
|
173
181
|
56px width, plus title= tooltips. */}
|
|
174
|
-
<div className="absolute bottom-0 left-0 right-0 border-t border-[#
|
|
182
|
+
<div className="absolute bottom-0 left-0 right-0 border-t border-[#26262b] bg-[#111113]">
|
|
175
183
|
<button
|
|
176
184
|
onClick={() => {
|
|
177
185
|
window.dispatchEvent(new KeyboardEvent('keydown', { key: 'k', metaKey: true, ctrlKey: true }));
|
|
178
186
|
}}
|
|
179
187
|
title={collapsed ? 'Quick search (⌘K)' : undefined}
|
|
180
|
-
className={`w-full flex items-center text-[11px] text-gray-600 hover:text-gray-400 hover:bg-[#
|
|
181
|
-
collapsed ? 'justify-center px-0 py-2.5' : 'justify-between gap-2 px-5 py-2'
|
|
188
|
+
className={`w-full flex items-center text-[11px] text-gray-600 hover:text-gray-400 hover:bg-[#1c1c1f] transition-colors ${
|
|
189
|
+
collapsed ? 'justify-center px-0 py-2.5' : 'justify-between gap-2 px-5 py-3 lg:py-2'
|
|
182
190
|
}`}
|
|
183
191
|
aria-label="Open command palette"
|
|
184
192
|
>
|
|
@@ -206,8 +214,7 @@ export function Sidebar() {
|
|
|
206
214
|
</svg>
|
|
207
215
|
{!collapsed && 'Sign out'}
|
|
208
216
|
</button>
|
|
209
|
-
<div className={`flex items-center
|
|
210
|
-
<ThemeSwitcher compact={collapsed} />
|
|
217
|
+
<div className={`flex items-center ${collapsed ? 'flex-col px-0 py-2' : 'px-3 py-2 justify-end'}`}>
|
|
211
218
|
<button
|
|
212
219
|
onClick={() => setCollapsed(!collapsed)}
|
|
213
220
|
title={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
|
|
@@ -255,7 +262,7 @@ function SidebarBrand({ collapsed }: { collapsed: boolean }) {
|
|
|
255
262
|
return (
|
|
256
263
|
<Link
|
|
257
264
|
href="/"
|
|
258
|
-
className="block px-4 py-4 flex items-center gap-3 hover:bg-[#
|
|
265
|
+
className="block px-4 py-4 flex items-center gap-3 hover:bg-[#161618]/40 transition-colors rounded-r-xl"
|
|
259
266
|
aria-label="Agent Network — home"
|
|
260
267
|
>
|
|
261
268
|
<BrandMark size={32} />
|
|
@@ -4,29 +4,35 @@ interface StatsBarProps {
|
|
|
4
4
|
online: number;
|
|
5
5
|
working: number;
|
|
6
6
|
total: number;
|
|
7
|
-
version: string;
|
|
8
|
-
uptime: string;
|
|
9
7
|
}
|
|
10
8
|
|
|
11
|
-
export function StatsBar({ online, working, total
|
|
9
|
+
export function StatsBar({ online, working, total }: StatsBarProps) {
|
|
12
10
|
const onlinePercent = total > 0 ? Math.round((online / total) * 100) : 0;
|
|
13
11
|
const fleetEmpty = total === 0;
|
|
14
12
|
|
|
13
|
+
// #209 R29 (mobile vertical rhythm — goal "大幅提升移动端体验"):
|
|
14
|
+
// populated branch previously left mb-8 (32 px) below the 4-card grid,
|
|
15
|
+
// the single biggest gap on the Overview page. Drop to mb-4 (16 px)
|
|
16
|
+
// on phones, restore mb-8 from sm: up. Pairs with R28's section-gap
|
|
17
|
+
// tighten — together they reclaim ~48 px of pure scroll waste before
|
|
18
|
+
// the agent grid. The empty-fleet branch already used mb-4 since R72,
|
|
19
|
+
// so this only touches the populated case.
|
|
15
20
|
return (
|
|
16
|
-
<div className={fleetEmpty ? 'mb-4' : 'mb-8'}>
|
|
17
|
-
{/* Title row
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
<div className={fleetEmpty ? 'mb-4' : 'mb-4 sm:mb-8'}>
|
|
22
|
+
{/* Title row. #217 S3 dropped the version/uptime subtitle (lives in
|
|
23
|
+
Settings → CommHub Connection). S9 (Vincent tg 613 "没居中"):
|
|
24
|
+
WeChat-style centered title on phones — centering also clears
|
|
25
|
+
the fixed hamburger symmetrically, replacing the old ml-10
|
|
26
|
+
indent that read as misalignment. Left-aligned from lg: up. */}
|
|
27
|
+
<div className="mb-4">
|
|
28
|
+
<h1 className="text-2xl font-bold text-white tracking-tight text-center lg:text-left">Agent Network</h1>
|
|
23
29
|
</div>
|
|
24
30
|
|
|
25
31
|
{fleetEmpty ? (
|
|
26
32
|
/* Round 72: thin status strip replaces the 4-card grid when fleet
|
|
27
33
|
is empty. Saves ~280px on mobile (CTA y=650 → ~370) and keeps
|
|
28
34
|
the same data visible in a single inline row. */
|
|
29
|
-
<div className="anet-stat-strip flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-gray-500 border-t border-b border-[#
|
|
35
|
+
<div className="anet-stat-strip flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs text-gray-500 border-t border-b border-[#26262b] py-2">
|
|
30
36
|
<span className="inline-flex items-center gap-1.5">
|
|
31
37
|
<span aria-hidden className="inline-block w-1.5 h-1.5 rounded-full bg-gray-600" />
|
|
32
38
|
<span className="text-gray-300 tabular-nums">0</span> online
|
|
@@ -43,39 +49,36 @@ export function StatsBar({ online, working, total, version, uptime }: StatsBarPr
|
|
|
43
49
|
</span>
|
|
44
50
|
</div>
|
|
45
51
|
) : (
|
|
46
|
-
/* Populated state
|
|
47
|
-
|
|
52
|
+
/* Populated state. #217 S2 (less is more): the Working card only
|
|
53
|
+
earns its grid cell when something is actually working — a
|
|
54
|
+
"0 / 0% utilization" card is dead weight, and dropping it
|
|
55
|
+
collapses the mobile 2×2 grid to one 3-up row. */
|
|
56
|
+
<div className={`grid gap-3 ${working > 0 ? 'grid-cols-2 sm:grid-cols-4' : 'grid-cols-3'}`}>
|
|
48
57
|
<StatCard
|
|
49
58
|
value={online}
|
|
50
59
|
label="Online"
|
|
51
60
|
sub={`${onlinePercent}% of fleet`}
|
|
52
61
|
color="text-green-400"
|
|
53
|
-
accent="from-green-500/20 to-green-500/0"
|
|
54
|
-
border="border-green-500/15"
|
|
55
|
-
/>
|
|
56
|
-
<StatCard
|
|
57
|
-
value={working}
|
|
58
|
-
label="Working"
|
|
59
|
-
sub={online > 0 ? `${Math.round((working / online) * 100)}% utilization` : '--'}
|
|
60
|
-
color="text-cyan-400"
|
|
61
|
-
accent="from-cyan-500/20 to-cyan-500/0"
|
|
62
|
-
border="border-cyan-500/15"
|
|
63
62
|
/>
|
|
63
|
+
{working > 0 && (
|
|
64
|
+
<StatCard
|
|
65
|
+
value={working}
|
|
66
|
+
label="Working"
|
|
67
|
+
sub={online > 0 ? `${Math.round((working / online) * 100)}% utilization` : '--'}
|
|
68
|
+
color="text-cyan-400"
|
|
69
|
+
/>
|
|
70
|
+
)}
|
|
64
71
|
<StatCard
|
|
65
72
|
value={total - online}
|
|
66
73
|
label="Offline"
|
|
67
74
|
sub={total - online === 0 ? 'All systems go' : `${total - online} disconnected`}
|
|
68
75
|
color="text-gray-400"
|
|
69
|
-
accent="from-gray-500/10 to-gray-500/0"
|
|
70
|
-
border="border-gray-500/15"
|
|
71
76
|
/>
|
|
72
77
|
<StatCard
|
|
73
78
|
value={total}
|
|
74
79
|
label="Total"
|
|
75
80
|
sub="Registered nodes"
|
|
76
81
|
color="text-white"
|
|
77
|
-
accent="from-blue-500/15 to-blue-500/0"
|
|
78
|
-
border="border-blue-500/15"
|
|
79
82
|
/>
|
|
80
83
|
</div>
|
|
81
84
|
)}
|
|
@@ -83,23 +86,18 @@ export function StatsBar({ online, working, total, version, uptime }: StatsBarPr
|
|
|
83
86
|
);
|
|
84
87
|
}
|
|
85
88
|
|
|
86
|
-
function StatCard({ value, label, sub, color
|
|
87
|
-
value: number; label: string; sub: string; color: string;
|
|
89
|
+
function StatCard({ value, label, sub, color }: {
|
|
90
|
+
value: number; label: string; sub: string; color: string;
|
|
88
91
|
}) {
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
+
// #217 D2 (OpenWebUI-style color restraint): the per-color gradient
|
|
93
|
+
// wash + tinted borders made the KPI row read as four neon billboards.
|
|
94
|
+
// Surfaces are now neutral (shared border + bg); color survives only
|
|
95
|
+
// on the number itself. Mobile density values are #209 R39.
|
|
92
96
|
return (
|
|
93
|
-
<div
|
|
94
|
-
|
|
95
|
-
className=
|
|
96
|
-
|
|
97
|
-
<div className={`absolute inset-0 bg-gradient-to-br ${accent} pointer-events-none`} />
|
|
98
|
-
<div className="relative">
|
|
99
|
-
<div className={`text-3xl font-bold ${color} tabular-nums leading-tight`}>{value}</div>
|
|
100
|
-
<div className="text-sm text-gray-300 mt-0.5">{label}</div>
|
|
101
|
-
<div className="text-xs text-gray-600 mt-1">{sub}</div>
|
|
102
|
-
</div>
|
|
97
|
+
<div className="anet-stat-card rounded-xl border border-[#26262b] bg-[#161618] px-3 sm:px-4 py-2.5 sm:py-3 transition-all">
|
|
98
|
+
<div className={`text-2xl sm:text-3xl font-bold ${color} tabular-nums leading-tight`}>{value}</div>
|
|
99
|
+
<div className="text-xs sm:text-sm text-gray-300 mt-0.5">{label}</div>
|
|
100
|
+
<div className="text-[10px] sm:text-xs text-gray-600 mt-1">{sub}</div>
|
|
103
101
|
</div>
|
|
104
102
|
);
|
|
105
103
|
}
|
|
@@ -483,7 +483,14 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
|
|
|
483
483
|
const chatContent = (
|
|
484
484
|
<>
|
|
485
485
|
{/* Messages area */}
|
|
486
|
-
|
|
486
|
+
{/* R12 of #190 mobile polish: the chat scroll surface used
|
|
487
|
+
space-y-3 between task+reply pairs at mobile = 12 px, which
|
|
488
|
+
in a long thread (the panel's bread-and-butter use case)
|
|
489
|
+
adds up to a significant scroll length. Drop to space-y-2 at
|
|
490
|
+
mobile and the per-pair grouping (line 540) from space-y-2
|
|
491
|
+
to space-y-1.5 so messages read denser without losing the
|
|
492
|
+
speaker-turn rhythm. Desktop unchanged at sm: and up. */}
|
|
493
|
+
<div className="flex-1 overflow-y-auto px-3 py-3 sm:px-4 sm:py-4 space-y-2 sm:space-y-4">
|
|
487
494
|
{!historyLoaded && (
|
|
488
495
|
<div className="flex justify-center py-8">
|
|
489
496
|
<div className="w-5 h-5 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin" />
|
|
@@ -537,7 +544,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
|
|
|
537
544
|
);
|
|
538
545
|
}
|
|
539
546
|
return (
|
|
540
|
-
<div key={`${m.task_id}:task`} className="space-y-2">
|
|
547
|
+
<div key={`${m.task_id}:task`} className="space-y-1.5 sm:space-y-2">
|
|
541
548
|
{/* Outgoing task — labeled with origin so peer-forwarded tasks are obvious */}
|
|
542
549
|
<div className="flex justify-end">
|
|
543
550
|
<div className="max-w-[92%] sm:max-w-[85%] bg-cyan-500/8 border border-cyan-500/15 rounded-2xl rounded-br-md px-3 py-2.5 sm:px-4 shadow-sm">
|
|
@@ -626,8 +633,11 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
|
|
|
626
633
|
</select>
|
|
627
634
|
</div>
|
|
628
635
|
</div>
|
|
629
|
-
|
|
630
|
-
|
|
636
|
+
{/* R17 of #190: send button was p-2.5 + w-5 icon = ~40 x 40
|
|
637
|
+
hit zone, 4 px short of the iOS 44 px guideline on
|
|
638
|
+
the short axis. Bump to inline-flex + min-h/w 44. */}
|
|
639
|
+
<button onClick={send} aria-label="Send message" disabled={sending || (!input.trim() && attachedFiles.length === 0)}
|
|
640
|
+
className="inline-flex min-h-[44px] min-w-[44px] items-center justify-center bg-cyan-600 hover:bg-cyan-500 disabled:bg-[var(--border)] disabled:text-[var(--fg-dim)] text-[var(--fg)] rounded-xl transition-all shrink-0 active:scale-95">
|
|
631
641
|
{sending ? (
|
|
632
642
|
<div className="w-5 h-5 border-2 border-white/30 border-t-white rounded-full animate-spin" />
|
|
633
643
|
) : (
|
|
@@ -673,7 +683,11 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
|
|
|
673
683
|
<div className="text-[10px] text-[var(--fg-muted)]">{pollingIds.size > 0 ? 'Processing...' : 'Ready'}</div>
|
|
674
684
|
</div>
|
|
675
685
|
</div>
|
|
676
|
-
|
|
686
|
+
{/* R16 of #190: was p-1.5 + w-5 h-5 svg = ~32 px tap target.
|
|
687
|
+
The chat panel close is high-frequency on mobile (user
|
|
688
|
+
dismisses to scroll the underlying page); bump to a
|
|
689
|
+
uniform 44 x 44 hit zone via inline-flex + min-h/w. */}
|
|
690
|
+
<button onClick={onClose} aria-label="Close chat" className="inline-flex min-h-[44px] min-w-[44px] items-center justify-center text-[var(--fg-muted)] hover:text-[var(--fg)] rounded-lg hover:bg-[var(--bg-elevated)]">
|
|
677
691
|
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
|
678
692
|
<path strokeLinecap="round" strokeLinejoin="round" d="M6 18L18 6M6 6l12 12" />
|
|
679
693
|
</svg>
|
|
@@ -81,14 +81,16 @@ export function TaskDrawer({ taskId, onClose }: TaskDrawerProps) {
|
|
|
81
81
|
return (
|
|
82
82
|
<>
|
|
83
83
|
<div className="fixed inset-0 bg-black/30 z-40 anet-fade-in" onClick={onClose} />
|
|
84
|
-
<div className="fixed top-0 right-0 h-[100dvh] w-full lg:w-[500px] bg-[#
|
|
84
|
+
<div className="fixed top-0 right-0 h-[100dvh] w-full lg:w-[500px] bg-[#0b0b0d] border-l border-[#26262b] z-50 flex flex-col shadow-2xl shadow-black/60 overflow-y-auto animate-slide-in">
|
|
85
85
|
{/* Header */}
|
|
86
|
-
<div className="flex items-center justify-between px-5 py-4 border-b border-[#
|
|
86
|
+
<div className="flex items-center justify-between px-5 py-4 border-b border-[#26262b] bg-[#111113] sticky top-0">
|
|
87
87
|
<div>
|
|
88
88
|
<div className="text-sm font-semibold text-white">Task Detail</div>
|
|
89
89
|
<div className="text-[10px] text-gray-500 mt-0.5">{taskId.slice(0, 16)}...</div>
|
|
90
90
|
</div>
|
|
91
|
-
|
|
91
|
+
{/* R16 of #190: same chat-panel close pattern — was ~32 px
|
|
92
|
+
tap target; lift to a uniform 44 x 44 hit zone. */}
|
|
93
|
+
<button onClick={onClose} aria-label="Close task drawer" className="inline-flex min-h-[44px] min-w-[44px] items-center justify-center text-gray-500 hover:text-white rounded-lg hover:bg-[#1c1c1f]">
|
|
92
94
|
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
|
93
95
|
<path strokeLinecap="round" strokeLinejoin="round" d="M6 18L18 6M6 6l12 12" />
|
|
94
96
|
</svg>
|
|
@@ -127,7 +129,7 @@ export function TaskDrawer({ taskId, onClose }: TaskDrawerProps) {
|
|
|
127
129
|
|
|
128
130
|
{/* Timeline — round 36 polish: relative timestamps, current-step
|
|
129
131
|
pulse if task is still in flight, full ISO in title=. */}
|
|
130
|
-
<div className="bg-[#
|
|
132
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
131
133
|
<div className="flex items-center justify-between mb-3">
|
|
132
134
|
<div className="text-xs text-gray-500 uppercase tracking-wide">Timeline</div>
|
|
133
135
|
{duration !== null && (
|
|
@@ -180,14 +182,14 @@ export function TaskDrawer({ taskId, onClose }: TaskDrawerProps) {
|
|
|
180
182
|
</div>
|
|
181
183
|
|
|
182
184
|
{/* Content */}
|
|
183
|
-
<div className="bg-[#
|
|
185
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
184
186
|
<div className="text-xs text-gray-500 uppercase mb-2">Input</div>
|
|
185
187
|
<div className="text-sm text-gray-300 whitespace-pre-wrap">{task.content || '--'}</div>
|
|
186
188
|
</div>
|
|
187
189
|
|
|
188
190
|
{/* Result */}
|
|
189
191
|
{task.result && (
|
|
190
|
-
<div className="bg-[#
|
|
192
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
191
193
|
<div className="text-xs text-gray-500 uppercase mb-2">Output</div>
|
|
192
194
|
<div className="text-sm text-gray-300 whitespace-pre-wrap max-h-64 overflow-y-auto">{task.result}</div>
|
|
193
195
|
</div>
|
|
@@ -195,7 +197,7 @@ export function TaskDrawer({ taskId, onClose }: TaskDrawerProps) {
|
|
|
195
197
|
|
|
196
198
|
{/* Events */}
|
|
197
199
|
{events.length > 0 && (
|
|
198
|
-
<div className="bg-[#
|
|
200
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
199
201
|
<div className="text-xs text-gray-500 uppercase mb-2">Events ({events.length})</div>
|
|
200
202
|
<div className="space-y-1.5 max-h-40 overflow-y-auto">
|
|
201
203
|
{events.map(e => (
|
|
@@ -1,89 +1,25 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useEffect
|
|
3
|
+
import { useEffect } from 'react';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
// #217 S6 — two verified themes: cyber (dark, default) and light (white,
|
|
6
|
+
// Vincent-requested, tokens restored from pre-R8 history). The issue #4
|
|
7
|
+
// cleanup locked this to cyber because the old light/mint/sunset themes
|
|
8
|
+
// were unverified; light is now owned by Settings → Appearance, so the
|
|
9
|
+
// provider honors the persisted choice again. Anything else in storage
|
|
10
|
+
// (old mint/sunset values) falls back to cyber.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
const THEME_KEY = 'anet-theme';
|
|
14
|
-
|
|
15
|
-
function applyTheme(theme: ThemeId) {
|
|
16
|
-
if (typeof document !== 'undefined') {
|
|
17
|
-
document.documentElement.setAttribute('data-theme', theme);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
12
|
+
const THEMES = new Set(['cyber', 'light']);
|
|
20
13
|
|
|
21
14
|
export function ThemeProvider({ children }: { children: React.ReactNode }) {
|
|
22
|
-
// Apply persisted theme on first render so we don't flash dark before
|
|
23
|
-
// user-selected light. Initial value comes from cookie/localStorage.
|
|
24
15
|
useEffect(() => {
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
if (typeof document === 'undefined') return;
|
|
17
|
+
let t = 'cyber';
|
|
18
|
+
try {
|
|
19
|
+
const saved = localStorage.getItem('anet-theme');
|
|
20
|
+
if (saved && THEMES.has(saved)) t = saved;
|
|
21
|
+
} catch {}
|
|
22
|
+
document.documentElement.setAttribute('data-theme', t);
|
|
27
23
|
}, []);
|
|
28
24
|
return <>{children}</>;
|
|
29
25
|
}
|
|
30
|
-
|
|
31
|
-
export function ThemeSwitcher({ compact = false }: { compact?: boolean }) {
|
|
32
|
-
const [theme, setTheme] = useState<ThemeId>('cyber');
|
|
33
|
-
const [open, setOpen] = useState(false);
|
|
34
|
-
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
const stored = (localStorage.getItem(THEME_KEY) as ThemeId) || 'cyber';
|
|
37
|
-
setTheme(stored);
|
|
38
|
-
applyTheme(stored);
|
|
39
|
-
}, []);
|
|
40
|
-
|
|
41
|
-
function pick(next: ThemeId) {
|
|
42
|
-
setTheme(next);
|
|
43
|
-
localStorage.setItem(THEME_KEY, next);
|
|
44
|
-
applyTheme(next);
|
|
45
|
-
setOpen(false);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const current = THEMES.find(t => t.id === theme) || THEMES[0];
|
|
49
|
-
|
|
50
|
-
return (
|
|
51
|
-
<div className="relative">
|
|
52
|
-
<button
|
|
53
|
-
aria-label="切换主题"
|
|
54
|
-
onClick={() => setOpen(!open)}
|
|
55
|
-
className="px-2.5 py-1.5 rounded-md text-xs flex items-center gap-1.5 hover:opacity-80 transition-opacity"
|
|
56
|
-
style={{ background: 'var(--bg-elevated)', color: 'var(--fg)', border: '1px solid var(--border)' }}
|
|
57
|
-
>
|
|
58
|
-
<span aria-hidden>{current.emoji}</span>
|
|
59
|
-
{!compact && <span>{current.label}</span>}
|
|
60
|
-
</button>
|
|
61
|
-
{open && (
|
|
62
|
-
<>
|
|
63
|
-
<div className="fixed inset-0 z-40" onClick={() => setOpen(false)} />
|
|
64
|
-
<div
|
|
65
|
-
className="absolute right-0 top-full mt-1 z-50 rounded-md min-w-[160px] py-1 shadow-lg"
|
|
66
|
-
style={{ background: 'var(--bg-secondary)', border: '1px solid var(--border)' }}
|
|
67
|
-
>
|
|
68
|
-
{THEMES.map(t => (
|
|
69
|
-
<button
|
|
70
|
-
key={t.id}
|
|
71
|
-
onClick={() => pick(t.id)}
|
|
72
|
-
className="w-full px-3 py-2 text-left text-xs flex items-center gap-2 hover:opacity-80"
|
|
73
|
-
style={{
|
|
74
|
-
background: t.id === theme ? 'var(--bg-elevated)' : 'transparent',
|
|
75
|
-
color: 'var(--fg)',
|
|
76
|
-
}}
|
|
77
|
-
>
|
|
78
|
-
<span aria-hidden>{t.emoji}</span>
|
|
79
|
-
<span className="flex-1">{t.label}</span>
|
|
80
|
-
<span style={{ color: 'var(--fg-dim)' }} className="text-[10px]">{t.desc}</span>
|
|
81
|
-
{t.id === theme && <span style={{ color: 'var(--accent)' }}>•</span>}
|
|
82
|
-
</button>
|
|
83
|
-
))}
|
|
84
|
-
</div>
|
|
85
|
-
</>
|
|
86
|
-
)}
|
|
87
|
-
</div>
|
|
88
|
-
);
|
|
89
|
-
}
|