@sleep2agi/agent-network-dashboard 0.4.6-preview.141 → 0.4.6-preview.143

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 (144) 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/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.html +1 -1
  46. package/.next/server/app/logs.rsc +1 -1
  47. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  53. package/.next/server/app/messages.html +1 -1
  54. package/.next/server/app/messages.rsc +1 -1
  55. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  61. package/.next/server/app/node.html +1 -1
  62. package/.next/server/app/node.rsc +1 -1
  63. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  69. package/.next/server/app/nodes.html +1 -1
  70. package/.next/server/app/nodes.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  77. package/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/server-logs.html +1 -1
  79. package/.next/server/app/server-logs.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  86. package/.next/server/app/settings/networks.html +1 -1
  87. package/.next/server/app/settings/networks.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  95. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/settings/tokens.html +1 -1
  97. package/.next/server/app/settings/tokens.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  105. package/.next/server/app/settings.html +2 -2
  106. package/.next/server/app/settings.rsc +2 -2
  107. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  108. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  112. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/tasks.html +1 -1
  114. package/.next/server/app/tasks.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  122. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  126. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  127. package/.next/server/middleware-build-manifest.js +3 -3
  128. package/.next/server/pages/404.html +1 -1
  129. package/.next/server/pages/500.html +1 -1
  130. package/.next/server/server-reference-manifest.js +1 -1
  131. package/.next/server/server-reference-manifest.json +1 -1
  132. package/.next/static/chunks/{17t-f~8myhwyf.js → 00g4ujct890wg.js} +1 -1
  133. package/.next/static/chunks/{0n7d-22onq9b..js → 0c-.4u7k3uwka.js} +1 -1
  134. package/.next/static/chunks/0lcyci-~n9~ys.js +4 -0
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +78 -9
  138. package/package.json +1 -1
  139. package/scripts/topo-active-links-chip-nav-test.mjs +117 -0
  140. package/scripts/topo-panel-hover-elevation-test.mjs +118 -0
  141. package/.next/static/chunks/0uuulzr2axmob.js +0 -4
  142. /package/.next/static/{giNWS4tIwfQsKvMuZsBnM → Tgp0FuUzGI05ZC-_FwOmE}/_buildManifest.js +0 -0
  143. /package/.next/static/{giNWS4tIwfQsKvMuZsBnM → Tgp0FuUzGI05ZC-_FwOmE}/_clientMiddlewareManifest.js +0 -0
  144. /package/.next/static/{giNWS4tIwfQsKvMuZsBnM → Tgp0FuUzGI05ZC-_FwOmE}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":405,"timestamp":52260459567,"id":4,"parentId":1,"tags":{},"startTime":1778860232706,"traceId":"c4f2494ba5a90dd6"},{"name":"load-custom-routes","duration":683,"timestamp":52260460145,"id":5,"parentId":1,"tags":{},"startTime":1778860232706,"traceId":"c4f2494ba5a90dd6"},{"name":"create-dist-dir","duration":822,"timestamp":52260460904,"id":6,"parentId":1,"tags":{},"startTime":1778860232707,"traceId":"c4f2494ba5a90dd6"},{"name":"clean","duration":611,"timestamp":52260462524,"id":7,"parentId":1,"tags":{},"startTime":1778860232709,"traceId":"c4f2494ba5a90dd6"},{"name":"discover-routes","duration":9290,"timestamp":52260550456,"id":8,"parentId":1,"tags":{},"startTime":1778860232797,"traceId":"c4f2494ba5a90dd6"},{"name":"create-root-mapping","duration":123,"timestamp":52260559808,"id":9,"parentId":1,"tags":{},"startTime":1778860232806,"traceId":"c4f2494ba5a90dd6"},{"name":"generate-route-types","duration":34286,"timestamp":52260562357,"id":10,"parentId":1,"tags":{},"startTime":1778860232809,"traceId":"c4f2494ba5a90dd6"},{"name":"public-dir-conflict-check","duration":116,"timestamp":52260596808,"id":11,"parentId":1,"tags":{},"startTime":1778860232843,"traceId":"c4f2494ba5a90dd6"},{"name":"generate-routes-manifest","duration":4100,"timestamp":52260597070,"id":12,"parentId":1,"tags":{},"startTime":1778860232843,"traceId":"c4f2494ba5a90dd6"},{"name":"run-turbopack","duration":5725005,"timestamp":52260607364,"id":14,"parentId":1,"tags":{},"startTime":1778860232854,"traceId":"c4f2494ba5a90dd6"},{"name":"turbopack-build-events","duration":76,"timestamp":52260893900,"id":15,"parentId":1,"tags":{},"startTime":1778860233140,"traceId":"c4f2494ba5a90dd6"},{"name":"run-typescript","duration":8477339,"timestamp":52266340643,"id":16,"parentId":1,"tags":{},"startTime":1778860238587,"traceId":"c4f2494ba5a90dd6"},{"name":"generate-required-server-files","duration":2584,"timestamp":52274819225,"id":18,"parentId":1,"tags":{},"startTime":1778860247065,"traceId":"c4f2494ba5a90dd6"},{"name":"check-static-error-page","duration":13235,"timestamp":52275012810,"id":20,"parentId":19,"tags":{},"startTime":1778860247259,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":411711,"timestamp":52275028815,"id":63,"parentId":22,"tags":{},"startTime":1778860247275,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":425081,"timestamp":52275015624,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778860247262,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":524348,"timestamp":52275029243,"id":66,"parentId":27,"tags":{},"startTime":1778860247276,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":534616,"timestamp":52275019070,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778860247265,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":522435,"timestamp":52275031501,"id":69,"parentId":30,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":534637,"timestamp":52275019349,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":530553,"timestamp":52275031724,"id":70,"parentId":32,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":542644,"timestamp":52275019693,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":531545,"timestamp":52275031091,"id":67,"parentId":28,"tags":{},"startTime":1778860247277,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":543534,"timestamp":52275019158,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778860247265,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":535702,"timestamp":52275029126,"id":65,"parentId":26,"tags":{},"startTime":1778860247275,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":545934,"timestamp":52275018962,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778860247265,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":535830,"timestamp":52275031954,"id":73,"parentId":35,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":547858,"timestamp":52275019990,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":539089,"timestamp":52275032120,"id":74,"parentId":36,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":550892,"timestamp":52275020361,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":546062,"timestamp":52275028448,"id":62,"parentId":21,"tags":{},"startTime":1778860247275,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":560167,"timestamp":52275014384,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778860247261,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":546305,"timestamp":52275028984,"id":64,"parentId":25,"tags":{},"startTime":1778860247275,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":556521,"timestamp":52275018806,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778860247265,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":548858,"timestamp":52275031812,"id":71,"parentId":33,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":560915,"timestamp":52275019798,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":548810,"timestamp":52275032219,"id":78,"parentId":40,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":560245,"timestamp":52275020829,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":566143,"timestamp":52275032166,"id":75,"parentId":37,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":577885,"timestamp":52275020490,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":566664,"timestamp":52275031914,"id":72,"parentId":34,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":578726,"timestamp":52275019893,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":566577,"timestamp":52275032183,"id":76,"parentId":38,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":578205,"timestamp":52275020588,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":568640,"timestamp":52275031329,"id":68,"parentId":29,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":580803,"timestamp":52275019244,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":573604,"timestamp":52275032303,"id":84,"parentId":46,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":584446,"timestamp":52275021540,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778860247268,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":574107,"timestamp":52275032262,"id":81,"parentId":43,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":585216,"timestamp":52275021203,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":581399,"timestamp":52275032246,"id":80,"parentId":42,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":592607,"timestamp":52275021095,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":581620,"timestamp":52275032231,"id":79,"parentId":41,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":593460,"timestamp":52275020954,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":586106,"timestamp":52275032288,"id":83,"parentId":45,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":597019,"timestamp":52275021419,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778860247268,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":586987,"timestamp":52275032277,"id":82,"parentId":44,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":598001,"timestamp":52275021305,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778860247268,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":579508,"timestamp":52275040287,"id":88,"parentId":24,"tags":{},"startTime":1778860247287,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":603538,"timestamp":52275016303,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778860247263,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":579447,"timestamp":52275044620,"id":89,"parentId":31,"tags":{},"startTime":1778860247291,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":604654,"timestamp":52275019458,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778860247266,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":596615,"timestamp":52275032345,"id":87,"parentId":49,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":605594,"timestamp":52275023425,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778860247270,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":597267,"timestamp":52275032329,"id":86,"parentId":48,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":607824,"timestamp":52275021812,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778860247268,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":604037,"timestamp":52275032199,"id":77,"parentId":39,"tags":{},"startTime":1778860247278,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":615563,"timestamp":52275020720,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778860247267,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":629936,"timestamp":52275032318,"id":85,"parentId":47,"tags":{},"startTime":1778860247279,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":640640,"timestamp":52275021694,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778860247268,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":615281,"timestamp":52275047264,"id":95,"parentId":54,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":638262,"timestamp":52275024328,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778860247271,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":623224,"timestamp":52275047297,"id":97,"parentId":57,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":645392,"timestamp":52275025185,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778860247271,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":630899,"timestamp":52275047313,"id":98,"parentId":59,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":652632,"timestamp":52275025638,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778860247272,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":633355,"timestamp":52275047144,"id":90,"parentId":23,"tags":{},"startTime":1778860247293,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":664559,"timestamp":52275015988,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778860247262,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":633483,"timestamp":52275047222,"id":92,"parentId":51,"tags":{},"startTime":1778860247293,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":656845,"timestamp":52275023911,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778860247270,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":633878,"timestamp":52275047204,"id":91,"parentId":50,"tags":{},"startTime":1778860247293,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":657344,"timestamp":52275023776,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778860247270,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":634770,"timestamp":52275052921,"id":101,"parentId":58,"tags":{},"startTime":1778860247299,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":662426,"timestamp":52275025322,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778860247272,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":640492,"timestamp":52275047357,"id":100,"parentId":61,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":662059,"timestamp":52275025836,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778860247272,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":641227,"timestamp":52275047336,"id":99,"parentId":60,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":662869,"timestamp":52275025742,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778860247272,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":620092,"timestamp":52275070243,"id":102,"parentId":55,"tags":{},"startTime":1778860247317,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":665877,"timestamp":52275024492,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778860247271,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":643200,"timestamp":52275047249,"id":94,"parentId":53,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":666280,"timestamp":52275024188,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778860247270,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":647450,"timestamp":52275047238,"id":93,"parentId":52,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":670683,"timestamp":52275024043,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778860247270,"traceId":"c4f2494ba5a90dd6"},{"name":"is-page-static","duration":674877,"timestamp":52275047285,"id":96,"parentId":56,"tags":{},"startTime":1778860247294,"traceId":"c4f2494ba5a90dd6"},{"name":"check-page","duration":697232,"timestamp":52275024978,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778860247271,"traceId":"c4f2494ba5a90dd6"},{"name":"static-check","duration":710358,"timestamp":52275011897,"id":19,"parentId":1,"tags":{},"startTime":1778860247258,"traceId":"c4f2494ba5a90dd6"},{"name":"write-routes-manifest","duration":412,"timestamp":52275728922,"id":104,"parentId":1,"tags":{},"startTime":1778860247975,"traceId":"c4f2494ba5a90dd6"},{"name":"load-dotenv","duration":41,"timestamp":52275739479,"id":107,"parentId":106,"tags":{},"startTime":1778860247986,"traceId":"c4f2494ba5a90dd6"},{"name":"run-export-path-map","duration":890,"timestamp":52275743584,"id":108,"parentId":106,"tags":{},"startTime":1778860247990,"traceId":"c4f2494ba5a90dd6"},{"name":"next-export","duration":567258,"timestamp":52275738296,"id":106,"parentId":1,"tags":{},"startTime":1778860247985,"traceId":"c4f2494ba5a90dd6"}]
