@sleep2agi/agent-network-dashboard 0.4.6-preview.254 → 0.4.6-preview.256

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 (141) 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 +4 -4
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/settings/tokens.html +1 -1
  96. package/.next/server/app/settings/tokens.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  104. package/.next/server/app/settings.html +2 -2
  105. package/.next/server/app/settings.rsc +2 -2
  106. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  111. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/tasks.html +1 -1
  113. package/.next/server/app/tasks.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  120. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  126. package/.next/server/middleware-build-manifest.js +3 -3
  127. package/.next/server/pages/404.html +1 -1
  128. package/.next/server/pages/500.html +1 -1
  129. package/.next/static/chunks/{0vnfrj3ndo1c-.js → 03d-r-pr67wu-.js} +1 -1
  130. package/.next/static/chunks/{11nkwgn-q0l5i.js → 0ljcve1vb.~w4.js} +1 -1
  131. package/.next/static/chunks/0uw2wqi73vdi2.js +4 -0
  132. package/.next/trace +2 -2
  133. package/.next/trace-build +1 -1
  134. package/app/components/TopoGraph.tsx +59 -11
  135. package/package.json +1 -1
  136. package/scripts/topo-chrome-pop-extension-test.mjs +98 -0
  137. package/scripts/topo-groupbox-hubcore-ease-test.mjs +106 -0
  138. package/.next/static/chunks/057.5yv578zn_.js +0 -4
  139. /package/.next/static/{0hZTVyxUAVE3P-SPCsfBZ → 9ntdyOJUtEyVYw1JfVat1}/_buildManifest.js +0 -0
  140. /package/.next/static/{0hZTVyxUAVE3P-SPCsfBZ → 9ntdyOJUtEyVYw1JfVat1}/_clientMiddlewareManifest.js +0 -0
  141. /package/.next/static/{0hZTVyxUAVE3P-SPCsfBZ → 9ntdyOJUtEyVYw1JfVat1}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":407,"timestamp":91771678731,"id":4,"parentId":1,"tags":{},"startTime":1778899743925,"traceId":"d1877b7828307ffe"},{"name":"load-custom-routes","duration":603,"timestamp":91771679317,"id":5,"parentId":1,"tags":{},"startTime":1778899743926,"traceId":"d1877b7828307ffe"},{"name":"create-dist-dir","duration":869,"timestamp":91771679985,"id":6,"parentId":1,"tags":{},"startTime":1778899743926,"traceId":"d1877b7828307ffe"},{"name":"clean","duration":32902,"timestamp":91771681625,"id":7,"parentId":1,"tags":{},"startTime":1778899743928,"traceId":"d1877b7828307ffe"},{"name":"discover-routes","duration":11502,"timestamp":91771801967,"id":8,"parentId":1,"tags":{},"startTime":1778899744048,"traceId":"d1877b7828307ffe"},{"name":"create-root-mapping","duration":176,"timestamp":91771813556,"id":9,"parentId":1,"tags":{},"startTime":1778899744060,"traceId":"d1877b7828307ffe"},{"name":"generate-route-types","duration":36159,"timestamp":91771817098,"id":10,"parentId":1,"tags":{},"startTime":1778899744063,"traceId":"d1877b7828307ffe"},{"name":"public-dir-conflict-check","duration":107,"timestamp":91771853359,"id":11,"parentId":1,"tags":{},"startTime":1778899744100,"traceId":"d1877b7828307ffe"},{"name":"generate-routes-manifest","duration":5475,"timestamp":91771853592,"id":12,"parentId":1,"tags":{},"startTime":1778899744100,"traceId":"d1877b7828307ffe"},{"name":"run-turbopack","duration":5797104,"timestamp":91771864837,"id":14,"parentId":1,"tags":{},"startTime":1778899744111,"traceId":"d1877b7828307ffe"},{"name":"turbopack-build-events","duration":79,"timestamp":91772161683,"id":15,"parentId":1,"tags":{},"startTime":1778899744408,"traceId":"d1877b7828307ffe"},{"name":"run-typescript","duration":9529507,"timestamp":91777673048,"id":16,"parentId":1,"tags":{},"startTime":1778899749919,"traceId":"d1877b7828307ffe"},{"name":"generate-required-server-files","duration":2275,"timestamp":91787203493,"id":18,"parentId":1,"tags":{},"startTime":1778899759450,"traceId":"d1877b7828307ffe"},{"name":"check-static-error-page","duration":11098,"timestamp":91787416346,"id":20,"parentId":19,"tags":{},"startTime":1778899759663,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":470657,"timestamp":91787429835,"id":63,"parentId":22,"tags":{},"startTime":1778899759676,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":481251,"timestamp":91787419402,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778899759666,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":631319,"timestamp":91787430378,"id":67,"parentId":28,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":639113,"timestamp":91787422696,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":634457,"timestamp":91787429920,"id":64,"parentId":25,"tags":{},"startTime":1778899759676,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":642123,"timestamp":91787422319,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":636205,"timestamp":91787430130,"id":66,"parentId":27,"tags":{},"startTime":1778899759676,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":643804,"timestamp":91787422592,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":636568,"timestamp":91787430827,"id":70,"parentId":32,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":644123,"timestamp":91787423324,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":643283,"timestamp":91787430993,"id":73,"parentId":35,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":650784,"timestamp":91787423553,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":649607,"timestamp":91787431125,"id":74,"parentId":36,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":656900,"timestamp":91787423894,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":654708,"timestamp":91787431158,"id":75,"parentId":37,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":661923,"timestamp":91787423997,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":660935,"timestamp":91787431185,"id":76,"parentId":38,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":668092,"timestamp":91787424112,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":665963,"timestamp":91787430658,"id":69,"parentId":30,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":673746,"timestamp":91787422941,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":667214,"timestamp":91787431195,"id":77,"parentId":39,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":674289,"timestamp":91787424167,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":671853,"timestamp":91787431216,"id":79,"parentId":41,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":678835,"timestamp":91787424281,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":683892,"timestamp":91787431225,"id":80,"parentId":42,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":690854,"timestamp":91787424334,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":688020,"timestamp":91787431235,"id":81,"parentId":43,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":694978,"timestamp":91787424383,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":692614,"timestamp":91787431244,"id":82,"parentId":44,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":699473,"timestamp":91787424431,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":693124,"timestamp":91787430966,"id":72,"parentId":34,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":700639,"timestamp":91787423486,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":697586,"timestamp":91787431254,"id":83,"parentId":45,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":704416,"timestamp":91787424482,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":700332,"timestamp":91787431206,"id":78,"parentId":40,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":707349,"timestamp":91787424231,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":702787,"timestamp":91787431273,"id":85,"parentId":47,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":709508,"timestamp":91787424597,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":716291,"timestamp":91787429561,"id":62,"parentId":21,"tags":{},"startTime":1778899759676,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":728042,"timestamp":91787417866,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778899759664,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":717160,"timestamp":91787430891,"id":71,"parentId":33,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":724685,"timestamp":91787423419,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778899759670,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":718743,"timestamp":91787430530,"id":68,"parentId":29,"tags":{},"startTime":1778899759677,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":726503,"timestamp":91787422814,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":721802,"timestamp":91787431264,"id":84,"parentId":46,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":728581,"timestamp":91787424531,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":725902,"timestamp":91787431293,"id":87,"parentId":49,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":732558,"timestamp":91787424698,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":728631,"timestamp":91787430018,"id":65,"parentId":26,"tags":{},"startTime":1778899759676,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":736210,"timestamp":91787422488,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":728142,"timestamp":91787442573,"id":89,"parentId":31,"tags":{},"startTime":1778899759689,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":747707,"timestamp":91787423075,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778899759669,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":804370,"timestamp":91787431283,"id":86,"parentId":48,"tags":{},"startTime":1778899759678,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":811081,"timestamp":91787424650,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":820917,"timestamp":91787444896,"id":92,"parentId":51,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":840799,"timestamp":91787425086,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":835683,"timestamp":91787438081,"id":88,"parentId":24,"tags":{},"startTime":1778899759684,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":853974,"timestamp":91787419859,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778899759666,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":852898,"timestamp":91787444950,"id":97,"parentId":57,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":871509,"timestamp":91787426403,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778899759673,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":859217,"timestamp":91787444938,"id":96,"parentId":56,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":877992,"timestamp":91787426246,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778899759673,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":865456,"timestamp":91787444907,"id":93,"parentId":52,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":885214,"timestamp":91787425206,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":873352,"timestamp":91787444960,"id":98,"parentId":59,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":891512,"timestamp":91787426872,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778899759673,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":875344,"timestamp":91787444974,"id":99,"parentId":60,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":893355,"timestamp":91787427033,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778899759673,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":876794,"timestamp":91787444917,"id":94,"parentId":53,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":896424,"timestamp":91787425339,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778899759672,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":880152,"timestamp":91787444989,"id":100,"parentId":61,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":898079,"timestamp":91787427185,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778899759673,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":880723,"timestamp":91787444884,"id":91,"parentId":50,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":900684,"timestamp":91787424966,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778899759671,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":866990,"timestamp":91787458769,"id":101,"parentId":58,"tags":{},"startTime":1778899759705,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":899267,"timestamp":91787426522,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778899759673,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":883525,"timestamp":91787444856,"id":90,"parentId":23,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":908784,"timestamp":91787419653,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778899759666,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":853609,"timestamp":91787474924,"id":102,"parentId":55,"tags":{},"startTime":1778899759721,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":902858,"timestamp":91787425708,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778899759672,"traceId":"d1877b7828307ffe"},{"name":"is-page-static","duration":903359,"timestamp":91787444927,"id":95,"parentId":54,"tags":{},"startTime":1778899759691,"traceId":"d1877b7828307ffe"},{"name":"check-page","duration":922884,"timestamp":91787425488,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778899759672,"traceId":"d1877b7828307ffe"},{"name":"static-check","duration":933236,"timestamp":91787415331,"id":19,"parentId":1,"tags":{},"startTime":1778899759662,"traceId":"d1877b7828307ffe"},{"name":"write-routes-manifest","duration":593,"timestamp":91788358298,"id":104,"parentId":1,"tags":{},"startTime":1778899760605,"traceId":"d1877b7828307ffe"},{"name":"load-dotenv","duration":65,"timestamp":91788372827,"id":107,"parentId":106,"tags":{},"startTime":1778899760619,"traceId":"d1877b7828307ffe"},{"name":"run-export-path-map","duration":831,"timestamp":91788376193,"id":108,"parentId":106,"tags":{},"startTime":1778899760622,"traceId":"d1877b7828307ffe"},{"name":"next-export","duration":630047,"timestamp":91788371118,"id":106,"parentId":1,"tags":{},"startTime":1778899760617,"traceId":"d1877b7828307ffe"}]
