@sleep2agi/agent-network-dashboard 0.4.5-preview.21 → 0.4.5-preview.23

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 (143) 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 +8 -8
  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.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin/page.js.nft.json +1 -1
  22. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/admin.html +2 -2
  24. package/.next/server/app/admin.rsc +2 -2
  25. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +2 -2
  30. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  31. package/.next/server/app/index.html +2 -2
  32. package/.next/server/app/index.rsc +2 -2
  33. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  34. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  35. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  36. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  37. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  38. package/.next/server/app/login.html +1 -1
  39. package/.next/server/app/login.rsc +1 -1
  40. package/.next/server/app/login.segments/_full.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs.html +1 -1
  47. package/.next/server/app/logs.rsc +1 -1
  48. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  53. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  54. package/.next/server/app/messages.html +1 -1
  55. package/.next/server/app/messages.rsc +1 -1
  56. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  61. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  62. package/.next/server/app/node.html +1 -1
  63. package/.next/server/app/node.rsc +1 -1
  64. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  70. package/.next/server/app/nodes.html +1 -1
  71. package/.next/server/app/nodes.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  77. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  78. package/.next/server/app/page_client-reference-manifest.js +1 -1
  79. package/.next/server/app/server-logs.html +1 -1
  80. package/.next/server/app/server-logs.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  86. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  87. package/.next/server/app/settings/networks.html +1 -1
  88. package/.next/server/app/settings/networks.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  95. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  96. package/.next/server/app/settings/tokens.html +1 -1
  97. package/.next/server/app/settings/tokens.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  105. package/.next/server/app/settings.html +1 -1
  106. package/.next/server/app/settings.rsc +1 -1
  107. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  112. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/tasks.html +1 -1
  114. package/.next/server/app/tasks.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  121. package/.next/server/chunks/ssr/_0nne7mz._.js +1 -1
  122. package/.next/server/chunks/ssr/_0nne7mz._.js.map +1 -1
  123. package/.next/server/chunks/ssr/app_0tncr1_._.js +3 -0
  124. package/.next/server/chunks/ssr/app_0tncr1_._.js.map +1 -0
  125. package/.next/server/middleware-build-manifest.js +3 -3
  126. package/.next/server/pages/404.html +1 -1
  127. package/.next/server/pages/500.html +1 -1
  128. package/.next/server/server-reference-manifest.js +1 -1
  129. package/.next/server/server-reference-manifest.json +1 -1
  130. package/.next/static/chunks/06x7w8nwggx~~.js +1 -0
  131. package/.next/static/chunks/139oa00xt_-td.js +1 -0
  132. package/.next/trace +2 -2
  133. package/.next/trace-build +1 -1
  134. package/app/admin/page.tsx +77 -25
  135. package/app/components/TopoGraph.tsx +19 -14
  136. package/package.json +1 -1
  137. package/.next/server/chunks/ssr/app_0ap_oiq._.js +0 -3
  138. package/.next/server/chunks/ssr/app_0ap_oiq._.js.map +0 -1
  139. package/.next/static/chunks/07oobuohrpigy.js +0 -1
  140. package/.next/static/chunks/0pf4_9.-8s34p.js +0 -1
  141. /package/.next/static/{I8oYGCFqEglZXHP7xG8Cd → cmKfFz_TQxAhlloCMBbuN}/_buildManifest.js +0 -0
  142. /package/.next/static/{I8oYGCFqEglZXHP7xG8Cd → cmKfFz_TQxAhlloCMBbuN}/_clientMiddlewareManifest.js +0 -0
  143. /package/.next/static/{I8oYGCFqEglZXHP7xG8Cd → cmKfFz_TQxAhlloCMBbuN}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":323,"timestamp":195935059744,"id":4,"parentId":1,"tags":{},"startTime":1778567420884,"traceId":"2aad9b430af97808"},{"name":"load-custom-routes","duration":502,"timestamp":195935060235,"id":5,"parentId":1,"tags":{},"startTime":1778567420885,"traceId":"2aad9b430af97808"},{"name":"create-dist-dir","duration":4401,"timestamp":195935060785,"id":6,"parentId":1,"tags":{},"startTime":1778567420886,"traceId":"2aad9b430af97808"},{"name":"clean","duration":601,"timestamp":195935065924,"id":7,"parentId":1,"tags":{},"startTime":1778567420891,"traceId":"2aad9b430af97808"},{"name":"discover-routes","duration":23080,"timestamp":195935162578,"id":8,"parentId":1,"tags":{},"startTime":1778567420987,"traceId":"2aad9b430af97808"},{"name":"create-root-mapping","duration":123,"timestamp":195935185727,"id":9,"parentId":1,"tags":{},"startTime":1778567421010,"traceId":"2aad9b430af97808"},{"name":"generate-route-types","duration":18298,"timestamp":195935188321,"id":10,"parentId":1,"tags":{},"startTime":1778567421013,"traceId":"2aad9b430af97808"},{"name":"public-dir-conflict-check","duration":116,"timestamp":195935206808,"id":11,"parentId":1,"tags":{},"startTime":1778567421032,"traceId":"2aad9b430af97808"},{"name":"generate-routes-manifest","duration":4451,"timestamp":195935207108,"id":12,"parentId":1,"tags":{},"startTime":1778567421032,"traceId":"2aad9b430af97808"},{"name":"run-turbopack","duration":7564445,"timestamp":195935217125,"id":14,"parentId":1,"tags":{},"startTime":1778567421042,"traceId":"2aad9b430af97808"},{"name":"turbopack-build-events","duration":84,"timestamp":195935497156,"id":15,"parentId":1,"tags":{},"startTime":1778567421322,"traceId":"2aad9b430af97808"},{"name":"run-typescript","duration":7645717,"timestamp":195942799138,"id":16,"parentId":1,"tags":{},"startTime":1778567428624,"traceId":"2aad9b430af97808"},{"name":"generate-required-server-files","duration":2319,"timestamp":195950446263,"id":18,"parentId":1,"tags":{},"startTime":1778567436271,"traceId":"2aad9b430af97808"},{"name":"check-static-error-page","duration":10565,"timestamp":195950516277,"id":20,"parentId":19,"tags":{},"startTime":1778567436341,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":328663,"timestamp":195950530159,"id":62,"parentId":22,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":340538,"timestamp":195950518439,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778567436343,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":396684,"timestamp":195950530248,"id":63,"parentId":25,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":406169,"timestamp":195950520867,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":401264,"timestamp":195950530435,"id":65,"parentId":27,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":410559,"timestamp":195950521204,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":423955,"timestamp":195950530473,"id":66,"parentId":28,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":433273,"timestamp":195950521293,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":429128,"timestamp":195950529841,"id":61,"parentId":21,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":441737,"timestamp":195950517309,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778567436342,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":432205,"timestamp":195950530508,"id":67,"parentId":29,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":441399,"timestamp":195950521374,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":436230,"timestamp":195950530578,"id":69,"parentId":32,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":444964,"timestamp":195950521909,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778567436347,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":441172,"timestamp":195950530688,"id":70,"parentId":33,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":449875,"timestamp":195950522052,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778567436347,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":443362,"timestamp":195950530739,"id":71,"parentId":34,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":451958,"timestamp":195950522210,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778567436347,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":446928,"timestamp":195950530759,"id":72,"parentId":35,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":455387,"timestamp":195950522348,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778567436347,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":447913,"timestamp":195950530390,"id":64,"parentId":26,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":457255,"timestamp":195950521086,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":450658,"timestamp":195950530815,"id":73,"parentId":36,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":458733,"timestamp":195950522777,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778567436347,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":454247,"timestamp":195950530836,"id":74,"parentId":37,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":462173,"timestamp":195950522957,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":455314,"timestamp":195950530852,"id":76,"parentId":39,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":462995,"timestamp":195950523211,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":455462,"timestamp":195950530847,"id":75,"parentId":38,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":463206,"timestamp":195950523122,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":458639,"timestamp":195950530861,"id":77,"parentId":40,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":466252,"timestamp":195950523299,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":460976,"timestamp":195950530870,"id":78,"parentId":41,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":468498,"timestamp":195950523399,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":462289,"timestamp":195950530875,"id":79,"parentId":42,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":469727,"timestamp":195950523477,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":464452,"timestamp":195950530885,"id":80,"parentId":43,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":471826,"timestamp":195950523546,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":467071,"timestamp":195950530893,"id":81,"parentId":44,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":474404,"timestamp":195950523638,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":468018,"timestamp":195950530899,"id":82,"parentId":45,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":475239,"timestamp":195950523709,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":470317,"timestamp":195950530907,"id":83,"parentId":46,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":477455,"timestamp":195950523804,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778567436348,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":471823,"timestamp":195950530912,"id":84,"parentId":47,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":478892,"timestamp":195950523884,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778567436349,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":473397,"timestamp":195950530921,"id":85,"parentId":48,"tags":{},"startTime":1778567436356,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":480389,"timestamp":195950523961,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778567436349,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":456960,"timestamp":195950549476,"id":86,"parentId":24,"tags":{},"startTime":1778567436374,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":487643,"timestamp":195950518827,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778567436344,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":457780,"timestamp":195950550347,"id":87,"parentId":31,"tags":{},"startTime":1778567436375,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":486464,"timestamp":195950521698,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":477764,"timestamp":195950530544,"id":68,"parentId":30,"tags":{},"startTime":1778567436355,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":486761,"timestamp":195950521573,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778567436346,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":447127,"timestamp":195950571154,"id":90,"parentId":50,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":493860,"timestamp":195950524482,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778567436349,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":453594,"timestamp":195950571160,"id":91,"parentId":51,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":500187,"timestamp":195950524621,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778567436349,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":459382,"timestamp":195950571166,"id":92,"parentId":52,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":505804,"timestamp":195950524814,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778567436350,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":466114,"timestamp":195950571172,"id":93,"parentId":53,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":512355,"timestamp":195950524986,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778567436350,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":473936,"timestamp":195950571176,"id":94,"parentId":55,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":519510,"timestamp":195950525661,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778567436350,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":474377,"timestamp":195950571111,"id":88,"parentId":23,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":526883,"timestamp":195950518674,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778567436343,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":477241,"timestamp":195950571182,"id":95,"parentId":56,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":522607,"timestamp":195950525861,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778567436351,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":479730,"timestamp":195950571187,"id":96,"parentId":58,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":524591,"timestamp":195950526369,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778567436351,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":481415,"timestamp":195950571147,"id":89,"parentId":49,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":528290,"timestamp":195950524323,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778567436349,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":486172,"timestamp":195950571204,"id":98,"parentId":60,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":530808,"timestamp":195950526616,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778567436351,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":486959,"timestamp":195950571213,"id":99,"parentId":57,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":532173,"timestamp":195950526041,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778567436351,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":487102,"timestamp":195950571192,"id":97,"parentId":59,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":531838,"timestamp":195950526484,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778567436351,"traceId":"2aad9b430af97808"},{"name":"is-page-static","duration":491692,"timestamp":195950571219,"id":100,"parentId":54,"tags":{},"startTime":1778567436396,"traceId":"2aad9b430af97808"},{"name":"check-page","duration":537778,"timestamp":195950525185,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778567436350,"traceId":"2aad9b430af97808"},{"name":"static-check","duration":547647,"timestamp":195950515347,"id":19,"parentId":1,"tags":{},"startTime":1778567436340,"traceId":"2aad9b430af97808"},{"name":"write-routes-manifest","duration":556,"timestamp":195951070104,"id":102,"parentId":1,"tags":{},"startTime":1778567436895,"traceId":"2aad9b430af97808"},{"name":"load-dotenv","duration":45,"timestamp":195951083699,"id":105,"parentId":104,"tags":{},"startTime":1778567436908,"traceId":"2aad9b430af97808"},{"name":"run-export-path-map","duration":643,"timestamp":195951086647,"id":106,"parentId":104,"tags":{},"startTime":1778567436911,"traceId":"2aad9b430af97808"},{"name":"next-export","duration":542505,"timestamp":195951082479,"id":104,"parentId":1,"tags":{},"startTime":1778567436907,"traceId":"2aad9b430af97808"},{"name":"move-exported-app-not-found-","duration":602,"timestamp":195951628446,"id":107,"parentId":103,"tags":{},"startTime":1778567437453,"traceId":"2aad9b430af97808"},{"name":"move-exported-app-global-error-","duration":435,"timestamp":195951629146,"id":108,"parentId":103,"tags":{},"startTime":1778567437454,"traceId":"2aad9b430af97808"}]