2
- [{"name":"move-exported-app-not-found-","duration":1986,"timestamp":52276309196,"id":109,"parentId":105,"tags":{},"startTime":1778860248555,"traceId":"c4f2494ba5a90dd6"},{"name":"move-exported-app-global-error-","duration":950,"timestamp":52276311287,"id":110,"parentId":105,"tags":{},"startTime":1778860248558,"traceId":"c4f2494ba5a90dd6"},{"name":"static-generation","duration":581648,"timestamp":52275733132,"id":105,"parentId":1,"tags":{},"startTime":1778860247979,"traceId":"c4f2494ba5a90dd6"},{"name":"write-routes-manifest","duration":514,"timestamp":52276315068,"id":111,"parentId":1,"tags":{},"startTime":1778860248561,"traceId":"c4f2494ba5a90dd6"},{"name":"print-tree-view","duration":4683,"timestamp":52276331076,"id":112,"parentId":1,"tags":{},"startTime":1778860248577,"traceId":"c4f2494ba5a90dd6"},{"name":"write-route-bundle-stats","duration":14414,"timestamp":52276335796,"id":113,"parentId":1,"tags":{},"startTime":1778860248582,"traceId":"c4f2494ba5a90dd6"},{"name":"telemetry-flush","duration":40153,"timestamp":52276350262,"id":114,"parentId":1,"tags":{},"startTime":1778860248597,"traceId":"c4f2494ba5a90dd6"},{"name":"next-build","duration":15982219,"timestamp":52260408241,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778860232655,"traceId":"c4f2494ba5a90dd6"}]
1
+ [{"name":"generate-buildid","duration":260,"timestamp":53029493510,"id":4,"parentId":1,"tags":{},"startTime":1778861001740,"traceId":"1867395b661d04ea"},{"name":"load-custom-routes","duration":519,"timestamp":53029493911,"id":5,"parentId":1,"tags":{},"startTime":1778861001740,"traceId":"1867395b661d04ea"},{"name":"create-dist-dir","duration":618,"timestamp":53029494479,"id":6,"parentId":1,"tags":{},"startTime":1778861001741,"traceId":"1867395b661d04ea"},{"name":"clean","duration":523,"timestamp":53029495711,"id":7,"parentId":1,"tags":{},"startTime":1778861001742,"traceId":"1867395b661d04ea"},{"name":"discover-routes","duration":8148,"timestamp":53029577833,"id":8,"parentId":1,"tags":{},"startTime":1778861001824,"traceId":"1867395b661d04ea"},{"name":"create-root-mapping","duration":119,"timestamp":53029586075,"id":9,"parentId":1,"tags":{},"startTime":1778861001832,"traceId":"1867395b661d04ea"},{"name":"generate-route-types","duration":31755,"timestamp":53029588380,"id":10,"parentId":1,"tags":{},"startTime":1778861001835,"traceId":"1867395b661d04ea"},{"name":"public-dir-conflict-check","duration":98,"timestamp":53029620302,"id":11,"parentId":1,"tags":{},"startTime":1778861001867,"traceId":"1867395b661d04ea"},{"name":"generate-routes-manifest","duration":4758,"timestamp":53029620517,"id":12,"parentId":1,"tags":{},"startTime":1778861001867,"traceId":"1867395b661d04ea"},{"name":"run-turbopack","duration":5485039,"timestamp":53029630021,"id":14,"parentId":1,"tags":{},"startTime":1778861001876,"traceId":"1867395b661d04ea"},{"name":"turbopack-build-events","duration":119,"timestamp":53029916946,"id":15,"parentId":1,"tags":{},"startTime":1778861002163,"traceId":"1867395b661d04ea"},{"name":"run-typescript","duration":8920853,"timestamp":53035123343,"id":16,"parentId":1,"tags":{},"startTime":1778861007370,"traceId":"1867395b661d04ea"},{"name":"generate-required-server-files","duration":2415,"timestamp":53044045407,"id":18,"parentId":1,"tags":{},"startTime":1778861016292,"traceId":"1867395b661d04ea"},{"name":"check-static-error-page","duration":16403,"timestamp":53044216630,"id":20,"parentId":19,"tags":{},"startTime":1778861016463,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":428740,"timestamp":53044238091,"id":63,"parentId":22,"tags":{},"startTime":1778861016484,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":446988,"timestamp":53044220028,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778861016466,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":514883,"timestamp":53044238763,"id":67,"parentId":28,"tags":{},"startTime":1778861016485,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":529541,"timestamp":53044224208,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778861016470,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":525029,"timestamp":53044237732,"id":62,"parentId":21,"tags":{},"startTime":1778861016484,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":544439,"timestamp":53044218396,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778861016465,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":544430,"timestamp":53044238941,"id":68,"parentId":29,"tags":{},"startTime":1778861016485,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":559056,"timestamp":53044224397,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778861016471,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":556047,"timestamp":53044239341,"id":70,"parentId":32,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":570506,"timestamp":53044225019,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778861016471,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":557534,"timestamp":53044238212,"id":64,"parentId":25,"tags":{},"startTime":1778861016484,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":572434,"timestamp":53044223359,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778861016470,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":559918,"timestamp":53044238334,"id":65,"parentId":26,"tags":{},"startTime":1778861016485,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":574768,"timestamp":53044223545,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778861016470,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":570181,"timestamp":53044239677,"id":75,"parentId":37,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":583672,"timestamp":53044226308,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":578611,"timestamp":53044239137,"id":69,"parentId":30,"tags":{},"startTime":1778861016485,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":593249,"timestamp":53044224580,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778861016471,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":584480,"timestamp":53044239494,"id":72,"parentId":34,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":598746,"timestamp":53044225339,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778861016472,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":584779,"timestamp":53044239530,"id":73,"parentId":35,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":598853,"timestamp":53044225502,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778861016472,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":587551,"timestamp":53044239712,"id":77,"parentId":39,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":600720,"timestamp":53044226593,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":593603,"timestamp":53044239645,"id":74,"parentId":36,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":607207,"timestamp":53044226087,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778861016472,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":593727,"timestamp":53044239737,"id":79,"parentId":41,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":606677,"timestamp":53044226819,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":595208,"timestamp":53044238456,"id":66,"parentId":27,"tags":{},"startTime":1778861016485,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":609987,"timestamp":53044223707,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778861016470,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":594422,"timestamp":53044239408,"id":71,"parentId":33,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":608662,"timestamp":53044225194,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778861016471,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":594424,"timestamp":53044239697,"id":76,"parentId":38,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":607702,"timestamp":53044226469,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":602697,"timestamp":53044239753,"id":80,"parentId":42,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":615564,"timestamp":53044226952,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":602870,"timestamp":53044239824,"id":85,"parentId":47,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":613640,"timestamp":53044229092,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778861016475,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":603053,"timestamp":53044239812,"id":84,"parentId":46,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":614017,"timestamp":53044228884,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778861016475,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":603322,"timestamp":53044239722,"id":78,"parentId":40,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":616377,"timestamp":53044226708,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":605348,"timestamp":53044239779,"id":82,"parentId":44,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":617954,"timestamp":53044227227,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778861016474,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":605642,"timestamp":53044239794,"id":83,"parentId":45,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":618115,"timestamp":53044227359,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778861016474,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":605783,"timestamp":53044239839,"id":86,"parentId":48,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":616435,"timestamp":53044229224,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778861016475,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":609289,"timestamp":53044239855,"id":87,"parentId":49,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":619867,"timestamp":53044229334,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778861016476,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":601784,"timestamp":53044251756,"id":88,"parentId":24,"tags":{},"startTime":1778861016498,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":632957,"timestamp":53044220638,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778861016467,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":595458,"timestamp":53044258259,"id":89,"parentId":31,"tags":{},"startTime":1778861016505,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":629030,"timestamp":53044224716,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778861016471,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":618395,"timestamp":53044239768,"id":81,"parentId":43,"tags":{},"startTime":1778861016486,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":631103,"timestamp":53044227105,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778861016473,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":604759,"timestamp":53044260963,"id":94,"parentId":53,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":635366,"timestamp":53044230405,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778861016477,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":611041,"timestamp":53044265072,"id":97,"parentId":57,"tags":{},"startTime":1778861016511,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":644448,"timestamp":53044231745,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778861016478,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":618476,"timestamp":53044265106,"id":98,"parentId":59,"tags":{},"startTime":1778861016511,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":651223,"timestamp":53044232424,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778861016479,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":636010,"timestamp":53044265131,"id":99,"parentId":60,"tags":{},"startTime":1778861016511,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":668641,"timestamp":53044232587,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778861016479,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":640504,"timestamp":53044260916,"id":91,"parentId":50,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":671742,"timestamp":53044229734,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778861016476,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":642722,"timestamp":53044265151,"id":100,"parentId":61,"tags":{},"startTime":1778861016511,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":675193,"timestamp":53044232746,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778861016479,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":651776,"timestamp":53044260934,"id":92,"parentId":51,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":682855,"timestamp":53044229919,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778861016476,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":654116,"timestamp":53044260979,"id":95,"parentId":54,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":684507,"timestamp":53044230635,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778861016477,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":628930,"timestamp":53044286780,"id":102,"parentId":58,"tags":{},"startTime":1778861016533,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":683804,"timestamp":53044231948,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778861016478,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":655415,"timestamp":53044260880,"id":90,"parentId":23,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":695973,"timestamp":53044220363,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778861016467,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":656575,"timestamp":53044260992,"id":96,"parentId":56,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":686089,"timestamp":53044231520,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778861016478,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":641804,"timestamp":53044277442,"id":101,"parentId":55,"tags":{},"startTime":1778861016524,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":688380,"timestamp":53044230903,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778861016477,"traceId":"1867395b661d04ea"},{"name":"is-page-static","duration":661051,"timestamp":53044260947,"id":93,"parentId":52,"tags":{},"startTime":1778861016507,"traceId":"1867395b661d04ea"},{"name":"check-page","duration":691904,"timestamp":53044230166,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778861016476,"traceId":"1867395b661d04ea"},{"name":"static-check","duration":706858,"timestamp":53044215257,"id":19,"parentId":1,"tags":{},"startTime":1778861016462,"traceId":"1867395b661d04ea"},{"name":"write-routes-manifest","duration":560,"timestamp":53044929535,"id":104,"parentId":1,"tags":{},"startTime":1778861017176,"traceId":"1867395b661d04ea"},{"name":"load-dotenv","duration":47,"timestamp":53044940692,"id":107,"parentId":106,"tags":{},"startTime":1778861017187,"traceId":"1867395b661d04ea"},{"name":"run-export-path-map","duration":586,"timestamp":53044943369,"id":108,"parentId":106,"tags":{},"startTime":1778861017190,"traceId":"1867395b661d04ea"},{"name":"next-export","duration":588433,"timestamp":53044939486,"id":106,"parentId":1,"tags":{},"startTime":1778861017186,"traceId":"1867395b661d04ea"}]
2
+ [{"name":"move-exported-app-not-found-","duration":3123,"timestamp":53045531265,"id":109,"parentId":105,"tags":{},"startTime":1778861017778,"traceId":"1867395b661d04ea"},{"name":"move-exported-app-global-error-","duration":1150,"timestamp":53045534492,"id":110,"parentId":105,"tags":{},"startTime":1778861017781,"traceId":"1867395b661d04ea"},{"name":"static-generation","duration":603831,"timestamp":53044933828,"id":105,"parentId":1,"tags":{},"startTime":1778861017180,"traceId":"1867395b661d04ea"},{"name":"write-routes-manifest","duration":502,"timestamp":53045537861,"id":111,"parentId":1,"tags":{},"startTime":1778861017784,"traceId":"1867395b661d04ea"},{"name":"print-tree-view","duration":3759,"timestamp":53045544933,"id":112,"parentId":1,"tags":{},"startTime":1778861017791,"traceId":"1867395b661d04ea"},{"name":"write-route-bundle-stats","duration":17248,"timestamp":53045548723,"id":113,"parentId":1,"tags":{},"startTime":1778861017795,"traceId":"1867395b661d04ea"},{"name":"telemetry-flush","duration":68419,"timestamp":53045566020,"id":114,"parentId":1,"tags":{},"startTime":1778861017812,"traceId":"1867395b661d04ea"},{"name":"next-build","duration":16190343,"timestamp":53029444154,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778861001690,"traceId":"1867395b661d04ea"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5725005,"timestamp":52260607364,"id":14,"parentId":1,"tags":{},"startTime":1778860232854,"traceId":"c4f2494ba5a90dd6"},{"name":"turbopack-build-events","duration":76,"timestamp":52260893900,"id":15,"parentId":1,"tags":{},"startTime":1778860233140,"traceId":"c4f2494ba5a90dd6"},{"name":"run-typescript","duration":8477339,"timestamp":52266340643,"id":16,"parentId":1,"tags":{},"startTime":1778860238587,"traceId":"c4f2494ba5a90dd6"},{"name":"static-check","duration":710358,"timestamp":52275011897,"id":19,"parentId":1,"tags":{},"startTime":1778860247258,"traceId":"c4f2494ba5a90dd6"},{"name":"static-generation","duration":581648,"timestamp":52275733132,"id":105,"parentId":1,"tags":{},"startTime":1778860247979,"traceId":"c4f2494ba5a90dd6"},{"name":"telemetry-flush","duration":40153,"timestamp":52276350262,"id":114,"parentId":1,"tags":{},"startTime":1778860248597,"traceId":"c4f2494ba5a90dd6"},{"name":"next-build","duration":15982219,"timestamp":52260408241,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778860232655,"traceId":"c4f2494ba5a90dd6"}]
1
+ [{"name":"run-turbopack","duration":5485039,"timestamp":53029630021,"id":14,"parentId":1,"tags":{},"startTime":1778861001876,"traceId":"1867395b661d04ea"},{"name":"turbopack-build-events","duration":119,"timestamp":53029916946,"id":15,"parentId":1,"tags":{},"startTime":1778861002163,"traceId":"1867395b661d04ea"},{"name":"run-typescript","duration":8920853,"timestamp":53035123343,"id":16,"parentId":1,"tags":{},"startTime":1778861007370,"traceId":"1867395b661d04ea"},{"name":"static-check","duration":706858,"timestamp":53044215257,"id":19,"parentId":1,"tags":{},"startTime":1778861016462,"traceId":"1867395b661d04ea"},{"name":"static-generation","duration":603831,"timestamp":53044933828,"id":105,"parentId":1,"tags":{},"startTime":1778861017180,"traceId":"1867395b661d04ea"},{"name":"telemetry-flush","duration":68419,"timestamp":53045566020,"id":114,"parentId":1,"tags":{},"startTime":1778861017812,"traceId":"1867395b661d04ea"},{"name":"next-build","duration":16190343,"timestamp":53029444154,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778861001690,"traceId":"1867395b661d04ea"}]
@@ -853,6 +853,14 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
853
853
  // navigation footer. Drives the on-hover opacity boost + underline
