@sleep2agi/agent-network-dashboard 0.4.5-preview.87 → 0.4.5-preview.89

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 (183) 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 +17 -17
  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.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/index.html +2 -2
  30. package/.next/server/app/index.rsc +2 -2
  31. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/login.html +2 -2
  38. package/.next/server/app/login.rsc +2 -2
  39. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  40. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  45. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/logs.html +2 -2
  47. package/.next/server/app/logs.rsc +2 -2
  48. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  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 +2 -2
  53. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  54. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/messages.html +2 -2
  56. package/.next/server/app/messages.rsc +2 -2
  57. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  58. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  61. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  63. package/.next/server/app/node.html +1 -1
  64. package/.next/server/app/node.rsc +1 -1
  65. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  70. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  71. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  72. package/.next/server/app/nodes.html +2 -2
  73. package/.next/server/app/nodes.rsc +2 -2
  74. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  75. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  77. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  80. package/.next/server/app/page_client-reference-manifest.js +1 -1
  81. package/.next/server/app/server-logs.html +1 -1
  82. package/.next/server/app/server-logs.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  86. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  87. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app/settings/networks.html +2 -2
  91. package/.next/server/app/settings/networks.rsc +2 -2
  92. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  93. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  95. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  96. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
  97. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  98. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  99. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  100. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  101. package/.next/server/app/settings/tokens.html +2 -2
  102. package/.next/server/app/settings/tokens.rsc +2 -2
  103. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  104. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  105. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  106. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  107. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +2 -2
  108. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  109. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  110. package/.next/server/app/settings.html +2 -2
  111. package/.next/server/app/settings.rsc +2 -2
  112. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  113. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  114. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  115. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  116. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  117. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  118. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  119. package/.next/server/app/tasks.html +2 -2
  120. package/.next/server/app/tasks.rsc +2 -2
  121. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  122. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  123. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  124. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  125. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  127. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js +1 -1
  128. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js.map +1 -1
  129. package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js +1 -1
  130. package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js.map +1 -1
  131. package/.next/server/chunks/ssr/_0nne7mz._.js +1 -1
  132. package/.next/server/chunks/ssr/_0nne7mz._.js.map +1 -1
  133. package/.next/server/chunks/ssr/app_0.zbtn5._.js +1 -1
  134. package/.next/server/chunks/ssr/app_0.zbtn5._.js.map +1 -1
  135. package/.next/server/chunks/ssr/app_04n78pr._.js +1 -1
  136. package/.next/server/chunks/ssr/app_04n78pr._.js.map +1 -1
  137. package/.next/server/chunks/ssr/app_0_agk0r._.js +1 -1
  138. package/.next/server/chunks/ssr/app_0_agk0r._.js.map +1 -1
  139. package/.next/server/chunks/ssr/app_0aum_g5._.js +1 -1
  140. package/.next/server/chunks/ssr/app_0aum_g5._.js.map +1 -1
  141. package/.next/server/chunks/ssr/app_0emvkn2._.js +1 -1
  142. package/.next/server/chunks/ssr/app_0emvkn2._.js.map +1 -1
  143. package/.next/server/chunks/ssr/app_0esuljp._.js +1 -1
  144. package/.next/server/chunks/ssr/app_0esuljp._.js.map +1 -1
  145. package/.next/server/chunks/ssr/app_0izi28j._.js +1 -1
  146. package/.next/server/chunks/ssr/app_0izi28j._.js.map +1 -1
  147. package/.next/server/middleware-build-manifest.js +3 -3
  148. package/.next/server/pages/404.html +1 -1
  149. package/.next/server/pages/500.html +1 -1
  150. package/.next/server/server-reference-manifest.js +1 -1
  151. package/.next/server/server-reference-manifest.json +1 -1
  152. package/.next/static/chunks/{0ywwa79l.thf~.js → 02_zpo7taex9o.js} +2 -2
  153. package/.next/static/chunks/02mk~rxa.38mg.js +1 -0
  154. package/.next/static/chunks/06n3d~fbbtagk.js +1 -0
  155. package/.next/static/chunks/07eba1lz2u3p4.js +1 -0
  156. package/.next/static/chunks/0g9aof0ob_fcj.js +1 -0
  157. package/.next/static/chunks/0ubqqhhpsaez4.js +1 -0
  158. package/.next/static/chunks/{0tnv-gzgr8bp..js → 0vmfuul..~gxc.js} +1 -1
  159. package/.next/static/chunks/{0-848dav5-02p.js → 100p53cbzb10~.js} +1 -1
  160. package/.next/static/chunks/{0ogy2-45xvdjy.js → 12gprw3l0kvvf.js} +1 -1
  161. package/.next/static/chunks/12yuo353giomx.js +1 -0
  162. package/.next/trace +2 -2
  163. package/.next/trace-build +1 -1
  164. package/app/components/EmptyState.tsx +81 -39
  165. package/app/components/TopoGraph.tsx +50 -3
  166. package/app/page.tsx +4 -1
  167. package/package.json +1 -1
  168. package/scripts/empty-state-test.mjs +41 -0
  169. package/scripts/topo-cluster-test.mjs +41 -0
  170. package/scripts/topo-group-test.mjs +37 -0
  171. package/.next/static/chunks/06uku.~mtk9zz.js +0 -1
  172. package/.next/static/chunks/0_tkvll6kmd9r.js +0 -1
  173. package/.next/static/chunks/0n7w64kqer3dq.js +0 -1
  174. package/.next/static/chunks/0wles3.ky8_p..js +0 -1
  175. package/.next/static/chunks/1213rotrv_o6s.js +0 -1
  176. package/.next/static/chunks/171cg07p8~k-l.js +0 -1
  177. package/scripts/topo-dbg.mjs +0 -32
  178. package/scripts/topo-dbg2.mjs +0 -25
  179. package/scripts/topo-dbg3.mjs +0 -34
  180. package/scripts/topo-dbltap-test.mjs +0 -40
  181. /package/.next/static/{XMlyDlWAfl_NXffGIo7_8 → U8zpNdC9RopQDzQ13ufIz}/_buildManifest.js +0 -0
  182. /package/.next/static/{XMlyDlWAfl_NXffGIo7_8 → U8zpNdC9RopQDzQ13ufIz}/_clientMiddlewareManifest.js +0 -0
  183. /package/.next/static/{XMlyDlWAfl_NXffGIo7_8 → U8zpNdC9RopQDzQ13ufIz}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":309,"timestamp":364597939857,"id":4,"parentId":1,"tags":{},"startTime":1778736083765,"traceId":"54b331ea1974c723"},{"name":"load-custom-routes","duration":476,"timestamp":364597940311,"id":5,"parentId":1,"tags":{},"startTime":1778736083765,"traceId":"54b331ea1974c723"},{"name":"create-dist-dir","duration":309,"timestamp":364597940829,"id":6,"parentId":1,"tags":{},"startTime":1778736083766,"traceId":"54b331ea1974c723"},{"name":"clean","duration":482,"timestamp":364597941803,"id":7,"parentId":1,"tags":{},"startTime":1778736083766,"traceId":"54b331ea1974c723"},{"name":"discover-routes","duration":9083,"timestamp":364598027522,"id":8,"parentId":1,"tags":{},"startTime":1778736083852,"traceId":"54b331ea1974c723"},{"name":"create-root-mapping","duration":137,"timestamp":364598036690,"id":9,"parentId":1,"tags":{},"startTime":1778736083861,"traceId":"54b331ea1974c723"},{"name":"generate-route-types","duration":31246,"timestamp":364598039571,"id":10,"parentId":1,"tags":{},"startTime":1778736083864,"traceId":"54b331ea1974c723"},{"name":"public-dir-conflict-check","duration":109,"timestamp":364598071059,"id":11,"parentId":1,"tags":{},"startTime":1778736083896,"traceId":"54b331ea1974c723"},{"name":"generate-routes-manifest","duration":4186,"timestamp":364598071290,"id":12,"parentId":1,"tags":{},"startTime":1778736083896,"traceId":"54b331ea1974c723"},{"name":"run-turbopack","duration":8455214,"timestamp":364598081566,"id":14,"parentId":1,"tags":{},"startTime":1778736083906,"traceId":"54b331ea1974c723"},{"name":"turbopack-build-events","duration":97,"timestamp":364598373944,"id":15,"parentId":1,"tags":{},"startTime":1778736084199,"traceId":"54b331ea1974c723"},{"name":"run-typescript","duration":8319092,"timestamp":364606551649,"id":16,"parentId":1,"tags":{},"startTime":1778736092376,"traceId":"54b331ea1974c723"},{"name":"generate-required-server-files","duration":2654,"timestamp":364614871891,"id":18,"parentId":1,"tags":{},"startTime":1778736100697,"traceId":"54b331ea1974c723"},{"name":"check-static-error-page","duration":21816,"timestamp":364614953823,"id":20,"parentId":19,"tags":{},"startTime":1778736100779,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":316519,"timestamp":364614979030,"id":62,"parentId":22,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":337738,"timestamp":364614957956,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778736100783,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":394437,"timestamp":364614978653,"id":61,"parentId":21,"tags":{},"startTime":1778736100803,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":417103,"timestamp":364614956069,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778736100781,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":448334,"timestamp":364614979286,"id":64,"parentId":26,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":464437,"timestamp":364614963263,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778736100788,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":452376,"timestamp":364614979369,"id":66,"parentId":28,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":468269,"timestamp":364614963543,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778736100788,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":455163,"timestamp":364614979328,"id":65,"parentId":27,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":471190,"timestamp":364614963412,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778736100788,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":455652,"timestamp":364614979126,"id":63,"parentId":25,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":471751,"timestamp":364614963054,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778736100788,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":456706,"timestamp":364614979407,"id":67,"parentId":29,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":472465,"timestamp":364614963693,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778736100788,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":461058,"timestamp":364614979643,"id":70,"parentId":33,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":476098,"timestamp":364614964655,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778736100789,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":464736,"timestamp":364614979692,"id":71,"parentId":34,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":479705,"timestamp":364614964775,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778736100789,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":466965,"timestamp":364614979441,"id":68,"parentId":30,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":482426,"timestamp":364614964032,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778736100789,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":468307,"timestamp":364614979710,"id":72,"parentId":35,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":483158,"timestamp":364614964901,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778736100790,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":470086,"timestamp":364614979765,"id":73,"parentId":36,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":484500,"timestamp":364614965401,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778736100790,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":472723,"timestamp":364614979784,"id":74,"parentId":37,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":486912,"timestamp":364614965634,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778736100790,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":477875,"timestamp":364614979792,"id":75,"parentId":38,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":491910,"timestamp":364614965808,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778736100790,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":478508,"timestamp":364614979798,"id":76,"parentId":39,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":492428,"timestamp":364614965919,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":481134,"timestamp":364614979805,"id":77,"parentId":40,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":494928,"timestamp":364614966050,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":485443,"timestamp":364614979811,"id":78,"parentId":41,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":499151,"timestamp":364614966169,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":488896,"timestamp":364614979816,"id":79,"parentId":42,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":502472,"timestamp":364614966287,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":492434,"timestamp":364614979823,"id":80,"parentId":43,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":505898,"timestamp":364614966405,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":493433,"timestamp":364614979829,"id":81,"parentId":44,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":506783,"timestamp":364614966518,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":498177,"timestamp":364614979835,"id":82,"parentId":45,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":511435,"timestamp":364614966635,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":499830,"timestamp":364614979489,"id":69,"parentId":32,"tags":{},"startTime":1778736100804,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":514875,"timestamp":364614964510,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778736100789,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":499685,"timestamp":364614979852,"id":84,"parentId":47,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":512706,"timestamp":364614966861,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778736100792,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":501050,"timestamp":364614979843,"id":83,"parentId":46,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":514171,"timestamp":364614966761,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778736100791,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":504314,"timestamp":364614979861,"id":85,"parentId":48,"tags":{},"startTime":1778736100805,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":517275,"timestamp":364614966962,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778736100792,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":502183,"timestamp":364614982220,"id":86,"parentId":24,"tags":{},"startTime":1778736100807,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":525842,"timestamp":364614958593,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778736100783,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":503991,"timestamp":364614982941,"id":87,"parentId":31,"tags":{},"startTime":1778736100808,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":522784,"timestamp":364614964192,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778736100789,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":500578,"timestamp":364614992939,"id":90,"parentId":50,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":525413,"timestamp":364614968156,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778736100793,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":513229,"timestamp":364614992945,"id":91,"parentId":51,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":537807,"timestamp":364614968432,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778736100793,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":519394,"timestamp":364614992954,"id":92,"parentId":52,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":543499,"timestamp":364614968904,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778736100794,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":530434,"timestamp":364614992962,"id":93,"parentId":53,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":554314,"timestamp":364614969148,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778736100794,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":533439,"timestamp":364614992927,"id":89,"parentId":49,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":558460,"timestamp":364614967958,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778736100793,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":540116,"timestamp":364614992975,"id":95,"parentId":56,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":563008,"timestamp":364614970163,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778736100795,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":541261,"timestamp":364614992967,"id":94,"parentId":55,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":564303,"timestamp":364614969972,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778736100795,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":542846,"timestamp":364614992881,"id":88,"parentId":23,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":577462,"timestamp":364614958311,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778736100783,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":547619,"timestamp":364614992984,"id":96,"parentId":58,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":565603,"timestamp":364614975053,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778736100800,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":548610,"timestamp":364614993014,"id":98,"parentId":60,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":566249,"timestamp":364614975418,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778736100800,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":553379,"timestamp":364614992990,"id":97,"parentId":59,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":571153,"timestamp":364614975269,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778736100800,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":555220,"timestamp":364614993026,"id":99,"parentId":54,"tags":{},"startTime":1778736100818,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":578876,"timestamp":364614969411,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778736100794,"traceId":"54b331ea1974c723"},{"name":"is-page-static","duration":552378,"timestamp":364614999135,"id":100,"parentId":57,"tags":{},"startTime":1778736100824,"traceId":"54b331ea1974c723"},{"name":"check-page","duration":577102,"timestamp":364614974524,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778736100799,"traceId":"54b331ea1974c723"},{"name":"static-check","duration":599039,"timestamp":364614952627,"id":19,"parentId":1,"tags":{},"startTime":1778736100777,"traceId":"54b331ea1974c723"},{"name":"write-routes-manifest","duration":526,"timestamp":364615559842,"id":102,"parentId":1,"tags":{},"startTime":1778736101385,"traceId":"54b331ea1974c723"},{"name":"load-dotenv","duration":61,"timestamp":364615574687,"id":105,"parentId":104,"tags":{},"startTime":1778736101399,"traceId":"54b331ea1974c723"},{"name":"run-export-path-map","duration":664,"timestamp":364615577812,"id":106,"parentId":104,"tags":{},"startTime":1778736101403,"traceId":"54b331ea1974c723"},{"name":"next-export","duration":779504,"timestamp":364615573409,"id":104,"parentId":1,"tags":{},"startTime":1778736101398,"traceId":"54b331ea1974c723"},{"name":"move-exported-app-not-found-","duration":912,"timestamp":364616357180,"id":107,"parentId":103,"tags":{},"startTime":1778736102182,"traceId":"54b331ea1974c723"},{"name":"move-exported-app-global-error-","duration":457,"timestamp":364616358201,"id":108,"parentId":103,"tags":{},"startTime":1778736102183,"traceId":"54b331ea1974c723"}]
