@sleep2agi/agent-network-dashboard 0.4.6-preview.187 → 0.4.6-preview.189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +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 +1 -1
  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/{03g4iuukfk16u.js → 06stz6vkzb81a.js} +1 -1
  133. package/.next/static/chunks/{10p3-bueb0ork.js → 0_lz~qm7q.dp_.js} +1 -1
  134. package/.next/static/chunks/{0a9p-es05ep73.js → 0ox0smo6q~4yp.js} +3 -3
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +64 -18
  138. package/package.json +1 -1
  139. package/scripts/topo-endpoint-ring-fade-test.mjs +132 -0
  140. package/scripts/topo-legend-pin-ring-fade-test.mjs +112 -0
  141. /package/.next/static/{JXhnVH1uF1ZoAFZNGr7FJ → W1c-GAhF5EI0gxmHl-Tcp}/_buildManifest.js +0 -0
  142. /package/.next/static/{JXhnVH1uF1ZoAFZNGr7FJ → W1c-GAhF5EI0gxmHl-Tcp}/_clientMiddlewareManifest.js +0 -0
  143. /package/.next/static/{JXhnVH1uF1ZoAFZNGr7FJ → W1c-GAhF5EI0gxmHl-Tcp}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":244,"timestamp":67761204110,"id":4,"parentId":1,"tags":{},"startTime":1778875733450,"traceId":"ba60c1a055950f26"},{"name":"load-custom-routes","duration":454,"timestamp":67761204489,"id":5,"parentId":1,"tags":{},"startTime":1778875733451,"traceId":"ba60c1a055950f26"},{"name":"create-dist-dir","duration":615,"timestamp":67761204982,"id":6,"parentId":1,"tags":{},"startTime":1778875733451,"traceId":"ba60c1a055950f26"},{"name":"clean","duration":436,"timestamp":67761206238,"id":7,"parentId":1,"tags":{},"startTime":1778875733453,"traceId":"ba60c1a055950f26"},{"name":"discover-routes","duration":10081,"timestamp":67761284483,"id":8,"parentId":1,"tags":{},"startTime":1778875733531,"traceId":"ba60c1a055950f26"},{"name":"create-root-mapping","duration":104,"timestamp":67761294620,"id":9,"parentId":1,"tags":{},"startTime":1778875733541,"traceId":"ba60c1a055950f26"},{"name":"generate-route-types","duration":30623,"timestamp":67761296883,"id":10,"parentId":1,"tags":{},"startTime":1778875733543,"traceId":"ba60c1a055950f26"},{"name":"public-dir-conflict-check","duration":126,"timestamp":67761327725,"id":11,"parentId":1,"tags":{},"startTime":1778875733574,"traceId":"ba60c1a055950f26"},{"name":"generate-routes-manifest","duration":4164,"timestamp":67761327980,"id":12,"parentId":1,"tags":{},"startTime":1778875733574,"traceId":"ba60c1a055950f26"},{"name":"run-turbopack","duration":5364020,"timestamp":67761337691,"id":14,"parentId":1,"tags":{},"startTime":1778875733584,"traceId":"ba60c1a055950f26"},{"name":"turbopack-build-events","duration":117,"timestamp":67761627477,"id":15,"parentId":1,"tags":{},"startTime":1778875733874,"traceId":"ba60c1a055950f26"},{"name":"run-typescript","duration":8490788,"timestamp":67766720938,"id":16,"parentId":1,"tags":{},"startTime":1778875738967,"traceId":"ba60c1a055950f26"},{"name":"generate-required-server-files","duration":2788,"timestamp":67775212723,"id":18,"parentId":1,"tags":{},"startTime":1778875747459,"traceId":"ba60c1a055950f26"},{"name":"check-static-error-page","duration":10788,"timestamp":67775385168,"id":20,"parentId":19,"tags":{},"startTime":1778875747631,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":429714,"timestamp":67775398180,"id":63,"parentId":22,"tags":{},"startTime":1778875747644,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":440761,"timestamp":67775387323,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778875747634,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":508375,"timestamp":67775398303,"id":64,"parentId":25,"tags":{},"startTime":1778875747645,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":517025,"timestamp":67775389757,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778875747636,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":515505,"timestamp":67775397876,"id":62,"parentId":21,"tags":{},"startTime":1778875747644,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":527184,"timestamp":67775386257,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778875747633,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":519964,"timestamp":67775401016,"id":70,"parentId":32,"tags":{},"startTime":1778875747647,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":530396,"timestamp":67775390663,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":524661,"timestamp":67775398772,"id":67,"parentId":28,"tags":{},"startTime":1778875747645,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":533309,"timestamp":67775390173,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778875747636,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":525590,"timestamp":67775401177,"id":72,"parentId":34,"tags":{},"startTime":1778875747647,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":535953,"timestamp":67775390886,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":529122,"timestamp":67775398929,"id":68,"parentId":29,"tags":{},"startTime":1778875747645,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":537845,"timestamp":67775390256,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":528954,"timestamp":67775401213,"id":73,"parentId":35,"tags":{},"startTime":1778875747647,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":539191,"timestamp":67775391018,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":533884,"timestamp":67775401340,"id":74,"parentId":36,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":543920,"timestamp":67775391355,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":534037,"timestamp":67775401374,"id":75,"parentId":37,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":543965,"timestamp":67775391475,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":539015,"timestamp":67775398534,"id":66,"parentId":27,"tags":{},"startTime":1778875747645,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":547518,"timestamp":67775390082,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778875747636,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":541511,"timestamp":67775401432,"id":79,"parentId":41,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":551194,"timestamp":67775391800,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":545485,"timestamp":67775401407,"id":77,"parentId":39,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":555279,"timestamp":67775391661,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":548966,"timestamp":67775398422,"id":65,"parentId":26,"tags":{},"startTime":1778875747645,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":557491,"timestamp":67775389955,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778875747636,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":551256,"timestamp":67775401469,"id":82,"parentId":44,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":560640,"timestamp":67775392132,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":554465,"timestamp":67775401417,"id":78,"parentId":40,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":564199,"timestamp":67775391725,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":560710,"timestamp":67775401392,"id":76,"parentId":38,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":570590,"timestamp":67775391570,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":562860,"timestamp":67775401496,"id":84,"parentId":46,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":572125,"timestamp":67775392279,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778875747639,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":571368,"timestamp":67775401519,"id":86,"parentId":48,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":580497,"timestamp":67775392436,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778875747639,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":572207,"timestamp":67775401459,"id":81,"parentId":43,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":581680,"timestamp":67775392030,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":576826,"timestamp":67775401532,"id":87,"parentId":49,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":584840,"timestamp":67775393565,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778875747640,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":580714,"timestamp":67775401483,"id":83,"parentId":45,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":590030,"timestamp":67775392217,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":581070,"timestamp":67775401506,"id":85,"parentId":47,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":590254,"timestamp":67775392371,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778875747639,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":583166,"timestamp":67775401445,"id":80,"parentId":42,"tags":{},"startTime":1778875747648,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":592751,"timestamp":67775391916,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778875747638,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":579798,"timestamp":67775405046,"id":88,"parentId":24,"tags":{},"startTime":1778875747651,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":597206,"timestamp":67775387686,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778875747634,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":584292,"timestamp":67775406198,"id":89,"parentId":31,"tags":{},"startTime":1778875747652,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":600137,"timestamp":67775390436,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":589986,"timestamp":67775400778,"id":69,"parentId":30,"tags":{},"startTime":1778875747647,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":600477,"timestamp":67775390359,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":590017,"timestamp":67775401099,"id":71,"parentId":33,"tags":{},"startTime":1778875747647,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":600395,"timestamp":67775390767,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778875747637,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":585568,"timestamp":67775412666,"id":96,"parentId":56,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":603222,"timestamp":67775395058,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778875747641,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":592586,"timestamp":67775412675,"id":97,"parentId":57,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":610099,"timestamp":67775395209,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778875747641,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":600274,"timestamp":67775412686,"id":98,"parentId":59,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":617538,"timestamp":67775395600,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778875747642,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":614003,"timestamp":67775412701,"id":99,"parentId":60,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":631070,"timestamp":67775395692,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778875747642,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":624475,"timestamp":67775412712,"id":100,"parentId":61,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":641471,"timestamp":67775395780,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778875747642,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":624592,"timestamp":67775420708,"id":101,"parentId":58,"tags":{},"startTime":1778875747667,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":650025,"timestamp":67775395325,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778875747642,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":635056,"timestamp":67775412629,"id":93,"parentId":52,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":653571,"timestamp":67775394171,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778875747640,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":637741,"timestamp":67775412619,"id":92,"parentId":51,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":656359,"timestamp":67775394054,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778875747640,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":639384,"timestamp":67775412654,"id":95,"parentId":54,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":657594,"timestamp":67775394491,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778875747641,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":611995,"timestamp":67775440399,"id":102,"parentId":55,"tags":{},"startTime":1778875747687,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":657775,"timestamp":67775394655,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778875747641,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":639882,"timestamp":67775412641,"id":94,"parentId":53,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":658222,"timestamp":67775394329,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778875747641,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":640683,"timestamp":67775412603,"id":91,"parentId":50,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":659418,"timestamp":67775393910,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778875747640,"traceId":"ba60c1a055950f26"},{"name":"is-page-static","duration":641301,"timestamp":67775412574,"id":90,"parentId":23,"tags":{},"startTime":1778875747659,"traceId":"ba60c1a055950f26"},{"name":"check-page","duration":666401,"timestamp":67775387509,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778875747634,"traceId":"ba60c1a055950f26"},{"name":"static-check","duration":669640,"timestamp":67775384303,"id":19,"parentId":1,"tags":{},"startTime":1778875747631,"traceId":"ba60c1a055950f26"},{"name":"write-routes-manifest","duration":470,"timestamp":67776062757,"id":104,"parentId":1,"tags":{},"startTime":1778875748309,"traceId":"ba60c1a055950f26"},{"name":"load-dotenv","duration":49,"timestamp":67776074734,"id":107,"parentId":106,"tags":{},"startTime":1778875748321,"traceId":"ba60c1a055950f26"},{"name":"run-export-path-map","duration":718,"timestamp":67776079732,"id":108,"parentId":106,"tags":{},"startTime":1778875748326,"traceId":"ba60c1a055950f26"},{"name":"next-export","duration":560329,"timestamp":67776073519,"id":106,"parentId":1,"tags":{},"startTime":1778875748320,"traceId":"ba60c1a055950f26"}]
