@sleep2agi/agent-network-dashboard 0.5.7-preview.4 → 0.5.7-preview.40
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/cache/.previewinfo +1 -0
- package/.next/cache/.rscinfo +1 -0
- package/.next/diagnostics/route-bundle-stats.json +51 -51
- 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.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 +3 -3
- package/.next/server/app/_not-found.rsc +15 -15
- package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -8
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin/page.js.nft.json +1 -1
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +3 -3
- package/.next/server/app/admin.rsc +17 -17
- package/.next/server/app/admin.segments/_full.segment.rsc +17 -17
- package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
- package/.next/server/app/admin.segments/_index.segment.rsc +8 -8
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
- package/.next/server/app/index.html +3 -3
- package/.next/server/app/index.rsc +17 -17
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +17 -17
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +8 -8
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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 +17 -17
- package/.next/server/app/login.segments/_full.segment.rsc +17 -17
- package/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/server/app/login.segments/_index.segment.rsc +8 -8
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/login.segments/login.segment.rsc +3 -3
- package/.next/server/app/logs/page.js.nft.json +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +3 -3
- package/.next/server/app/logs.rsc +17 -17
- package/.next/server/app/logs.segments/_full.segment.rsc +17 -17
- package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/logs.segments/_index.segment.rsc +8 -8
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
- package/.next/server/app/messages/page.js.nft.json +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +3 -3
- package/.next/server/app/messages.rsc +17 -17
- package/.next/server/app/messages.segments/_full.segment.rsc +17 -17
- package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
- package/.next/server/app/messages.segments/_index.segment.rsc +8 -8
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
- package/.next/server/app/node/page.js.nft.json +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +3 -3
- package/.next/server/app/node.rsc +17 -17
- package/.next/server/app/node.segments/_full.segment.rsc +17 -17
- package/.next/server/app/node.segments/_head.segment.rsc +4 -4
- package/.next/server/app/node.segments/_index.segment.rsc +8 -8
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/node.segments/node.segment.rsc +3 -3
- package/.next/server/app/nodes/page.js.nft.json +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +3 -3
- package/.next/server/app/nodes.rsc +17 -17
- package/.next/server/app/nodes.segments/_full.segment.rsc +17 -17
- package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/_index.segment.rsc +8 -8
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.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 +3 -3
- package/.next/server/app/server-logs.rsc +17 -17
- package/.next/server/app/server-logs.segments/_full.segment.rsc +17 -17
- package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/_index.segment.rsc +8 -8
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
- package/.next/server/app/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 +3 -3
- package/.next/server/app/servers.rsc +17 -17
- package/.next/server/app/servers.segments/_full.segment.rsc +17 -17
- package/.next/server/app/servers.segments/_head.segment.rsc +4 -4
- package/.next/server/app/servers.segments/_index.segment.rsc +8 -8
- package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
- 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.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 +3 -3
- package/.next/server/app/settings/networks.rsc +17 -17
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +8 -8
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.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 +3 -3
- package/.next/server/app/settings/tokens.rsc +17 -17
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +8 -8
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings.html +3 -3
- package/.next/server/app/settings.rsc +17 -17
- package/.next/server/app/settings.segments/_full.segment.rsc +17 -17
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +8 -8
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.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 +3 -3
- package/.next/server/app/tasks.rsc +17 -17
- package/.next/server/app/tasks.segments/_full.segment.rsc +17 -17
- package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/_index.segment.rsc +8 -8
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
- package/.next/server/app-paths-manifest.json +0 -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]__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]__0lu1wok._.js +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0torghd._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0torghd._.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_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_0i3759l._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -1
- 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_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/pages/404.html +3 -3
- 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/{181u38qblp8lz.js → 00b-ysl~m~dr~.js} +1 -1
- package/.next/static/chunks/{0jp~cs9-zkmqa.js → 00b4y77vxfabl.js} +1 -1
- package/.next/static/chunks/00d~isei247an.js +1 -0
- package/.next/static/chunks/01b8xnbwme3q3.js +1 -0
- package/.next/static/chunks/{15qxef.ilfysw.js → 02i~-uz0v~7ke.js} +3 -3
- package/.next/static/chunks/03rfxivuawnc8.css +1 -0
- package/.next/static/chunks/{0a.9~-nf0gpec.js → 0_eddxjio~tei.js} +1 -1
- package/.next/static/chunks/0_m0zx8f~zx54.js +7 -0
- package/.next/static/chunks/0bl.smy4d4mgc.js +1 -0
- package/.next/static/chunks/{0im751o4n61c7.js → 0hv6izw.g6cnm.js} +1 -1
- package/.next/static/chunks/0miet1u_5tj06.js +7 -0
- package/.next/static/chunks/0q~ko.knz4cq8.js +1 -0
- package/.next/static/chunks/{05uk96gc~9mni.js → 0ti3v67ixu43p.js} +1 -1
- package/.next/static/chunks/0urrkhru4u8d2.js +1 -0
- package/.next/static/chunks/{0wtp_nw--hl5t.js → 0~ex__fs7w2f1.js} +1 -1
- package/.next/static/chunks/161etkmg~z~-d.js +1 -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 +6 -2
- package/app/components/AgentCard.tsx +19 -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 +12 -2
- package/app/components/CommandPalette.tsx +1 -1
- package/app/components/DispatchPanel.tsx +7 -4
- package/app/components/HealthBanner.tsx +10 -2
- package/app/components/HelpOverlay.tsx +0 -3
- package/app/components/MobileNav.tsx +26 -19
- package/app/components/Sidebar.tsx +19 -12
- package/app/components/StatsBar.tsx +8 -1
- package/app/components/TaskChatPanel.tsx +19 -5
- package/app/components/TaskDrawer.tsx +3 -1
- package/app/components/ThemeSwitcher.tsx +10 -79
- package/app/components/TopoGraph.tsx +11 -1
- package/app/components/UserBar.tsx +3 -3
- package/app/globals.css +76 -707
- package/app/layout.tsx +27 -1
- package/app/lib/hooks.ts +0 -5
- package/app/login/page.tsx +3 -3
- package/app/logs/page.tsx +6 -2
- package/app/messages/page.tsx +72 -48
- package/app/node/page.tsx +2 -2
- package/app/nodes/page.tsx +52 -22
- package/app/page.tsx +12 -29
- package/app/server-logs/page.tsx +39 -11
- package/app/settings/networks/page.tsx +3 -3
- package/app/settings/page.tsx +25 -80
- package/app/settings/tokens/page.tsx +1 -1
- package/app/tasks/page.tsx +36 -14
- package/package.json +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]__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/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.66f3.rtcybb.js +0 -1
- package/.next/static/chunks/03~5pxwbxxw-b.js +0 -1
- package/.next/static/chunks/0561vp5-q5.zp.js +0 -1
- package/.next/static/chunks/09p_4a62~yi52.js +0 -1
- package/.next/static/chunks/0cjz0r1v8sx_f.js +0 -1
- package/.next/static/chunks/0h_gdeiy~s92j.css +0 -1
- package/.next/static/chunks/0inql3s9ldyx5.js +0 -1
- package/.next/static/chunks/0nqm.7w9_inwd.js +0 -7
- package/.next/static/chunks/15-ltfhot3b4n.js +0 -7
- 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/{77VfHxRKplwAYs09P-QWj → CaCQnZUQ_aajX60atUSzY}/_buildManifest.js +0 -0
- /package/.next/static/{77VfHxRKplwAYs09P-QWj → CaCQnZUQ_aajX60atUSzY}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{77VfHxRKplwAYs09P-QWj → CaCQnZUQ_aajX60atUSzY}/_ssgManifest.js +0 -0
package/app/server-logs/page.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
4
|
+
import { useCollapsibleSearch } from '@/app/components/CollapsibleSearch';
|
|
4
5
|
import Link from 'next/link';
|
|
5
6
|
|
|
6
7
|
interface LogLine {
|
|
@@ -63,6 +64,16 @@ export default function ServerLogsPage() {
|
|
|
63
64
|
const [filterLevel, setFilterLevel] = useState<'all' | LogLine['level']>('all');
|
|
64
65
|
const [search, setSearch] = useState('');
|
|
65
66
|
const [autoRefresh, setAutoRefresh] = useState(true);
|
|
67
|
+
// #209 R35: adopt the shared CollapsibleSearch hook (R34) so the
|
|
68
|
+
// inline 全宽 search input collapses behind a magnifier circle in
|
|
69
|
+
// the toolbar — same WeChat-style affordance as /nodes /messages.
|
|
70
|
+
const searchCtl = useCollapsibleSearch({
|
|
71
|
+
value: search,
|
|
72
|
+
onChange: setSearch,
|
|
73
|
+
placeholder: '搜索关键字 (alias / task_id / error message)',
|
|
74
|
+
label: 'Search logs',
|
|
75
|
+
enabled: true,
|
|
76
|
+
});
|
|
66
77
|
const lastTsRef = useRef<string>('');
|
|
67
78
|
|
|
68
79
|
const fetchLogs = useCallback(async (initial = false) => {
|
|
@@ -116,10 +127,15 @@ export default function ServerLogsPage() {
|
|
|
116
127
|
for (const l of logs) counts[l.level]++;
|
|
117
128
|
|
|
118
129
|
return (
|
|
119
|
-
|
|
130
|
+
// #209 R35: p-6 → p-4 sm:p-6 mobile-tighten (matches /tasks, /nodes,
|
|
131
|
+
// /messages, /overview convention). Saves 16 px of L/R padding on phones.
|
|
132
|
+
<div className="p-4 sm:p-6 max-w-[1600px] mx-auto">
|
|
120
133
|
<div className="flex items-center justify-between mb-4 gap-3">
|
|
121
134
|
<div className="flex items-center gap-3 min-w-0">
|
|
122
|
-
|
|
135
|
+
{/* #209 R35: lg:ml-0 ml-10 burger-clearance — without it the
|
|
136
|
+
fixed top-3 left-3 mobile hamburger sat right on top of the
|
|
137
|
+
"Se" of "Server Logs". Caught by playwright mobile shot. */}
|
|
138
|
+
<h1 className="text-2xl font-bold text-white lg:ml-0 ml-10">Server Logs</h1>
|
|
123
139
|
{/* Round 86: dropped the {logs.length} header chip — r84 added
|
|
124
140
|
`all <count>` to the filter strip just below, so this duplicated
|
|
125
141
|
the value within 40px of itself. */}
|
|
@@ -158,9 +174,17 @@ export default function ServerLogsPage() {
|
|
|
158
174
|
</svg>
|
|
159
175
|
<span className="hidden sm:inline">Reload</span>
|
|
160
176
|
</button>
|
|
177
|
+
{/* #209 R35: magnifier-toggle search (WeChat-style, via the
|
|
178
|
+
shared CollapsibleSearch hook). Lives at the tail of the
|
|
179
|
+
toolbar so it sits at the right edge of the header. */}
|
|
180
|
+
<searchCtl.Button />
|
|
161
181
|
</div>
|
|
162
182
|
</div>
|
|
163
183
|
|
|
184
|
+
{/* R35: collapsible search row — sits above the filter chip strip
|
|
185
|
+
so toggling it doesn't shift the chip layout. */}
|
|
186
|
+
<searchCtl.Row />
|
|
187
|
+
|
|
164
188
|
{/* Round 95: flex-wrap + min-w-0 on the search wrapper so the
|
|
165
189
|
search input drops below the chip strip on mobile instead of
|
|
166
190
|
overflowing past the viewport. Desktop layout (single row)
|
|
@@ -192,13 +216,10 @@ export default function ServerLogsPage() {
|
|
|
192
216
|
);
|
|
193
217
|
})}
|
|
194
218
|
</div>
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
className="flex-1 min-w-[140px] basis-full sm:basis-0 px-3 py-1.5 text-xs bg-[#11111c] border border-[#2a2a4a] rounded text-gray-200 focus:outline-none focus:border-cyan-500/40"
|
|
200
|
-
/>
|
|
201
|
-
<span className="text-[10px] text-gray-600">
|
|
219
|
+
{/* R35: inline search input moved to the magnifier-toggle in
|
|
220
|
+
the toolbar above. count chip stays as a quick scan
|
|
221
|
+
"filter is biting" indicator. */}
|
|
222
|
+
<span className="text-[10px] text-gray-600 ml-auto">
|
|
202
223
|
{filtered.length} / {logs.length}
|
|
203
224
|
</span>
|
|
204
225
|
</div>
|
|
@@ -252,8 +273,15 @@ export default function ServerLogsPage() {
|
|
|
252
273
|
className="absolute left-0 top-0 bottom-0 w-0.5"
|
|
253
274
|
style={{ backgroundColor: LEVEL_STRIPE[l.level] }}
|
|
254
275
|
/>
|
|
255
|
-
|
|
256
|
-
|
|
276
|
+
{/* R4 of #190 mobile polish: the 100px timestamp column +
|
|
277
|
+
32px LEVEL badge ate ~45% of a 375px row, squeezing log
|
|
278
|
+
content into a 3-line wrap. Drop the ts column to 60px
|
|
279
|
+
on mobile (HH:MM:SS still fits at 9px), restore 100px
|
|
280
|
+
at sm. The 2px left rail (LEVEL_STRIPE) already
|
|
281
|
+
encodes level visually for warn/error, so the LOG badge
|
|
282
|
+
is redundant on mobile — hide it below sm. */}
|
|
283
|
+
<span className="text-gray-600 shrink-0 w-[60px] sm:w-[100px] text-[9px] sm:text-[10px] tabular-nums">{shortTime(l.ts)}</span>
|
|
284
|
+
<span className={`hidden sm:inline shrink-0 px-1.5 rounded border text-[9px] uppercase ${LEVEL_BADGE[l.level]}`}>
|
|
257
285
|
{l.level}
|
|
258
286
|
</span>
|
|
259
287
|
{/* Round 85: CommHub stamps each log line with a `[HH:MM:SS]`
|
|
@@ -111,9 +111,9 @@ export default function NetworksPage() {
|
|
|
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-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
114
|
+
className="w-full bg-[#0a0a15] border border-[#2a2a4a] 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-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
116
|
+
className="w-full bg-[#0a0a15] border border-[#2a2a4a] 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
|
|
@@ -199,7 +199,7 @@ export default function NetworksPage() {
|
|
|
199
199
|
<div className="text-xs text-gray-500 mb-2">Invite</div>
|
|
200
200
|
<div className="flex gap-2">
|
|
201
201
|
<select value={inviteRole} onChange={e => setInviteRole(e.target.value)}
|
|
202
|
-
className="bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white focus:outline-none">
|
|
202
|
+
className="bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-base sm:text-xs text-white focus:outline-none">
|
|
203
203
|
<option value="member">member</option>
|
|
204
204
|
<option value="admin">admin</option>
|
|
205
205
|
<option value="viewer">viewer</option>
|
package/app/settings/page.tsx
CHANGED
|
@@ -2,15 +2,12 @@
|
|
|
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
10
|
const { health } = useHealth();
|
|
11
|
-
const { license: licData } = useLicense();
|
|
12
|
-
const [licKey, setLicKey] = useState('');
|
|
13
|
-
const [licResult, setLicResult] = useState('');
|
|
14
11
|
const [oldPwd, setOldPwd] = useState('');
|
|
15
12
|
const [newPwd, setNewPwd] = useState('');
|
|
16
13
|
const [pwdResult, setPwdResult] = useState('');
|
|
@@ -134,87 +131,14 @@ export default function SettingsPage() {
|
|
|
134
131
|
<div className="flex-1 h-px bg-[#2a2a4a]" />
|
|
135
132
|
</div>
|
|
136
133
|
|
|
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
134
|
{/* Change Password */}
|
|
211
135
|
<section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
|
|
212
136
|
<h2 className="text-sm font-semibold text-gray-300 mb-4">Change Password</h2>
|
|
213
137
|
<div className="space-y-3">
|
|
214
138
|
<input type="password" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder="Current password"
|
|
215
|
-
className="w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
139
|
+
className="w-full bg-[#0a0a15] border border-[#2a2a4a] 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
140
|
<input type="password" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder="New password"
|
|
217
|
-
className="w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
141
|
+
className="w-full bg-[#0a0a15] border border-[#2a2a4a] 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
142
|
<button onClick={async () => {
|
|
219
143
|
if (!oldPwd || !newPwd) return;
|
|
220
144
|
const saved = sessionStorage.getItem('anet_v3_auth');
|
|
@@ -266,7 +190,13 @@ export default function SettingsPage() {
|
|
|
266
190
|
<div className="flex-1 h-px bg-[#2a2a4a]" />
|
|
267
191
|
</div>
|
|
268
192
|
|
|
269
|
-
{/*
|
|
193
|
+
{/* #209 (per Vincent 521/522): the low-frequency pages 通信龙
|
|
194
|
+
moved out of the sidebar (Messages, Audit Log, Server Logs)
|
|
195
|
+
need a discovery surface that isn't the primary nav — folded
|
|
196
|
+
into the Settings/Resources grid alongside Tokens + Networks
|
|
197
|
+
so the page tree stays the same (pages NOT deleted), the
|
|
198
|
+
sidebar stays at 6, and users still have a one-tap way to
|
|
199
|
+
reach them without remembering URLs or opening Cmd+K. */}
|
|
270
200
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
|
271
201
|
<Link href="/settings/tokens" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
272
202
|
<h2 className="text-sm font-semibold text-gray-300">API Tokens</h2>
|
|
@@ -278,6 +208,21 @@ export default function SettingsPage() {
|
|
|
278
208
|
<p className="text-xs text-gray-500 mt-2">Create, manage, and delete agent networks.</p>
|
|
279
209
|
<span className="text-xs text-cyan-400 mt-3 inline-block">Manage →</span>
|
|
280
210
|
</Link>
|
|
211
|
+
<Link href="/messages" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
212
|
+
<h2 className="text-sm font-semibold text-gray-300">Messages</h2>
|
|
213
|
+
<p className="text-xs text-gray-500 mt-2">Global timeline of CommHub messages across all agents.</p>
|
|
214
|
+
<span className="text-xs text-cyan-400 mt-3 inline-block">Open →</span>
|
|
215
|
+
</Link>
|
|
216
|
+
<Link href="/logs" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
217
|
+
<h2 className="text-sm font-semibold text-gray-300">Audit Log</h2>
|
|
218
|
+
<p className="text-xs text-gray-500 mt-2">Authentication, token rotations, and admin actions.</p>
|
|
219
|
+
<span className="text-xs text-cyan-400 mt-3 inline-block">Open →</span>
|
|
220
|
+
</Link>
|
|
221
|
+
<Link href="/server-logs" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
|
|
222
|
+
<h2 className="text-sm font-semibold text-gray-300">Server Logs</h2>
|
|
223
|
+
<p className="text-xs text-gray-500 mt-2">Live stdout / stderr from the CommHub server.</p>
|
|
224
|
+
<span className="text-xs text-cyan-400 mt-3 inline-block">Open →</span>
|
|
225
|
+
</Link>
|
|
281
226
|
</div>
|
|
282
227
|
</div>
|
|
283
228
|
|
|
@@ -80,7 +80,7 @@ export default function TokensPage() {
|
|
|
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-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
|
|
83
|
+
className="flex-1 bg-[#0a0a15] border border-[#2a2a4a] 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
|
package/app/tasks/page.tsx
CHANGED
|
@@ -104,8 +104,14 @@ function TasksContent() {
|
|
|
104
104
|
|
|
105
105
|
return (
|
|
106
106
|
<div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
|
|
107
|
-
{/* Header
|
|
108
|
-
|
|
107
|
+
{/* Header.
|
|
108
|
+
#209 R30 (mobile vertical rhythm — goal "大幅提升移动端体验",
|
|
109
|
+
extending R28's Overview pattern to /tasks): this mb-6 + the
|
|
110
|
+
From/To filter row mb-6 below both drop to mb-4 on phones,
|
|
111
|
+
restoring mb-6 from sm: up. Saves ~16 px per spot = ~32 px of
|
|
112
|
+
scroll reclaim on /tasks before the actual task rows. /tasks
|
|
113
|
+
is the second-most-trafficked page after Overview. */}
|
|
114
|
+
<div className="flex items-center gap-4 mb-4 sm:mb-6">
|
|
109
115
|
<h1 className="text-2xl font-bold text-white lg:ml-0 ml-10">Tasks</h1>
|
|
110
116
|
{/* Round 88: pagination-aware chip. When tasks.length < count
|
|
111
117
|
the API has more rows than the current limit=100 slice;
|
|
@@ -171,8 +177,9 @@ function TasksContent() {
|
|
|
171
177
|
</div>
|
|
172
178
|
</div>
|
|
173
179
|
|
|
174
|
-
{/* From/To Filters — same visual block as the status tabs above.
|
|
175
|
-
|
|
180
|
+
{/* From/To Filters — same visual block as the status tabs above.
|
|
181
|
+
R30 (see header above): mb-6 → mb-4 sm:mb-6 mobile-tighten. */}
|
|
182
|
+
<div className="flex flex-wrap items-center gap-2 mb-4 sm:mb-6">
|
|
176
183
|
<div className="flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40">
|
|
177
184
|
<span className="text-[10px] uppercase tracking-wide text-gray-600">From</span>
|
|
178
185
|
<input
|
|
@@ -180,7 +187,7 @@ function TasksContent() {
|
|
|
180
187
|
value={filterFrom}
|
|
181
188
|
onChange={e => setFilterFrom(e.target.value)}
|
|
182
189
|
placeholder="any node"
|
|
183
|
-
className="w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none"
|
|
190
|
+
className="w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none"
|
|
184
191
|
/>
|
|
185
192
|
</div>
|
|
186
193
|
<div className="flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40">
|
|
@@ -190,7 +197,7 @@ function TasksContent() {
|
|
|
190
197
|
value={filterTo}
|
|
191
198
|
onChange={e => setFilterTo(e.target.value)}
|
|
192
199
|
placeholder="any node"
|
|
193
|
-
className="w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none"
|
|
200
|
+
className="w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none"
|
|
194
201
|
/>
|
|
195
202
|
</div>
|
|
196
203
|
{(filterStatus || filterFrom || filterTo) && (
|
|
@@ -248,7 +255,7 @@ function TasksContent() {
|
|
|
248
255
|
: 'Tasks will appear here when agents send them via CommHub.'}
|
|
249
256
|
/>
|
|
250
257
|
) : (
|
|
251
|
-
<div className="space-y-2">
|
|
258
|
+
<div className="space-y-1 sm:space-y-2">
|
|
252
259
|
{/* Table header */}
|
|
253
260
|
<div className="hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase">
|
|
254
261
|
<div className="col-span-1">Status</div>
|
|
@@ -264,7 +271,7 @@ function TasksContent() {
|
|
|
264
271
|
return (
|
|
265
272
|
<div
|
|
266
273
|
key={t.task_id}
|
|
267
|
-
className={`anet-task-row group bg-[#111128] border rounded-lg px-4 py-3 transition-all duration-200 cursor-pointer ${
|
|
274
|
+
className={`anet-task-row group bg-[#111128] border rounded-lg px-3 py-2 sm:px-4 sm:py-3 transition-all duration-200 cursor-pointer ${
|
|
268
275
|
isOpen
|
|
269
276
|
? 'border-[#3a3a5a] shadow-lg shadow-black/20'
|
|
270
277
|
: 'border-[#2a2a4a] hover:border-[#3a3a5a] hover:bg-[#15152e]'
|
|
@@ -311,8 +318,12 @@ function TasksContent() {
|
|
|
311
318
|
</div>
|
|
312
319
|
</div>
|
|
313
320
|
|
|
314
|
-
{/* Mobile layout
|
|
315
|
-
|
|
321
|
+
{/* Mobile layout — R8 of #190 mobile polish: 4-row stack
|
|
322
|
+
→ 3-row by inlining timeAgo onto the same row as the
|
|
323
|
+
from→to alias header (it's already 4 small atoms, has
|
|
324
|
+
room), plus space-y-2 → space-y-1 to trim ~4px per
|
|
325
|
+
row × 200 tasks. */}
|
|
326
|
+
<div className="sm:hidden space-y-1">
|
|
316
327
|
<div className="flex items-center justify-between">
|
|
317
328
|
<span className={statusBadge(t.status)}>{t.status}</span>
|
|
318
329
|
<div className="flex items-center gap-2">
|
|
@@ -328,13 +339,13 @@ function TasksContent() {
|
|
|
328
339
|
</div>
|
|
329
340
|
<div className="flex items-center gap-1.5 text-xs text-gray-300 min-w-0">
|
|
330
341
|
{t.from_name && <AliasAvatar alias={t.from_name} size={16} />}
|
|
331
|
-
<span className="truncate max-w-[
|
|
342
|
+
<span className="truncate max-w-[35%]">{t.from_name || '--'}</span>
|
|
332
343
|
<span className="text-gray-600">→</span>
|
|
333
344
|
{t.to_name && <AliasAvatar alias={t.to_name} size={16} />}
|
|
334
|
-
<span className="truncate max-w-[
|
|
345
|
+
<span className="truncate max-w-[35%]">{t.to_name || '--'}</span>
|
|
346
|
+
<span className="ml-auto shrink-0 text-[10px] text-gray-600">{timeAgo(t.created_at)}</span>
|
|
335
347
|
</div>
|
|
336
348
|
<div className="text-xs text-gray-400 line-clamp-1" title={t.content}>{previewContent(t.content)}</div>
|
|
337
|
-
<div className="text-xs text-gray-600">{timeAgo(t.created_at)}</div>
|
|
338
349
|
</div>
|
|
339
350
|
|
|
340
351
|
{/* Expanded detail — always mounted; grid-rows 0fr↔1fr trick gives
|
|
@@ -423,7 +434,18 @@ function TasksContent() {
|
|
|
423
434
|
|
|
424
435
|
export default function TasksPage() {
|
|
425
436
|
return (
|
|
426
|
-
<Suspense fallback={
|
|
437
|
+
<Suspense fallback={
|
|
438
|
+
// #209 R30 (playwright mobile-shot caught it): the bare Suspense
|
|
439
|
+
// fallback rendered "Loading tasks..." at p-6 with no left-indent,
|
|
440
|
+
// so the fixed top-3 left-3 mobile burger (56 px right-edge) sat
|
|
441
|
+
// right on top of "Loa" — the screenshot read as a broken page.
|
|
442
|
+
// Match the loaded layout: p-4 sm:p-6 page padding + ml-10 mobile
|
|
443
|
+
// indent on the text, so the burger clears and the loading state
|
|
444
|
+
// visually maps to the populated page.
|
|
445
|
+
<div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
|
|
446
|
+
<div className="lg:ml-0 ml-10 text-gray-500 text-sm">Loading tasks…</div>
|
|
447
|
+
</div>
|
|
448
|
+
}>
|
|
427
449
|
<TasksContent />
|
|
428
450
|
</Suspense>
|
|
429
451
|
);
|
package/package.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Agent Network Dashboard",
|
|
3
|
+
"short_name": "Agent Net",
|
|
4
|
+
"description": "Real-time monitoring dashboard for Agent Network nodes",
|
|
5
|
+
"start_url": "/",
|
|
6
|
+
"scope": "/",
|
|
7
|
+
"display": "standalone",
|
|
8
|
+
"orientation": "portrait-primary",
|
|
9
|
+
"theme_color": "#0a0a1a",
|
|
10
|
+
"background_color": "#0a0a1a",
|
|
11
|
+
"icons": [
|
|
12
|
+
{
|
|
13
|
+
"src": "/sleep2agi-logo.svg",
|
|
14
|
+
"sizes": "any",
|
|
15
|
+
"type": "image/svg+xml",
|
|
16
|
+
"purpose": "any maskable"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"src": "/favicon.svg",
|
|
20
|
+
"sizes": "any",
|
|
21
|
+
"type": "image/svg+xml"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# The Agent Network Dashboard is an auth-gated operational console for
|
|
2
|
+
# a team's CommHub deployment. There is no public-discovery value to
|
|
3
|
+
# search engines crawling it, and any indexed URLs would still bounce
|
|
4
|
+
# unauthenticated visitors at /login. Block politely across the board.
|
|
5
|
+
|
|
6
|
+
User-agent: *
|
|
7
|
+
Disallow: /
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
var R=require("../../../../chunks/[turbopack]_runtime.js")("server/app/api/hub/license/route.js")
|
|
2
|
-
R.c("server/chunks/[root-of-the-server]__0rovr5-._.js")
|
|
3
|
-
R.c("server/chunks/[root-of-the-server]__02y-i-p._.js")
|
|
4
|
-
R.c("server/chunks/[root-of-the-server]__0hg3_8r._.js")
|
|
5
|
-
R.c("server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js")
|
|
6
|
-
R.m(20033)
|
|
7
|
-
module.exports=R.m(20033).exports
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":1,"files":["../../../../../../../node_modules/@swc/helpers/package.json","../../../../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../../../../../node_modules/next/dist/compiled/source-map/package.json","../../../../../../../node_modules/next/dist/compiled/stacktrace-parser/package.json","../../../../../../../node_modules/next/dist/compiled/ws/package.json","../../../../../../../node_modules/react/package.json","../../../../../../node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../../../../../../node_modules/@swc/helpers/package.json","../../../../../../node_modules/next/dist/build/adapter/setup-node-env.external.js","../../../../../../node_modules/next/dist/client/components/app-router-headers.js","../../../../../../node_modules/next/dist/client/components/hooks-server-context.js","../../../../../../node_modules/next/dist/client/components/static-generation-bailout.js","../../../../../../node_modules/next/dist/client/lib/console.js","../../../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../../../../node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js","../../../../../../node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js","../../../../../../node_modules/next/dist/compiled/source-map/package.json","../../../../../../node_modules/next/dist/compiled/source-map/source-map.js","../../../../../../node_modules/next/dist/compiled/stacktrace-parser/package.json","../../../../../../node_modules/next/dist/compiled/stacktrace-parser/stack-trace-parser.cjs.js","../../../../../../node_modules/next/dist/compiled/ws/index.js","../../../../../../node_modules/next/dist/compiled/ws/package.json","../../../../../../node_modules/next/dist/lib/client-and-server-references.js","../../../../../../node_modules/next/dist/lib/constants.js","../../../../../../node_modules/next/dist/lib/framework/boundary-constants.js","../../../../../../node_modules/next/dist/lib/interop-default.js","../../../../../../node_modules/next/dist/lib/is-error.js","../../../../../../node_modules/next/dist/lib/picocolors.js","../../../../../../node_modules/next/dist/lib/scheduler.js","../../../../../../node_modules/next/dist/lib/semver-noop.js","../../../../../../node_modules/next/dist/server/app-render/action-async-storage-instance.js","../../../../../../node_modules/next/dist/server/app-render/action-async-storage.external.js","../../../../../../node_modules/next/dist/server/app-render/after-task-async-storage-instance.js","../../../../../../node_modules/next/dist/server/app-render/after-task-async-storage.external.js","../../../../../../node_modules/next/dist/server/app-render/async-local-storage.js","../../../../../../node_modules/next/dist/server/app-render/cache-signal.js","../../../../../../node_modules/next/dist/server/app-render/console-async-storage-instance.js","../../../../../../node_modules/next/dist/server/app-render/console-async-storage.external.js","../../../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage-instance.js","../../../../../../node_modules/next/dist/server/app-render/dynamic-access-async-storage.external.js","../../../../../../node_modules/next/dist/server/app-render/dynamic-rendering.js","../../../../../../node_modules/next/dist/server/app-render/instant-validation/boundary-constants.js","../../../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.external.js","../../../../../../node_modules/next/dist/server/app-render/module-loading/track-module-loading.instance.js","../../../../../../node_modules/next/dist/server/app-render/staged-rendering.js","../../../../../../node_modules/next/dist/server/app-render/work-async-storage-instance.js","../../../../../../node_modules/next/dist/server/app-render/work-async-storage.external.js","../../../../../../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.js","../../../../../../node_modules/next/dist/server/app-render/work-unit-async-storage.external.js","../../../../../../node_modules/next/dist/server/dev/browser-logs/file-logger.js","../../../../../../node_modules/next/dist/server/dynamic-rendering-utils.js","../../../../../../node_modules/next/dist/server/lib/incremental-cache/memory-cache.external.js","../../../../../../node_modules/next/dist/server/lib/incremental-cache/shared-cache-controls.external.js","../../../../../../node_modules/next/dist/server/lib/incremental-cache/tags-manifest.external.js","../../../../../../node_modules/next/dist/server/lib/lru-cache.js","../../../../../../node_modules/next/dist/server/lib/parse-stack.js","../../../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-globals.external.js","../../../../../../node_modules/next/dist/server/lib/router-utils/instrumentation-node-extensions.js","../../../../../../node_modules/next/dist/server/lib/source-maps.js","../../../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../../../node_modules/next/dist/server/load-manifest.external.js","../../../../../../node_modules/next/dist/server/node-environment-baseline.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/console-dim.external.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/console-exit.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/console-file.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/date.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/error-inspect.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/io-utils.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/node-crypto.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/random.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.js","../../../../../../node_modules/next/dist/server/node-environment-extensions/web-crypto.js","../../../../../../node_modules/next/dist/server/node-environment.js","../../../../../../node_modules/next/dist/server/node-polyfill-crypto.js","../../../../../../node_modules/next/dist/server/patch-error-inspect.js","../../../../../../node_modules/next/dist/server/require-hook.js","../../../../../../node_modules/next/dist/server/response-cache/types.js","../../../../../../node_modules/next/dist/server/runtime-reacts.external.js","../../../../../../node_modules/next/dist/shared/lib/deep-freeze.js","../../../../../../node_modules/next/dist/shared/lib/invariant-error.js","../../../../../../node_modules/next/dist/shared/lib/is-plain-object.js","../../../../../../node_modules/next/dist/shared/lib/is-thenable.js","../../../../../../node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js","../../../../../../node_modules/next/dist/shared/lib/no-fallback-error.external.js","../../../../../../node_modules/next/dist/shared/lib/promise-with-resolvers.js","../../../../../../node_modules/next/dist/shared/lib/server-reference-info.js","../../../../../../node_modules/next/package.json","../../../../../../node_modules/react/cjs/react.development.js","../../../../../../node_modules/react/cjs/react.production.js","../../../../../../node_modules/react/index.js","../../../../../../node_modules/react/package.json","../../../../chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js","../../../../chunks/[root-of-the-server]__02y-i-p._.js","../../../../chunks/[root-of-the-server]__0hg3_8r._.js","../../../../chunks/[root-of-the-server]__0rovr5-._.js","../../../../chunks/[turbopack]_runtime.js","./route_client-reference-manifest.js"]}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
globalThis.__RSC_MANIFEST = globalThis.__RSC_MANIFEST || {};
|
|
2
|
-
globalThis.__RSC_MANIFEST["/api/hub/license/route"] = {"moduleLoading":{"prefix":"","crossOrigin":null},"clientModules":{},"ssrModuleMapping":{},"edgeSSRModuleMapping":{},"rscModuleMapping":{},"edgeRscModuleMapping":{},"entryCSSFiles":{},"entryJSFiles":{}};
|
|
3
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},70406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},98319,e=>{"use strict";var t=e.i(76631);function r(){return process.env.COMMHUB_URL||"http://127.0.0.1:9200"}async function a(e,a){let n=`${r()}${e}`,s={},i=a?.headers;if(!i?.Authorization)try{let e=await (0,t.getV3UserToken)();e&&(s={Authorization:`Bearer ${e}`})}catch{}return fetch(n,{...a,headers:{...s,...a?.headers},next:{revalidate:0}})}r(),e.s(["hubFetch",0,a])},20033,e=>{"use strict";var t=e.i(29124),r=e.i(96565),a=e.i(29718),n=e.i(23850),s=e.i(47878),i=e.i(19885),o=e.i(86384),l=e.i(90127),u=e.i(89548),d=e.i(23489),p=e.i(53565),c=e.i(25859),h=e.i(37031),x=e.i(34816),R=e.i(37020),v=e.i(93695);e.i(69409);var f=e.i(56394),g=e.i(76631),w=e.i(98319);async function m(){let e=await (0,g.requireDashboardAuth)();if(e)return e;try{let e=await (0,w.hubFetch)("/api/license"),t=e.headers.get("content-type")||"";if(e.ok&&t.includes("application/json"))return Response.json(await e.json());return Response.json({ok:!1,error:"license endpoint not available"},{status:404})}catch(e){return Response.json({error:"failed",detail:e instanceof Error?e.message:String(e)},{status:502})}}async function y(e){let t=await (0,g.requireDashboardAuth)();if(t)return t;try{let t=await e.json(),r=await (0,w.hubFetch)("/api/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return Response.json(await r.json())}catch(e){return Response.json({error:"failed",detail:e instanceof Error?e.message:String(e)},{status:502})}}e.s(["GET",0,m,"POST",0,y],33419);var E=e.i(33419);let b=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/hub/license/route",pathname:"/api/hub/license",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/agent-network-dashboard/app/api/hub/license/route.ts",nextConfigOutput:"",userland:E,...{}}),{workAsyncStorage:C,workUnitAsyncStorage:A,serverHooks:T}=b;async function j(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),b.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let g="/api/hub/license/route";g=g.replace(/\/index$/,"")||"/";let w=await b.prepare(e,t,{srcPage:g,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:m,params:y,nextConfig:E,parsedUrl:C,isDraftMode:A,prerenderManifest:T,routerServerContext:j,isOnDemandRevalidate:q,revalidateOnlyGenerated:S,resolvedPathname:N,clientReferenceManifest:P,serverActionsManifest:k}=w,O=(0,o.normalizeAppPath)(g),_=!!(T.dynamicRoutes[O]||T.routes[N]),U=async()=>((null==j?void 0:j.render404)?await j.render404(e,t,C,!1):t.end("This page could not be found"),null);if(_&&!A){let e=!!T.routes[N],t=T.dynamicRoutes[O];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await U();throw new v.NoFallbackError}}let H=null;!_||b.isDev||A||(H="/index"===(H=N)?"/":H);let M=!0===b.isDev||!_,I=_&&!M;k&&P&&(0,i.setManifestsSingleton)({page:g,clientReferenceManifest:P,serverActionsManifest:k});let D=e.method||"GET",$=(0,s.getTracer)(),F=$.getActiveScopeSpan(),B=!!(null==j?void 0:j.isWrappedByNextServer),K=!!(0,n.getRequestMeta)(e,"minimalMode"),L=(0,n.getRequestMeta)(e,"incrementalCache")||await b.getIncrementalCache(e,E,T,K);null==L||L.resetRequestCache(),globalThis.__incrementalCache=L;let G={params:y,previewProps:T.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:M,incrementalCache:L,cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>b.onRequestError(e,t,a,n,j)},sharedContext:{buildId:m}},V=new l.NodeNextRequest(e),z=new l.NodeNextResponse(t),W=u.NextRequestAdapter.fromNodeNextRequest(V,(0,u.signalFromNodeResponse)(t));try{let n,i=async e=>b.handle(W,G).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=$.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route");if(a){let t=`${D} ${a}`;e.setAttributes({"next.route":a,"http.route":a,"next.span_name":t}),e.updateName(t),n&&n!==e&&(n.setAttribute("http.route",a),n.updateName(t))}else e.updateName(`${D} ${g}`)}),o=async n=>{var s,o;let l=async({previousCacheEntry:r})=>{try{if(!K&&q&&S&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await i(n);e.fetchMetrics=G.renderOpts.fetchMetrics;let o=G.renderOpts.pendingWaitUntil;o&&a.waitUntil&&(a.waitUntil(o),o=void 0);let l=G.renderOpts.collectedTags;if(!_)return await (0,c.sendResponse)(V,z,s,G.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[R.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,a=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=R.INFINITE_CACHE?void 0:G.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await b.onRequestError(e,t,{routerKind:"App Router",routePath:g,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:I,isOnDemandRevalidate:q})},!1,j),t}},u=await b.handleResponse({req:e,nextConfig:E,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:T,isRoutePPREnabled:!1,isOnDemandRevalidate:q,revalidateOnlyGenerated:S,responseGenerator:l,waitUntil:a.waitUntil,isMinimalMode:K});if(!_)return null;if((null==u||null==(s=u.value)?void 0:s.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(o=u.value)?void 0:o.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});K||t.setHeader("x-nextjs-cache",q?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),A&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,h.fromNodeOutgoingHttpHeaders)(u.value.headers);return K&&_||d.delete(R.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,x.getCacheControlHeader)(u.cacheControl)),await (0,c.sendResponse)(V,z,new Response(u.value.body,{headers:d,status:u.value.status||200})),null};B&&F?await o(F):(n=$.getActiveScopeSpan(),await $.withPropagatedContext(e.headers,()=>$.trace(d.BaseServerSpan.handleRequest,{spanName:`${D} ${g}`,kind:s.SpanKind.SERVER,attributes:{"http.method":D,"http.target":e.url}},o),void 0,!B))}catch(t){if(t instanceof v.NoFallbackError||await b.onRequestError(e,t,{routerKind:"App Router",routePath:O,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:I,isOnDemandRevalidate:q})},!1,j),_)throw t;return await (0,c.sendResponse)(V,z,new Response(null,{status:500})),null}}e.s(["handler",0,j,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:C,workUnitAsyncStorage:A})},"routeModule",0,b,"serverHooks",0,T,"workAsyncStorage",0,C,"workUnitAsyncStorage",0,A],20033)}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0rovr5-._.js.map
|