2
- [{"name":"static-generation","duration":796063,"timestamp":364615567106,"id":103,"parentId":1,"tags":{},"startTime":1778736101392,"traceId":"54b331ea1974c723"},{"name":"write-routes-manifest","duration":439,"timestamp":364616363343,"id":109,"parentId":1,"tags":{},"startTime":1778736102188,"traceId":"54b331ea1974c723"},{"name":"print-tree-view","duration":3866,"timestamp":364616376730,"id":110,"parentId":1,"tags":{},"startTime":1778736102201,"traceId":"54b331ea1974c723"},{"name":"write-route-bundle-stats","duration":15296,"timestamp":364616380634,"id":111,"parentId":1,"tags":{},"startTime":1778736102205,"traceId":"54b331ea1974c723"},{"name":"telemetry-flush","duration":51317,"timestamp":364616395966,"id":112,"parentId":1,"tags":{},"startTime":1778736102221,"traceId":"54b331ea1974c723"},{"name":"next-build","duration":18562732,"timestamp":364597884594,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778736083709,"traceId":"54b331ea1974c723"}]
1
+ [{"name":"generate-buildid","duration":352,"timestamp":366228259334,"id":4,"parentId":1,"tags":{},"startTime":1778737714084,"traceId":"fd1b91f91c363a76"},{"name":"load-custom-routes","duration":492,"timestamp":366228259841,"id":5,"parentId":1,"tags":{},"startTime":1778737714085,"traceId":"fd1b91f91c363a76"},{"name":"create-dist-dir","duration":341,"timestamp":366228260381,"id":6,"parentId":1,"tags":{},"startTime":1778737714085,"traceId":"fd1b91f91c363a76"},{"name":"clean","duration":571,"timestamp":366228261448,"id":7,"parentId":1,"tags":{},"startTime":1778737714086,"traceId":"fd1b91f91c363a76"},{"name":"discover-routes","duration":9119,"timestamp":366228347579,"id":8,"parentId":1,"tags":{},"startTime":1778737714172,"traceId":"fd1b91f91c363a76"},{"name":"create-root-mapping","duration":121,"timestamp":366228356772,"id":9,"parentId":1,"tags":{},"startTime":1778737714181,"traceId":"fd1b91f91c363a76"},{"name":"generate-route-types","duration":37864,"timestamp":366228359227,"id":10,"parentId":1,"tags":{},"startTime":1778737714184,"traceId":"fd1b91f91c363a76"},{"name":"public-dir-conflict-check","duration":137,"timestamp":366228397292,"id":11,"parentId":1,"tags":{},"startTime":1778737714222,"traceId":"fd1b91f91c363a76"},{"name":"generate-routes-manifest","duration":4491,"timestamp":366228397689,"id":12,"parentId":1,"tags":{},"startTime":1778737714222,"traceId":"fd1b91f91c363a76"},{"name":"run-turbopack","duration":8793134,"timestamp":366228408363,"id":14,"parentId":1,"tags":{},"startTime":1778737714233,"traceId":"fd1b91f91c363a76"},{"name":"turbopack-build-events","duration":86,"timestamp":366228696892,"id":15,"parentId":1,"tags":{},"startTime":1778737714522,"traceId":"fd1b91f91c363a76"},{"name":"run-typescript","duration":8889728,"timestamp":366237211589,"id":16,"parentId":1,"tags":{},"startTime":1778737723036,"traceId":"fd1b91f91c363a76"},{"name":"generate-required-server-files","duration":2869,"timestamp":366246102425,"id":18,"parentId":1,"tags":{},"startTime":1778737731927,"traceId":"fd1b91f91c363a76"},{"name":"check-static-error-page","duration":15054,"timestamp":366246191432,"id":20,"parentId":19,"tags":{},"startTime":1778737732016,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":317863,"timestamp":366246208566,"id":62,"parentId":22,"tags":{},"startTime":1778737732033,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":332880,"timestamp":366246193687,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778737732018,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":369572,"timestamp":366246208255,"id":61,"parentId":21,"tags":{},"startTime":1778737732033,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":385406,"timestamp":366246192502,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778737732017,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":441198,"timestamp":366246209518,"id":64,"parentId":26,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":453889,"timestamp":366246196892,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778737732022,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":445921,"timestamp":366246209620,"id":66,"parentId":28,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":457302,"timestamp":366246198317,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778737732023,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":453388,"timestamp":366246209660,"id":67,"parentId":29,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":464708,"timestamp":366246198418,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778737732023,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":453636,"timestamp":366246209695,"id":68,"parentId":30,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":464670,"timestamp":366246198690,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778737732023,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":457836,"timestamp":366246209727,"id":69,"parentId":32,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":468663,"timestamp":366246199029,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778737732024,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":462272,"timestamp":366246209832,"id":70,"parentId":33,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":473043,"timestamp":366246199117,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778737732024,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":463429,"timestamp":366246209567,"id":65,"parentId":27,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":476048,"timestamp":366246197033,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778737732022,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":468076,"timestamp":366246209878,"id":71,"parentId":34,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":478834,"timestamp":366246199194,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778737732024,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":471291,"timestamp":366246209309,"id":63,"parentId":25,"tags":{},"startTime":1778737732034,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":484480,"timestamp":366246196183,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778737732021,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":471610,"timestamp":366246209895,"id":72,"parentId":35,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":482270,"timestamp":366246199276,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778737732024,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":471852,"timestamp":366246209947,"id":73,"parentId":36,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":482191,"timestamp":366246199640,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778737732024,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":474984,"timestamp":366246209966,"id":74,"parentId":37,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":485220,"timestamp":366246199773,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778737732024,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":475187,"timestamp":366246209974,"id":75,"parentId":38,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":485326,"timestamp":366246199860,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":475830,"timestamp":366246209980,"id":76,"parentId":39,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":485923,"timestamp":366246199923,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":479623,"timestamp":366246210014,"id":79,"parentId":42,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":489579,"timestamp":366246200121,"id":42,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":479960,"timestamp":366246209995,"id":78,"parentId":41,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":489924,"timestamp":366246200060,"id":41,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":484098,"timestamp":366246210020,"id":80,"parentId":43,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":493878,"timestamp":366246200290,"id":43,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":484283,"timestamp":366246210025,"id":81,"parentId":44,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":493965,"timestamp":366246200365,"id":44,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":488075,"timestamp":366246210031,"id":82,"parentId":45,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":497731,"timestamp":366246200419,"id":45,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":488242,"timestamp":366246210037,"id":83,"parentId":46,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":497799,"timestamp":366246200502,"id":46,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":491131,"timestamp":366246210042,"id":84,"parentId":47,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":500650,"timestamp":366246200567,"id":47,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":491460,"timestamp":366246210047,"id":85,"parentId":48,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":500872,"timestamp":366246200674,"id":48,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":492807,"timestamp":366246212790,"id":87,"parentId":31,"tags":{},"startTime":1778737732037,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":506872,"timestamp":366246198788,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778737732023,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":497241,"timestamp":366246209986,"id":77,"parentId":40,"tags":{},"startTime":1778737732035,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":507291,"timestamp":366246199985,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778737732025,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":495453,"timestamp":366246212118,"id":86,"parentId":24,"tags":{},"startTime":1778737732037,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":513532,"timestamp":366246194093,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778737732019,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":474875,"timestamp":366246236232,"id":88,"parentId":23,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":517252,"timestamp":366246193899,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778737732019,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":481416,"timestamp":366246236289,"id":91,"parentId":51,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":516498,"timestamp":366246201263,"id":51,"parentId":19,"tags":{"page":"/messages"},"startTime":1778737732026,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":486032,"timestamp":366246236300,"id":92,"parentId":52,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":520947,"timestamp":366246201434,"id":52,"parentId":19,"tags":{"page":"/node"},"startTime":1778737732026,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":491804,"timestamp":366246236305,"id":93,"parentId":53,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":526538,"timestamp":366246201620,"id":53,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778737732026,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":500478,"timestamp":366246236313,"id":94,"parentId":55,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":534541,"timestamp":366246202312,"id":55,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778737732027,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":507628,"timestamp":366246236321,"id":95,"parentId":56,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":541584,"timestamp":366246202482,"id":56,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778737732027,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":514479,"timestamp":366246236280,"id":90,"parentId":50,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":549676,"timestamp":366246201139,"id":50,"parentId":19,"tags":{"page":"/logs"},"startTime":1778737732026,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":517286,"timestamp":366246236272,"id":89,"parentId":49,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":552612,"timestamp":366246201015,"id":49,"parentId":19,"tags":{"page":"/login"},"startTime":1778737732026,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":519900,"timestamp":366246236326,"id":96,"parentId":58,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":550194,"timestamp":366246206079,"id":58,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778737732031,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":523083,"timestamp":366246236344,"id":98,"parentId":60,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":553156,"timestamp":366246206315,"id":60,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778737732031,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":528073,"timestamp":366246236334,"id":97,"parentId":59,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":558339,"timestamp":366246206215,"id":59,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778737732031,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":528908,"timestamp":366246236351,"id":99,"parentId":54,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":563438,"timestamp":366246201863,"id":54,"parentId":19,"tags":{"page":"/"},"startTime":1778737732027,"traceId":"fd1b91f91c363a76"},{"name":"is-page-static","duration":530931,"timestamp":366246236359,"id":100,"parentId":57,"tags":{},"startTime":1778737732061,"traceId":"fd1b91f91c363a76"},{"name":"check-page","duration":564696,"timestamp":366246202638,"id":57,"parentId":19,"tags":{"page":"/settings"},"startTime":1778737732027,"traceId":"fd1b91f91c363a76"},{"name":"static-check","duration":576811,"timestamp":366246190561,"id":19,"parentId":1,"tags":{},"startTime":1778737732015,"traceId":"fd1b91f91c363a76"},{"name":"write-routes-manifest","duration":486,"timestamp":366246774037,"id":102,"parentId":1,"tags":{},"startTime":1778737732599,"traceId":"fd1b91f91c363a76"},{"name":"load-dotenv","duration":55,"timestamp":366246787401,"id":105,"parentId":104,"tags":{},"startTime":1778737732612,"traceId":"fd1b91f91c363a76"},{"name":"run-export-path-map","duration":680,"timestamp":366246791355,"id":106,"parentId":104,"tags":{},"startTime":1778737732616,"traceId":"fd1b91f91c363a76"},{"name":"next-export","duration":610479,"timestamp":366246785952,"id":104,"parentId":1,"tags":{},"startTime":1778737732611,"traceId":"fd1b91f91c363a76"},{"name":"move-exported-app-not-found-","duration":673,"timestamp":366247399851,"id":107,"parentId":103,"tags":{},"startTime":1778737733225,"traceId":"fd1b91f91c363a76"},{"name":"move-exported-app-global-error-","duration":586,"timestamp":366247400635,"id":108,"parentId":103,"tags":{},"startTime":1778737733225,"traceId":"fd1b91f91c363a76"}]
2
+ [{"name":"static-generation","duration":625460,"timestamp":366246779744,"id":103,"parentId":1,"tags":{},"startTime":1778737732604,"traceId":"fd1b91f91c363a76"},{"name":"write-routes-manifest","duration":469,"timestamp":366247405365,"id":109,"parentId":1,"tags":{},"startTime":1778737733230,"traceId":"fd1b91f91c363a76"},{"name":"print-tree-view","duration":4625,"timestamp":366247418469,"id":110,"parentId":1,"tags":{},"startTime":1778737733243,"traceId":"fd1b91f91c363a76"},{"name":"write-route-bundle-stats","duration":13806,"timestamp":366247423135,"id":111,"parentId":1,"tags":{},"startTime":1778737733248,"traceId":"fd1b91f91c363a76"},{"name":"telemetry-flush","duration":50385,"timestamp":366247436979,"id":112,"parentId":1,"tags":{},"startTime":1778737733262,"traceId":"fd1b91f91c363a76"},{"name":"next-build","duration":19278235,"timestamp":366228209172,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778737714034,"traceId":"fd1b91f91c363a76"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":8455214,"timestamp":364598081566,"id":14,"parentId":1,"tags":{},"startTime":1778736083906,"traceId":"54b331ea1974c723"},{"name":"turbopack-build-events","duration":97,"timestamp":364598373944,"id":15,"parentId":1,"tags":{},"startTime":1778736084199,"traceId":"54b331ea1974c723"},{"name":"run-typescript","duration":8319092,"timestamp":364606551649,"id":16,"parentId":1,"tags":{},"startTime":1778736092376,"traceId":"54b331ea1974c723"},{"name":"static-check","duration":599039,"timestamp":364614952627,"id":19,"parentId":1,"tags":{},"startTime":1778736100777,"traceId":"54b331ea1974c723"},{"name":"static-generation","duration":796063,"timestamp":364615567106,"id":103,"parentId":1,"tags":{},"startTime":1778736101392,"traceId":"54b331ea1974c723"},{"name":"telemetry-flush","duration":51317,"timestamp":364616395966,"id":112,"parentId":1,"tags":{},"startTime":1778736102221,"traceId":"54b331ea1974c723"},{"name":"next-build","duration":18562732,"timestamp":364597884594,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778736083709,"traceId":"54b331ea1974c723"}]
1
+ [{"name":"run-turbopack","duration":8793134,"timestamp":366228408363,"id":14,"parentId":1,"tags":{},"startTime":1778737714233,"traceId":"fd1b91f91c363a76"},{"name":"turbopack-build-events","duration":86,"timestamp":366228696892,"id":15,"parentId":1,"tags":{},"startTime":1778737714522,"traceId":"fd1b91f91c363a76"},{"name":"run-typescript","duration":8889728,"timestamp":366237211589,"id":16,"parentId":1,"tags":{},"startTime":1778737723036,"traceId":"fd1b91f91c363a76"},{"name":"static-check","duration":576811,"timestamp":366246190561,"id":19,"parentId":1,"tags":{},"startTime":1778737732015,"traceId":"fd1b91f91c363a76"},{"name":"static-generation","duration":625460,"timestamp":366246779744,"id":103,"parentId":1,"tags":{},"startTime":1778737732604,"traceId":"fd1b91f91c363a76"},{"name":"telemetry-flush","duration":50385,"timestamp":366247436979,"id":112,"parentId":1,"tags":{},"startTime":1778737733262,"traceId":"fd1b91f91c363a76"},{"name":"next-build","duration":19278235,"timestamp":366228209172,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778737714034,"traceId":"fd1b91f91c363a76"}]
@@ -167,56 +167,98 @@ export function EmptyState({ variant = 'generic', title, sub, cta, compact = fal
167
167
  );
168
168
  }
169
169
 
170
+ /** Round 105 (issue #90): centered card shell so the Overview empty state
171
+ * reads as an intentional, layout-aligned card instead of bare text
172
+ * floating in the content column. */
173
+ function EmptyCard({ children }: { children: React.ReactNode }) {
174
+ return (
175
+ <div className="max-w-2xl mx-auto rounded-xl border border-[#2a2a4a] bg-[#111128] shadow-lg shadow-black/20">
176
+ {children}
177
+ </div>
178
+ );
179
+ }
180
+
170
181
  /**
171
- * Overview-specific variant with a hint about cross-network global count.
172
- * Kept here so /app/page.tsx can drop in without ceremony.
182
+ * Overview-specific variant. Three cases:
183
+ * 1. network-mismatch agents exist globally, none in this network
184
+ * 2. agents-offline — 0 registered now BUT task history exists, so this
185
+ * is NOT a first run (round 105 / issue #90: showing "Spin up your
186
+ * first agent" next to "acked: 499" was misleading)
187
+ * 3. true first-run — 0 agents, 0 history → quickstart command
173
188
  */
174
- export function NodesEmptyState({ hint }: { hint?: { global_count?: number; filtered_network?: string } }) {
189
+ export function NodesEmptyState({
190
+ hint,
191
+ taskHistoryCount = 0,
192
+ }: {
193
+ hint?: { global_count?: number; filtered_network?: string };
194
+ taskHistoryCount?: number;
195
+ }) {
175
196
  if (hint?.global_count) {
176
197
  return (
177
- <EmptyState
178
- variant="nodes"
179
- title="No agents in this network"
180
- sub={`Server has ${hint.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}
181
- />
198
+ <EmptyCard>
199
+ <EmptyState
200
+ variant="nodes"
201
+ title="No agents in this network"
202
+ sub={`Server has ${hint.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}
203
+ />
204
+ </EmptyCard>
182
205
  );
183
206
  }
207
+
208
+ // Round 105 (issue #90): there's task history but no agents online right
209
+ // now — they finished or disconnected. Don't pitch a first-run setup;
210
+ // point at the history instead.
211
+ if (taskHistoryCount > 0) {
212
+ return (
213
+ <EmptyCard>
214
+ <EmptyState
215
+ variant="nodes"
216
+ title="No agents online"
217
+ sub={`Every agent in this network is currently offline. ${taskHistoryCount.toLocaleString()} task${taskHistoryCount === 1 ? '' : 's'} in history — they may have finished their work or disconnected.`}
218
+ cta={{ label: 'View task history', href: '/tasks' }}
219
+ />
220
+ </EmptyCard>
221
+ );
222
+ }
223
+
184
224
  // Round 52: true empty state (zero agents anywhere) — show the
185
225
  // quickstart command inline so users don't have to leave the dashboard
186
226
  // to figure out how to spin up their first agent.
187
227
  return (
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>
228
+ <EmptyCard>
229
+ <div className="text-center py-16 px-4" role="status">
230
+ <div className="anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500" aria-hidden>
231
+ <svg viewBox="0 0 64 64" width={56} height={56}>
232
+ <g stroke="currentColor" strokeWidth="1.5" fill="none">
233
+ <rect x="10" y="20" width="44" height="28" rx="2" />
234
+ <rect x="20" y="32" width="6" height="8" opacity="0.5" />
235
+ <rect x="32" y="32" width="6" height="8" opacity="0.5" />
236
+ <rect x="44" y="32" width="4" height="8" opacity="0.5" />
237
+ <line x1="10" y1="26" x2="54" y2="26" opacity="0.4" />
238
+ <circle cx="14" cy="23" r="0.8" fill="currentColor" />
239
+ </g>
240
+ </svg>
241
+ </div>
242
+ <h3 className="font-medium text-gray-300 text-base">Spin up your first agent</h3>
243
+ <p className="text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed">
244
+ Run this in a fresh terminal to register an agent with this CommHub:
245
+ </p>
246
+ <div className="mt-4 inline-block">
247
+ <QuickstartCommand cmd="npx --yes @sleep2agi/agent-network init" />
248
+ </div>
249
+ <div className="mt-3">
250
+ <a
251
+ href="https://anet.sh"
252
+ target="_blank"
253
+ rel="noopener noreferrer"
254
+ className="inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300"
255
+ >
256
+ Full quickstart guide
257
+ <span aria-hidden>→</span>
258
+ </a>
259
+ </div>
218
260
  </div>
219
- </div>
261
+ </EmptyCard>
220
262
  );
221
263
  }
222
264
 
@@ -223,6 +223,38 @@ function useBrand(): string | null {
223
223
  return brand;
224
224
  }
225
225
 
226
+ /** Round 106 (issue #83): cluster agents by shared alias prefix so a team
227
+ * reads as one unit in the topology. Adjacent (sorted) aliases that share
228
+ * a ≥2-char prefix join the same group; the group key is the prefix common
229
+ * to every member. Singletons map to their own alias (no hue shift). The
230
+ * group key feeds aliasAvatarColors() so e.g. all 通信* nodes get one hue,
231
+ * all 研究员* another — the "同色相 tint" clustering option from #83. */
232
+ function commonPrefix(a: string, b: string): string {
233
+ let i = 0;
234
+ while (i < a.length && i < b.length && a[i] === b[i]) i++;
235
+ return a.slice(0, i);
236
+ }
237
+
238
+ function computeGroupKeys(aliases: string[]): Record<string, string> {
239
+ const sorted = [...aliases].sort((a, b) => a.localeCompare(b));
240
+ const keys: Record<string, string> = {};
241
+ let i = 0;
242
+ while (i < sorted.length) {
243
+ let j = i;
244
+ let prefix = sorted[i];
245
+ while (j + 1 < sorted.length) {
246
+ const lcp = commonPrefix(prefix, sorted[j + 1]);
247
+ if (lcp.length < 2) break;
248
+ prefix = lcp;
249
+ j++;
250
+ }
251
+ const key = j > i ? prefix : sorted[i];
252
+ for (let k = i; k <= j; k++) keys[sorted[k]] = key;
253
+ i = j + 1;
254
+ }
255
+ return keys;
256
+ }
257
+
226
258
  function buildFlowLinks(messages: MessageFlow[], positions: Record<string, Point>) {
227
259
  const links = new Map<string, FlowLink>();
228
260
 
@@ -282,11 +314,18 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
282
314
  nodePositions,
283
315
  flowLinks,
284
316
  activeAliases,
317
+ groupKeys,
285
318
  } = useMemo(() => {
286
319
  const sseCount = (s: { alias: string; network_id?: string }) =>
287
320
  (s.network_id ? sseSessions[`${s.network_id}:${s.alias}`] : undefined) ?? sseSessions[s.alias];
288
- const online = sessions.filter(s => s.status !== 'offline' || sseCount(s));
289
- const offline = sessions.filter(s => s.status === 'offline' && !sseCount(s));
321
+ // Round 106 (issue #83): sort by alias so same-prefix agents
322
+ // (通信龙 / 通信牛 / 通信工程马 …, or 研究员1号 / 研究员2号 …) end up
323
+ // adjacent in the array — the tier layout below assigns angles by
324
+ // index, so contiguous-in-array becomes contiguous-in-ring, i.e.
325
+ // each team visually clusters. localeCompare keeps CJK ordering sane.
326
+ const byAlias = (a: Session, b: Session) => a.alias.localeCompare(b.alias);
327
+ const online = sessions.filter(s => s.status !== 'offline' || sseCount(s)).sort(byAlias);
328
+ const offline = sessions.filter(s => s.status === 'offline' && !sseCount(s)).sort(byAlias);
290
329
  const positions: Record<string, Point> = {};
291
330
 
292
331
  // Round 97 (issue #50) + 98 (issue #61): three layout modes by N.
@@ -355,12 +394,16 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
355
394
  active.add(link.to);
356
395
  });
357
396
 
397
+ // Round 106 (issue #83): group key per alias → shared hue per team.
398
+ const groupKeys = computeGroupKeys([...online, ...offline].map(s => s.alias));
399
+
358
400
  return {
359
401
  onlineNodes: online,
360
402
  offlineNodes: offline,
361
403
  nodePositions: positions,
362
404
  flowLinks: links,
363
405
  activeAliases: active,
406
+ groupKeys,
364
407
  };
365
408
  }, [messages, sessions, sseSessions]);
366
409
 
@@ -806,7 +849,11 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
806
849
  />
807
850
  );
808
851
  }