2
- [{"name":"move-exported-app-not-found-","duration":2391,"timestamp":67776637431,"id":109,"parentId":105,"tags":{},"startTime":1778875748884,"traceId":"ba60c1a055950f26"},{"name":"move-exported-app-global-error-","duration":546,"timestamp":67776639911,"id":110,"parentId":105,"tags":{},"startTime":1778875748886,"traceId":"ba60c1a055950f26"},{"name":"static-generation","duration":574817,"timestamp":67776067578,"id":105,"parentId":1,"tags":{},"startTime":1778875748314,"traceId":"ba60c1a055950f26"},{"name":"write-routes-manifest","duration":377,"timestamp":67776642547,"id":111,"parentId":1,"tags":{},"startTime":1778875748889,"traceId":"ba60c1a055950f26"},{"name":"print-tree-view","duration":3534,"timestamp":67776658197,"id":112,"parentId":1,"tags":{},"startTime":1778875748904,"traceId":"ba60c1a055950f26"},{"name":"write-route-bundle-stats","duration":12941,"timestamp":67776661764,"id":113,"parentId":1,"tags":{},"startTime":1778875748908,"traceId":"ba60c1a055950f26"},{"name":"telemetry-flush","duration":36758,"timestamp":67776674729,"id":114,"parentId":1,"tags":{},"startTime":1778875748921,"traceId":"ba60c1a055950f26"},{"name":"next-build","duration":15555855,"timestamp":67761155662,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778875733402,"traceId":"ba60c1a055950f26"}]
1
+ [{"name":"generate-buildid","duration":297,"timestamp":68361453117,"id":4,"parentId":1,"tags":{},"startTime":1778876333699,"traceId":"f48f06d2d4240db5"},{"name":"load-custom-routes","duration":489,"timestamp":68361453554,"id":5,"parentId":1,"tags":{},"startTime":1778876333700,"traceId":"f48f06d2d4240db5"},{"name":"create-dist-dir","duration":646,"timestamp":68361454090,"id":6,"parentId":1,"tags":{},"startTime":1778876333700,"traceId":"f48f06d2d4240db5"},{"name":"clean","duration":457,"timestamp":68361455443,"id":7,"parentId":1,"tags":{},"startTime":1778876333702,"traceId":"f48f06d2d4240db5"},{"name":"discover-routes","duration":8905,"timestamp":68361534924,"id":8,"parentId":1,"tags":{},"startTime":1778876333781,"traceId":"f48f06d2d4240db5"},{"name":"create-root-mapping","duration":103,"timestamp":68361543881,"id":9,"parentId":1,"tags":{},"startTime":1778876333790,"traceId":"f48f06d2d4240db5"},{"name":"generate-route-types","duration":30570,"timestamp":68361546158,"id":10,"parentId":1,"tags":{},"startTime":1778876333792,"traceId":"f48f06d2d4240db5"},{"name":"public-dir-conflict-check","duration":92,"timestamp":68361576882,"id":11,"parentId":1,"tags":{},"startTime":1778876333823,"traceId":"f48f06d2d4240db5"},{"name":"generate-routes-manifest","duration":4003,"timestamp":68361577130,"id":12,"parentId":1,"tags":{},"startTime":1778876333823,"traceId":"f48f06d2d4240db5"},{"name":"run-turbopack","duration":5487201,"timestamp":68361586632,"id":14,"parentId":1,"tags":{},"startTime":1778876333833,"traceId":"f48f06d2d4240db5"},{"name":"turbopack-build-events","duration":100,"timestamp":68361864529,"id":15,"parentId":1,"tags":{},"startTime":1778876334111,"traceId":"f48f06d2d4240db5"},{"name":"run-typescript","duration":8454753,"timestamp":68367082745,"id":16,"parentId":1,"tags":{},"startTime":1778876339329,"traceId":"f48f06d2d4240db5"},{"name":"generate-required-server-files","duration":2894,"timestamp":68375538651,"id":18,"parentId":1,"tags":{},"startTime":1778876347785,"traceId":"f48f06d2d4240db5"},{"name":"check-static-error-page","duration":16245,"timestamp":68375701292,"id":20,"parentId":19,"tags":{},"startTime":1778876347948,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":396886,"timestamp":68375721039,"id":63,"parentId":22,"tags":{},"startTime":1778876347967,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":413555,"timestamp":68375704560,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778876347951,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":487526,"timestamp":68375721253,"id":65,"parentId":26,"tags":{},"startTime":1778876347968,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":500397,"timestamp":68375708486,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778876347955,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":491841,"timestamp":68375722193,"id":70,"parentId":32,"tags":{},"startTime":1778876347968,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":504540,"timestamp":68375709549,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778876347956,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":503593,"timestamp":68375721975,"id":69,"parentId":30,"tags":{},"startTime":1778876347968,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":516545,"timestamp":68375709083,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778876347955,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":513824,"timestamp":68375721164,"id":64,"parentId":25,"tags":{},"startTime":1778876347967,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":526777,"timestamp":68375708304,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778876347955,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":523105,"timestamp":68375722352,"id":72,"parentId":34,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":535638,"timestamp":68375709887,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778876347956,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":531973,"timestamp":68375722270,"id":71,"parentId":33,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":544588,"timestamp":68375709718,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778876347956,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":532836,"timestamp":68375721638,"id":67,"parentId":28,"tags":{},"startTime":1778876347968,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":545762,"timestamp":68375708744,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778876347955,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":534841,"timestamp":68375720614,"id":62,"parentId":21,"tags":{},"startTime":1778876347967,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":552554,"timestamp":68375702948,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778876347949,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":544652,"timestamp":68375721807,"id":68,"parentId":29,"tags":{},"startTime":1778876347968,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":557622,"timestamp":68375708888,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778876347955,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":544805,"timestamp":68375722534,"id":75,"parentId":37,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":556584,"timestamp":68375710797,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778876347957,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":545544,"timestamp":68375722502,"id":74,"parentId":36,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":557498,"timestamp":68375710587,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778876347957,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":553689,"timestamp":68375722551,"id":76,"parentId":38,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":565329,"timestamp":68375710963,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778876347957,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":553886,"timestamp":68375722581,"id":78,"parentId":40,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":565242,"timestamp":68375711255,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":554021,"timestamp":68375722605,"id":80,"parentId":42,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":565150,"timestamp":68375711503,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":560674,"timestamp":68375721358,"id":66,"parentId":27,"tags":{},"startTime":1778876347968,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":573463,"timestamp":68375708622,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778876347955,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":563158,"timestamp":68375722384,"id":73,"parentId":35,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":575533,"timestamp":68375710066,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778876347956,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":563171,"timestamp":68375722593,"id":79,"parentId":41,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":574428,"timestamp":68375711373,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":565551,"timestamp":68375722655,"id":84,"parentId":46,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":576228,"timestamp":68375712024,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":568231,"timestamp":68375722679,"id":86,"parentId":48,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":578645,"timestamp":68375712313,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778876347959,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":568474,"timestamp":68375722629,"id":82,"parentId":44,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":579383,"timestamp":68375711750,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":571557,"timestamp":68375722667,"id":85,"parentId":47,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":582086,"timestamp":68375712185,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":572302,"timestamp":68375722617,"id":81,"parentId":43,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":583336,"timestamp":68375711630,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":569511,"timestamp":68375727573,"id":88,"parentId":24,"tags":{},"startTime":1778876347974,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":591912,"timestamp":68375705222,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778876347951,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":568333,"timestamp":68375728948,"id":89,"parentId":31,"tags":{},"startTime":1778876347975,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":588074,"timestamp":68375709238,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778876347956,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":577438,"timestamp":68375722641,"id":83,"parentId":45,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":588228,"timestamp":68375711892,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778876347958,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":585216,"timestamp":68375724125,"id":87,"parentId":49,"tags":{},"startTime":1778876347970,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":596955,"timestamp":68375712431,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778876347959,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":631467,"timestamp":68375731519,"id":94,"parentId":53,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":648238,"timestamp":68375714842,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778876347961,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":632673,"timestamp":68375731449,"id":90,"parentId":23,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":659306,"timestamp":68375704885,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778876347951,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":639115,"timestamp":68375731553,"id":96,"parentId":56,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":654738,"timestamp":68375715979,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778876347962,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":643703,"timestamp":68375731569,"id":97,"parentId":57,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":659088,"timestamp":68375716242,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778876347963,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":646134,"timestamp":68375731580,"id":98,"parentId":59,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":660842,"timestamp":68375716919,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778876347963,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":646481,"timestamp":68375731475,"id":91,"parentId":50,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":663859,"timestamp":68375714174,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778876347960,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":654000,"timestamp":68375731508,"id":93,"parentId":52,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":670959,"timestamp":68375714593,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778876347961,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":654024,"timestamp":68375731620,"id":100,"parentId":61,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":668402,"timestamp":68375717271,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778876347964,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":655102,"timestamp":68375731492,"id":92,"parentId":51,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":672239,"timestamp":68375714393,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778876347961,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":666466,"timestamp":68375722568,"id":77,"parentId":39,"tags":{},"startTime":1778876347969,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":677996,"timestamp":68375711123,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778876347957,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":647703,"timestamp":68375743092,"id":101,"parentId":55,"tags":{},"startTime":1778876347989,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":675468,"timestamp":68375715369,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778876347962,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":660408,"timestamp":68375731535,"id":95,"parentId":54,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":676878,"timestamp":68375715101,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778876347961,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":663848,"timestamp":68375731599,"id":99,"parentId":60,"tags":{},"startTime":1778876347978,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":678407,"timestamp":68375717103,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778876347963,"traceId":"f48f06d2d4240db5"},{"name":"is-page-static","duration":644749,"timestamp":68375751951,"id":102,"parentId":58,"tags":{},"startTime":1778876347998,"traceId":"f48f06d2d4240db5"},{"name":"check-page","duration":680281,"timestamp":68375716446,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778876347963,"traceId":"f48f06d2d4240db5"},{"name":"static-check","duration":696653,"timestamp":68375700116,"id":19,"parentId":1,"tags":{},"startTime":1778876347946,"traceId":"f48f06d2d4240db5"},{"name":"write-routes-manifest","duration":441,"timestamp":68376404753,"id":104,"parentId":1,"tags":{},"startTime":1778876348651,"traceId":"f48f06d2d4240db5"},{"name":"load-dotenv","duration":60,"timestamp":68376415969,"id":107,"parentId":106,"tags":{},"startTime":1778876348662,"traceId":"f48f06d2d4240db5"},{"name":"run-export-path-map","duration":647,"timestamp":68376418618,"id":108,"parentId":106,"tags":{},"startTime":1778876348665,"traceId":"f48f06d2d4240db5"},{"name":"next-export","duration":553799,"timestamp":68376414785,"id":106,"parentId":1,"tags":{},"startTime":1778876348661,"traceId":"f48f06d2d4240db5"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2228,"timestamp":68376972668,"id":109,"parentId":105,"tags":{},"startTime":1778876349219,"traceId":"f48f06d2d4240db5"},{"name":"move-exported-app-global-error-","duration":579,"timestamp":68376974989,"id":110,"parentId":105,"tags":{},"startTime":1778876349221,"traceId":"f48f06d2d4240db5"},{"name":"static-generation","duration":568213,"timestamp":68376409187,"id":105,"parentId":1,"tags":{},"startTime":1778876348655,"traceId":"f48f06d2d4240db5"},{"name":"write-routes-manifest","duration":396,"timestamp":68376977568,"id":111,"parentId":1,"tags":{},"startTime":1778876349224,"traceId":"f48f06d2d4240db5"},{"name":"print-tree-view","duration":4066,"timestamp":68376995635,"id":112,"parentId":1,"tags":{},"startTime":1778876349242,"traceId":"f48f06d2d4240db5"},{"name":"write-route-bundle-stats","duration":12587,"timestamp":68376999734,"id":113,"parentId":1,"tags":{},"startTime":1778876349246,"traceId":"f48f06d2d4240db5"},{"name":"telemetry-flush","duration":22803,"timestamp":68377012351,"id":114,"parentId":1,"tags":{},"startTime":1778876349259,"traceId":"f48f06d2d4240db5"},{"name":"next-build","duration":15631148,"timestamp":68361404042,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778876333650,"traceId":"f48f06d2d4240db5"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5364020,"timestamp":67761337691,"id":14,"parentId":1,"tags":{},"startTime":1778875733584,"traceId":"ba60c1a055950f26"},{"name":"turbopack-build-events","duration":117,"timestamp":67761627477,"id":15,"parentId":1,"tags":{},"startTime":1778875733874,"traceId":"ba60c1a055950f26"},{"name":"run-typescript","duration":8490788,"timestamp":67766720938,"id":16,"parentId":1,"tags":{},"startTime":1778875738967,"traceId":"ba60c1a055950f26"},{"name":"static-check","duration":669640,"timestamp":67775384303,"id":19,"parentId":1,"tags":{},"startTime":1778875747631,"traceId":"ba60c1a055950f26"},{"name":"static-generation","duration":574817,"timestamp":67776067578,"id":105,"parentId":1,"tags":{},"startTime":1778875748314,"traceId":"ba60c1a055950f26"},{"name":"telemetry-flush","duration":36758,"timestamp":67776674729,"id":114,"parentId":1,"tags":{},"startTime":1778875748921,"traceId":"ba60c1a055950f26"},{"name":"next-build","duration":15555855,"timestamp":67761155662,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778875733402,"traceId":"ba60c1a055950f26"}]
1
+ [{"name":"run-turbopack","duration":5487201,"timestamp":68361586632,"id":14,"parentId":1,"tags":{},"startTime":1778876333833,"traceId":"f48f06d2d4240db5"},{"name":"turbopack-build-events","duration":100,"timestamp":68361864529,"id":15,"parentId":1,"tags":{},"startTime":1778876334111,"traceId":"f48f06d2d4240db5"},{"name":"run-typescript","duration":8454753,"timestamp":68367082745,"id":16,"parentId":1,"tags":{},"startTime":1778876339329,"traceId":"f48f06d2d4240db5"},{"name":"static-check","duration":696653,"timestamp":68375700116,"id":19,"parentId":1,"tags":{},"startTime":1778876347946,"traceId":"f48f06d2d4240db5"},{"name":"static-generation","duration":568213,"timestamp":68376409187,"id":105,"parentId":1,"tags":{},"startTime":1778876348655,"traceId":"f48f06d2d4240db5"},{"name":"telemetry-flush","duration":22803,"timestamp":68377012351,"id":114,"parentId":1,"tags":{},"startTime":1778876349259,"traceId":"f48f06d2d4240db5"},{"name":"next-build","duration":15631148,"timestamp":68361404042,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778876333650,"traceId":"f48f06d2d4240db5"}]
@@ -3825,20 +3825,44 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3825
3825
  (just inside the halo's r=radius+8 bbox so we
3826
3826
  don't grow the overlap footprint) clearly says
3827
3827
  "these are the two participants in this flow".
3828
- pointerEvents:none so the node hitbox stays alive. */}
3829
- {hoveredEdgeEndpoints && hoveredEdgeEndpoints.has(session.alias) && (
3830
- <circle
3831
- cx={pos.x}
3832
- cy={pos.y}
3833
- r={radius + 7}
3834
- fill="none"
3835
- stroke={pal.flowEdge}
3836
- strokeWidth={1.5}
3837
- opacity={isLight ? 0.9 : 0.85}
3838
- data-edge-endpoint-ring
3839
- style={{ pointerEvents: 'none', transition: 'opacity 180ms ease-out' }}
3840
- />
3841
- )}
3828
+ pointerEvents:none so the node hitbox stays alive.
3829
+
3830
+ Round 182 / Loop: the ring used to mount/unmount
3831
+ on every edge hover, snapping despite the
3832
+ opacity transition on the style. Always-mount
3833
+ with opacity gated by hoveredEdgeEndpoints — same
3834
+ pattern R181 used for the legend pin ring. The
3835
+ transition now actually fires on hover entry
3836
+ and exit. 6th surface in the smooth-pin-mirror
3837
+ family (R165/R180/R181 + this round).
3838
+
3839
+ strokeWidth=1.6 (was 1.5) deliberately escapes
3840
+ the R51 overlap-test sentinel `circle[stroke-
3841
+ width="1.5"]`: an always-mounted r=radius+7 ring
3842
+ inside g[data-node] would otherwise be picked
3843
+ before the actual status ring (r=radius) by
3844
+ querySelector document order, breaking the
3845
+ test's node-bbox read. 1.5 → 1.6 is visually
3846
+ imperceptible (6.7% thicker) but the exact-
3847
+ string CSS attribute selector no longer
3848
+ matches. */}
3849
+ {(() => {
3850
+ const isEndpoint = hoveredEdgeEndpoints && hoveredEdgeEndpoints.has(session.alias);
3851
+ return (
3852
+ <circle
3853
+ cx={pos.x}
3854
+ cy={pos.y}
3855
+ r={radius + 7}
3856
+ fill="none"
3857
+ stroke={pal.flowEdge}
3858
+ strokeWidth={1.6}
3859
+ opacity={isEndpoint ? (isLight ? 0.9 : 0.85) : 0}
3860
+ data-edge-endpoint-ring
3861
+ data-edge-endpoint-active={isEndpoint ? 'true' : 'false'}
3862
+ style={{ pointerEvents: 'none', transition: 'opacity 180ms ease-out' }}
3863
+ />
3864
+ );
3865
+ })()}
3842
3866
  {/* Round 167 / Loop: extend the node status-ring
3843
3867
  transition to include stroke-width — symmetric
3844
3868
  with R165 (pressure-bar width) and R166 (edge
@@ -4675,10 +4699,32 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4675
4699
  <circle cx="16" cy={row.y0} r="5.5" fill={row.fill} />
4676
4700
  {/* R61 pinned-state ring — concentric stroke at r=8 in
4677
4701
  the row colour, draws OUTSIDE the swatch so it
4678
- doesn't fight the fill colour the user is matching. */}
4679
- {isPinned && (
4680
- <circle cx="16" cy={row.y0} r="8" fill="none" stroke={row.fill} strokeWidth="1.5" />
4681
- )}
4702
+ doesn't fight the fill colour the user is matching.
4703
+ Round 181 / Loop: the ring used to mount/unmount
4704
+ with the conditional render, snapping on every
4705
+ pin/unpin. Now always mounted with opacity gated
4706
+ by isPinned + a 150ms transition so the ring
4707
+ eases in on pin and out on unpin — same gesture
4708
+ vocabulary the R165/R180 smooth-pin-mirror family
4709
+ uses for the chip-row pin chips. strokeWidth=1.5
4710
+ is the R51 overlap-test sentinel but the test
4711
+ selector is gated to g[data-node] ancestors,
4712
+ so this legend-internal circle is invisible to
4713
+ that probe. pointerEvents:none so the ring can't
4714
+ intercept the row click that produced it. */}
4715
+ <circle
4716
+ cx="16" cy={row.y0} r="8"
4717
+ fill="none"
4718
+ stroke={row.fill}
4719
+ strokeWidth="1.5"
4720
+ opacity={isPinned ? 1 : 0}
4721
+ data-legend-pin-ring={row.key}
4722
+ data-legend-pin-ring-pinned={isPinned ? 'true' : 'false'}
4723
+ style={{
4724
+ pointerEvents: 'none',
4725
+ transition: 'opacity 150ms ease-out',
4726
+ }}
4727
+ />
4682
4728
  <text