854
854
  // that signals interactivity, mirroring the hoveredHub idiom above.
855
855
  const [hoveredRecentMore, setHoveredRecentMore] = useState(false);
856
+ // R135: panel-wide hover-elevation. The recent-signal + legend
857
+ // panels both already host clickable rows (R56/R116 recent rows,
858
+ // R55/R61 legend rows) and a clickable footer (R133), so the
859
+ // chrome itself is interactive territory. Drop-shadow boost on
860
+ // mouseenter says "this whole panel is alive" — matches the R18
861
+ // KPI-card-hover idiom from the Overview page. Single state for
862
+ // both panels since they don't overlap; null when neither hovered.
863
+ const [hoveredPanel, setHoveredPanel] = useState<'recent' | 'legend' | null>(null);
856
864
  // Round 80 / Loop: vendor-letter hover in the distribution chip. The
857
865
  // chip already names vendor mix (`C:5 G:3 ?:1`); hover a letter and
858
866
  // every node from OTHER vendors dims. Surfaces the breakdown spatially
@@ -1857,18 +1865,40 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1857
1865
  .map(l => `${l.from}→${l.to} (${l.count})`)
1858
1866
  .join(', ');
1859
1867
  const flowSuffix = flowLinks.length > 6 ? ` + ${flowLinks.length - 6} more` : '';
