@sleep2agi/agent-network-dashboard 0.4.5-preview.6 → 0.4.5-preview.61

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 (277) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +49 -49
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/_not-found.html +4 -4
  15. package/.next/server/app/_not-found.rsc +12 -12
  16. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  17. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  18. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  21. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/server/app/admin/page.js.nft.json +1 -1
  23. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/admin.html +4 -4
  25. package/.next/server/app/admin.rsc +14 -14
  26. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  27. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  28. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  29. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  30. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  31. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  32. package/.next/server/app/index.html +4 -4
  33. package/.next/server/app/index.rsc +14 -14
  34. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  35. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  36. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  37. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  38. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  39. package/.next/server/app/login/page.js.nft.json +1 -1
  40. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  41. package/.next/server/app/login.html +2 -2
  42. package/.next/server/app/login.rsc +14 -14
  43. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  44. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  45. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  46. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  47. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  48. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  49. package/.next/server/app/logs/page.js.nft.json +1 -1
  50. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/logs.html +4 -4
  52. package/.next/server/app/logs.rsc +14 -14
  53. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  54. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  55. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  56. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  57. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  58. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  59. package/.next/server/app/messages/page.js.nft.json +1 -1
  60. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/messages.html +4 -4
  62. package/.next/server/app/messages.rsc +14 -14
  63. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  64. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  65. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  66. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  67. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  68. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  69. package/.next/server/app/node/page.js.nft.json +1 -1
  70. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/node.html +4 -4
  72. package/.next/server/app/node.rsc +14 -14
  73. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  74. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  75. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  76. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  77. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  78. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  79. package/.next/server/app/nodes/page.js.nft.json +1 -1
  80. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  81. package/.next/server/app/nodes.html +4 -4
  82. package/.next/server/app/nodes.rsc +14 -14
  83. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  84. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  85. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  86. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  87. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  88. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  89. package/.next/server/app/page.js.nft.json +1 -1
  90. package/.next/server/app/page_client-reference-manifest.js +1 -1
  91. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  92. package/.next/server/app/server-logs.html +4 -4
  93. package/.next/server/app/server-logs.rsc +14 -14
  94. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  95. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  96. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  97. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  98. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  99. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  100. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  101. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  102. package/.next/server/app/settings/networks.html +4 -4
  103. package/.next/server/app/settings/networks.rsc +14 -14
  104. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  105. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  106. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  107. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  108. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  109. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  110. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  111. package/.next/server/app/settings/page.js.nft.json +1 -1
  112. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  113. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  114. package/.next/server/app/settings/tokens.html +4 -4
  115. package/.next/server/app/settings/tokens.rsc +14 -14
  116. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  117. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  118. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  119. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  120. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  121. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  122. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  123. package/.next/server/app/settings.html +4 -4
  124. package/.next/server/app/settings.rsc +14 -14
  125. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  126. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  127. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  128. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  130. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  131. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  132. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  133. package/.next/server/app/tasks/page.js.nft.json +1 -1
  134. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/tasks.html +4 -4
  136. package/.next/server/app/tasks.rsc +14 -14
  137. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  138. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  139. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  140. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  141. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  142. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  143. package/.next/server/chunks/ssr/[root-of-the-server]__02ee4km._.js +3 -0
  144. package/.next/server/chunks/ssr/[root-of-the-server]__02ee4km._.js.map +1 -0
  145. package/.next/server/chunks/ssr/[root-of-the-server]__0n4l2is._.js +3 -0
  146. package/.next/server/chunks/ssr/[root-of-the-server]__0n4l2is._.js.map +1 -0
  147. package/.next/server/chunks/ssr/[root-of-the-server]__0o8yj3c._.js +3 -0
  148. package/.next/server/chunks/ssr/[root-of-the-server]__0o8yj3c._.js.map +1 -0
  149. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js +1 -1
  150. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js.map +1 -1
  151. package/.next/server/chunks/ssr/_0nne7mz._.js +3 -0
  152. package/.next/server/chunks/ssr/_0nne7mz._.js.map +1 -0
  153. package/.next/server/chunks/ssr/app_0.zbtn5._.js +9 -0
  154. package/.next/server/chunks/ssr/app_0.zbtn5._.js.map +1 -0
  155. package/.next/server/chunks/ssr/app_01y-~mp._.js +3 -0
  156. package/.next/server/chunks/ssr/app_01y-~mp._.js.map +1 -0
  157. package/.next/server/chunks/ssr/app_04n78pr._.js +3 -0
  158. package/.next/server/chunks/ssr/app_04n78pr._.js.map +1 -0
  159. package/.next/server/chunks/ssr/app_0_agk0r._.js +3 -0
  160. package/.next/server/chunks/ssr/app_0_agk0r._.js.map +1 -0
  161. package/.next/server/chunks/ssr/app_0aum_g5._.js +3 -0
  162. package/.next/server/chunks/ssr/app_0aum_g5._.js.map +1 -0
  163. package/.next/server/chunks/ssr/app_0esuljp._.js +3 -0
  164. package/.next/server/chunks/ssr/app_0esuljp._.js.map +1 -0
  165. package/.next/server/chunks/ssr/app_0izi28j._.js +1 -1
  166. package/.next/server/chunks/ssr/app_0izi28j._.js.map +1 -1
  167. package/.next/server/chunks/ssr/app_0py1sns._.js +3 -0
  168. package/.next/server/chunks/ssr/app_0py1sns._.js.map +1 -0
  169. package/.next/server/chunks/ssr/app_0tncr1_._.js +3 -0
  170. package/.next/server/chunks/ssr/app_0tncr1_._.js.map +1 -0
  171. package/.next/server/chunks/ssr/app_components_08ys5y3._.js +5 -5
  172. package/.next/server/chunks/ssr/app_components_08ys5y3._.js.map +1 -1
  173. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js +1 -1
  174. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js.map +1 -1
  175. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js +1 -1
  176. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js.map +1 -1
  177. package/.next/server/middleware-build-manifest.js +3 -3
  178. package/.next/server/pages/404.html +4 -4
  179. package/.next/server/pages/500.html +1 -1
  180. package/.next/server/server-reference-manifest.js +1 -1
  181. package/.next/server/server-reference-manifest.json +1 -1
  182. package/.next/static/chunks/0-27cd~m2b0lg.js +1 -0
  183. package/.next/static/chunks/023enh~oz30n..js +1 -0
  184. package/.next/static/chunks/09.q998r20bia.css +2 -0
  185. package/.next/static/chunks/0985ut18w-kpb.js +1 -0
  186. package/.next/static/chunks/{07okhs5561y5y.js → 0c1bp~g7.8ru..js} +1 -1
  187. package/.next/static/chunks/0edt_z0rlxgfk.js +1 -0
  188. package/.next/static/chunks/0et33r-3bdzlg.js +7 -0
  189. package/.next/static/chunks/0f6w7h-pu0tng.js +1 -0
  190. package/.next/static/chunks/0i89ioku1y61m.js +1 -0
  191. package/.next/static/chunks/0irkayokwc1fm.js +1 -0
  192. package/.next/static/chunks/0l2rkodu2.v~r.js +1 -0
  193. package/.next/static/chunks/0mdu-2u9-dx.4.js +1 -0
  194. package/.next/static/chunks/0rk5zmyp19fv8.js +7 -0
  195. package/.next/static/chunks/0zax.-67r-uuj.js +1 -0
  196. package/.next/static/chunks/12hyhrnzrx~ys.js +1 -0
  197. package/.next/static/chunks/12tlkbch057lv.js +1 -0
  198. package/.next/static/chunks/15c9pv6gxir.5.js +1 -0
  199. package/.next/trace +2 -2
  200. package/.next/trace-build +1 -1
  201. package/app/admin/page.tsx +90 -26
  202. package/app/components/AgentCard.tsx +19 -5
  203. package/app/components/BroadcastBar.tsx +22 -4
  204. package/app/components/DispatchPanel.tsx +9 -5
  205. package/app/components/EmptyState.tsx +77 -4
  206. package/app/components/HealthBanner.tsx +11 -2
  207. package/app/components/HelpOverlay.tsx +50 -10
  208. package/app/components/InboxPanel.tsx +6 -3
  209. package/app/components/Sidebar.tsx +49 -41
  210. package/app/components/StatsBar.tsx +59 -36
  211. package/app/components/TaskChatPanel.tsx +8 -10
  212. package/app/components/TaskDrawer.tsx +72 -28
  213. package/app/components/TopoGraph.tsx +118 -24
  214. package/app/globals.css +90 -0
  215. package/app/lib/status.ts +63 -0
  216. package/app/lib/version.ts +7 -0
  217. package/app/login/page.tsx +40 -7
  218. package/app/logs/page.tsx +72 -21
  219. package/app/messages/page.tsx +12 -3
  220. package/app/node/page.tsx +48 -25
  221. package/app/nodes/page.tsx +22 -6
  222. package/app/page.tsx +105 -34
  223. package/app/server-logs/page.tsx +70 -12
  224. package/app/settings/networks/page.tsx +37 -13
  225. package/app/settings/page.tsx +39 -11
  226. package/app/tasks/[id]/page.tsx +2 -13
  227. package/app/tasks/page.tsx +98 -93
  228. package/package.json +1 -1
  229. package/scripts/loop-review.mjs +224 -0
  230. package/.next/server/chunks/ssr/[root-of-the-server]__06pu~4t._.js +0 -3
  231. package/.next/server/chunks/ssr/[root-of-the-server]__06pu~4t._.js.map +0 -1
  232. package/.next/server/chunks/ssr/[root-of-the-server]__0_jnflc._.js +0 -3
  233. package/.next/server/chunks/ssr/[root-of-the-server]__0_jnflc._.js.map +0 -1
  234. package/.next/server/chunks/ssr/[root-of-the-server]__0nrckjd._.js +0 -3
  235. package/.next/server/chunks/ssr/[root-of-the-server]__0nrckjd._.js.map +0 -1
  236. package/.next/server/chunks/ssr/_0d-fuox._.js +0 -3
  237. package/.next/server/chunks/ssr/_0d-fuox._.js.map +0 -1
  238. package/.next/server/chunks/ssr/app_0.0wpa~._.js +0 -3
  239. package/.next/server/chunks/ssr/app_0.0wpa~._.js.map +0 -1
  240. package/.next/server/chunks/ssr/app_0ap_oiq._.js +0 -3
  241. package/.next/server/chunks/ssr/app_0ap_oiq._.js.map +0 -1
  242. package/.next/server/chunks/ssr/app_0dk5wao._.js +0 -3
  243. package/.next/server/chunks/ssr/app_0dk5wao._.js.map +0 -1
  244. package/.next/server/chunks/ssr/app_0et5yua._.js +0 -3
  245. package/.next/server/chunks/ssr/app_0et5yua._.js.map +0 -1
  246. package/.next/server/chunks/ssr/app_0k8xbx~._.js +0 -9
  247. package/.next/server/chunks/ssr/app_0k8xbx~._.js.map +0 -1
  248. package/.next/server/chunks/ssr/app_11vl967._.js +0 -3
  249. package/.next/server/chunks/ssr/app_11vl967._.js.map +0 -1
  250. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +0 -3
  251. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +0 -1
  252. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +0 -3
  253. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js.map +0 -1
  254. package/.next/static/chunks/02flrewxlf_m_.js +0 -1
  255. package/.next/static/chunks/051gslfjka1kj.js +0 -1
  256. package/.next/static/chunks/06t_vzei8s9_h.js +0 -1
  257. package/.next/static/chunks/07oobuohrpigy.js +0 -1
  258. package/.next/static/chunks/09al3qm76q7nd.js +0 -1
  259. package/.next/static/chunks/0e7c40p~wq665.js +0 -1
  260. package/.next/static/chunks/0g7m7zk.v7g6h.js +0 -1
  261. package/.next/static/chunks/0m328uz90rp81.js +0 -1
  262. package/.next/static/chunks/0ogeals5ufhho.js +0 -1
  263. package/.next/static/chunks/0p4_o2jw2v9n_.css +0 -2
  264. package/.next/static/chunks/0v~9m62eciynd.js +0 -1
  265. package/.next/static/chunks/0z.pzy8zpa~js.js +0 -7
  266. package/.next/static/chunks/1031v6nw33ud3.js +0 -1
  267. package/.next/static/chunks/10ir.g.n~hre0.js +0 -7
  268. package/.next/static/chunks/10njj7kn9ylkf.js +0 -1
  269. package/.next/static/chunks/13.dst7liziwo.js +0 -1
  270. package/public/file.svg +0 -1
  271. package/public/globe.svg +0 -1
  272. package/public/next.svg +0 -1
  273. package/public/vercel.svg +0 -1
  274. package/public/window.svg +0 -1
  275. /package/.next/static/{aliOmgYOuDD7xT9T9MLOA → wt8PpIEMpmwboFwbqXVtO}/_buildManifest.js +0 -0
  276. /package/.next/static/{aliOmgYOuDD7xT9T9MLOA → wt8PpIEMpmwboFwbqXVtO}/_clientMiddlewareManifest.js +0 -0
  277. /package/.next/static/{aliOmgYOuDD7xT9T9MLOA → wt8PpIEMpmwboFwbqXVtO}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":345,"timestamp":188127090306,"id":4,"parentId":1,"tags":{},"startTime":1778559612915,"traceId":"9cdb29ceaf59bed5"},{"name":"load-custom-routes","duration":695,"timestamp":188127090826,"id":5,"parentId":1,"tags":{},"startTime":1778559612916,"traceId":"9cdb29ceaf59bed5"},{"name":"create-dist-dir","duration":628,"timestamp":188127091577,"id":6,"parentId":1,"tags":{},"startTime":1778559612916,"traceId":"9cdb29ceaf59bed5"},{"name":"clean","duration":557,"timestamp":188127093876,"id":7,"parentId":1,"tags":{},"startTime":1778559612919,"traceId":"9cdb29ceaf59bed5"},{"name":"discover-routes","duration":10174,"timestamp":188127203429,"id":8,"parentId":1,"tags":{},"startTime":1778559613028,"traceId":"9cdb29ceaf59bed5"},{"name":"create-root-mapping","duration":108,"timestamp":188127213667,"id":9,"parentId":1,"tags":{},"startTime":1778559613038,"traceId":"9cdb29ceaf59bed5"},{"name":"generate-route-types","duration":34230,"timestamp":188127215972,"id":10,"parentId":1,"tags":{},"startTime":1778559613041,"traceId":"9cdb29ceaf59bed5"},{"name":"public-dir-conflict-check","duration":127,"timestamp":188127251060,"id":11,"parentId":1,"tags":{},"startTime":1778559613076,"traceId":"9cdb29ceaf59bed5"},{"name":"generate-routes-manifest","duration":5297,"timestamp":188127251317,"id":12,"parentId":1,"tags":{},"startTime":1778559613076,"traceId":"9cdb29ceaf59bed5"},{"name":"run-turbopack","duration":12047112,"timestamp":188127265848,"id":14,"parentId":1,"tags":{},"startTime":1778559613091,"traceId":"9cdb29ceaf59bed5"},{"name":"turbopack-build-events","duration":85,"timestamp":188127633852,"id":15,"parentId":1,"tags":{},"startTime":1778559613459,"traceId":"9cdb29ceaf59bed5"},{"name":"run-typescript","duration":10912916,"timestamp":188139330373,"id":16,"parentId":1,"tags":{},"startTime":1778559625155,"traceId":"9cdb29ceaf59bed5"},{"name":"generate-required-server-files","duration":3438,"timestamp":188150244413,"id":18,"parentId":1,"tags":{},"startTime":1778559636069,"traceId":"9cdb29ceaf59bed5"},{"name":"check-static-error-page","duration":31630,"timestamp":188150348626,"id":20,"parentId":19,"tags":{},"startTime":1778559636173,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":478916,"timestamp":188150384872,"id":62,"parentId":22,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":512213,"timestamp":188150351698,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778559636176,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":598506,"timestamp":188150385193,"id":64,"parentId":26,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":621717,"timestamp":188150362054,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778559636187,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":635945,"timestamp":188150385240,"id":65,"parentId":27,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":658982,"timestamp":188150362271,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778559636187,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":651789,"timestamp":188150385276,"id":66,"parentId":28,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":674746,"timestamp":188150362407,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778559636187,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":661935,"timestamp":188150385319,"id":67,"parentId":29,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":684813,"timestamp":188150362528,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778559636187,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":674879,"timestamp":188150385354,"id":68,"parentId":30,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":697481,"timestamp":188150362838,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778559636188,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":692834,"timestamp":188150385387,"id":69,"parentId":32,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":714091,"timestamp":188150364235,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778559636189,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":694645,"timestamp":188150384988,"id":63,"parentId":25,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":721023,"timestamp":188150358667,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778559636183,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":699745,"timestamp":188150385551,"id":71,"parentId":34,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":720846,"timestamp":188150364545,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778559636189,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":701551,"timestamp":188150385505,"id":70,"parentId":33,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":722708,"timestamp":188150364410,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778559636189,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":707877,"timestamp":188150387257,"id":73,"parentId":36,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":729968,"timestamp":188150365228,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778559636190,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":717383,"timestamp":188150385568,"id":72,"parentId":35,"tags":{},"startTime":1778559636210,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":738356,"timestamp":188150364668,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778559636189,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":717487,"timestamp":188150387299,"id":74,"parentId":37,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":739416,"timestamp":188150365419,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778559636190,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":720488,"timestamp":188150384543,"id":61,"parentId":21,"tags":{},"startTime":1778559636209,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":755069,"timestamp":188150349982,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778559636175,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":721722,"timestamp":188150387315,"id":76,"parentId":39,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":742656,"timestamp":188150366421,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778559636191,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":723865,"timestamp":188150387309,"id":75,"parentId":38,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":745010,"timestamp":188150366207,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778559636191,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":725466,"timestamp":188150387328,"id":78,"parentId":41,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":744261,"timestamp":188150368926,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778559636194,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":728463,"timestamp":188150387333,"id":79,"parentId":42,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":746572,"timestamp":188150369256,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778559636194,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":732780,"timestamp":188150387338,"id":80,"parentId":43,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":750771,"timestamp":188150369393,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778559636194,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":735018,"timestamp":188150387344,"id":81,"parentId":44,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":752892,"timestamp":188150369507,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778559636194,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":737209,"timestamp":188150387349,"id":82,"parentId":45,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":754987,"timestamp":188150369604,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778559636194,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":740705,"timestamp":188150387359,"id":84,"parentId":47,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":757586,"timestamp":188150370514,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778559636195,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":744059,"timestamp":188150387364,"id":85,"parentId":48,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":760837,"timestamp":188150370628,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778559636195,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":744508,"timestamp":188150390805,"id":86,"parentId":24,"tags":{},"startTime":1778559636215,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":781354,"timestamp":188150353993,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778559636179,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":747380,"timestamp":188150394779,"id":87,"parentId":31,"tags":{},"startTime":1778559636219,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":779222,"timestamp":188150362985,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778559636188,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":770382,"timestamp":188150387321,"id":77,"parentId":40,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":789764,"timestamp":188150367995,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778559636193,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":774235,"timestamp":188150387354,"id":83,"parentId":46,"tags":{},"startTime":1778559636212,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":791305,"timestamp":188150370344,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778559636195,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":731697,"timestamp":188150432948,"id":89,"parentId":49,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":793284,"timestamp":188150371407,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778559636196,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":737843,"timestamp":188150432967,"id":91,"parentId":51,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":798765,"timestamp":188150372088,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778559636197,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":744555,"timestamp":188150432976,"id":92,"parentId":52,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":805045,"timestamp":188150372535,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778559636197,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":750877,"timestamp":188150432982,"id":93,"parentId":53,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":810991,"timestamp":188150372928,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778559636198,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":782123,"timestamp":188150432992,"id":94,"parentId":55,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":837832,"timestamp":188150377354,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778559636202,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":788591,"timestamp":188150433010,"id":95,"parentId":56,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":844120,"timestamp":188150377552,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778559636202,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":794291,"timestamp":188150433016,"id":96,"parentId":58,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":848707,"timestamp":188150378657,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778559636203,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":799320,"timestamp":188150432877,"id":88,"parentId":23,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":878441,"timestamp":188150353811,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778559636179,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":805716,"timestamp":188150433025,"id":97,"parentId":59,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":859995,"timestamp":188150378808,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778559636203,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":812283,"timestamp":188150433057,"id":99,"parentId":57,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":867099,"timestamp":188150378303,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778559636203,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":812882,"timestamp":188150432960,"id":90,"parentId":50,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":874138,"timestamp":188150371757,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778559636196,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":817766,"timestamp":188150433043,"id":98,"parentId":60,"tags":{},"startTime":1778559636258,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":871916,"timestamp":188150378942,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778559636204,"traceId":"9cdb29ceaf59bed5"},{"name":"is-page-static","duration":798786,"timestamp":188150453043,"id":100,"parentId":54,"tags":{},"startTime":1778559636278,"traceId":"9cdb29ceaf59bed5"},{"name":"check-page","duration":878394,"timestamp":188150373467,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778559636198,"traceId":"9cdb29ceaf59bed5"},{"name":"static-check","duration":904400,"timestamp":188150347495,"id":19,"parentId":1,"tags":{},"startTime":1778559636172,"traceId":"9cdb29ceaf59bed5"},{"name":"write-routes-manifest","duration":419,"timestamp":188151258948,"id":102,"parentId":1,"tags":{},"startTime":1778559637084,"traceId":"9cdb29ceaf59bed5"},{"name":"load-dotenv","duration":54,"timestamp":188151274160,"id":105,"parentId":104,"tags":{},"startTime":1778559637099,"traceId":"9cdb29ceaf59bed5"},{"name":"run-export-path-map","duration":635,"timestamp":188151276733,"id":106,"parentId":104,"tags":{},"startTime":1778559637101,"traceId":"9cdb29ceaf59bed5"},{"name":"next-export","duration":716160,"timestamp":188151272864,"id":104,"parentId":1,"tags":{},"startTime":1778559637098,"traceId":"9cdb29ceaf59bed5"},{"name":"move-exported-app-not-found-","duration":627,"timestamp":188151994199,"id":107,"parentId":103,"tags":{},"startTime":1778559637819,"traceId":"9cdb29ceaf59bed5"},{"name":"move-exported-app-global-error-","duration":439,"timestamp":188151994949,"id":108,"parentId":103,"tags":{},"startTime":1778559637820,"traceId":"9cdb29ceaf59bed5"}]