2
- [{"name":"move-exported-app-not-found-","duration":2677,"timestamp":91789005110,"id":109,"parentId":105,"tags":{},"startTime":1778899761251,"traceId":"d1877b7828307ffe"},{"name":"move-exported-app-global-error-","duration":572,"timestamp":91789007870,"id":110,"parentId":105,"tags":{},"startTime":1778899761254,"traceId":"d1877b7828307ffe"},{"name":"static-generation","duration":646476,"timestamp":91788364169,"id":105,"parentId":1,"tags":{},"startTime":1778899760610,"traceId":"d1877b7828307ffe"},{"name":"write-routes-manifest","duration":458,"timestamp":91789010825,"id":111,"parentId":1,"tags":{},"startTime":1778899761257,"traceId":"d1877b7828307ffe"},{"name":"print-tree-view","duration":5683,"timestamp":91789028996,"id":112,"parentId":1,"tags":{},"startTime":1778899761275,"traceId":"d1877b7828307ffe"},{"name":"write-route-bundle-stats","duration":14258,"timestamp":91789034720,"id":113,"parentId":1,"tags":{},"startTime":1778899761281,"traceId":"d1877b7828307ffe"},{"name":"telemetry-flush","duration":28914,"timestamp":91789049042,"id":114,"parentId":1,"tags":{},"startTime":1778899761295,"traceId":"d1877b7828307ffe"},{"name":"next-build","duration":17454367,"timestamp":91771623627,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778899743870,"traceId":"d1877b7828307ffe"}]
1
+ [{"name":"generate-buildid","duration":304,"timestamp":92554569846,"id":4,"parentId":1,"tags":{},"startTime":1778900526816,"traceId":"9a17790898a38791"},{"name":"load-custom-routes","duration":678,"timestamp":92554570356,"id":5,"parentId":1,"tags":{},"startTime":1778900526817,"traceId":"9a17790898a38791"},{"name":"create-dist-dir","duration":927,"timestamp":92554571103,"id":6,"parentId":1,"tags":{},"startTime":1778900526817,"traceId":"9a17790898a38791"},{"name":"clean","duration":29889,"timestamp":92554572707,"id":7,"parentId":1,"tags":{},"startTime":1778900526819,"traceId":"9a17790898a38791"},{"name":"discover-routes","duration":11259,"timestamp":92554687138,"id":8,"parentId":1,"tags":{},"startTime":1778900526933,"traceId":"9a17790898a38791"},{"name":"create-root-mapping","duration":167,"timestamp":92554698469,"id":9,"parentId":1,"tags":{},"startTime":1778900526945,"traceId":"9a17790898a38791"},{"name":"generate-route-types","duration":39148,"timestamp":92554701092,"id":10,"parentId":1,"tags":{},"startTime":1778900526947,"traceId":"9a17790898a38791"},{"name":"public-dir-conflict-check","duration":146,"timestamp":92554740352,"id":11,"parentId":1,"tags":{},"startTime":1778900526987,"traceId":"9a17790898a38791"},{"name":"generate-routes-manifest","duration":6755,"timestamp":92554740678,"id":12,"parentId":1,"tags":{},"startTime":1778900526987,"traceId":"9a17790898a38791"},{"name":"run-turbopack","duration":6388335,"timestamp":92554753419,"id":14,"parentId":1,"tags":{},"startTime":1778900527000,"traceId":"9a17790898a38791"},{"name":"turbopack-build-events","duration":96,"timestamp":92555086787,"id":15,"parentId":1,"tags":{},"startTime":1778900527333,"traceId":"9a17790898a38791"},{"name":"run-typescript","duration":9397266,"timestamp":92561150969,"id":16,"parentId":1,"tags":{},"startTime":1778900533397,"traceId":"9a17790898a38791"},{"name":"generate-required-server-files","duration":2532,"timestamp":92570549566,"id":18,"parentId":1,"tags":{},"startTime":1778900542796,"traceId":"9a17790898a38791"},{"name":"check-static-error-page","duration":12059,"timestamp":92570751668,"id":20,"parentId":19,"tags":{},"startTime":1778900542998,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":447678,"timestamp":92570766298,"id":63,"parentId":22,"tags":{},"startTime":1778900543013,"traceId":"9a17790898a38791"},{"name":"check-page","duration":460304,"timestamp":92570753896,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778900543000,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":568854,"timestamp":92570768514,"id":69,"parentId":30,"tags":{},"startTime":1778900543015,"traceId":"9a17790898a38791"},{"name":"check-page","duration":579880,"timestamp":92570757585,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":573162,"timestamp":92570766390,"id":64,"parentId":25,"tags":{},"startTime":1778900543013,"traceId":"9a17790898a38791"},{"name":"check-page","duration":582746,"timestamp":92570756862,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778900543003,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":573616,"timestamp":92570767623,"id":65,"parentId":26,"tags":{},"startTime":1778900543014,"traceId":"9a17790898a38791"},{"name":"check-page","duration":584247,"timestamp":92570757042,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778900543003,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":574001,"timestamp":92570770584,"id":71,"parentId":33,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":586645,"timestamp":92570757985,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":575873,"timestamp":92570770674,"id":72,"parentId":34,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":588497,"timestamp":92570758099,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":612255,"timestamp":92570768152,"id":67,"parentId":28,"tags":{},"startTime":1778900543014,"traceId":"9a17790898a38791"},{"name":"check-page","duration":623174,"timestamp":92570757321,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":610191,"timestamp":92570770493,"id":70,"parentId":32,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":622816,"timestamp":92570757902,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":615188,"timestamp":92570765930,"id":62,"parentId":21,"tags":{},"startTime":1778900543012,"traceId":"9a17790898a38791"},{"name":"check-page","duration":628359,"timestamp":92570752809,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778900542999,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":612998,"timestamp":92570768350,"id":68,"parentId":29,"tags":{},"startTime":1778900543015,"traceId":"9a17790898a38791"},{"name":"check-page","duration":623935,"timestamp":92570757444,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":610815,"timestamp":92570770715,"id":73,"parentId":35,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":623374,"timestamp":92570758189,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":618909,"timestamp":92570767806,"id":66,"parentId":27,"tags":{},"startTime":1778900543014,"traceId":"9a17790898a38791"},{"name":"check-page","duration":629577,"timestamp":92570757192,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778900543003,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":618512,"timestamp":92570770961,"id":79,"parentId":41,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":632602,"timestamp":92570758895,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":623785,"timestamp":92570770916,"id":76,"parentId":38,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":636035,"timestamp":92570758712,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":624023,"timestamp":92570770855,"id":74,"parentId":36,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":636396,"timestamp":92570758512,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":634333,"timestamp":92570770948,"id":78,"parentId":40,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":646491,"timestamp":92570758837,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":640433,"timestamp":92570770993,"id":81,"parentId":43,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":652412,"timestamp":92570759070,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":642366,"timestamp":92570770894,"id":75,"parentId":37,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":655871,"timestamp":92570758629,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":644811,"timestamp":92570771088,"id":85,"parentId":47,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":656447,"timestamp":92570759496,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778900543006,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":648126,"timestamp":92570771069,"id":84,"parentId":46,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":659870,"timestamp":92570759367,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778900543006,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":648394,"timestamp":92570770978,"id":80,"parentId":42,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":660432,"timestamp":92570758965,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":648961,"timestamp":92570771115,"id":87,"parentId":49,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":658910,"timestamp":92570761209,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778900543007,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":649332,"timestamp":92570776700,"id":88,"parentId":24,"tags":{},"startTime":1778900543023,"traceId":"9a17790898a38791"},{"name":"check-page","duration":671693,"timestamp":92570754392,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778900543001,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":647542,"timestamp":92570781433,"id":89,"parentId":31,"tags":{},"startTime":1778900543028,"traceId":"9a17790898a38791"},{"name":"check-page","duration":671337,"timestamp":92570757699,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778900543004,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":666861,"timestamp":92570771100,"id":86,"parentId":48,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":676921,"timestamp":92570761106,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778900543007,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":670508,"timestamp":92570771026,"id":82,"parentId":44,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":682415,"timestamp":92570759169,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":671760,"timestamp":92570771042,"id":83,"parentId":45,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":683574,"timestamp":92570759275,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778900543006,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":696827,"timestamp":92570770931,"id":77,"parentId":39,"tags":{},"startTime":1778900543017,"traceId":"9a17790898a38791"},{"name":"check-page","duration":709058,"timestamp":92570758774,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778900543005,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":688653,"timestamp":92570788151,"id":96,"parentId":56,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":714303,"timestamp":92570762567,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778900543009,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":697283,"timestamp":92570783964,"id":90,"parentId":23,"tags":{},"startTime":1778900543030,"traceId":"9a17790898a38791"},{"name":"check-page","duration":727152,"timestamp":92570754154,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778900543000,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":698277,"timestamp":92570788163,"id":97,"parentId":57,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":723789,"timestamp":92570762705,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778900543009,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":699425,"timestamp":92570788180,"id":98,"parentId":59,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":724466,"timestamp":92570763185,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778900543009,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":706679,"timestamp":92570788221,"id":100,"parentId":61,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":731561,"timestamp":92570763479,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778900543010,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":712288,"timestamp":92570788136,"id":95,"parentId":54,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":738482,"timestamp":92570761984,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778900543008,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":713547,"timestamp":92570788100,"id":93,"parentId":52,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":739980,"timestamp":92570761721,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778900543008,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":714659,"timestamp":92570788202,"id":99,"parentId":60,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":739557,"timestamp":92570763348,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778900543010,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":701696,"timestamp":92570801619,"id":101,"parentId":58,"tags":{},"startTime":1778900543048,"traceId":"9a17790898a38791"},{"name":"check-page","duration":740536,"timestamp":92570762819,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778900543009,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":715797,"timestamp":92570788119,"id":94,"parentId":53,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":742107,"timestamp":92570761853,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778900543008,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":682724,"timestamp":92570824789,"id":102,"parentId":55,"tags":{},"startTime":1778900543071,"traceId":"9a17790898a38791"},{"name":"check-page","duration":745356,"timestamp":92570762192,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778900543008,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":724598,"timestamp":92570783996,"id":91,"parentId":50,"tags":{},"startTime":1778900543030,"traceId":"9a17790898a38791"},{"name":"check-page","duration":747118,"timestamp":92570761514,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778900543008,"traceId":"9a17790898a38791"},{"name":"is-page-static","duration":720627,"timestamp":92570788079,"id":92,"parentId":51,"tags":{},"startTime":1778900543034,"traceId":"9a17790898a38791"},{"name":"check-page","duration":747109,"timestamp":92570761618,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778900543008,"traceId":"9a17790898a38791"},{"name":"static-check","duration":757975,"timestamp":92570750792,"id":19,"parentId":1,"tags":{},"startTime":1778900542997,"traceId":"9a17790898a38791"},{"name":"write-routes-manifest","duration":583,"timestamp":92571516513,"id":104,"parentId":1,"tags":{},"startTime":1778900543763,"traceId":"9a17790898a38791"},{"name":"load-dotenv","duration":90,"timestamp":92571529809,"id":107,"parentId":106,"tags":{},"startTime":1778900543776,"traceId":"9a17790898a38791"},{"name":"run-export-path-map","duration":670,"timestamp":92571533149,"id":108,"parentId":106,"tags":{},"startTime":1778900543779,"traceId":"9a17790898a38791"},{"name":"next-export","duration":614187,"timestamp":92571527416,"id":106,"parentId":1,"tags":{},"startTime":1778900543774,"traceId":"9a17790898a38791"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2351,"timestamp":92572145361,"id":109,"parentId":105,"tags":{},"startTime":1778900544392,"traceId":"9a17790898a38791"},{"name":"move-exported-app-global-error-","duration":989,"timestamp":92572147806,"id":110,"parentId":105,"tags":{},"startTime":1778900544394,"traceId":"9a17790898a38791"},{"name":"static-generation","duration":628641,"timestamp":92571522039,"id":105,"parentId":1,"tags":{},"startTime":1778900543768,"traceId":"9a17790898a38791"},{"name":"write-routes-manifest","duration":439,"timestamp":92572150833,"id":111,"parentId":1,"tags":{},"startTime":1778900544397,"traceId":"9a17790898a38791"},{"name":"print-tree-view","duration":4492,"timestamp":92572163575,"id":112,"parentId":1,"tags":{},"startTime":1778900544410,"traceId":"9a17790898a38791"},{"name":"write-route-bundle-stats","duration":16000,"timestamp":92572168099,"id":113,"parentId":1,"tags":{},"startTime":1778900544414,"traceId":"9a17790898a38791"},{"name":"telemetry-flush","duration":21237,"timestamp":92572184151,"id":114,"parentId":1,"tags":{},"startTime":1778900544430,"traceId":"9a17790898a38791"},{"name":"next-build","duration":17691787,"timestamp":92554513632,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778900526760,"traceId":"9a17790898a38791"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5797104,"timestamp":91771864837,"id":14,"parentId":1,"tags":{},"startTime":1778899744111,"traceId":"d1877b7828307ffe"},{"name":"turbopack-build-events","duration":79,"timestamp":91772161683,"id":15,"parentId":1,"tags":{},"startTime":1778899744408,"traceId":"d1877b7828307ffe"},{"name":"run-typescript","duration":9529507,"timestamp":91777673048,"id":16,"parentId":1,"tags":{},"startTime":1778899749919,"traceId":"d1877b7828307ffe"},{"name":"static-check","duration":933236,"timestamp":91787415331,"id":19,"parentId":1,"tags":{},"startTime":1778899759662,"traceId":"d1877b7828307ffe"},{"name":"static-generation","duration":646476,"timestamp":91788364169,"id":105,"parentId":1,"tags":{},"startTime":1778899760610,"traceId":"d1877b7828307ffe"},{"name":"telemetry-flush","duration":28914,"timestamp":91789049042,"id":114,"parentId":1,"tags":{},"startTime":1778899761295,"traceId":"d1877b7828307ffe"},{"name":"next-build","duration":17454367,"timestamp":91771623627,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778899743870,"traceId":"d1877b7828307ffe"}]
1
+ [{"name":"run-turbopack","duration":6388335,"timestamp":92554753419,"id":14,"parentId":1,"tags":{},"startTime":1778900527000,"traceId":"9a17790898a38791"},{"name":"turbopack-build-events","duration":96,"timestamp":92555086787,"id":15,"parentId":1,"tags":{},"startTime":1778900527333,"traceId":"9a17790898a38791"},{"name":"run-typescript","duration":9397266,"timestamp":92561150969,"id":16,"parentId":1,"tags":{},"startTime":1778900533397,"traceId":"9a17790898a38791"},{"name":"static-check","duration":757975,"timestamp":92570750792,"id":19,"parentId":1,"tags":{},"startTime":1778900542997,"traceId":"9a17790898a38791"},{"name":"static-generation","duration":628641,"timestamp":92571522039,"id":105,"parentId":1,"tags":{},"startTime":1778900543768,"traceId":"9a17790898a38791"},{"name":"telemetry-flush","duration":21237,"timestamp":92572184151,"id":114,"parentId":1,"tags":{},"startTime":1778900544430,"traceId":"9a17790898a38791"},{"name":"next-build","duration":17691787,"timestamp":92554513632,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778900526760,"traceId":"9a17790898a38791"}]
@@ -1069,8 +1069,20 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1069
1069
  // is currently popping so only that icon picks up the class.
1070
1070
  // Arms for 240ms (CSS animation 220ms + 20ms buffer) so a quick
1071
1071
  // re-click can replay cleanly.
1072
- const [chromePopping, setChromePopping] = useState<'zoom-in' | 'zoom-out' | null>(null);
1073
- const popChrome = (which: 'zoom-in' | 'zoom-out') => {
1072
+ // Round 249 / Loop: extend chromePopping to cover ring/grid layout
1073
+ // toggle + fullscreen button alongside the existing zoom-in/zoom-out.
1074
+ // Pre-R249 only the zoom buttons fired the R186 .anet-chrome-pop scale
1075
+ // pulse on click; the other chrome controls (layout toggle, fullscreen)
1076
+ // had no transient "I just clicked" signal — silent click → state change
1077
+ // with only the post-click visual difference to confirm action. R249
1078
+ // gives every clickable chrome control the same 220ms scale pulse, so
1079
+ // the whole strip speaks one consistent click vocabulary. Reset button
1080
+ // keeps its own R184 rotation animation (different gesture, semantic).
1081
+ // Node-size S/M/L keep their R171 layoutSwitching crossfade (already
1082
+ // gestural). Type union grows but the helper signature stays one-arg.
1083
+ type ChromePop = 'zoom-in' | 'zoom-out' | 'layout-ring' | 'layout-grid' | 'fullscreen';
1084
+ const [chromePopping, setChromePopping] = useState<ChromePop | null>(null);
1085
+ const popChrome = (which: ChromePop) => {
1074
1086
  setChromePopping(which);
1075
1087
  setTimeout(() => setChromePopping(prev => prev === which ? null : prev), 240);
1076
1088
  };
@@ -1420,29 +1432,38 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1420
1432
  -fullscreen etc). */}
1421
1433
  <div className="inline-flex rounded-md border border-gray-500/25 overflow-hidden" role="group" aria-label="Topology layout">
1422
1434
  <button
1423
- onClick={() => { if (layout !== 'ring') toggleLayout(); }}
1435
+ onClick={() => { popChrome('layout-ring'); if (layout !== 'ring') toggleLayout(); }}
1424
1436
  aria-pressed={layout === 'ring'}
1425
1437
  title="Ring layout (l to toggle)"
1426
1438
  data-topo-chrome-layout="ring"
1427
1439
  data-topo-chrome-layout-active={layout === 'ring' ? 'true' : 'false'}
1440
+ data-topo-chrome-layout-ring-popping={chromePopping === 'layout-ring' ? 'true' : 'false'}
1428
1441
  // Round 196 / Loop: add active: (pressed) state for tactile
1429
1442
  // click feedback — bridges mouse-down → R186/R184/R192 pop-on-
1430
1443
  // release. Selected variant deepens to cyan-500/25 (one tier
1431
1444
  // above its hover:cyan-500/20); unselected variant deepens
1432
1445
  // to cyan-500/15 (one tier above its hover:cyan-500/5).
1433
- className={`px-2.5 py-1 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'ring' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'}`}
1446
+ // Round 249 / Loop: chrome-pop joins the click handshake —
1447
+ // mouse-down deepens cyan press (R196), release fires
1448
+ // .anet-chrome-pop on the button (R249) AND triggers
1449
+ // toggleLayout if state changes. The pop runs even when
1450
+ // clicking the already-active layout (no state change),
1451
+ // confirming the click was received either way.
1452
+ className={`px-2.5 py-1 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'ring' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'} ${chromePopping === 'layout-ring' ? ' anet-chrome-pop' : ''}`}
1434
1453
  >
1435
1454
  Ring
1436
1455
  </button>
1437
1456
  <button
1438
- onClick={() => { if (layout !== 'grid') toggleLayout(); }}
1457
+ onClick={() => { popChrome('layout-grid'); if (layout !== 'grid') toggleLayout(); }}
1439
1458
  aria-pressed={layout === 'grid'}
1440
1459
  title="Grid layout (l to toggle)"
1441
1460
  data-topo-chrome-layout="grid"
1442
1461
  data-topo-chrome-layout-active={layout === 'grid' ? 'true' : 'false'}
1462
+ data-topo-chrome-layout-grid-popping={chromePopping === 'layout-grid' ? 'true' : 'false'}
1443
1463
  // Round 196 / Loop: R163 layout-toggle Grid variant picks up
1444
1464
  // press-state — same tier pattern as Ring above.
1445
- className={`px-2.5 py-1 border-l border-gray-500/25 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'grid' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'}`}
1465
+ // Round 249 / Loop: chrome-pop on click — same as Ring.
1466
+ className={`px-2.5 py-1 border-l border-gray-500/25 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${layout === 'grid' ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25' : 'text-gray-500 hover:text-gray-300 hover:bg-cyan-500/5 active:bg-cyan-500/15'} ${chromePopping === 'layout-grid' ? ' anet-chrome-pop' : ''}`}
1446
1467
  >
1447
1468
  Grid
1448
1469
  </button>
@@ -3063,7 +3084,15 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3063
3084
  // is preserved.
3064
3085
  filter={(isPinned || isHovered) ? 'url(#topo-groupbox-lift)' : undefined}
3065
3086
  style={{
3066
- transition: 'stroke 200ms ease-out, stroke-width 200ms ease-out, fill-opacity 200ms ease-out, filter 200ms ease-out',
3087
+ /* Round 248 / Loop: append fill 200ms ease-out to
3088
+ the existing R66 transition list. Pre-R248 the
3089
+ rect's fill (isLight ? '#0f172a' (slate-900) :
3090
+ '#a5b4fc' (indigo-300)) snapped on theme toggle
3091
+ while stroke / fill-opacity / filter all eased.
3092
+ Closes the last theme-toggle snap on the group
3093
+ box surface — same idiom R246 + R247 used at
3094
+ per-node label-card and side-panel scopes. */
3095
+ transition: 'stroke 200ms ease-out, stroke-width 200ms ease-out, fill-opacity 200ms ease-out, filter 200ms ease-out, fill 200ms ease-out',
3067
3096
  pointerEvents: 'none',
3068
3097
  // CSS var consumed by `.anet-topo-groupbox-live`
3069
3098
  // (line 877 of globals.css). React's CSSProperties
@@ -4036,8 +4065,24 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4036
4065
  </circle>
4037
4066
  );
4038
4067
  })()}
