@sleep2agi/agent-network-dashboard 0.5.1-preview.1 → 0.5.1-preview.11

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 (151) 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 +6 -6
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/settings/networks.html +1 -1
  86. package/.next/server/app/settings/networks.rsc +1 -1
  87. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  94. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/.next/server/app/settings/tokens.html +1 -1
  96. package/.next/server/app/settings/tokens.rsc +1 -1
  97. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  104. package/.next/server/app/settings.html +2 -2
  105. package/.next/server/app/settings.rsc +2 -2
  106. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  111. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/tasks.html +1 -1
  113. package/.next/server/app/tasks.rsc +1 -1
  114. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  120. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  122. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  126. package/.next/server/middleware-build-manifest.js +3 -3
  127. package/.next/server/pages/404.html +1 -1
  128. package/.next/server/pages/500.html +1 -1
  129. package/.next/static/chunks/0qtk58rfhepeo.js +1 -0
  130. package/.next/static/chunks/0s2jh27ig6a.q.js +4 -0
  131. package/.next/static/chunks/17q6k~a.gl31q.js +1 -0
  132. package/.next/trace +2 -2
  133. package/.next/trace-build +1 -1
  134. package/app/components/TopoGraph.tsx +171 -16
  135. package/package.json +1 -1
  136. package/scripts/topo-active-links-freshness-color-test.mjs +86 -0
  137. package/scripts/topo-filter-pill-weight-test.mjs +75 -0
  138. package/scripts/topo-minimap-viewport-hover-test.mjs +109 -0
  139. package/scripts/topo-more-flows-hover-letterspacing-test.mjs +98 -0
  140. package/scripts/topo-panel-count-letterspacing-test.mjs +89 -0
  141. package/scripts/topo-panel-rect-opacity-hover-test.mjs +109 -0
  142. package/scripts/topo-panel-title-hover-letterspacing-test.mjs +97 -0
  143. package/scripts/topo-pin-intersection-unit-test.mjs +100 -0
  144. package/scripts/topo-reset-hover-rotate-test.mjs +102 -0
  145. package/scripts/topo-zoom-level-hover-letterspacing-test.mjs +91 -0
  146. package/.next/static/chunks/0wratil0li9xw.js +0 -4
  147. package/.next/static/chunks/10paf4uz-_0g1.js +0 -1
  148. package/.next/static/chunks/12wcm9omjb_x6.js +0 -1
  149. /package/.next/static/{4t8OH-lNFieRsHEC2eZfD → Ac38WRM1JjpuTYJKsfcUB}/_buildManifest.js +0 -0
  150. /package/.next/static/{4t8OH-lNFieRsHEC2eZfD → Ac38WRM1JjpuTYJKsfcUB}/_clientMiddlewareManifest.js +0 -0
  151. /package/.next/static/{4t8OH-lNFieRsHEC2eZfD → Ac38WRM1JjpuTYJKsfcUB}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":312,"timestamp":129752449608,"id":4,"parentId":1,"tags":{},"startTime":1778937724696,"traceId":"3806f387c4204f42"},{"name":"load-custom-routes","duration":497,"timestamp":129752450102,"id":5,"parentId":1,"tags":{},"startTime":1778937724696,"traceId":"3806f387c4204f42"},{"name":"create-dist-dir","duration":904,"timestamp":129752450643,"id":6,"parentId":1,"tags":{},"startTime":1778937724697,"traceId":"3806f387c4204f42"},{"name":"clean","duration":37998,"timestamp":129752452491,"id":7,"parentId":1,"tags":{},"startTime":1778937724699,"traceId":"3806f387c4204f42"},{"name":"discover-routes","duration":11195,"timestamp":129752573544,"id":8,"parentId":1,"tags":{},"startTime":1778937724820,"traceId":"3806f387c4204f42"},{"name":"create-root-mapping","duration":131,"timestamp":129752584804,"id":9,"parentId":1,"tags":{},"startTime":1778937724831,"traceId":"3806f387c4204f42"},{"name":"generate-route-types","duration":34172,"timestamp":129752588153,"id":10,"parentId":1,"tags":{},"startTime":1778937724834,"traceId":"3806f387c4204f42"},{"name":"public-dir-conflict-check","duration":101,"timestamp":129752622421,"id":11,"parentId":1,"tags":{},"startTime":1778937724869,"traceId":"3806f387c4204f42"},{"name":"generate-routes-manifest","duration":5399,"timestamp":129752622657,"id":12,"parentId":1,"tags":{},"startTime":1778937724869,"traceId":"3806f387c4204f42"},{"name":"run-turbopack","duration":5717587,"timestamp":129752633304,"id":14,"parentId":1,"tags":{},"startTime":1778937724880,"traceId":"3806f387c4204f42"},{"name":"turbopack-build-events","duration":104,"timestamp":129752922101,"id":15,"parentId":1,"tags":{},"startTime":1778937725168,"traceId":"3806f387c4204f42"},{"name":"run-typescript","duration":9168792,"timestamp":129758358900,"id":16,"parentId":1,"tags":{},"startTime":1778937730605,"traceId":"3806f387c4204f42"},{"name":"generate-required-server-files","duration":1958,"timestamp":129767528584,"id":18,"parentId":1,"tags":{},"startTime":1778937739775,"traceId":"3806f387c4204f42"},{"name":"check-static-error-page","duration":15254,"timestamp":129767692356,"id":20,"parentId":19,"tags":{},"startTime":1778937739939,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":458887,"timestamp":129767711265,"id":65,"parentId":22,"tags":{},"startTime":1778937739958,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":474595,"timestamp":129767695733,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778937739942,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":555410,"timestamp":129767711556,"id":67,"parentId":26,"tags":{},"startTime":1778937739958,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":567922,"timestamp":129767699140,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778937739945,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":571069,"timestamp":129767719285,"id":72,"parentId":32,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":590396,"timestamp":129767700038,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":589993,"timestamp":129767711430,"id":66,"parentId":25,"tags":{},"startTime":1778937739958,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":602562,"timestamp":129767698929,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778937739945,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":584468,"timestamp":129767719472,"id":73,"parentId":33,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":603854,"timestamp":129767700167,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":589968,"timestamp":129767719595,"id":75,"parentId":35,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":609231,"timestamp":129767700391,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778937739947,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":596402,"timestamp":129767719613,"id":76,"parentId":36,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":615173,"timestamp":129767700900,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778937739947,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":596672,"timestamp":129767719563,"id":74,"parentId":34,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":615989,"timestamp":129767700274,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778937739947,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":597202,"timestamp":129767719202,"id":71,"parentId":30,"tags":{},"startTime":1778937739965,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":616779,"timestamp":129767699661,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":602243,"timestamp":129767719636,"id":77,"parentId":37,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":620826,"timestamp":129767701129,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778937739947,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":605142,"timestamp":129767719668,"id":80,"parentId":40,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":623386,"timestamp":129767701464,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778937739948,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":621835,"timestamp":129767710852,"id":64,"parentId":21,"tags":{},"startTime":1778937739957,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":638602,"timestamp":129767694130,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778937739940,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":613969,"timestamp":129767719649,"id":78,"parentId":38,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":632388,"timestamp":129767701273,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778937739948,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":616723,"timestamp":129767719679,"id":81,"parentId":42,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":634610,"timestamp":129767701851,"id":42,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1778937739948,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":623773,"timestamp":129767719659,"id":79,"parentId":39,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":642102,"timestamp":129767701373,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778937739948,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":623916,"timestamp":129767719699,"id":83,"parentId":45,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":641215,"timestamp":129767702425,"id":45,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778937739949,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":630345,"timestamp":129767719731,"id":86,"parentId":48,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":647380,"timestamp":129767702749,"id":48,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778937739949,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":632916,"timestamp":129767719709,"id":84,"parentId":46,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":650147,"timestamp":129767702535,"id":46,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778937739949,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":636200,"timestamp":129767719741,"id":87,"parentId":49,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":652278,"timestamp":129767703704,"id":49,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778937739950,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":639054,"timestamp":129767719751,"id":88,"parentId":50,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":655026,"timestamp":129767703833,"id":50,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778937739950,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":647339,"timestamp":129767714548,"id":68,"parentId":27,"tags":{},"startTime":1778937739961,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":662659,"timestamp":129767699269,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":642336,"timestamp":129767719762,"id":89,"parentId":51,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":658204,"timestamp":129767703930,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778937739950,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":641875,"timestamp":129767723197,"id":90,"parentId":24,"tags":{},"startTime":1778937739969,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":668856,"timestamp":129767696260,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778937739943,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":639858,"timestamp":129767729708,"id":93,"parentId":43,"tags":{},"startTime":1778937739976,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":667619,"timestamp":129767701988,"id":43,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778937739948,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":658235,"timestamp":129767714712,"id":69,"parentId":28,"tags":{},"startTime":1778937739961,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":673602,"timestamp":129767699387,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":659505,"timestamp":129767725426,"id":91,"parentId":31,"tags":{},"startTime":1778937739972,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":685215,"timestamp":129767699771,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":665433,"timestamp":129767719720,"id":85,"parentId":47,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":682542,"timestamp":129767702647,"id":47,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778937739949,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":670502,"timestamp":129767727412,"id":92,"parentId":41,"tags":{},"startTime":1778937739974,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":696398,"timestamp":129767701572,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1778937739948,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":689226,"timestamp":129767714959,"id":70,"parentId":29,"tags":{},"startTime":1778937739961,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":704727,"timestamp":129767699507,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778937739946,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":703284,"timestamp":129767719689,"id":82,"parentId":44,"tags":{},"startTime":1778937739966,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":720773,"timestamp":129767702295,"id":44,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778937739949,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":696051,"timestamp":129767735290,"id":100,"parentId":58,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":725300,"timestamp":129767706126,"id":58,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778937739952,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":701636,"timestamp":129767735213,"id":94,"parentId":23,"tags":{},"startTime":1778937739981,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":740870,"timestamp":129767696036,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778937739942,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":704102,"timestamp":129767735411,"id":101,"parentId":59,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":733398,"timestamp":129767706343,"id":59,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778937739953,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":709880,"timestamp":129767735427,"id":102,"parentId":61,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":738331,"timestamp":129767707022,"id":61,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778937739953,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":721450,"timestamp":129767735447,"id":104,"parentId":63,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":749643,"timestamp":129767707333,"id":63,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778937739954,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":721940,"timestamp":129767735262,"id":97,"parentId":54,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":752493,"timestamp":129767704748,"id":54,"parentId":19,"tags":{"page":"/messages"},"startTime":1778937739951,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":722138,"timestamp":129767735272,"id":98,"parentId":55,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":752475,"timestamp":129767704973,"id":55,"parentId":19,"tags":{"page":"/node"},"startTime":1778937739951,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":715420,"timestamp":129767746311,"id":105,"parentId":60,"tags":{},"startTime":1778937739993,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":755228,"timestamp":129767706543,"id":60,"parentId":19,"tags":{"page":"/settings"},"startTime":1778937739953,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":704207,"timestamp":129767759411,"id":106,"parentId":57,"tags":{},"startTime":1778937740006,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":758166,"timestamp":129767705488,"id":57,"parentId":19,"tags":{"page":"/"},"startTime":1778937739952,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":736023,"timestamp":129767735437,"id":103,"parentId":62,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":764350,"timestamp":129767707181,"id":62,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778937739953,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":740344,"timestamp":129767735251,"id":96,"parentId":53,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":771067,"timestamp":129767704575,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1778937739951,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":745872,"timestamp":129767735240,"id":95,"parentId":52,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":776785,"timestamp":129767704364,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1778937739951,"traceId":"3806f387c4204f42"},{"name":"is-page-static","duration":751805,"timestamp":129767735281,"id":99,"parentId":56,"tags":{},"startTime":1778937739982,"traceId":"3806f387c4204f42"},{"name":"check-page","duration":781907,"timestamp":129767705210,"id":56,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778937739951,"traceId":"3806f387c4204f42"},{"name":"static-check","duration":795832,"timestamp":129767691325,"id":19,"parentId":1,"tags":{},"startTime":1778937739938,"traceId":"3806f387c4204f42"}]