2
- [{"name":"static-generation","duration":558061,"timestamp":195951075524,"id":103,"parentId":1,"tags":{},"startTime":1778567436900,"traceId":"2aad9b430af97808"},{"name":"write-routes-manifest","duration":463,"timestamp":195951633771,"id":109,"parentId":1,"tags":{},"startTime":1778567437458,"traceId":"2aad9b430af97808"},{"name":"print-tree-view","duration":3787,"timestamp":195951649125,"id":110,"parentId":1,"tags":{},"startTime":1778567437474,"traceId":"2aad9b430af97808"},{"name":"write-route-bundle-stats","duration":14856,"timestamp":195951652948,"id":111,"parentId":1,"tags":{},"startTime":1778567437478,"traceId":"2aad9b430af97808"},{"name":"telemetry-flush","duration":31143,"timestamp":195951667849,"id":112,"parentId":1,"tags":{},"startTime":1778567437493,"traceId":"2aad9b430af97808"},{"name":"next-build","duration":16706220,"timestamp":195934992827,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778567420818,"traceId":"2aad9b430af97808"}]
1
+ [{"name":"generate-buildid","duration":293,"timestamp":197177164650,"id":4,"parentId":1,"tags":{},"startTime":1778568662989,"traceId":"f74ef6f2c328d6cb"},{"name":"load-custom-routes","duration":491,"timestamp":197177165113,"id":5,"parentId":1,"tags":{},"startTime":1778568662990,"traceId":"f74ef6f2c328d6cb"},{"name":"create-dist-dir","duration":382,"timestamp":197177165651,"id":6,"parentId":1,"tags":{},"startTime":1778568662990,"traceId":"f74ef6f2c328d6cb"},{"name":"clean","duration":549,"timestamp":197177167137,"id":7,"parentId":1,"tags":{},"startTime":1778568662992,"traceId":"f74ef6f2c328d6cb"},{"name":"discover-routes","duration":9488,"timestamp":197177262415,"id":8,"parentId":1,"tags":{},"startTime":1778568663087,"traceId":"f74ef6f2c328d6cb"},{"name":"create-root-mapping","duration":141,"timestamp":197177271974,"id":9,"parentId":1,"tags":{},"startTime":1778568663097,"traceId":"f74ef6f2c328d6cb"},{"name":"generate-route-types","duration":38087,"timestamp":197177274467,"id":10,"parentId":1,"tags":{},"startTime":1778568663099,"traceId":"f74ef6f2c328d6cb"},{"name":"public-dir-conflict-check","duration":120,"timestamp":197177312753,"id":11,"parentId":1,"tags":{},"startTime":1778568663137,"traceId":"f74ef6f2c328d6cb"},{"name":"generate-routes-manifest","duration":4531,"timestamp":197177312998,"id":12,"parentId":1,"tags":{},"startTime":1778568663138,"traceId":"f74ef6f2c328d6cb"},{"name":"run-turbopack","duration":12671412,"timestamp":197177322536,"id":14,"parentId":1,"tags":{},"startTime":1778568663147,"traceId":"f74ef6f2c328d6cb"},{"name":"turbopack-build-events","duration":76,"timestamp":197177712664,"id":15,"parentId":1,"tags":{},"startTime":1778568663537,"traceId":"f74ef6f2c328d6cb"},{"name":"run-typescript","duration":10657513,"timestamp":197190001327,"id":16,"parentId":1,"tags":{},"startTime":1778568675826,"traceId":"f74ef6f2c328d6cb"},{"name":"generate-required-server-files","duration":2661,"timestamp":197200659918,"id":18,"parentId":1,"tags":{},"startTime":1778568686485,"traceId":"f74ef6f2c328d6cb"},{"name":"check-static-error-page","duration":24031,"timestamp":197200739881,"id":20,"parentId":19,"tags":{},"startTime":1778568686565,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":558653,"timestamp":197200767983,"id":62,"parentId":22,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":581433,"timestamp":197200745321,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778568686570,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":678010,"timestamp":197200768123,"id":63,"parentId":25,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":692334,"timestamp":197200753892,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778568686579,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":685786,"timestamp":197200768453,"id":65,"parentId":27,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":700069,"timestamp":197200754248,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778568686579,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":704101,"timestamp":197200768401,"id":64,"parentId":26,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":718439,"timestamp":197200754126,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778568686579,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":738537,"timestamp":197200768490,"id":66,"parentId":28,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":752735,"timestamp":197200754371,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778568686579,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":738749,"timestamp":197200768528,"id":67,"parentId":29,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":752784,"timestamp":197200754520,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778568686579,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":764884,"timestamp":197200768601,"id":69,"parentId":32,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":778408,"timestamp":197200755141,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778568686580,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":766152,"timestamp":197200768566,"id":68,"parentId":30,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":780002,"timestamp":197200754765,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778568686579,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":769771,"timestamp":197200767588,"id":61,"parentId":21,"tags":{},"startTime":1778568686592,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":796437,"timestamp":197200740977,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778568686566,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":793436,"timestamp":197200768703,"id":70,"parentId":33,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":806948,"timestamp":197200755254,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778568686580,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":802568,"timestamp":197200768750,"id":71,"parentId":34,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":816016,"timestamp":197200755368,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778568686580,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":806479,"timestamp":197200768820,"id":73,"parentId":36,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":819488,"timestamp":197200755868,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778568686581,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":812954,"timestamp":197200768847,"id":75,"parentId":38,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":825729,"timestamp":197200756137,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778568686581,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":816503,"timestamp":197200768839,"id":74,"parentId":37,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":829377,"timestamp":197200756029,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778568686581,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":828001,"timestamp":197200768854,"id":76,"parentId":39,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":840034,"timestamp":197200756887,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":829908,"timestamp":197200768860,"id":77,"parentId":40,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":841805,"timestamp":197200757021,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":832360,"timestamp":197200768865,"id":78,"parentId":41,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":844189,"timestamp":197200757112,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":836883,"timestamp":197200768876,"id":80,"parentId":43,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":848518,"timestamp":197200757292,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":841847,"timestamp":197200768881,"id":81,"parentId":44,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":853409,"timestamp":197200757380,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":842068,"timestamp":197200768871,"id":79,"parentId":42,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":853761,"timestamp":197200757200,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":848245,"timestamp":197200768886,"id":82,"parentId":45,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":859727,"timestamp":197200757461,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":855090,"timestamp":197200768891,"id":83,"parentId":46,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":866518,"timestamp":197200757564,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":868144,"timestamp":197200768896,"id":84,"parentId":47,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":879451,"timestamp":197200757651,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":870849,"timestamp":197200768901,"id":85,"parentId":48,"tags":{},"startTime":1778568686594,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":882070,"timestamp":197200757736,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778568686582,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":886037,"timestamp":197200776102,"id":87,"parentId":31,"tags":{},"startTime":1778568686601,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":907324,"timestamp":197200754877,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778568686580,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":890954,"timestamp":197200774148,"id":86,"parentId":24,"tags":{},"startTime":1778568686599,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":919436,"timestamp":197200745725,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778568686570,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":901208,"timestamp":197200768767,"id":72,"parentId":35,"tags":{},"startTime":1778568686593,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":915613,"timestamp":197200755476,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778568686580,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":899487,"timestamp":197200778826,"id":90,"parentId":50,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":920122,"timestamp":197200758249,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778568686583,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":906357,"timestamp":197200778832,"id":91,"parentId":51,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":926796,"timestamp":197200758452,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778568686583,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":918150,"timestamp":197200778837,"id":92,"parentId":52,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":938432,"timestamp":197200758635,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778568686583,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":930971,"timestamp":197200778843,"id":93,"parentId":53,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":951059,"timestamp":197200758815,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778568686584,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":966535,"timestamp":197200778795,"id":88,"parentId":23,"tags":{},"startTime":1778568686603,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":999847,"timestamp":197200745547,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778568686570,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":966694,"timestamp":197200778848,"id":94,"parentId":55,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":985967,"timestamp":197200759615,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778568686584,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":980445,"timestamp":197200778853,"id":95,"parentId":56,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":999560,"timestamp":197200759810,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778568686585,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":997650,"timestamp":197200778858,"id":96,"parentId":58,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":1013121,"timestamp":197200763454,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778568686588,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":1006089,"timestamp":197200778819,"id":89,"parentId":49,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":1026877,"timestamp":197200758099,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778568686583,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":1012971,"timestamp":197200778870,"id":98,"parentId":60,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":1028184,"timestamp":197200763719,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778568686588,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":995459,"timestamp":197200796900,"id":99,"parentId":54,"tags":{},"startTime":1778568686622,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":1033320,"timestamp":197200759096,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778568686584,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":986594,"timestamp":197200811286,"id":100,"parentId":57,"tags":{},"startTime":1778568686636,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":1037962,"timestamp":197200759982,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778568686585,"traceId":"f74ef6f2c328d6cb"},{"name":"is-page-static","duration":1023842,"timestamp":197200778863,"id":97,"parentId":59,"tags":{},"startTime":1778568686604,"traceId":"f74ef6f2c328d6cb"},{"name":"check-page","duration":1039172,"timestamp":197200763610,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778568686588,"traceId":"f74ef6f2c328d6cb"},{"name":"static-check","duration":1063721,"timestamp":197200739104,"id":19,"parentId":1,"tags":{},"startTime":1778568686564,"traceId":"f74ef6f2c328d6cb"},{"name":"write-routes-manifest","duration":540,"timestamp":197201812829,"id":102,"parentId":1,"tags":{},"startTime":1778568687638,"traceId":"f74ef6f2c328d6cb"},{"name":"load-dotenv","duration":53,"timestamp":197201839311,"id":105,"parentId":104,"tags":{},"startTime":1778568687664,"traceId":"f74ef6f2c328d6cb"},{"name":"run-export-path-map","duration":643,"timestamp":197201842312,"id":106,"parentId":104,"tags":{},"startTime":1778568687667,"traceId":"f74ef6f2c328d6cb"},{"name":"next-export","duration":889982,"timestamp":197201837945,"id":104,"parentId":1,"tags":{},"startTime":1778568687663,"traceId":"f74ef6f2c328d6cb"},{"name":"move-exported-app-not-found-","duration":4023,"timestamp":197202731185,"id":107,"parentId":103,"tags":{},"startTime":1778568688556,"traceId":"f74ef6f2c328d6cb"},{"name":"move-exported-app-global-error-","duration":567,"timestamp":197202735341,"id":108,"parentId":103,"tags":{},"startTime":1778568688560,"traceId":"f74ef6f2c328d6cb"}]
2
+ [{"name":"static-generation","duration":923979,"timestamp":197201817990,"id":103,"parentId":1,"tags":{},"startTime":1778568687643,"traceId":"f74ef6f2c328d6cb"},{"name":"write-routes-manifest","duration":463,"timestamp":197202742276,"id":109,"parentId":1,"tags":{},"startTime":1778568688567,"traceId":"f74ef6f2c328d6cb"},{"name":"print-tree-view","duration":5152,"timestamp":197202772594,"id":110,"parentId":1,"tags":{},"startTime":1778568688597,"traceId":"f74ef6f2c328d6cb"},{"name":"write-route-bundle-stats","duration":12514,"timestamp":197202777786,"id":111,"parentId":1,"tags":{},"startTime":1778568688602,"traceId":"f74ef6f2c328d6cb"},{"name":"telemetry-flush","duration":8412,"timestamp":197202790337,"id":112,"parentId":1,"tags":{},"startTime":1778568688615,"traceId":"f74ef6f2c328d6cb"},{"name":"next-build","duration":25689118,"timestamp":197177109678,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778568662934,"traceId":"f74ef6f2c328d6cb"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":7564445,"timestamp":195935217125,"id":14,"parentId":1,"tags":{},"startTime":1778567421042,"traceId":"2aad9b430af97808"},{"name":"turbopack-build-events","duration":84,"timestamp":195935497156,"id":15,"parentId":1,"tags":{},"startTime":1778567421322,"traceId":"2aad9b430af97808"},{"name":"run-typescript","duration":7645717,"timestamp":195942799138,"id":16,"parentId":1,"tags":{},"startTime":1778567428624,"traceId":"2aad9b430af97808"},{"name":"static-check","duration":547647,"timestamp":195950515347,"id":19,"parentId":1,"tags":{},"startTime":1778567436340,"traceId":"2aad9b430af97808"},{"name":"static-generation","duration":558061,"timestamp":195951075524,"id":103,"parentId":1,"tags":{},"startTime":1778567436900,"traceId":"2aad9b430af97808"},{"name":"telemetry-flush","duration":31143,"timestamp":195951667849,"id":112,"parentId":1,"tags":{},"startTime":1778567437493,"traceId":"2aad9b430af97808"},{"name":"next-build","duration":16706220,"timestamp":195934992827,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778567420818,"traceId":"2aad9b430af97808"}]
1
+ [{"name":"run-turbopack","duration":12671412,"timestamp":197177322536,"id":14,"parentId":1,"tags":{},"startTime":1778568663147,"traceId":"f74ef6f2c328d6cb"},{"name":"turbopack-build-events","duration":76,"timestamp":197177712664,"id":15,"parentId":1,"tags":{},"startTime":1778568663537,"traceId":"f74ef6f2c328d6cb"},{"name":"run-typescript","duration":10657513,"timestamp":197190001327,"id":16,"parentId":1,"tags":{},"startTime":1778568675826,"traceId":"f74ef6f2c328d6cb"},{"name":"static-check","duration":1063721,"timestamp":197200739104,"id":19,"parentId":1,"tags":{},"startTime":1778568686564,"traceId":"f74ef6f2c328d6cb"},{"name":"static-generation","duration":923979,"timestamp":197201817990,"id":103,"parentId":1,"tags":{},"startTime":1778568687643,"traceId":"f74ef6f2c328d6cb"},{"name":"telemetry-flush","duration":8412,"timestamp":197202790337,"id":112,"parentId":1,"tags":{},"startTime":1778568688615,"traceId":"f74ef6f2c328d6cb"},{"name":"next-build","duration":25689118,"timestamp":197177109678,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778568662934,"traceId":"f74ef6f2c328d6cb"}]
@@ -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
  );
@@ -412,27 +412,32 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
412
412
  );
