@sleep2agi/agent-network-dashboard 0.5.7-preview.4 → 0.5.7-preview.41

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.
Files changed (286) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +0 -1
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/cache/.previewinfo +1 -0
  5. package/.next/cache/.rscinfo +1 -0
  6. package/.next/diagnostics/route-bundle-stats.json +51 -51
  7. package/.next/fallback-build-manifest.json +3 -3
  8. package/.next/prerender-manifest.json +3 -3
  9. package/.next/routes-manifest.json +0 -6
  10. package/.next/server/app/_global-error.html +1 -1
  11. package/.next/server/app/_global-error.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/_not-found.html +3 -3
  20. package/.next/server/app/_not-found.rsc +15 -15
  21. package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  22. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  23. package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -8
  24. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  26. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  27. package/.next/server/app/admin/page.js.nft.json +1 -1
  28. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  29. package/.next/server/app/admin.html +3 -3
  30. package/.next/server/app/admin.rsc +17 -17
  31. package/.next/server/app/admin.segments/_full.segment.rsc +17 -17
  32. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  33. package/.next/server/app/admin.segments/_index.segment.rsc +8 -8
  34. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  35. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  36. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  37. package/.next/server/app/index.html +3 -3
  38. package/.next/server/app/index.rsc +17 -17
  39. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  40. package/.next/server/app/index.segments/_full.segment.rsc +17 -17
  41. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  42. package/.next/server/app/index.segments/_index.segment.rsc +8 -8
  43. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login/page.js.nft.json +1 -1
  45. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/login.html +2 -2
  47. package/.next/server/app/login.rsc +17 -17
  48. package/.next/server/app/login.segments/_full.segment.rsc +17 -17
  49. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  50. package/.next/server/app/login.segments/_index.segment.rsc +8 -8
  51. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  52. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  53. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  54. package/.next/server/app/logs/page.js.nft.json +1 -1
  55. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/logs.html +3 -3
  57. package/.next/server/app/logs.rsc +17 -17
  58. package/.next/server/app/logs.segments/_full.segment.rsc +17 -17
  59. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  60. package/.next/server/app/logs.segments/_index.segment.rsc +8 -8
  61. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  63. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  64. package/.next/server/app/messages/page.js.nft.json +1 -1
  65. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/messages.html +3 -3
  67. package/.next/server/app/messages.rsc +17 -17
  68. package/.next/server/app/messages.segments/_full.segment.rsc +17 -17
  69. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  70. package/.next/server/app/messages.segments/_index.segment.rsc +8 -8
  71. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  72. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  73. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  74. package/.next/server/app/node/page.js.nft.json +1 -1
  75. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  76. package/.next/server/app/node.html +3 -3
  77. package/.next/server/app/node.rsc +17 -17
  78. package/.next/server/app/node.segments/_full.segment.rsc +17 -17
  79. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  80. package/.next/server/app/node.segments/_index.segment.rsc +8 -8
  81. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  82. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  83. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  84. package/.next/server/app/nodes/page.js.nft.json +1 -1
  85. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  86. package/.next/server/app/nodes.html +3 -3
  87. package/.next/server/app/nodes.rsc +17 -17
  88. package/.next/server/app/nodes.segments/_full.segment.rsc +17 -17
  89. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  90. package/.next/server/app/nodes.segments/_index.segment.rsc +8 -8
  91. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  92. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  93. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  94. package/.next/server/app/page.js.nft.json +1 -1
  95. package/.next/server/app/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/server-logs/page.js.nft.json +1 -1
  97. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  98. package/.next/server/app/server-logs.html +3 -3
  99. package/.next/server/app/server-logs.rsc +17 -17
  100. package/.next/server/app/server-logs.segments/_full.segment.rsc +17 -17
  101. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  102. package/.next/server/app/server-logs.segments/_index.segment.rsc +8 -8
  103. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  104. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  105. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  106. package/.next/server/app/servers/page.js.nft.json +1 -1
  107. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  108. package/.next/server/app/servers.html +3 -3
  109. package/.next/server/app/servers.rsc +17 -17
  110. package/.next/server/app/servers.segments/_full.segment.rsc +17 -17
  111. package/.next/server/app/servers.segments/_head.segment.rsc +4 -4
  112. package/.next/server/app/servers.segments/_index.segment.rsc +8 -8
  113. package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
  114. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +4 -4
  115. package/.next/server/app/servers.segments/servers.segment.rsc +3 -3
  116. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  117. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  118. package/.next/server/app/settings/networks.html +3 -3
  119. package/.next/server/app/settings/networks.rsc +17 -17
  120. package/.next/server/app/settings/networks.segments/_full.segment.rsc +17 -17
  121. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  122. package/.next/server/app/settings/networks.segments/_index.segment.rsc +8 -8
  123. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  124. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  125. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  126. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  127. package/.next/server/app/settings/page.js.nft.json +1 -1
  128. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  129. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  130. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  131. package/.next/server/app/settings/tokens.html +3 -3
  132. package/.next/server/app/settings/tokens.rsc +17 -17
  133. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +17 -17
  134. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  135. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +8 -8
  136. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  137. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  138. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  139. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  140. package/.next/server/app/settings.html +3 -3
  141. package/.next/server/app/settings.rsc +17 -17
  142. package/.next/server/app/settings.segments/_full.segment.rsc +17 -17
  143. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  144. package/.next/server/app/settings.segments/_index.segment.rsc +8 -8
  145. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  146. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  147. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  148. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  149. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/tasks/page.js.nft.json +1 -1
  151. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/tasks.html +3 -3
  153. package/.next/server/app/tasks.rsc +17 -17
  154. package/.next/server/app/tasks.segments/_full.segment.rsc +17 -17
  155. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  156. package/.next/server/app/tasks.segments/_index.segment.rsc +8 -8
  157. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  158. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  159. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  160. package/.next/server/app-paths-manifest.json +0 -1
  161. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +1 -1
  162. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -1
  163. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +1 -1
  164. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -1
  165. package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js +2 -2
  166. package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js.map +1 -1
  167. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  168. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  169. package/.next/server/chunks/ssr/[root-of-the-server]__0torghd._.js +3 -0
  170. package/.next/server/chunks/ssr/[root-of-the-server]__0torghd._.js.map +1 -0
  171. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  172. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  173. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  174. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  175. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  176. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  177. package/.next/server/chunks/ssr/agent-network-dashboard_app_0fjlnh~._.js +3 -0
  178. package/.next/server/chunks/ssr/agent-network-dashboard_app_0fjlnh~._.js.map +1 -0
  179. package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js +9 -0
  180. package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js.map +1 -0
  181. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +1 -1
  182. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -1
  183. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +1 -1
  184. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -1
  185. package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js +1 -1
  186. package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -1
  187. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +1 -1
  188. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js.map +1 -1
  189. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0r7kb.o._.js +9 -0
  190. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0r7kb.o._.js.map +1 -0
  191. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js +1 -1
  192. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map +1 -1
  193. package/.next/server/middleware-build-manifest.js +3 -3
  194. package/.next/server/pages/404.html +3 -3
  195. package/.next/server/pages/500.html +1 -1
  196. package/.next/server/server-reference-manifest.js +1 -1
  197. package/.next/server/server-reference-manifest.json +1 -1
  198. package/.next/static/chunks/{181u38qblp8lz.js → 00b-ysl~m~dr~.js} +1 -1
  199. package/.next/static/chunks/{0jp~cs9-zkmqa.js → 00b4y77vxfabl.js} +1 -1
  200. package/.next/static/chunks/00d~isei247an.js +1 -0
  201. package/.next/static/chunks/{15qxef.ilfysw.js → 02i~-uz0v~7ke.js} +3 -3
  202. package/.next/static/chunks/03rfxivuawnc8.css +1 -0
  203. package/.next/static/chunks/0_m0zx8f~zx54.js +7 -0
  204. package/.next/static/chunks/{0a.9~-nf0gpec.js → 0gp-mz_4aqk3r.js} +1 -1
  205. package/.next/static/chunks/{0im751o4n61c7.js → 0h7bfxybxqwm7.js} +1 -1
  206. package/.next/static/chunks/0miet1u_5tj06.js +7 -0
  207. package/.next/static/chunks/0q~ko.knz4cq8.js +1 -0
  208. package/.next/static/chunks/{05uk96gc~9mni.js → 0ti3v67ixu43p.js} +1 -1
  209. package/.next/static/chunks/0urrkhru4u8d2.js +1 -0
  210. package/.next/static/chunks/{0wtp_nw--hl5t.js → 0yxm49gpjsfl5.js} +1 -1
  211. package/.next/static/chunks/120~r8iab8l~1.js +1 -0
  212. package/.next/static/chunks/132yi-q_9~-q8.js +1 -0
  213. package/.next/static/chunks/161etkmg~z~-d.js +1 -0
  214. package/.next/trace +2 -2
  215. package/.next/trace-build +1 -1
  216. package/.next/types/routes.d.ts +1 -2
  217. package/.next/types/validator.ts +0 -9
  218. package/app/admin/page.tsx +6 -2
  219. package/app/components/AgentCard.tsx +19 -9
  220. package/app/components/AppShell.tsx +7 -1
  221. package/app/components/ChatPopover.tsx +1 -1
  222. package/app/components/CollapsibleSearch.tsx +127 -0
  223. package/app/components/CommandCenter.tsx +12 -2
  224. package/app/components/CommandPalette.tsx +1 -1
  225. package/app/components/DispatchPanel.tsx +7 -4
  226. package/app/components/HealthBanner.tsx +10 -2
  227. package/app/components/HelpOverlay.tsx +0 -3
  228. package/app/components/MobileNav.tsx +26 -19
  229. package/app/components/Sidebar.tsx +19 -12
  230. package/app/components/StatsBar.tsx +8 -1
  231. package/app/components/TaskChatPanel.tsx +19 -5
  232. package/app/components/TaskDrawer.tsx +3 -1
  233. package/app/components/ThemeSwitcher.tsx +10 -79
  234. package/app/components/TopoGraph.tsx +11 -1
  235. package/app/components/UserBar.tsx +3 -3
  236. package/app/globals.css +76 -707
  237. package/app/layout.tsx +27 -1
  238. package/app/lib/hooks.ts +0 -5
  239. package/app/login/page.tsx +3 -3
  240. package/app/logs/page.tsx +10 -4
  241. package/app/messages/page.tsx +72 -48
  242. package/app/node/page.tsx +13 -3
  243. package/app/nodes/page.tsx +52 -22
  244. package/app/page.tsx +12 -29
  245. package/app/server-logs/page.tsx +39 -11
  246. package/app/settings/networks/page.tsx +3 -3
  247. package/app/settings/page.tsx +28 -81
  248. package/app/settings/tokens/page.tsx +1 -1
  249. package/app/tasks/page.tsx +36 -14
  250. package/package.json +1 -1
  251. package/public/manifest.webmanifest +24 -0
  252. package/public/robots.txt +7 -0
  253. package/.next/server/app/api/hub/license/route/app-paths-manifest.json +0 -3
  254. package/.next/server/app/api/hub/license/route/build-manifest.json +0 -9
  255. package/.next/server/app/api/hub/license/route/server-reference-manifest.json +0 -4
  256. package/.next/server/app/api/hub/license/route.js +0 -7
  257. package/.next/server/app/api/hub/license/route.js.map +0 -5
  258. package/.next/server/app/api/hub/license/route.js.nft.json +0 -1
  259. package/.next/server/app/api/hub/license/route_client-reference-manifest.js +0 -3
  260. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js +0 -3
  261. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js.map +0 -1
  262. package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js +0 -3
  263. package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js.map +0 -1
  264. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +0 -3
  265. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +0 -1
  266. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +0 -9
  267. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +0 -1
  268. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0s5uqlp._.js +0 -9
  269. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0s5uqlp._.js.map +0 -1
  270. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js +0 -3
  271. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map +0 -1
  272. package/.next/static/chunks/0.66f3.rtcybb.js +0 -1
  273. package/.next/static/chunks/03~5pxwbxxw-b.js +0 -1
  274. package/.next/static/chunks/0561vp5-q5.zp.js +0 -1
  275. package/.next/static/chunks/09p_4a62~yi52.js +0 -1
  276. package/.next/static/chunks/0cjz0r1v8sx_f.js +0 -1
  277. package/.next/static/chunks/0h_gdeiy~s92j.css +0 -1
  278. package/.next/static/chunks/0inql3s9ldyx5.js +0 -1
  279. package/.next/static/chunks/0nqm.7w9_inwd.js +0 -7
  280. package/.next/static/chunks/15-ltfhot3b4n.js +0 -7
  281. package/app/api/hub/license/route.ts +0 -33
  282. package/app/components/BroadcastBar.tsx +0 -84
  283. package/app/components/InboxPanel.tsx +0 -36
  284. /package/.next/static/{77VfHxRKplwAYs09P-QWj → ZTMl9nwIhD2JFX-jfYkql}/_buildManifest.js +0 -0
  285. /package/.next/static/{77VfHxRKplwAYs09P-QWj → ZTMl9nwIhD2JFX-jfYkql}/_clientMiddlewareManifest.js +0 -0
  286. /package/.next/static/{77VfHxRKplwAYs09P-QWj → ZTMl9nwIhD2JFX-jfYkql}/_ssgManifest.js +0 -0