2
- [{"name":"write-routes-manifest","duration":575,"timestamp":129768497047,"id":108,"parentId":1,"tags":{},"startTime":1778937740743,"traceId":"3806f387c4204f42"},{"name":"load-dotenv","duration":66,"timestamp":129768511661,"id":111,"parentId":110,"tags":{},"startTime":1778937740758,"traceId":"3806f387c4204f42"},{"name":"run-export-path-map","duration":775,"timestamp":129768515095,"id":112,"parentId":110,"tags":{},"startTime":1778937740761,"traceId":"3806f387c4204f42"},{"name":"next-export","duration":599692,"timestamp":129768509783,"id":110,"parentId":1,"tags":{},"startTime":1778937740756,"traceId":"3806f387c4204f42"},{"name":"move-exported-app-not-found-","duration":519,"timestamp":129769113033,"id":113,"parentId":109,"tags":{},"startTime":1778937741359,"traceId":"3806f387c4204f42"},{"name":"move-exported-app-global-error-","duration":457,"timestamp":129769113638,"id":114,"parentId":109,"tags":{},"startTime":1778937741360,"traceId":"3806f387c4204f42"},{"name":"static-generation","duration":614412,"timestamp":129768502056,"id":109,"parentId":1,"tags":{},"startTime":1778937740748,"traceId":"3806f387c4204f42"},{"name":"write-routes-manifest","duration":436,"timestamp":129769116715,"id":115,"parentId":1,"tags":{},"startTime":1778937741363,"traceId":"3806f387c4204f42"},{"name":"print-tree-view","duration":3656,"timestamp":129769135493,"id":116,"parentId":1,"tags":{},"startTime":1778937741382,"traceId":"3806f387c4204f42"},{"name":"write-route-bundle-stats","duration":13860,"timestamp":129769139174,"id":117,"parentId":1,"tags":{},"startTime":1778937741385,"traceId":"3806f387c4204f42"},{"name":"telemetry-flush","duration":23929,"timestamp":129769153065,"id":118,"parentId":1,"tags":{},"startTime":1778937741399,"traceId":"3806f387c4204f42"},{"name":"next-build","duration":16786949,"timestamp":129752390110,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778937724636,"traceId":"3806f387c4204f42"}]
1
+ [{"name":"generate-buildid","duration":325,"timestamp":133060553020,"id":4,"parentId":1,"tags":{},"startTime":1778941032799,"traceId":"aed8c4a27ab998ac"},{"name":"load-custom-routes","duration":484,"timestamp":133060553500,"id":5,"parentId":1,"tags":{},"startTime":1778941032800,"traceId":"aed8c4a27ab998ac"},{"name":"create-dist-dir","duration":756,"timestamp":133060554061,"id":6,"parentId":1,"tags":{},"startTime":1778941032800,"traceId":"aed8c4a27ab998ac"},{"name":"clean","duration":35106,"timestamp":133060555556,"id":7,"parentId":1,"tags":{},"startTime":1778941032802,"traceId":"aed8c4a27ab998ac"},{"name":"discover-routes","duration":11398,"timestamp":133060672248,"id":8,"parentId":1,"tags":{},"startTime":1778941032919,"traceId":"aed8c4a27ab998ac"},{"name":"create-root-mapping","duration":130,"timestamp":133060683704,"id":9,"parentId":1,"tags":{},"startTime":1778941032930,"traceId":"aed8c4a27ab998ac"},{"name":"generate-route-types","duration":37301,"timestamp":133060686485,"id":10,"parentId":1,"tags":{},"startTime":1778941032933,"traceId":"aed8c4a27ab998ac"},{"name":"public-dir-conflict-check","duration":103,"timestamp":133060723875,"id":11,"parentId":1,"tags":{},"startTime":1778941032970,"traceId":"aed8c4a27ab998ac"},{"name":"generate-routes-manifest","duration":5086,"timestamp":133060724135,"id":12,"parentId":1,"tags":{},"startTime":1778941032970,"traceId":"aed8c4a27ab998ac"},{"name":"run-turbopack","duration":5900025,"timestamp":133060735450,"id":14,"parentId":1,"tags":{},"startTime":1778941032982,"traceId":"aed8c4a27ab998ac"},{"name":"turbopack-build-events","duration":73,"timestamp":133061016652,"id":15,"parentId":1,"tags":{},"startTime":1778941033263,"traceId":"aed8c4a27ab998ac"},{"name":"run-typescript","duration":9138305,"timestamp":133066644397,"id":16,"parentId":1,"tags":{},"startTime":1778941038891,"traceId":"aed8c4a27ab998ac"},{"name":"generate-required-server-files","duration":3081,"timestamp":133075784149,"id":18,"parentId":1,"tags":{},"startTime":1778941048030,"traceId":"aed8c4a27ab998ac"},{"name":"check-static-error-page","duration":18839,"timestamp":133075942150,"id":20,"parentId":19,"tags":{},"startTime":1778941048188,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":399280,"timestamp":133075965883,"id":65,"parentId":22,"tags":{},"startTime":1778941048212,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":419716,"timestamp":133075945612,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778941048192,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":539395,"timestamp":133075966910,"id":71,"parentId":30,"tags":{},"startTime":1778941048213,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":555421,"timestamp":133075951018,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778941048197,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":543601,"timestamp":133075966978,"id":72,"parentId":32,"tags":{},"startTime":1778941048213,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":558598,"timestamp":133075952059,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778941048198,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":550863,"timestamp":133075967188,"id":73,"parentId":33,"tags":{},"startTime":1778941048213,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":565767,"timestamp":133075952381,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778941048199,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":552767,"timestamp":133075967275,"id":74,"parentId":34,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":567572,"timestamp":133075952540,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778941048199,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":557505,"timestamp":133075967309,"id":75,"parentId":35,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":572173,"timestamp":133075952689,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778941048199,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":559054,"timestamp":133075966201,"id":67,"parentId":26,"tags":{},"startTime":1778941048212,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":575195,"timestamp":133075950110,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778941048196,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":562065,"timestamp":133075967332,"id":76,"parentId":36,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":576177,"timestamp":133075953264,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778941048200,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":568734,"timestamp":133075967382,"id":78,"parentId":38,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":582554,"timestamp":133075953622,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778941048200,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":572710,"timestamp":133075967399,"id":79,"parentId":39,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":586428,"timestamp":133075953726,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778941048200,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":581672,"timestamp":133075967415,"id":80,"parentId":40,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":595306,"timestamp":133075953832,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778941048200,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":584145,"timestamp":133075966322,"id":68,"parentId":27,"tags":{},"startTime":1778941048213,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":600141,"timestamp":133075950378,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778941048197,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":587206,"timestamp":133075966437,"id":69,"parentId":28,"tags":{},"startTime":1778941048213,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":603173,"timestamp":133075950523,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778941048197,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":588863,"timestamp":133075967427,"id":81,"parentId":42,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":602111,"timestamp":133075954242,"id":42,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1778941048201,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":592754,"timestamp":133075965427,"id":64,"parentId":21,"tags":{},"startTime":1778941048212,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":614330,"timestamp":133075943891,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778941048190,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":590915,"timestamp":133075967442,"id":82,"parentId":44,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":603693,"timestamp":133075954695,"id":44,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778941048201,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":591263,"timestamp":133075967362,"id":77,"parentId":37,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":605199,"timestamp":133075953471,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778941048200,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":596766,"timestamp":133075967469,"id":84,"parentId":46,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":609338,"timestamp":133075954945,"id":46,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778941048201,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":596944,"timestamp":133075967520,"id":87,"parentId":49,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":607445,"timestamp":133075957057,"id":49,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778941048203,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":598600,"timestamp":133075966058,"id":66,"parentId":25,"tags":{},"startTime":1778941048212,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":614791,"timestamp":133075949904,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778941048196,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":599913,"timestamp":133075966745,"id":70,"parentId":29,"tags":{},"startTime":1778941048213,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":615970,"timestamp":133075950727,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778941048197,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":600110,"timestamp":133075967457,"id":83,"parentId":45,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":612774,"timestamp":133075954833,"id":45,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778941048201,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":604716,"timestamp":133075967547,"id":89,"parentId":51,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":615015,"timestamp":133075957306,"id":51,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778941048204,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":604967,"timestamp":133075967532,"id":88,"parentId":50,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":615330,"timestamp":133075957201,"id":50,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778941048203,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":598233,"timestamp":133075975697,"id":93,"parentId":43,"tags":{},"startTime":1778941048222,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":619571,"timestamp":133075954399,"id":43,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778941048201,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":611740,"timestamp":133075974340,"id":92,"parentId":41,"tags":{},"startTime":1778941048221,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":632198,"timestamp":133075953929,"id":41,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1778941048200,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":632074,"timestamp":133075972372,"id":90,"parentId":24,"tags":{},"startTime":1778941048219,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":658358,"timestamp":133075946351,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778941048193,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":644395,"timestamp":133075967505,"id":86,"parentId":48,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":655078,"timestamp":133075956877,"id":48,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778941048203,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":642730,"timestamp":133075973410,"id":91,"parentId":31,"tags":{},"startTime":1778941048220,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":664795,"timestamp":133075951394,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778941048198,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":668327,"timestamp":133075978212,"id":95,"parentId":52,"tags":{},"startTime":1778941048224,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":688906,"timestamp":133075957710,"id":52,"parentId":19,"tags":{"page":"/login"},"startTime":1778941048204,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":679009,"timestamp":133075978275,"id":100,"parentId":58,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":697857,"timestamp":133075959499,"id":58,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778941048206,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":692491,"timestamp":133075967490,"id":85,"parentId":47,"tags":{},"startTime":1778941048214,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":704960,"timestamp":133075955099,"id":47,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778941048201,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":682879,"timestamp":133075978222,"id":96,"parentId":53,"tags":{},"startTime":1778941048224,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":703253,"timestamp":133075957917,"id":53,"parentId":19,"tags":{"page":"/logs"},"startTime":1778941048204,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":687776,"timestamp":133075978389,"id":101,"parentId":59,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":706485,"timestamp":133075959729,"id":59,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778941048206,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":692050,"timestamp":133075978410,"id":102,"parentId":61,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":710092,"timestamp":133075960413,"id":61,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778941048207,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":695858,"timestamp":133075978183,"id":94,"parentId":23,"tags":{},"startTime":1778941048224,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":728169,"timestamp":133075945926,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778941048192,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":696532,"timestamp":133075978418,"id":103,"parentId":62,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":714412,"timestamp":133075960579,"id":62,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778941048207,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":697218,"timestamp":133075978431,"id":104,"parentId":63,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":714959,"timestamp":133075960732,"id":63,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778941048207,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":697734,"timestamp":133075978238,"id":97,"parentId":54,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":717915,"timestamp":133075958114,"id":54,"parentId":19,"tags":{"page":"/messages"},"startTime":1778941048204,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":694219,"timestamp":133075986244,"id":105,"parentId":60,"tags":{},"startTime":1778941048233,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":720586,"timestamp":133075959924,"id":60,"parentId":19,"tags":{"page":"/settings"},"startTime":1778941048206,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":672077,"timestamp":133076011609,"id":106,"parentId":57,"tags":{},"startTime":1778941048258,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":724942,"timestamp":133075958785,"id":57,"parentId":19,"tags":{"page":"/"},"startTime":1778941048205,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":710939,"timestamp":133075978251,"id":98,"parentId":55,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":730899,"timestamp":133075958328,"id":55,"parentId":19,"tags":{"page":"/node"},"startTime":1778941048205,"traceId":"aed8c4a27ab998ac"},{"name":"is-page-static","duration":711326,"timestamp":133075978265,"id":99,"parentId":56,"tags":{},"startTime":1778941048225,"traceId":"aed8c4a27ab998ac"},{"name":"check-page","duration":731098,"timestamp":133075958537,"id":56,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778941048205,"traceId":"aed8c4a27ab998ac"},{"name":"static-check","duration":748740,"timestamp":133075940945,"id":19,"parentId":1,"tags":{},"startTime":1778941048187,"traceId":"aed8c4a27ab998ac"}]
2
+ [{"name":"write-routes-manifest","duration":505,"timestamp":133076701530,"id":108,"parentId":1,"tags":{},"startTime":1778941048948,"traceId":"aed8c4a27ab998ac"},{"name":"load-dotenv","duration":50,"timestamp":133076712582,"id":111,"parentId":110,"tags":{},"startTime":1778941048959,"traceId":"aed8c4a27ab998ac"},{"name":"run-export-path-map","duration":759,"timestamp":133076715323,"id":112,"parentId":110,"tags":{},"startTime":1778941048962,"traceId":"aed8c4a27ab998ac"},{"name":"next-export","duration":633563,"timestamp":133076711395,"id":110,"parentId":1,"tags":{},"startTime":1778941048958,"traceId":"aed8c4a27ab998ac"},{"name":"move-exported-app-not-found-","duration":573,"timestamp":133077347915,"id":113,"parentId":109,"tags":{},"startTime":1778941049594,"traceId":"aed8c4a27ab998ac"},{"name":"move-exported-app-global-error-","duration":402,"timestamp":133077348584,"id":114,"parentId":109,"tags":{},"startTime":1778941049595,"traceId":"aed8c4a27ab998ac"},{"name":"static-generation","duration":645230,"timestamp":133076705701,"id":109,"parentId":1,"tags":{},"startTime":1778941048952,"traceId":"aed8c4a27ab998ac"},{"name":"write-routes-manifest","duration":379,"timestamp":133077351219,"id":115,"parentId":1,"tags":{},"startTime":1778941049597,"traceId":"aed8c4a27ab998ac"},{"name":"print-tree-view","duration":4210,"timestamp":133077364219,"id":116,"parentId":1,"tags":{},"startTime":1778941049610,"traceId":"aed8c4a27ab998ac"},{"name":"write-route-bundle-stats","duration":13105,"timestamp":133077368460,"id":117,"parentId":1,"tags":{},"startTime":1778941049615,"traceId":"aed8c4a27ab998ac"},{"name":"telemetry-flush","duration":60171,"timestamp":133077381595,"id":118,"parentId":1,"tags":{},"startTime":1778941049628,"traceId":"aed8c4a27ab998ac"},{"name":"next-build","duration":16949182,"timestamp":133060492619,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778941032739,"traceId":"aed8c4a27ab998ac"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5717587,"timestamp":129752633304,"id":14,"parentId":1,"tags":{},"startTime":1778937724880,"traceId":"3806f387c4204f42"},{"name":"turbopack-build-events","duration":104,"timestamp":129752922101,"id":15,"parentId":1,"tags":{},"startTime":1778937725168,"traceId":"3806f387c4204f42"},{"name":"run-typescript","duration":9168792,"timestamp":129758358900,"id":16,"parentId":1,"tags":{},"startTime":1778937730605,"traceId":"3806f387c4204f42"},{"name":"static-check","duration":795832,"timestamp":129767691325,"id":19,"parentId":1,"tags":{},"startTime":1778937739938,"traceId":"3806f387c4204f42"},{"name":"static-generation","duration":614412,"timestamp":129768502056,"id":109,"parentId":1,"tags":{},"startTime":1778937740748,"traceId":"3806f387c4204f42"},{"name":"telemetry-flush","duration":23929,"timestamp":129769153065,"id":118,"parentId":1,"tags":{},"startTime":1778937741399,"traceId":"3806f387c4204f42"},{"name":"next-build","duration":16786949,"timestamp":129752390110,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778937724636,"traceId":"3806f387c4204f42"}]
1
+ [{"name":"run-turbopack","duration":5900025,"timestamp":133060735450,"id":14,"parentId":1,"tags":{},"startTime":1778941032982,"traceId":"aed8c4a27ab998ac"},{"name":"turbopack-build-events","duration":73,"timestamp":133061016652,"id":15,"parentId":1,"tags":{},"startTime":1778941033263,"traceId":"aed8c4a27ab998ac"},{"name":"run-typescript","duration":9138305,"timestamp":133066644397,"id":16,"parentId":1,"tags":{},"startTime":1778941038891,"traceId":"aed8c4a27ab998ac"},{"name":"static-check","duration":748740,"timestamp":133075940945,"id":19,"parentId":1,"tags":{},"startTime":1778941048187,"traceId":"aed8c4a27ab998ac"},{"name":"static-generation","duration":645230,"timestamp":133076705701,"id":109,"parentId":1,"tags":{},"startTime":1778941048952,"traceId":"aed8c4a27ab998ac"},{"name":"telemetry-flush","duration":60171,"timestamp":133077381595,"id":118,"parentId":1,"tags":{},"startTime":1778941049628,"traceId":"aed8c4a27ab998ac"},{"name":"next-build","duration":16949182,"timestamp":133060492619,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778941032739,"traceId":"aed8c4a27ab998ac"}]
@@ -1026,6 +1026,42 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1026
1026
  // navigation footer. Drives the on-hover opacity boost + underline