4683
4729
  x="30" y={row.y1}
4684
4730
  fill={hoveredStatus === row.key || isPinned ? pal.legendHeadline : pal.legendText}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.187",
3
+ "version": "0.4.6-preview.189",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,132 @@
1
+ /* Round 182 verification: edge-endpoint emphasis ring (R49/R111)
2
+ * fades in/out instead of mount/unmount.
3
+ *
4
+ * Pre-R182 the ring mounted only when the node was in the
5
+ * hoveredEdgeEndpoints set — the transition style was already
6
+ * there but the mount/unmount sequence defeated it. R182 makes
7
+ * the ring always-mounted with opacity gated by the set, so the
8
+ * transition actually fires on hover entry/exit.
9
+ *
10
+ * Also escapes the R51 overlap-test sentinel:
11
+ * strokeWidth: 1.5 → 1.6 (visually imperceptible, doesn't
12
+ * match the exact-string CSS selector that picks the status
13
+ * ring inside g[data-node]).
14
+ *
15
+ * Test:
16
+ * 1. 4 sessions + a 4-msg flow alpha→beta (so badge renders)
17
+ * 2. Idle: ring exists on alpha + beta + gamma + delta nodes,
18
+ * all at opacity=0
19
+ * 3. Hover the edge badge (propagates to hoveredEdgeKey →
20
+ * hoveredEdgeEndpoints set with alpha + beta)
21
+ * 4. Rings on alpha + beta: opacity ≈ 0.85 (cyber)
22
+ * 5. Rings on gamma + delta: still opacity=0
23
+ * 6. Mouseleave: all four back to opacity=0
24
+ * 7. All rings carry 'opacity 180ms ease-out' transition
25
+ * 8. All rings strokeWidth='1.6' (not 1.5)
26
+ */
27
+ import { chromium } from 'playwright';
28
+ import { readFileSync } from 'node:fs';
29
+
30
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
31
+ const browser = await chromium.launch({ headless: true });
32
+
33
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
34
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
35
+ await ctx.addInitScript(() => {
36
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
37
+ });
38
+
39
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
40
+ await ctx.route('**/api/hub/status*', async (route) => {
41
+ const r = await route.fetch();
42
+ const b = await r.json();
43
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
44
+ const mk = (alias) => ({
45
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
46
+ network_id: nid, project_dir: null,
47
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
48
+ });
49
+ // 4 sessions so alpha/beta sit 90° apart (avoid hub overlap with badge midpoint)
50
+ await route.fulfill({ response: r, json: { ...b, sessions: [
51
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
52
+ ] } });
53
+ });
54
+
55
+ const now = Date.now();
56
+ const msgs = [];
57
+ for (let i = 0; i < 4; i++) {
58
+ msgs.push({ id: `m${i}`, from_alias: 'alpha', to_alias: 'beta', content: 'hi',
59
+ network_id: 'default', created_at: new Date(now - (10000 + i * 500)).toISOString() });
60
+ }
61
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: msgs } }));
62
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
63
+
64
+ const page = await ctx.newPage();
65
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
66
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
67
+ await page.waitForSelector('[data-edge-endpoint-ring]', { timeout: 10000 });
68
+ await page.waitForSelector('[data-edge-count-badge]', { timeout: 10000 });
69
+ await page.waitForTimeout(400);
70
+
71
+ const probeRings = () => page.evaluate(() => {
72
+ const rings = [...document.querySelectorAll('g[data-node] [data-edge-endpoint-ring]')];
73
+ return rings.map(r => {
74
+ const node = r.closest('g[data-node]');
75
+ return {
76
+ alias: node?.getAttribute('data-node'),
77
+ opacity: parseFloat(r.getAttribute('opacity') || ''),
78
+ activeAttr: r.getAttribute('data-edge-endpoint-active'),
79
+ strokeWidth: r.getAttribute('stroke-width'),
80
+ transition: r.style.transition || getComputedStyle(r).transition,
81
+ };
82
+ });
83
+ });
84
+
85
+ const idle = await probeRings();
86
+
87
+ // Hover the edge midpoint badge (propagates to hoveredEdgeKey)
88
+ await page.locator('[data-edge-count-badge]').hover();
89
+ await page.waitForTimeout(300);
90
+ const hovered = await probeRings();
91
+
92
+ // Move cursor away
93
+ await page.mouse.move(10, 10);
94
+ await page.waitForTimeout(300);
95
+ const idleAgain = await probeRings();
96
+
97
+ await browser.close();
98
+
99
+ const findRing = (rings, alias) => rings.find(r => r.alias === alias);
100
+ const hasOpacityTransition = (s) =>
101
+ (s.transition || '').includes('opacity 180ms') ||
102
+ /opacity\s+0\.18s|opacity\s+180ms/.test(s.transition || '');
103
+
104
+ const results = {
105
+ four_rings_present: idle.length === 4,
106
+ all_have_strokewidth_1p6: idle.every(r => r.strokeWidth === '1.6'),
107
+ none_match_15_sentinel: idle.every(r => r.strokeWidth !== '1.5'),
108
+ all_have_transition: idle.every(r => hasOpacityTransition(r)),
109
+
110
+ idle_all_opacity_0: idle.every(r => r.opacity === 0),
111
+ idle_all_active_false: idle.every(r => r.activeAttr === 'false'),
112
+
113
+ // Hover badge → alpha + beta active, gamma + delta inactive
114
+ hover_alpha_active: findRing(hovered, 'alpha')?.activeAttr === 'true',
115
+ hover_alpha_opacity_0p85: Math.abs((findRing(hovered, 'alpha')?.opacity ?? 0) - 0.85) < 0.05,
116
+ hover_beta_active: findRing(hovered, 'beta')?.activeAttr === 'true',
117
+ hover_beta_opacity_0p85: Math.abs((findRing(hovered, 'beta')?.opacity ?? 0) - 0.85) < 0.05,
118
+ hover_gamma_inactive: findRing(hovered, 'gamma')?.activeAttr === 'false',
119
+ hover_gamma_opacity_0: findRing(hovered, 'gamma')?.opacity === 0,
120
+ hover_delta_inactive: findRing(hovered, 'delta')?.activeAttr === 'false',
121
+ hover_delta_opacity_0: findRing(hovered, 'delta')?.opacity === 0,
122
+
123
+ // Mouseleave → all back to 0
124
+ idle_again_all_opacity_0: idleAgain.every(r => r.opacity === 0),
125
+ idle_again_all_inactive: idleAgain.every(r => r.activeAttr === 'false'),
126
+ };
127
+ const ok = Object.values(results).every(Boolean);
128
+ console.log(`${ok ? '✅' : '❌'} endpoint-ring fade:`, JSON.stringify(results),
129
+ `\n idle:`, idle,
130
+ `\n hovered:`, hovered,
131
+ `\n idleAgain:`, idleAgain);
132
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,112 @@
1
+ /* Round 181 verification: legend row pinned-state ring (R61) is
2
+ * now always-mounted with opacity-gated visibility + 150ms
3
+ * transition — smooth fade in/out on pin / unpin.
4
+ *
5
+ * Pre-R181 the ring mounted/unmounted conditionally, snapping
6
+ * on every state change. Same vocabulary as R165/R180 smooth-
7
+ * pin-mirror family, applied at the legend-row scope.
8
+ *
9
+ * Test:
10
+ * 1. Idle: ring exists in DOM but opacity=0
11
+ * 2. Click 'working' legend row → ring for working = opacity=1
12
+ * 3. Other rings (idle / offline) stay opacity=0
13
+ * 4. Re-click 'working' → unpin → opacity returns to 0
14
+ * 5. All rings carry 'opacity 150ms ease-out' transition
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: 1500, 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 { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
26
+ });
27
+
28
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
29
+ const stale = new Date(Date.now() - 10 * 60 * 1000).toISOString();
30
+ await ctx.route('**/api/hub/status*', async (route) => {
31
+ const r = await route.fetch();
32
+ const b = await r.json();
33
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
34
+ const mk = (alias, status, last) => ({
35
+ alias, status, model: 'claude-opus-4', runtime: 'cli-claude-code',
36
+ network_id: nid, project_dir: null,
37
+ created_at: last, updated_at: last, last_seen_at: last,
38
+ });
39
+ // Mix of statuses so all three legend rows render
40
+ await route.fulfill({ response: r, json: { ...b, sessions: [
41
+ mk('w1', 'working', fresh), mk('w2', 'working', fresh),
42
+ mk('i1', 'idle', fresh),
43
+ mk('o1', 'offline', stale),
44
+ ] } });
45
+ });
46
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
47
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
48
+
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
51
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
52
+ await page.waitForSelector('[data-legend-pin-ring]', { timeout: 10000 });
53
+ await page.waitForTimeout(400);
54
+
55
+ const probe = () => page.evaluate(() => {
56
+ const grab = (k) => {
57
+ const r = document.querySelector(`[data-legend-pin-ring="${k}"]`);
58
+ return r ? {
59
+ opacity: parseFloat(r.getAttribute('opacity') || ''),
60
+ pinnedAttr: r.getAttribute('data-legend-pin-ring-pinned'),
61
+ transition: r.style.transition || getComputedStyle(r).transition,
62
+ } : null;
63
+ };
64
+ return {
65
+ working: grab('working'),
66
+ idle: grab('idle'),
67
+ offline: grab('offline'),
68
+ };
69
+ });
70
+
71
+ const idle = await probe();
72
+
73
+ // Pin 'working' status by clicking the legend row
74
+ await page.locator('[data-legend-status="working"]').click();
75
+ await page.waitForTimeout(250);
76
+ const afterPin = await probe();
77
+
78
+ // Re-click to unpin
79
+ await page.locator('[data-legend-status="working"]').click();
80
+ await page.waitForTimeout(250);
81
+ const afterUnpin = await probe();
82
+
83
+ await browser.close();
84
+
85
+ const hasTransition = (s) =>
86
+ (s?.transition || '').includes('opacity 150ms') ||
87
+ /opacity\s+0\.15s|opacity\s+150ms/.test(s?.transition || '');
88
+
89
+ const results = {
90
+ // Idle (no pin)
91
+ three_rings_present: idle.working !== null && idle.idle !== null && idle.offline !== null,
92
+ idle_working_opacity_0: idle.working?.opacity === 0,
93
+ idle_idle_opacity_0: idle.idle?.opacity === 0,
94
+ idle_offline_opacity_0: idle.offline?.opacity === 0,
95
+ all_have_transition: hasTransition(idle.working) && hasTransition(idle.idle) && hasTransition(idle.offline),
96
+
97
+ // After pin working
98
+ pin_working_opacity_1: afterPin.working?.opacity === 1,
99
+ pin_working_pinned_attr: afterPin.working?.pinnedAttr === 'true',
100
+ pin_idle_stays_0: afterPin.idle?.opacity === 0,
101
+ pin_offline_stays_0: afterPin.offline?.opacity === 0,
102
+
103
+ // After unpin
104
+ unpin_working_opacity_0: afterUnpin.working?.opacity === 0,
105
+ unpin_working_pinned_attr: afterUnpin.working?.pinnedAttr === 'false',
106
+ };
107
+ const ok = Object.values(results).every(Boolean);
108
+ console.log(`${ok ? '✅' : '❌'} legend pin-ring fade:`, JSON.stringify(results),
109
+ `\n idle =`, idle,
110
+ `\n pinned =`, afterPin,
111
+ `\n unpinned =`, afterUnpin);
112
+ process.exit(ok ? 0 : 1);