413
413
  })}
414
414
 
415
- {/* center hub — 24px pulse signal source.
416
- Previous design (56px filled circle + 42px animated ring +
417
- `+` glyph + "DASHBOARD" / "command relay" labels) over-emphasized
418
- the hub and competed with the agent nodes for visual weight.
419
- The new design is a calm 12px emerald source with two outward
420
- pulse rings — reads as "signal origin" without a placeholder
421
- logo or label. Closes agent-network#5. */}
415
+ {/* center hub — round 39: enlarged from r=6 (12px) to r=10 (20px)
416
+ core so the "control plane" reads as the network's anchor,
417
+ not a stray particle. Static halo ring at r=18 grounds it
418
+ visually; two outward pulses keep the "signal source" idea
419
+ from r17. Light theme gets a paler core to avoid hot-spotting
420
+ the bg. */}
422
421
  <g>
422
+ {/* static grounding halo — sits underneath, low opacity */}
423
+ <circle
424
+ cx={cx} cy={cy} r="18"
425
+ fill={isLight ? '#d1fae5' : '#10b981'}
426
+ opacity={isLight ? 0.35 : 0.10}
427
+ />
423
428
  {/* outer pulse 1 */}
424
- <circle cx={cx} cy={cy} r="6" fill="none" stroke="#10b981" strokeWidth="1.5">
425
- <animate attributeName="r" values="6;28;6" dur="2.4s" repeatCount="indefinite" />
429
+ <circle cx={cx} cy={cy} r="10" fill="none" stroke="#10b981" strokeWidth="1.5">
430
+ <animate attributeName="r" values="10;38;10" dur="2.4s" repeatCount="indefinite" />
426
431
  <animate attributeName="opacity" values="0.55;0;0.55" dur="2.4s" repeatCount="indefinite" />