1027
1027
  // that signals interactivity, mirroring the hoveredHub idiom above.
1028
1028
  const [hoveredRecentMore, setHoveredRecentMore] = useState(false);
1029
+ // Round 346 / Loop: minimap-container hover affordance. The minimap
1030
+ // is a click-target (role=button at line ~7810, recenter-on-click +
1031
+ // Enter→resetView) but pre-R346 nothing visually changed on hover —
1032
+ // the only hint was the `cursor: crosshair` style. R346 lifts the
1033
+ // viewport rect (strokeWidth 1.5 → 1.75 + opacity 0.9 → 1.0) when
1034
+ // the user enters the minimap, marking "this is the recenter target
1035
+ // and it's alive". Sibling polish to the R332 minimap rounded-md →
1036
+ // rounded-lg corner family — that round refined geometry, this one
1037
+ // gives the viewport indicator inside the geometry a hover state.
1038
+ // 280ms ease-out transition list matches R199 smoothView vocabulary
1039
+ // so the visual joins the existing rhythm on the same rect.
1040
+ const [hoveredMinimap, setHoveredMinimap] = useState(false);
1041
+ // Round 347 / Loop: zoom-level readout hover-state letter-spacing
1042
+ // tween (0 → 0.5 px). The readout sandwiched between zoom-out /
1043
+ // zoom-in is a passive percent display — pre-R347 it had no hover
1044
+ // feedback at all (only a `title` tooltip). R347 extends the R344
1045
+ // (`+N more flows` footer) + R345 (panel titles) hover-letter-
1046
+ // spacing family from panel/footer surfaces into the HTML chrome
1047
+ // strip. Hovering the readout spreads its digits 0.5 px, signalling
1048
+ // "this is alive". tabular-nums + minWidth: 46 from R225 still lock
1049
+ // the column so the tween doesn't shove neighbouring controls.
1050
+ // 200ms ease-out joins the existing R264 color/border transition
1051
+ // list on the same span.
1052
+ const [hoveredZoomLevel, setHoveredZoomLevel] = useState(false);
1053
+ // Round 350 / Loop: reset-button icon hover-rotate preview of the
1054
+ // R184 click-spin. Pre-R350 hovering the reset button only changed
1055
+ // the button bg (white/5); the icon inside stayed perfectly still.
1056
+ // R350 nudges the icon -8° on hover — a tactile hint that this
1057
+ // button rotates the icon on click. When the click fires, the
1058
+ // R184 anet-reset-spin keyframe animation overrides the hover
1059
+ // transform for its 450 ms run (CSS animations win over transitions
1060
+ // on the same property); when the animation ends + React removes
1061
+ // the className, the inline transform eases back to whatever the
1062
+ // hover state says — either -8° (still hovering) or 0 (mouse left).
1063
+ // 350th-round milestone polish.
1064
+ const [hoveredReset, setHoveredReset] = useState(false);
1029
1065
  // R135: panel-wide hover-elevation. The recent-signal + legend