1860
- const tooltip = flowLinks.length === 0
1868
+ // R136: the chip already had cursor:pointer when flowLinks
1869
+ // > 0 (line 1877) — but no onClick was wired. The cursor
1870
+ // lied; users got the affordance signal with no follow-
1871
+ // through. Wire it to /messages, mirroring R133's footer-
1872
+ // nav idiom. Hover (R77) keeps its semantic "preview all
1873
+ // flows on canvas"; click is the action "open the full
1874
+ // list". Two distinct gestures, both meaningful. The
1875
+ // tooltip grows a "click to open" tail when interactive.
1876
+ // Drop the chip out of click territory entirely when
1877
+ // flowLinks is empty — no flows = no list to open.
1878
+ const isInteractive = flowLinks.length > 0;
1879
+ const tooltip = !isInteractive
1861
1880
  ? undefined
1862
- : `${flowList}${flowSuffix} — hover brightens all`;
1881
+ : `${flowList}${flowSuffix} — hover brightens all · click to open /messages`;
1863
1882
  return (
1864
1883
  <span
1865
1884
  className="hidden sm:inline px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20"
1866
1885
  data-active-links-chip
1867
1886
  data-active-links-flow-count={flowLinks.length}
1887
+ data-active-links-clickable={isInteractive ? 'true' : 'false'}
1868
1888
  title={tooltip}
1869
- style={{ cursor: flowLinks.length > 0 ? 'pointer' : undefined }}
1870
- onMouseEnter={() => { if (flowLinks.length > 0) setHoveredActiveLinks(true); }}
1889
+ role={isInteractive ? 'link' : undefined}
1890
+ tabIndex={isInteractive ? 0 : undefined}
1891
+ style={{ cursor: isInteractive ? 'pointer' : undefined }}
1892
+ onMouseEnter={() => { if (isInteractive) setHoveredActiveLinks(true); }}
1871
1893
  onMouseLeave={() => setHoveredActiveLinks(false)}
1894
+ onClick={() => { if (isInteractive) router.push('/messages'); }}
1895
+ onKeyDown={(e) => {
1896
+ if (!isInteractive) return;
1897
+ if (e.key === 'Enter' || e.key === ' ') {
1898
+ e.preventDefault();
1899
+ router.push('/messages');
1900
+ }
1901
+ }}
1872
1902
  >
1873
1903
  {flowLinks.length} active link{flowLinks.length === 1 ? '' : 's'}
1874
1904
  {rel ? <span className="text-gray-500"> · last {rel}</span> : null}
@@ -3392,13 +3422,35 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3392
3422
  panels carry the filter. The filter is on the rect, not
3393
3423
  the parent <g>, so it doesn't shadow the rows + text inside
3394
3424
  — only the panel chrome lifts. */}