427
432
  </circle>
428
433
  {/* outer pulse 2 (delayed 1.2s) */}
429
- <circle cx={cx} cy={cy} r="6" fill="none" stroke="#10b981" strokeWidth="1.5" opacity="0">
430
- <animate attributeName="r" values="6;28;6" dur="2.4s" begin="1.2s" repeatCount="indefinite" />
434
+ <circle cx={cx} cy={cy} r="10" fill="none" stroke="#10b981" strokeWidth="1.5" opacity="0">
435
+ <animate attributeName="r" values="10;38;10" dur="2.4s" begin="1.2s" repeatCount="indefinite" />
431
436
  <animate attributeName="opacity" values="0.45;0;0.45" dur="2.4s" begin="1.2s" repeatCount="indefinite" />
432
437
  </circle>
433
- {/* core dot 12px diameter (r=6), emerald with inner highlight */}
434
- <circle cx={cx} cy={cy} r="6" fill="#10b981" />
435
- <circle cx={cx} cy={cy} r="3" fill="#d1fae5" opacity="0.9" />
438
+ {/* core — 20px diameter, larger inner highlight reads as a "lit lamp" */}
439
+ <circle cx={cx} cy={cy} r="10" fill={isLight ? '#059669' : '#10b981'} />
440
+ <circle cx={cx} cy={cy} r="5" fill="#d1fae5" opacity="0.9" />
436
441
  </g>