1030
1066
  // panels both already host clickable rows (R56/R116 recent rows,
1031
1067
  // R55/R61 legend rows) and a clickable footer (R133), so the
@@ -2259,7 +2295,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2259
2295
  data-active-filter="status"
2260
2296
  data-filter-match-count={matchCount}
2261
2297
  data-filter-match-aliases={matchAliases.join(',')}
2262
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in anet-topo-chip-focus"
2298
+ className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono font-medium text-xs border anet-fade-in anet-topo-chip-focus"
2263
2299
  title={matchCount > 0 ? `${matchPreview}${matchSuffix} — click to clear` : 'Click to clear filter'}
2264
2300
  onClick={() => setPinnedStatus(null)}
2265
2301
  style={{
@@ -2297,7 +2333,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2297
2333
  data-active-filter="group"
2298
2334
  data-filter-match-count={matchCount}
2299
2335
  data-filter-match-aliases={matchAliases.join(',')}
2300
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in anet-topo-chip-focus"
2336
+ className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono font-medium text-xs border anet-fade-in anet-topo-chip-focus"
2301
2337
  title={matchCount > 0 ? `${matchPreview}${matchSuffix} — click to clear` : 'Click to clear filter'}
2302
2338
  onClick={() => setPinnedGroup(null)}
2303
2339
  style={{
@@ -2347,7 +2383,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2347
2383
  data-active-filter="vendor"
2348
2384
  data-filter-match-count={matchCount}
2349
2385
  data-filter-match-aliases={matchAliases.join(',')}
2350
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in anet-topo-chip-focus"
2386
+ className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono font-medium text-xs border anet-fade-in anet-topo-chip-focus"
2351
2387
  title={matchCount > 0 ? `${matchPreview}${matchSuffix} — click to clear` : 'Click to clear vendor filter'}
2352
2388
  onClick={() => setPinnedVendor(null)}
2353
2389
  style={{
@@ -2395,7 +2431,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2395
2431
  data-filter-match-count={link.count}
2396
2432
  data-filter-match-aliases={`${link.from},${link.to}`}
2397
2433
  data-active-filter-edge-hot={isHot ? 'true' : 'false'}
2398
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in anet-topo-chip-focus"
2434
+ className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono font-medium text-xs border anet-fade-in anet-topo-chip-focus"
2399
2435
  title={`${link.from} → ${link.to} (${link.count} msg${link.count === 1 ? '' : 's'}${isHot ? ', hot lane · ≥ 10' : ''}) — click to clear`}
2400
2436
  onClick={() => setPinnedEdgeKey(null)}
2401
2437
  style={{
@@ -2586,7 +2622,22 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2586
2622
  R150 pin-pill family parity now complete with
2587
2623
  this composed-pin sibling). data-pin-intersection-
2588
2624
  count-* attrs expose both spans for tests. */}
2589
- <span className="tabular-nums" data-pin-intersection-count-dims>{pinDimCount}</span> pins<span className="opacity-70 tabular-nums" data-pin-intersection-count-matches> · {matchAliases.length}</span>
2625
+ {/* Round 341 / Loop: middle " pins" unit word
2626
+ previously sat as a bare text node between the
2627
+ two count spans, while the matches-count span
2628
+ already carried opacity-0.7 (R335 + R324 era).
2629
+ The pinDimCount span is prominent and the
2630
+ matches count is recessive — but the literal
2631
+ " pins" was at FULL opacity, breaking the
2632
+ chip-internal hierarchy unified across R333/
2633
+ R335/R336/R337/R338/R340. R341 wraps " pins"
2634
+ in an opacity-0.7 span so the chip reads:
2635
+ pinDimCount (prominent value)
2636
+ " pins" (recessive unit)
2637
+ " · {N}" (recessive count)
2638
+ Three-tier hierarchy on a single chip; 7th
2639
+ surface in the chip-internal-hierarchy arc. */}
2640
+ <span className="tabular-nums" data-pin-intersection-count-dims>{pinDimCount}</span><span className="opacity-70" data-pin-intersection-unit> pins</span><span className="opacity-70 tabular-nums" data-pin-intersection-count-matches> · {matchAliases.length}</span>
2590
2641
  {/* Round 237 / Loop: ⚠ warning glyph picks up the
2591
2642
  always-mount-opacity-gate idiom. Pre-R237 the
2592
2643
  glyph was conditionally rendered on isEmpty,
@@ -2900,8 +2951,19 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2900
2951
  const dotColor = isLight
2901
2952
  ? `rgba(13, 148, 136, ${alpha.toFixed(2)})`
2902
2953
  : `rgba(34, 211, 238, ${alpha.toFixed(2)})`;
2954
+ // Round 342 / Loop: active-links chip freshness suffix
2955
+ // wrapper text-gray-500 → text-gray-400 (R317
2956
+ // subordinate-text-lift family applied to chrome
2957
+ // inactive Layout toggle + R333 vendor count suffix).
2958
+ // The "last 5s ago" suffix is chip-subordinate
2959
+ // metadata; gray-500 sat near-invisible against the
2960
+ // chip's outer color, gray-400 lifts it into the band
2961
+ // where the eye reads it as deliberate freshness
2962
+ // annotation. The freshness DOT keeps its own inline
2963
+ // color: dotColor — the lift only affects the trailing
2964
+ // literal "last {rel}" text.
2903
2965
  return (
2904
- <span className="text-gray-500">
2966
+ <span className="text-gray-400">
2905
2967
  <span
2906
2968
  data-active-links-freshness-dot
2907
2969
  data-active-links-freshness-alpha={alpha.toFixed(2)}
@@ -6198,7 +6260,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6198
6260
  x="0" y="0" width="230" height="88" rx="10"
6199
6261
  fill={pal.legendBox.fill}
6200
6262
  stroke={pal.legendBox.stroke}
6201
- opacity={isLight ? 0.97 : 0.92}
6263
+ // Round 348 / Loop: recent-signal panel rect opacity hover-
6264
+ // state bump — joins the panel-hover cue stack (R135 drop-
6265
+ // shadow boost + R345 title letter-spacing tween 0.3 → 0.4
6266
+ // + R266 fill theme-flip). Cyber 0.92 → 0.97, light 0.97 →
6267
+ // 1.0 on hoveredPanel === 'recent'. The panel "solidifies"
6268
+ // on hover — pure paint-level change, geometry-safe (bbox
6269
+ // unchanged so topo-overlap-test invariants hold). The
6270
+ // R247 transition list already includes `opacity 200ms
6271
+ // ease-out` so the value tween is automatic. Sibling
6272
+ // change at legend panel rect below (~line 7222).
6273
+ opacity={hoveredPanel === 'recent' ? (isLight ? 1 : 0.97) : (isLight ? 0.97 : 0.92)}
6202
6274
  style={{
6203
6275
  /* R135: drop-shadow intensifies on panel hover. Base
6204
6276
  shadow (2px / 6px blur) signals card elevation
@@ -6250,7 +6322,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6250
6322
  title (line ~6556) — both panels share the same
6251
6323
  editorial-text-spacing convention. data-recent-panel-
6252
6324
  title handle unchanged so R266 test still resolves. */}
6253
- <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700" letterSpacing="0.3" style={{ transition: 'fill 200ms ease-out' }} data-recent-panel-title>recent signal</text>
6325
+ {/* Round 345 / Loop: recent-signal panel title gains
6326
+ letter-spacing tween 0.3 → 0.4 on panel hover.
6327
+ hoveredPanel === 'recent' is set by the panel <g>
6328
+ wrapper's onMouseEnter (line ~6263 area). Sibling to
6329
+ R344 hover-letter-spacing applied to the +N more
6330
+ flows footer — same gesture vocabulary at a panel-
6331
+ title scope: hovering the panel chrome spreads the
6332
+ title 0.1 px, signalling "this is a coherent unit
6333
+ you're entering". transition list extends letter-
6334
+ spacing 200ms ease-out alongside existing fill 200ms. */}
6335
+ <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700" letterSpacing={hoveredPanel === 'recent' ? '0.4' : '0.3'} style={{ transition: 'fill 200ms ease-out, letter-spacing 200ms ease-out' }} data-recent-panel-title>recent signal</text>
6254
6336
  {/* R96: header count now matches what the rows show. Pre-R96
6255
6337
  this read "X msgs" off the raw messages array, but the
6256
6338
  rows below render DEDUPED flowLinks — so a fleet with 10
@@ -6325,6 +6407,21 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
6325
6407
  textAnchor="end"
6326
6408
  fontSize="10"
6327
6409
  fontFamily="monospace"
6410
+ // Round 349 / Loop: editorial letter-spacing 0.2 on the
6411
+ // recent-signal panel header count. Sits one tier below
6412
+ // the R301 panel title letterSpacing="0.3" so the panel
6413
+ // header reads as a 2-step hierarchy (title 0.3 / count
6414
+ // 0.2). Sibling change on the legend panel count below
6415
+ // closes the panel-pair editorial symmetry. Joins the
6416
+ // R285 / R289 / R301 / R302 / R304 / R325 editorial-
6417
+ // letterspacing tier at the panel-summary scope. The
6418
+ // R162 freshness fill, R225 tabular-nums, R311 fw=600,
6419
+ // R336 unit-tspan opacity-0.7 split all preserved —
6420
+ // the tier propagates to all descendant tspans via
6421
+ // SVG inheritance. data-recent-panel-count-letter-
6422
+ // spacing exposes the value for tests.
6423
+ letterSpacing="0.2"
6424
+ data-recent-panel-count-letter-spacing="0.2"
6328
6425
  >
6329
6426
  {/* Round 225 / Loop: tabular-nums on the panel-header
6330
6427
  flow-count tspan. The "{N} flows" string lives in
@@ -7085,6 +7182,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7085
7182
  preserved for the <title> tooltip — only the SVG
7086
7183
  render splits. data-recent-panel-more-unit exposes
7087
7184
  the unit tspan for tests. */}
7185
+ {/* Round 344 / Loop: footer hover gains letter-spacing
7186
+ tween 0.2 → 0.3. R325 set rest letter-spacing
7187
+ 0.2 to join the editorial-spacing family; R344
7188
+ adds a 0.1px hover spread that layers on top of
7189
+ R195 cyan fill + R325 spacing + R133 underline
7190
+ so the footer reads "lit up and spaced" on
7191
+ hover — sibling to R218/R219/R220 pin-signature
7192
+ letter-spacing family applied to a hover-only
7193
+ surface. transition list extends letter-spacing
7194
+ 200ms ease-out alongside the existing opacity/
7195
+ fill easings. */}
7088
7196
  <text
7089
7197
  x="115" y="82"
7090
7198
  textAnchor="middle"
@@ -7092,12 +7200,12 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7092
7200
  fontSize="9"
7093
7201
  fontFamily="monospace"
7094
7202
  fontStyle="italic"
7095
- letterSpacing="0.2"
7203
+ letterSpacing={hoveredRecentMore ? '0.3' : '0.2'}
7096
7204
  opacity={hoveredRecentMore ? 0.85 : 0.55}
7097
7205
  textDecoration={hoveredRecentMore ? 'underline' : 'none'}
7098
7206
  data-recent-panel-more={moreCount}
7099
7207
  data-recent-panel-more-hovered={hoveredRecentMore ? 'true' : 'false'}
7100
- style={{ transition: 'opacity 150ms ease-out, fill 200ms ease-out' }}
7208
+ style={{ transition: 'opacity 150ms ease-out, fill 200ms ease-out, letter-spacing 200ms ease-out' }}
7101
7209
  >
7102
7210
  {`+ ${moreCount}`}
7103
7211
  <tspan opacity="0.7" data-recent-panel-more-unit>{` more flow${moreCount === 1 ? '' : 's'}`}</tspan>
@@ -7149,7 +7257,12 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7149
7257
  x="0" y="0" width="224" height="88" rx="10"
7150
7258
  fill={pal.legendBox.fill}
7151
7259
  stroke={pal.legendBox.stroke}
7152
- opacity={isLight ? 0.97 : 0.92}
7260
+ // R348 sibling — legend panel rect opacity hover-state
7261
+ // bump 0.92 → 0.97 (cyber) / 0.97 → 1 (light) on
7262
+ // hoveredPanel === 'legend'. Pairs with the recent-signal
7263
+ // panel rect above so the two corner panels' hover cues
7264
+ // stay symmetric. Geometry-safe (paint-only).
7265
+ opacity={hoveredPanel === 'legend' ? (isLight ? 1 : 0.97) : (isLight ? 0.97 : 0.92)}
7153
7266
  style={{
7154
7267
  filter: hoveredPanel === 'legend'
7155
7268
  ? (isLight ? 'drop-shadow(0 4px 12px rgba(15,23,42,0.14))'
@@ -7172,7 +7285,9 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7172
7285
  surrounding chrome eased; R266 closes both at once. */}
7173
7286
  {/* R301: sibling to recent-signal panel title above —
7174
7287
  same letterSpacing 0.3 for editorial parity. */}
7175
- <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700" letterSpacing="0.3" style={{ transition: 'fill 200ms ease-out' }} data-legend-panel-title>legend</text>
7288
+ {/* R345 sibling — legend panel title same hover letter-
7289
+ spacing tween 0.3 → 0.4 on panel hover. */}
7290
+ <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700" letterSpacing={hoveredPanel === 'legend' ? '0.4' : '0.3'} style={{ transition: 'fill 200ms ease-out, letter-spacing 200ms ease-out' }} data-legend-panel-title>legend</text>
7176
7291
  {/* Round 257 / Loop: legend panel header count picks up the
7177
7292
  symmetric 13L/13R inner-padding pattern from the recent-
7178
7293
  signal panel. Pre-R257 the legend header was 13px from
@@ -7236,7 +7351,14 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7236
7351
  <text
7237
7352
  x="211" y="21" textAnchor="end"
7238
7353
  fill={pal.legendAccent} fontSize="10" fontFamily="monospace" fontWeight="600"
7354
+ // R349 sibling — legend panel header count picks up
7355
+ // letterSpacing="0.2", one tier below the R301 panel
7356
+ // title 0.3. Pairs with the recent-signal panel count
7357
+ // letter-spacing above so the two corner panels' header
7358
+ // typography stays editorially symmetric.
7359
+ letterSpacing="0.2"
7239
7360
  data-legend-panel-count
7361
+ data-legend-panel-count-letter-spacing="0.2"
7240
7362
  style={{
7241
7363
  transition: 'fill 200ms ease-out',
7242
7364
  fontVariantNumeric: 'tabular-nums',
@@ -7778,7 +7900,13 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7778
7900
  resetView();
7779
7901
  }
7780
7902
  }}
7903
+ // R346: viewport rect hover affordance driven by parent.
7904
+ onMouseEnter={() => setHoveredMinimap(true)}
7905
+ onMouseLeave={() => setHoveredMinimap(false)}
7906
+ onFocus={() => setHoveredMinimap(true)}
7907
+ onBlur={() => setHoveredMinimap(false)}
7781
7908
  data-topo-minimap
7909
+ data-topo-minimap-hovered={hoveredMinimap ? 'true' : 'false'}
7782
7910
  >
7783
7911
  <svg width={MW} height={MH} viewBox={`0 0 ${MW} ${MH}`} style={{ display: 'block' }}>
7784
7912
  {/* Round 198 / Loop: minimap dots gain smooth status
@@ -7857,13 +7985,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
7857
7985
  x={Math.max(0, rectX)} y={Math.max(0, rectY)}
7858
7986
  width={Math.max(0, Math.min(MW - Math.max(0, rectX), rectW))}
7859
7987
  height={Math.max(0, Math.min(MH - Math.max(0, rectY), rectH))}
7860
- fill="none" stroke={pal.legendAccent} strokeWidth="1.5" opacity="0.9"
7988
+ fill="none" stroke={pal.legendAccent}
7989
+ // R346: strokeWidth + opacity tween on container hover.
7990
+ strokeWidth={hoveredMinimap ? '1.75' : '1.5'}
7991
+ opacity={hoveredMinimap ? '1' : '0.9'}
7861
7992
  data-topo-minimap-viewport
7862
7993
  data-topo-minimap-viewport-smooth={smoothView ? 'true' : 'false'}
7994
+ data-topo-minimap-viewport-hover={hoveredMinimap ? 'true' : 'false'}
7863
7995
  style={{
7864
7996
  transition: smoothView
7865
- ? 'x 280ms ease-out, y 280ms ease-out, width 280ms ease-out, height 280ms ease-out'
7866
- : 'none',
7997
+ ? 'x 280ms ease-out, y 280ms ease-out, width 280ms ease-out, height 280ms ease-out, stroke-width 200ms ease-out, opacity 200ms ease-out'
7998
+ : 'stroke-width 200ms ease-out, opacity 200ms ease-out',
7867
7999
  } as React.CSSProperties}
7868
8000
  />
7869
8001
  </svg>
@@ -8074,11 +8206,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
8074
8206
  chromePopping === 'zoom-in' || chromePopping === 'zoom-out'
8075
8207
  ? 'true' : 'false'
8076
8208
  }
8209
+ data-topo-chrome-zoom-level-hover={hoveredZoomLevel ? 'true' : 'false'}
8210
+ onMouseEnter={() => setHoveredZoomLevel(true)}
8211
+ onMouseLeave={() => setHoveredZoomLevel(false)}
8077
8212
  style={{
8078
8213
  color: pal.legendText,
8079
8214
  borderColor: pal.containerBorder,
8080
8215
  minWidth: 46,
8081
8216
  display: 'inline-block',
8217
+ // R347: letter-spacing hover tween — extends R344/R345
8218
+ // hover-letter-spacing family into the chrome strip.
8219
+ letterSpacing: hoveredZoomLevel ? '0.5px' : '0',
8082
8220
  /* Round 264 / Loop: zoom level readout gains theme-toggle
8083
8221
  transition. The span has theme-driven color (pal.
8084
8222
  legendText) + border-x (pal.containerBorder via the
@@ -8087,7 +8225,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
8087
8225
  on theme flip while siblings eased. Sibling treatment
8088
8226
  to the nodeSize + zoom wrapper transitions added this
8089
8227
  round. */
8090
- transition: 'color 200ms ease-out, border-color 200ms ease-out',
8228
+ transition: 'color 200ms ease-out, border-color 200ms ease-out, letter-spacing 200ms ease-out',
8091
8229
  }}
8092
8230
  title="Current zoom level"
8093
8231
  >
@@ -8118,6 +8256,12 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
8118
8256
  onClick={() => { armResetSpin(); resetView(); }}
8119
8257
  data-topo-chrome-reset
8120
8258
  data-topo-chrome-reset-spinning={resetSpinning ? 'true' : 'false'}
8259
+ data-topo-chrome-reset-hover={hoveredReset ? 'true' : 'false'}
8260
+ // R350: hover state drives the icon transform below.
8261
+ onMouseEnter={() => setHoveredReset(true)}
8262
+ onMouseLeave={() => setHoveredReset(false)}
8263
+ onFocus={() => setHoveredReset(true)}
8264
+ onBlur={() => setHoveredReset(false)}
8121
8265
  // R196: press-state deepens before R184 reset-spin fires on
8122
8266
  // release — mouse-down dim then 450ms spin = full handshake.
8123
8267
  className="p-1.5 rounded-md border hover:bg-white/5 active:bg-white/10 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60"
@@ -8147,6 +8291,17 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
8147
8291
  aria-hidden
8148
8292
  className={resetSpinning ? 'anet-reset-spin' : undefined}
8149
8293
  data-topo-chrome-reset-icon
8294
+ // R350: hover-rotate preview of the R184 click-spin.
8295
+ // Gated on !resetSpinning so the anet-reset-spin keyframe
8296
+ // owns transform during its 450ms run. transformOrigin
8297
+ // 'center' so rotation pivots around the icon's centre
8298
+ // (default would be top-left and the icon would arc).
8299
+ style={{
8300
+ transform: hoveredReset && !resetSpinning ? 'rotate(-8deg)' : 'rotate(0deg)',
8301
+ transformOrigin: 'center',
8302
+ transition: 'transform 200ms ease-out',
8303
+ }}
8304
+ data-topo-chrome-reset-icon-hover={hoveredReset && !resetSpinning ? 'true' : 'false'}
8150
8305
  >
8151
8306
  <path d="M3 12a9 9 0 1 0 9-9 9 9 0 0 0-6.4 2.6L3 8" />
8152
8307
  <path d="M3 3v5h5" />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.1-preview.1",
3
+ "version": "0.5.1-preview.11",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,86 @@
1
+ /* Round 342 verification: active-links chip freshness suffix wrapper
2
+ * lifts text-gray-500 → text-gray-400 (R317 subordinate-text-lift
3
+ * family). Affects the literal "last {rel}" text; the freshness dot
4
+ * keeps its own inline color via `style={{color: dotColor}}`.
5
+ *
6
+ * Contract:
7
+ * - The wrapper span containing [data-active-links-freshness-dot]
8
+ * has className containing 'text-gray-400' (not 'text-gray-500').
9
+ * - Wrapper textContent includes 'last' (the trailing literal).
10
+ * - Freshness dot keeps its own color (not the wrapper's).
11
+ * - R341 pin-intersection " pins" unit + R317/R318 chrome
12
+ * regressions intact.
13
+ * - R294 pulse absent.
14
+ */
15
+ import { chromium } from 'playwright';
16
+ import { readFileSync } from 'node:fs';
17
+
18
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
19
+ const browser = await chromium.launch({ headless: true });
20
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
21
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
22
+ await ctx.addInitScript(() => {
23
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
24
+ });
25
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
26
+ await ctx.route('**/api/hub/status*', async (route) => {
27
+ const r = await route.fetch();
28
+ const b = await r.json();
29
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
30
+ const mk = (alias) => ({
31
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
32
+ network_id: nid, project_dir: null,
33
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
34
+ });
35
+ await route.fulfill({ response: r, json: { ...b, sessions: [
36
+ mk('alpha'), mk('beta'), mk('gamma'),
37
+ ] } });
38
+ });
39
+ // One recent message → active-links chip's freshness suffix renders.
40
+ const now = Date.now();
41
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
42
+ { id: 'm1', from_alias: 'alpha', to_alias: 'beta', content: 'ping',
43
+ network_id: 'default', created_at: new Date(now - 5000).toISOString() },
44
+ ] } }));
45
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
46
+
47
+ const page = await ctx.newPage();
48
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
49
+ await page.waitForSelector('[data-active-links-freshness-dot]', { timeout: 15000 });
50
+ await page.waitForTimeout(300);
51
+
52
+ const probe = await page.evaluate(() => {
53
+ const dot = document.querySelector('[data-active-links-freshness-dot]');
54
+ const wrapper = dot?.parentElement || null;
55
+ return {
56
+ wrapperClass: wrapper?.className ?? '',
57
+ wrapperText: wrapper?.textContent ?? null,
58
+ dotInlineColor: dot?.getAttribute('style') ?? '',
59
+ // R341 regression.
60
+ pinIntersectionUnit: document.querySelector('[data-pin-intersection-unit]')?.className ?? '',
61
+ layoutInactiveCls: document.querySelector('[data-topo-chrome-layout="grid"]')?.className ?? '',
62
+ layoutActiveCls: document.querySelector('[data-topo-chrome-layout="ring"]')?.className ?? '',
63
+ pulseCount: document.querySelectorAll('[data-pulse-wrapper]').length,
64
+ };
65
+ });
66
+ await browser.close();
67
+
68
+ const results = {
69
+ wrapper_has_gray_400: /text-gray-400/.test(probe.wrapperClass),
70
+ wrapper_no_gray_500: !/text-gray-500/.test(probe.wrapperClass),
71
+ wrapper_text_last: /\blast\b/.test(probe.wrapperText || ''),
72
+ dot_has_inline_color: /color:/.test(probe.dotInlineColor),
73
+ // R341 regression — only triggers when a pin is active. Test
74
+ // doesn't click filters, so accept null OR opacity-70.
75
+ r341_pin_unit_or_absent: probe.pinIntersectionUnit === '' ||
76
+ /opacity-70/.test(probe.pinIntersectionUnit),
77
+ // R317 / R318 chrome regression.
78
+ r317_inactive_gray_400: probe.layoutInactiveCls.includes('text-gray-400'),
79
+ r318_active_font_medium: probe.layoutActiveCls.includes('font-medium'),
80
+ r294_pulse_absent: probe.pulseCount === 0,
81
+ };
82
+ const ok = Object.values(results).every(Boolean);
83
+ console.log(`${ok ? '✅' : '❌'} active-links freshness wrapper gray-400:`, JSON.stringify(results),
84
+ '\n wrapper class:', probe.wrapperClass,
85
+ '\n wrapper text:', JSON.stringify(probe.wrapperText));
86
+ process.exit(ok ? 0 : 1);