3395
- <g transform="translate(16, 16)">
3425
+ <g
3426
+ transform="translate(16, 16)"
3427
+ data-topo-panel="recent"
3428
+ data-topo-panel-hovered={hoveredPanel === 'recent' ? 'true' : 'false'}
3429
+ onMouseEnter={() => setHoveredPanel('recent')}
3430
+ onMouseLeave={() => setHoveredPanel(prev => prev === 'recent' ? null : prev)}
3431
+ >
3396
3432
  <rect
3397
3433
  x="0" y="0" width="230" height="84" rx="10"
3398
3434
  fill={pal.legendBox.fill}
3399
3435
  stroke={pal.legendBox.stroke}
3400
3436
  opacity={isLight ? 0.97 : 0.92}
3401
- style={{ filter: isLight ? 'drop-shadow(0 2px 6px rgba(15,23,42,0.08))' : 'drop-shadow(0 2px 6px rgba(0,0,0,0.45))' }}
3437
+ style={{
3438
+ /* R135: drop-shadow intensifies on panel hover. Base
3439
+ shadow (2px / 6px blur) signals card elevation
3440
+ (R57); hovered (4px / 12px blur) tells the user
3441
+ the whole chrome is interactive territory — rows
3442
+ pin (R116), footer navigates (R133), legend rows
3443
+ pin status (R61). Reuses R18's KPI-card hover-
3444
+ elevation idiom for visual consistency. Theme-
3445
+ aware shadow colour stays the same; just the
3446
+ spread + blur grow. */
3447
+ filter: hoveredPanel === 'recent'
3448
+ ? (isLight ? 'drop-shadow(0 4px 12px rgba(15,23,42,0.14))'
3449
+ : 'drop-shadow(0 4px 12px rgba(0,0,0,0.65))')
3450
+ : (isLight ? 'drop-shadow(0 2px 6px rgba(15,23,42,0.08))'
3451
+ : 'drop-shadow(0 2px 6px rgba(0,0,0,0.45))'),
3452
+ transition: 'filter 200ms ease-out',
3453
+ }}
3402
3454
  data-topo-panel-elevation="recent"
