@sleep2agi/agent-network-dashboard 0.4.6-preview.57 → 0.4.6-preview.59

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 (146) 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 +2 -2
  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/{06r1pc~cd7xfa.js → 037tjr7sz6f~t.js} +1 -1
  133. package/.next/static/chunks/{16peqogm-h4p3.js → 0awgcn9goof5n.js} +1 -1
  134. package/.next/static/chunks/11p1g4_99qt2k.js +2 -0
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +41 -5
  138. package/package.json +1 -1
  139. package/scripts/topo-hub-click-fit-test.mjs +137 -0
  140. package/scripts/topo-hub-title-test.mjs +7 -2
  141. package/scripts/topo-label-lift-test.mjs +5 -1
  142. package/scripts/topo-node-hover-lift-test.mjs +85 -0
  143. package/.next/static/chunks/0p_6ksiknegta.js +0 -2
  144. /package/.next/static/{M01M9zzBqFxO74kap90B1 → yDT7RCISdKIh2yCe1abx2}/_buildManifest.js +0 -0
  145. /package/.next/static/{M01M9zzBqFxO74kap90B1 → yDT7RCISdKIh2yCe1abx2}/_clientMiddlewareManifest.js +0 -0
  146. /package/.next/static/{M01M9zzBqFxO74kap90B1 → yDT7RCISdKIh2yCe1abx2}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":370,"timestamp":24422474299,"id":4,"parentId":1,"tags":{},"startTime":1778832394721,"traceId":"894c9622eb7ef979"},{"name":"load-custom-routes","duration":702,"timestamp":24422474864,"id":5,"parentId":1,"tags":{},"startTime":1778832394721,"traceId":"894c9622eb7ef979"},{"name":"create-dist-dir","duration":956,"timestamp":24422475638,"id":6,"parentId":1,"tags":{},"startTime":1778832394722,"traceId":"894c9622eb7ef979"},{"name":"clean","duration":730,"timestamp":24422477436,"id":7,"parentId":1,"tags":{},"startTime":1778832394724,"traceId":"894c9622eb7ef979"},{"name":"discover-routes","duration":10764,"timestamp":24422564512,"id":8,"parentId":1,"tags":{},"startTime":1778832394811,"traceId":"894c9622eb7ef979"},{"name":"create-root-mapping","duration":136,"timestamp":24422575354,"id":9,"parentId":1,"tags":{},"startTime":1778832394822,"traceId":"894c9622eb7ef979"},{"name":"generate-route-types","duration":34134,"timestamp":24422578237,"id":10,"parentId":1,"tags":{},"startTime":1778832394825,"traceId":"894c9622eb7ef979"},{"name":"public-dir-conflict-check","duration":108,"timestamp":24422612545,"id":11,"parentId":1,"tags":{},"startTime":1778832394859,"traceId":"894c9622eb7ef979"},{"name":"generate-routes-manifest","duration":5115,"timestamp":24422612816,"id":12,"parentId":1,"tags":{},"startTime":1778832394859,"traceId":"894c9622eb7ef979"},{"name":"run-turbopack","duration":6065980,"timestamp":24422623209,"id":14,"parentId":1,"tags":{},"startTime":1778832394869,"traceId":"894c9622eb7ef979"},{"name":"turbopack-build-events","duration":102,"timestamp":24422906206,"id":15,"parentId":1,"tags":{},"startTime":1778832395152,"traceId":"894c9622eb7ef979"},{"name":"run-typescript","duration":8919296,"timestamp":24428701727,"id":16,"parentId":1,"tags":{},"startTime":1778832400948,"traceId":"894c9622eb7ef979"},{"name":"generate-required-server-files","duration":2967,"timestamp":24437622317,"id":18,"parentId":1,"tags":{},"startTime":1778832409869,"traceId":"894c9622eb7ef979"},{"name":"check-static-error-page","duration":15580,"timestamp":24437802408,"id":20,"parentId":19,"tags":{},"startTime":1778832410049,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":525925,"timestamp":24437822421,"id":63,"parentId":22,"tags":{},"startTime":1778832410069,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":542751,"timestamp":24437805786,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778832410052,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":555975,"timestamp":24437823131,"id":67,"parentId":28,"tags":{},"startTime":1778832410069,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":569584,"timestamp":24437809636,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778832410056,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":569762,"timestamp":24437823636,"id":70,"parentId":32,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":583114,"timestamp":24437810373,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778832410057,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":591889,"timestamp":24437823709,"id":71,"parentId":33,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":605175,"timestamp":24437810511,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778832410057,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":598339,"timestamp":24437821986,"id":62,"parentId":21,"tags":{},"startTime":1778832410068,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":616232,"timestamp":24437804164,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778832410050,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":597658,"timestamp":24437823801,"id":72,"parentId":34,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":610871,"timestamp":24437810648,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778832410057,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":604936,"timestamp":24437823306,"id":68,"parentId":29,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":618540,"timestamp":24437809759,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778832410056,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":605905,"timestamp":24437822561,"id":64,"parentId":25,"tags":{},"startTime":1778832410069,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":619290,"timestamp":24437809203,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778832410055,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":619132,"timestamp":24437823978,"id":74,"parentId":36,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":631790,"timestamp":24437811414,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778832410058,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":620115,"timestamp":24437824069,"id":77,"parentId":39,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":632357,"timestamp":24437811885,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778832410058,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":624965,"timestamp":24437824081,"id":78,"parentId":40,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":637092,"timestamp":24437812024,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778832410058,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":629427,"timestamp":24437824097,"id":79,"parentId":41,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":641445,"timestamp":24437812135,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778832410058,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":634518,"timestamp":24437824115,"id":80,"parentId":42,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":646441,"timestamp":24437812250,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778832410059,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":639739,"timestamp":24437824132,"id":81,"parentId":43,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":651588,"timestamp":24437812356,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778832410059,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":644328,"timestamp":24437824145,"id":82,"parentId":44,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":656078,"timestamp":24437812460,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778832410059,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":649220,"timestamp":24437824160,"id":83,"parentId":45,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":660853,"timestamp":24437812575,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778832410059,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":652877,"timestamp":24437824053,"id":76,"parentId":38,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":665217,"timestamp":24437811780,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778832410058,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":654582,"timestamp":24437822704,"id":65,"parentId":26,"tags":{},"startTime":1778832410069,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":667941,"timestamp":24437809386,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778832410056,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":656744,"timestamp":24437824031,"id":75,"parentId":37,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":669200,"timestamp":24437811625,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778832410058,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":656840,"timestamp":24437824175,"id":84,"parentId":46,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":666980,"timestamp":24437814070,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778832410060,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":660924,"timestamp":24437822821,"id":66,"parentId":27,"tags":{},"startTime":1778832410069,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":674277,"timestamp":24437809509,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778832410056,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":659327,"timestamp":24437827634,"id":88,"parentId":24,"tags":{},"startTime":1778832410074,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":680673,"timestamp":24437806354,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778832410053,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":660576,"timestamp":24437828833,"id":89,"parentId":31,"tags":{},"startTime":1778832410075,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":679379,"timestamp":24437810076,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778832410056,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":671009,"timestamp":24437824187,"id":85,"parentId":47,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":681001,"timestamp":24437814239,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778832410061,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":679845,"timestamp":24437824217,"id":87,"parentId":49,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":689665,"timestamp":24437814454,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778832410061,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":684749,"timestamp":24437824201,"id":86,"parentId":48,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":694648,"timestamp":24437814349,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778832410061,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":689382,"timestamp":24437823837,"id":73,"parentId":35,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":702483,"timestamp":24437810788,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778832410057,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":690102,"timestamp":24437831411,"id":95,"parentId":54,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":705885,"timestamp":24437815676,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778832410062,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":700137,"timestamp":24437823443,"id":69,"parentId":30,"tags":{},"startTime":1778832410070,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":713706,"timestamp":24437809926,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778832410056,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":698337,"timestamp":24437831422,"id":96,"parentId":56,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":713270,"timestamp":24437816539,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778832410063,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":710723,"timestamp":24437831453,"id":98,"parentId":59,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":724827,"timestamp":24437817416,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778832410064,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":717047,"timestamp":24437831367,"id":92,"parentId":51,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":733387,"timestamp":24437815072,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778832410061,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":722400,"timestamp":24437831490,"id":100,"parentId":61,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":736252,"timestamp":24437817717,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778832410064,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":723018,"timestamp":24437831473,"id":99,"parentId":60,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":736969,"timestamp":24437817573,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778832410064,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":725795,"timestamp":24437831380,"id":93,"parentId":52,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":741958,"timestamp":24437815258,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778832410062,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":723426,"timestamp":24437837080,"id":101,"parentId":58,"tags":{},"startTime":1778832410083,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":743583,"timestamp":24437816965,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778832410063,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":695331,"timestamp":24437867047,"id":102,"parentId":55,"tags":{},"startTime":1778832410113,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":746481,"timestamp":24437815937,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778832410062,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":731675,"timestamp":24437831318,"id":90,"parentId":23,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":756965,"timestamp":24437806103,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778832410052,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":742795,"timestamp":24437831396,"id":94,"parentId":53,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":758772,"timestamp":24437815467,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778832410062,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":749121,"timestamp":24437831349,"id":91,"parentId":50,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":765652,"timestamp":24437814859,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778832410061,"traceId":"894c9622eb7ef979"},{"name":"is-page-static","duration":749530,"timestamp":24437831438,"id":97,"parentId":57,"tags":{},"startTime":1778832410078,"traceId":"894c9622eb7ef979"},{"name":"check-page","duration":764231,"timestamp":24437816766,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778832410063,"traceId":"894c9622eb7ef979"},{"name":"static-check","duration":779877,"timestamp":24437801197,"id":19,"parentId":1,"tags":{},"startTime":1778832410047,"traceId":"894c9622eb7ef979"},{"name":"write-routes-manifest","duration":403,"timestamp":24438588104,"id":104,"parentId":1,"tags":{},"startTime":1778832410834,"traceId":"894c9622eb7ef979"},{"name":"load-dotenv","duration":61,"timestamp":24438601350,"id":107,"parentId":106,"tags":{},"startTime":1778832410848,"traceId":"894c9622eb7ef979"},{"name":"run-export-path-map","duration":609,"timestamp":24438604341,"id":108,"parentId":106,"tags":{},"startTime":1778832410851,"traceId":"894c9622eb7ef979"},{"name":"next-export","duration":598203,"timestamp":24438599741,"id":106,"parentId":1,"tags":{},"startTime":1778832410846,"traceId":"894c9622eb7ef979"}]
