@sleep2agi/agent-network-dashboard 0.5.7-preview.7 → 0.5.7-preview.75
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 +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -1
- 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]__0nw1f-j._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw1f-j._.js.map +1 -0
- 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_012oyw5._.js +3 -0
- package/.next/server/chunks/ssr/agent-network-dashboard_app_012oyw5._.js.map +1 -0
- 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_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/0.mh8n0itrii5.js +1 -0
- package/.next/static/chunks/049vx3qljs1tt.js +1 -0
- package/.next/static/chunks/04uju~n5s9g7..css +1 -0
- package/.next/static/chunks/066jf0nk75nic.css +2 -0
- package/.next/static/chunks/06vp7429lrzl7.js +1 -0
- package/.next/static/chunks/{0jp~cs9-zkmqa.js → 07h2umbpc5lqy.js} +2 -2
- package/.next/static/chunks/0_bn~gcrgo.4n.js +1 -0
- package/.next/static/chunks/0_cm~9rtqil56.js +1 -0
- package/.next/static/chunks/0cp0cz3mxejl~.js +4 -0
- package/.next/static/chunks/0g1o7c8fbafn7.js +1 -0
- package/.next/static/chunks/0g4d-_fi-d9hg.js +1 -0
- package/.next/static/chunks/0iv.0p9_5b36e.js +1 -0
- package/.next/static/chunks/0tor7h4q5_rz..js +1 -0
- package/.next/static/chunks/0vun~4ljcrj3p.js +7 -0
- package/.next/static/chunks/0wz0122ym_gr3.js +1 -0
- package/.next/static/chunks/0y5gol09tlu63.js +1 -0
- package/.next/static/chunks/114o05335p68v.js +1 -0
- package/.next/static/chunks/14141xj5.1t3t.js +1 -0
- package/.next/static/chunks/149a4l50_3vw-.js +7 -0
- package/.next/static/chunks/15hos-r_t7doi.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 +36 -20
- 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 +19 -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 +69 -42
- package/app/components/TaskChatPanel.tsx +105 -12
- 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 +4 -6
- 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 +108 -50
- package/app/node/page.tsx +27 -17
- package/app/nodes/page.tsx +62 -49
- package/app/page.tsx +60 -282
- 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 +102 -96
- 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/02to42x11p557.js +0 -7
- 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/085rejlait1fs.js +0 -1
- package/.next/static/chunks/0a.9~-nf0gpec.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/0ss8u23bnbyry.js +0 -1
- package/.next/static/chunks/0~rv5y.y5my9s.css +0 -1
- package/.next/static/chunks/13yktdzuatx3d.js +0 -1
- package/.next/static/chunks/15-ltfhot3b4n.js +0 -7
- package/.next/static/chunks/16ls93seuyj8a.js +0 -1
- 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/{vv4Gz5yVhOzydMI2UlT1l → nPhsSMLrgn8H0RsXNP4ku}/_buildManifest.js +0 -0
- /package/.next/static/{vv4Gz5yVhOzydMI2UlT1l → nPhsSMLrgn8H0RsXNP4ku}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{vv4Gz5yVhOzydMI2UlT1l → nPhsSMLrgn8H0RsXNP4ku}/_ssgManifest.js +0 -0
|
@@ -96,24 +96,24 @@ export default function NetworksPage() {
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
return (
|
|
99
|
-
<div className="min-h-screen bg-[#
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
<div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
|
|
100
|
+
{/* #217 D9: back link stacks above the title instead of sitting
|
|
101
|
+
beside it — the old single row read as an off-balance
|
|
102
|
+
"← Settings Networks" pair on phones. */}
|
|
103
|
+
<div className="mb-6">
|
|
104
|
+
<Link href="/settings" className="inline-block text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10 mb-1">← Settings</Link>
|
|
102
105
|
<h1 className="text-2xl font-bold text-white">Networks</h1>
|
|
103
|
-
{/* Round 93: dropped {networks.length} header chip — the
|
|
104
|
-
My Networks panel below already carries `<N> total` in its
|
|
105
|
-
own subhead. Matches r86/r87 pattern. */}
|
|
106
106
|
</div>
|
|
107
107
|
|
|
108
108
|
<div className="max-w-2xl space-y-6">
|
|
109
109
|
{/* Create */}
|
|
110
|
-
<section className="bg-[#
|
|
110
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
111
111
|
<h2 className="text-sm font-semibold text-gray-300 mb-3">Create Network</h2>
|
|
112
112
|
<div className="space-y-3">
|
|
113
113
|
<input type="text" value={newName} onChange={e => setNewName(e.target.value)} placeholder="Network name"
|
|
114
|
-
className="w-full bg-[#
|
|
114
|
+
className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
115
115
|
<input type="text" value={newDesc} onChange={e => setNewDesc(e.target.value)} placeholder="Description (optional)"
|
|
116
|
-
className="w-full bg-[#
|
|
116
|
+
className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
117
117
|
<button onClick={createNetwork} disabled={!newName.trim()}
|
|
118
118
|
className="px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors">
|
|
119
119
|
Create
|
|
@@ -123,10 +123,12 @@ export default function NetworksPage() {
|
|
|
123
123
|
</section>
|
|
124
124
|
|
|
125
125
|
{/* List */}
|
|
126
|
-
<section className="bg-[#
|
|
126
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
127
127
|
<div className="flex items-center justify-between mb-3">
|
|
128
128
|
<h2 className="text-sm font-semibold text-gray-300">My Networks</h2>
|
|
129
|
-
{
|
|
129
|
+
{/* #217 D9: "N TOTAL" counter dropped below 4 rows — counting
|
|
130
|
+
a visibly one-item list is noise (D6 conditional rule). */}
|
|
131
|
+
{networks.length > 3 && (
|
|
130
132
|
<span className="text-[10px] text-gray-600 uppercase tracking-wide">{networks.length} total</span>
|
|
131
133
|
)}
|
|
132
134
|
</div>
|
|
@@ -141,7 +143,7 @@ export default function NetworksPage() {
|
|
|
141
143
|
) : (
|
|
142
144
|
<div className="space-y-3">
|
|
143
145
|
{networks.map(n => (
|
|
144
|
-
<div key={n.network_id} className="bg-[#
|
|
146
|
+
<div key={n.network_id} className="bg-[#0e0e10] rounded-lg px-4 py-3 border border-[#1c1c1f]">
|
|
145
147
|
<div className="flex items-start justify-between gap-3">
|
|
146
148
|
<div className="flex items-start gap-3 min-w-0">
|
|
147
149
|
<AliasAvatar alias={n.network_name} size={28} />
|
|
@@ -173,7 +175,7 @@ export default function NetworksPage() {
|
|
|
173
175
|
</div>
|
|
174
176
|
|
|
175
177
|
{expandedNetwork === n.network_id && (
|
|
176
|
-
<div className="mt-3 pt-3 border-t border-[#
|
|
178
|
+
<div className="mt-3 pt-3 border-t border-[#1c1c1f]">
|
|
177
179
|
<div className="text-xs text-gray-500 mb-2">Members ({(members[n.network_id] || []).length})</div>
|
|
178
180
|
{(members[n.network_id] || []).length === 0 ? (
|
|
179
181
|
<div className="text-[10px] text-gray-600">No members or V3 auth required</div>
|
|
@@ -195,11 +197,11 @@ export default function NetworksPage() {
|
|
|
195
197
|
)}
|
|
196
198
|
|
|
197
199
|
{/* Invite */}
|
|
198
|
-
<div className="mt-3 pt-3 border-t border-[#
|
|
200
|
+
<div className="mt-3 pt-3 border-t border-[#1c1c1f]">
|
|
199
201
|
<div className="text-xs text-gray-500 mb-2">Invite</div>
|
|
200
202
|
<div className="flex gap-2">
|
|
201
203
|
<select value={inviteRole} onChange={e => setInviteRole(e.target.value)}
|
|
202
|
-
className="bg-[#
|
|
204
|
+
className="bg-[#0e0e10] border border-[#26262b] rounded px-2 py-1 text-base sm:text-xs text-white focus:outline-none">
|
|
203
205
|
<option value="member">member</option>
|
|
204
206
|
<option value="admin">admin</option>
|
|
205
207
|
<option value="viewer">viewer</option>
|
package/app/settings/page.tsx
CHANGED
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import Link from 'next/link';
|
|
5
|
-
import { useAnetConfig, useHealth
|
|
5
|
+
import { useAnetConfig, useHealth } from '../lib/hooks';
|
|
6
6
|
import { DASHBOARD_VERSION } from '../lib/version';
|
|
7
7
|
|
|
8
8
|
export default function SettingsPage() {
|
|
9
9
|
const { config } = useAnetConfig();
|
|
10
|
-
const { health } = useHealth();
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
const { health, error: healthError } = useHealth();
|
|
11
|
+
const [theme, setTheme] = useState<string>(() => {
|
|
12
|
+
if (typeof window === 'undefined') return 'cyber';
|
|
13
|
+
try { return localStorage.getItem('anet-theme') || 'cyber'; } catch { return 'cyber'; }
|
|
14
|
+
});
|
|
14
15
|
const [oldPwd, setOldPwd] = useState('');
|
|
15
16
|
const [newPwd, setNewPwd] = useState('');
|
|
16
17
|
const [pwdResult, setPwdResult] = useState('');
|
|
@@ -18,7 +19,7 @@ export default function SettingsPage() {
|
|
|
18
19
|
const valueClass = 'break-all sm:max-w-[320px] sm:text-right';
|
|
19
20
|
|
|
20
21
|
return (
|
|
21
|
-
<div className="min-h-screen bg-[#
|
|
22
|
+
<div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
|
|
22
23
|
<h1 className="text-2xl font-bold text-white mb-3 lg:ml-0 ml-10">Settings</h1>
|
|
23
24
|
|
|
24
25
|
{/* Section anchor nav (round 28) — jump to a group instead of scrolling
|
|
@@ -27,29 +28,75 @@ export default function SettingsPage() {
|
|
|
27
28
|
R3 of #190 mobile polish: matches the /admin chip treatment
|
|
28
29
|
(preview.3) — 44px tap-target + visible border so the chips read
|
|
29
30
|
as tappable rather than as inert headings on 375–390px. */}
|
|
30
|
-
|
|
31
|
+
{/* #209 R36: mb-8 → mb-4 sm:mb-8 — same pattern R31 applied to
|
|
32
|
+
/admin's identical jump-nav. Saves 16 px on phones. */}
|
|
33
|
+
<nav className="mb-4 sm:mb-8 flex flex-wrap gap-2 text-xs">
|
|
31
34
|
{[
|
|
35
|
+
{ href: '#appearance', label: 'Appearance' },
|
|
32
36
|
{ href: '#connection', label: 'Connection' },
|
|
33
37
|
{ href: '#account', label: 'Account' },
|
|
34
38
|
{ href: '#resources', label: 'Resources' },
|
|
35
39
|
].map(a => (
|
|
36
40
|
<a key={a.href} href={a.href}
|
|
37
|
-
className="inline-flex min-h-[44px] items-center rounded-md border border-[#
|
|
41
|
+
className="inline-flex min-h-[44px] items-center rounded-md border border-[#26262b] bg-[#0e0e10]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors">
|
|
38
42
|
{a.label}
|
|
39
43
|
</a>
|
|
40
44
|
))}
|
|
41
45
|
</nav>
|
|
42
46
|
|
|
43
47
|
<div className="max-w-2xl space-y-10">
|
|
48
|
+
{/* ── Group: Appearance (#217 S6 — Vincent: "设置里面再来一个
|
|
49
|
+
优化白色的主题"). The light theme tokens were restored from
|
|
50
|
+
pre-R8 history; this card is the visible owner of the toggle
|
|
51
|
+
(previously theme switching hid inside Cmd+K only). */}
|
|
52
|
+
<div id="appearance" className="space-y-4 scroll-mt-6">
|
|
53
|
+
<div className="flex items-center gap-2 px-1">
|
|
54
|
+
<div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Appearance</div>
|
|
55
|
+
<div className="flex-1 h-px bg-[#26262b]" />
|
|
56
|
+
</div>
|
|
57
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
58
|
+
<h2 className="text-sm font-semibold text-gray-300 mb-4">Theme</h2>
|
|
59
|
+
<div className="grid grid-cols-2 gap-3">
|
|
60
|
+
{([
|
|
61
|
+
{ id: 'cyber', label: 'Dark', swatch: '#0b0b0d', ring: '#22d3ee' },
|
|
62
|
+
{ id: 'light', label: 'Light', swatch: '#f6f7f9', ring: '#009e7e' },
|
|
63
|
+
] as const).map(t => (
|
|
64
|
+
<button
|
|
65
|
+
key={t.id}
|
|
66
|
+
onClick={() => {
|
|
67
|
+
try { localStorage.setItem('anet-theme', t.id); } catch {}
|
|
68
|
+
document.documentElement.setAttribute('data-theme', t.id);
|
|
69
|
+
setTheme(t.id);
|
|
70
|
+
}}
|
|
71
|
+
aria-pressed={theme === t.id}
|
|
72
|
+
className={`flex items-center gap-3 rounded-lg border px-4 py-3 text-sm transition-colors ${
|
|
73
|
+
theme === t.id
|
|
74
|
+
? 'border-cyan-500/60 bg-cyan-500/10 text-gray-100'
|
|
75
|
+
: 'border-[#26262b] text-gray-400 hover:border-[#3a3a41]'
|
|
76
|
+
}`}
|
|
77
|
+
>
|
|
78
|
+
<span
|
|
79
|
+
aria-hidden
|
|
80
|
+
className="inline-block w-5 h-5 rounded-full border border-black/20 shrink-0"
|
|
81
|
+
style={{ backgroundColor: t.swatch }}
|
|
82
|
+
/>
|
|
83
|
+
{t.label}
|
|
84
|
+
{theme === t.id && <span className="ml-auto text-cyan-400">✓</span>}
|
|
85
|
+
</button>
|
|
86
|
+
))}
|
|
87
|
+
</div>
|
|
88
|
+
</section>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
44
91
|
{/* ── Group: Connection ─────────────────────────────────── */}
|
|
45
92
|
<div id="connection" className="space-y-4 scroll-mt-6">
|
|
46
93
|
<div className="flex items-center gap-2 px-1">
|
|
47
94
|
<div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Connection</div>
|
|
48
|
-
<div className="flex-1 h-px bg-[#
|
|
95
|
+
<div className="flex-1 h-px bg-[#26262b]" />
|
|
49
96
|
</div>
|
|
50
97
|
|
|
51
98
|
{/* CommHub Connection */}
|
|
52
|
-
<section className="bg-[#
|
|
99
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
53
100
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">CommHub Connection</h2>
|
|
54
101
|
<div className="space-y-3 text-sm">
|
|
55
102
|
<div className={rowClass}>
|
|
@@ -75,15 +122,26 @@ export default function SettingsPage() {
|
|
|
75
122
|
</span>
|
|
76
123
|
</div>
|
|
77
124
|
{config?.error && (
|
|
78
|
-
<div className="border-t border-[#
|
|
125
|
+
<div className="border-t border-[#26262b] pt-3 text-xs text-gray-600">
|
|
79
126
|
{config.error}
|
|
80
127
|
</div>
|
|
81
128
|
)}
|
|
129
|
+
{/* #214 F5: the red HealthBanner's "Open Settings" CTA used to
|
|
130
|
+
land on a read-only page with no next step. When the hub is
|
|
131
|
+
unreachable, give the user actual recovery commands. */}
|
|
132
|
+
{(healthError || health?.ok === false) && (
|
|
133
|
+
<div className="border-t border-red-500/20 pt-3 text-xs space-y-1.5" role="alert">
|
|
134
|
+
<div className="text-red-300 font-medium">CommHub unreachable — how to recover:</div>
|
|
135
|
+
<div className="text-gray-400">1. Check the hub process on the server: <code className="font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5">anet hub status</code></div>
|
|
136
|
+
<div className="text-gray-400">2. Start it if stopped: <code className="font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5">anet hub start</code></div>
|
|
137
|
+
<div className="text-gray-400">3. Confirm the Hub URL above matches where the hub actually listens.</div>
|
|
138
|
+
</div>
|
|
139
|
+
)}
|
|
82
140
|
</div>
|
|
83
141
|
</section>
|
|
84
142
|
|
|
85
143
|
{/* Server Info */}
|
|
86
|
-
<section className="bg-[#
|
|
144
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
87
145
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">Server Info</h2>
|
|
88
146
|
<div className="space-y-3 text-sm">
|
|
89
147
|
<div className={rowClass}>
|
|
@@ -106,7 +164,7 @@ export default function SettingsPage() {
|
|
|
106
164
|
</section>
|
|
107
165
|
|
|
108
166
|
{/* Dashboard Info */}
|
|
109
|
-
<section className="bg-[#
|
|
167
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
110
168
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">Dashboard</h2>
|
|
111
169
|
<div className="space-y-3 text-sm">
|
|
112
170
|
<div className={rowClass}>
|
|
@@ -131,90 +189,17 @@ export default function SettingsPage() {
|
|
|
131
189
|
<div id="account" className="space-y-4 scroll-mt-6">
|
|
132
190
|
<div className="flex items-center gap-2 px-1">
|
|
133
191
|
<div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Account</div>
|
|
134
|
-
<div className="flex-1 h-px bg-[#
|
|
192
|
+
<div className="flex-1 h-px bg-[#26262b]" />
|
|
135
193
|
</div>
|
|
136
194
|
|
|
137
|
-
{/* License */}
|
|
138
|
-
<section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
|
|
139
|
-
<h2 className="text-sm font-semibold text-gray-300 mb-4 flex items-center gap-2">
|
|
140
|
-
License
|
|
141
|
-
{licData?.license && (
|
|
142
|
-
<span
|
|
143
|
-
className={`inline-flex items-center gap-1.5 text-[10px] font-medium px-2 py-0.5 rounded-full border ${
|
|
144
|
-
licData.license.type === 'pro'
|
|
145
|
-
? 'text-green-300 bg-green-500/10 border-green-500/30'
|
|
146
|
-
: licData.license.days_left <= 7
|
|
147
|
-
? 'text-red-300 bg-red-500/10 border-red-500/30'
|
|
148
|
-
: 'text-amber-300 bg-amber-500/10 border-amber-500/30'
|
|
149
|
-
}`}
|
|
150
|
-
>
|
|
151
|
-
<span aria-hidden className="w-1.5 h-1.5 rounded-full bg-current" />
|
|
152
|
-
{licData.license.type}{licData.license.days_left ? ` · ${licData.license.days_left}d left` : ''}
|
|
153
|
-
</span>
|
|
154
|
-
)}
|
|
155
|
-
</h2>
|
|
156
|
-
{licData?.license ? (
|
|
157
|
-
<div className="space-y-3 text-sm">
|
|
158
|
-
{/* Type + Days Left are summarized in the inline chip in the
|
|
159
|
-
header. Surface "expiring soon" only when relevant. */}
|
|
160
|
-
{licData.license.days_left <= 7 && (
|
|
161
|
-
<div className={rowClass}>
|
|
162
|
-
<span className="text-red-400 font-medium">⚠ Expiring soon</span>
|
|
163
|
-
<span className="text-red-400">{licData.license.days_left} days left</span>
|
|
164
|
-
</div>
|
|
165
|
-
)}
|
|
166
|
-
<div className={rowClass}>
|
|
167
|
-
<span className="text-gray-500">Expires</span>
|
|
168
|
-
<span className={`text-gray-300 ${valueClass}`}>{licData.license.expires_at}</span>
|
|
169
|
-
</div>
|
|
170
|
-
{licData.limits && (
|
|
171
|
-
<>
|
|
172
|
-
<div className={rowClass}>
|
|
173
|
-
<span className="text-gray-500">Max Agents</span>
|
|
174
|
-
<span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_agents}</span>
|
|
175
|
-
</div>
|
|
176
|
-
<div className={rowClass}>
|
|
177
|
-
<span className="text-gray-500">Max Networks</span>
|
|
178
|
-
<span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_networks}</span>
|
|
179
|
-
</div>
|
|
180
|
-
<div className={rowClass}>
|
|
181
|
-
<span className="text-gray-500">Tasks/Day</span>
|
|
182
|
-
<span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_tasks_day}</span>
|
|
183
|
-
</div>
|
|
184
|
-
</>
|
|
185
|
-
)}
|
|
186
|
-
<div className="pt-3 border-t border-[#2a2a4a]">
|
|
187
|
-
<div className="flex gap-2">
|
|
188
|
-
<input type="text" value={licKey} onChange={e => setLicKey(e.target.value)}
|
|
189
|
-
placeholder="anet-XXXX-XXXX-XXXX-XXXX"
|
|
190
|
-
className="flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none" />
|
|
191
|
-
<button onClick={async () => {
|
|
192
|
-
if (!licKey.trim()) return;
|
|
193
|
-
const res = await fetch('/api/hub/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: licKey }) });
|
|
194
|
-
const data = await res.json();
|
|
195
|
-
setLicResult(data.ok ? `Activated: ${data.type}` : `Failed: ${data.error}`);
|
|
196
|
-
if (data.ok) setLicKey('');
|
|
197
|
-
setTimeout(() => setLicResult(''), 5000);
|
|
198
|
-
}} className="px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors">
|
|
199
|
-
Activate
|
|
200
|
-
</button>
|
|
201
|
-
</div>
|
|
202
|
-
{licResult && <div className={`mt-2 text-xs ${licResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{licResult}</div>}
|
|
203
|
-
</div>
|
|
204
|
-
</div>
|
|
205
|
-
) : (
|
|
206
|
-
<div className="text-xs text-gray-600">License info not available</div>
|
|
207
|
-
)}
|
|
208
|
-
</section>
|
|
209
|
-
|
|
210
195
|
{/* Change Password */}
|
|
211
|
-
<section className="bg-[#
|
|
196
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
212
197
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">Change Password</h2>
|
|
213
198
|
<div className="space-y-3">
|
|
214
199
|
<input type="password" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder="Current password"
|
|
215
|
-
className="w-full bg-[#
|
|
200
|
+
className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
216
201
|
<input type="password" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder="New password"
|
|
217
|
-
className="w-full bg-[#
|
|
202
|
+
className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
218
203
|
<button onClick={async () => {
|
|
219
204
|
if (!oldPwd || !newPwd) return;
|
|
220
205
|
const saved = sessionStorage.getItem('anet_v3_auth');
|
|
@@ -244,7 +229,7 @@ export default function SettingsPage() {
|
|
|
244
229
|
</section>
|
|
245
230
|
|
|
246
231
|
{/* Session — tone-neutral, no longer "danger zone" red */}
|
|
247
|
-
<section className="bg-[#
|
|
232
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
248
233
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">Sign out</h2>
|
|
249
234
|
<p className="text-xs text-gray-500 mb-3">Signing out clears your dashboard session cookie. You'll return to the login page.</p>
|
|
250
235
|
<button
|
|
@@ -252,7 +237,7 @@ export default function SettingsPage() {
|
|
|
252
237
|
await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});
|
|
253
238
|
window.location.assign('/login');
|
|
254
239
|
}}
|
|
255
|
-
className="px-4 py-2 bg-transparent hover:bg-[#
|
|
240
|
+
className="px-4 py-2 bg-transparent hover:bg-[#1c1c1f] text-gray-300 text-sm rounded-lg border border-[#26262b] hover:border-[#3a3a41] transition-colors"
|
|
256
241
|
>
|
|
257
242
|
Sign out
|
|
258
243
|
</button>
|
|
@@ -263,21 +248,42 @@ export default function SettingsPage() {
|
|
|
263
248
|
<div id="resources" className="space-y-4 scroll-mt-6">
|
|
264
249
|
<div className="flex items-center gap-2 px-1">
|
|
265
250
|
<div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Resources</div>
|
|
266
|
-
<div className="flex-1 h-px bg-[#
|
|
251
|
+
<div className="flex-1 h-px bg-[#26262b]" />
|
|
267
252
|
</div>
|
|
268
253
|
|
|
269
|
-
{/*
|
|
254
|
+
{/* #209 (per Vincent 521/522): the low-frequency pages 通信龙
|
|
255
|
+
moved out of the sidebar (Messages, Audit Log, Server Logs)
|
|
256
|
+
need a discovery surface that isn't the primary nav — folded
|
|
257
|
+
into the Settings/Resources grid alongside Tokens + Networks
|
|
258
|
+
so the page tree stays the same (pages NOT deleted), the
|
|
259
|
+
sidebar stays at 6, and users still have a one-tap way to
|
|
260
|
+
reach them without remembering URLs or opening Cmd+K. */}
|
|
270
261
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
|
271
|
-
<Link href="/settings/tokens" className="bg-[#
|
|
262
|
+
<Link href="/settings/tokens" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
272
263
|
<h2 className="text-sm font-semibold text-gray-300">API Tokens</h2>
|
|
273
264
|
<p className="text-xs text-gray-500 mt-2">Create and manage tokens for CLI access.</p>
|
|
274
265
|
<span className="text-xs text-cyan-400 mt-3 inline-block">Manage →</span>
|
|
275
266
|
</Link>
|
|
276
|
-
<Link href="/settings/networks" className="bg-[#
|
|
267
|
+
<Link href="/settings/networks" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
277
268
|
<h2 className="text-sm font-semibold text-gray-300">Networks</h2>
|
|
278
269
|
<p className="text-xs text-gray-500 mt-2">Create, manage, and delete agent networks.</p>
|
|
279
270
|
<span className="text-xs text-cyan-400 mt-3 inline-block">Manage →</span>
|
|
280
271
|
</Link>
|
|
272
|
+
<Link href="/messages" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
273
|
+
<h2 className="text-sm font-semibold text-gray-300">Messages</h2>
|
|
274
|
+
<p className="text-xs text-gray-500 mt-2">Global timeline of CommHub messages across all agents.</p>
|
|
275
|
+
<span className="text-xs text-cyan-400 mt-3 inline-block">Open →</span>
|
|
276
|
+
</Link>
|
|
277
|
+
<Link href="/logs" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
278
|
+
<h2 className="text-sm font-semibold text-gray-300">Audit Log</h2>
|
|
279
|
+
<p className="text-xs text-gray-500 mt-2">Authentication, token rotations, and admin actions.</p>
|
|
280
|
+
<span className="text-xs text-cyan-400 mt-3 inline-block">Open →</span>
|
|
281
|
+
</Link>
|
|
282
|
+
<Link href="/server-logs" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
283
|
+
<h2 className="text-sm font-semibold text-gray-300">Server Logs</h2>
|
|
284
|
+
<p className="text-xs text-gray-500 mt-2">Live stdout / stderr from the CommHub server.</p>
|
|
285
|
+
<span className="text-xs text-cyan-400 mt-3 inline-block">Open →</span>
|
|
286
|
+
</Link>
|
|
281
287
|
</div>
|
|
282
288
|
</div>
|
|
283
289
|
|
|
@@ -67,7 +67,7 @@ export default function TokensPage() {
|
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
return (
|
|
70
|
-
<div className="min-h-screen bg-[#
|
|
70
|
+
<div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
|
|
71
71
|
<div className="flex items-center gap-4 mb-6">
|
|
72
72
|
<Link href="/settings" className="text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10">← Settings</Link>
|
|
73
73
|
<h1 className="text-2xl font-bold text-white">API Tokens</h1>
|
|
@@ -75,12 +75,12 @@ export default function TokensPage() {
|
|
|
75
75
|
|
|
76
76
|
<div className="max-w-2xl space-y-6">
|
|
77
77
|
{/* Create token */}
|
|
78
|
-
<section className="bg-[#
|
|
78
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
79
79
|
<h2 className="text-sm font-semibold text-gray-300 mb-3">Create Token</h2>
|
|
80
80
|
<div className="flex gap-2">
|
|
81
81
|
<input type="text" value={newName} onChange={e => setNewName(e.target.value)}
|
|
82
82
|
placeholder="Token name (e.g. my-cli)"
|
|
83
|
-
className="flex-1 bg-[#
|
|
83
|
+
className="flex-1 bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
84
84
|
<button onClick={createToken} disabled={!newName.trim()}
|
|
85
85
|
className="px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors">
|
|
86
86
|
Create
|
|
@@ -96,7 +96,7 @@ export default function TokensPage() {
|
|
|
96
96
|
</section>
|
|
97
97
|
|
|
98
98
|
{/* Token list */}
|
|
99
|
-
<section className="bg-[#
|
|
99
|
+
<section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
|
|
100
100
|
<h2 className="text-sm font-semibold text-gray-300 mb-3">Active Tokens ({tokens.length})</h2>
|
|
101
101
|
{loading ? (
|
|
102
102
|
<div className="animate-pulse space-y-2">{[1,2].map(i => <div key={i} className="h-12 bg-gray-800/20 rounded" />)}</div>
|
|
@@ -109,7 +109,7 @@ export default function TokensPage() {
|
|
|
109
109
|
) : (
|
|
110
110
|
<div className="space-y-2">
|
|
111
111
|
{tokens.map(t => (
|
|
112
|
-
<div key={t.token_id} className="flex items-center justify-between bg-[#
|
|
112
|
+
<div key={t.token_id} className="flex items-center justify-between bg-[#0e0e10] rounded-lg px-3 py-2 border border-[#1c1c1f]">
|
|
113
113
|
<div>
|
|
114
114
|
<div className="flex items-center gap-2">
|
|
115
115
|
<span className="text-sm text-white font-medium">{t.name}</span>
|
package/app/tasks/[id]/page.tsx
CHANGED
|
@@ -73,7 +73,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
|
|
|
73
73
|
|
|
74
74
|
if (isLoading) {
|
|
75
75
|
return (
|
|
76
|
-
<div className="min-h-screen bg-[#
|
|
76
|
+
<div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
|
|
77
77
|
<div className="animate-pulse space-y-4">
|
|
78
78
|
<div className="h-8 w-48 bg-gray-800 rounded" />
|
|
79
79
|
<div className="h-64 bg-gray-800/20 rounded-lg" />
|
|
@@ -84,7 +84,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
|
|
|
84
84
|
|
|
85
85
|
if (!task) {
|
|
86
86
|
return (
|
|
87
|
-
<div className="min-h-screen bg-[#
|
|
87
|
+
<div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-6 flex items-center justify-center">
|
|
88
88
|
<div className="text-center">
|
|
89
89
|
<div className="text-gray-600 text-4xl mb-4">--</div>
|
|
90
90
|
<p className="text-gray-400">Task not found</p>
|
|
@@ -103,7 +103,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
|
|
|
103
103
|
];
|
|
104
104
|
|
|
105
105
|
return (
|
|
106
|
-
<div className="min-h-screen bg-[#
|
|
106
|
+
<div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
|
|
107
107
|
<div className="flex items-center gap-4 mb-6">
|
|
108
108
|
<Link href="/tasks" className="text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10">← Tasks</Link>
|
|
109
109
|
<h1 className="text-xl font-bold text-white truncate">Task Detail</h1>
|
|
@@ -113,12 +113,12 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
|
|
|
113
113
|
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
|
|
114
114
|
{/* Left: Timeline + Info */}
|
|
115
115
|
<div className="space-y-4">
|
|
116
|
-
<div className="bg-[#
|
|
116
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
117
117
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">Timeline</h2>
|
|
118
118
|
<Timeline steps={steps} />
|
|
119
119
|
</div>
|
|
120
120
|
|
|
121
|
-
<div className="bg-[#
|
|
121
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
122
122
|
<h2 className="text-sm font-semibold text-gray-300 mb-3">Info</h2>
|
|
123
123
|
<div className="space-y-2 text-xs">
|
|
124
124
|
{[
|
|
@@ -140,17 +140,17 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
|
|
|
140
140
|
|
|
141
141
|
{/* Right: Content + Result */}
|
|
142
142
|
<div className="lg:col-span-2 space-y-4">
|
|
143
|
-
<div className="bg-[#
|
|
143
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
144
144
|
<h2 className="text-sm font-semibold text-gray-300 mb-2">Content</h2>
|
|
145
|
-
<div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#
|
|
145
|
+
<div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#0e0e10] rounded-lg px-4 py-3 border border-[#1c1c1f]">
|
|
146
146
|
{task.content || '--'}
|
|
147
147
|
</div>
|
|
148
148
|
</div>
|
|
149
149
|
|
|
150
150
|
{task.result && (
|
|
151
|
-
<div className="bg-[#
|
|
151
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
152
152
|
<h2 className="text-sm font-semibold text-gray-300 mb-2">Result</h2>
|
|
153
|
-
<div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#
|
|
153
|
+
<div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#0e0e10] rounded-lg px-4 py-3 border border-[#1c1c1f] max-h-96 overflow-y-auto">
|
|
154
154
|
{task.result}
|
|
155
155
|
</div>
|
|
156
156
|
</div>
|
|
@@ -158,7 +158,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
|
|
|
158
158
|
|
|
159
159
|
{/* Task Events */}
|
|
160
160
|
{eventsData?.events && eventsData.events.length > 0 && (
|
|
161
|
-
<div className="bg-[#
|
|
161
|
+
<div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
|
|
162
162
|
<h2 className="text-sm font-semibold text-gray-300 mb-3">Events ({eventsData.events.length})</h2>
|
|
163
163
|
<div className="space-y-2 max-h-64 overflow-y-auto">
|
|
164
164
|
{eventsData.events.map((e: { id: number; event_type: string; from_status: string; to_status: string; detail: string; created_at: string }, i: number) => (
|