@@ -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
- <div className="p-6 max-w-[1600px] mx-auto">
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
- <h1 className="text-2xl font-bold text-white">Server Logs</h1>
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
- <input
196
- value={search}
197
- onChange={e => setSearch(e.target.value)}
198
- placeholder="搜索关键字 (alias / task_id / error message)"
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
- <span className="text-gray-600 shrink-0 w-[100px] text-[10px] tabular-nums">{shortTime(l.ts)}</span>
256
- <span className={`shrink-0 px-1.5 rounded border text-[9px] uppercase ${LEVEL_BADGE[l.level]}`}>
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>
@@ -2,15 +2,12 @@
2
2
 
3
3
  import { useState } from 'react';
4
4
  import Link from 'next/link';
5
- import { useAnetConfig, useHealth, useLicense } from '../lib/hooks';
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('');
@@ -27,7 +24,9 @@ export default function SettingsPage() {
27
24
  R3 of #190 mobile polish: matches the /admin chip treatment
28
25
  (preview.3) — 44px tap-target + visible border so the chips read
29
26
  as tappable rather than as inert headings on 375–390px. */}
30
- <nav className="mb-8 flex flex-wrap gap-2 text-xs">
27
+ {/* #209 R36: mb-8 mb-4 sm:mb-8 — same pattern R31 applied to
28
+ /admin's identical jump-nav. Saves 16 px on phones. */}
29
+ <nav className="mb-4 sm:mb-8 flex flex-wrap gap-2 text-xs">
31
30
  {[
32
31
  { href: '#connection', label: 'Connection' },
33
32
  { href: '#account', label: 'Account' },
@@ -134,87 +133,14 @@ export default function SettingsPage() {
134
133
  <div className="flex-1 h-px bg-[#2a2a4a]" />
135
134
  </div>
136
135
 
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
136
  {/* Change Password */}
211
137
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
212
138
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Change Password</h2>
213
139
  <div className="space-y-3">
214
140
  <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" />
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" />
216
142
  <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" />
143
+ 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
144
  <button onClick={async () => {
219
145
  if (!oldPwd || !newPwd) return;
220
146
  const saved = sessionStorage.getItem('anet_v3_auth');
@@ -266,7 +192,13 @@ export default function SettingsPage() {
266
192
  <div className="flex-1 h-px bg-[#2a2a4a]" />
267
193
  </div>
268
194
 
269
- {/* API Tokens + Networks */}
195
+ {/* #209 (per Vincent 521/522): the low-frequency pages 通信龙
196
+ moved out of the sidebar (Messages, Audit Log, Server Logs)
197
+ need a discovery surface that isn't the primary nav — folded
198
+ into the Settings/Resources grid alongside Tokens + Networks
199
+ so the page tree stays the same (pages NOT deleted), the
200
+ sidebar stays at 6, and users still have a one-tap way to
201
+ reach them without remembering URLs or opening Cmd+K. */}
270
202
  <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
271
203
  <Link href="/settings/tokens" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
272
204
  <h2 className="text-sm font-semibold text-gray-300">API Tokens</h2>
@@ -278,6 +210,21 @@ export default function SettingsPage() {
278
210
  <p className="text-xs text-gray-500 mt-2">Create, manage, and delete agent networks.</p>
279
211
  <span className="text-xs text-cyan-400 mt-3 inline-block">Manage &rarr;</span>
280
212
  </Link>
213
+ <Link href="/messages" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
214
+ <h2 className="text-sm font-semibold text-gray-300">Messages</h2>
215
+ <p className="text-xs text-gray-500 mt-2">Global timeline of CommHub messages across all agents.</p>
216
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
217
+ </Link>
218
+ <Link href="/logs" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
219
+ <h2 className="text-sm font-semibold text-gray-300">Audit Log</h2>
220
+ <p className="text-xs text-gray-500 mt-2">Authentication, token rotations, and admin actions.</p>
221
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
222
+ </Link>
223
+ <Link href="/server-logs" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
224
+ <h2 className="text-sm font-semibold text-gray-300">Server Logs</h2>
225
+ <p className="text-xs text-gray-500 mt-2">Live stdout / stderr from the CommHub server.</p>
226
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
227
+ </Link>
281
228
  </div>
282
229
  </div>
283
230
 
@@ -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
@@ -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
- <div className="flex items-center gap-4 mb-6">
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
- <div className="flex flex-wrap items-center gap-2 mb-6">
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
- <div className="sm:hidden space-y-2">
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-[40%]">{t.from_name || '--'}</span>
342
+ <span className="truncate max-w-[35%]">{t.from_name || '--'}</span>
332
343
  <span className="text-gray-600">&rarr;</span>
333
344
  {t.to_name && <AliasAvatar alias={t.to_name} size={16} />}
334
- <span className="truncate max-w-[40%]">{t.to_name || '--'}</span>
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={<div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono">Loading tasks...</div>}>
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.7-preview.4",
3
+ "version": "0.5.7-preview.41",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "main": "apps/desktop/electron/main.cjs",
6
6
  "scripts": {
@@ -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,3 +0,0 @@
1
- {
2
- "/api/hub/license/route": "app/api/hub/license/route.js"
3
- }
@@ -1,9 +0,0 @@
1
- {
2
- "devFiles": [],
3
- "ampDevFiles": [],
4
- "polyfillFiles": [],
5
- "lowPriorityFiles": [],
6
- "rootMainFiles": [],
7
- "pages": {},
8
- "ampFirstPages": []
9
- }
@@ -1,4 +0,0 @@
1
- {
2
- "node": {},
3
- "edge": {}
4
- }
@@ -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,5 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sections": []
5
- }
@@ -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,3 +0,0 @@
1
- module.exports=[24689,(e,o,d)=>{}];
2
-
3
- //# sourceMappingURL=0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js.map
@@ -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