@sleep2agi/agent-network-dashboard 0.4.5-preview.4 → 0.4.5-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 (256) 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 +50 -50
  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_client-reference-manifest.js +1 -1
  40. package/.next/server/app/login.html +2 -2
  41. package/.next/server/app/login.rsc +14 -14
  42. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  43. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  44. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  45. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  46. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  47. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  48. package/.next/server/app/logs/page.js.nft.json +1 -1
  49. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  50. package/.next/server/app/logs.html +4 -4
  51. package/.next/server/app/logs.rsc +14 -14
  52. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  53. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  54. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  55. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  56. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  57. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  58. package/.next/server/app/messages/page.js.nft.json +1 -1
  59. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app/messages.html +4 -4
  61. package/.next/server/app/messages.rsc +14 -14
  62. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  63. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  64. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  65. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  66. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  67. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  68. package/.next/server/app/node/page.js.nft.json +1 -1
  69. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  70. package/.next/server/app/node.html +4 -4
  71. package/.next/server/app/node.rsc +14 -14
  72. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  73. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  74. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  75. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  76. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  77. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  78. package/.next/server/app/nodes/page.js.nft.json +1 -1
  79. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  80. package/.next/server/app/nodes.html +4 -4
  81. package/.next/server/app/nodes.rsc +14 -14
  82. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  83. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  84. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  85. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  86. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  87. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  88. package/.next/server/app/page.js.nft.json +1 -1
  89. package/.next/server/app/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  91. package/.next/server/app/server-logs.html +4 -4
  92. package/.next/server/app/server-logs.rsc +14 -14
  93. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  94. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  95. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  96. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  97. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  98. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  99. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  100. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  101. package/.next/server/app/settings/networks.html +4 -4
  102. package/.next/server/app/settings/networks.rsc +14 -14
  103. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  104. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  105. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  106. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  107. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  108. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  109. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  110. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/settings/tokens.html +4 -4
  113. package/.next/server/app/settings/tokens.rsc +14 -14
  114. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  115. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  116. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  117. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  118. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  119. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  120. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  121. package/.next/server/app/settings.html +4 -4
  122. package/.next/server/app/settings.rsc +14 -14
  123. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  124. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  125. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  126. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  127. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  128. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  129. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  130. package/.next/server/app/tasks/page.js.nft.json +1 -1
  131. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  132. package/.next/server/app/tasks.html +4 -4
  133. package/.next/server/app/tasks.rsc +14 -14
  134. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  135. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  136. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  137. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  138. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  139. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  140. package/.next/server/chunks/ssr/[root-of-the-server]__02ee4km._.js +3 -0
  141. package/.next/server/chunks/ssr/[root-of-the-server]__02ee4km._.js.map +1 -0
  142. package/.next/server/chunks/ssr/[root-of-the-server]__0jjqrcf._.js +3 -0
  143. package/.next/server/chunks/ssr/[root-of-the-server]__0jjqrcf._.js.map +1 -0
  144. package/.next/server/chunks/ssr/[root-of-the-server]__0o8yj3c._.js +3 -0
  145. package/.next/server/chunks/ssr/[root-of-the-server]__0o8yj3c._.js.map +1 -0
  146. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js +1 -1
  147. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js.map +1 -1
  148. package/.next/server/chunks/ssr/_0nne7mz._.js +3 -0
  149. package/.next/server/chunks/ssr/_0nne7mz._.js.map +1 -0
  150. package/.next/server/chunks/ssr/app_0.zbtn5._.js +9 -0
  151. package/.next/server/chunks/ssr/app_0.zbtn5._.js.map +1 -0
  152. package/.next/server/chunks/ssr/app_04n78pr._.js +3 -0
  153. package/.next/server/chunks/ssr/app_04n78pr._.js.map +1 -0
  154. package/.next/server/chunks/ssr/app_0_agk0r._.js +3 -0
  155. package/.next/server/chunks/ssr/app_0_agk0r._.js.map +1 -0
  156. package/.next/server/chunks/ssr/app_0dk5wao._.js +1 -1
  157. package/.next/server/chunks/ssr/app_0dk5wao._.js.map +1 -1
  158. package/.next/server/chunks/ssr/app_0izi28j._.js +1 -1
  159. package/.next/server/chunks/ssr/app_0izi28j._.js.map +1 -1
  160. package/.next/server/chunks/ssr/app_0tncr1_._.js +3 -0
  161. package/.next/server/chunks/ssr/app_0tncr1_._.js.map +1 -0
  162. package/.next/server/chunks/ssr/app_components_08ys5y3._.js +5 -5
  163. package/.next/server/chunks/ssr/app_components_08ys5y3._.js.map +1 -1
  164. package/.next/server/chunks/ssr/app_components_0lhp_k.._.js +3 -0
  165. package/.next/server/chunks/ssr/app_components_0lhp_k.._.js.map +1 -0
  166. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
  167. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +1 -1
  168. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js +1 -1
  169. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js.map +1 -1
  170. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js +1 -1
  171. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js.map +1 -1
  172. package/.next/server/middleware-build-manifest.js +3 -3
  173. package/.next/server/pages/404.html +4 -4
  174. package/.next/server/pages/500.html +1 -1
  175. package/.next/server/server-reference-manifest.js +1 -1
  176. package/.next/server/server-reference-manifest.json +1 -1
  177. package/.next/static/chunks/02oje7pf-g1v5.js +1 -0
  178. package/.next/static/chunks/06x7w8nwggx~~.js +1 -0
  179. package/.next/static/chunks/0943n0t.9c-o2.js +1 -0
  180. package/.next/static/chunks/{07okhs5561y5y.js → 0c1bp~g7.8ru..js} +1 -1
  181. package/.next/static/chunks/0csmku~3y472t.js +1 -0
  182. package/.next/static/chunks/0df0py1glk9xm.js +1 -0
  183. package/.next/static/chunks/0edt_z0rlxgfk.js +1 -0
  184. package/.next/static/chunks/0g394kqz_d5.x.js +1 -0
  185. package/.next/static/chunks/0irkayokwc1fm.js +1 -0
  186. package/.next/static/chunks/0j8ee64jv6zb7.js +7 -0
  187. package/.next/static/chunks/0qe_pfeioih-5.css +2 -0
  188. package/.next/static/chunks/0qnpc7rbxn12u.js +1 -0
  189. package/.next/static/chunks/0xdl435t_mf1c.js +1 -0
  190. package/.next/static/chunks/0~n.cadw9_e8s.js +7 -0
  191. package/.next/static/chunks/11_n-vjzf735y.js +1 -0
  192. package/.next/static/chunks/15c9pv6gxir.5.js +1 -0
  193. package/.next/trace +2 -2
  194. package/.next/trace-build +1 -1
  195. package/app/admin/page.tsx +77 -25
  196. package/app/components/AgentCard.tsx +19 -5
  197. package/app/components/AliasAvatar.tsx +51 -0
  198. package/app/components/BroadcastBar.tsx +22 -4
  199. package/app/components/DispatchPanel.tsx +9 -5
  200. package/app/components/EmptyState.tsx +77 -4
  201. package/app/components/HealthBanner.tsx +1 -1
  202. package/app/components/HelpOverlay.tsx +50 -10
  203. package/app/components/InboxPanel.tsx +6 -3
  204. package/app/components/Sidebar.tsx +49 -41
  205. package/app/components/TaskChatPanel.tsx +8 -10
  206. package/app/components/TaskDrawer.tsx +72 -28
  207. package/app/components/TopoGraph.tsx +118 -24
  208. package/app/globals.css +90 -0
  209. package/app/lib/version.ts +7 -0
  210. package/app/login/page.tsx +37 -7
  211. package/app/logs/page.tsx +72 -21
  212. package/app/messages/page.tsx +85 -51
  213. package/app/node/page.tsx +32 -15
  214. package/app/nodes/page.tsx +21 -23
  215. package/app/page.tsx +71 -13
  216. package/app/server-logs/page.tsx +37 -3
  217. package/app/settings/networks/page.tsx +37 -13
  218. package/app/settings/page.tsx +38 -10
  219. package/app/tasks/page.tsx +77 -41
  220. package/package.json +1 -1
  221. package/.next/server/chunks/ssr/[root-of-the-server]__0_jnflc._.js +0 -3
  222. package/.next/server/chunks/ssr/[root-of-the-server]__0_jnflc._.js.map +0 -1
  223. package/.next/server/chunks/ssr/[root-of-the-server]__0nrckjd._.js +0 -3
  224. package/.next/server/chunks/ssr/[root-of-the-server]__0nrckjd._.js.map +0 -1
  225. package/.next/server/chunks/ssr/[root-of-the-server]__12mpoig._.js +0 -3
  226. package/.next/server/chunks/ssr/[root-of-the-server]__12mpoig._.js.map +0 -1
  227. package/.next/server/chunks/ssr/_0d-fuox._.js +0 -3
  228. package/.next/server/chunks/ssr/_0d-fuox._.js.map +0 -1
  229. package/.next/server/chunks/ssr/app_0.0wpa~._.js +0 -3
  230. package/.next/server/chunks/ssr/app_0.0wpa~._.js.map +0 -1
  231. package/.next/server/chunks/ssr/app_0ap_oiq._.js +0 -3
  232. package/.next/server/chunks/ssr/app_0ap_oiq._.js.map +0 -1
  233. package/.next/server/chunks/ssr/app_0et5yua._.js +0 -3
  234. package/.next/server/chunks/ssr/app_0et5yua._.js.map +0 -1
  235. package/.next/server/chunks/ssr/app_0ff~kjj._.js +0 -9
  236. package/.next/server/chunks/ssr/app_0ff~kjj._.js.map +0 -1
  237. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +0 -3
  238. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js.map +0 -1
  239. package/.next/static/chunks/02flrewxlf_m_.js +0 -1
  240. package/.next/static/chunks/03sm_xa792mxv.css +0 -2
  241. package/.next/static/chunks/051gslfjka1kj.js +0 -1
  242. package/.next/static/chunks/06t_vzei8s9_h.js +0 -1
  243. package/.next/static/chunks/07oobuohrpigy.js +0 -1
  244. package/.next/static/chunks/0e7c40p~wq665.js +0 -1
  245. package/.next/static/chunks/0g7m7zk.v7g6h.js +0 -1
  246. package/.next/static/chunks/0khpyxpdrp~ty.js +0 -1
  247. package/.next/static/chunks/0lo_g.q1fm-hr.js +0 -7
  248. package/.next/static/chunks/0m328uz90rp81.js +0 -1
  249. package/.next/static/chunks/0ogeals5ufhho.js +0 -1
  250. package/.next/static/chunks/1031v6nw33ud3.js +0 -1
  251. package/.next/static/chunks/10ir.g.n~hre0.js +0 -7
  252. package/.next/static/chunks/10njj7kn9ylkf.js +0 -1
  253. package/.next/static/chunks/13.dst7liziwo.js +0 -1
  254. /package/.next/static/{dvKGMaUCm52sSTROKhYVL → t8ckUU0UVyOpv2ymrRHll}/_buildManifest.js +0 -0
  255. /package/.next/static/{dvKGMaUCm52sSTROKhYVL → t8ckUU0UVyOpv2ymrRHll}/_clientMiddlewareManifest.js +0 -0
  256. /package/.next/static/{dvKGMaUCm52sSTROKhYVL → t8ckUU0UVyOpv2ymrRHll}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":298,"timestamp":187131880243,"id":4,"parentId":1,"tags":{},"startTime":1778558617705,"traceId":"17e78f818ae875ee"},{"name":"load-custom-routes","duration":515,"timestamp":187131880695,"id":5,"parentId":1,"tags":{},"startTime":1778558617705,"traceId":"17e78f818ae875ee"},{"name":"create-dist-dir","duration":416,"timestamp":187131881257,"id":6,"parentId":1,"tags":{},"startTime":1778558617706,"traceId":"17e78f818ae875ee"},{"name":"clean","duration":587,"timestamp":187131882629,"id":7,"parentId":1,"tags":{},"startTime":1778558617707,"traceId":"17e78f818ae875ee"},{"name":"discover-routes","duration":8389,"timestamp":187131981307,"id":8,"parentId":1,"tags":{},"startTime":1778558617806,"traceId":"17e78f818ae875ee"},{"name":"create-root-mapping","duration":136,"timestamp":187131989770,"id":9,"parentId":1,"tags":{},"startTime":1778558617814,"traceId":"17e78f818ae875ee"},{"name":"generate-route-types","duration":26101,"timestamp":187131992328,"id":10,"parentId":1,"tags":{},"startTime":1778558617817,"traceId":"17e78f818ae875ee"},{"name":"public-dir-conflict-check","duration":144,"timestamp":187132018593,"id":11,"parentId":1,"tags":{},"startTime":1778558617843,"traceId":"17e78f818ae875ee"},{"name":"generate-routes-manifest","duration":6108,"timestamp":187132018929,"id":12,"parentId":1,"tags":{},"startTime":1778558617844,"traceId":"17e78f818ae875ee"},{"name":"run-turbopack","duration":7019275,"timestamp":187132047712,"id":14,"parentId":1,"tags":{},"startTime":1778558617872,"traceId":"17e78f818ae875ee"},{"name":"turbopack-build-events","duration":83,"timestamp":187132329286,"id":15,"parentId":1,"tags":{},"startTime":1778558618154,"traceId":"17e78f818ae875ee"},{"name":"run-typescript","duration":7463711,"timestamp":187139074373,"id":16,"parentId":1,"tags":{},"startTime":1778558624899,"traceId":"17e78f818ae875ee"},{"name":"generate-required-server-files","duration":2243,"timestamp":187146539027,"id":18,"parentId":1,"tags":{},"startTime":1778558632364,"traceId":"17e78f818ae875ee"},{"name":"check-static-error-page","duration":16361,"timestamp":187146606893,"id":20,"parentId":19,"tags":{},"startTime":1778558632432,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":422638,"timestamp":187146626583,"id":62,"parentId":22,"tags":{},"startTime":1778558632451,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":440302,"timestamp":187146609051,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778558632434,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":458974,"timestamp":187146626174,"id":61,"parentId":21,"tags":{},"startTime":1778558632451,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":477330,"timestamp":187146607894,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778558632433,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":509605,"timestamp":187146626721,"id":63,"parentId":25,"tags":{},"startTime":1778558632451,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":524967,"timestamp":187146611423,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778558632436,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":512497,"timestamp":187146626928,"id":64,"parentId":26,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":527768,"timestamp":187146611720,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778558632436,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":526368,"timestamp":187146627090,"id":66,"parentId":28,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":540315,"timestamp":187146613207,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778558632438,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":526644,"timestamp":187146627028,"id":65,"parentId":27,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":541881,"timestamp":187146611823,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778558632437,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":530340,"timestamp":187146627268,"id":69,"parentId":32,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":543785,"timestamp":187146613909,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778558632439,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":534422,"timestamp":187146627422,"id":70,"parentId":33,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":547717,"timestamp":187146614197,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778558632439,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":537028,"timestamp":187146627160,"id":67,"parentId":29,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":550880,"timestamp":187146613366,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778558632438,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":538734,"timestamp":187146627508,"id":71,"parentId":34,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":551972,"timestamp":187146614315,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778558632439,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":542045,"timestamp":187146627216,"id":68,"parentId":30,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":555736,"timestamp":187146613578,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778558632438,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":542403,"timestamp":187146627625,"id":73,"parentId":36,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":555322,"timestamp":187146614767,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778558632439,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":546949,"timestamp":187146627535,"id":72,"parentId":35,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":560135,"timestamp":187146614414,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778558632439,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":549057,"timestamp":187146627667,"id":75,"parentId":38,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":561759,"timestamp":187146615018,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":550496,"timestamp":187146627676,"id":76,"parentId":39,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":563120,"timestamp":187146615094,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":553957,"timestamp":187146627694,"id":78,"parentId":41,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":566473,"timestamp":187146615221,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":556444,"timestamp":187146627685,"id":77,"parentId":40,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":569028,"timestamp":187146615158,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":558494,"timestamp":187146627654,"id":74,"parentId":37,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":571299,"timestamp":187146614898,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":558673,"timestamp":187146627703,"id":79,"parentId":42,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":571119,"timestamp":187146615287,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":560713,"timestamp":187146627720,"id":81,"parentId":44,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":573068,"timestamp":187146615417,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":562385,"timestamp":187146627728,"id":82,"parentId":45,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":574674,"timestamp":187146615483,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":565339,"timestamp":187146627748,"id":84,"parentId":47,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":577457,"timestamp":187146615672,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":567465,"timestamp":187146627711,"id":80,"parentId":43,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":579874,"timestamp":187146615351,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":568362,"timestamp":187146627736,"id":83,"parentId":46,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":580551,"timestamp":187146615588,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":568631,"timestamp":187146627758,"id":85,"parentId":48,"tags":{},"startTime":1778558632452,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":580671,"timestamp":187146615752,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778558632440,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":562103,"timestamp":187146637198,"id":87,"parentId":31,"tags":{},"startTime":1778558632462,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":585666,"timestamp":187146613678,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778558632438,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":563427,"timestamp":187146636063,"id":86,"parentId":24,"tags":{},"startTime":1778558632461,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":590099,"timestamp":187146609427,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778558632434,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":548996,"timestamp":187146656604,"id":90,"parentId":50,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":589400,"timestamp":187146616241,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778558632441,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":557425,"timestamp":187146656614,"id":91,"parentId":51,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":597766,"timestamp":187146616347,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778558632441,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":560243,"timestamp":187146656619,"id":92,"parentId":52,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":600416,"timestamp":187146616498,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778558632441,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":565908,"timestamp":187146656628,"id":93,"parentId":53,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":605935,"timestamp":187146616651,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778558632441,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":572511,"timestamp":187146656638,"id":94,"parentId":55,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":611670,"timestamp":187146617535,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778558632442,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":580012,"timestamp":187146656557,"id":88,"parentId":23,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":627372,"timestamp":187146609276,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778558632434,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":580220,"timestamp":187146656593,"id":89,"parentId":49,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":620724,"timestamp":187146616113,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778558632441,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":580291,"timestamp":187146656643,"id":95,"parentId":56,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":619255,"timestamp":187146617698,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778558632442,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":586040,"timestamp":187146656652,"id":96,"parentId":58,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":624591,"timestamp":187146618167,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778558632443,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":586270,"timestamp":187146656667,"id":98,"parentId":60,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":620116,"timestamp":187146622852,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778558632448,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":590014,"timestamp":187146656660,"id":97,"parentId":59,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":628446,"timestamp":187146618279,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778558632443,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":591263,"timestamp":187146656678,"id":99,"parentId":54,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":630966,"timestamp":187146617114,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778558632442,"traceId":"17e78f818ae875ee"},{"name":"is-page-static","duration":592038,"timestamp":187146656686,"id":100,"parentId":57,"tags":{},"startTime":1778558632481,"traceId":"17e78f818ae875ee"},{"name":"check-page","duration":630916,"timestamp":187146617845,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778558632443,"traceId":"17e78f818ae875ee"},{"name":"static-check","duration":642740,"timestamp":187146606075,"id":19,"parentId":1,"tags":{},"startTime":1778558632431,"traceId":"17e78f818ae875ee"},{"name":"write-routes-manifest","duration":407,"timestamp":187147255446,"id":102,"parentId":1,"tags":{},"startTime":1778558633080,"traceId":"17e78f818ae875ee"},{"name":"load-dotenv","duration":85,"timestamp":187147267947,"id":105,"parentId":104,"tags":{},"startTime":1778558633093,"traceId":"17e78f818ae875ee"},{"name":"run-export-path-map","duration":697,"timestamp":187147270676,"id":106,"parentId":104,"tags":{},"startTime":1778558633095,"traceId":"17e78f818ae875ee"},{"name":"next-export","duration":538786,"timestamp":187147266599,"id":104,"parentId":1,"tags":{},"startTime":1778558633091,"traceId":"17e78f818ae875ee"},{"name":"move-exported-app-not-found-","duration":1333,"timestamp":187147808533,"id":107,"parentId":103,"tags":{},"startTime":1778558633633,"traceId":"17e78f818ae875ee"},{"name":"move-exported-app-global-error-","duration":439,"timestamp":187147809970,"id":108,"parentId":103,"tags":{},"startTime":1778558633635,"traceId":"17e78f818ae875ee"}]