3403
3455
  />
3404
3456
  <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700">recent signal</text>
@@ -3663,17 +3715,34 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3663
3715
  The row text brightens to legendHeadline while hovered as
3664
3716
  a small affordance hint. Geometry unchanged — the new
3665
3717
  <g> wrappers only carry pointer handlers. */}
3666
- <g transform="translate(760, 16)">
3718
+ <g
3719
+ transform="translate(760, 16)"
3720
+ data-topo-panel="legend"
3721
+ data-topo-panel-hovered={hoveredPanel === 'legend' ? 'true' : 'false'}
3722
+ onMouseEnter={() => setHoveredPanel('legend')}
3723
+ onMouseLeave={() => setHoveredPanel(prev => prev === 'legend' ? null : prev)}
3724
+ >
3667
3725
  {/* R57: matching drop-shadow elevation to the legend panel.
3668
3726
  R106: panel height grew 96 → 104 to seat the new header
3669
3727
  line + 4 px row-shift below it (so the new header text
3670
- doesn't overlap the row-1 hitbox region). */}
3728
+ doesn't overlap the row-1 hitbox region).
3729
+ R135: hover-elevation mirrors the recent-signal panel
3730
+ rect at line ~3299. Both panels grow their shadow on
3731
+ hover to telegraph "the chrome is interactive" since
3732
+ their rows pin / nav. */}
3671
3733
  <rect
3672
3734
  x="0" y="0" width="224" height="104" rx="10"
3673
3735
  fill={pal.legendBox.fill}
3674
3736
  stroke={pal.legendBox.stroke}
3675
3737
  opacity={isLight ? 0.97 : 0.92}