4039
- {/* core — 20px diameter, larger inner highlight reads as a "lit lamp" */}
4040
- <circle cx={cx} cy={cy} r="10" fill={isLight ? '#059669' : '#10b981'} />
4068
+ {/* core — 20px diameter, larger inner highlight reads as a "lit lamp"
4069
+ Round 248 / Loop: hub center core gets a fill transition.
4070
+ Pre-R248 the core circle (the visual anchor at the centre
4071
+ of the canvas, fill=isLight ? '#059669' emerald-600 :
4072
+ '#10b981' emerald-500) hard-flipped on theme toggle —
4073
+ the most visually prominent element on the canvas
4074
+ snapping while everything else (R244 halo / R241 hub
4075
+ spokes / R246 label cards / R247 side panels) eased.
4076
+ Inline transition closes the gap. data-topo-hub-core
4077
+ attr added for test introspection (the parent <g> at
4078
+ line 3587 has data-topo-hub but the core specifically
4079
+ is the canvas anchor). */}
4080
+ <circle
4081
+ cx={cx} cy={cy} r="10"
4082
+ fill={isLight ? '#059669' : '#10b981'}
4083
+ data-topo-hub-core
4084
+ style={{ transition: 'fill 200ms ease-out' }}
4085
+ />
4041
4086
  {/* R130 / Loop: when workingCount > 0, the decorative inner
4042
4087
  highlight gets replaced with the workingCount digit. The
4043
4088
  R84 busyness breath already encodes the same metric
@@ -6521,17 +6566,20 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6521
6566
  background + color when active so the Tailwind cyan
6522
6567
  classes win specificity. */}