2
- [{"name":"static-generation","duration":738552,"timestamp":188151263436,"id":103,"parentId":1,"tags":{},"startTime":1778559637088,"traceId":"9cdb29ceaf59bed5"},{"name":"write-routes-manifest","duration":500,"timestamp":188152002222,"id":109,"parentId":1,"tags":{},"startTime":1778559637827,"traceId":"9cdb29ceaf59bed5"},{"name":"print-tree-view","duration":4171,"timestamp":188152010861,"id":110,"parentId":1,"tags":{},"startTime":1778559637836,"traceId":"9cdb29ceaf59bed5"},{"name":"write-route-bundle-stats","duration":14375,"timestamp":188152015071,"id":111,"parentId":1,"tags":{},"startTime":1778559637840,"traceId":"9cdb29ceaf59bed5"},{"name":"telemetry-flush","duration":35579,"timestamp":188152029479,"id":112,"parentId":1,"tags":{},"startTime":1778559637854,"traceId":"9cdb29ceaf59bed5"},{"name":"next-build","duration":25034982,"timestamp":188127030117,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778559612855,"traceId":"9cdb29ceaf59bed5"}]
1
+ [{"name":"generate-buildid","duration":346,"timestamp":220714019079,"id":4,"parentId":1,"tags":{},"startTime":1778592199844,"traceId":"44e8b858ebfeda0f"},{"name":"load-custom-routes","duration":497,"timestamp":220714019608,"id":5,"parentId":1,"tags":{},"startTime":1778592199844,"traceId":"44e8b858ebfeda0f"},{"name":"create-dist-dir","duration":673,"timestamp":220714020150,"id":6,"parentId":1,"tags":{},"startTime":1778592199845,"traceId":"44e8b858ebfeda0f"},{"name":"clean","duration":518,"timestamp":220714021567,"id":7,"parentId":1,"tags":{},"startTime":1778592199846,"traceId":"44e8b858ebfeda0f"},{"name":"discover-routes","duration":8488,"timestamp":220714118046,"id":8,"parentId":1,"tags":{},"startTime":1778592199943,"traceId":"44e8b858ebfeda0f"},{"name":"create-root-mapping","duration":135,"timestamp":220714126603,"id":9,"parentId":1,"tags":{},"startTime":1778592199951,"traceId":"44e8b858ebfeda0f"},{"name":"generate-route-types","duration":32302,"timestamp":220714129018,"id":10,"parentId":1,"tags":{},"startTime":1778592199954,"traceId":"44e8b858ebfeda0f"},{"name":"public-dir-conflict-check","duration":108,"timestamp":220714161523,"id":11,"parentId":1,"tags":{},"startTime":1778592199986,"traceId":"44e8b858ebfeda0f"},{"name":"generate-routes-manifest","duration":4400,"timestamp":220714161756,"id":12,"parentId":1,"tags":{},"startTime":1778592199986,"traceId":"44e8b858ebfeda0f"},{"name":"run-turbopack","duration":9185468,"timestamp":220714172229,"id":14,"parentId":1,"tags":{},"startTime":1778592199997,"traceId":"44e8b858ebfeda0f"},{"name":"turbopack-build-events","duration":100,"timestamp":220714477984,"id":15,"parentId":1,"tags":{},"startTime":1778592200303,"traceId":"44e8b858ebfeda0f"},{"name":"run-typescript","duration":8763918,"timestamp":220723367130,"id":16,"parentId":1,"tags":{},"startTime":1778592209192,"traceId":"44e8b858ebfeda0f"},{"name":"generate-required-server-files","duration":2858,"timestamp":220732132348,"id":18,"parentId":1,"tags":{},"startTime":1778592217957,"traceId":"44e8b858ebfeda0f"},{"name":"check-static-error-page","duration":15172,"timestamp":220732199801,"id":20,"parentId":19,"tags":{},"startTime":1778592218025,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":345692,"timestamp":220732217548,"id":62,"parentId":22,"tags":{},"startTime":1778592218042,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":361251,"timestamp":220732202134,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778592218027,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":417107,"timestamp":220732217242,"id":61,"parentId":21,"tags":{},"startTime":1778592218042,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":433484,"timestamp":220732200943,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778592218026,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":450156,"timestamp":220732218036,"id":63,"parentId":25,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":463392,"timestamp":220732204866,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778592218030,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":459709,"timestamp":220732218286,"id":66,"parentId":28,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":472833,"timestamp":220732205246,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778592218030,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":460428,"timestamp":220732218204,"id":64,"parentId":26,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":473643,"timestamp":220732205036,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778592218030,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":464717,"timestamp":220732218372,"id":68,"parentId":30,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":476541,"timestamp":220732206611,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778592218031,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":464989,"timestamp":220732218338,"id":67,"parentId":29,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":476995,"timestamp":220732206368,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778592218031,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":467667,"timestamp":220732218407,"id":69,"parentId":32,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":479050,"timestamp":220732207072,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778592218032,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":470579,"timestamp":220732218502,"id":70,"parentId":33,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":481954,"timestamp":220732207184,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778592218032,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":470959,"timestamp":220732218552,"id":71,"parentId":34,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":482273,"timestamp":220732207275,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778592218032,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":474117,"timestamp":220732218624,"id":73,"parentId":36,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":485074,"timestamp":220732207711,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778592218032,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":475600,"timestamp":220732218570,"id":72,"parentId":35,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":486838,"timestamp":220732207376,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778592218032,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":478459,"timestamp":220732218643,"id":74,"parentId":37,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":489308,"timestamp":220732207839,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":480530,"timestamp":220732218249,"id":65,"parentId":27,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":493674,"timestamp":220732205142,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778592218030,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":480275,"timestamp":220732218652,"id":75,"parentId":38,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":491002,"timestamp":220732207945,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":480786,"timestamp":220732218658,"id":76,"parentId":39,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":491403,"timestamp":220732208077,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":483741,"timestamp":220732218675,"id":79,"parentId":42,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":494081,"timestamp":220732208380,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":485164,"timestamp":220732218669,"id":78,"parentId":41,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":495578,"timestamp":220732208288,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":490775,"timestamp":220732218681,"id":80,"parentId":43,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":501060,"timestamp":220732208458,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":491082,"timestamp":220732218663,"id":77,"parentId":40,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":501591,"timestamp":220732208197,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":495745,"timestamp":220732218686,"id":81,"parentId":44,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":505836,"timestamp":220732208654,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":495946,"timestamp":220732218696,"id":83,"parentId":46,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":505851,"timestamp":220732208831,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778592218034,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":496106,"timestamp":220732218691,"id":82,"parentId":45,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":506103,"timestamp":220732208727,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778592218033,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":499079,"timestamp":220732218701,"id":84,"parentId":47,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":508871,"timestamp":220732208945,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778592218034,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":500096,"timestamp":220732218706,"id":85,"parentId":48,"tags":{},"startTime":1778592218043,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":509720,"timestamp":220732209117,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778592218034,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":498888,"timestamp":220732220706,"id":86,"parentId":24,"tags":{},"startTime":1778592218045,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":518299,"timestamp":220732202654,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778592218027,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":499782,"timestamp":220732221490,"id":87,"parentId":31,"tags":{},"startTime":1778592218046,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":514534,"timestamp":220732206778,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778592218031,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":487002,"timestamp":220732237373,"id":88,"parentId":23,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":522025,"timestamp":220732202381,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778592218027,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":494265,"timestamp":220732237431,"id":91,"parentId":51,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":521901,"timestamp":220732209849,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778592218035,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":500817,"timestamp":220732237436,"id":92,"parentId":52,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":528287,"timestamp":220732210034,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778592218035,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":506765,"timestamp":220732237445,"id":93,"parentId":53,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":533005,"timestamp":220732211257,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778592218036,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":512075,"timestamp":220732237455,"id":94,"parentId":55,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":537599,"timestamp":220732211981,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778592218037,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":520170,"timestamp":220732237460,"id":95,"parentId":56,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":545549,"timestamp":220732212177,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778592218037,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":521269,"timestamp":220732237422,"id":90,"parentId":50,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":549028,"timestamp":220732209703,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778592218034,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":522819,"timestamp":220732237469,"id":96,"parentId":58,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":546116,"timestamp":220732214223,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778592218039,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":528709,"timestamp":220732237410,"id":89,"parentId":49,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":556644,"timestamp":220732209527,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778592218034,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":529104,"timestamp":220732237484,"id":98,"parentId":60,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":551866,"timestamp":220732214757,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778592218039,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":530874,"timestamp":220732237477,"id":97,"parentId":59,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":553794,"timestamp":220732214598,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778592218039,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":534381,"timestamp":220732237495,"id":99,"parentId":54,"tags":{},"startTime":1778592218062,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":560405,"timestamp":220732211503,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778592218036,"traceId":"44e8b858ebfeda0f"},{"name":"is-page-static","duration":528314,"timestamp":220732244376,"id":100,"parentId":57,"tags":{},"startTime":1778592218069,"traceId":"44e8b858ebfeda0f"},{"name":"check-page","duration":560338,"timestamp":220732212385,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778592218037,"traceId":"44e8b858ebfeda0f"},{"name":"static-check","duration":574076,"timestamp":220732198679,"id":19,"parentId":1,"tags":{},"startTime":1778592218023,"traceId":"44e8b858ebfeda0f"},{"name":"write-routes-manifest","duration":331,"timestamp":220732778850,"id":102,"parentId":1,"tags":{},"startTime":1778592218604,"traceId":"44e8b858ebfeda0f"},{"name":"load-dotenv","duration":50,"timestamp":220732792628,"id":105,"parentId":104,"tags":{},"startTime":1778592218617,"traceId":"44e8b858ebfeda0f"},{"name":"run-export-path-map","duration":615,"timestamp":220732795198,"id":106,"parentId":104,"tags":{},"startTime":1778592218620,"traceId":"44e8b858ebfeda0f"},{"name":"next-export","duration":564296,"timestamp":220732791352,"id":104,"parentId":1,"tags":{},"startTime":1778592218616,"traceId":"44e8b858ebfeda0f"},{"name":"move-exported-app-not-found-","duration":752,"timestamp":220733358984,"id":107,"parentId":103,"tags":{},"startTime":1778592219184,"traceId":"44e8b858ebfeda0f"},{"name":"move-exported-app-global-error-","duration":391,"timestamp":220733359844,"id":108,"parentId":103,"tags":{},"startTime":1778592219185,"traceId":"44e8b858ebfeda0f"}]
2
+ [{"name":"static-generation","duration":581330,"timestamp":220732783458,"id":103,"parentId":1,"tags":{},"startTime":1778592218608,"traceId":"44e8b858ebfeda0f"},{"name":"write-routes-manifest","duration":476,"timestamp":220733364963,"id":109,"parentId":1,"tags":{},"startTime":1778592219190,"traceId":"44e8b858ebfeda0f"},{"name":"print-tree-view","duration":4052,"timestamp":220733375322,"id":110,"parentId":1,"tags":{},"startTime":1778592219200,"traceId":"44e8b858ebfeda0f"},{"name":"write-route-bundle-stats","duration":14048,"timestamp":220733379409,"id":111,"parentId":1,"tags":{},"startTime":1778592219204,"traceId":"44e8b858ebfeda0f"},{"name":"telemetry-flush","duration":26793,"timestamp":220733393493,"id":112,"parentId":1,"tags":{},"startTime":1778592219218,"traceId":"44e8b858ebfeda0f"},{"name":"next-build","duration":19452273,"timestamp":220713968062,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778592199793,"traceId":"44e8b858ebfeda0f"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":12047112,"timestamp":188127265848,"id":14,"parentId":1,"tags":{},"startTime":1778559613091,"traceId":"9cdb29ceaf59bed5"},{"name":"turbopack-build-events","duration":85,"timestamp":188127633852,"id":15,"parentId":1,"tags":{},"startTime":1778559613459,"traceId":"9cdb29ceaf59bed5"},{"name":"run-typescript","duration":10912916,"timestamp":188139330373,"id":16,"parentId":1,"tags":{},"startTime":1778559625155,"traceId":"9cdb29ceaf59bed5"},{"name":"static-check","duration":904400,"timestamp":188150347495,"id":19,"parentId":1,"tags":{},"startTime":1778559636172,"traceId":"9cdb29ceaf59bed5"},{"name":"static-generation","duration":738552,"timestamp":188151263436,"id":103,"parentId":1,"tags":{},"startTime":1778559637088,"traceId":"9cdb29ceaf59bed5"},{"name":"telemetry-flush","duration":35579,"timestamp":188152029479,"id":112,"parentId":1,"tags":{},"startTime":1778559637854,"traceId":"9cdb29ceaf59bed5"},{"name":"next-build","duration":25034982,"timestamp":188127030117,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778559612855,"traceId":"9cdb29ceaf59bed5"}]
1
+ [{"name":"run-turbopack","duration":9185468,"timestamp":220714172229,"id":14,"parentId":1,"tags":{},"startTime":1778592199997,"traceId":"44e8b858ebfeda0f"},{"name":"turbopack-build-events","duration":100,"timestamp":220714477984,"id":15,"parentId":1,"tags":{},"startTime":1778592200303,"traceId":"44e8b858ebfeda0f"},{"name":"run-typescript","duration":8763918,"timestamp":220723367130,"id":16,"parentId":1,"tags":{},"startTime":1778592209192,"traceId":"44e8b858ebfeda0f"},{"name":"static-check","duration":574076,"timestamp":220732198679,"id":19,"parentId":1,"tags":{},"startTime":1778592218023,"traceId":"44e8b858ebfeda0f"},{"name":"static-generation","duration":581330,"timestamp":220732783458,"id":103,"parentId":1,"tags":{},"startTime":1778592218608,"traceId":"44e8b858ebfeda0f"},{"name":"telemetry-flush","duration":26793,"timestamp":220733393493,"id":112,"parentId":1,"tags":{},"startTime":1778592219218,"traceId":"44e8b858ebfeda0f"},{"name":"next-build","duration":19452273,"timestamp":220713968062,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778592199793,"traceId":"44e8b858ebfeda0f"}]
@@ -3,6 +3,7 @@
3
3
  import { useState } from 'react';
4
4
  import { useSessions, useHealth, useStats } from '../lib/hooks';
5
5
  import { timeAgo } from '../components/utils';
6
+ import { AliasAvatar } from '../components/AliasAvatar';
6
7
 
7
8
  export default function AdminPage() {
8
9
  const { sessions } = useSessions();
@@ -72,9 +73,32 @@ export default function AdminPage() {
72
73
 
73
74
  return (
74
75
  <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
75
- <h1 className="text-2xl font-bold text-white mb-6 lg:ml-0 ml-10">Admin</h1>
76
+ <h1 className="text-2xl font-bold text-white mb-3 lg:ml-0 ml-10">Admin</h1>
77
+
78
+ {/* Section anchor nav — same pattern as Settings r28. */}
79
+ <nav className="mb-8 flex flex-wrap gap-1 text-xs">
80
+ {[
81
+ { href: '#status', label: 'Status' },
82
+ { href: '#actions', label: 'Actions' },
83
+ { href: '#users', label: 'Users' },
84
+ ].map(a => (
85
+ <a key={a.href} href={a.href}
86
+ className="rounded-md px-2.5 py-1 text-gray-500 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors">
87
+ {a.label}
88
+ </a>
89
+ ))}
90
+ </nav>
91
+
92
+ <div className="max-w-6xl space-y-10">
93
+
94
+ {/* ── Group: Status ─────────────────────────────────────── */}
95
+ <div id="status" className="space-y-4 scroll-mt-6">
96
+ <div className="flex items-center gap-2 px-1">
97
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Status</div>
98
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
99
+ </div>
100
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
76
101
 
77
- <div className="grid grid-cols-1 lg:grid-cols-2 gap-6 max-w-6xl">
78
102
  {/* Server Overview */}
79
103
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
80
104
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Server Overview</h2>
@@ -89,7 +113,9 @@ export default function AdminPage() {
89
113
  </div>
90
114
  <div>
91
115
  <div className="text-3xl font-bold text-cyan-400 tabular-nums">{health?.sse_connections ?? '--'}</div>
92
- <div className="text-xs text-gray-500">SSE Connections</div>
116
+ <div className="text-xs text-gray-500">
117
+ SSE Streams <span className="text-gray-600">· server</span>
118
+ </div>
93
119
  </div>
94
120
  <div>
95
121
  <div className="text-3xl font-bold text-white tabular-nums">{stats?.tasks?.total ?? '--'}</div>
@@ -107,6 +133,52 @@ export default function AdminPage() {
107
133
  )}
108
134
  </section>
109
135
 
136
+ {/* Online Sessions — pulled into Status group (was below Send Task) */}
137
+ <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
138
+ <h2 className="text-sm font-semibold text-gray-300 mb-4">
139
+ Online Sessions <span className="text-gray-600">({onlineNodes.length})</span>
140
+ </h2>
141
+ <div className="space-y-2 max-h-80 overflow-y-auto">
142
+ {onlineNodes.length === 0 ? (
143
+ <div className="text-xs text-gray-600 text-center py-4">No online sessions</div>
144
+ ) : onlineNodes.map(s => (
145
+ <div key={s.alias} className="flex items-center gap-3 bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]">
146
+ <AliasAvatar alias={s.alias} size={20} />
147
+ <div className="min-w-0 flex-1">
148
+ <div className="text-sm text-white font-medium truncate">{s.alias}</div>
149
+ <div className="text-xs text-gray-500 truncate">{s.agent || '--'} · {s.task || 'idle'}</div>
150
+ </div>
151
+ <div className="flex items-center gap-2 shrink-0">
152
+ <span className={`text-xs px-2 py-0.5 rounded border ${
153
+ s.status === 'working' ? 'bg-green-900/30 text-green-300 border-green-800/30' : 'bg-blue-900/30 text-blue-300 border-blue-800/30'
154
+ }`}>{s.status}</span>
155
+ <span className="text-[10px] text-gray-600">{timeAgo(s.updated_at)}</span>
156
+ </div>
157
+ </div>
158
+ ))}
159
+ </div>
160
+ </section>
161
+
162
+ </div>
163
+ </div>
164
+
165
+ {/* ── Group: Actions ────────────────────────────────────── */}
166
+ <div id="actions" className="space-y-4 scroll-mt-6">
167
+ <div className="flex items-center gap-2 px-1">
168
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Actions</div>
169
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
170
+ </div>
171
+ {sessions.length === 0 ? (
172
+ /* Round 77: Broadcast and Send Task both require at least one
173
+ registered agent. Surfacing the empty cards above an empty
174
+ fleet is the same dead-control class as the Overview
175
+ Dispatch button (r70). Replace with a single inline hint. */
176
+ <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl px-5 py-4 text-sm text-gray-500">
177
+ Broadcast and Send Task become available after the first agent registers.
178
+ </div>
179
+ ) : (
180
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
181
+
110
182
  {/* Broadcast */}
111
183
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
112
184
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Broadcast</h2>
@@ -167,30 +239,18 @@ export default function AdminPage() {
167
239
  {taskResult && <div className={`mt-2 text-xs ${taskResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{taskResult}</div>}
168
240
  </section>
169
241
 
170
- {/* Online Sessions */}
171
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
172
- <h2 className="text-sm font-semibold text-gray-300 mb-4">
173
- Online Sessions <span className="text-gray-600">({onlineNodes.length})</span>
174
- </h2>
175
- <div className="space-y-2 max-h-80 overflow-y-auto">
176
- {onlineNodes.length === 0 ? (
177
- <div className="text-xs text-gray-600 text-center py-4">No online sessions</div>
178
- ) : onlineNodes.map(s => (
179
- <div key={s.alias} className="flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]">
180
- <div className="min-w-0">
181
- <div className="text-sm text-white font-medium truncate">{s.alias}</div>
182
- <div className="text-xs text-gray-500 truncate">{s.agent || '--'} · {s.task || 'idle'}</div>
183
- </div>
184
- <div className="flex items-center gap-2 shrink-0">
185
- <span className={`text-xs px-2 py-0.5 rounded border ${
186
- s.status === 'working' ? 'bg-green-900/30 text-green-300 border-green-800/30' : 'bg-blue-900/30 text-blue-300 border-blue-800/30'
187
- }`}>{s.status}</span>
188
- <span className="text-[10px] text-gray-600">{timeAgo(s.updated_at)}</span>
189
- </div>
190
- </div>
191
- ))}
192
242
  </div>
193
- </section>
243
+ )}
244
+ </div>
245
+
246
+ {/* ── Group: Users ──────────────────────────────────────── */}
247
+ <div id="users" className="space-y-4 scroll-mt-6">
248
+ <div className="flex items-center gap-2 px-1">
249
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Users</div>
250
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
251
+ </div>
252
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
253
+
194
254
  {/* User Management (V3 Auth) */}
195
255
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
196
256
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Register User (V3)</h2>
@@ -219,6 +279,10 @@ export default function AdminPage() {
219
279
  </div>
220
280
  {regResult && <div className={`mt-2 text-xs ${regResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{regResult}</div>}
221
281
  </section>
282
+
283
+ </div>
284
+ </div>
285
+
222
286
  </div>
223
287
  </div>
224
288
  );
@@ -3,6 +3,7 @@
3
3
  import Link from 'next/link';
4
4
  import { Session } from './types';
5
5
  import { timeAgo } from './utils';
6
+ import { AliasAvatar } from './AliasAvatar';
6
7
 
7
8
  interface AgentCardProps {
8
9
  session: Session;
@@ -27,17 +28,20 @@ export function AgentCard({ session: s, hasSse, sseCount, onChat }: AgentCardPro
27
28
  <Link
28
29
  href={`/node?alias=${encodeURIComponent(s.alias)}`}
29
30
  prefetch={false}
30
- className={`block rounded-xl border p-4 transition-all duration-300 cursor-pointer ${
31
+ className={`anet-agent-card group relative block rounded-xl border p-4 transition-all duration-300 cursor-pointer hover:-translate-y-0.5 ${
31
32
  hasSse
32
33
  ? `bg-[#111128] border-[#2a2a4a] hover:border-cyan-500/30 hover:shadow-lg ${cfg.glow}`
33
34
  : 'bg-[#0d0d1a] border-[#1a1a2a] opacity-40'
34
35
  }`}
35
36
  >
36
- {/* Header: name + status */}
37
+ {/* Header: avatar + name + status. Avatar carries the alias→hue map
38
+ shared with Messages/Nodes/Tasks/Overview; the live status dot
39
+ stays as a small pulse-capable indicator. */}
37
40
  <div className="flex items-center justify-between mb-3">
38
41
  <div className="flex items-center gap-2 min-w-0">
39
- <span className={`inline-block w-2 h-2 rounded-full shrink-0 ${cfg.dot} ${hasSse && s.status === 'working' ? 'animate-pulse' : ''}`} />
42
+ <AliasAvatar alias={s.alias} size={22} />
40
43
  <span className="font-semibold text-white truncate text-sm" title={s.alias}>{s.alias}</span>
44
+ <span className={`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${cfg.dot} ${hasSse && s.status === 'working' ? 'animate-pulse' : ''}`} />
41
45
  </div>
42
46
  <span className={`text-[11px] px-2 py-0.5 rounded-md border shrink-0 ${cfg.bg} ${cfg.text}`}>
43
47
  {hasSse ? s.status : 'offline'}
@@ -79,9 +83,12 @@ export function AgentCard({ session: s, hasSse, sseCount, onChat }: AgentCardPro
79
83
  </div>
80
84
  )}
81
85
 
82
- {/* Footer: time + chat */}
86
+ {/* Footer: time + chat + hover chevron affordance (round 44).
87
+ The card is a <Link> so it's clickable everywhere, but with no
88
+ visible cue users may not realise. Chevron appears on hover and
89
+ slides right ~2px for a "drill in" hint. */}
83
90
  <div className="mt-3 flex justify-between items-center text-[10px] text-gray-600">
84
- <span>{s.server || '--'}</span>
91
+ <span className="truncate" title={s.server || ''}>{s.server || '--'}</span>
85
92
  <div className="flex items-center gap-2">
86
93
  {onChat && hasSse && (
87
94
  <button
@@ -92,6 +99,13 @@ export function AgentCard({ session: s, hasSse, sseCount, onChat }: AgentCardPro
92
99
  </button>
93
100
  )}
94
101
  <span>{timeAgo(s.updated_at)}</span>
102
+ <svg
103
+ aria-hidden
104
+ className="w-3 h-3 text-gray-700 opacity-0 -translate-x-1 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-200"
105
+ fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"
106
+ >
107
+ <path d="M9 18l6-6-6-6" />
108
+ </svg>
95
109
  </div>
96
110
  </div>
97
111
  </Link>
@@ -48,16 +48,34 @@ export function BroadcastBar() {
48
48
  onClick={sendBroadcast}
49
49
  disabled={broadcasting || !broadcastMsg.trim()}
50
50
  aria-label="Send broadcast"
51
- className="px-5 py-2.5 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-all font-medium cursor-pointer disabled:cursor-not-allowed"
51
+ className="flex items-center gap-2 px-5 py-2.5 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-all font-medium cursor-pointer disabled:cursor-not-allowed"
52
52
  >
53
- {broadcasting ? 'Sending...' : 'Broadcast'}
53
+ {broadcasting ? (
54
+ <>
55
+ <svg aria-hidden className="w-4 h-4 animate-spin" viewBox="0 0 24 24" fill="none">
56
+ <circle cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="3" opacity="0.25" />
57
+ <path d="M4 12a8 8 0 018-8" stroke="currentColor" strokeWidth="3" strokeLinecap="round" />
58
+ </svg>
59
+ <span>Sending…</span>
60
+ </>
61
+ ) : (
62
+ <>
63
+ {/* Megaphone icon — "broadcast to all" affordance */}
64
+ <svg aria-hidden className="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
65
+ <path d="M3 11v3a1 1 0 0 0 1 1h2l3.29 3.29a1 1 0 0 0 1.71-.71V7.42a1 1 0 0 0-1.71-.71L6 10H4a1 1 0 0 0-1 1Z" />
66
+ <path d="M16 8a5 5 0 0 1 0 6" opacity="0.7" />
67
+ <path d="M19 5a9 9 0 0 1 0 12" opacity="0.45" />
68
+ </svg>
69
+ <span>Broadcast</span>
70
+ </>
71
+ )}
54
72
  </button>
55
73
  </div>
56
74
  {broadcastMsg.length > 0 && (
57
- <div className="text-right text-xs text-gray-600 mt-1">{broadcastMsg.length}/500</div>
75
+ <div className="text-right text-xs text-gray-600 mt-1 tabular-nums">{broadcastMsg.length}/500</div>
58
76
  )}
59
77
  {broadcastResult && (
60
- <div className={`mt-3 text-sm text-center ${broadcastResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400/80'} animate-fade-in`}>
78
+ <div className={`mt-3 text-sm text-center anet-fade-in ${broadcastResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400/80'}`}>
61
79
  {broadcastResult}
62
80
  </div>
63
81
  )}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useState } from 'react';
4
4
  import type { Session } from './types';
5
+ import { AliasAvatar } from './AliasAvatar';
5
6
 
6
7
  interface DispatchPanelProps {
7
8
  sessions: Session[];
@@ -71,8 +72,8 @@ export function DispatchPanel({ sessions, onClose }: DispatchPanelProps) {
71
72
 
72
73
  return (
73
74
  <>
74
- <div className="fixed inset-0 bg-black/50 z-40" onClick={onClose} />
75
- <div className="fixed inset-4 lg:inset-x-[15%] lg:inset-y-[5%] bg-[#0a0a1a] border border-[#2a2a4a] rounded-2xl z-50 flex flex-col shadow-2xl shadow-black/70 overflow-hidden">
75
+ <div className="fixed inset-0 bg-black/50 z-40 anet-fade-in" onClick={onClose} />
76
+ <div className="fixed inset-4 lg:inset-x-[15%] lg:inset-y-[5%] bg-[#0a0a1a] border border-[#2a2a4a] rounded-2xl z-50 flex flex-col shadow-2xl shadow-black/70 overflow-hidden anet-fade-in">
76
77
  {/* Header */}
77
78
  <div className="flex items-center justify-between px-6 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a]">
78
79
  <div>
@@ -108,7 +109,8 @@ export function DispatchPanel({ sessions, onClose }: DispatchPanelProps) {
108
109
  className={`w-full flex items-center gap-2 px-3 py-2 rounded-lg text-xs text-left transition-colors ${
109
110
  selected.has(s.alias) ? 'bg-cyan-500/10 text-cyan-300 border border-cyan-500/20' : 'text-gray-400 hover:bg-[#1a1a2a]'
110
111
  }`}>
111
- <div className={`w-2 h-2 rounded-full shrink-0 ${s.status === 'working' ? 'bg-green-400' : s.status === 'idle' ? 'bg-cyan-400' : 'bg-gray-500'}`} />
112
+ <AliasAvatar alias={s.alias} size={16} />
113
+ <div className={`w-1.5 h-1.5 rounded-full shrink-0 ${s.status === 'working' ? 'bg-green-400' : s.status === 'idle' ? 'bg-cyan-400' : 'bg-gray-500'}`} />
112
114
  <span className="truncate flex-1">{s.alias}</span>
113
115
  <span className="text-[9px] text-gray-600">{s.agent || '--'}</span>
114
116
  </button>
@@ -159,10 +161,12 @@ export function DispatchPanel({ sessions, onClose }: DispatchPanelProps) {
159
161
  </div>
160
162
  <div className="flex flex-wrap gap-1.5">
161
163
  {results.map(r => (
162
- <span key={r.alias} className={`text-[10px] px-2 py-0.5 rounded-full border ${
164
+ <span key={r.alias} className={`flex items-center gap-1.5 text-[10px] pl-1 pr-2 py-0.5 rounded-full border ${
163
165
  r.ok ? 'text-green-300 border-green-500/20 bg-green-500/5' : 'text-red-300 border-red-500/20 bg-red-500/5'
164
166
  }`}>
165
- {r.alias}: {r.ok ? '✓' : r.error || '✗'}
167
+ <AliasAvatar alias={r.alias} size={14} />
168
+ <span>{r.alias}</span>
169
+ <span aria-hidden>{r.ok ? '✓' : r.error || '✗'}</span>
166
170
  </span>
167
171
  ))}
168
172
  </div>
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { useState } from 'react';
3
4
  import Link from 'next/link';
4
5
 
5
6
  export type EmptyVariant = 'nodes' | 'tasks' | 'messages' | 'logs' | 'tokens' | 'networks' | 'generic';
@@ -180,10 +181,82 @@ export function NodesEmptyState({ hint }: { hint?: { global_count?: number; filt
180
181
  />
181
182
  );
182
183
  }
184
+ // Round 52: true empty state (zero agents anywhere) — show the
185
+ // quickstart command inline so users don't have to leave the dashboard
186
+ // to figure out how to spin up their first agent.
183
187
  return (
184
- <EmptyState
185
- variant="nodes"
186
- cta={{ label: 'Run anet quickstart', href: 'https://anet.sh' }}
187
- />
188
+ <div className="text-center py-16 px-4" role="status">
189
+ <div className="anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500" aria-hidden>
190
+ <svg viewBox="0 0 64 64" width={56} height={56}>
191
+ <g stroke="currentColor" strokeWidth="1.5" fill="none">
192
+ <rect x="10" y="20" width="44" height="28" rx="2" />
193
+ <rect x="20" y="32" width="6" height="8" opacity="0.5" />
194
+ <rect x="32" y="32" width="6" height="8" opacity="0.5" />
195
+ <rect x="44" y="32" width="4" height="8" opacity="0.5" />
196
+ <line x1="10" y1="26" x2="54" y2="26" opacity="0.4" />
197
+ <circle cx="14" cy="23" r="0.8" fill="currentColor" />
198
+ </g>
199
+ </svg>
200
+ </div>
201
+ <h3 className="font-medium text-gray-300 text-base">Spin up your first agent</h3>
202
+ <p className="text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed">
203
+ Run this in a fresh terminal to register an agent with this CommHub:
204
+ </p>
205
+ <div className="mt-4 inline-block">
206
+ <QuickstartCommand cmd="npx --yes @sleep2agi/agent-network init" />
207
+ </div>
208
+ <div className="mt-3">
209
+ <a
210
+ href="https://anet.sh"
211
+ target="_blank"
212
+ rel="noopener noreferrer"
213
+ className="inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300"
214
+ >
215
+ Full quickstart guide
216
+ <span aria-hidden>→</span>
217
+ </a>
218
+ </div>
219
+ </div>
220
+ );
221
+ }
222
+
223
+ /** Code block + inline copy button used by the empty-Overview first-run
224
+ * CTA. State lives here so the parent stays stateless. */
225
+ function QuickstartCommand({ cmd }: { cmd: string }) {
226
+ const [copied, setCopied] = useState(false);
227
+ const onCopy = async () => {
228
+ try {
229
+ await navigator.clipboard.writeText(cmd);
230
+ setCopied(true);
231
+ setTimeout(() => setCopied(false), 1800);
232
+ } catch {}
233
+ };
234
+ return (
235
+ <div className="anet-empty-cmd flex items-center gap-2 bg-[#0a0a15] border border-[#2a2a4a] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm">
236
+ <code className="text-cyan-300 font-mono select-all">{cmd}</code>
237
+ <button
238
+ type="button"
239
+ onClick={onCopy}
240
+ aria-label={copied ? 'Copied' : 'Copy command'}
241
+ className="shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1a1a2a] transition-colors"
242
+ >
243
+ {copied ? (
244
+ <span className="flex items-center gap-1 text-green-400">
245
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
246
+ <path d="M20 6 9 17l-5-5" />
247
+ </svg>
248
+ Copied
249
+ </span>
250
+ ) : (
251
+ <span className="flex items-center gap-1">
252
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
253
+ <rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
254
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
255
+ </svg>
256
+ Copy
257
+ </span>
258
+ )}
259
+ </button>
260
+ </div>
188
261
  );
189
262
  }
@@ -7,6 +7,7 @@ import Link from 'next/link';
7
7
  interface StatsResponse {
8
8
  ok?: boolean;
9
9
  tasks?: { by_status?: { status: string; count: number }[] };
10
+ nodes?: { total?: number };
10
11
  health?: { version?: string };
11
12
  error?: string;
12
13
  }
@@ -50,9 +51,10 @@ export function HealthBanner() {
50
51
 
51
52
  if (dismissed) return null;
52
53
 
53
- // Determine current state — priority: red > amber > green
54
+ // Determine current state — priority: red > amber > empty > green
54
55
  const hubDown = (statsErr && healthErr) || (health && health.ok === false);
55
56
  const failed = stats?.tasks?.by_status?.find(s => s.status === 'failed')?.count || 0;
57
+ const fleetEmpty = stats?.nodes?.total === 0;
56
58
 
57
59
  let kind: 'red' | 'amber' | 'green';
58
60
  let message: string;
@@ -66,6 +68,13 @@ export function HealthBanner() {
66
68
  kind = 'amber';
67
69
  message = `${failed} task${failed > 1 ? 's' : ''} failed recently`;
68
70
  cta = { label: 'Review failures', href: '/tasks?status=failed' };
71
+ } else if (fleetEmpty) {
72
+ // Round 70 — was "All systems go" before, which is misleading when
73
+ // the fleet is empty. Reuses the green palette (it's not a failure
74
+ // state) but with onboarding copy + CTA-less for restraint.
75
+ kind = 'green';
76
+ message = 'Waiting for first agent';
77
+ cta = null;
69
78
  } else {
70
79
  kind = 'green';
71
80
  message = 'All systems go';
@@ -92,7 +101,7 @@ export function HealthBanner() {
92
101
  return (
93
102
  <div
94
103
  role="status"
95
- className={`anet-health-banner border-b ${styles} pl-14 pr-3 sm:px-6 py-1.5 text-[12px] flex items-center justify-between gap-3`}
104
+ className={`anet-health-banner sticky top-0 z-30 border-b ${styles} pl-14 pr-3 sm:px-6 py-1.5 text-[12px] flex items-center justify-between gap-3 backdrop-blur-sm`}
96
105
  >
97
106
  <div className="flex items-center gap-2 min-w-0">
98
107
  <span className={`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${dot}`} aria-hidden />