3676
- style={{ filter: isLight ? 'drop-shadow(0 2px 6px rgba(15,23,42,0.08))' : 'drop-shadow(0 2px 6px rgba(0,0,0,0.45))' }}
3738
+ style={{
3739
+ filter: hoveredPanel === 'legend'
3740
+ ? (isLight ? 'drop-shadow(0 4px 12px rgba(15,23,42,0.14))'
3741
+ : 'drop-shadow(0 4px 12px rgba(0,0,0,0.65))')
3742
+ : (isLight ? 'drop-shadow(0 2px 6px rgba(15,23,42,0.08))'
3743
+ : 'drop-shadow(0 2px 6px rgba(0,0,0,0.45))'),
3744
+ transition: 'filter 200ms ease-out',
3745
+ }}
3677
3746
  data-topo-panel-elevation="legend"
3678
3747
  />
3679
3748
  {/* R106 / Loop: panel header — symmetric with the recent-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.141",
3
+ "version": "0.4.6-preview.143",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,117 @@
1
+ /* Round 136 verification: the "N active links" chip in the chip
2
+ * row becomes a clickable nav to /messages when flowLinks.length
3
+ * > 0. Closes the cursor-pointer-lying bug — the chip already had
4
+ * cursor:pointer set when interactive, but no onClick handler was
5
+ * wired (line 1877 of TopoGraph.tsx pre-R136). Mirrors R133 footer-
6
+ * nav idiom and generalizes "click to open the full flow list"
7
+ * across the chip row, not just the recent-signal panel.
8
+ *
9
+ * Two-state behavior:
10
+ * - flowLinks.length === 0 → not interactive: no role=link, no
11
+ * cursor:pointer, no onClick fires
12
+ * - flowLinks.length > 0 → role=link, tabIndex=0, cursor:pointer,
13
+ * onClick → /messages, tooltip mentions "click to open"
14
+ *
15
+ * Hover still boosts edges (R77) regardless — that's a separate
16
+ * gesture.
17
+ */
18
+ import { chromium } from 'playwright';
19
+ import { readFileSync } from 'node:fs';
20
+
21
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
22
+
23
+ async function probeWithFlows(pairCount) {
24
+ const browser = await chromium.launch({ headless: true });
25
+ const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
26
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
27
+ await ctx.addInitScript(() => {
28
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
29
+ });
30
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
31
+ const aliases = ['alpha', 'beta', 'gamma', 'delta', 'epsilon'];
32
+ await ctx.route('**/api/hub/status*', async (route) => {
33
+ const r = await route.fetch();
34
+ const b = await r.json();
35
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
36
+ const mk = (alias) => ({
37
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
38
+ network_id: nid, project_dir: null,
39
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
40
+ });
41
+ await route.fulfill({ response: r, json: { ...b, sessions: aliases.map(mk) } });
42
+ });
43
+ const now = Date.now();
44
+ const msgs = [];
45
+ for (let i = 0; i < pairCount; i++) {
46
+ msgs.push({
47
+ id: `m${i}`,
48
+ from_alias: aliases[i % aliases.length],
49
+ to_alias: aliases[(i + 1) % aliases.length],
50
+ content: 'hi',
51
+ network_id: 'default',
52
+ created_at: new Date(now - (20000 + i * 1000)).toISOString(),
53
+ });
54
+ }
55
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: msgs } }));
56
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
57
+
58
+ const page = await ctx.newPage();
59
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
60
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 5, { timeout: 30000 });
61
+ await page.waitForSelector('[data-active-links-chip]', { timeout: 10000 });
62
+ await page.waitForTimeout(400);
63
+
64
+ const probe = await page.evaluate(() => {
65
+ const chip = document.querySelector('[data-active-links-chip]');
66
+ return {
67
+ flowCount: chip?.getAttribute('data-active-links-flow-count'),
68
+ clickable: chip?.getAttribute('data-active-links-clickable'),
69
+ role: chip?.getAttribute('role'),
70
+ tabindex: chip?.getAttribute('tabindex'),
71
+ cursor: (chip?.getAttribute('style') || '').includes('cursor: pointer'),
72
+ title: chip?.getAttribute('title'),
73
+ };
74
+ });
75
+
76
+ let finalUrl = null;
77
+ if (pairCount > 0) {
78
+ await page.locator('[data-active-links-chip]').click();
79
+ await page.waitForURL('**/messages', { timeout: 10000 });
80
+ finalUrl = page.url();
81
+ }
82
+ await browser.close();
83
+ return { probe, finalUrl };
84
+ }
85
+
86
+ const empty = await probeWithFlows(0);
87
+ const oneFlow = await probeWithFlows(1);
88
+ const many = await probeWithFlows(3);
89
+
90
+ const results = {
91
+ // Empty (0 flows) — not interactive
92
+ empty_flowCount0: empty.probe.flowCount === '0',
93
+ empty_clickableFalse: empty.probe.clickable === 'false',
94
+ empty_noRole: empty.probe.role === null || empty.probe.role === undefined,
95
+ empty_noTabIndex: empty.probe.tabindex === null || empty.probe.tabindex === undefined,
96
+ empty_noPointer: !empty.probe.cursor,
97
+ empty_noTooltip: !empty.probe.title,
98
+
99
+ // 1 flow — interactive
100
+ one_flowCount1: oneFlow.probe.flowCount === '1',
101
+ one_clickableTrue: oneFlow.probe.clickable === 'true',
102
+ one_roleLink: oneFlow.probe.role === 'link',
103
+ one_tabIndex0: oneFlow.probe.tabindex === '0',
104
+ one_cursorPointer: oneFlow.probe.cursor,
105
+ one_titleMentionsOpen: (oneFlow.probe.title || '').includes('click to open'),
106
+ one_navigatedToMessages: /\/messages$/.test(oneFlow.finalUrl || ''),
107
+
108
+ // 3 flows — same interactive shape
109
+ many_clickableTrue: many.probe.clickable === 'true',
110
+ many_navigatedToMessages: /\/messages$/.test(many.finalUrl || ''),
111
+ };
112
+ const ok = Object.values(results).every(Boolean);
113
+ console.log(`${ok ? '✅' : '❌'} active-links chip nav:`, JSON.stringify(results),
114
+ `\n empty=`, empty,
115
+ `\n oneFlow=`, oneFlow,
116
+ `\n many=`, many);
117
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,118 @@
1
+ /* Round 135 verification: both overlay panels (recent-signal +
2
+ * legend) drop-shadow boosts on mouseenter, restores on leave.
3
+ * Mirrors R18's KPI-card hover-elevation from the Overview page.
4
+ *
5
+ * Why both panels: each panel chrome already hosts interactive
6
+ * rows (R56/R116 recent rows, R55/R61 legend rows) and footer
7
+ * nav (R133). Hover-lift signals "this whole panel is alive"
8
+ * without misleading users that the panel itself is clickable —
9
+ * the underlying click affordances are still the rows + footer.
10
+ *
11
+ * State transitions tested:
12
+ * 1. Neither panel hovered → both data-topo-panel-hovered="false",
13
+ * both rect filters = baseline (2px/6px blur)
14
+ * 2. Hover recent → that panel hovered=true, filter boosted
15
+ * (4px/12px blur); legend still baseline
16
+ * 3. Leave recent (move far away) → recent restored
17
+ * 4. Hover legend → legend hovered=true, filter boosted
18
+ * 5. Leave legend → legend restored
19
+ *
20
+ * Filter inline-string detection: the boosted variant carries the
21
+ * `4px 12px` magic numbers in its drop-shadow argument.
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
+
29
+ const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
30
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
31
+ await ctx.addInitScript(() => {
32
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
33
+ });
34
+
35
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
36
+ await ctx.route('**/api/hub/status*', async (route) => {
37
+ const r = await route.fetch();
38
+ const b = await r.json();
39
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
40
+ const mk = (alias, status) => ({
41
+ alias, status, model: 'claude-opus-4', runtime: 'cli-claude-code',
42
+ network_id: nid, project_dir: null,
43
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
44
+ });
45
+ await route.fulfill({ response: r, json: { ...b, sessions: [
46
+ mk('alpha', 'working'), mk('beta', 'idle'), mk('gamma', 'working'),
47
+ ] } });
48
+ });
49
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
50
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
51
+ const page = await ctx.newPage();
52
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
53
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 3, { timeout: 30000 });
54
+ await page.waitForSelector('[data-topo-panel="recent"]', { timeout: 10000 });
55
+ await page.waitForTimeout(400);
56
+
57
+ const inspect = () => page.evaluate(() => {
58
+ const get = (key) => {
59
+ const g = document.querySelector(`[data-topo-panel="${key}"]`);
60
+ const rect = g?.querySelector('rect[data-topo-panel-elevation]');
61
+ return {
62
+ hovered: g?.getAttribute('data-topo-panel-hovered'),
63
+ filter: (rect?.getAttribute('style') || ''),
64
+ };
65
+ };
66
+ return { recent: get('recent'), legend: get('legend') };
67
+ });
68
+
69
+ // State 1 — neither hovered
70
+ const s1 = await inspect();
71
+
72
+ // State 2 — hover recent
73
+ await page.locator('[data-topo-panel="recent"]').hover();
74
+ await page.waitForTimeout(300);
75
+ const s2 = await inspect();
76
+
77
+ // State 3 — leave recent (move far away from both panels)
78
+ await page.mouse.move(700, 350);
79
+ await page.waitForTimeout(300);
80
+ const s3 = await inspect();
81
+
82
+ // State 4 — hover legend
83
+ await page.locator('[data-topo-panel="legend"]').hover();
84
+ await page.waitForTimeout(300);
85
+ const s4 = await inspect();
86
+
87
+ // State 5 — leave legend
88
+ await page.mouse.move(500, 350);
89
+ await page.waitForTimeout(300);
90
+ const s5 = await inspect();
91
+
92
+ await browser.close();
93
+
94
+ const isBoosted = (style) => /4px\s+12px/.test(style);
95
+ const isBase = (style) => /2px\s+6px/.test(style) && !/4px\s+12px/.test(style);
96
+
97
+ const results = {
98
+ s1_recent_notHovered: s1.recent.hovered === 'false',
99
+ s1_legend_notHovered: s1.legend.hovered === 'false',
100
+ s1_recent_baseShadow: isBase(s1.recent.filter),
101
+ s1_legend_baseShadow: isBase(s1.legend.filter),
102
+
103
+ s2_recent_hovered: s2.recent.hovered === 'true',
104
+ s2_recent_boosted: isBoosted(s2.recent.filter),
105
+ s2_legend_stillBase: s2.legend.hovered === 'false' && isBase(s2.legend.filter),
106
+
107
+ s3_recent_restored: s3.recent.hovered === 'false' && isBase(s3.recent.filter),
108
+
109
+ s4_legend_hovered: s4.legend.hovered === 'true',
110
+ s4_legend_boosted: isBoosted(s4.legend.filter),
111
+ s4_recent_stillBase: s4.recent.hovered === 'false' && isBase(s4.recent.filter),
112
+
113
+ s5_legend_restored: s5.legend.hovered === 'false' && isBase(s5.legend.filter),
114
+ };
115
+ const ok = Object.values(results).every(Boolean);
116
+ console.log(`${ok ? '✅' : '❌'} panel hover elevation:`, JSON.stringify(results),
117
+ `\n s1=`, s1, `\n s2=`, s2, `\n s3=`, s3, `\n s4=`, s4, `\n s5=`, s5);
118
+ process.exit(ok ? 0 : 1);