@sleep2agi/agent-network-dashboard 0.4.5-preview.8 → 0.4.5-preview.80

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 (281) hide show
  1. package/.mcp.json +11 -0
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/diagnostics/route-bundle-stats.json +48 -48
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +4 -4
  16. package/.next/server/app/_not-found.rsc +12 -12
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/server/app/admin/page.js.nft.json +1 -1
  24. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/admin.html +4 -4
  26. package/.next/server/app/admin.rsc +14 -14
  27. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  28. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  29. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  30. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  31. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  32. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  33. package/.next/server/app/index.html +4 -4
  34. package/.next/server/app/index.rsc +14 -14
  35. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  36. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  37. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  38. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  39. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  40. package/.next/server/app/login/page.js.nft.json +1 -1
  41. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  42. package/.next/server/app/login.html +2 -2
  43. package/.next/server/app/login.rsc +14 -14
  44. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  45. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  46. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  47. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  48. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  49. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  50. package/.next/server/app/logs/page.js.nft.json +1 -1
  51. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/logs.html +4 -4
  53. package/.next/server/app/logs.rsc +14 -14
  54. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  55. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  56. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  57. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  58. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  59. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  60. package/.next/server/app/messages/page.js.nft.json +1 -1
  61. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  62. package/.next/server/app/messages.html +4 -4
  63. package/.next/server/app/messages.rsc +14 -14
  64. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  65. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  66. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  67. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  68. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  69. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  70. package/.next/server/app/node/page.js.nft.json +1 -1
  71. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  72. package/.next/server/app/node.html +4 -4
  73. package/.next/server/app/node.rsc +14 -14
  74. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  75. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  76. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  77. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  78. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  79. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  80. package/.next/server/app/nodes/page.js.nft.json +1 -1
  81. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/nodes.html +4 -4
  83. package/.next/server/app/nodes.rsc +14 -14
  84. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  85. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  86. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  87. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  88. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  89. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  90. package/.next/server/app/page.js.nft.json +1 -1
  91. package/.next/server/app/page_client-reference-manifest.js +1 -1
  92. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/server-logs.html +4 -4
  94. package/.next/server/app/server-logs.rsc +14 -14
  95. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  96. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  97. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  98. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  100. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  101. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  102. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/networks.html +4 -4
  104. package/.next/server/app/settings/networks.rsc +14 -14
  105. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  106. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  107. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  108. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  109. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  110. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  111. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  112. package/.next/server/app/settings/page.js.nft.json +1 -1
  113. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  114. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/settings/tokens.html +4 -4
  116. package/.next/server/app/settings/tokens.rsc +14 -14
  117. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  118. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  119. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  120. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  121. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  122. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  123. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  124. package/.next/server/app/settings.html +4 -4
  125. package/.next/server/app/settings.rsc +14 -14
  126. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  127. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  128. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  129. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  130. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  131. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  132. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  133. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  134. package/.next/server/app/tasks/page.js.nft.json +1 -1
  135. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  136. package/.next/server/app/tasks.html +4 -4
  137. package/.next/server/app/tasks.rsc +14 -14
  138. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  139. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  140. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  141. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  142. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  143. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  144. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js +3 -0
  145. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js.map +1 -0
  146. package/.next/server/chunks/ssr/[root-of-the-server]__0n46s~k._.js +3 -0
  147. package/.next/server/chunks/ssr/[root-of-the-server]__0n46s~k._.js.map +1 -0
  148. package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js +3 -0
  149. package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js.map +1 -0
  150. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js +1 -1
  151. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js.map +1 -1
  152. package/.next/server/chunks/ssr/_0nne7mz._.js +3 -0
  153. package/.next/server/chunks/ssr/_0nne7mz._.js.map +1 -0
  154. package/.next/server/chunks/ssr/app_0.zbtn5._.js +9 -0
  155. package/.next/server/chunks/ssr/app_0.zbtn5._.js.map +1 -0
  156. package/.next/server/chunks/ssr/app_01y-~mp._.js +3 -0
  157. package/.next/server/chunks/ssr/app_01y-~mp._.js.map +1 -0
  158. package/.next/server/chunks/ssr/app_04n78pr._.js +3 -0
  159. package/.next/server/chunks/ssr/app_04n78pr._.js.map +1 -0
  160. package/.next/server/chunks/ssr/app_0_agk0r._.js +3 -0
  161. package/.next/server/chunks/ssr/app_0_agk0r._.js.map +1 -0
  162. package/.next/server/chunks/ssr/app_0aenxef._.js +3 -0
  163. package/.next/server/chunks/ssr/app_0aenxef._.js.map +1 -0
  164. package/.next/server/chunks/ssr/app_0aum_g5._.js +3 -0
  165. package/.next/server/chunks/ssr/app_0aum_g5._.js.map +1 -0
  166. package/.next/server/chunks/ssr/app_0emvkn2._.js +3 -0
  167. package/.next/server/chunks/ssr/app_0emvkn2._.js.map +1 -0
  168. package/.next/server/chunks/ssr/app_0esuljp._.js +3 -0
  169. package/.next/server/chunks/ssr/app_0esuljp._.js.map +1 -0
  170. package/.next/server/chunks/ssr/app_0izi28j._.js +1 -1
  171. package/.next/server/chunks/ssr/app_0izi28j._.js.map +1 -1
  172. package/.next/server/chunks/ssr/app_components_08ys5y3._.js +5 -5
  173. package/.next/server/chunks/ssr/app_components_08ys5y3._.js.map +1 -1
  174. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js +1 -1
  175. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js.map +1 -1
  176. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js +1 -1
  177. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js.map +1 -1
  178. package/.next/server/middleware-build-manifest.js +3 -3
  179. package/.next/server/pages/404.html +4 -4
  180. package/.next/server/pages/500.html +1 -1
  181. package/.next/server/server-reference-manifest.js +1 -1
  182. package/.next/server/server-reference-manifest.json +1 -1
  183. package/.next/static/chunks/06uku.~mtk9zz.js +1 -0
  184. package/.next/static/chunks/07zsecr-~j5xa.js +1 -0
  185. package/.next/static/chunks/08i3fgrjz9_yj.css +2 -0
  186. package/.next/static/chunks/0av2~0.96~d~g.js +1 -0
  187. package/.next/static/chunks/0b64c5k_6b_n8.js +1 -0
  188. package/.next/static/chunks/{07okhs5561y5y.js → 0c1bp~g7.8ru..js} +1 -1
  189. package/.next/static/chunks/0dj5~edkdwh1n.js +1 -0
  190. package/.next/static/chunks/0geyh7e8y2s5f.js +1 -0
  191. package/.next/static/chunks/0gn0dhq_g343f.js +1 -0
  192. package/.next/static/chunks/0gtbwcilfu6b7.js +1 -0
  193. package/.next/static/chunks/0ir50f-dedv4s.js +1 -0
  194. package/.next/static/chunks/0rk5zmyp19fv8.js +7 -0
  195. package/.next/static/chunks/0ve696rkee.95.js +7 -0
  196. package/.next/static/chunks/0why2e264gmro.js +1 -0
  197. package/.next/static/chunks/0yw01eo779t1c.js +1 -0
  198. package/.next/static/chunks/11qk8zcquptgr.js +1 -0
  199. package/.next/static/chunks/158g10ijxldbh.js +1 -0
  200. package/.next/trace +2 -2
  201. package/.next/trace-build +1 -1
  202. package/app/admin/page.tsx +97 -27
  203. package/app/components/AgentCard.tsx +19 -5
  204. package/app/components/BroadcastBar.tsx +22 -4
  205. package/app/components/DispatchPanel.tsx +9 -5
  206. package/app/components/EmptyState.tsx +77 -4
  207. package/app/components/HealthBanner.tsx +11 -2
  208. package/app/components/HelpOverlay.tsx +50 -10
  209. package/app/components/InboxPanel.tsx +7 -4
  210. package/app/components/Sidebar.tsx +49 -41
  211. package/app/components/StatsBar.tsx +59 -36
  212. package/app/components/TaskChatPanel.tsx +8 -10
  213. package/app/components/TaskDrawer.tsx +72 -28
  214. package/app/components/TopoGraph.tsx +183 -31
  215. package/app/components/utils.ts +13 -0
  216. package/app/globals.css +90 -0
  217. package/app/lib/status.ts +85 -0
  218. package/app/lib/version.ts +7 -0
  219. package/app/login/page.tsx +40 -7
  220. package/app/logs/page.tsx +70 -21
  221. package/app/messages/page.tsx +34 -9
  222. package/app/node/page.tsx +52 -27
  223. package/app/nodes/page.tsx +45 -21
  224. package/app/page.tsx +99 -31
  225. package/app/server-logs/page.tsx +104 -28
  226. package/app/settings/networks/page.tsx +40 -16
  227. package/app/settings/page.tsx +39 -11
  228. package/app/tasks/[id]/page.tsx +2 -13
  229. package/app/tasks/page.tsx +66 -73
  230. package/package.json +1 -1
  231. package/scripts/fold-only.mjs +47 -0
  232. package/scripts/loop-review.mjs +270 -0
  233. package/scripts/topo-shot.mjs +25 -0
  234. package/.next/server/chunks/ssr/[root-of-the-server]__06w_u7t._.js +0 -3
  235. package/.next/server/chunks/ssr/[root-of-the-server]__06w_u7t._.js.map +0 -1
  236. package/.next/server/chunks/ssr/[root-of-the-server]__0ehu0jb._.js +0 -3
  237. package/.next/server/chunks/ssr/[root-of-the-server]__0ehu0jb._.js.map +0 -1
  238. package/.next/server/chunks/ssr/[root-of-the-server]__0nrckjd._.js +0 -3
  239. package/.next/server/chunks/ssr/[root-of-the-server]__0nrckjd._.js.map +0 -1
  240. package/.next/server/chunks/ssr/_13_v7-3._.js +0 -3
  241. package/.next/server/chunks/ssr/_13_v7-3._.js.map +0 -1
  242. package/.next/server/chunks/ssr/app_0.0wpa~._.js +0 -3
  243. package/.next/server/chunks/ssr/app_0.0wpa~._.js.map +0 -1
  244. package/.next/server/chunks/ssr/app_0ap_oiq._.js +0 -3
  245. package/.next/server/chunks/ssr/app_0ap_oiq._.js.map +0 -1
  246. package/.next/server/chunks/ssr/app_0dk5wao._.js +0 -3
  247. package/.next/server/chunks/ssr/app_0dk5wao._.js.map +0 -1
  248. package/.next/server/chunks/ssr/app_0et5yua._.js +0 -3
  249. package/.next/server/chunks/ssr/app_0et5yua._.js.map +0 -1
  250. package/.next/server/chunks/ssr/app_10b5blc._.js +0 -9
  251. package/.next/server/chunks/ssr/app_10b5blc._.js.map +0 -1
  252. package/.next/server/chunks/ssr/app_11vl967._.js +0 -3
  253. package/.next/server/chunks/ssr/app_11vl967._.js.map +0 -1
  254. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +0 -3
  255. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +0 -1
  256. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +0 -3
  257. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js.map +0 -1
  258. package/.next/static/chunks/02afyxgpty3uf.js +0 -1
  259. package/.next/static/chunks/02flrewxlf_m_.js +0 -1
  260. package/.next/static/chunks/051gslfjka1kj.js +0 -1
  261. package/.next/static/chunks/07oobuohrpigy.js +0 -1
  262. package/.next/static/chunks/09al3qm76q7nd.js +0 -1
  263. package/.next/static/chunks/0e7c40p~wq665.js +0 -1
  264. package/.next/static/chunks/0g7m7zk.v7g6h.js +0 -1
  265. package/.next/static/chunks/0h.ajsk_uxigl.js +0 -1
  266. package/.next/static/chunks/0msa~bub38ytf.css +0 -2
  267. package/.next/static/chunks/0ogeals5ufhho.js +0 -1
  268. package/.next/static/chunks/0sgvs~8hw4df0.js +0 -1
  269. package/.next/static/chunks/10ir.g.n~hre0.js +0 -7
  270. package/.next/static/chunks/10njj7kn9ylkf.js +0 -1
  271. package/.next/static/chunks/12dcb86elsl-e.js +0 -7
  272. package/.next/static/chunks/13.dst7liziwo.js +0 -1
  273. package/.next/static/chunks/132e__998_q9r.js +0 -1
  274. package/public/file.svg +0 -1
  275. package/public/globe.svg +0 -1
  276. package/public/next.svg +0 -1
  277. package/public/vercel.svg +0 -1
  278. package/public/window.svg +0 -1
  279. /package/.next/static/{LQ5MjOWd5QM3a72laNr_D → 5EPRA3x3-w6LIGTySDUkk}/_buildManifest.js +0 -0
  280. /package/.next/static/{LQ5MjOWd5QM3a72laNr_D → 5EPRA3x3-w6LIGTySDUkk}/_clientMiddlewareManifest.js +0 -0
  281. /package/.next/static/{LQ5MjOWd5QM3a72laNr_D → 5EPRA3x3-w6LIGTySDUkk}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,28490,e=>{"use strict";e.s(["SESSION_STATUS_CHIP_CLASS",0,{working:"bg-green-500/10 text-green-300 border-green-500/20",idle:"bg-blue-500/10 text-blue-300 border-blue-500/20",blocked:"bg-yellow-500/10 text-yellow-300 border-yellow-500/20",error:"bg-red-500/10 text-red-300 border-red-500/20",offline:"bg-gray-500/10 text-gray-500 border-gray-500/20"},"SESSION_STATUS_TEXT_CLASS",0,{working:"text-green-400",idle:"text-blue-400",blocked:"text-yellow-400",error:"text-red-400",offline:"text-gray-500"},"STATUS_BAR_CLASS",0,{created:"bg-gray-500",delivered:"bg-blue-500",acked:"bg-cyan-500",running:"bg-green-500",replied:"bg-purple-500",closed:"bg-gray-600",failed:"bg-red-500",cancelled:"bg-yellow-500",expired:"bg-orange-500"},"STATUS_CHIP_CLASS",0,{created:"bg-gray-500/10 text-gray-400 border-gray-500/20",delivered:"bg-blue-500/10 text-blue-300 border-blue-500/20",acked:"bg-cyan-500/10 text-cyan-300 border-cyan-500/20",running:"bg-green-500/10 text-green-300 border-green-500/20",replied:"bg-purple-500/10 text-purple-300 border-purple-500/20",closed:"bg-gray-500/10 text-gray-500 border-gray-500/20",failed:"bg-red-500/10 text-red-300 border-red-500/20",cancelled:"bg-yellow-500/10 text-yellow-300 border-yellow-500/20",expired:"bg-orange-500/10 text-orange-300 border-orange-500/20"},"STATUS_DOT_HEX",0,{created:"#9ca3af",delivered:"#60a5fa",acked:"#22d3ee",running:"#4ade80",replied:"#a78bfa",closed:"#6b7280",failed:"#f87171",cancelled:"#facc15",expired:"#fb923c"},"TASK_STATUSES",0,["created","delivered","acked","running","replied","closed","failed","cancelled","expired"]])},18150,e=>{"use strict";e.s(["formatUptime",0,function(e){let t=Math.floor(e/3600),r=Math.floor(e%3600/60);return t>0?`${t}h ${r}m`:`${r}m`},"previewContent",0,function(e){return e&&e.replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\s+/g," ").trim()||"--"},"timeAgo",0,function(e){if(!e)return"--";let t=Math.floor((Date.now()-new Date(e.replace(" ","T")+"Z").getTime())/1e3);return t<60?`${t}s ago`:t<3600?`${Math.floor(t/60)}m ago`:t<86400?`${Math.floor(t/3600)}h ago`:`${Math.floor(t/86400)}d ago`}])},69874,e=>{"use strict";var t=e.i(18050);let r=[180,200,220,270,300,330,30,90];e.s(["AliasAvatar",0,function({alias:e,size:s=28,className:n=""}){let i=function(e){let t=0;for(let r=0;r<e.length;r++)t=31*t+e.charCodeAt(r)>>>0;let s=r[t%r.length];return{bg:`hsl(${s} 55% 22%)`,ring:`hsl(${s} 60% 45%)`,text:`hsl(${s} 80% 78%)`}}(e),a=Math.max(9,Math.round(.42*s));return(0,t.jsx)("span",{className:`anet-alias-avatar inline-flex items-center justify-center rounded-full border shrink-0 font-semibold ${n}`,style:{width:s,height:s,fontSize:a,backgroundColor:i.bg,borderColor:i.ring,color:i.text},title:e,"aria-hidden":!0,children:e?(e.trim().match(/[\p{L}\p{N}]/u)?.[0]||e.trim()[0]||"·").toUpperCase():"·"})}])},95356,e=>{"use strict";var t=e.i(18050),r=e.i(71645),s=e.i(22016);let n={nodes:{title:"No agents in this network",sub:"Agent sessions will appear here once they connect to the CommHub."},tasks:{title:"No tasks yet",sub:"Tasks will appear here when agents send them via CommHub."},messages:{title:"No messages",sub:"Messages between agents will appear here."},logs:{title:"No audit logs",sub:"Events will appear here when users register, login, or perform actions."},tokens:{title:"No API tokens",sub:"Create one to authenticate CLI tools and external integrations."},networks:{title:"No networks found",sub:"Create one or sign in with V3 auth to see your networks."},generic:{title:"Nothing here yet",sub:"Data will appear here once available."}};function i({variant:e,size:r}){let s={width:r,height:r},n={fill:"none",stroke:"currentColor",strokeWidth:1.25,strokeLinecap:"round",strokeLinejoin:"round"};switch(e){case"nodes":return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("circle",{cx:"32",cy:"14",r:"4"}),(0,t.jsx)("circle",{cx:"14",cy:"44",r:"4"}),(0,t.jsx)("circle",{cx:"50",cy:"44",r:"4"}),(0,t.jsx)("line",{x1:"32",y1:"18",x2:"14",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,t.jsx)("line",{x1:"32",y1:"18",x2:"50",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,t.jsx)("line",{x1:"18",y1:"44",x2:"46",y2:"44",strokeDasharray:"3 3",opacity:"0.6"})]})});case"tasks":return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("rect",{x:"14",y:"14",width:"36",height:"6",rx:"1.5"}),(0,t.jsx)("rect",{x:"14",y:"26",width:"36",height:"6",rx:"1.5",opacity:"0.6"}),(0,t.jsx)("rect",{x:"14",y:"38",width:"36",height:"6",rx:"1.5",opacity:"0.35"})]})});case"messages":return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("path",{d:"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z"}),(0,t.jsx)("line",{x1:"22",y1:"28",x2:"42",y2:"28",opacity:"0.5"}),(0,t.jsx)("line",{x1:"22",y1:"34",x2:"36",y2:"34",opacity:"0.5"})]})});case"logs":return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("path",{d:"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z"}),(0,t.jsx)("path",{d:"M40 12 v8 h8",opacity:"0.6"}),(0,t.jsx)("line",{x1:"24",y1:"32",x2:"40",y2:"32",opacity:"0.55"}),(0,t.jsx)("line",{x1:"24",y1:"38",x2:"40",y2:"38",opacity:"0.4"}),(0,t.jsx)("line",{x1:"24",y1:"44",x2:"34",y2:"44",opacity:"0.25"})]})});case"tokens":return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("circle",{cx:"22",cy:"32",r:"8"}),(0,t.jsx)("line",{x1:"30",y1:"32",x2:"54",y2:"32"}),(0,t.jsx)("line",{x1:"44",y1:"32",x2:"44",y2:"38"}),(0,t.jsx)("line",{x1:"50",y1:"32",x2:"50",y2:"40"})]})});case"networks":return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("circle",{cx:"32",cy:"32",r:"18"}),(0,t.jsx)("ellipse",{cx:"32",cy:"32",rx:"18",ry:"9",opacity:"0.55"}),(0,t.jsx)("line",{x1:"14",y1:"32",x2:"50",y2:"32",opacity:"0.55"}),(0,t.jsx)("line",{x1:"32",y1:"14",x2:"32",y2:"50",opacity:"0.55"})]})});default:return(0,t.jsx)("svg",{viewBox:"0 0 64 64",...s,children:(0,t.jsxs)("g",{...n,children:[(0,t.jsx)("circle",{cx:"32",cy:"32",r:"14",strokeDasharray:"3 3",opacity:"0.6"}),(0,t.jsx)("circle",{cx:"32",cy:"32",r:"3"})]})})}}function a({variant:e="generic",title:r,sub:l,cta:o,compact:c=!1}){let d=n[e],x=r??d.title,h=l??d.sub;return(0,t.jsxs)("div",{className:`text-center ${c?"py-8":"py-16"} px-4`,role:"status",children:[(0,t.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,t.jsx)(i,{variant:e,size:c?40:56})}),(0,t.jsx)("h3",{className:`font-medium text-gray-300 ${c?"text-sm":"text-base"}`,children:x}),h&&(0,t.jsx)("p",{className:`text-gray-500 ${c?"text-xs mt-1.5":"text-sm mt-2"} max-w-md mx-auto leading-relaxed`,children:h}),o&&(0,t.jsx)("div",{className:"mt-4",children:o.href?(0,t.jsxs)(s.default,{href:o.href,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[o.label,(0,t.jsx)("span",{"aria-hidden":!0,children:"→"})]}):(0,t.jsxs)("button",{onClick:o.onClick,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[o.label,(0,t.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}function l({cmd:e}){let[s,n]=(0,r.useState)(!1),i=async()=>{try{await navigator.clipboard.writeText(e),n(!0),setTimeout(()=>n(!1),1800)}catch{}};return(0,t.jsxs)("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",children:[(0,t.jsx)("code",{className:"text-cyan-300 font-mono select-all",children:e}),(0,t.jsx)("button",{type:"button",onClick:i,"aria-label":s?"Copied":"Copy command",className:"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1a1a2a] transition-colors",children:s?(0,t.jsxs)("span",{className:"flex items-center gap-1 text-green-400",children:[(0,t.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,t.jsx)("path",{d:"M20 6 9 17l-5-5"})}),"Copied"]}):(0,t.jsxs)("span",{className:"flex items-center gap-1",children:[(0,t.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,t.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Copy"]})})]})}e.s(["EmptyState",0,a,"NodesEmptyState",0,function({hint:e}){return e?.global_count?(0,t.jsx)(a,{variant:"nodes",title:"No agents in this network",sub:`Server has ${e.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}):(0,t.jsxs)("div",{className:"text-center py-16 px-4",role:"status",children:[(0,t.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,t.jsx)("svg",{viewBox:"0 0 64 64",width:56,height:56,children:(0,t.jsxs)("g",{stroke:"currentColor",strokeWidth:"1.5",fill:"none",children:[(0,t.jsx)("rect",{x:"10",y:"20",width:"44",height:"28",rx:"2"}),(0,t.jsx)("rect",{x:"20",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,t.jsx)("rect",{x:"32",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,t.jsx)("rect",{x:"44",y:"32",width:"4",height:"8",opacity:"0.5"}),(0,t.jsx)("line",{x1:"10",y1:"26",x2:"54",y2:"26",opacity:"0.4"}),(0,t.jsx)("circle",{cx:"14",cy:"23",r:"0.8",fill:"currentColor"})]})})}),(0,t.jsx)("h3",{className:"font-medium text-gray-300 text-base",children:"Spin up your first agent"}),(0,t.jsx)("p",{className:"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed",children:"Run this in a fresh terminal to register an agent with this CommHub:"}),(0,t.jsx)("div",{className:"mt-4 inline-block",children:(0,t.jsx)(l,{cmd:"npx --yes @sleep2agi/agent-network init"})}),(0,t.jsx)("div",{className:"mt-3",children:(0,t.jsxs)("a",{href:"https://anet.sh",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300",children:["Full quickstart guide",(0,t.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}])},65822,e=>{"use strict";var t=e.i(83599),r=e.i(58963);let s=async e=>{let t=await fetch(e);if(401===t.status)throw window.location.assign("/login"),Error("unauthorized");return t.json()},n={refreshInterval:5e3,dedupingInterval:3e3};function i(e,t){if(!t)return e;let r=e.includes("?")?"&":"?";return`${e}${r}network_id=${encodeURIComponent(t)}`}e.s(["useAnetConfig",0,function(){let{data:e}=(0,t.default)("/api/anet/config",s,{refreshInterval:3e4});return{config:e||null}},"useHealth",0,function(){let{data:e,error:r}=(0,t.default)("/api/hub/health",s,n);return{health:e||null,error:r}},"useLicense",0,function(){let{data:e,error:r}=(0,t.default)("/api/hub/license",s,{refreshInterval:6e4});return{license:e?.ok?e:null,error:r}},"useMessages",0,function(e=100){let{networkId:a}=(0,r.useNetworkId)(),{data:l,error:o,isLoading:c}=(0,t.default)(i(`/api/hub/messages?limit=${e}`,a),s,n);return{messages:l?.messages||[],error:o,isLoading:c}},"useSessions",0,function(){let{networkId:e}=(0,r.useNetworkId)(),{data:a,error:l,isLoading:o}=(0,t.default)(i("/api/hub/status",e),s,n);return{sessions:a?.sessions||[],hint:a?._hint,error:l,isLoading:o}},"useStats",0,function(){let{networkId:e}=(0,r.useNetworkId)(),{data:a,error:l}=(0,t.default)(i("/api/hub/stats",e),s,n);return{stats:a?.ok?a:null,error:l}},"useTasks",0,function(e){let{networkId:a}=(0,r.useNetworkId)(),l=new URLSearchParams({limit:"100",...e}).toString(),{data:o,error:c,isLoading:d}=(0,t.default)(i(`/api/hub/tasks?${l}`,a),s,n);return{tasks:o?.tasks||[],count:o?.count??0,source:o?.source,error:c,isLoading:d}}])}]);
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":311,"timestamp":189031853852,"id":4,"parentId":1,"tags":{},"startTime":1778560517679,"traceId":"1ed6ff4b0dfff32f"},{"name":"load-custom-routes","duration":451,"timestamp":189031854309,"id":5,"parentId":1,"tags":{},"startTime":1778560517679,"traceId":"1ed6ff4b0dfff32f"},{"name":"create-dist-dir","duration":439,"timestamp":189031854803,"id":6,"parentId":1,"tags":{},"startTime":1778560517680,"traceId":"1ed6ff4b0dfff32f"},{"name":"clean","duration":522,"timestamp":189031856042,"id":7,"parentId":1,"tags":{},"startTime":1778560517681,"traceId":"1ed6ff4b0dfff32f"},{"name":"discover-routes","duration":9391,"timestamp":189031944442,"id":8,"parentId":1,"tags":{},"startTime":1778560517769,"traceId":"1ed6ff4b0dfff32f"},{"name":"create-root-mapping","duration":135,"timestamp":189031953899,"id":9,"parentId":1,"tags":{},"startTime":1778560517779,"traceId":"1ed6ff4b0dfff32f"},{"name":"generate-route-types","duration":32889,"timestamp":189031956373,"id":10,"parentId":1,"tags":{},"startTime":1778560517781,"traceId":"1ed6ff4b0dfff32f"},{"name":"public-dir-conflict-check","duration":116,"timestamp":189031989447,"id":11,"parentId":1,"tags":{},"startTime":1778560517814,"traceId":"1ed6ff4b0dfff32f"},{"name":"generate-routes-manifest","duration":4307,"timestamp":189031989728,"id":12,"parentId":1,"tags":{},"startTime":1778560517814,"traceId":"1ed6ff4b0dfff32f"},{"name":"run-turbopack","duration":8048244,"timestamp":189031999500,"id":14,"parentId":1,"tags":{},"startTime":1778560517824,"traceId":"1ed6ff4b0dfff32f"},{"name":"turbopack-build-events","duration":77,"timestamp":189032285408,"id":15,"parentId":1,"tags":{},"startTime":1778560518110,"traceId":"1ed6ff4b0dfff32f"},{"name":"run-typescript","duration":7741449,"timestamp":189040069263,"id":16,"parentId":1,"tags":{},"startTime":1778560525894,"traceId":"1ed6ff4b0dfff32f"},{"name":"generate-required-server-files","duration":1971,"timestamp":189047811451,"id":18,"parentId":1,"tags":{},"startTime":1778560533636,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-static-error-page","duration":15507,"timestamp":189047889066,"id":20,"parentId":19,"tags":{},"startTime":1778560533714,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":346785,"timestamp":189047906886,"id":62,"parentId":22,"tags":{},"startTime":1778560533732,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":362367,"timestamp":189047891421,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778560533716,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":393318,"timestamp":189047906578,"id":61,"parentId":21,"tags":{},"startTime":1778560533731,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":409818,"timestamp":189047890156,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778560533715,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":434822,"timestamp":189047909527,"id":64,"parentId":26,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":450182,"timestamp":189047894228,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778560533719,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":437204,"timestamp":189047909160,"id":63,"parentId":25,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":452368,"timestamp":189047894050,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778560533719,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":441613,"timestamp":189047909658,"id":67,"parentId":29,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":456776,"timestamp":189047894551,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778560533719,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":448729,"timestamp":189047909621,"id":66,"parentId":28,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":463965,"timestamp":189047894441,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778560533719,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":453016,"timestamp":189047909727,"id":69,"parentId":32,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":467487,"timestamp":189047895315,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778560533720,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":456908,"timestamp":189047909581,"id":65,"parentId":27,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":472212,"timestamp":189047894337,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778560533719,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":456797,"timestamp":189047909907,"id":70,"parentId":33,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":471313,"timestamp":189047895428,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778560533720,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":461345,"timestamp":189047909978,"id":72,"parentId":35,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":475758,"timestamp":189047895623,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778560533720,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":480523,"timestamp":189047909692,"id":68,"parentId":30,"tags":{},"startTime":1778560533734,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":495365,"timestamp":189047894915,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778560533720,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":480548,"timestamp":189047909961,"id":71,"parentId":34,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":495015,"timestamp":189047895521,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778560533720,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":481509,"timestamp":189047910066,"id":73,"parentId":36,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":494589,"timestamp":189047897035,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778560533722,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":484391,"timestamp":189047910094,"id":75,"parentId":38,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":497086,"timestamp":189047897446,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778560533722,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":486745,"timestamp":189047910100,"id":76,"parentId":39,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":499300,"timestamp":189047897588,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778560533722,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":488116,"timestamp":189047910086,"id":74,"parentId":37,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":500963,"timestamp":189047897283,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778560533722,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":488281,"timestamp":189047910111,"id":78,"parentId":41,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":500682,"timestamp":189047897750,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778560533722,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":488449,"timestamp":189047910106,"id":77,"parentId":40,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":500901,"timestamp":189047897675,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778560533722,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":492084,"timestamp":189047910123,"id":80,"parentId":43,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":504352,"timestamp":189047897896,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778560533723,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":492275,"timestamp":189047910117,"id":79,"parentId":42,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":504599,"timestamp":189047897827,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778560533723,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":492379,"timestamp":189047910183,"id":81,"parentId":44,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":504614,"timestamp":189047897973,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778560533723,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":495935,"timestamp":189047910197,"id":83,"parentId":46,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":507979,"timestamp":189047898209,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778560533723,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":496109,"timestamp":189047910192,"id":82,"parentId":45,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":508237,"timestamp":189047898087,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778560533723,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":496596,"timestamp":189047910204,"id":84,"parentId":47,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":508586,"timestamp":189047898286,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778560533723,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":499231,"timestamp":189047910210,"id":85,"parentId":48,"tags":{},"startTime":1778560533735,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":509266,"timestamp":189047900222,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778560533725,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":494840,"timestamp":189047915557,"id":86,"parentId":24,"tags":{},"startTime":1778560533741,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":518527,"timestamp":189047891911,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778560533717,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":493320,"timestamp":189047917216,"id":87,"parentId":31,"tags":{},"startTime":1778560533742,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":515491,"timestamp":189047895066,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778560533720,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":486289,"timestamp":189047932853,"id":90,"parentId":50,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":518435,"timestamp":189047900788,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778560533725,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":490324,"timestamp":189047932862,"id":91,"parentId":51,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":522338,"timestamp":189047900908,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778560533726,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":496310,"timestamp":189047932870,"id":92,"parentId":52,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":528170,"timestamp":189047901070,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778560533726,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":502150,"timestamp":189047932875,"id":93,"parentId":53,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":533867,"timestamp":189047901225,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778560533726,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":509302,"timestamp":189047932884,"id":94,"parentId":55,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":540485,"timestamp":189047901761,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778560533726,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":520255,"timestamp":189047932846,"id":89,"parentId":49,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":552598,"timestamp":189047900601,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778560533725,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":522947,"timestamp":189047932892,"id":95,"parentId":56,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":553998,"timestamp":189047901896,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778560533727,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":525202,"timestamp":189047932897,"id":96,"parentId":58,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":555811,"timestamp":189047902349,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778560533727,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":529000,"timestamp":189047932808,"id":88,"parentId":23,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":570129,"timestamp":189047891726,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778560533716,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":530633,"timestamp":189047932915,"id":98,"parentId":60,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":559365,"timestamp":189047904324,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778560533729,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":534582,"timestamp":189047932924,"id":99,"parentId":57,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":565511,"timestamp":189047902035,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778560533727,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":536824,"timestamp":189047932932,"id":100,"parentId":54,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":568431,"timestamp":189047901374,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778560533726,"traceId":"1ed6ff4b0dfff32f"},{"name":"is-page-static","duration":539515,"timestamp":189047932905,"id":97,"parentId":59,"tags":{},"startTime":1778560533758,"traceId":"1ed6ff4b0dfff32f"},{"name":"check-page","duration":570018,"timestamp":189047902461,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778560533727,"traceId":"1ed6ff4b0dfff32f"},{"name":"static-check","duration":584325,"timestamp":189047888230,"id":19,"parentId":1,"tags":{},"startTime":1778560533713,"traceId":"1ed6ff4b0dfff32f"},{"name":"write-routes-manifest","duration":438,"timestamp":189048480590,"id":102,"parentId":1,"tags":{},"startTime":1778560534305,"traceId":"1ed6ff4b0dfff32f"},{"name":"load-dotenv","duration":58,"timestamp":189048493876,"id":105,"parentId":104,"tags":{},"startTime":1778560534319,"traceId":"1ed6ff4b0dfff32f"},{"name":"run-export-path-map","duration":713,"timestamp":189048497185,"id":106,"parentId":104,"tags":{},"startTime":1778560534322,"traceId":"1ed6ff4b0dfff32f"},{"name":"next-export","duration":592236,"timestamp":189048492402,"id":104,"parentId":1,"tags":{},"startTime":1778560534317,"traceId":"1ed6ff4b0dfff32f"},{"name":"move-exported-app-not-found-","duration":673,"timestamp":189049087965,"id":107,"parentId":103,"tags":{},"startTime":1778560534913,"traceId":"1ed6ff4b0dfff32f"},{"name":"move-exported-app-global-error-","duration":444,"timestamp":189049088737,"id":108,"parentId":103,"tags":{},"startTime":1778560534913,"traceId":"1ed6ff4b0dfff32f"}]
2
- [{"name":"static-generation","duration":607818,"timestamp":189048485726,"id":103,"parentId":1,"tags":{},"startTime":1778560534310,"traceId":"1ed6ff4b0dfff32f"},{"name":"write-routes-manifest","duration":456,"timestamp":189049093734,"id":109,"parentId":1,"tags":{},"startTime":1778560534918,"traceId":"1ed6ff4b0dfff32f"},{"name":"print-tree-view","duration":4417,"timestamp":189049104873,"id":110,"parentId":1,"tags":{},"startTime":1778560534930,"traceId":"1ed6ff4b0dfff32f"},{"name":"write-route-bundle-stats","duration":14203,"timestamp":189049109338,"id":111,"parentId":1,"tags":{},"startTime":1778560534934,"traceId":"1ed6ff4b0dfff32f"},{"name":"telemetry-flush","duration":21855,"timestamp":189049123578,"id":112,"parentId":1,"tags":{},"startTime":1778560534948,"traceId":"1ed6ff4b0dfff32f"},{"name":"next-build","duration":17340827,"timestamp":189031804645,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778560517629,"traceId":"1ed6ff4b0dfff32f"}]
1
+ [{"name":"generate-buildid","duration":291,"timestamp":320425706112,"id":4,"parentId":1,"tags":{},"startTime":1778691911531,"traceId":"cbb398eba7734b34"},{"name":"load-custom-routes","duration":474,"timestamp":320425706552,"id":5,"parentId":1,"tags":{},"startTime":1778691911531,"traceId":"cbb398eba7734b34"},{"name":"create-dist-dir","duration":305,"timestamp":320425707072,"id":6,"parentId":1,"tags":{},"startTime":1778691911532,"traceId":"cbb398eba7734b34"},{"name":"clean","duration":472,"timestamp":320425708033,"id":7,"parentId":1,"tags":{},"startTime":1778691911533,"traceId":"cbb398eba7734b34"},{"name":"discover-routes","duration":10799,"timestamp":320425795163,"id":8,"parentId":1,"tags":{},"startTime":1778691911620,"traceId":"cbb398eba7734b34"},{"name":"create-root-mapping","duration":128,"timestamp":320425806060,"id":9,"parentId":1,"tags":{},"startTime":1778691911631,"traceId":"cbb398eba7734b34"},{"name":"generate-route-types","duration":32311,"timestamp":320425808445,"id":10,"parentId":1,"tags":{},"startTime":1778691911633,"traceId":"cbb398eba7734b34"},{"name":"public-dir-conflict-check","duration":165,"timestamp":320425840939,"id":11,"parentId":1,"tags":{},"startTime":1778691911666,"traceId":"cbb398eba7734b34"},{"name":"generate-routes-manifest","duration":4147,"timestamp":320425841238,"id":12,"parentId":1,"tags":{},"startTime":1778691911666,"traceId":"cbb398eba7734b34"},{"name":"run-turbopack","duration":9827195,"timestamp":320425851224,"id":14,"parentId":1,"tags":{},"startTime":1778691911676,"traceId":"cbb398eba7734b34"},{"name":"turbopack-build-events","duration":139,"timestamp":320426162912,"id":15,"parentId":1,"tags":{},"startTime":1778691911988,"traceId":"cbb398eba7734b34"},{"name":"run-typescript","duration":9537093,"timestamp":320435692226,"id":16,"parentId":1,"tags":{},"startTime":1778691921517,"traceId":"cbb398eba7734b34"},{"name":"generate-required-server-files","duration":7005,"timestamp":320445233632,"id":18,"parentId":1,"tags":{},"startTime":1778691931058,"traceId":"cbb398eba7734b34"},{"name":"check-static-error-page","duration":19288,"timestamp":320445381156,"id":20,"parentId":19,"tags":{},"startTime":1778691931206,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":481245,"timestamp":320445402714,"id":62,"parentId":22,"tags":{},"startTime":1778691931227,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":499841,"timestamp":320445384342,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778691931209,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":552585,"timestamp":320445402794,"id":63,"parentId":25,"tags":{},"startTime":1778691931227,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":567263,"timestamp":320445388195,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778691931213,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":593658,"timestamp":320445402980,"id":65,"parentId":27,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":607338,"timestamp":320445389370,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778691931214,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":598550,"timestamp":320445403032,"id":66,"parentId":28,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":612189,"timestamp":320445389463,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778691931214,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":599418,"timestamp":320445402385,"id":61,"parentId":21,"tags":{},"startTime":1778691931227,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":618833,"timestamp":320445383015,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778691931208,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":622166,"timestamp":320445403072,"id":67,"parentId":29,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":635775,"timestamp":320445389545,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778691931214,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":632655,"timestamp":320445402940,"id":64,"parentId":26,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":646435,"timestamp":320445389243,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778691931214,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":645909,"timestamp":320445403147,"id":69,"parentId":32,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":659060,"timestamp":320445390083,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":652864,"timestamp":320445403257,"id":70,"parentId":33,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":666011,"timestamp":320445390195,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":657956,"timestamp":320445403302,"id":71,"parentId":34,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":671047,"timestamp":320445390269,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":658161,"timestamp":320445403320,"id":72,"parentId":35,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":671158,"timestamp":320445390350,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":668226,"timestamp":320445403394,"id":74,"parentId":37,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":680891,"timestamp":320445390799,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":673105,"timestamp":320445403375,"id":73,"parentId":36,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":685885,"timestamp":320445390681,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":673414,"timestamp":320445403402,"id":75,"parentId":38,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":685978,"timestamp":320445390885,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":679461,"timestamp":320445403114,"id":68,"parentId":30,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":692891,"timestamp":320445389743,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778691931214,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":679357,"timestamp":320445403413,"id":77,"parentId":40,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":691738,"timestamp":320445391063,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":681312,"timestamp":320445403408,"id":76,"parentId":39,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":693860,"timestamp":320445390944,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":686699,"timestamp":320445403419,"id":78,"parentId":41,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":699006,"timestamp":320445391168,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":686887,"timestamp":320445403430,"id":80,"parentId":43,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":699045,"timestamp":320445391300,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":687383,"timestamp":320445403424,"id":79,"parentId":42,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":699621,"timestamp":320445391238,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":691749,"timestamp":320445403446,"id":83,"parentId":46,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":703742,"timestamp":320445391509,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":691956,"timestamp":320445403435,"id":81,"parentId":44,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":704056,"timestamp":320445391365,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":695848,"timestamp":320445403441,"id":82,"parentId":45,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":707906,"timestamp":320445391425,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":696949,"timestamp":320445403451,"id":84,"parentId":47,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":708877,"timestamp":320445391568,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":696625,"timestamp":320445406866,"id":86,"parentId":24,"tags":{},"startTime":1778691931232,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":718760,"timestamp":320445384780,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778691931209,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":697188,"timestamp":320445408021,"id":87,"parentId":31,"tags":{},"startTime":1778691931233,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":715442,"timestamp":320445389828,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778691931215,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":703365,"timestamp":320445403455,"id":85,"parentId":48,"tags":{},"startTime":1778691931228,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":715261,"timestamp":320445391629,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778691931216,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":682857,"timestamp":320445443390,"id":90,"parentId":50,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":734225,"timestamp":320445392102,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778691931217,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":689468,"timestamp":320445443406,"id":91,"parentId":51,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":740678,"timestamp":320445392250,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778691931217,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":697656,"timestamp":320445443415,"id":92,"parentId":52,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":748730,"timestamp":320445392423,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778691931217,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":704090,"timestamp":320445443428,"id":93,"parentId":53,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":754981,"timestamp":320445392602,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778691931217,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":708009,"timestamp":320445443323,"id":88,"parentId":23,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":766797,"timestamp":320445384585,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778691931209,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":713337,"timestamp":320445443454,"id":95,"parentId":56,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":762740,"timestamp":320445394130,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778691931219,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":713540,"timestamp":320445443444,"id":94,"parentId":55,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":763114,"timestamp":320445393903,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778691931219,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":718887,"timestamp":320445443467,"id":96,"parentId":58,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":762437,"timestamp":320445399965,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778691931225,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":724143,"timestamp":320445443492,"id":98,"parentId":60,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":767425,"timestamp":320445400258,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778691931225,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":724919,"timestamp":320445443480,"id":97,"parentId":59,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":768292,"timestamp":320445400154,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778691931225,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":728755,"timestamp":320445443374,"id":89,"parentId":49,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":780239,"timestamp":320445391946,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778691931217,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":729118,"timestamp":320445443509,"id":99,"parentId":54,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":779857,"timestamp":320445392805,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778691931217,"traceId":"cbb398eba7734b34"},{"name":"is-page-static","duration":733610,"timestamp":320445443524,"id":100,"parentId":57,"tags":{},"startTime":1778691931268,"traceId":"cbb398eba7734b34"},{"name":"check-page","duration":782908,"timestamp":320445394283,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778691931219,"traceId":"cbb398eba7734b34"},{"name":"static-check","duration":797190,"timestamp":320445380057,"id":19,"parentId":1,"tags":{},"startTime":1778691931205,"traceId":"cbb398eba7734b34"},{"name":"write-routes-manifest","duration":539,"timestamp":320446183740,"id":102,"parentId":1,"tags":{},"startTime":1778691932008,"traceId":"cbb398eba7734b34"},{"name":"load-dotenv","duration":64,"timestamp":320446196782,"id":105,"parentId":104,"tags":{},"startTime":1778691932021,"traceId":"cbb398eba7734b34"},{"name":"run-export-path-map","duration":740,"timestamp":320446199706,"id":106,"parentId":104,"tags":{},"startTime":1778691932024,"traceId":"cbb398eba7734b34"},{"name":"next-export","duration":554405,"timestamp":320446195395,"id":104,"parentId":1,"tags":{},"startTime":1778691932020,"traceId":"cbb398eba7734b34"},{"name":"move-exported-app-not-found-","duration":607,"timestamp":320446753392,"id":107,"parentId":103,"tags":{},"startTime":1778691932578,"traceId":"cbb398eba7734b34"},{"name":"move-exported-app-global-error-","duration":494,"timestamp":320446754130,"id":108,"parentId":103,"tags":{},"startTime":1778691932579,"traceId":"cbb398eba7734b34"}]
2
+ [{"name":"static-generation","duration":569852,"timestamp":320446189322,"id":103,"parentId":1,"tags":{},"startTime":1778691932014,"traceId":"cbb398eba7734b34"},{"name":"write-routes-manifest","duration":546,"timestamp":320446759371,"id":109,"parentId":1,"tags":{},"startTime":1778691932584,"traceId":"cbb398eba7734b34"},{"name":"print-tree-view","duration":3889,"timestamp":320446774476,"id":110,"parentId":1,"tags":{},"startTime":1778691932599,"traceId":"cbb398eba7734b34"},{"name":"write-route-bundle-stats","duration":11862,"timestamp":320446778409,"id":111,"parentId":1,"tags":{},"startTime":1778691932603,"traceId":"cbb398eba7734b34"},{"name":"telemetry-flush","duration":28224,"timestamp":320446790307,"id":112,"parentId":1,"tags":{},"startTime":1778691932615,"traceId":"cbb398eba7734b34"},{"name":"next-build","duration":21158883,"timestamp":320425659688,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778691911484,"traceId":"cbb398eba7734b34"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":8048244,"timestamp":189031999500,"id":14,"parentId":1,"tags":{},"startTime":1778560517824,"traceId":"1ed6ff4b0dfff32f"},{"name":"turbopack-build-events","duration":77,"timestamp":189032285408,"id":15,"parentId":1,"tags":{},"startTime":1778560518110,"traceId":"1ed6ff4b0dfff32f"},{"name":"run-typescript","duration":7741449,"timestamp":189040069263,"id":16,"parentId":1,"tags":{},"startTime":1778560525894,"traceId":"1ed6ff4b0dfff32f"},{"name":"static-check","duration":584325,"timestamp":189047888230,"id":19,"parentId":1,"tags":{},"startTime":1778560533713,"traceId":"1ed6ff4b0dfff32f"},{"name":"static-generation","duration":607818,"timestamp":189048485726,"id":103,"parentId":1,"tags":{},"startTime":1778560534310,"traceId":"1ed6ff4b0dfff32f"},{"name":"telemetry-flush","duration":21855,"timestamp":189049123578,"id":112,"parentId":1,"tags":{},"startTime":1778560534948,"traceId":"1ed6ff4b0dfff32f"},{"name":"next-build","duration":17340827,"timestamp":189031804645,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778560517629,"traceId":"1ed6ff4b0dfff32f"}]
1
+ [{"name":"run-turbopack","duration":9827195,"timestamp":320425851224,"id":14,"parentId":1,"tags":{},"startTime":1778691911676,"traceId":"cbb398eba7734b34"},{"name":"turbopack-build-events","duration":139,"timestamp":320426162912,"id":15,"parentId":1,"tags":{},"startTime":1778691911988,"traceId":"cbb398eba7734b34"},{"name":"run-typescript","duration":9537093,"timestamp":320435692226,"id":16,"parentId":1,"tags":{},"startTime":1778691921517,"traceId":"cbb398eba7734b34"},{"name":"static-check","duration":797190,"timestamp":320445380057,"id":19,"parentId":1,"tags":{},"startTime":1778691931205,"traceId":"cbb398eba7734b34"},{"name":"static-generation","duration":569852,"timestamp":320446189322,"id":103,"parentId":1,"tags":{},"startTime":1778691932014,"traceId":"cbb398eba7734b34"},{"name":"telemetry-flush","duration":28224,"timestamp":320446790307,"id":112,"parentId":1,"tags":{},"startTime":1778691932615,"traceId":"cbb398eba7734b34"},{"name":"next-build","duration":21158883,"timestamp":320425659688,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778691911484,"traceId":"cbb398eba7734b34"}]
@@ -3,6 +3,8 @@
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';
7
+ import { STATUS_CHIP_CLASS, SESSION_STATUS_CHIP_CLASS } from '../lib/status';
6
8
 
7
9
  export default function AdminPage() {
8
10
  const { sessions } = useSessions();
@@ -72,9 +74,32 @@ export default function AdminPage() {
72
74
 
73
75
  return (
74
76
  <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>
77
+ <h1 className="text-2xl font-bold text-white mb-3 lg:ml-0 ml-10">Admin</h1>
78
+
79
+ {/* Section anchor nav — same pattern as Settings r28. */}
80
+ <nav className="mb-8 flex flex-wrap gap-1 text-xs">
81
+ {[
82
+ { href: '#status', label: 'Status' },
83
+ { href: '#actions', label: 'Actions' },
84
+ { href: '#users', label: 'Users' },
85
+ ].map(a => (
86
+ <a key={a.href} href={a.href}
87
+ className="rounded-md px-2.5 py-1 text-gray-500 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors">
88
+ {a.label}
89
+ </a>
90
+ ))}
91
+ </nav>
92
+
93
+ <div className="max-w-6xl space-y-10">
94
+
95
+ {/* ── Group: Status ─────────────────────────────────────── */}
96
+ <div id="status" className="space-y-4 scroll-mt-6">
97
+ <div className="flex items-center gap-2 px-1">
98
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Status</div>
99
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
100
+ </div>
101
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
76
102
 
77
- <div className="grid grid-cols-1 lg:grid-cols-2 gap-6 max-w-6xl">
78
103
  {/* Server Overview */}
79
104
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
80
105
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Server Overview</h2>
@@ -89,7 +114,9 @@ export default function AdminPage() {
89
114
  </div>
90
115
  <div>
91
116
  <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>
117
+ <div className="text-xs text-gray-500">
118
+ SSE Streams <span className="text-gray-600">· server</span>
119
+ </div>
93
120
  </div>
94
121
  <div>
95
122
  <div className="text-3xl font-bold text-white tabular-nums">{stats?.tasks?.total ?? '--'}</div>
@@ -97,9 +124,13 @@ export default function AdminPage() {
97
124
  </div>
98
125
  </div>
99
126
  {stats?.tasks?.by_status && stats.tasks.by_status.length > 0 && (
127
+ /* Round 90: adopt the shared STATUS_CHIP_CLASS palette so
128
+ `acked`/`replied`/`failed` here color-match the same
129
+ chips on /tasks, Overview r69, and /tasks/[id] r68.
130
+ Unknown statuses fall back to the previous flat gray. */
100
131
  <div className="mt-4 flex flex-wrap gap-2">
101
132
  {stats.tasks.by_status.map((s: { status: string; count: number }) => (
102
- <span key={s.status} className="text-xs px-2 py-1 rounded bg-[#0a0a15] border border-[#1a1a2a] text-gray-400">
133
+ <span key={s.status} className={`text-xs px-2 py-1 rounded border ${STATUS_CHIP_CLASS[s.status] || 'bg-[#0a0a15] border-[#1a1a2a] text-gray-400'}`}>
103
134
  {s.status}: {s.count}
104
135
  </span>
105
136
  ))}
@@ -107,6 +138,53 @@ export default function AdminPage() {
107
138
  )}
108
139
  </section>
109
140
 
141
+ {/* Online Sessions — pulled into Status group (was below Send Task) */}
142
+ <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
143
+ <h2 className="text-sm font-semibold text-gray-300 mb-4">
144
+ Online Sessions <span className="text-gray-600">({onlineNodes.length})</span>
145
+ </h2>
146
+ <div className="space-y-2 max-h-80 overflow-y-auto">
147
+ {onlineNodes.length === 0 ? (
148
+ <div className="text-xs text-gray-600 text-center py-4">No online sessions</div>
149
+ ) : onlineNodes.map(s => (
150
+ <div key={s.alias} className="flex items-center gap-3 bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]">
151
+ <AliasAvatar alias={s.alias} size={20} />
152
+ <div className="min-w-0 flex-1">
153
+ <div className="text-sm text-white font-medium truncate">{s.alias}</div>
154
+ <div className="text-xs text-gray-500 truncate">{s.agent || '--'} · {s.task || 'idle'}</div>
155
+ </div>
156
+ <div className="flex items-center gap-2 shrink-0">
157
+ {/* Round 91: 5-state palette via shared
158
+ SESSION_STATUS_CHIP_CLASS (was working-vs-other, which
159
+ rendered blocked/error identical to idle). */}
160
+ <span className={`text-xs px-2 py-0.5 rounded border ${SESSION_STATUS_CHIP_CLASS[s.status] || SESSION_STATUS_CHIP_CLASS.idle}`}>{s.status}</span>
161
+ <span className="text-[10px] text-gray-600">{timeAgo(s.updated_at)}</span>
162
+ </div>
163
+ </div>
164
+ ))}
165
+ </div>
166
+ </section>
167
+
168
+ </div>
169
+ </div>
170
+
171
+ {/* ── Group: Actions ────────────────────────────────────── */}
172
+ <div id="actions" className="space-y-4 scroll-mt-6">
173
+ <div className="flex items-center gap-2 px-1">
174
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Actions</div>
175
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
176
+ </div>
177
+ {sessions.length === 0 ? (
178
+ /* Round 77: Broadcast and Send Task both require at least one
179
+ registered agent. Surfacing the empty cards above an empty
180
+ fleet is the same dead-control class as the Overview
181
+ Dispatch button (r70). Replace with a single inline hint. */
182
+ <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl px-5 py-4 text-sm text-gray-500">
183
+ Broadcast and Send Task become available after the first agent registers.
184
+ </div>
185
+ ) : (
186
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
187
+
110
188
  {/* Broadcast */}
111
189
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
112
190
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Broadcast</h2>
@@ -167,30 +245,18 @@ export default function AdminPage() {
167
245
  {taskResult && <div className={`mt-2 text-xs ${taskResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{taskResult}</div>}
168
246
  </section>
169
247
 
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
248
  </div>
193
- </section>
249
+ )}
250
+ </div>
251
+
252
+ {/* ── Group: Users ──────────────────────────────────────── */}
253
+ <div id="users" className="space-y-4 scroll-mt-6">
254
+ <div className="flex items-center gap-2 px-1">
255
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Users</div>
256
+ <div className="flex-1 h-px bg-[#2a2a4a]" />
257
+ </div>
258
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
259
+
194
260
  {/* User Management (V3 Auth) */}
195
261
  <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
196
262
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Register User (V3)</h2>
@@ -219,6 +285,10 @@ export default function AdminPage() {
219
285
  </div>
220
286
  {regResult && <div className={`mt-2 text-xs ${regResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{regResult}</div>}
221
287
  </section>
288
+
289
+ </div>
290
+ </div>
291
+
222
292
  </div>
223
293
  </div>
224
294
  );
@@ -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
  }