2
- [{"name":"static-generation","duration":554640,"timestamp":187147259844,"id":103,"parentId":1,"tags":{},"startTime":1778558633085,"traceId":"17e78f818ae875ee"},{"name":"write-routes-manifest","duration":381,"timestamp":187147814651,"id":109,"parentId":1,"tags":{},"startTime":1778558633639,"traceId":"17e78f818ae875ee"},{"name":"print-tree-view","duration":3700,"timestamp":187147826530,"id":110,"parentId":1,"tags":{},"startTime":1778558633651,"traceId":"17e78f818ae875ee"},{"name":"write-route-bundle-stats","duration":12930,"timestamp":187147830273,"id":111,"parentId":1,"tags":{},"startTime":1778558633655,"traceId":"17e78f818ae875ee"},{"name":"telemetry-flush","duration":33002,"timestamp":187147843244,"id":112,"parentId":1,"tags":{},"startTime":1778558633668,"traceId":"17e78f818ae875ee"},{"name":"next-build","duration":16054132,"timestamp":187131822153,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778558617647,"traceId":"17e78f818ae875ee"}]
1
+ [{"name":"generate-buildid","duration":385,"timestamp":211425236680,"id":4,"parentId":1,"tags":{},"startTime":1778582911061,"traceId":"a1f913eac733e916"},{"name":"load-custom-routes","duration":553,"timestamp":211425237270,"id":5,"parentId":1,"tags":{},"startTime":1778582911062,"traceId":"a1f913eac733e916"},{"name":"create-dist-dir","duration":348,"timestamp":211425237904,"id":6,"parentId":1,"tags":{},"startTime":1778582911063,"traceId":"a1f913eac733e916"},{"name":"clean","duration":587,"timestamp":211425238969,"id":7,"parentId":1,"tags":{},"startTime":1778582911064,"traceId":"a1f913eac733e916"},{"name":"discover-routes","duration":9282,"timestamp":211425335029,"id":8,"parentId":1,"tags":{},"startTime":1778582911160,"traceId":"a1f913eac733e916"},{"name":"create-root-mapping","duration":116,"timestamp":211425344378,"id":9,"parentId":1,"tags":{},"startTime":1778582911169,"traceId":"a1f913eac733e916"},{"name":"generate-route-types","duration":31508,"timestamp":211425346733,"id":10,"parentId":1,"tags":{},"startTime":1778582911171,"traceId":"a1f913eac733e916"},{"name":"public-dir-conflict-check","duration":110,"timestamp":211425378498,"id":11,"parentId":1,"tags":{},"startTime":1778582911203,"traceId":"a1f913eac733e916"},{"name":"generate-routes-manifest","duration":4170,"timestamp":211425378742,"id":12,"parentId":1,"tags":{},"startTime":1778582911203,"traceId":"a1f913eac733e916"},{"name":"run-turbopack","duration":12693236,"timestamp":211425388281,"id":14,"parentId":1,"tags":{},"startTime":1778582911213,"traceId":"a1f913eac733e916"},{"name":"turbopack-build-events","duration":79,"timestamp":211425711288,"id":15,"parentId":1,"tags":{},"startTime":1778582911536,"traceId":"a1f913eac733e916"},{"name":"run-typescript","duration":11782619,"timestamp":211438122997,"id":16,"parentId":1,"tags":{},"startTime":1778582923948,"traceId":"a1f913eac733e916"},{"name":"generate-required-server-files","duration":6401,"timestamp":211449907405,"id":18,"parentId":1,"tags":{},"startTime":1778582935732,"traceId":"a1f913eac733e916"},{"name":"check-static-error-page","duration":32810,"timestamp":211449997409,"id":20,"parentId":19,"tags":{},"startTime":1778582935822,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":653803,"timestamp":211450034383,"id":62,"parentId":22,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":684179,"timestamp":211450004140,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778582935829,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":831448,"timestamp":211450034456,"id":63,"parentId":25,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":852448,"timestamp":211450013530,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778582935838,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":843332,"timestamp":211450034084,"id":61,"parentId":21,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":876388,"timestamp":211450001087,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778582935826,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":859962,"timestamp":211450034642,"id":65,"parentId":27,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":880785,"timestamp":211450013883,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778582935839,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":866907,"timestamp":211450034602,"id":64,"parentId":26,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":887810,"timestamp":211450013762,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778582935838,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":894622,"timestamp":211450034761,"id":68,"parentId":30,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":913131,"timestamp":211450016317,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778582935841,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":906792,"timestamp":211450034728,"id":67,"parentId":29,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":927476,"timestamp":211450014134,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778582935839,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":924411,"timestamp":211450034793,"id":69,"parentId":32,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":942344,"timestamp":211450016925,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778582935842,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":932949,"timestamp":211450034941,"id":71,"parentId":34,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":950746,"timestamp":211450017224,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778582935842,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":934695,"timestamp":211450034897,"id":70,"parentId":33,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":952533,"timestamp":211450017102,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778582935842,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":937633,"timestamp":211450034958,"id":72,"parentId":35,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":955286,"timestamp":211450017349,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778582935842,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":939377,"timestamp":211450035029,"id":73,"parentId":36,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":953719,"timestamp":211450020728,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778582935845,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":940427,"timestamp":211450035048,"id":74,"parentId":37,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":954554,"timestamp":211450020955,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":944131,"timestamp":211450035056,"id":75,"parentId":38,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":958113,"timestamp":211450021114,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":944290,"timestamp":211450035062,"id":76,"parentId":39,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":958156,"timestamp":211450021217,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":945996,"timestamp":211450035068,"id":77,"parentId":40,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":959786,"timestamp":211450021316,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":948482,"timestamp":211450034690,"id":66,"parentId":28,"tags":{},"startTime":1778582935859,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":969227,"timestamp":211450013997,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778582935839,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":949365,"timestamp":211450035074,"id":78,"parentId":41,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":963058,"timestamp":211450021414,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":951108,"timestamp":211450035080,"id":79,"parentId":42,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":964710,"timestamp":211450021515,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":952734,"timestamp":211450035085,"id":80,"parentId":43,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":966246,"timestamp":211450021609,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778582935846,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":954691,"timestamp":211450035091,"id":81,"parentId":44,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":967513,"timestamp":211450022303,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778582935847,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":956014,"timestamp":211450035101,"id":83,"parentId":46,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":968507,"timestamp":211450022643,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778582935847,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":958339,"timestamp":211450035096,"id":82,"parentId":45,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":971002,"timestamp":211450022467,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778582935847,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":960631,"timestamp":211450035106,"id":84,"parentId":47,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":972982,"timestamp":211450022790,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778582935847,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":964430,"timestamp":211450038437,"id":86,"parentId":31,"tags":{},"startTime":1778582935863,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":986388,"timestamp":211450016527,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778582935841,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":970082,"timestamp":211450035111,"id":85,"parentId":48,"tags":{},"startTime":1778582935860,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":982332,"timestamp":211450022911,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778582935848,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":965317,"timestamp":211450040030,"id":87,"parentId":24,"tags":{},"startTime":1778582935865,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":998016,"timestamp":211450007362,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778582935832,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":949646,"timestamp":211450063077,"id":89,"parentId":49,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":986398,"timestamp":211450026384,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778582935851,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":956882,"timestamp":211450063095,"id":91,"parentId":51,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":993203,"timestamp":211450026845,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778582935852,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":963037,"timestamp":211450063103,"id":92,"parentId":52,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":999099,"timestamp":211450027097,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778582935852,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":970431,"timestamp":211450063109,"id":93,"parentId":53,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1006686,"timestamp":211450027351,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778582935852,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":977270,"timestamp":211450063119,"id":94,"parentId":55,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1012350,"timestamp":211450028095,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778582935853,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":986064,"timestamp":211450063038,"id":88,"parentId":23,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1042079,"timestamp":211450007105,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778582935832,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":986216,"timestamp":211450063128,"id":95,"parentId":56,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1021103,"timestamp":211450028266,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778582935853,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":990443,"timestamp":211450063134,"id":96,"parentId":58,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1023852,"timestamp":211450029778,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778582935854,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":996395,"timestamp":211450063154,"id":98,"parentId":60,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1029570,"timestamp":211450030033,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778582935855,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":1002254,"timestamp":211450063163,"id":99,"parentId":57,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1037033,"timestamp":211450028436,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778582935853,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":1007955,"timestamp":211450063172,"id":100,"parentId":54,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1043601,"timestamp":211450027576,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778582935852,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":1009669,"timestamp":211450063142,"id":97,"parentId":59,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1042957,"timestamp":211450029907,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778582935855,"traceId":"a1f913eac733e916"},{"name":"is-page-static","duration":1032109,"timestamp":211450063088,"id":90,"parentId":50,"tags":{},"startTime":1778582935888,"traceId":"a1f913eac733e916"},{"name":"check-page","duration":1068629,"timestamp":211450026635,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778582935851,"traceId":"a1f913eac733e916"},{"name":"static-check","duration":1099479,"timestamp":211449995830,"id":19,"parentId":1,"tags":{},"startTime":1778582935821,"traceId":"a1f913eac733e916"},{"name":"write-routes-manifest","duration":468,"timestamp":211451103147,"id":102,"parentId":1,"tags":{},"startTime":1778582936928,"traceId":"a1f913eac733e916"},{"name":"load-dotenv","duration":81,"timestamp":211451124080,"id":105,"parentId":104,"tags":{},"startTime":1778582936949,"traceId":"a1f913eac733e916"},{"name":"run-export-path-map","duration":725,"timestamp":211451127893,"id":106,"parentId":104,"tags":{},"startTime":1778582936953,"traceId":"a1f913eac733e916"},{"name":"next-export","duration":651132,"timestamp":211451121923,"id":104,"parentId":1,"tags":{},"startTime":1778582936947,"traceId":"a1f913eac733e916"},{"name":"move-exported-app-not-found-","duration":781,"timestamp":211451776453,"id":107,"parentId":103,"tags":{},"startTime":1778582937601,"traceId":"a1f913eac733e916"},{"name":"move-exported-app-global-error-","duration":491,"timestamp":211451777341,"id":108,"parentId":103,"tags":{},"startTime":1778582937602,"traceId":"a1f913eac733e916"}]
2
+ [{"name":"static-generation","duration":674706,"timestamp":211451108886,"id":103,"parentId":1,"tags":{},"startTime":1778582936934,"traceId":"a1f913eac733e916"},{"name":"write-routes-manifest","duration":497,"timestamp":211451783836,"id":109,"parentId":1,"tags":{},"startTime":1778582937609,"traceId":"a1f913eac733e916"},{"name":"print-tree-view","duration":5558,"timestamp":211451804853,"id":110,"parentId":1,"tags":{},"startTime":1778582937630,"traceId":"a1f913eac733e916"},{"name":"write-route-bundle-stats","duration":13705,"timestamp":211451810473,"id":111,"parentId":1,"tags":{},"startTime":1778582937635,"traceId":"a1f913eac733e916"},{"name":"telemetry-flush","duration":18808,"timestamp":211451824216,"id":112,"parentId":1,"tags":{},"startTime":1778582937649,"traceId":"a1f913eac733e916"},{"name":"next-build","duration":26666678,"timestamp":211425176388,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778582911001,"traceId":"a1f913eac733e916"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":7019275,"timestamp":187132047712,"id":14,"parentId":1,"tags":{},"startTime":1778558617872,"traceId":"17e78f818ae875ee"},{"name":"turbopack-build-events","duration":83,"timestamp":187132329286,"id":15,"parentId":1,"tags":{},"startTime":1778558618154,"traceId":"17e78f818ae875ee"},{"name":"run-typescript","duration":7463711,"timestamp":187139074373,"id":16,"parentId":1,"tags":{},"startTime":1778558624899,"traceId":"17e78f818ae875ee"},{"name":"static-check","duration":642740,"timestamp":187146606075,"id":19,"parentId":1,"tags":{},"startTime":1778558632431,"traceId":"17e78f818ae875ee"},{"name":"static-generation","duration":554640,"timestamp":187147259844,"id":103,"parentId":1,"tags":{},"startTime":1778558633085,"traceId":"17e78f818ae875ee"},{"name":"telemetry-flush","duration":33002,"timestamp":187147843244,"id":112,"parentId":1,"tags":{},"startTime":1778558633668,"traceId":"17e78f818ae875ee"},{"name":"next-build","duration":16054132,"timestamp":187131822153,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778558617647,"traceId":"17e78f818ae875ee"}]
1
+ [{"name":"run-turbopack","duration":12693236,"timestamp":211425388281,"id":14,"parentId":1,"tags":{},"startTime":1778582911213,"traceId":"a1f913eac733e916"},{"name":"turbopack-build-events","duration":79,"timestamp":211425711288,"id":15,"parentId":1,"tags":{},"startTime":1778582911536,"traceId":"a1f913eac733e916"},{"name":"run-typescript","duration":11782619,"timestamp":211438122997,"id":16,"parentId":1,"tags":{},"startTime":1778582923948,"traceId":"a1f913eac733e916"},{"name":"static-check","duration":1099479,"timestamp":211449995830,"id":19,"parentId":1,"tags":{},"startTime":1778582935821,"traceId":"a1f913eac733e916"},{"name":"static-generation","duration":674706,"timestamp":211451108886,"id":103,"parentId":1,"tags":{},"startTime":1778582936934,"traceId":"a1f913eac733e916"},{"name":"telemetry-flush","duration":18808,"timestamp":211451824216,"id":112,"parentId":1,"tags":{},"startTime":1778582937649,"traceId":"a1f913eac733e916"},{"name":"next-build","duration":26666678,"timestamp":211425176388,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778582911001,"traceId":"a1f913eac733e916"}]
@@ -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>
@@ -107,6 +131,43 @@ export default function AdminPage() {
107
131
  )}
108
132
  </section>
109
133
 
134
+ {/* Online Sessions — pulled into Status group (was below Send Task) */}
135
+ <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
136
+ <h2 className="text-sm font-semibold text-gray-300 mb-4">
137
+ Online Sessions <span className="text-gray-600">({onlineNodes.length})</span>
138
+ </h2>
139
+ <div className="space-y-2 max-h-80 overflow-y-auto">
140
+ {onlineNodes.length === 0 ? (
141
+ <div className="text-xs text-gray-600 text-center py-4">No online sessions</div>
142
+ ) : onlineNodes.map(s => (
143
+ <div key={s.alias} className="flex items-center gap-3 bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]">
144
+ <AliasAvatar alias={s.alias} size={20} />
145
+ <div className="min-w-0 flex-1">
146
+ <div className="text-sm text-white font-medium truncate">{s.alias}</div>
147
+ <div className="text-xs text-gray-500 truncate">{s.agent || '--'} · {s.task || 'idle'}</div>
148
+ </div>
149
+ <div className="flex items-center gap-2 shrink-0">
150
+ <span className={`text-xs px-2 py-0.5 rounded border ${
151
+ 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'
152
+ }`}>{s.status}</span>
153
+ <span className="text-[10px] text-gray-600">{timeAgo(s.updated_at)}</span>
154
+ </div>
155
+ </div>
156
+ ))}
157
+ </div>
158
+ </section>
159
+
160
+ </div>
161
+ </div>
162
+
163
+ {/* ── Group: Actions ────────────────────────────────────── */}
164
+ <div id="actions" className="space-y-4 scroll-mt-6">
165
+ <div className="flex items-center gap-2 px-1">
166
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Actions</div>
167
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
168
+ </div>
169
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
170
+
110
171
  {/* Broadcast */}
111
172
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
112
173
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Broadcast</h2>
@@ -167,30 +228,17 @@ export default function AdminPage() {
167
228
  {taskResult && <div className={`mt-2 text-xs ${taskResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{taskResult}</div>}
168
229
  </section>
169
230
 
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
231
  </div>
193
- </section>
232
+ </div>
233
+
234
+ {/* ── Group: Users ──────────────────────────────────────── */}
235
+ <div id="users" className="space-y-4 scroll-mt-6">
236
+ <div className="flex items-center gap-2 px-1">
237
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Users</div>
238
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
239
+ </div>
240
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
241
+
194
242
  {/* User Management (V3 Auth) */}
195
243
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
196
244
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Register User (V3)</h2>
@@ -219,6 +267,10 @@ export default function AdminPage() {
219
267
  </div>
220
268
  {regResult && <div className={`mt-2 text-xs ${regResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{regResult}</div>}
221
269
  </section>
270
+
271
+ </div>
272
+ </div>
273
+
222
274
  </div>
223
275
  </div>
224
276
  );
@@ -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>
@@ -0,0 +1,51 @@
1
+ /** Hue-hashed avatar pill for agent aliases. Same alias → same color across
2
+ * every page (Messages, Nodes, TopoGraph). Use the `size` prop for inline
3
+ * pills (16/20) vs card headers (28). Round 21 introduced the palette;
4
+ * round 22 promotes it from app/messages to a shared component. */
5
+
6
+ const AVATAR_HUES = [180, 200, 220, 270, 300, 330, 30, 90];
7
+
8
+ export function aliasAvatarColors(alias: string): { bg: string; ring: string; text: string } {
9
+ let h = 0;
10
+ for (let i = 0; i < alias.length; i++) h = (h * 31 + alias.charCodeAt(i)) >>> 0;
11
+ const hue = AVATAR_HUES[h % AVATAR_HUES.length];
12
+ return {
13
+ bg: `hsl(${hue} 55% 22%)`,
14
+ ring: `hsl(${hue} 60% 45%)`,
15
+ text: `hsl(${hue} 80% 78%)`,
16
+ };
17
+ }
18
+
19
+ export function aliasInitial(alias?: string): string {
20
+ if (!alias) return '·';
21
+ const ch = alias.trim().match(/[\p{L}\p{N}]/u)?.[0] || alias.trim()[0] || '·';
22
+ return ch.toUpperCase();
23
+ }
24
+
25
+ interface AliasAvatarProps {
26
+ alias: string;
27
+ size?: number;
28
+ className?: string;
29
+ }
30
+
31
+ export function AliasAvatar({ alias, size = 28, className = '' }: AliasAvatarProps) {
32
+ const c = aliasAvatarColors(alias);
33
+ const fs = Math.max(9, Math.round(size * 0.42));
34
+ return (
35
+ <span
36
+ className={`anet-alias-avatar inline-flex items-center justify-center rounded-full border shrink-0 font-semibold ${className}`}
37
+ style={{
38
+ width: size,
39
+ height: size,
40
+ fontSize: fs,
41
+ backgroundColor: c.bg,
42
+ borderColor: c.ring,
43
+ color: c.text,
44
+ }}
45
+ title={alias}
46
+ aria-hidden
47
+ >
48
+ {aliasInitial(alias)}
49
+ </span>
50
+ );
51
+ }
@@ -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
  }
@@ -92,7 +92,7 @@ export function HealthBanner() {
92
92
  return (
93
93
  <div
94
94
  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`}
95
+ 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
96
  >
97
97
  <div className="flex items-center gap-2 min-w-0">
98
98
  <span className={`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${dot}`} aria-hidden />