6523
6568
  <button
6524
- onClick={toggleFullscreen}
6569
+ onClick={() => { popChrome('fullscreen'); toggleFullscreen(); }}
6525
6570
  data-topo-chrome-fullscreen
6526
6571
  data-topo-chrome-fullscreen-active={isFullscreen ? 'true' : 'false'}
6572
+ data-topo-chrome-fullscreen-popping={chromePopping === 'fullscreen' ? 'true' : 'false'}
6527
6573
  // R196: fullscreen also picks up press-state — active variant
6528
6574
  // deepens cyan-500/20 → cyan-500/25 on press; non-active
6529
6575
  // deepens white/5 → white/10.
6576
+ // R249: chrome-pop on click — same one-vocabulary click signal
6577
+ // as layout toggle and zoom buttons.
6530
6578
  className={`p-1.5 rounded-md border transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 ${
6531
6579
  isFullscreen
6532
6580
  ? 'bg-cyan-500/15 text-cyan-300 hover:bg-cyan-500/20 active:bg-cyan-500/25'
6533
6581
  : 'hover:bg-white/5 active:bg-white/10'
6534
- }`}
6582
+ }${chromePopping === 'fullscreen' ? ' anet-chrome-pop' : ''}`}
6535
6583
  style={{
6536
6584
  borderColor: pal.containerBorder,
6537
6585
  ...(isFullscreen
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.254",
3
+ "version": "0.4.6-preview.256",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,98 @@
1
+ /* Round 249 verification: chrome-pop click animation extends from
2
+ * the existing zoom-in/zoom-out pair to ring/grid layout toggle +
3
+ * fullscreen buttons. Whole chrome strip now speaks one click
4
+ * vocabulary instead of zoom-only-pops + silent-everything-else.
5
+ *
6
+ * Per button, on click:
7
+ * data-topo-chrome-{key}-popping flips 'false' → 'true' for ~240ms
8
+ * className gains 'anet-chrome-pop' for the same window
9
+ *
10
+ * Test scope:
11
+ * - Ring layout button: click → data-topo-chrome-layout-ring-popping='true' (within 100ms)
12
+ * - Grid layout button: click → data-topo-chrome-layout-grid-popping='true'
13
+ * - Fullscreen button: click → data-topo-chrome-fullscreen-popping='true'
14
+ *
15
+ * Hard-to-test trap: chromePopping is transient (240ms TTL). Probe
16
+ * immediately after Playwright click resolves. Wait full 240ms after
17
+ * for the second probe — must be 'false' again.
18
+ */
19
+ import { chromium } from 'playwright';
20
+ import { readFileSync } from 'node:fs';
21
+
22
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
23
+ const browser = await chromium.launch({ headless: true });
24
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
25
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
26
+ await ctx.addInitScript(() => {
27
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
28
+ });
29
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias) => ({
35
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
36
+ network_id: nid, project_dir: null,
37
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
38
+ });
39
+ await route.fulfill({ response: r, json: { ...b, sessions: [
40
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
41
+ ] } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
45
+
46
+ const page = await ctx.newPage();
47
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
48
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
49
+ await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 10000 });
50
+ await page.waitForSelector('[data-topo-chrome-fullscreen]', { timeout: 10000 });
51
+ await page.waitForTimeout(300);
52
+
53
+ const testButton = async (clickSelector, poppingAttr, label) => {
54
+ // Click + immediately read state. The chromePopping setState is
55
+ // synchronous within the click handler, so the DOM should reflect
56
+ // 'true' on the next React commit (very soon after click resolves).
57
+ await page.locator(clickSelector).click();
58
+ // Probe quickly — within the 240ms window
59
+ await page.waitForTimeout(50);
60
+ const duringPop = await page.locator(clickSelector).getAttribute(poppingAttr);
61
+ const classDuring = await page.locator(clickSelector).getAttribute('class');
62
+ // Wait for the pop to clear
63
+ await page.waitForTimeout(300);
64
+ const afterPop = await page.locator(clickSelector).getAttribute(poppingAttr);
65
+ const classAfter = await page.locator(clickSelector).getAttribute('class');
66
+ return {
67
+ label,
68
+ duringAttr: duringPop,
69
+ duringClass: /anet-chrome-pop/.test(classDuring || ''),
70
+ afterAttr: afterPop,
71
+ afterClass: /anet-chrome-pop/.test(classAfter || ''),
72
+ };
73
+ };
74
+
75
+ const ring = await testButton('[data-topo-chrome-layout="ring"]', 'data-topo-chrome-layout-ring-popping', 'ring');
76
+ const grid = await testButton('[data-topo-chrome-layout="grid"]', 'data-topo-chrome-layout-grid-popping', 'grid');
77
+ // For fullscreen, browser context may not honour requestFullscreen in
78
+ // headless mode — wrap in try/catch on the page side. Test only the
79
+ // data attr + className.
80
+ const fullscreen = await testButton('[data-topo-chrome-fullscreen]', 'data-topo-chrome-fullscreen-popping', 'fullscreen');
81
+
82
+ await browser.close();
83
+
84
+ const ok_each = (b) =>
85
+ b.duringAttr === 'true' && b.duringClass === true &&
86
+ b.afterAttr === 'false' && b.afterClass === false;
87
+
88
+ const results = {
89
+ ring_pops_on_click: ok_each(ring),
90
+ grid_pops_on_click: ok_each(grid),
91
+ fullscreen_pops_on_click: ok_each(fullscreen),
92
+ };
93
+ const ok = Object.values(results).every(Boolean);
94
+ console.log(`${ok ? '✅' : '❌'} chrome-pop extension:`, JSON.stringify(results),
95
+ '\n ring: ', ring,
96
+ '\n grid: ', grid,
97
+ '\n fullscreen:', fullscreen);
98
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,106 @@
1
+ /* Round 248 verification: two more theme-toggle snap closures:
2
+ *
3
+ * 1. Group box <rect> (#111 / R66): existing transition list
4
+ * 'stroke + stroke-width + fill-opacity + filter 200ms' grows
5
+ * to include 'fill 200ms'. The rect's theme-driven fill
6
+ * (isLight ? slate-900 : indigo-300) no longer snaps.
7
+ *
8
+ * 2. Hub center core <circle> (the visual anchor at canvas
9
+ * centre, fill=isLight ? emerald-600 : emerald-500): had NO
10
+ * transition at all — most prominent element on canvas was
11
+ * flipping in one frame while everything around it eased.
12
+ * R248 adds inline 'fill 200ms ease-out' + data-topo-hub-
13
+ * core attr for test introspection.
14
+ *
15
+ * Test scope:
16
+ * - Hub core probe ([data-topo-hub-core]): present, has fill
17
+ * attribute, transition contains 'fill 200ms' (or 0.2s)
18
+ * - Group box probe ([data-group-label]) → climb to its
19
+ * <rect> sibling — needs grid layout + ≥2 prefix-shared
20
+ * aliases. Probe its style.transition for 'fill 200ms'
21
+ * alongside the existing R66 properties.
22
+ */
23
+ import { chromium } from 'playwright';
24
+ import { readFileSync } from 'node:fs';
25
+
26
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
27
+ const browser = await chromium.launch({ headless: true });
28
+ // Hub core renders only in ring layout; group boxes only in grid.
29
+ // Two contexts back-to-back.
30
+ async function setupLayout(layout) {
31
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
32
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
33
+ await ctx.addInitScript((l) => {
34
+ try {
35
+ localStorage.setItem('anet-theme', 'cyber');
36
+ sessionStorage.setItem('anet_v3_auth', '1');
37
+ localStorage.setItem('anet-topo-layout', l);
38
+ } catch {}
39
+ }, layout);
40
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
41
+ await ctx.route('**/api/hub/status*', async (route) => {
42
+ const r = await route.fetch();
43
+ const b = await r.json();
44
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
45
+ const mk = (alias) => ({
46
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
47
+ network_id: nid, project_dir: null,
48
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
49
+ });
50
+ // 3 alpha-prefix + 1 delta — R106 cluster makes ONE alpha group box in grid
51
+ await route.fulfill({ response: r, json: { ...b, sessions: [
52
+ mk('alpha-1'), mk('alpha-2'), mk('alpha-3'), mk('delta'),
53
+ ] } });
54
+ });
55
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: [] } }));
56
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
57
+ const page = await ctx.newPage();
58
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
59
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
60
+ await page.waitForTimeout(400);
61
+ return page;
62
+ }
63
+
64
+ // Scenario A: ring → hub core
65
+ const pageRing = await setupLayout('ring');
66
+ await pageRing.waitForSelector('[data-topo-hub-core]', { timeout: 10000, state: 'attached' });
67
+ const hub = await pageRing.evaluate(() => {
68
+ const el = document.querySelector('[data-topo-hub-core]');
69
+ return el ? { fill: el.getAttribute('fill'), transition: el.style.transition } : null;
70
+ });
71
+ await pageRing.close();
72
+
73
+ // Scenario B: grid → group box <rect>
74
+ const pageGrid = await setupLayout('grid');
75
+ // Wait for group label (signals group box has been mounted alongside)
76
+ await pageGrid.waitForSelector('[data-group-label]', { timeout: 10000, state: 'attached' });
77
+ const groupBox = await pageGrid.evaluate(() => {
78
+ const allRects = Array.from(document.querySelectorAll('rect'));
79
+ const found = allRects.find(r => r.getAttribute('rx') === '14'
80
+ && r.style && /fill\s+200ms/.test(r.style.transition || ''));
81
+ return found ? { fill: found.getAttribute('fill'), transition: found.style.transition } : null;
82
+ });
83
+ await pageGrid.close();
84
+
85
+ const out = { hub, groupBox };
86
+ await browser.close();
87
+
88
+ const hasProp = (s, prop) => new RegExp(`${prop}\\s+(?:200ms|0\\.2s)`).test(s || '');
89
+
90
+ const results = {
91
+ hub_present: out.hub !== null,
92
+ hub_has_fill_attr: typeof out.hub?.fill === 'string' && out.hub.fill.length > 0,
93
+ hub_transition_has_fill: hasProp(out.hub?.transition, 'fill'),
94
+
95
+ groupbox_present: out.groupBox !== null,
96
+ groupbox_has_fill_attr: typeof out.groupBox?.fill === 'string' && out.groupBox.fill.length > 0,
97
+ groupbox_transition_stroke: hasProp(out.groupBox?.transition, 'stroke'),
98
+ groupbox_transition_fill_op: hasProp(out.groupBox?.transition, 'fill-opacity'),
99
+ groupbox_transition_filter: hasProp(out.groupBox?.transition, 'filter'),
100
+ groupbox_transition_fill: hasProp(out.groupBox?.transition, 'fill'),
101
+ };
102
+ const ok = Object.values(results).every(Boolean);
103
+ console.log(`${ok ? '✅' : '❌'} groupbox + hubcore ease:`, JSON.stringify(results),
104
+ '\n hub: ', out.hub,
105
+ '\n groupBox:', out.groupBox);
106
+ process.exit(ok ? 0 : 1);