@sleep2agi/agent-network-dashboard 0.4.6-preview.206 → 0.4.6-preview.208

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 (155) 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/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/_not-found.html +2 -2
  15. package/.next/server/app/_not-found.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/admin.html +2 -2
  24. package/.next/server/app/admin.rsc +2 -2
  25. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  29. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  30. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  31. package/.next/server/app/index.html +2 -2
  32. package/.next/server/app/index.rsc +3 -3
  33. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  34. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  35. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  36. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  37. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  38. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  39. package/.next/server/app/login.html +2 -2
  40. package/.next/server/app/login.rsc +3 -3
  41. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  42. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  46. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  47. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/logs.html +2 -2
  49. package/.next/server/app/logs.rsc +2 -2
  50. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  51. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  54. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  55. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  56. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/messages.html +2 -2
  58. package/.next/server/app/messages.rsc +2 -2
  59. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  60. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  61. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  63. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  64. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  65. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/node.html +2 -2
  67. package/.next/server/app/node.rsc +2 -2
  68. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  69. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  70. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  72. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  73. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  74. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/nodes.html +2 -2
  76. package/.next/server/app/nodes.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  78. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  79. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  81. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  82. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  83. package/.next/server/app/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/server-logs.html +2 -2
  86. package/.next/server/app/server-logs.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  88. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  91. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  94. package/.next/server/app/settings/networks.html +2 -2
  95. package/.next/server/app/settings/networks.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  97. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  98. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  100. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  102. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  103. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  105. package/.next/server/app/settings/tokens.html +2 -2
  106. package/.next/server/app/settings/tokens.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  108. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  111. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  113. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  114. package/.next/server/app/settings.html +2 -2
  115. package/.next/server/app/settings.rsc +3 -3
  116. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  117. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  118. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  121. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  122. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  124. package/.next/server/app/tasks.html +2 -2
  125. package/.next/server/app/tasks.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  127. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  128. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  130. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  131. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  132. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +2 -2
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  134. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  138. package/.next/server/middleware-build-manifest.js +3 -3
  139. package/.next/server/pages/404.html +2 -2
  140. package/.next/server/pages/500.html +1 -1
  141. package/.next/server/server-reference-manifest.js +1 -1
  142. package/.next/server/server-reference-manifest.json +1 -1
  143. package/.next/static/chunks/{101rwb3rv5ek6.js → 0p0m766u5hdie.js} +1 -1
  144. package/.next/static/chunks/{10227p9.h_iwe.js → 0r_3o1g0huc5x.js} +3 -3
  145. package/.next/static/chunks/{05_62ey8jqws1.js → 0rkjlkz92cv1t.js} +1 -1
  146. package/.next/static/chunks/{01g4iybwpori..css → 0~k1yvhakbob6.css} +1 -1
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +89 -7
  150. package/package.json +1 -1
  151. package/scripts/topo-empty-state-breath-test.mjs +150 -0
  152. package/scripts/topo-statusbar-chips-self-hover-test.mjs +177 -0
  153. /package/.next/static/{3wpxJKGpalx1lcuz7MNps → 1qAKm3mDY7idTFEolEfzw}/_buildManifest.js +0 -0
  154. /package/.next/static/{3wpxJKGpalx1lcuz7MNps → 1qAKm3mDY7idTFEolEfzw}/_clientMiddlewareManifest.js +0 -0
  155. /package/.next/static/{3wpxJKGpalx1lcuz7MNps → 1qAKm3mDY7idTFEolEfzw}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":245,"timestamp":74768139139,"id":4,"parentId":1,"tags":{},"startTime":1778882740385,"traceId":"2dcb071a1ea62265"},{"name":"load-custom-routes","duration":450,"timestamp":74768139520,"id":5,"parentId":1,"tags":{},"startTime":1778882740386,"traceId":"2dcb071a1ea62265"},{"name":"create-dist-dir","duration":573,"timestamp":74768140028,"id":6,"parentId":1,"tags":{},"startTime":1778882740386,"traceId":"2dcb071a1ea62265"},{"name":"clean","duration":433,"timestamp":74768141216,"id":7,"parentId":1,"tags":{},"startTime":1778882740387,"traceId":"2dcb071a1ea62265"},{"name":"discover-routes","duration":10765,"timestamp":74768222406,"id":8,"parentId":1,"tags":{},"startTime":1778882740469,"traceId":"2dcb071a1ea62265"},{"name":"create-root-mapping","duration":180,"timestamp":74768233228,"id":9,"parentId":1,"tags":{},"startTime":1778882740480,"traceId":"2dcb071a1ea62265"},{"name":"generate-route-types","duration":32324,"timestamp":74768235744,"id":10,"parentId":1,"tags":{},"startTime":1778882740482,"traceId":"2dcb071a1ea62265"},{"name":"public-dir-conflict-check","duration":97,"timestamp":74768268222,"id":11,"parentId":1,"tags":{},"startTime":1778882740515,"traceId":"2dcb071a1ea62265"},{"name":"generate-routes-manifest","duration":4739,"timestamp":74768268451,"id":12,"parentId":1,"tags":{},"startTime":1778882740515,"traceId":"2dcb071a1ea62265"},{"name":"run-turbopack","duration":5522154,"timestamp":74768278342,"id":14,"parentId":1,"tags":{},"startTime":1778882740525,"traceId":"2dcb071a1ea62265"},{"name":"turbopack-build-events","duration":116,"timestamp":74768560798,"id":15,"parentId":1,"tags":{},"startTime":1778882740807,"traceId":"2dcb071a1ea62265"},{"name":"run-typescript","duration":8806974,"timestamp":74773831326,"id":16,"parentId":1,"tags":{},"startTime":1778882746078,"traceId":"2dcb071a1ea62265"},{"name":"generate-required-server-files","duration":2714,"timestamp":74782640041,"id":18,"parentId":1,"tags":{},"startTime":1778882754886,"traceId":"2dcb071a1ea62265"},{"name":"check-static-error-page","duration":13056,"timestamp":74782815817,"id":20,"parentId":19,"tags":{},"startTime":1778882755062,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":459703,"timestamp":74782831917,"id":63,"parentId":22,"tags":{},"startTime":1778882755078,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":472883,"timestamp":74782818913,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778882755065,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":572922,"timestamp":74782832506,"id":67,"parentId":28,"tags":{},"startTime":1778882755079,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":583239,"timestamp":74782822288,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":578169,"timestamp":74782832144,"id":65,"parentId":26,"tags":{},"startTime":1778882755078,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":588273,"timestamp":74782822114,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778882755068,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":579824,"timestamp":74782834230,"id":69,"parentId":30,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":591668,"timestamp":74782822463,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":600959,"timestamp":74782834426,"id":70,"parentId":32,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":612731,"timestamp":74782822737,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":603669,"timestamp":74782832026,"id":64,"parentId":25,"tags":{},"startTime":1778882755078,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":613809,"timestamp":74782821935,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778882755068,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":603905,"timestamp":74782834040,"id":68,"parentId":29,"tags":{},"startTime":1778882755080,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":615630,"timestamp":74782822366,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":605754,"timestamp":74782834497,"id":71,"parentId":33,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":617452,"timestamp":74782822838,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":608258,"timestamp":74782834577,"id":72,"parentId":34,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":619961,"timestamp":74782822916,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":619331,"timestamp":74782834611,"id":73,"parentId":35,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":630999,"timestamp":74782822993,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":623625,"timestamp":74782831592,"id":62,"parentId":21,"tags":{},"startTime":1778882755078,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":637885,"timestamp":74782817372,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778882755064,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":622298,"timestamp":74782834782,"id":76,"parentId":38,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":633504,"timestamp":74782823622,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":622577,"timestamp":74782834731,"id":74,"parentId":36,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":633934,"timestamp":74782823406,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":624321,"timestamp":74782834819,"id":78,"parentId":40,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":635432,"timestamp":74782823747,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":626979,"timestamp":74782834763,"id":75,"parentId":37,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":638255,"timestamp":74782823530,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":629363,"timestamp":74782834859,"id":81,"parentId":43,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":640319,"timestamp":74782823954,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":629656,"timestamp":74782834867,"id":82,"parentId":44,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":640539,"timestamp":74782824034,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":630222,"timestamp":74782834847,"id":80,"parentId":42,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":641225,"timestamp":74782823889,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":632109,"timestamp":74782834883,"id":83,"parentId":45,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":642944,"timestamp":74782824110,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":636549,"timestamp":74782834932,"id":87,"parentId":49,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":645787,"timestamp":74782825741,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778882755072,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":636717,"timestamp":74782834919,"id":86,"parentId":48,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":647350,"timestamp":74782824316,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778882755071,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":641172,"timestamp":74782834905,"id":85,"parentId":47,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":651873,"timestamp":74782824253,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778882755071,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":637299,"timestamp":74782840342,"id":89,"parentId":31,"tags":{},"startTime":1778882755087,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":655144,"timestamp":74782822537,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778882755069,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":643289,"timestamp":74782834896,"id":84,"parentId":46,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":654059,"timestamp":74782824170,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":642987,"timestamp":74782838712,"id":88,"parentId":24,"tags":{},"startTime":1778882755085,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":662287,"timestamp":74782819449,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778882755066,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":661387,"timestamp":74782834796,"id":77,"parentId":39,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":672551,"timestamp":74782823685,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":681003,"timestamp":74782832251,"id":66,"parentId":27,"tags":{},"startTime":1778882755079,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":691113,"timestamp":74782822205,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778882755068,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":691574,"timestamp":74782842624,"id":90,"parentId":23,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":715054,"timestamp":74782819213,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778882755065,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":698550,"timestamp":74782842669,"id":92,"parentId":51,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":714959,"timestamp":74782826319,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778882755073,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":707890,"timestamp":74782834834,"id":79,"parentId":41,"tags":{},"startTime":1778882755081,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":718957,"timestamp":74782823819,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778882755070,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":700229,"timestamp":74782842722,"id":96,"parentId":56,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":715554,"timestamp":74782827432,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778882755074,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":700756,"timestamp":74782842683,"id":93,"parentId":52,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":716996,"timestamp":74782826486,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778882755073,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":708301,"timestamp":74782842732,"id":97,"parentId":57,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":723464,"timestamp":74782827644,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778882755074,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":708488,"timestamp":74782842780,"id":100,"parentId":61,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":722699,"timestamp":74782828597,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778882755075,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":709730,"timestamp":74782842746,"id":98,"parentId":59,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":724238,"timestamp":74782828287,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778882755075,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":708525,"timestamp":74782848540,"id":101,"parentId":58,"tags":{},"startTime":1778882755095,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":729265,"timestamp":74782827836,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778882755074,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":714874,"timestamp":74782842763,"id":99,"parentId":60,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":729243,"timestamp":74782828445,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778882755075,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":715099,"timestamp":74782842691,"id":94,"parentId":53,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":731173,"timestamp":74782826666,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778882755073,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":691236,"timestamp":74782866834,"id":102,"parentId":55,"tags":{},"startTime":1778882755113,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":731142,"timestamp":74782826992,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778882755073,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":716449,"timestamp":74782842654,"id":91,"parentId":50,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":732999,"timestamp":74782826140,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778882755072,"traceId":"2dcb071a1ea62265"},{"name":"is-page-static","duration":739516,"timestamp":74782842705,"id":95,"parentId":54,"tags":{},"startTime":1778882755089,"traceId":"2dcb071a1ea62265"},{"name":"check-page","duration":755443,"timestamp":74782826825,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778882755073,"traceId":"2dcb071a1ea62265"},{"name":"static-check","duration":767654,"timestamp":74782814677,"id":19,"parentId":1,"tags":{},"startTime":1778882755061,"traceId":"2dcb071a1ea62265"},{"name":"write-routes-manifest","duration":411,"timestamp":74783589949,"id":104,"parentId":1,"tags":{},"startTime":1778882755836,"traceId":"2dcb071a1ea62265"},{"name":"load-dotenv","duration":45,"timestamp":74783600527,"id":107,"parentId":106,"tags":{},"startTime":1778882755847,"traceId":"2dcb071a1ea62265"},{"name":"run-export-path-map","duration":644,"timestamp":74783604609,"id":108,"parentId":106,"tags":{},"startTime":1778882755851,"traceId":"2dcb071a1ea62265"},{"name":"next-export","duration":603317,"timestamp":74783599305,"id":106,"parentId":1,"tags":{},"startTime":1778882755846,"traceId":"2dcb071a1ea62265"}]