2
- [{"name":"move-exported-app-not-found-","duration":2815,"timestamp":24439202620,"id":109,"parentId":105,"tags":{},"startTime":1778832411449,"traceId":"894c9622eb7ef979"},{"name":"move-exported-app-global-error-","duration":689,"timestamp":24439205550,"id":110,"parentId":105,"tags":{},"startTime":1778832411452,"traceId":"894c9622eb7ef979"},{"name":"static-generation","duration":615948,"timestamp":24438592428,"id":105,"parentId":1,"tags":{},"startTime":1778832410839,"traceId":"894c9622eb7ef979"},{"name":"write-routes-manifest","duration":382,"timestamp":24439208585,"id":111,"parentId":1,"tags":{},"startTime":1778832411455,"traceId":"894c9622eb7ef979"},{"name":"print-tree-view","duration":3901,"timestamp":24439220229,"id":112,"parentId":1,"tags":{},"startTime":1778832411467,"traceId":"894c9622eb7ef979"},{"name":"write-route-bundle-stats","duration":13788,"timestamp":24439224172,"id":113,"parentId":1,"tags":{},"startTime":1778832411470,"traceId":"894c9622eb7ef979"},{"name":"telemetry-flush","duration":29396,"timestamp":24439237989,"id":114,"parentId":1,"tags":{},"startTime":1778832411484,"traceId":"894c9622eb7ef979"},{"name":"next-build","duration":16850797,"timestamp":24422416626,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778832394663,"traceId":"894c9622eb7ef979"}]
1
+ [{"name":"generate-buildid","duration":275,"timestamp":25275198344,"id":4,"parentId":1,"tags":{},"startTime":1778833247445,"traceId":"0ffa3f03832411f5"},{"name":"load-custom-routes","duration":678,"timestamp":25275198787,"id":5,"parentId":1,"tags":{},"startTime":1778833247445,"traceId":"0ffa3f03832411f5"},{"name":"create-dist-dir","duration":740,"timestamp":25275199528,"id":6,"parentId":1,"tags":{},"startTime":1778833247446,"traceId":"0ffa3f03832411f5"},{"name":"clean","duration":482,"timestamp":25275200924,"id":7,"parentId":1,"tags":{},"startTime":1778833247447,"traceId":"0ffa3f03832411f5"},{"name":"discover-routes","duration":12076,"timestamp":25275284416,"id":8,"parentId":1,"tags":{},"startTime":1778833247531,"traceId":"0ffa3f03832411f5"},{"name":"create-root-mapping","duration":143,"timestamp":25275296564,"id":9,"parentId":1,"tags":{},"startTime":1778833247543,"traceId":"0ffa3f03832411f5"},{"name":"generate-route-types","duration":39878,"timestamp":25275299687,"id":10,"parentId":1,"tags":{},"startTime":1778833247546,"traceId":"0ffa3f03832411f5"},{"name":"public-dir-conflict-check","duration":153,"timestamp":25275339786,"id":11,"parentId":1,"tags":{},"startTime":1778833247586,"traceId":"0ffa3f03832411f5"},{"name":"generate-routes-manifest","duration":6322,"timestamp":25275340149,"id":12,"parentId":1,"tags":{},"startTime":1778833247586,"traceId":"0ffa3f03832411f5"},{"name":"run-turbopack","duration":5375301,"timestamp":25275353164,"id":14,"parentId":1,"tags":{},"startTime":1778833247599,"traceId":"0ffa3f03832411f5"},{"name":"turbopack-build-events","duration":71,"timestamp":25275631327,"id":15,"parentId":1,"tags":{},"startTime":1778833247878,"traceId":"0ffa3f03832411f5"},{"name":"run-typescript","duration":8151819,"timestamp":25280737699,"id":16,"parentId":1,"tags":{},"startTime":1778833252984,"traceId":"0ffa3f03832411f5"},{"name":"generate-required-server-files","duration":2218,"timestamp":25288890576,"id":18,"parentId":1,"tags":{},"startTime":1778833261137,"traceId":"0ffa3f03832411f5"},{"name":"check-static-error-page","duration":15320,"timestamp":25289071883,"id":20,"parentId":19,"tags":{},"startTime":1778833261318,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":451153,"timestamp":25289090396,"id":63,"parentId":22,"tags":{},"startTime":1778833261337,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":466364,"timestamp":25289075377,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778833261322,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":498890,"timestamp":25289090523,"id":64,"parentId":25,"tags":{},"startTime":1778833261337,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":511049,"timestamp":25289078478,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778833261325,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":521704,"timestamp":25289091690,"id":70,"parentId":32,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":533859,"timestamp":25289079617,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778833261326,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":535478,"timestamp":25289091749,"id":71,"parentId":33,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":547562,"timestamp":25289079745,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778833261326,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":551841,"timestamp":25289091822,"id":72,"parentId":34,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":563895,"timestamp":25289079860,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778833261326,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":556490,"timestamp":25289091851,"id":73,"parentId":35,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":568397,"timestamp":25289080020,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778833261326,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":560717,"timestamp":25289091981,"id":74,"parentId":36,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":572234,"timestamp":25289080531,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778833261327,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":564762,"timestamp":25289092026,"id":75,"parentId":37,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":576134,"timestamp":25289080713,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778833261327,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":566478,"timestamp":25289091400,"id":68,"parentId":29,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":578888,"timestamp":25289079083,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778833261325,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":563452,"timestamp":25289097416,"id":76,"parentId":38,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":580088,"timestamp":25289080856,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778833261327,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":572139,"timestamp":25289090987,"id":66,"parentId":27,"tags":{},"startTime":1778833261337,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":584397,"timestamp":25289078785,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778833261325,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":566040,"timestamp":25289097451,"id":77,"parentId":39,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":582562,"timestamp":25289080977,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778833261327,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":570222,"timestamp":25289097461,"id":78,"parentId":40,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":586639,"timestamp":25289081111,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778833261327,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":578605,"timestamp":25289097496,"id":81,"parentId":43,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":594749,"timestamp":25289081414,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":585116,"timestamp":25289091250,"id":67,"parentId":28,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":597501,"timestamp":25289078899,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778833261325,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":586657,"timestamp":25289089872,"id":62,"parentId":21,"tags":{},"startTime":1778833261336,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":602780,"timestamp":25289073773,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778833261320,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":584996,"timestamp":25289097508,"id":82,"parentId":44,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":601052,"timestamp":25289081515,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":588692,"timestamp":25289097474,"id":79,"parentId":41,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":605008,"timestamp":25289081203,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778833261327,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":588990,"timestamp":25289097519,"id":83,"parentId":45,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":604945,"timestamp":25289081615,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":599786,"timestamp":25289091521,"id":69,"parentId":30,"tags":{},"startTime":1778833261338,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":612155,"timestamp":25289079240,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778833261326,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":595806,"timestamp":25289097540,"id":85,"parentId":47,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":611570,"timestamp":25289081838,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":598031,"timestamp":25289097487,"id":80,"parentId":42,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":614261,"timestamp":25289081302,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":610702,"timestamp":25289097552,"id":86,"parentId":48,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":626359,"timestamp":25289081953,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":605460,"timestamp":25289106795,"id":89,"parentId":31,"tags":{},"startTime":1778833261353,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":632968,"timestamp":25289079353,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778833261326,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":624110,"timestamp":25289090856,"id":65,"parentId":26,"tags":{},"startTime":1778833261337,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":636369,"timestamp":25289078667,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778833261325,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":630721,"timestamp":25289097564,"id":87,"parentId":49,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":646294,"timestamp":25289082074,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":637791,"timestamp":25289105509,"id":88,"parentId":24,"tags":{},"startTime":1778833261352,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":667500,"timestamp":25289075874,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778833261322,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":647031,"timestamp":25289111147,"id":90,"parentId":23,"tags":{},"startTime":1778833261357,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":682612,"timestamp":25289075644,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778833261322,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":654289,"timestamp":25289111190,"id":91,"parentId":50,"tags":{},"startTime":1778833261357,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":681478,"timestamp":25289084074,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778833261330,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":675449,"timestamp":25289097532,"id":84,"parentId":46,"tags":{},"startTime":1778833261344,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":691418,"timestamp":25289081706,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778833261328,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":662064,"timestamp":25289111272,"id":97,"parentId":57,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":687378,"timestamp":25289085993,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778833261332,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":668194,"timestamp":25289111206,"id":92,"parentId":51,"tags":{},"startTime":1778833261357,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":695168,"timestamp":25289084297,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778833261331,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":670066,"timestamp":25289111281,"id":98,"parentId":59,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":694862,"timestamp":25289086633,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778833261333,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":672668,"timestamp":25289111320,"id":100,"parentId":61,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":697125,"timestamp":25289086931,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778833261333,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":676868,"timestamp":25289111302,"id":99,"parentId":60,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":701465,"timestamp":25289086773,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778833261333,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":663394,"timestamp":25289125391,"id":101,"parentId":58,"tags":{},"startTime":1778833261372,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":702641,"timestamp":25289086195,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778833261332,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":678305,"timestamp":25289111258,"id":96,"parentId":56,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":703832,"timestamp":25289085768,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778833261332,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":628846,"timestamp":25289162039,"id":102,"parentId":55,"tags":{},"startTime":1778833261408,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":705784,"timestamp":25289085146,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778833261331,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":689801,"timestamp":25289111244,"id":95,"parentId":54,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":716208,"timestamp":25289084878,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778833261331,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":703279,"timestamp":25289111234,"id":94,"parentId":53,"tags":{},"startTime":1778833261358,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":729899,"timestamp":25289084659,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778833261331,"traceId":"0ffa3f03832411f5"},{"name":"is-page-static","duration":703408,"timestamp":25289111221,"id":93,"parentId":52,"tags":{},"startTime":1778833261357,"traceId":"0ffa3f03832411f5"},{"name":"check-page","duration":730181,"timestamp":25289084463,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778833261331,"traceId":"0ffa3f03832411f5"},{"name":"static-check","duration":743958,"timestamp":25289070717,"id":19,"parentId":1,"tags":{},"startTime":1778833261317,"traceId":"0ffa3f03832411f5"},{"name":"write-routes-manifest","duration":377,"timestamp":25289821405,"id":104,"parentId":1,"tags":{},"startTime":1778833262068,"traceId":"0ffa3f03832411f5"},{"name":"load-dotenv","duration":44,"timestamp":25289833230,"id":107,"parentId":106,"tags":{},"startTime":1778833262080,"traceId":"0ffa3f03832411f5"},{"name":"run-export-path-map","duration":801,"timestamp":25289836467,"id":108,"parentId":106,"tags":{},"startTime":1778833262083,"traceId":"0ffa3f03832411f5"},{"name":"next-export","duration":559089,"timestamp":25289831696,"id":106,"parentId":1,"tags":{},"startTime":1778833262078,"traceId":"0ffa3f03832411f5"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2626,"timestamp":25290393859,"id":109,"parentId":105,"tags":{},"startTime":1778833262640,"traceId":"0ffa3f03832411f5"},{"name":"move-exported-app-global-error-","duration":553,"timestamp":25290396580,"id":110,"parentId":105,"tags":{},"startTime":1778833262643,"traceId":"0ffa3f03832411f5"},{"name":"static-generation","duration":573392,"timestamp":25289825462,"id":105,"parentId":1,"tags":{},"startTime":1778833262072,"traceId":"0ffa3f03832411f5"},{"name":"write-routes-manifest","duration":380,"timestamp":25290399038,"id":111,"parentId":1,"tags":{},"startTime":1778833262645,"traceId":"0ffa3f03832411f5"},{"name":"print-tree-view","duration":5659,"timestamp":25290406540,"id":112,"parentId":1,"tags":{},"startTime":1778833262653,"traceId":"0ffa3f03832411f5"},{"name":"write-route-bundle-stats","duration":17845,"timestamp":25290412236,"id":113,"parentId":1,"tags":{},"startTime":1778833262659,"traceId":"0ffa3f03832411f5"},{"name":"telemetry-flush","duration":19051,"timestamp":25290430115,"id":114,"parentId":1,"tags":{},"startTime":1778833262676,"traceId":"0ffa3f03832411f5"},{"name":"next-build","duration":15304026,"timestamp":25275145176,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778833247391,"traceId":"0ffa3f03832411f5"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":6065980,"timestamp":24422623209,"id":14,"parentId":1,"tags":{},"startTime":1778832394869,"traceId":"894c9622eb7ef979"},{"name":"turbopack-build-events","duration":102,"timestamp":24422906206,"id":15,"parentId":1,"tags":{},"startTime":1778832395152,"traceId":"894c9622eb7ef979"},{"name":"run-typescript","duration":8919296,"timestamp":24428701727,"id":16,"parentId":1,"tags":{},"startTime":1778832400948,"traceId":"894c9622eb7ef979"},{"name":"static-check","duration":779877,"timestamp":24437801197,"id":19,"parentId":1,"tags":{},"startTime":1778832410047,"traceId":"894c9622eb7ef979"},{"name":"static-generation","duration":615948,"timestamp":24438592428,"id":105,"parentId":1,"tags":{},"startTime":1778832410839,"traceId":"894c9622eb7ef979"},{"name":"telemetry-flush","duration":29396,"timestamp":24439237989,"id":114,"parentId":1,"tags":{},"startTime":1778832411484,"traceId":"894c9622eb7ef979"},{"name":"next-build","duration":16850797,"timestamp":24422416626,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778832394663,"traceId":"894c9622eb7ef979"}]
1
+ [{"name":"run-turbopack","duration":5375301,"timestamp":25275353164,"id":14,"parentId":1,"tags":{},"startTime":1778833247599,"traceId":"0ffa3f03832411f5"},{"name":"turbopack-build-events","duration":71,"timestamp":25275631327,"id":15,"parentId":1,"tags":{},"startTime":1778833247878,"traceId":"0ffa3f03832411f5"},{"name":"run-typescript","duration":8151819,"timestamp":25280737699,"id":16,"parentId":1,"tags":{},"startTime":1778833252984,"traceId":"0ffa3f03832411f5"},{"name":"static-check","duration":743958,"timestamp":25289070717,"id":19,"parentId":1,"tags":{},"startTime":1778833261317,"traceId":"0ffa3f03832411f5"},{"name":"static-generation","duration":573392,"timestamp":25289825462,"id":105,"parentId":1,"tags":{},"startTime":1778833262072,"traceId":"0ffa3f03832411f5"},{"name":"telemetry-flush","duration":19051,"timestamp":25290430115,"id":114,"parentId":1,"tags":{},"startTime":1778833262676,"traceId":"0ffa3f03832411f5"},{"name":"next-build","duration":15304026,"timestamp":25275145176,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778833247391,"traceId":"0ffa3f03832411f5"}]
@@ -1224,13 +1224,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1224
1224
  grid mode drops it so the concentric rings don't sit behind a
1225
1225
  rectangular grid. */}
1226
1226
  {layout === 'ring' && (<>
1227
- <circle cx={cx} cy={cy} r="330" fill="url(#topo-radar)" />
1227
+ {/* R52: radar bg is pure decoration — drop its pointer events so
1228
+ the hub <g> under it (and any future inner-disk affordances)
1229
+ can receive clicks. Previously the r=330 disc intercepted
1230
+ the hub click outright. */}
1231
+ <circle cx={cx} cy={cy} r="330" fill="url(#topo-radar)" style={{ pointerEvents: 'none' }} />
1228
1232
 
1229
1233
  {/* Round 45: subtle star field — 24 deterministic dots scattered
1230
1234
  across the canvas give the radar bg some depth. Skipped on
1231
1235
  light theme so the white surface stays clean. */}
1232
1236
  {!isLight && (
1233
- <g opacity="0.5">
1237
+ <g opacity="0.5" style={{ pointerEvents: 'none' }}>
1234
1238
  {Array.from({ length: 28 }).map((_, i) => {
1235
1239
  // Deterministic pseudo-random scatter so positions are
1236
1240
  // stable between renders (no JS hydration mismatch).
@@ -1252,6 +1256,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1252
1256
  style={{
1253
1257
  transformOrigin: `${cx}px ${cy}px`,
1254
1258
  transformBox: 'view-box',
1259
+ pointerEvents: 'none',
1255
1260
  }}
1256
1261
  className="anet-topo-sweep"
1257
1262
  opacity={isLight ? 0.7 : 1}
@@ -1511,21 +1516,40 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1511
1516
  breath on the static halo (4s, ±15% from base), so the hub
1512
1517
  stays alive without throwing kinetic energy outward. The
1513
1518
  dual-circle "lit lamp" core is unchanged. */}
1514
- {layout === 'ring' && (<g data-topo-hub>
1519
+ {layout === 'ring' && (<g
1520
+ data-topo-hub
1521
+ style={{ cursor: 'pointer' }}
1522
+ // Stop pointerdown from reaching the SVG pan handler — same
1523
+ // reason as the node <g>: a captured pointer makes Chromium
1524
+ // fire the follow-up click on the SVG, not this group.
1525
+ onPointerDown={(e) => e.stopPropagation()}
1526
+ // Round 52 / Loop: hub is the visual anchor but had no click
1527
+ // action — users discovered fit-to-content only via the `f`
1528
+ // key or the chrome button. Wire the hub to fitView() so the
1529
+ // most prominent element in the canvas is also the "re-
1530
+ // center" affordance. A click-ripple keyed by ts confirms
1531
+ // the gesture; the hub <title> now ends with a hint.
1532
+ onClick={() => {
1533
+ fitView();
1534
+ setClickRipple({ ts: Date.now(), x: cx, y: cy, r0: 18, color: isLight ? '#059669' : '#10b981' });
1535
+ setTimeout(() => setClickRipple(prev => prev && prev.x === cx && prev.y === cy ? null : prev), 600);
1536
+ }}
1537
+ >
1515
1538
  {/* Round 43 / Loop: hub `<title>` summary — hovering the
1516
1539
  central glow now answers "what is this?" with a one-line
1517
1540
  fleet snapshot. Duplicates the header chips by design;
1518
1541
  hovering the most visually prominent element is the
1519
1542
  most natural impulse, so satisfy it where the cursor
1520
1543
  already is. Falls clean: omits sub-clauses when their
1521
- counts are zero. */}
1544
+ counts are zero. R52 appends a "click to fit view" hint.
1545
+ */}
1522
1546
  <title>{(() => {
1523
1547
  const total = sessions.length;
1524
1548
  const parts = [`Network hub`, `${total} session${total === 1 ? '' : 's'}`];
1525
1549
  if (onlineNodes.length > 0) parts.push(`${onlineNodes.length} online`);
1526
1550
  if (workingCount > 0) parts.push(`${workingCount} working`);
1527
1551
  if (flowLinks.length > 0) parts.push(`${flowLinks.length} active link${flowLinks.length === 1 ? '' : 's'}`);
1528
- return parts.join(' · ');
1552
+ return parts.join(' · ') + '\nclick to fit view';
1529
1553
  })()}</title>
1530
1554
  {/* grounding halo — now breathes in opacity, no expansion */}
1531
1555
  <circle
@@ -1617,6 +1641,18 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1617
1641
  // mount (same alias key) don't replay, so status changes
1618
1642
  // never trigger the stagger again.
1619
1643
  animationDelay: `${Math.min(nodeIdx, 24) * 25}ms`,
1644
+ // Round 51 / Loop: hover micro-lift. The label already
1645
+ // lifts on group-hover (R26). The node body — circle,
1646
+ // avatar, status ring — stays planted, so the gesture
1647
+ // reads "label moves, body doesn't". Now the whole <g>
1648
+ // translates -2px when hovered: avatar + ring + label
1649
+ // move as one unit. 2 px is well inside the inter-row
1650
+ // gap (cellH headroom ≥22), and CSS transform on SVG
1651
+ // <g> never affects the overlap-test geometry (the
1652
+ // test never simulates hover). useReducedMotion drops
1653
+ // the lift to 0 for prefers-reduced-motion users.
1654
+ transform: !reducedMotion && hoveredAlias === session.alias ? 'translateY(-2px)' : undefined,
1655
+ transition: 'transform 180ms cubic-bezier(0.4,0,0.2,1)',
1620
1656
  }}
1621
1657
  // Stop the pointerdown from reaching the SVG pan handler: the
1622
1658
  // SVG calls setPointerCapture, and a captured pointer makes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.57",
3
+ "version": "0.4.6-preview.59",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,137 @@
1
+ /* Round 52 verification: clicking the central hub triggers fitView() and
2
+ * shows a click-ripple. The hub was previously decoration; now it's the
3
+ * "re-center" affordance for users who don't know the `f` shortcut.
4
+ *
5
+ * Steps:
6
+ * - Zoom + pan the topology to a non-default view (Cmd+= twice + drag).
7
+ * Confirm the zoom group's transform shifted off identity.
8
+ * - Click the hub. Assert:
9
+ * 1. the zoom group's transform returns to a fitted state (zoom and
10
+ * translate change), i.e. the view changed back toward identity-
11
+ * or-fit;
12
+ * 2. a transient ripple <circle> shows up at the hub center, then
13
+ * vanishes within ~800ms.
14
+ * - Confirm the hub's <title> mentions "click to fit view".
15
+ */
16
+ import { chromium } from 'playwright';
17
+ import { readFileSync } from 'node:fs';
18
+
19
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
20
+ const browser = await chromium.launch({ headless: true });
21
+
22
+ const ctx = await browser.newContext({ viewport: { width: 1280, height: 1500 } });
23
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
24
+ await ctx.addInitScript(() => {
25
+ try {
26
+ localStorage.setItem('anet-theme', 'cyber');
27
+ localStorage.setItem('anet-topo-layout', 'ring');
28
+ sessionStorage.setItem('anet_v3_auth', '1');
29
+ } catch {}
30
+ });
31
+
32
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const sessions = ['alpha', 'beta', 'gamma'].map(a => ({
38
+ alias: a, status: 'idle', 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 } });
42
+ });
43
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
44
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
45
+ const page = await ctx.newPage();
46
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
47
+ await page.waitForSelector('g[data-topo-hub]', { timeout: 30000 });
48
+ await page.waitForTimeout(500);
49
+
50
+ // Read the hub <title> to verify the hint text.
51
+ const hubTitle = await page.evaluate(() => {
52
+ return document.querySelector('g[data-topo-hub] title')?.textContent || '';
53
+ });
54
+
55
+ // Find the zoom/pan wrapper <g> (the one whose transform attribute holds
56
+ // the scale + translate string). The TopoGraph wraps all canvas content
57
+ // in a <g> with transform="translate(x, y) scale(zoom)" at the panel root.
58
+ // Grab the first child <g> under the SVG that carries a `transform` with
59
+ // a `scale(` token — that's our zoom group.
60
+ const readTransform = () => page.evaluate(() => {
61
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
62
+ for (const g of svg.querySelectorAll(':scope > g')) {
63
+ const t = g.getAttribute('transform') || '';
64
+ if (t.includes('scale(')) return t;
65
+ }
66
+ return null;
67
+ });
68
+
69
+ const baseTransform = await readTransform();
70
+
71
+ // Nudge zoom by simulating Ctrl+= twice via keyboard shortcut. The
72
+ // keymap maps '+' to zoomBy; press 'Equal' with the right modifier so
73
+ // browsers see '+'.
74
+ await page.keyboard.press('+');
75
+ await page.keyboard.press('+');
76
+ await page.keyboard.press('+');
77
+ await page.waitForTimeout(150);
78
+ const zoomedTransform = await readTransform();
79
+
80
+ // Confirm the zoom transform actually changed.
81
+ const zoomChanged = baseTransform !== zoomedTransform;
82
+
83
+ // Click the hub center. Locator-based click hits the union bbox edge and
84
+ // gets intercepted by the SVG panel rect (which must keep pointer events
85
+ // for canvas pan). Sample the inner core circle (r=10 at viewBox 500,330)
86
+ // via getScreenCTM and click that on-screen point directly.
87
+ const hubCenter = await page.evaluate(() => {
88
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
89
+ const core = [...svg.querySelectorAll('g[data-topo-hub] circle')].find(
90
+ c => c.getAttribute('r') === '10'
91
+ );
92
+ if (!core) return null;
93
+ const ctm = core.getScreenCTM();
94
+ const cx = +core.getAttribute('cx');
95
+ const cy = +core.getAttribute('cy');
96
+ return { x: cx * ctm.a + cy * ctm.c + ctm.e, y: cx * ctm.b + cy * ctm.d + ctm.f };
97
+ });
98
+ if (!hubCenter) { console.log('❌ hub core circle not found'); process.exit(1); }
99
+ await page.mouse.click(hubCenter.x, hubCenter.y);
100
+ await page.waitForTimeout(150);
101
+ const afterClickTransform = await readTransform();
102
+ const ripplePresent = await page.evaluate(() => {
103
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
104
+ // The click ripple is a <circle> with stroke-width="2" + an <animate>.
105
+ const ripples = [...svg.querySelectorAll('circle')].filter(c => {
106
+ const sw = c.getAttribute('stroke-width');
107
+ return sw === '2' && c.querySelector('animate[attributeName="r"]');
108
+ });
109
+ return ripples.length > 0;
110
+ });
111
+
112
+ await page.waitForTimeout(800);
113
+ const rippleGone = await page.evaluate(() => {
114
+ const svg = document.querySelector('svg[viewBox="0 0 1000 680"]');
115
+ const ripples = [...svg.querySelectorAll('circle')].filter(c => {
116
+ const sw = c.getAttribute('stroke-width');
117
+ return sw === '2' && c.querySelector('animate[attributeName="r"]');
118
+ });
119
+ return ripples.length === 0;
120
+ });
121
+
122
+ await browser.close();
123
+
124
+ const results = {
125
+ hubTitleHasFitHint: /click to fit view/i.test(hubTitle),
126
+ zoomShifted: zoomChanged,
127
+ hubClickRestoredView: afterClickTransform !== zoomedTransform,
128
+ ripplePresentDuringClick: ripplePresent,
129
+ rippleClearsAfter600ms: rippleGone,
130
+ };
131
+ const ok = Object.values(results).every(Boolean);
132
+ console.log(`${ok ? '✅' : '❌'} hub click fit:`, JSON.stringify(results),
133
+ `\n hubTitle=${JSON.stringify(hubTitle)}`,
134
+ `\n base =${baseTransform}`,
135
+ `\n zoomed =${zoomedTransform}`,
136
+ `\n fitBack =${afterClickTransform}`);
137
+ process.exit(ok ? 0 : 1);
@@ -74,10 +74,15 @@ const grid = await probe({
74
74
  });
75
75
 
76
76
  await browser.close();
77
+ // R52 appended "\nclick to fit view" as a second line to the hub
78
+ // <title> so the click-to-fit affordance is discoverable on hover.
79
+ // Compare on the first line only; assert the hint is present too.
80
+ const firstLine = (s) => (s || '').split('\n')[0];
77
81
  const results = {
78
82
  ringHubPresent: ringFull.hubPresent === true,
79
- ringFullSummary: ringFull.titleText === 'Network hub · 4 sessions · 3 online · 1 working · 1 active link',
80
- ringOfflineSummary: ringOfflineOnly.hubPresent === true && ringOfflineOnly.titleText === 'Network hub · 2 sessions',
83
+ ringFullSummary: firstLine(ringFull.titleText) === 'Network hub · 4 sessions · 3 online · 1 working · 1 active link',
84
+ ringOfflineSummary: ringOfflineOnly.hubPresent === true && firstLine(ringOfflineOnly.titleText) === 'Network hub · 2 sessions',
85
+ ringHintsAtFit: /click to fit view/i.test(ringFull.titleText || ''),
81
86
  gridHasNoHub: grid.hubPresent === false,
82
87
  };
83
88
  const ok = Object.values(results).every(Boolean);
@@ -103,7 +103,11 @@ const denseClassPresent = await (async () => {
103
103
 
104
104
  await browser.close();
105
105
 
106
- const lifted = (m) => m.beforeY != null && m.afterY != null && m.beforeY - m.afterY >= 1 && m.beforeY - m.afterY <= 2.5;
106
+ // R26 contributes label-only -1.5px lift; R51 (preview.58) adds -2px on the
107
+ // parent <g data-node> on hover, so the label's total measured movement
108
+ // when the node is hovered is ~3.5px. Widen the upper bound to 4 so the
109
+ // two lifts compose without flagging this as a regression.
110
+ const lifted = (m) => m.beforeY != null && m.afterY != null && m.beforeY - m.afterY >= 1 && m.beforeY - m.afterY <= 4;
107
111
 
108
112
  const results = {
109
113
  sparseLabelLifts: lifted(sparse),
@@ -0,0 +1,85 @@
1
+ /* Round 51 verification: hovered node <g> lifts -2px via CSS transform.
2
+ * - At rest, every node's CSS transform is "none" (or matrix with 0 ty).
3
+ * - On hover, the hovered <g> reports `translateY(-2px)` (matrix(1,0,0,1,0,-2))
4
+ * via getComputedStyle.transform, while siblings stay at identity.
5
+ * - Release: returns to identity.
6
+ * - With prefers-reduced-motion forced, NO lift even on hover.
7
+ */
8
+ import { chromium } from 'playwright';
9
+ import { readFileSync } from 'node:fs';
10
+
11
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
12
+ const browser = await chromium.launch({ headless: true });
13
+
14
+ async function probe(reducedMotion) {
15
+ const ctx = await browser.newContext({
16
+ viewport: { width: 1280, height: 900 },
17
+ reducedMotion: reducedMotion ? 'reduce' : 'no-preference',
18
+ });
19
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
20
+ await ctx.addInitScript(() => {
21
+ try {
22
+ localStorage.setItem('anet-theme', 'cyber');
23
+ localStorage.setItem('anet-topo-layout', 'ring');
24
+ sessionStorage.setItem('anet_v3_auth', '1');
25
+ } catch {}
26
+ });
27
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const sessions = ['alpha', 'beta', 'gamma'].map(a => ({
33
+ alias: a, status: 'idle', network_id: nid, project_dir: null,
34
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
35
+ }));
36
+ await route.fulfill({ response: r, json: { ...b, sessions } });
37
+ });
38
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
39
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
40
+ const page = await ctx.newPage();
41
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
42
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 3, { timeout: 30000 });
43
+ await page.waitForTimeout(500);
44
+
45
+ const readTy = (alias) => page.evaluate(a => {
46
+ const el = document.querySelector(`g[data-node="${a}"]`);
47
+ if (!el) return null;
48
+ const m = getComputedStyle(el).transform;
49
+ if (!m || m === 'none') return 0;
50
+ // matrix(a, b, c, d, tx, ty) — extract ty
51
+ const parts = m.match(/matrix\(([^)]+)\)/);
52
+ if (!parts) return null;
53
+ const arr = parts[1].split(',').map(s => parseFloat(s.trim()));
54
+ return arr[5] ?? null;
55
+ }, alias);
56
+
57
+ const restAlpha = await readTy('alpha');
58
+ const restBeta = await readTy('beta');
59
+ await page.locator('g[data-node="alpha"]').hover({ force: true });
60
+ await page.waitForTimeout(300);
61
+ const hoveredAlpha = await readTy('alpha');
62
+ const hoveredBeta = await readTy('beta');
63
+ await page.mouse.move(10, 10);
64
+ await page.waitForTimeout(300);
65
+ const releasedAlpha = await readTy('alpha');
66
+
67
+ await ctx.close();
68
+ return { restAlpha, restBeta, hoveredAlpha, hoveredBeta, releasedAlpha };
69
+ }
70
+
71
+ const normal = await probe(false);
72
+ const reduced = await probe(true);
73
+ await browser.close();
74
+
75
+ const results = {
76
+ normal_restAtZero: normal.restAlpha === 0 && normal.restBeta === 0,
77
+ normal_hoveredLifts: normal.hoveredAlpha === -2,
78
+ normal_siblingStays: normal.hoveredBeta === 0,
79
+ normal_released: normal.releasedAlpha === 0,
80
+ reduced_noLift: reduced.hoveredAlpha === 0,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} node hover lift:`, JSON.stringify(results),
84
+ `\n normal=`, normal, `\n reduced=`, reduced);
85
+ process.exit(ok ? 0 : 1);