809
- const c = aliasAvatarColors(session.alias);
852
+ // Round 106 (issue #83): hue keyed to the prefix group,
853
+ // not the full alias — every 通信* node shares one color,
854
+ // every 研究员* another, so teams cluster visually even
855
+ // when the tier layout spreads them across rings.
856
+ const c = aliasAvatarColors(groupKeys[session.alias] || session.alias);
810
857
  const fs = isOnline ? 14 : 10;
811
858
  return (
812
859
  <>
package/app/page.tsx CHANGED
@@ -372,7 +372,10 @@ export default function Dashboard() {
372
372
  {showTopo && sessions.length > 0 && <TopoGraph sessions={sessions} sseSessions={sseSessions} />}
373
373
 
374
374
  {sessions.length === 0 && !sessError ? (
375
- <EmptyState hint={sessHint} />
375
+ <EmptyState
376
+ hint={sessHint}
377
+ taskHistoryCount={Object.values(taskStats).reduce((a, b) => a + b, 0)}
378
+ />
376
379
  ) : (() => {
377
380
  const counts = {
378
381
  all: sortedSessions.length,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.5-preview.87",
3
+ "version": "0.4.5-preview.89",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,41 @@
1
+ import { chromium } from 'playwright';
2
+ const TOKEN = process.env.LOOP_REVIEW_TOKEN;
3
+ const browser = await chromium.launch({ headless: true });
4
+
5
+ async function shoot(name, { emptyStats }) {
6
+ const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
7
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
8
+ await ctx.addInitScript(() => { try { localStorage.setItem('anet-theme','cyber'); sessionStorage.setItem('anet_v3_auth','1'); } catch {} });
9
+ // force 0 sessions
10
+ await ctx.route('**/api/hub/status*', async (route) => {
11
+ const r = await route.fetch(); const b = await r.json();
12
+ await route.fulfill({ response: r, json: { ...b, sessions: [] } });
13
+ });
14
+ if (emptyStats) {
15
+ // also zero out task history → true first-run
16
+ await ctx.route('**/api/hub/stats*', async (route) => {
17
+ const r = await route.fetch(); const b = await r.json();
18
+ await route.fulfill({ response: r, json: { ...b, tasks: { by_status: [] } } });
19
+ });
20
+ await ctx.route('**/api/hub/tasks*', async (route) => {
21
+ const r = await route.fetch(); const b = await r.json();
22
+ await route.fulfill({ response: r, json: { ...b, tasks: [] } });
23
+ });
24
+ }
25
+ const page = await ctx.newPage();
26
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
27
+ await page.waitForTimeout(3000);
28
+ // find the empty-state card text
29
+ const txt = await page.evaluate(() => {
30
+ const h3 = [...document.querySelectorAll('h3')].map(h => h.textContent?.trim());
31
+ return h3.filter(t => /agent/i.test(t || ''));
32
+ });
33
+ console.log(name, '→ empty-state headline(s):', JSON.stringify(txt));
34
+ await page.screenshot({ path: `/tmp/anet-issue-50/empty-${name}.png`, fullPage: true });
35
+ await ctx.close();
36
+ }
37
+
38
+ await shoot('with-history', { emptyStats: false }); // 0 sessions, real task history → "No agents online"
39
+ await shoot('true-firstrun', { emptyStats: true }); // 0 sessions, 0 tasks → "Spin up your first agent"
40
+ await browser.close();
41
+ console.log('done');
@@ -0,0 +1,41 @@
1
+ import { chromium } from 'playwright';
2
+ const TOKEN = process.env.LOOP_REVIEW_TOKEN;
3
+ const browser = await chromium.launch({ headless: true });
4
+ const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
5
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
6
+ await ctx.addInitScript(() => { try { localStorage.setItem('anet-theme','cyber'); localStorage.removeItem('anet-topo-view'); sessionStorage.setItem('anet_v3_auth','1'); } catch {} });
7
+ const page = await ctx.newPage();
8
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
9
+ await page.waitForFunction(() => {
10
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
11
+ return !!svg && svg.querySelectorAll('circle[r="26"]').length > 0;
12
+ }, { timeout: 30000 }).catch(() => {});
13
+ await page.waitForTimeout(800);
14
+ const ordered = await page.evaluate(() => {
15
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
16
+ const cx = 500, cy = 330;
17
+ // each agent node <g> contains: status-ring circle[r=26|18] + a label <g> with the alias text
18
+ const nodeGs = [...svg.querySelectorAll('g')].filter(g => {
19
+ return g.querySelector(':scope > circle[r="26"], :scope > circle[r="18"]') &&
20
+ g.querySelector(':scope > g > text[font-weight="700"]');
21
+ });
22
+ const nodes = nodeGs.map(g => {
23
+ const ring = g.querySelector(':scope > circle[r="26"], :scope > circle[r="18"]');
24
+ const label = g.querySelector(':scope > g > text[font-weight="700"]');
25
+ const x = parseFloat(ring.getAttribute('cx')), y = parseFloat(ring.getAttribute('cy'));
26
+ return { alias: label.textContent.trim(), ang: Math.atan2(y - cy, x - cx) };
27
+ });
28
+ nodes.sort((a, b) => a.ang - b.ang);
29
+ return nodes.map(n => n.alias);
30
+ });
31
+ console.log('node count:', ordered.length);
32
+ console.log('ring order (by angle):');
33
+ console.log(ordered.join(' · '));
34
+ // check 通信* contiguity
35
+ const tx = ordered.map((a, i) => a.startsWith('通信') ? i : -1).filter(i => i >= 0);
36
+ const contiguous = tx.length === 0 || tx.every((v, i) => i === 0 || v === tx[i-1] + 1) ||
37
+ // allow wrap-around contiguity
38
+ (() => { const n = ordered.length; const set = new Set(tx); for (let s = 0; s < n; s++) { let ok = true; for (let k = 0; k < tx.length; k++) if (!set.has((s + k) % n)) { ok = false; break; } if (ok) return true; } return false; })();
39
+ console.log('通信* indices:', tx.join(','), '→ contiguous:', contiguous);
40
+ await browser.close();
41
+ console.log('done');
@@ -0,0 +1,37 @@
1
+ import { chromium } from 'playwright';
2
+ const TOKEN = process.env.LOOP_REVIEW_TOKEN;
3
+ const browser = await chromium.launch({ headless: true });
4
+ const ctx = await browser.newContext({ viewport: { width: 1440, height: 900 } });
5
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
6
+ await ctx.addInitScript(() => { try { localStorage.setItem('anet-theme','cyber'); localStorage.removeItem('anet-topo-view'); sessionStorage.setItem('anet_v3_auth','1'); } catch {} });
7
+ const page = await ctx.newPage();
8
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
9
+ await page.waitForFunction(() => {
10
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
11
+ return !!svg && svg.querySelectorAll('circle[r="26"]').length > 0;
12
+ }, { timeout: 30000 }).catch(() => {});
13
+ await page.waitForTimeout(800);
14
+ // for each node: alias + avatar bg fill — same prefix should share fill
15
+ const map = await page.evaluate(() => {
16
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
17
+ const nodeGs = [...svg.querySelectorAll('g')].filter(g =>
18
+ g.querySelector(':scope > circle[r="26"], :scope > circle[r="18"]') &&
19
+ g.querySelector(':scope > g > text[font-weight="700"]'));
20
+ return nodeGs.map(g => {
21
+ const label = g.querySelector(':scope > g > text[font-weight="700"]').textContent.trim();
22
+ // avatar bg circle: the small circle that is NOT the status ring (r 26/18) and NOT inner — it's r=14/10 with a fill
23
+ const avatarCircle = [...g.querySelectorAll(':scope > circle')].find(c => {
24
+ const r = parseFloat(c.getAttribute('r'));
25
+ return (r === 14 || r === 10) && c.getAttribute('fill') && c.getAttribute('fill').startsWith('hsl');
26
+ });
27
+ return { alias: label, fill: avatarCircle ? avatarCircle.getAttribute('fill') : null };
28
+ });
29
+ });
30
+ // group by fill
31
+ const byFill = {};
32
+ map.forEach(({alias, fill}) => { (byFill[fill] ??= []).push(alias); });
33
+ console.log('avatar fill → aliases:');
34
+ Object.entries(byFill).forEach(([fill, aliases]) => console.log(' ' + fill + ': ' + aliases.join(', ')));
35
+ await page.locator('section:has(h2:text("Command mesh"))').screenshot({ path: '/tmp/anet-issue-50/topo-grouped.png' });
36
+ await browser.close();
37
+ console.log('done');
@@ -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`},"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`}])},95356,e=>{"use strict";var t=e.i(18050),s=e.i(71645),a=e.i(22016);let r={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 n({variant:e,size:s}){let a={width:s,height:s},r={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",...a,children:(0,t.jsxs)("g",{...r,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",...a,children:(0,t.jsxs)("g",{...r,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",...a,children:(0,t.jsxs)("g",{...r,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",...a,children:(0,t.jsxs)("g",{...r,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",...a,children:(0,t.jsxs)("g",{...r,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",...a,children:(0,t.jsxs)("g",{...r,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",...a,children:(0,t.jsxs)("g",{...r,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 i({variant:e="generic",title:s,sub:o,cta:l,compact:c=!1}){let x=r[e],d=s??x.title,h=o??x.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)(n,{variant:e,size:c?40:56})}),(0,t.jsx)("h3",{className:`font-medium text-gray-300 ${c?"text-sm":"text-base"}`,children:d}),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}),l&&(0,t.jsx)("div",{className:"mt-4",children:l.href?(0,t.jsxs)(a.default,{href:l.href,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[l.label,(0,t.jsx)("span",{"aria-hidden":!0,children:"→"})]}):(0,t.jsxs)("button",{onClick:l.onClick,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[l.label,(0,t.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}function o({cmd:e}){let[a,r]=(0,s.useState)(!1),n=async()=>{try{await navigator.clipboard.writeText(e),r(!0),setTimeout(()=>r(!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:n,"aria-label":a?"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:a?(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,i,"NodesEmptyState",0,function({hint:e}){return e?.global_count?(0,t.jsx)(i,{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)(o,{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:"→"})]})})]})}])},28523,e=>{"use strict";var t=e.i(18050),s=e.i(71645),a=e.i(22016),r=e.i(18150),n=e.i(95356);e.s(["default",0,function(){let[e,i]=(0,s.useState)([]),[o,l]=(0,s.useState)(!0),[c,x]=(0,s.useState)(""),[d,h]=(0,s.useState)({}),m=(0,s.useCallback)(async()=>{try{let e=await fetch("/api/hub/tokens"),t=await e.json();i(t.tokens||[])}catch{}finally{l(!1)}},[]);(0,s.useEffect)(()=>{m()},[m]);let y=async()=>{if(c.trim())try{let e=sessionStorage.getItem("anet_v3_auth");if(!e)return;let{token:t}=JSON.parse(e),s=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"create_token",token:t,name:c})}),a=await s.json();a.ok?(h({token:a.token}),x(""),m()):h({error:a.error})}catch{h({error:"Failed"})}},g=async e=>{try{let t=sessionStorage.getItem("anet_v3_auth");if(!t)return;let{token:s}=JSON.parse(t);await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"revoke_token",token:s,token_id:e})}),m()}catch{}};return(0,t.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,t.jsxs)("div",{className:"flex items-center gap-4 mb-6",children:[(0,t.jsx)(a.default,{href:"/settings",className:"text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10",children:"← Settings"}),(0,t.jsx)("h1",{className:"text-2xl font-bold text-white",children:"API Tokens"})]}),(0,t.jsxs)("div",{className:"max-w-2xl space-y-6",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-3",children:"Create Token"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("input",{type:"text",value:c,onChange:e=>x(e.target.value),placeholder:"Token name (e.g. my-cli)",className:"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,t.jsx)("button",{onClick:y,disabled:!c.trim(),className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors",children:"Create"})]}),d.token&&(0,t.jsxs)("div",{className:"mt-3 bg-green-500/5 border border-green-500/20 rounded-lg px-3 py-2",children:[(0,t.jsx)("div",{className:"text-xs text-green-400 mb-1",children:"Token created (copy now, shown only once):"}),(0,t.jsx)("code",{className:"text-sm text-green-300 break-all select-all",children:d.token})]}),d.error&&(0,t.jsx)("div",{className:"mt-2 text-xs text-red-400",children:d.error})]}),(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-3",children:["Active Tokens (",e.length,")"]}),o?(0,t.jsx)("div",{className:"animate-pulse space-y-2",children:[1,2].map(e=>(0,t.jsx)("div",{className:"h-12 bg-gray-800/20 rounded"},e))}):0===e.length?(0,t.jsx)(n.EmptyState,{variant:"tokens",compact:!0,sub:"Tokens authenticate CLI tools and external integrations. Sign in with V3 auth, then create one above."}):(0,t.jsx)("div",{className:"space-y-2",children:e.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",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm text-white font-medium",children:e.name}),(0,t.jsx)("span",{className:`text-[10px] px-1.5 py-0.5 rounded border ${"full"===e.scope?"text-cyan-300 border-cyan-500/20 bg-cyan-500/5":"text-gray-400 border-gray-600/20"}`,children:e.scope})]}),(0,t.jsxs)("div",{className:"text-[10px] text-gray-500",children:[e.token_id," · network: ",e.network_id?.slice(0,12)||"--"," · used ",(0,r.timeAgo)(e.last_used_at)]})]}),(0,t.jsx)("button",{onClick:()=>g(e.token_id),className:"text-xs text-red-400 hover:text-red-300 px-2 py-1 rounded border border-red-800/30 hover:bg-red-500/10 transition-colors",children:"Revoke"})]},e.token_id))})]})]})]})}])}]);