2
- [{"name":"move-exported-app-not-found-","duration":2358,"timestamp":74784205886,"id":109,"parentId":105,"tags":{},"startTime":1778882756452,"traceId":"2dcb071a1ea62265"},{"name":"move-exported-app-global-error-","duration":673,"timestamp":74784208357,"id":110,"parentId":105,"tags":{},"startTime":1778882756455,"traceId":"2dcb071a1ea62265"},{"name":"static-generation","duration":617302,"timestamp":74783593933,"id":105,"parentId":1,"tags":{},"startTime":1778882755840,"traceId":"2dcb071a1ea62265"},{"name":"write-routes-manifest","duration":455,"timestamp":74784211448,"id":111,"parentId":1,"tags":{},"startTime":1778882756458,"traceId":"2dcb071a1ea62265"},{"name":"print-tree-view","duration":3752,"timestamp":74784228486,"id":112,"parentId":1,"tags":{},"startTime":1778882756475,"traceId":"2dcb071a1ea62265"},{"name":"write-route-bundle-stats","duration":13463,"timestamp":74784232265,"id":113,"parentId":1,"tags":{},"startTime":1778882756479,"traceId":"2dcb071a1ea62265"},{"name":"telemetry-flush","duration":24804,"timestamp":74784245752,"id":114,"parentId":1,"tags":{},"startTime":1778882756492,"traceId":"2dcb071a1ea62265"},{"name":"next-build","duration":16179202,"timestamp":74768091377,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778882740338,"traceId":"2dcb071a1ea62265"}]
1
+ [{"name":"generate-buildid","duration":274,"timestamp":75472327541,"id":4,"parentId":1,"tags":{},"startTime":1778883444574,"traceId":"15757ac1d044274a"},{"name":"load-custom-routes","duration":490,"timestamp":75472327956,"id":5,"parentId":1,"tags":{},"startTime":1778883444574,"traceId":"15757ac1d044274a"},{"name":"create-dist-dir","duration":629,"timestamp":75472328487,"id":6,"parentId":1,"tags":{},"startTime":1778883444575,"traceId":"15757ac1d044274a"},{"name":"clean","duration":524,"timestamp":75472329707,"id":7,"parentId":1,"tags":{},"startTime":1778883444576,"traceId":"15757ac1d044274a"},{"name":"discover-routes","duration":9081,"timestamp":75472408875,"id":8,"parentId":1,"tags":{},"startTime":1778883444655,"traceId":"15757ac1d044274a"},{"name":"create-root-mapping","duration":123,"timestamp":75472418042,"id":9,"parentId":1,"tags":{},"startTime":1778883444664,"traceId":"15757ac1d044274a"},{"name":"generate-route-types","duration":38737,"timestamp":75472420331,"id":10,"parentId":1,"tags":{},"startTime":1778883444667,"traceId":"15757ac1d044274a"},{"name":"public-dir-conflict-check","duration":96,"timestamp":75472459216,"id":11,"parentId":1,"tags":{},"startTime":1778883444705,"traceId":"15757ac1d044274a"},{"name":"generate-routes-manifest","duration":4734,"timestamp":75472459429,"id":12,"parentId":1,"tags":{},"startTime":1778883444706,"traceId":"15757ac1d044274a"},{"name":"run-turbopack","duration":5178900,"timestamp":75472469716,"id":14,"parentId":1,"tags":{},"startTime":1778883444716,"traceId":"15757ac1d044274a"},{"name":"turbopack-build-events","duration":71,"timestamp":75472742583,"id":15,"parentId":1,"tags":{},"startTime":1778883444989,"traceId":"15757ac1d044274a"},{"name":"run-typescript","duration":8286776,"timestamp":75477657424,"id":16,"parentId":1,"tags":{},"startTime":1778883449904,"traceId":"15757ac1d044274a"},{"name":"generate-required-server-files","duration":3272,"timestamp":75485945479,"id":18,"parentId":1,"tags":{},"startTime":1778883458192,"traceId":"15757ac1d044274a"},{"name":"check-static-error-page","duration":15648,"timestamp":75486130414,"id":20,"parentId":19,"tags":{},"startTime":1778883458377,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":471689,"timestamp":75486148260,"id":63,"parentId":22,"tags":{},"startTime":1778883458395,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":486504,"timestamp":75486133655,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778883458380,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":525449,"timestamp":75486147933,"id":62,"parentId":21,"tags":{},"startTime":1778883458394,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":541458,"timestamp":75486132017,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778883458378,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":532387,"timestamp":75486148905,"id":67,"parentId":28,"tags":{},"startTime":1778883458395,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":543981,"timestamp":75486137394,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778883458384,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":532981,"timestamp":75486148630,"id":66,"parentId":27,"tags":{},"startTime":1778883458395,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":544401,"timestamp":75486137258,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778883458384,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":540395,"timestamp":75486149096,"id":68,"parentId":29,"tags":{},"startTime":1778883458395,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":552010,"timestamp":75486137538,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778883458384,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":550862,"timestamp":75486148388,"id":64,"parentId":25,"tags":{},"startTime":1778883458395,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":562502,"timestamp":75486136911,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778883458383,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":554718,"timestamp":75486149671,"id":74,"parentId":36,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":565247,"timestamp":75486139191,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778883458385,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":562477,"timestamp":75486148513,"id":65,"parentId":26,"tags":{},"startTime":1778883458395,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":573967,"timestamp":75486137114,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778883458383,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":569066,"timestamp":75486149697,"id":75,"parentId":37,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":579438,"timestamp":75486139393,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":573747,"timestamp":75486149469,"id":71,"parentId":33,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":584921,"timestamp":75486138343,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778883458385,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":574387,"timestamp":75486149539,"id":72,"parentId":34,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":585473,"timestamp":75486138491,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778883458385,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":575208,"timestamp":75486149720,"id":77,"parentId":39,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":585286,"timestamp":75486139677,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":576714,"timestamp":75486149565,"id":73,"parentId":35,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":587680,"timestamp":75486138648,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778883458385,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":580994,"timestamp":75486149751,"id":80,"parentId":42,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":590719,"timestamp":75486140084,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":585172,"timestamp":75486149741,"id":79,"parentId":41,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":595015,"timestamp":75486139942,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":589337,"timestamp":75486149710,"id":76,"parentId":38,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":599556,"timestamp":75486139536,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":586969,"timestamp":75486152673,"id":83,"parentId":45,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":599262,"timestamp":75486140437,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778883458387,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":587280,"timestamp":75486152656,"id":82,"parentId":44,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":599652,"timestamp":75486140315,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778883458387,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":592478,"timestamp":75486149731,"id":78,"parentId":40,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":602431,"timestamp":75486139822,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":589767,"timestamp":75486152623,"id":81,"parentId":43,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":602216,"timestamp":75486140201,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778883458386,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":591675,"timestamp":75486152700,"id":85,"parentId":47,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":603710,"timestamp":75486140704,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778883458387,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":594010,"timestamp":75486152715,"id":86,"parentId":48,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":605922,"timestamp":75486140842,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778883458387,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":591573,"timestamp":75486159707,"id":89,"parentId":31,"tags":{},"startTime":1778883458406,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":613454,"timestamp":75486137869,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778883458384,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":597527,"timestamp":75486158569,"id":88,"parentId":24,"tags":{},"startTime":1778883458405,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":621887,"timestamp":75486134250,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778883458381,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":604596,"timestamp":75486152684,"id":84,"parentId":46,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":616778,"timestamp":75486140546,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778883458387,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":608081,"timestamp":75486149404,"id":70,"parentId":32,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":619337,"timestamp":75486138184,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778883458384,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":605780,"timestamp":75486152727,"id":87,"parentId":49,"tags":{},"startTime":1778883458399,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":617588,"timestamp":75486140963,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778883458387,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":612369,"timestamp":75486149236,"id":69,"parentId":30,"tags":{},"startTime":1778883458396,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":623933,"timestamp":75486137711,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778883458384,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":603148,"timestamp":75486162198,"id":94,"parentId":53,"tags":{},"startTime":1778883458408,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":621808,"timestamp":75486143575,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778883458390,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":613743,"timestamp":75486162243,"id":97,"parentId":57,"tags":{},"startTime":1778883458409,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":632059,"timestamp":75486144935,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778883458391,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":622761,"timestamp":75486162255,"id":98,"parentId":59,"tags":{},"startTime":1778883458409,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":639468,"timestamp":75486145592,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778883458392,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":637205,"timestamp":75486162454,"id":99,"parentId":60,"tags":{},"startTime":1778883458409,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":654003,"timestamp":75486145738,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778883458392,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":644673,"timestamp":75486162151,"id":91,"parentId":50,"tags":{},"startTime":1778883458408,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":663947,"timestamp":75486142948,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778883458389,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":652194,"timestamp":75486162485,"id":100,"parentId":61,"tags":{},"startTime":1778883458409,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":669009,"timestamp":75486145857,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778883458392,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":652809,"timestamp":75486162170,"id":92,"parentId":51,"tags":{},"startTime":1778883458408,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":671871,"timestamp":75486143164,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778883458389,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":646284,"timestamp":75486168833,"id":101,"parentId":58,"tags":{},"startTime":1778883458415,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":669981,"timestamp":75486145163,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778883458391,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":653091,"timestamp":75486162123,"id":90,"parentId":23,"tags":{},"startTime":1778883458408,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":681277,"timestamp":75486133963,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778883458380,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":653097,"timestamp":75486162213,"id":95,"parentId":54,"tags":{},"startTime":1778883458408,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":671522,"timestamp":75486143816,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778883458390,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":653210,"timestamp":75486162186,"id":93,"parentId":52,"tags":{},"startTime":1778883458408,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":672063,"timestamp":75486143352,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778883458390,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":633269,"timestamp":75486185506,"id":102,"parentId":55,"tags":{},"startTime":1778883458432,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":674714,"timestamp":75486144099,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778883458390,"traceId":"15757ac1d044274a"},{"name":"is-page-static","duration":657386,"timestamp":75486162228,"id":96,"parentId":56,"tags":{},"startTime":1778883458409,"traceId":"15757ac1d044274a"},{"name":"check-page","duration":674932,"timestamp":75486144700,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778883458391,"traceId":"15757ac1d044274a"},{"name":"static-check","duration":690387,"timestamp":75486129286,"id":19,"parentId":1,"tags":{},"startTime":1778883458376,"traceId":"15757ac1d044274a"},{"name":"write-routes-manifest","duration":319,"timestamp":75486827166,"id":104,"parentId":1,"tags":{},"startTime":1778883459073,"traceId":"15757ac1d044274a"},{"name":"load-dotenv","duration":58,"timestamp":75486839320,"id":107,"parentId":106,"tags":{},"startTime":1778883459086,"traceId":"15757ac1d044274a"},{"name":"run-export-path-map","duration":810,"timestamp":75486842424,"id":108,"parentId":106,"tags":{},"startTime":1778883459089,"traceId":"15757ac1d044274a"},{"name":"next-export","duration":544561,"timestamp":75486837579,"id":106,"parentId":1,"tags":{},"startTime":1778883459084,"traceId":"15757ac1d044274a"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2119,"timestamp":75487385386,"id":109,"parentId":105,"tags":{},"startTime":1778883459632,"traceId":"15757ac1d044274a"},{"name":"move-exported-app-global-error-","duration":564,"timestamp":75487387584,"id":110,"parentId":105,"tags":{},"startTime":1778883459634,"traceId":"15757ac1d044274a"},{"name":"static-generation","duration":559522,"timestamp":75486830909,"id":105,"parentId":1,"tags":{},"startTime":1778883459077,"traceId":"15757ac1d044274a"},{"name":"write-routes-manifest","duration":403,"timestamp":75487390585,"id":111,"parentId":1,"tags":{},"startTime":1778883459637,"traceId":"15757ac1d044274a"},{"name":"print-tree-view","duration":3574,"timestamp":75487409032,"id":112,"parentId":1,"tags":{},"startTime":1778883459655,"traceId":"15757ac1d044274a"},{"name":"write-route-bundle-stats","duration":11579,"timestamp":75487412632,"id":113,"parentId":1,"tags":{},"startTime":1778883459659,"traceId":"15757ac1d044274a"},{"name":"telemetry-flush","duration":19639,"timestamp":75487424234,"id":114,"parentId":1,"tags":{},"startTime":1778883459671,"traceId":"15757ac1d044274a"},{"name":"next-build","duration":15166899,"timestamp":75472276998,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778883444523,"traceId":"15757ac1d044274a"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5522154,"timestamp":74768278342,"id":14,"parentId":1,"tags":{},"startTime":1778882740525,"traceId":"2dcb071a1ea62265"},{"name":"turbopack-build-events","duration":116,"timestamp":74768560798,"id":15,"parentId":1,"tags":{},"startTime":1778882740807,"traceId":"2dcb071a1ea62265"},{"name":"run-typescript","duration":8806974,"timestamp":74773831326,"id":16,"parentId":1,"tags":{},"startTime":1778882746078,"traceId":"2dcb071a1ea62265"},{"name":"static-check","duration":767654,"timestamp":74782814677,"id":19,"parentId":1,"tags":{},"startTime":1778882755061,"traceId":"2dcb071a1ea62265"},{"name":"static-generation","duration":617302,"timestamp":74783593933,"id":105,"parentId":1,"tags":{},"startTime":1778882755840,"traceId":"2dcb071a1ea62265"},{"name":"telemetry-flush","duration":24804,"timestamp":74784245752,"id":114,"parentId":1,"tags":{},"startTime":1778882756492,"traceId":"2dcb071a1ea62265"},{"name":"next-build","duration":16179202,"timestamp":74768091377,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778882740338,"traceId":"2dcb071a1ea62265"}]
1
+ [{"name":"run-turbopack","duration":5178900,"timestamp":75472469716,"id":14,"parentId":1,"tags":{},"startTime":1778883444716,"traceId":"15757ac1d044274a"},{"name":"turbopack-build-events","duration":71,"timestamp":75472742583,"id":15,"parentId":1,"tags":{},"startTime":1778883444989,"traceId":"15757ac1d044274a"},{"name":"run-typescript","duration":8286776,"timestamp":75477657424,"id":16,"parentId":1,"tags":{},"startTime":1778883449904,"traceId":"15757ac1d044274a"},{"name":"static-check","duration":690387,"timestamp":75486129286,"id":19,"parentId":1,"tags":{},"startTime":1778883458376,"traceId":"15757ac1d044274a"},{"name":"static-generation","duration":559522,"timestamp":75486830909,"id":105,"parentId":1,"tags":{},"startTime":1778883459077,"traceId":"15757ac1d044274a"},{"name":"telemetry-flush","duration":19639,"timestamp":75487424234,"id":114,"parentId":1,"tags":{},"startTime":1778883459671,"traceId":"15757ac1d044274a"},{"name":"next-build","duration":15166899,"timestamp":75472276998,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778883444523,"traceId":"15757ac1d044274a"}]
@@ -1502,7 +1502,21 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1502
1502
  return (
1503
1503
  <>
1504
1504
  <span
1505
- className="px-2.5 py-1 rounded-md bg-green-500/10 text-green-300 border border-green-500/20 anet-topo-chip-focus"
1505
+ // Round 201 / Loop: the working chip joins the
1506
+ // "chip's hover state deepens its OWN identity colour"
1507
+ // family that R193 opened (active-links chip) and R195
1508
+ // extended (recent-panel footer). Pre-R201 hovering the
1509
+ // working chip fired R55 canvas dim + chip-row highlight
1510
+ // but the chip itself stayed at bg-green-500/10 — cause
1511
+ // silent, effect loud. R201 deepens its OWN green hue
1512
+ // (10→15 bg, 20→30 border) only when clickable.
1513
+ // transition-colors duration-200 blends the swap to
1514
+ // match R193's timing on the active-links chip.
1515
+ className={`px-2.5 py-1 rounded-md border anet-topo-chip-focus transition-colors duration-200 ${
1516
+ workingCount > 0
1517
+ ? 'bg-green-500/10 text-green-300 border-green-500/20 hover:bg-green-500/15 hover:border-green-500/30'
1518
+ : 'bg-green-500/10 text-green-300 border-green-500/20'
1519
+ }`}
1506
1520
  data-working-chip
1507
1521
  data-working-chip-aliases={workingAliases.join(',')}
1508
1522
  data-pin-mirror={pinnedStatus === 'working' ? 'true' : 'false'}
@@ -1518,10 +1532,16 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1518
1532
  // (working / online / vendor letter). The visual is small
1519
1533
  // — a 1-2 px inset double ring — but the eye catches the
1520
1534
  // pop on every pin/unpin without the ease.
1535
+ // Round 201 / Loop: inline transition list now also covers
1536
+ // background-color + border-color so the R201 hover tint
1537
+ // eases. Tailwind transition-colors on the className would
1538
+ // be overridden by this inline declaration, so we splice
1539
+ // the colour properties directly into the existing
1540
+ // R180 box-shadow transition.
1521
1541
  style={{
1522
1542
  cursor: workingCount > 0 ? 'pointer' : undefined,
1523
1543
  boxShadow: pinnedStatus === 'working' ? 'inset 0 0 0 1px #4ade80, inset 0 0 0 2px rgba(255,255,255,0.45)' : undefined,
1524
- transition: 'box-shadow 150ms ease-out',
1544
+ transition: 'box-shadow 150ms ease-out, background-color 200ms ease-out, border-color 200ms ease-out',
1525
1545
  }}
1526
1546
  onMouseEnter={() => { if (workingCount > 0) setHoveredStatus('working'); }}
1527
1547
  onMouseLeave={() => setHoveredStatus(prev => prev === 'working' ? null : prev)}
@@ -1548,7 +1568,19 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1548
1568
  {workingCount} working
1549
1569
  </span>
1550
1570
  <span
1551
- className="px-2.5 py-1 rounded-md bg-cyan-500/10 text-cyan-300 border border-cyan-500/20 anet-topo-chip-focus"
1571
+ // Round 201 / Loop: online chip — mirror of the working
1572
+ // chip treatment above. cyan hue 10→15 bg + 20→30 border
1573
+ // on hover, only when there's at least one online node
1574
+ // to highlight. Three sibling chips in the chip row now
1575
+ // all speak the same gesture vocabulary:
1576
+ // working chip · green 10→15 (R201)
1577
+ // online chip · cyan 10→15 (R201)
1578
+ // active-links · gray → cyan (R193)
1579
+ className={`px-2.5 py-1 rounded-md border anet-topo-chip-focus transition-colors duration-200 ${
1580
+ onlineNodes.length > 0
1581
+ ? 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20 hover:bg-cyan-500/15 hover:border-cyan-500/30'
1582
+ : 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20'
1583
+ }`}
1552
1584
  data-online-chip
1553
1585
  data-online-chip-aliases={onlineAliases.join(',')}
1554
1586
  data-pin-mirror={pinnedStatus === 'idle' ? 'true' : 'false'}
@@ -1557,10 +1589,12 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1557
1589
  role={onlineNodes.length > 0 ? 'link' : undefined}
1558
1590
  tabIndex={onlineNodes.length > 0 ? 0 : undefined}
1559
1591
  // R180: smooth-pin-mirror family — see working chip above.
1592
+ // R201: inline transition list also covers bg + border so
1593
+ // the new R201 hover tint eases (mirror of working chip).
1560
1594
  style={{
1561
1595
  cursor: onlineNodes.length > 0 ? 'pointer' : undefined,
1562
1596
  boxShadow: pinnedStatus === 'idle' ? 'inset 0 0 0 1px #67e8f9, inset 0 0 0 2px rgba(255,255,255,0.45)' : undefined,
1563
- transition: 'box-shadow 150ms ease-out',
1597
+ transition: 'box-shadow 150ms ease-out, background-color 200ms ease-out, border-color 200ms ease-out',
1564
1598
  }}
1565
1599
  onMouseEnter={() => {
1566
1600
  // If a working filter would isolate nothing, route to idle.
@@ -4448,13 +4482,61 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4448
4482
  invitation, not an error. Two-line layout uses
4449
4483
  standard SVG <text>+<text> rather than tspan so the
4450
4484
  y-coordinates are explicit and the data-attr selector
4451
- still finds the primary line. */
4485
+ still finds the primary line.
4486
+
4487
+ Round 200 / Loop · milestone: empty-state lines now
4488
+ breathe in opacity. Pre-R200 the two texts sat at
4489
+ fixed 0.65 / 0.45 — visually identical to "frozen"
4490
+ or "broken". A slow 4.4s in-out breath (peak just
4491
+ above resting, trough just below) says "waiting,
4492
+ listening". Pacing matches R84 idle-hub breath at
4493
+ the slow end of its workingCount=0 cycle, so the
4494
+ two empty-state surfaces (hub centre + panel
4495
+ placeholder) share rhythm; when the first message
4496
+ arrives, both surfaces become non-empty in sync.
4497
+ Reduced-motion users see the resting opacity only
4498
+ (SMIL is gated to !reducedMotion, same idiom every
4499
+ other ambient animation uses). Negative `begin`
4500
+ phase-shifts the sub-line 1.5s behind the main
4501
+ line so the two read as a gentle inhale-exhale
4502
+ instead of a single double-loud pulse. */
4452
4503
  <>
4453
- <text x="115" y="54" textAnchor="middle" fill={pal.legendText} fontSize="10" fontFamily="monospace" fontStyle="italic" opacity={0.65} data-recent-signal-empty>
4504
+ <text
4505
+ x="115" y="54" textAnchor="middle"
4506
+ fill={pal.legendText}
4507
+ fontSize="10" fontFamily="monospace" fontStyle="italic"
4508
+ opacity={0.65}
4509
+ data-recent-signal-empty
4510
+ data-recent-signal-empty-breathes={reducedMotion ? 'false' : 'true'}
4511
+ >
4454
4512
  no flow yet
4513
+ {!reducedMotion && (
4514
+ <animate
4515
+ attributeName="opacity"
4516
+ values="0.55;0.78;0.55"
4517
+ dur="4.4s"
4518
+ repeatCount="indefinite"
4519
+ />
4520
+ )}
4455
4521
  </text>
4456
- <text x="115" y="68" textAnchor="middle" fill={pal.legendText} fontSize="8" fontFamily="monospace" opacity={0.45} data-recent-signal-empty-hint>
4522
+ <text
4523
+ x="115" y="68" textAnchor="middle"
4524
+ fill={pal.legendText}
4525
+ fontSize="8" fontFamily="monospace"
4526
+ opacity={0.45}
4527
+ data-recent-signal-empty-hint
4528
+ data-recent-signal-empty-hint-breathes={reducedMotion ? 'false' : 'true'}
4529
+ >
4457
4530
  send a message between agents
4531
+ {!reducedMotion && (
4532
+ <animate
4533
+ attributeName="opacity"
4534
+ values="0.36;0.58;0.36"
4535
+ dur="4.4s"
4536
+ begin="-1.5s"
4537
+ repeatCount="indefinite"
4538
+ />
4539
+ )}
4458
4540
  </text>
4459
4541
  </>
4460
4542
  ) : (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.206",
3
+ "version": "0.4.6-preview.208",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,150 @@
1
+ /* Round 200 verification (milestone): recent-signal panel empty-
2
+ * state texts breathe in opacity. The two lines "no flow yet" and
3
+ * "send a message between agents" each get a SMIL <animate> child
4
+ * cycling opacity ~0.55 ↔ 0.78 (main) and 0.36 ↔ 0.58 (sub) over
5
+ * 4.4s. Sub-line is phase-shifted -1.5s so the two read as
6
+ * inhale-exhale, not synchronised pulse.
7
+ *
8
+ * Pre-R200 both texts sat at fixed opacity 0.65 / 0.45 — visually
9
+ * identical to "frozen" or "broken" first-impression. Slow breath
10
+ * = "waiting, listening" while staying calm.
11
+ *
12
+ * Test:
13
+ * 1. Mock 0 messages → flowLinks.length === 0 → empty state fires.
14
+ * 2. data-recent-signal-empty + data-recent-signal-empty-hint
15
+ * both present.
16
+ * 3. data-recent-signal-empty-breathes='true'
17
+ * data-recent-signal-empty-hint-breathes='true'
18
+ * 4. Both texts contain an <animate> child with:
19
+ * - attributeName='opacity'
20
+ * - dur='4.4s'
21
+ * - repeatCount='indefinite'
22
+ * - values cover a range (not a single value)
23
+ * 5. Sub-line <animate> has begin='-1.5s' (phase-shift).
24
+ * 6. Main <animate> begin is unset / '0s' (no phase shift).
25
+ * 7. Captured opacity values shift over time (sample twice, ~2s
26
+ * apart): same element should produce different rendered
27
+ * opacity values because SMIL is animating.
28
+ */
29
+ import { chromium } from 'playwright';
30
+ import { readFileSync } from 'node:fs';
31
+
32
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
33
+ const browser = await chromium.launch({ headless: true });
34
+
35
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
36
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
37
+ await ctx.addInitScript(() => {
38
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
39
+ });
40
+
41
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
42
+ await ctx.route('**/api/hub/status*', async (route) => {
43
+ const r = await route.fetch();
44
+ const b = await r.json();
45
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
46
+ const mk = (alias) => ({
47
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
48
+ network_id: nid, project_dir: null,
49
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
50
+ });
51
+ await route.fulfill({ response: r, json: { ...b, sessions: [
52
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
53
+ ] } });
54
+ });
55
+ // 0 messages → empty state fires
56
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
57
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
58
+
59
+ const page = await ctx.newPage();
60
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
61
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
62
+ await page.waitForSelector('[data-recent-signal-empty]', { timeout: 10000 });
63
+ await page.waitForTimeout(300);
64
+
65
+ const probeStructure = async () => page.evaluate(() => {
66
+ const main = document.querySelector('[data-recent-signal-empty]');
67
+ const sub = document.querySelector('[data-recent-signal-empty-hint]');
68
+ function pickAnim(textEl) {
69
+ if (!textEl) return null;
70
+ const a = textEl.querySelector('animate');
71
+ if (!a) return { found: false };
72
+ return {
73
+ found: true,
74
+ attribute: a.getAttribute('attributeName'),
75
+ values: a.getAttribute('values'),
76
+ dur: a.getAttribute('dur'),
77
+ begin: a.getAttribute('begin'),
78
+ repeatCount: a.getAttribute('repeatCount'),
79
+ };
80
+ }
81
+ return {
82
+ mainText: main?.textContent?.trim(),
83
+ mainBreathes:main?.getAttribute('data-recent-signal-empty-breathes'),
84
+ mainAnim: pickAnim(main),
85
+ subText: sub?.textContent?.trim(),
86
+ subBreathes: sub?.getAttribute('data-recent-signal-empty-hint-breathes'),
87
+ subAnim: pickAnim(sub),
88
+ };
89
+ });
90
+
91
+ const s = await probeStructure();
92
+
93
+ // Sample rendered opacity twice ~2s apart to verify SMIL is actually
94
+ // animating in the browser, not just declared.
95
+ async function sampleOpacities() {
96
+ return page.evaluate(() => {
97
+ const main = document.querySelector('[data-recent-signal-empty]');
98
+ const sub = document.querySelector('[data-recent-signal-empty-hint]');
99
+ // SMIL renders into the SVG-internal opacity (DOM attr stays
100
+ // static at the React-rendered value; computed style reads the
101
+ // animated current value).
102
+ return {
103
+ mainComputed: parseFloat(getComputedStyle(main).opacity),
104
+ subComputed: parseFloat(getComputedStyle(sub).opacity),
105
+ };
106
+ });
107
+ }
108
+ const sample1 = await sampleOpacities();
109
+ await page.waitForTimeout(2000);
110
+ const sample2 = await sampleOpacities();
111
+
112
+ await browser.close();
113
+
114
+ const parseValues = (v) => (v || '').split(/[;,]/).map(parseFloat).filter(Number.isFinite);
115
+ const mainVals = parseValues(s.mainAnim?.values);
116
+ const subVals = parseValues(s.subAnim?.values);
117
+
118
+ const results = {
119
+ empty_state_visible: s.mainText === 'no flow yet',
120
+ hint_visible: s.subText === 'send a message between agents',
121
+ main_breathes_attr: s.mainBreathes === 'true',
122
+ hint_breathes_attr: s.subBreathes === 'true',
123
+
124
+ main_anim_found: s.mainAnim?.found === true,
125
+ main_anim_opacity: s.mainAnim?.attribute === 'opacity',
126
+ main_anim_dur_4p4s: s.mainAnim?.dur === '4.4s',
127
+ main_anim_indefinite: s.mainAnim?.repeatCount === 'indefinite',
128
+ main_anim_values_range: mainVals.length >= 3 && (Math.max(...mainVals) - Math.min(...mainVals)) > 0.1,
129
+ main_anim_no_phase_shift: !s.mainAnim?.begin || s.mainAnim?.begin === '0s' || s.mainAnim?.begin === '',
130
+
131
+ sub_anim_found: s.subAnim?.found === true,
132
+ sub_anim_opacity: s.subAnim?.attribute === 'opacity',
133
+ sub_anim_dur_4p4s: s.subAnim?.dur === '4.4s',
134
+ sub_anim_phase_shift: s.subAnim?.begin === '-1.5s',
135
+ sub_anim_values_range: subVals.length >= 3 && (Math.max(...subVals) - Math.min(...subVals)) > 0.1,
136
+
137
+ // SMIL actually animates — sampling at different cycle phases yields
138
+ // different rendered opacities. With 4.4s period and 2s gap, the two
139
+ // samples are at distinct phases and should diverge by at least 0.04
140
+ // unless we landed on symmetric cycle points (extremely rare given
141
+ // mock timing variance — re-check loose bound).
142
+ main_opacity_animating: Math.abs(sample1.mainComputed - sample2.mainComputed) > 0.02,
143
+ sub_opacity_animating: Math.abs(sample1.subComputed - sample2.subComputed) > 0.02,
144
+ };
145
+ const ok = Object.values(results).every(Boolean);
146
+ console.log(`${ok ? '✅' : '❌'} empty-state breath:`, JSON.stringify(results),
147
+ `\n structure:`, s,
148
+ `\n sample1:`, sample1,
149
+ `\n sample2:`, sample2);
150
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,177 @@
1
+ /* Round 201 verification: the chip-row "N working" / "N online" chips
2
+ * adopt deeper versions of their own identity colour on hover,
3
+ * mirroring R193 active-links chip pattern.
4
+ *
5
+ * Pre-R201 hover working chip → R55 canvas dim + chip-row highlight,
6
+ * but chip itself stayed at bg-{color}-500/10 — cause silent, effect
7
+ * loud. R201 deepens 10→15 bg and 20→30 border on hover (only when
8
+ * the chip has a target count > 0). The inline transition list is
9
+ * extended to cover background-color + border-color so the swap
10
+ * eases instead of snapping (Tailwind transition-colors on the
11
+ * className alone would be overridden by the existing R180 inline
12
+ * box-shadow transition).
13
+ *
14
+ * Test (cyber dark, 4 working sessions):
15
+ * 1. Working chip: clickable='true', className has hover:bg-green-500/15
16
+ * + hover:border-green-500/30, transition includes 'background-color'
17
+ * + 'border-color' (both 200ms), inline still has 'box-shadow 150ms'.
18
+ * 2. Online chip: same shape with cyan hue.
19
+ * 3. Hover the working chip — wait past 220ms → computed bg
20
+ * shifts to a more-saturated/darker green (RGB-or-OKLab signal).
21
+ * 4. Move away — bg returns to idle (with margin past 220ms).
22
+ * 5. The chip's R55 canvas-effect setHoveredStatus still fires —
23
+ * verified via hoveredStatus change reflected on the working
24
+ * legend row's data-legend-row-lifted attribute.
25
+ */
26
+ import { chromium } from 'playwright';
27
+ import { readFileSync } from 'node:fs';
28
+
29
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
30
+ const browser = await chromium.launch({ headless: true });
31
+
32
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
33
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
34
+ await ctx.addInitScript(() => {
35
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
36
+ });
37
+
38
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
39
+ await ctx.route('**/api/hub/status*', async (route) => {
40
+ const r = await route.fetch();
41
+ const b = await r.json();
42
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
43
+ const mk = (alias) => ({
44
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
45
+ network_id: nid, project_dir: null,
46
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
47
+ });
48
+ await route.fulfill({ response: r, json: { ...b, sessions: [
49
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
50
+ ] } });
51
+ });
52
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
53
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
54
+
55
+ const page = await ctx.newPage();
56
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
57
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
58
+ await page.waitForSelector('[data-working-chip]', { timeout: 10000 });
59
+ await page.waitForTimeout(300);
60
+
61
+ const probeChip = async (selector) => page.evaluate((sel) => {
62
+ const el = document.querySelector(sel);
63
+ if (!el) return null;
64
+ const cs = getComputedStyle(el);
65
+ return {
66
+ className: el.getAttribute('class') || '',
67
+ clickable: el.getAttribute('data-working-chip-clickable') ||
68
+ el.getAttribute('data-online-chip-clickable'),
69
+ bg: cs.backgroundColor,
70
+ borderColor: cs.borderTopColor,
71
+ transition: el.style.transition,
72
+ };
73
+ }, selector);
74
+
75
+ const idleWorking = await probeChip('[data-working-chip]');
76
+ const idleOnline = await probeChip('[data-online-chip]');
77
+
78
+ await page.hover('[data-working-chip]');
79
+ await page.waitForTimeout(250);
80
+ const hoverWorking = await probeChip('[data-working-chip]');
81
+
82
+ // Confirm R55 canvas effect still fires — hoveredStatus='working'
83
+ // lifts the legend working row.
84
+ const workingRowLifted = await page.evaluate(() =>
85
+ document.querySelector('[data-legend-status="working"]')
86
+ ?.getAttribute('data-legend-row-lifted'));
87
+
88
+ await page.mouse.move(0, 0);
89
+ await page.waitForTimeout(280);
90
+ const settledWorking = await probeChip('[data-working-chip]');
91
+
92
+ await page.hover('[data-online-chip]');
93
+ await page.waitForTimeout(250);
94
+ const hoverOnline = await probeChip('[data-online-chip]');
95
+
96
+ await page.mouse.move(0, 0);
97
+ await page.waitForTimeout(280);
98
+ const settledOnline = await probeChip('[data-online-chip]');
99
+
100
+ await browser.close();
101
+
102
+ // Tailwind 4 emits oklab/oklch / color-mix forms. Just check the bg
103
+ // string actually differs idle vs hover, and a brief parser confirms
104
+ // the channel that should grow (green for working, blue/green for cyan).
105
+ // Parse colors including alpha. R201's Tailwind /10 → /15 emits same
106
+ // OKLab L/a/b with stepped-up alpha (0.1 → 0.15); R193's gray→cyan
107
+ // pattern emits a different hue at any alpha. Both are "more saturated
108
+ // against the canvas" from the user's POV. Capture alpha and treat
109
+ // alpha-increase as a valid saturation signal alongside chroma growth.
110
+ function parseColor(s) {
111
+ if (!s) return null;
112
+ let m = s.match(/rgba?\(\s*(\d+)\s*,?\s*(\d+)\s*,?\s*(\d+)(?:\s*[,/]\s*([\d.]+))?/);
113
+ if (m) return { kind: 'rgb', r: +m[1], g: +m[2], b: +m[3], a: m[4] != null ? +m[4] : 1 };
114
+ m = s.match(/oklab\(\s*([\-\d.]+)\s+([\-\d.]+)\s+([\-\d.]+)(?:\s*\/\s*([\d.]+))?/);
115
+ if (m) return { kind: 'oklab', L: +m[1], a: +m[2], b: +m[3], alpha: m[4] != null ? +m[4] : 1 };
116
+ m = s.match(/oklch\(\s*([\-\d.]+)\s+([\-\d.]+)\s+([\-\d.]+)(?:\s*\/\s*([\d.]+))?/);
117
+ if (m) return { kind: 'oklch', L: +m[1], C: +m[2], h: +m[3], alpha: m[4] != null ? +m[4] : 1 };
118
+ return null;
119
+ }
120
+
121
+ // "More saturated against the canvas" = either chroma/hue distance
122
+ // from gray grew OR alpha grew (Tailwind /10 → /15 deepens by alpha).
123
+ const moreSaturated = (idle, hov) => {
124
+ if (!idle || !hov) return false;
125
+ if (idle.kind === 'rgb' && hov.kind === 'rgb') {
126
+ const chromaIdle = Math.max(idle.r, idle.g, idle.b) - Math.min(idle.r, idle.g, idle.b);
127
+ const chromaHov = Math.max(hov.r, hov.g, hov.b) - Math.min(hov.r, hov.g, hov.b);
128
+ return chromaHov > chromaIdle || hov.a > idle.a + 0.01;
129
+ }
130
+ if (idle.kind === 'oklab' && hov.kind === 'oklab') {
131
+ const dIdle = Math.hypot(idle.a, idle.b);
132
+ const dHov = Math.hypot(hov.a, hov.b);
133
+ return dHov > dIdle + 0.005 || hov.alpha > idle.alpha + 0.01;
134
+ }
135
+ if (idle.kind === 'oklch' && hov.kind === 'oklch') {
136
+ return hov.C > idle.C + 0.005 || hov.alpha > idle.alpha + 0.01;
137
+ }
138
+ return false;
139
+ };
140
+
141
+ const idleWorkingC = parseColor(idleWorking?.bg);
142
+ const hoverWorkingC = parseColor(hoverWorking?.bg);
143
+ const idleOnlineC = parseColor(idleOnline?.bg);
144
+ const hoverOnlineC = parseColor(hoverOnline?.bg);
145
+
146
+ const results = {
147
+ working_clickable: idleWorking?.clickable === 'true',
148
+ working_className_has_hover: idleWorking?.className.includes('hover:bg-green-500/15')
149
+ && idleWorking?.className.includes('hover:border-green-500/30'),
150
+ working_transition_includes_bg: /background-color\s+(?:200ms|0\.2s)/.test(idleWorking?.transition || ''),
151
+ working_transition_includes_border: /border-color\s+(?:200ms|0\.2s)/.test(idleWorking?.transition || ''),
152
+ working_transition_keeps_boxshadow: /box-shadow\s+(?:150ms|0\.15s)/.test(idleWorking?.transition || ''),
153
+ working_hover_bg_changed: idleWorking?.bg !== hoverWorking?.bg,
154
+ working_hover_more_saturated: moreSaturated(idleWorkingC, hoverWorkingC),
155
+ working_settles_back: settledWorking?.bg === idleWorking?.bg,
156
+ // R55 canvas-effect still fires from the chip — hovering the
157
+ // working chip lifts the legend working row.
158
+ working_canvas_effect_fires: workingRowLifted === 'true',
159
+
160
+ online_clickable: idleOnline?.clickable === 'true',
161
+ online_className_has_hover: idleOnline?.className.includes('hover:bg-cyan-500/15')
162
+ && idleOnline?.className.includes('hover:border-cyan-500/30'),
163
+ online_transition_includes_bg: /background-color\s+(?:200ms|0\.2s)/.test(idleOnline?.transition || ''),
164
+ online_transition_includes_border: /border-color\s+(?:200ms|0\.2s)/.test(idleOnline?.transition || ''),
165
+ online_hover_bg_changed: idleOnline?.bg !== hoverOnline?.bg,
166
+ online_hover_more_saturated: moreSaturated(idleOnlineC, hoverOnlineC),
167
+ online_settles_back: settledOnline?.bg === idleOnline?.bg,
168
+ };
169
+ const ok = Object.values(results).every(Boolean);
170
+ console.log(`${ok ? '✅' : '❌'} status-bar chips self-hover:`, JSON.stringify(results),
171
+ `\n idleWorking:`, idleWorking,
172
+ `\n hoverWorking:`, hoverWorking,
173
+ `\n settledWorking:`, settledWorking,
174
+ `\n idleOnline:`, idleOnline,
175
+ `\n hoverOnline:`, hoverOnline,
176
+ `\n settledOnline:`, settledOnline);
177
+ process.exit(ok ? 0 : 1);