437
442
 
438
443
  {/* agent nodes */}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.5-preview.21",
3
+ "version": "0.4.5-preview.23",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -1,3 +0,0 @@
1
- module.exports=[43515,a=>{"use strict";a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"timeAgo",0,function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}])},44332,a=>{"use strict";var b=a.i(72596),c=a.i(22397);let d=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()},e={refreshInterval:5e3,dedupingInterval:3e3};function f(a,b){if(!b)return a;let c=a.includes("?")?"&":"?";return`${a}${c}network_id=${encodeURIComponent(b)}`}a.s(["useAnetConfig",0,function(){let{data:a}=(0,b.default)("/api/anet/config",d,{refreshInterval:3e4});return{config:a||null}},"useHealth",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/health",d,e);return{health:a||null,error:c}},"useLicense",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/license",d,{refreshInterval:6e4});return{license:a?.ok?a:null,error:c}},"useMessages",0,function(a=100){let{networkId:g}=(0,c.useNetworkId)(),{data:h,error:i,isLoading:j}=(0,b.default)(f(`/api/hub/messages?limit=${a}`,g),d,e);return{messages:h?.messages||[],error:i,isLoading:j}},"useSessions",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h,isLoading:i}=(0,b.default)(f("/api/hub/status",a),d,e);return{sessions:g?.sessions||[],hint:g?._hint,error:h,isLoading:i}},"useStats",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h}=(0,b.default)(f("/api/hub/stats",a),d,e);return{stats:g?.ok?g:null,error:h}},"useTasks",0,function(a){let{networkId:g}=(0,c.useNetworkId)(),h=new URLSearchParams({limit:"100",...a}).toString(),{data:i,error:j,isLoading:k}=(0,b.default)(f(`/api/hub/tasks?${h}`,g),d,e);return{tasks:i?.tasks||[],count:i?.count??0,source:i?.source,error:j,isLoading:k}}])},88367,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(44332),e=a.i(43515);a.s(["default",0,function(){let{sessions:a}=(0,d.useSessions)(),{health:f}=(0,d.useHealth)(),{stats:g}=(0,d.useStats)(),h=f?.sse_sessions||{},i=a=>(a.network_id?h[`${a.network_id}:${a.alias}`]:void 0)??h[a.alias],[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),[r,s]=(0,c.useState)(""),[t,u]=(0,c.useState)(""),[v,w]=(0,c.useState)(""),[x,y]=(0,c.useState)(""),z=async()=>{if(j.trim()&&l.trim()){try{let a=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"register",username:j,password:l})}),b=await a.json();o(b.ok?`Created: ${b.user.username} (${b.user.user_id})`:`Failed: ${b.error}`),b.ok&&(k(""),m(""))}catch{o("Failed")}setTimeout(()=>o(""),8e3)}},A=async()=>{if(p.trim()){try{let a=await fetch("/api/hub/broadcast",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:p})}),b=await a.json();s(b.ok?`Sent to ${b.recipients} nodes`:`Failed: ${b.error}`),b.ok&&q("")}catch{s("Failed")}setTimeout(()=>s(""),5e3)}},B=async()=>{if(t&&v.trim()){try{let a=await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:t,task:v})}),b=await a.json();y(b.ok?"Task sent":`Failed: ${b.error}`),b.ok&&w("")}catch{y("Failed")}setTimeout(()=>y(""),5e3)}},C=a.filter(a=>i(a)),D=a.filter(a=>!i(a));return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10",children:"Admin"}),(0,b.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 max-w-6xl",children:[(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Overview"}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-3xl font-bold text-green-400 tabular-nums",children:C.length}),(0,b.jsx)("div",{className:"text-xs text-gray-500",children:"Online"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-3xl font-bold text-gray-500 tabular-nums",children:D.length}),(0,b.jsx)("div",{className:"text-xs text-gray-500",children:"Offline"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-3xl font-bold text-cyan-400 tabular-nums",children:f?.sse_connections??"--"}),(0,b.jsx)("div",{className:"text-xs text-gray-500",children:"SSE Connections"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-3xl font-bold text-white tabular-nums",children:g?.tasks?.total??"--"}),(0,b.jsx)("div",{className:"text-xs text-gray-500",children:"Total Tasks"})]})]}),g?.tasks?.by_status&&g.tasks.by_status.length>0&&(0,b.jsx)("div",{className:"mt-4 flex flex-wrap gap-2",children:g.tasks.by_status.map(a=>(0,b.jsxs)("span",{className:"text-xs px-2 py-1 rounded bg-[#0a0a15] border border-[#1a1a2a] text-gray-400",children:[a.status,": ",a.count]},a.status))})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Broadcast"}),(0,b.jsx)("textarea",{value:p,onChange:a=>q(a.target.value),placeholder:"Message to all online nodes...",rows:3,className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none resize-none"}),(0,b.jsxs)("div",{className:"flex justify-between items-center mt-3",children:[(0,b.jsxs)("span",{className:"text-xs text-gray-600",children:[p.length,"/500"]}),(0,b.jsx)("button",{onClick:A,disabled:!p.trim(),className:"px-4 py-2 bg-purple-600 hover:bg-purple-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Broadcast"})]}),r&&(0,b.jsx)("div",{className:`mt-2 text-xs ${r.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:r})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Send Task"}),(0,b.jsxs)("select",{value:t,onChange:a=>u(a.target.value),className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-cyan-500/50 focus:outline-none mb-3",children:[(0,b.jsx)("option",{value:"",children:"Select target node..."}),C.map(a=>(0,b.jsxs)("option",{value:a.alias,children:[a.alias," (",a.status,")"]},a.alias)),(0,b.jsx)("optgroup",{label:"Offline",children:D.map(a=>(0,b.jsxs)("option",{value:a.alias,children:[a.alias," (offline)"]},a.alias))})]}),(0,b.jsx)("textarea",{value:v,onChange:a=>w(a.target.value),placeholder:"Task content...",rows:3,className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none resize-none"}),(0,b.jsx)("div",{className:"flex justify-end mt-3",children:(0,b.jsx)("button",{onClick:B,disabled:!t||!v.trim(),className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Send Task"})}),x&&(0,b.jsx)("div",{className:`mt-2 text-xs ${x.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:x})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:["Online Sessions ",(0,b.jsxs)("span",{className:"text-gray-600",children:["(",C.length,")"]})]}),(0,b.jsx)("div",{className:"space-y-2 max-h-80 overflow-y-auto",children:0===C.length?(0,b.jsx)("div",{className:"text-xs text-gray-600 text-center py-4",children:"No online sessions"}):C.map(a=>(0,b.jsxs)("div",{className:"flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-sm text-white font-medium truncate",children:a.alias}),(0,b.jsxs)("div",{className:"text-xs text-gray-500 truncate",children:[a.agent||"--"," · ",a.task||"idle"]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:[(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded border ${"working"===a.status?"bg-green-900/30 text-green-300 border-green-800/30":"bg-blue-900/30 text-blue-300 border-blue-800/30"}`,children:a.status}),(0,b.jsx)("span",{className:"text-[10px] text-gray-600",children:(0,e.timeAgo)(a.updated_at)})]})]},a.alias))})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Register User (V3)"}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("input",{type:"text",value:j,onChange:a=>k(a.target.value),placeholder:"Username",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("input",{type:"password",value:l,onChange:a=>m(a.target.value),placeholder:"Password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("button",{onClick:z,disabled:!j.trim()||!l.trim(),className:"w-full px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Register"})]}),n&&(0,b.jsx)("div",{className:`mt-2 text-xs ${n.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:n})]})]})]})}])}];
2
-
3
- //# sourceMappingURL=app_0ap_oiq._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/components/utils.ts","../../../../app/lib/hooks.ts","../../../../app/admin/page.tsx"],"sourcesContent":["export function timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","import useSWR from 'swr';\nimport { Session, Health, AnetConfig } from '../components/types';\nimport { useNetworkId } from './network-context';\n\nconst fetcher = async (url: string) => {\n const res = await fetch(url);\n if (res.status === 401) {\n window.location.assign('/login');\n throw new Error('unauthorized');\n }\n return res.json();\n};\n\nconst SWR_OPTIONS = { refreshInterval: 5000, dedupingInterval: 3000 };\n\n/** Append network_id to URL if set */\nfunction withNetwork(url: string, networkId: string): string {\n if (!networkId) return url;\n const sep = url.includes('?') ? '&' : '?';\n return `${url}${sep}network_id=${encodeURIComponent(networkId)}`;\n}\n\nexport function useSessions() {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR<{ sessions: Session[]; _hint?: { global_count?: number; filtered_network?: string } }>(\n withNetwork('/api/hub/status', networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { sessions: data?.sessions || [], hint: data?._hint, error, isLoading };\n}\n\nexport function useHealth() {\n const { data, error } = useSWR<Health>('/api/hub/health', fetcher, SWR_OPTIONS);\n return { health: data || null, error };\n}\n\nexport function useAnetConfig() {\n const { data } = useSWR<AnetConfig>('/api/anet/config', fetcher, { refreshInterval: 30000 });\n return { config: data || null };\n}\n\nexport function useTasks(params?: Record<string, string>) {\n const { networkId } = useNetworkId();\n const query = new URLSearchParams({ limit: '100', ...params }).toString();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/tasks?${query}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return {\n tasks: data?.tasks || [],\n count: data?.count ?? 0,\n source: data?.source,\n error,\n isLoading,\n };\n}\n\nexport function useStats() {\n const { networkId } = useNetworkId();\n const { data, error } = useSWR(withNetwork('/api/hub/stats', networkId), fetcher, SWR_OPTIONS);\n return { stats: data?.ok ? data : null, error };\n}\n\nexport function useLicense() {\n const { data, error } = useSWR('/api/hub/license', fetcher, { refreshInterval: 60000 });\n return { license: data?.ok ? data : null, error };\n}\n\nexport function useMessages(limit = 100) {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/messages?limit=${limit}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { messages: data?.messages || [], error, isLoading };\n}\n\nexport function useNodeSession(alias: string) {\n const { data, error, isLoading } = useSWR(\n alias ? `/api/hub/session?alias=${encodeURIComponent(alias)}` : null,\n fetcher,\n SWR_OPTIONS,\n );\n return {\n session: data?.session || null,\n inbox: data?.inbox || [],\n sse: data?.sse || 0,\n error,\n isLoading,\n };\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { useSessions, useHealth, useStats } from '../lib/hooks';\nimport { timeAgo } from '../components/utils';\n\nexport default function AdminPage() {\n const { sessions } = useSessions();\n const { health } = useHealth();\n const { stats } = useStats();\n const sseMap = health?.sse_sessions || {};\n // SSE keys are `network_id:alias` since server v0.7+; fall back to alias-only.\n const sseFor = (s: { alias: string; network_id?: string }) =>\n (s.network_id ? sseMap[`${s.network_id}:${s.alias}`] : undefined) ?? sseMap[s.alias];\n\n const [regUser, setRegUser] = useState('');\n const [regPass, setRegPass] = useState('');\n const [regResult, setRegResult] = useState('');\n const [broadcastMsg, setBroadcastMsg] = useState('');\n const [broadcastResult, setBroadcastResult] = useState('');\n const [taskTarget, setTaskTarget] = useState('');\n const [taskContent, setTaskContent] = useState('');\n const [taskResult, setTaskResult] = useState('');\n\n const registerUser = async () => {\n if (!regUser.trim() || !regPass.trim()) return;\n try {\n const res = await fetch('/api/hub/auth', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'register', username: regUser, password: regPass }),\n });\n const data = await res.json();\n setRegResult(data.ok ? `Created: ${data.user.username} (${data.user.user_id})` : `Failed: ${data.error}`);\n if (data.ok) { setRegUser(''); setRegPass(''); }\n } catch { setRegResult('Failed'); }\n setTimeout(() => setRegResult(''), 8000);\n };\n\n const sendBroadcast = async () => {\n if (!broadcastMsg.trim()) return;\n try {\n const res = await fetch('/api/hub/broadcast', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: broadcastMsg }),\n });\n const data = await res.json();\n setBroadcastResult(data.ok ? `Sent to ${data.recipients} nodes` : `Failed: ${data.error}`);\n if (data.ok) setBroadcastMsg('');\n } catch { setBroadcastResult('Failed'); }\n setTimeout(() => setBroadcastResult(''), 5000);\n };\n\n const sendTask = async () => {\n if (!taskTarget || !taskContent.trim()) return;\n try {\n const res = await fetch('/api/hub/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alias: taskTarget, task: taskContent }),\n });\n const data = await res.json();\n setTaskResult(data.ok ? 'Task sent' : `Failed: ${data.error}`);\n if (data.ok) setTaskContent('');\n } catch { setTaskResult('Failed'); }\n setTimeout(() => setTaskResult(''), 5000);\n };\n\n const onlineNodes = sessions.filter(s => sseFor(s));\n const offlineNodes = sessions.filter(s => !sseFor(s));\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <h1 className=\"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10\">Admin</h1>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6 max-w-6xl\">\n {/* Server Overview */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Server Overview</h2>\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <div className=\"text-3xl font-bold text-green-400 tabular-nums\">{onlineNodes.length}</div>\n <div className=\"text-xs text-gray-500\">Online</div>\n </div>\n <div>\n <div className=\"text-3xl font-bold text-gray-500 tabular-nums\">{offlineNodes.length}</div>\n <div className=\"text-xs text-gray-500\">Offline</div>\n </div>\n <div>\n <div className=\"text-3xl font-bold text-cyan-400 tabular-nums\">{health?.sse_connections ?? '--'}</div>\n <div className=\"text-xs text-gray-500\">SSE Connections</div>\n </div>\n <div>\n <div className=\"text-3xl font-bold text-white tabular-nums\">{stats?.tasks?.total ?? '--'}</div>\n <div className=\"text-xs text-gray-500\">Total Tasks</div>\n </div>\n </div>\n {stats?.tasks?.by_status && stats.tasks.by_status.length > 0 && (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {stats.tasks.by_status.map((s: { status: string; count: number }) => (\n <span key={s.status} className=\"text-xs px-2 py-1 rounded bg-[#0a0a15] border border-[#1a1a2a] text-gray-400\">\n {s.status}: {s.count}\n </span>\n ))}\n </div>\n )}\n </section>\n\n {/* Broadcast */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Broadcast</h2>\n <textarea\n value={broadcastMsg}\n onChange={e => setBroadcastMsg(e.target.value)}\n placeholder=\"Message to all online nodes...\"\n rows={3}\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none resize-none\"\n />\n <div className=\"flex justify-between items-center mt-3\">\n <span className=\"text-xs text-gray-600\">{broadcastMsg.length}/500</span>\n <button\n onClick={sendBroadcast}\n disabled={!broadcastMsg.trim()}\n className=\"px-4 py-2 bg-purple-600 hover:bg-purple-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\"\n >\n Broadcast\n </button>\n </div>\n {broadcastResult && <div className={`mt-2 text-xs ${broadcastResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{broadcastResult}</div>}\n </section>\n\n {/* Send Task */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Send Task</h2>\n <select\n value={taskTarget}\n onChange={e => setTaskTarget(e.target.value)}\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-cyan-500/50 focus:outline-none mb-3\"\n >\n <option value=\"\">Select target node...</option>\n {onlineNodes.map(s => (\n <option key={s.alias} value={s.alias}>{s.alias} ({s.status})</option>\n ))}\n <optgroup label=\"Offline\">\n {offlineNodes.map(s => (\n <option key={s.alias} value={s.alias}>{s.alias} (offline)</option>\n ))}\n </optgroup>\n </select>\n <textarea\n value={taskContent}\n onChange={e => setTaskContent(e.target.value)}\n placeholder=\"Task content...\"\n rows={3}\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none resize-none\"\n />\n <div className=\"flex justify-end mt-3\">\n <button\n onClick={sendTask}\n disabled={!taskTarget || !taskContent.trim()}\n className=\"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\"\n >\n Send Task\n </button>\n </div>\n {taskResult && <div className={`mt-2 text-xs ${taskResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{taskResult}</div>}\n </section>\n\n {/* Online Sessions */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">\n Online Sessions <span className=\"text-gray-600\">({onlineNodes.length})</span>\n </h2>\n <div className=\"space-y-2 max-h-80 overflow-y-auto\">\n {onlineNodes.length === 0 ? (\n <div className=\"text-xs text-gray-600 text-center py-4\">No online sessions</div>\n ) : onlineNodes.map(s => (\n <div key={s.alias} className=\"flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]\">\n <div className=\"min-w-0\">\n <div className=\"text-sm text-white font-medium truncate\">{s.alias}</div>\n <div className=\"text-xs text-gray-500 truncate\">{s.agent || '--'} · {s.task || 'idle'}</div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span className={`text-xs px-2 py-0.5 rounded border ${\n 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'\n }`}>{s.status}</span>\n <span className=\"text-[10px] text-gray-600\">{timeAgo(s.updated_at)}</span>\n </div>\n </div>\n ))}\n </div>\n </section>\n {/* User Management (V3 Auth) */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Register User (V3)</h2>\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n value={regUser}\n onChange={e => setRegUser(e.target.value)}\n placeholder=\"Username\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none\"\n />\n <input\n type=\"password\"\n value={regPass}\n onChange={e => setRegPass(e.target.value)}\n placeholder=\"Password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none\"\n />\n <button\n onClick={registerUser}\n disabled={!regUser.trim() || !regPass.trim()}\n className=\"w-full px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\"\n >\n Register\n </button>\n </div>\n {regResult && <div className={`mt-2 text-xs ${regResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{regResult}</div>}\n </section>\n </div>\n </div>\n );\n}\n"],"names":["timeAgo","dateStr","diff","Date","now","replace","getTime","s","Math","floor","statusColor","status","hasSse","formatUptime","seconds","h","m","fetcher","url","res","fetch","window","location","assign","Error","json","SWR_OPTIONS","refreshInterval","dedupingInterval","withNetwork","networkId","sep","includes","encodeURIComponent","useSessions","data","error","isLoading","sessions","hint","_hint","useHealth","health","useAnetConfig","config","useTasks","params","query","URLSearchParams","limit","toString","tasks","count","source","useStats","stats","ok","useLicense","license","useMessages","messages","useNodeSession","alias","session","inbox","sse","AdminPage","sseMap","sse_sessions","sseFor","network_id","undefined","regUser","setRegUser","regPass","setRegPass","regResult","setRegResult","broadcastMsg","setBroadcastMsg","broadcastResult","setBroadcastResult","taskTarget","setTaskTarget","taskContent","setTaskContent","taskResult","setTaskResult","registerUser","trim","method","headers","body","JSON","stringify","action","username","password","user","user_id","setTimeout","sendBroadcast","message","recipients","sendTask","task","onlineNodes","filter","offlineNodes","className","length","sse_connections","total","by_status","map","value","onChange","e","target","placeholder","rows","onClick","disabled","startsWith","label","agent","updated_at","type"],"mappings":"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"}
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,18150,e=>{"use strict";e.s(["formatUptime",0,function(e){let t=Math.floor(e/3600),s=Math.floor(e%3600/60);return t>0?`${t}h ${s}m`:`${s}m`},"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`}])},65822,e=>{"use strict";var t=e.i(83599),s=e.i(58963);let a=async e=>{let t=await fetch(e);if(401===t.status)throw window.location.assign("/login"),Error("unauthorized");return t.json()},r={refreshInterval:5e3,dedupingInterval:3e3};function l(e,t){if(!t)return e;let s=e.includes("?")?"&":"?";return`${e}${s}network_id=${encodeURIComponent(t)}`}e.s(["useAnetConfig",0,function(){let{data:e}=(0,t.default)("/api/anet/config",a,{refreshInterval:3e4});return{config:e||null}},"useHealth",0,function(){let{data:e,error:s}=(0,t.default)("/api/hub/health",a,r);return{health:e||null,error:s}},"useLicense",0,function(){let{data:e,error:s}=(0,t.default)("/api/hub/license",a,{refreshInterval:6e4});return{license:e?.ok?e:null,error:s}},"useMessages",0,function(e=100){let{networkId:n}=(0,s.useNetworkId)(),{data:i,error:o,isLoading:d}=(0,t.default)(l(`/api/hub/messages?limit=${e}`,n),a,r);return{messages:i?.messages||[],error:o,isLoading:d}},"useSessions",0,function(){let{networkId:e}=(0,s.useNetworkId)(),{data:n,error:i,isLoading:o}=(0,t.default)(l("/api/hub/status",e),a,r);return{sessions:n?.sessions||[],hint:n?._hint,error:i,isLoading:o}},"useStats",0,function(){let{networkId:e}=(0,s.useNetworkId)(),{data:n,error:i}=(0,t.default)(l("/api/hub/stats",e),a,r);return{stats:n?.ok?n:null,error:i}},"useTasks",0,function(e){let{networkId:n}=(0,s.useNetworkId)(),i=new URLSearchParams({limit:"100",...e}).toString(),{data:o,error:d,isLoading:c}=(0,t.default)(l(`/api/hub/tasks?${i}`,n),a,r);return{tasks:o?.tasks||[],count:o?.count??0,source:o?.source,error:d,isLoading:c}}])},23261,e=>{"use strict";var t=e.i(18050),s=e.i(71645),a=e.i(65822),r=e.i(18150);e.s(["default",0,function(){let{sessions:e}=(0,a.useSessions)(),{health:l}=(0,a.useHealth)(),{stats:n}=(0,a.useStats)(),i=l?.sse_sessions||{},o=e=>(e.network_id?i[`${e.network_id}:${e.alias}`]:void 0)??i[e.alias],[d,c]=(0,s.useState)(""),[u,x]=(0,s.useState)(""),[h,m]=(0,s.useState)(""),[g,b]=(0,s.useState)(""),[p,f]=(0,s.useState)(""),[y,j]=(0,s.useState)(""),[v,N]=(0,s.useState)(""),[w,k]=(0,s.useState)(""),S=async()=>{if(d.trim()&&u.trim()){try{let e=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"register",username:d,password:u})}),t=await e.json();m(t.ok?`Created: ${t.user.username} (${t.user.user_id})`:`Failed: ${t.error}`),t.ok&&(c(""),x(""))}catch{m("Failed")}setTimeout(()=>m(""),8e3)}},$=async()=>{if(g.trim()){try{let e=await fetch("/api/hub/broadcast",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:g})}),t=await e.json();f(t.ok?`Sent to ${t.recipients} nodes`:`Failed: ${t.error}`),t.ok&&b("")}catch{f("Failed")}setTimeout(()=>f(""),5e3)}},T=async()=>{if(y&&v.trim()){try{let e=await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:y,task:v})}),t=await e.json();k(t.ok?"Task sent":`Failed: ${t.error}`),t.ok&&N("")}catch{k("Failed")}setTimeout(()=>k(""),5e3)}},C=e.filter(e=>o(e)),O=e.filter(e=>!o(e));return(0,t.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,t.jsx)("h1",{className:"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10",children:"Admin"}),(0,t.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 max-w-6xl",children:[(0,t.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Overview"}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-3xl font-bold text-green-400 tabular-nums",children:C.length}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Online"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-3xl font-bold text-gray-500 tabular-nums",children:O.length}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Offline"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-3xl font-bold text-cyan-400 tabular-nums",children:l?.sse_connections??"--"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"SSE Connections"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"text-3xl font-bold text-white tabular-nums",children:n?.tasks?.total??"--"}),(0,t.jsx)("div",{className:"text-xs text-gray-500",children:"Total Tasks"})]})]}),n?.tasks?.by_status&&n.tasks.by_status.length>0&&(0,t.jsx)("div",{className:"mt-4 flex flex-wrap gap-2",children:n.tasks.by_status.map(e=>(0,t.jsxs)("span",{className:"text-xs px-2 py-1 rounded bg-[#0a0a15] border border-[#1a1a2a] text-gray-400",children:[e.status,": ",e.count]},e.status))})]}),(0,t.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Broadcast"}),(0,t.jsx)("textarea",{value:g,onChange:e=>b(e.target.value),placeholder:"Message to all online nodes...",rows:3,className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none resize-none"}),(0,t.jsxs)("div",{className:"flex justify-between items-center mt-3",children:[(0,t.jsxs)("span",{className:"text-xs text-gray-600",children:[g.length,"/500"]}),(0,t.jsx)("button",{onClick:$,disabled:!g.trim(),className:"px-4 py-2 bg-purple-600 hover:bg-purple-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Broadcast"})]}),p&&(0,t.jsx)("div",{className:`mt-2 text-xs ${p.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:p})]}),(0,t.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Send Task"}),(0,t.jsxs)("select",{value:y,onChange:e=>j(e.target.value),className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-cyan-500/50 focus:outline-none mb-3",children:[(0,t.jsx)("option",{value:"",children:"Select target node..."}),C.map(e=>(0,t.jsxs)("option",{value:e.alias,children:[e.alias," (",e.status,")"]},e.alias)),(0,t.jsx)("optgroup",{label:"Offline",children:O.map(e=>(0,t.jsxs)("option",{value:e.alias,children:[e.alias," (offline)"]},e.alias))})]}),(0,t.jsx)("textarea",{value:v,onChange:e=>N(e.target.value),placeholder:"Task content...",rows:3,className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none resize-none"}),(0,t.jsx)("div",{className:"flex justify-end mt-3",children:(0,t.jsx)("button",{onClick:T,disabled:!y||!v.trim(),className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Send Task"})}),w&&(0,t.jsx)("div",{className:`mt-2 text-xs ${w.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:w})]}),(0,t.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,t.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:["Online Sessions ",(0,t.jsxs)("span",{className:"text-gray-600",children:["(",C.length,")"]})]}),(0,t.jsx)("div",{className:"space-y-2 max-h-80 overflow-y-auto",children:0===C.length?(0,t.jsx)("div",{className:"text-xs text-gray-600 text-center py-4",children:"No online sessions"}):C.map(e=>(0,t.jsxs)("div",{className:"flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("div",{className:"text-sm text-white font-medium truncate",children:e.alias}),(0,t.jsxs)("div",{className:"text-xs text-gray-500 truncate",children:[e.agent||"--"," · ",e.task||"idle"]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:[(0,t.jsx)("span",{className:`text-xs px-2 py-0.5 rounded border ${"working"===e.status?"bg-green-900/30 text-green-300 border-green-800/30":"bg-blue-900/30 text-blue-300 border-blue-800/30"}`,children:e.status}),(0,t.jsx)("span",{className:"text-[10px] text-gray-600",children:(0,r.timeAgo)(e.updated_at)})]})]},e.alias))})]}),(0,t.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Register User (V3)"}),(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)("input",{type:"text",value:d,onChange:e=>c(e.target.value),placeholder:"Username",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,t.jsx)("input",{type:"password",value:u,onChange:e=>x(e.target.value),placeholder:"Password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,t.jsx)("button",{onClick:S,disabled:!d.trim()||!u.trim(),className:"w-full px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Register"})]}),h&&(0,t.jsx)("div",{className:`mt-2 text-xs ${h.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:h})]})]})]})}])}]);