@sleep2agi/agent-network-dashboard 0.4.6-preview.160 → 0.4.6-preview.162

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 (156) 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 +3 -3
  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/{10hmjy1fp3hyj.js → 08ao8szisq5ch.js} +1 -1
  144. package/.next/static/chunks/{14i1i9ikkg5bp.js → 14~.ze~6ch07c.js} +1 -1
  145. package/.next/static/chunks/{04finjqoyo~rf.js → 15mxjivfp9-xh.js} +3 -3
  146. package/.next/static/chunks/{0g_sxsw.42had.css → 17euijzjp_rmo.css} +1 -1
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +29 -16
  150. package/app/globals.css +15 -0
  151. package/package.json +1 -1
  152. package/scripts/topo-chip-focus-test.mjs +95 -0
  153. package/scripts/topo-chrome-a11y-test.mjs +107 -0
  154. /package/.next/static/{HDGD0NmF9vDyCt2Vv_4gv → GhmfeNhT5uJCY6SB1K0fJ}/_buildManifest.js +0 -0
  155. /package/.next/static/{HDGD0NmF9vDyCt2Vv_4gv → GhmfeNhT5uJCY6SB1K0fJ}/_clientMiddlewareManifest.js +0 -0
  156. /package/.next/static/{HDGD0NmF9vDyCt2Vv_4gv → GhmfeNhT5uJCY6SB1K0fJ}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":265,"timestamp":58467413448,"id":4,"parentId":1,"tags":{},"startTime":1778866439660,"traceId":"e58be711914e9ffc"},{"name":"load-custom-routes","duration":487,"timestamp":58467413894,"id":5,"parentId":1,"tags":{},"startTime":1778866439660,"traceId":"e58be711914e9ffc"},{"name":"create-dist-dir","duration":636,"timestamp":58467414425,"id":6,"parentId":1,"tags":{},"startTime":1778866439661,"traceId":"e58be711914e9ffc"},{"name":"clean","duration":505,"timestamp":58467415670,"id":7,"parentId":1,"tags":{},"startTime":1778866439662,"traceId":"e58be711914e9ffc"},{"name":"discover-routes","duration":8810,"timestamp":58467496998,"id":8,"parentId":1,"tags":{},"startTime":1778866439743,"traceId":"e58be711914e9ffc"},{"name":"create-root-mapping","duration":102,"timestamp":58467505869,"id":9,"parentId":1,"tags":{},"startTime":1778866439752,"traceId":"e58be711914e9ffc"},{"name":"generate-route-types","duration":32284,"timestamp":58467508290,"id":10,"parentId":1,"tags":{},"startTime":1778866439755,"traceId":"e58be711914e9ffc"},{"name":"public-dir-conflict-check","duration":141,"timestamp":58467540824,"id":11,"parentId":1,"tags":{},"startTime":1778866439787,"traceId":"e58be711914e9ffc"},{"name":"generate-routes-manifest","duration":4517,"timestamp":58467541160,"id":12,"parentId":1,"tags":{},"startTime":1778866439787,"traceId":"e58be711914e9ffc"},{"name":"run-turbopack","duration":5354396,"timestamp":58467552281,"id":14,"parentId":1,"tags":{},"startTime":1778866439799,"traceId":"e58be711914e9ffc"},{"name":"turbopack-build-events","duration":73,"timestamp":58467839158,"id":15,"parentId":1,"tags":{},"startTime":1778866440085,"traceId":"e58be711914e9ffc"},{"name":"run-typescript","duration":8652943,"timestamp":58472922819,"id":16,"parentId":1,"tags":{},"startTime":1778866445169,"traceId":"e58be711914e9ffc"},{"name":"generate-required-server-files","duration":2681,"timestamp":58481577145,"id":18,"parentId":1,"tags":{},"startTime":1778866453823,"traceId":"e58be711914e9ffc"},{"name":"check-static-error-page","duration":11705,"timestamp":58481758187,"id":20,"parentId":19,"tags":{},"startTime":1778866454004,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":414108,"timestamp":58481774232,"id":63,"parentId":22,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":428160,"timestamp":58481760355,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778866454007,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":517688,"timestamp":58481774743,"id":67,"parentId":28,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":529375,"timestamp":58481763155,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778866454009,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":530862,"timestamp":58481774405,"id":65,"parentId":26,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":542453,"timestamp":58481762889,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778866454009,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":536132,"timestamp":58481775241,"id":70,"parentId":32,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":547581,"timestamp":58481763871,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778866454010,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":541315,"timestamp":58481774913,"id":68,"parentId":29,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":553127,"timestamp":58481763281,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778866454010,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":547880,"timestamp":58481775314,"id":71,"parentId":33,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":559241,"timestamp":58481764026,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778866454010,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":552350,"timestamp":58481775068,"id":69,"parentId":30,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":564051,"timestamp":58481763435,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778866454010,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":554374,"timestamp":58481774509,"id":66,"parentId":27,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":565930,"timestamp":58481763026,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778866454009,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":553674,"timestamp":58481775538,"id":74,"parentId":36,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":564581,"timestamp":58481764678,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":555701,"timestamp":58481774323,"id":64,"parentId":25,"tags":{},"startTime":1778866454021,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":567371,"timestamp":58481762697,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778866454009,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":557068,"timestamp":58481775568,"id":75,"parentId":37,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":567847,"timestamp":58481764828,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":558643,"timestamp":58481775592,"id":77,"parentId":39,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":569289,"timestamp":58481764989,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":560815,"timestamp":58481775581,"id":76,"parentId":38,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":571524,"timestamp":58481764924,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":561027,"timestamp":58481775605,"id":78,"parentId":40,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":571599,"timestamp":58481765066,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":561415,"timestamp":58481775614,"id":79,"parentId":41,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":571941,"timestamp":58481765129,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":566307,"timestamp":58481773931,"id":62,"parentId":21,"tags":{},"startTime":1778866454020,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":581006,"timestamp":58481759278,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778866454006,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":565409,"timestamp":58481775662,"id":83,"parentId":45,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":575740,"timestamp":58481765383,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778866454012,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":568027,"timestamp":58481775390,"id":72,"parentId":34,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":579449,"timestamp":58481764160,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778866454010,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":571363,"timestamp":58481775691,"id":85,"parentId":47,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":580241,"timestamp":58481766866,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778866454013,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":572549,"timestamp":58481775627,"id":80,"parentId":42,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":583024,"timestamp":58481765197,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":582352,"timestamp":58481775421,"id":73,"parentId":35,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":593596,"timestamp":58481764254,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778866454011,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":589212,"timestamp":58481775712,"id":87,"parentId":49,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":597871,"timestamp":58481767125,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778866454013,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":589685,"timestamp":58481775700,"id":86,"parentId":48,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":598388,"timestamp":58481767049,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778866454013,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":581361,"timestamp":58481785858,"id":89,"parentId":31,"tags":{},"startTime":1778866454032,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":603696,"timestamp":58481763564,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778866454010,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":584280,"timestamp":58481783136,"id":88,"parentId":24,"tags":{},"startTime":1778866454029,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":606662,"timestamp":58481760786,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778866454007,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":600602,"timestamp":58481775640,"id":81,"parentId":43,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":611035,"timestamp":58481765259,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778866454012,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":600777,"timestamp":58481775653,"id":82,"parentId":44,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":611141,"timestamp":58481765317,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778866454012,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":634947,"timestamp":58481788307,"id":93,"parentId":52,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":655696,"timestamp":58481767632,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778866454014,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":636333,"timestamp":58481788280,"id":91,"parentId":50,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":657238,"timestamp":58481767427,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778866454014,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":639835,"timestamp":58481788248,"id":90,"parentId":23,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":667537,"timestamp":58481760593,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778866454007,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":653739,"timestamp":58481775675,"id":84,"parentId":46,"tags":{},"startTime":1778866454022,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":664022,"timestamp":58481765443,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778866454012,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":643388,"timestamp":58481788343,"id":96,"parentId":56,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":663274,"timestamp":58481768499,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778866454015,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":647073,"timestamp":58481788356,"id":97,"parentId":57,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":666786,"timestamp":58481768703,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778866454015,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":647264,"timestamp":58481788369,"id":98,"parentId":59,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":666334,"timestamp":58481769327,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778866454016,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":651188,"timestamp":58481788399,"id":100,"parentId":61,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":670005,"timestamp":58481769626,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778866454016,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":646843,"timestamp":58481794116,"id":101,"parentId":58,"tags":{},"startTime":1778866454040,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":672133,"timestamp":58481768895,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778866454015,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":630502,"timestamp":58481812906,"id":102,"parentId":55,"tags":{},"startTime":1778866454059,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":675338,"timestamp":58481768108,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778866454014,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":657711,"timestamp":58481788334,"id":95,"parentId":54,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":678168,"timestamp":58481767916,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778866454014,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":658319,"timestamp":58481788382,"id":99,"parentId":60,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":677259,"timestamp":58481769481,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778866454016,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":660666,"timestamp":58481788292,"id":92,"parentId":51,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":681464,"timestamp":58481767529,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778866454014,"traceId":"e58be711914e9ffc"},{"name":"is-page-static","duration":661600,"timestamp":58481788320,"id":94,"parentId":53,"tags":{},"startTime":1778866454035,"traceId":"e58be711914e9ffc"},{"name":"check-page","duration":682187,"timestamp":58481767765,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778866454014,"traceId":"e58be711914e9ffc"},{"name":"static-check","duration":692668,"timestamp":58481757327,"id":19,"parentId":1,"tags":{},"startTime":1778866454004,"traceId":"e58be711914e9ffc"},{"name":"write-routes-manifest","duration":509,"timestamp":58482458224,"id":104,"parentId":1,"tags":{},"startTime":1778866454705,"traceId":"e58be711914e9ffc"},{"name":"load-dotenv","duration":85,"timestamp":58482473396,"id":107,"parentId":106,"tags":{},"startTime":1778866454720,"traceId":"e58be711914e9ffc"},{"name":"run-export-path-map","duration":580,"timestamp":58482476117,"id":108,"parentId":106,"tags":{},"startTime":1778866454722,"traceId":"e58be711914e9ffc"},{"name":"next-export","duration":669289,"timestamp":58482470617,"id":106,"parentId":1,"tags":{},"startTime":1778866454717,"traceId":"e58be711914e9ffc"}]
2
- [{"name":"move-exported-app-not-found-","duration":2484,"timestamp":58483143481,"id":109,"parentId":105,"tags":{},"startTime":1778866455390,"traceId":"e58be711914e9ffc"},{"name":"move-exported-app-global-error-","duration":768,"timestamp":58483146089,"id":110,"parentId":105,"tags":{},"startTime":1778866455392,"traceId":"e58be711914e9ffc"},{"name":"static-generation","duration":685525,"timestamp":58482463370,"id":105,"parentId":1,"tags":{},"startTime":1778866454710,"traceId":"e58be711914e9ffc"},{"name":"write-routes-manifest","duration":480,"timestamp":58483149152,"id":111,"parentId":1,"tags":{},"startTime":1778866455395,"traceId":"e58be711914e9ffc"},{"name":"print-tree-view","duration":3903,"timestamp":58483159312,"id":112,"parentId":1,"tags":{},"startTime":1778866455406,"traceId":"e58be711914e9ffc"},{"name":"write-route-bundle-stats","duration":15313,"timestamp":58483163290,"id":113,"parentId":1,"tags":{},"startTime":1778866455410,"traceId":"e58be711914e9ffc"},{"name":"telemetry-flush","duration":31287,"timestamp":58483178641,"id":114,"parentId":1,"tags":{},"startTime":1778866455425,"traceId":"e58be711914e9ffc"},{"name":"next-build","duration":15848143,"timestamp":58467361817,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778866439608,"traceId":"e58be711914e9ffc"}]
1
+ [{"name":"generate-buildid","duration":325,"timestamp":59195832238,"id":4,"parentId":1,"tags":{},"startTime":1778867168079,"traceId":"467be1ac2ba06164"},{"name":"load-custom-routes","duration":579,"timestamp":59195832772,"id":5,"parentId":1,"tags":{},"startTime":1778867168079,"traceId":"467be1ac2ba06164"},{"name":"create-dist-dir","duration":787,"timestamp":59195833396,"id":6,"parentId":1,"tags":{},"startTime":1778867168080,"traceId":"467be1ac2ba06164"},{"name":"clean","duration":602,"timestamp":59195834955,"id":7,"parentId":1,"tags":{},"startTime":1778867168081,"traceId":"467be1ac2ba06164"},{"name":"discover-routes","duration":9184,"timestamp":59195918070,"id":8,"parentId":1,"tags":{},"startTime":1778867168164,"traceId":"467be1ac2ba06164"},{"name":"create-root-mapping","duration":102,"timestamp":59195927312,"id":9,"parentId":1,"tags":{},"startTime":1778867168174,"traceId":"467be1ac2ba06164"},{"name":"generate-route-types","duration":36073,"timestamp":59195930043,"id":10,"parentId":1,"tags":{},"startTime":1778867168176,"traceId":"467be1ac2ba06164"},{"name":"public-dir-conflict-check","duration":125,"timestamp":59195966319,"id":11,"parentId":1,"tags":{},"startTime":1778867168213,"traceId":"467be1ac2ba06164"},{"name":"generate-routes-manifest","duration":5761,"timestamp":59195966598,"id":12,"parentId":1,"tags":{},"startTime":1778867168213,"traceId":"467be1ac2ba06164"},{"name":"run-turbopack","duration":5273765,"timestamp":59195977779,"id":14,"parentId":1,"tags":{},"startTime":1778867168224,"traceId":"467be1ac2ba06164"},{"name":"turbopack-build-events","duration":102,"timestamp":59196260156,"id":15,"parentId":1,"tags":{},"startTime":1778867168506,"traceId":"467be1ac2ba06164"},{"name":"run-typescript","duration":8693162,"timestamp":59201274498,"id":16,"parentId":1,"tags":{},"startTime":1778867173521,"traceId":"467be1ac2ba06164"},{"name":"generate-required-server-files","duration":2576,"timestamp":59209968933,"id":18,"parentId":1,"tags":{},"startTime":1778867182215,"traceId":"467be1ac2ba06164"},{"name":"check-static-error-page","duration":15582,"timestamp":59210137024,"id":20,"parentId":19,"tags":{},"startTime":1778867182383,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":432406,"timestamp":59210156018,"id":63,"parentId":22,"tags":{},"startTime":1778867182402,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":448229,"timestamp":59210140366,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778867182387,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":488975,"timestamp":59210157945,"id":67,"parentId":28,"tags":{},"startTime":1778867182404,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":502926,"timestamp":59210144140,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778867182390,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":500438,"timestamp":59210158477,"id":70,"parentId":32,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":514126,"timestamp":59210144862,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778867182391,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":523190,"timestamp":59210156154,"id":64,"parentId":25,"tags":{},"startTime":1778867182402,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":535750,"timestamp":59210143666,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778867182390,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":522938,"timestamp":59210157600,"id":66,"parentId":27,"tags":{},"startTime":1778867182404,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":536606,"timestamp":59210143991,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778867182390,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":528308,"timestamp":59210155584,"id":62,"parentId":21,"tags":{},"startTime":1778867182402,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":545251,"timestamp":59210138703,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778867182385,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":528406,"timestamp":59210158668,"id":73,"parentId":35,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":541818,"timestamp":59210145308,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778867182392,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":536068,"timestamp":59210158550,"id":71,"parentId":33,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":549645,"timestamp":59210145031,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778867182391,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":536294,"timestamp":59210158632,"id":72,"parentId":34,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":549817,"timestamp":59210145163,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778867182391,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":540995,"timestamp":59210158864,"id":76,"parentId":38,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":553661,"timestamp":59210146257,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":543208,"timestamp":59210158880,"id":77,"parentId":39,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":555771,"timestamp":59210146368,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":545844,"timestamp":59210158896,"id":78,"parentId":40,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":558335,"timestamp":59210146473,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":549063,"timestamp":59210158908,"id":79,"parentId":41,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":561463,"timestamp":59210146575,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":550553,"timestamp":59210158923,"id":80,"parentId":42,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":562840,"timestamp":59210146684,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":557883,"timestamp":59210158951,"id":82,"parentId":44,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":569980,"timestamp":59210146917,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":565178,"timestamp":59210156278,"id":65,"parentId":26,"tags":{},"startTime":1778867182403,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":577631,"timestamp":59210143870,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778867182390,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":562687,"timestamp":59210158969,"id":83,"parentId":45,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":574653,"timestamp":59210147052,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":563020,"timestamp":59210158843,"id":75,"parentId":37,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":575791,"timestamp":59210146100,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778867182392,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":564228,"timestamp":59210158939,"id":81,"parentId":43,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":576398,"timestamp":59210146808,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":565230,"timestamp":59210158140,"id":68,"parentId":29,"tags":{},"startTime":1778867182404,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":579133,"timestamp":59210144266,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778867182391,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":568116,"timestamp":59210159046,"id":87,"parentId":49,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":578091,"timestamp":59210149115,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778867182395,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":569103,"timestamp":59210159030,"id":86,"parentId":48,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":579220,"timestamp":59210148963,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778867182395,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":569481,"timestamp":59210159017,"id":85,"parentId":47,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":581249,"timestamp":59210147298,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778867182394,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":570427,"timestamp":59210158283,"id":69,"parentId":30,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":584335,"timestamp":59210144417,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778867182391,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":567809,"timestamp":59210163664,"id":89,"parentId":31,"tags":{},"startTime":1778867182410,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":586950,"timestamp":59210144568,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778867182391,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":574341,"timestamp":59210158984,"id":84,"parentId":46,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":586210,"timestamp":59210147160,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778867182393,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":583479,"timestamp":59210158809,"id":74,"parentId":36,"tags":{},"startTime":1778867182405,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":596480,"timestamp":59210145861,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778867182392,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":603355,"timestamp":59210166269,"id":95,"parentId":54,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":619368,"timestamp":59210150333,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778867182397,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":610422,"timestamp":59210166283,"id":96,"parentId":56,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":625589,"timestamp":59210151198,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778867182397,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":620882,"timestamp":59210166294,"id":97,"parentId":57,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":635830,"timestamp":59210151417,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778867182398,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":625263,"timestamp":59210166309,"id":98,"parentId":59,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":639579,"timestamp":59210152054,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778867182398,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":630246,"timestamp":59210162483,"id":88,"parentId":24,"tags":{},"startTime":1778867182409,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":651880,"timestamp":59210140918,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778867182387,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":626704,"timestamp":59210166243,"id":93,"parentId":52,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":643127,"timestamp":59210149887,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778867182396,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":632173,"timestamp":59210166209,"id":91,"parentId":50,"tags":{},"startTime":1778867182412,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":648906,"timestamp":59210149532,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778867182396,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":635084,"timestamp":59210166177,"id":90,"parentId":23,"tags":{},"startTime":1778867182412,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":660657,"timestamp":59210140651,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778867182387,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":629777,"timestamp":59210172092,"id":101,"parentId":58,"tags":{},"startTime":1778867182418,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":650315,"timestamp":59210151593,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778867182398,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":638231,"timestamp":59210166328,"id":99,"parentId":60,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":652399,"timestamp":59210152217,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778867182398,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":622361,"timestamp":59210187595,"id":102,"parentId":55,"tags":{},"startTime":1778867182434,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":659414,"timestamp":59210150579,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778867182397,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":649993,"timestamp":59210166227,"id":92,"parentId":51,"tags":{},"startTime":1778867182412,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":666558,"timestamp":59210149702,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778867182396,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":669526,"timestamp":59210166255,"id":94,"parentId":53,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":685714,"timestamp":59210150114,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778867182396,"traceId":"467be1ac2ba06164"},{"name":"is-page-static","duration":670550,"timestamp":59210166351,"id":100,"parentId":61,"tags":{},"startTime":1778867182413,"traceId":"467be1ac2ba06164"},{"name":"check-page","duration":684580,"timestamp":59210152363,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778867182399,"traceId":"467be1ac2ba06164"},{"name":"static-check","duration":701163,"timestamp":59210135827,"id":19,"parentId":1,"tags":{},"startTime":1778867182382,"traceId":"467be1ac2ba06164"},{"name":"write-routes-manifest","duration":447,"timestamp":59210843536,"id":104,"parentId":1,"tags":{},"startTime":1778867183090,"traceId":"467be1ac2ba06164"},{"name":"load-dotenv","duration":60,"timestamp":59210855104,"id":107,"parentId":106,"tags":{},"startTime":1778867183101,"traceId":"467be1ac2ba06164"},{"name":"run-export-path-map","duration":886,"timestamp":59210859632,"id":108,"parentId":106,"tags":{},"startTime":1778867183106,"traceId":"467be1ac2ba06164"},{"name":"next-export","duration":585813,"timestamp":59210853727,"id":106,"parentId":1,"tags":{},"startTime":1778867183100,"traceId":"467be1ac2ba06164"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2320,"timestamp":59211443236,"id":109,"parentId":105,"tags":{},"startTime":1778867183690,"traceId":"467be1ac2ba06164"},{"name":"move-exported-app-global-error-","duration":573,"timestamp":59211445645,"id":110,"parentId":105,"tags":{},"startTime":1778867183692,"traceId":"467be1ac2ba06164"},{"name":"static-generation","duration":600336,"timestamp":59210847896,"id":105,"parentId":1,"tags":{},"startTime":1778867183094,"traceId":"467be1ac2ba06164"},{"name":"write-routes-manifest","duration":431,"timestamp":59211448390,"id":111,"parentId":1,"tags":{},"startTime":1778867183695,"traceId":"467be1ac2ba06164"},{"name":"print-tree-view","duration":4177,"timestamp":59211455752,"id":112,"parentId":1,"tags":{},"startTime":1778867183702,"traceId":"467be1ac2ba06164"},{"name":"write-route-bundle-stats","duration":17613,"timestamp":59211459960,"id":113,"parentId":1,"tags":{},"startTime":1778867183706,"traceId":"467be1ac2ba06164"},{"name":"telemetry-flush","duration":36698,"timestamp":59211477598,"id":114,"parentId":1,"tags":{},"startTime":1778867183724,"traceId":"467be1ac2ba06164"},{"name":"next-build","duration":15730341,"timestamp":59195783990,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778867168030,"traceId":"467be1ac2ba06164"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5354396,"timestamp":58467552281,"id":14,"parentId":1,"tags":{},"startTime":1778866439799,"traceId":"e58be711914e9ffc"},{"name":"turbopack-build-events","duration":73,"timestamp":58467839158,"id":15,"parentId":1,"tags":{},"startTime":1778866440085,"traceId":"e58be711914e9ffc"},{"name":"run-typescript","duration":8652943,"timestamp":58472922819,"id":16,"parentId":1,"tags":{},"startTime":1778866445169,"traceId":"e58be711914e9ffc"},{"name":"static-check","duration":692668,"timestamp":58481757327,"id":19,"parentId":1,"tags":{},"startTime":1778866454004,"traceId":"e58be711914e9ffc"},{"name":"static-generation","duration":685525,"timestamp":58482463370,"id":105,"parentId":1,"tags":{},"startTime":1778866454710,"traceId":"e58be711914e9ffc"},{"name":"telemetry-flush","duration":31287,"timestamp":58483178641,"id":114,"parentId":1,"tags":{},"startTime":1778866455425,"traceId":"e58be711914e9ffc"},{"name":"next-build","duration":15848143,"timestamp":58467361817,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778866439608,"traceId":"e58be711914e9ffc"}]
1
+ [{"name":"run-turbopack","duration":5273765,"timestamp":59195977779,"id":14,"parentId":1,"tags":{},"startTime":1778867168224,"traceId":"467be1ac2ba06164"},{"name":"turbopack-build-events","duration":102,"timestamp":59196260156,"id":15,"parentId":1,"tags":{},"startTime":1778867168506,"traceId":"467be1ac2ba06164"},{"name":"run-typescript","duration":8693162,"timestamp":59201274498,"id":16,"parentId":1,"tags":{},"startTime":1778867173521,"traceId":"467be1ac2ba06164"},{"name":"static-check","duration":701163,"timestamp":59210135827,"id":19,"parentId":1,"tags":{},"startTime":1778867182382,"traceId":"467be1ac2ba06164"},{"name":"static-generation","duration":600336,"timestamp":59210847896,"id":105,"parentId":1,"tags":{},"startTime":1778867183094,"traceId":"467be1ac2ba06164"},{"name":"telemetry-flush","duration":36698,"timestamp":59211477598,"id":114,"parentId":1,"tags":{},"startTime":1778867183724,"traceId":"467be1ac2ba06164"},{"name":"next-build","duration":15730341,"timestamp":59195783990,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778867168030,"traceId":"467be1ac2ba06164"}]
@@ -1363,7 +1363,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1363
1363
  return (
1364
1364
  <>
1365
1365
  <span
1366
- className="px-2.5 py-1 rounded-md bg-green-500/10 text-green-300 border border-green-500/20"
1366
+ className="px-2.5 py-1 rounded-md bg-green-500/10 text-green-300 border border-green-500/20 anet-topo-chip-focus"
1367
1367
  data-working-chip
1368
1368
  data-working-chip-aliases={workingAliases.join(',')}
1369
1369
  data-pin-mirror={pinnedStatus === 'working' ? 'true' : 'false'}
@@ -1401,7 +1401,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1401
1401
  {workingCount} working
1402
1402
  </span>
1403
1403
  <span
1404
- className="px-2.5 py-1 rounded-md bg-cyan-500/10 text-cyan-300 border border-cyan-500/20"
1404
+ className="px-2.5 py-1 rounded-md bg-cyan-500/10 text-cyan-300 border border-cyan-500/20 anet-topo-chip-focus"
1405
1405
  data-online-chip
1406
1406
  data-online-chip-aliases={onlineAliases.join(',')}
1407
1407
  data-pin-mirror={pinnedStatus === 'idle' ? 'true' : 'false'}
@@ -1485,6 +1485,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1485
1485
  role="button"
1486
1486
  tabIndex={0}
1487
1487
  aria-pressed={isPinned}
1488
+ className="anet-topo-chip-focus"
1488
1489
  title={`${n} ${label}\n${previewList}${suffix}\n${titleAction}`}
1489
1490
  style={{
1490
1491
  width: `${(n / total) * 100}%`,
@@ -1586,7 +1587,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1586
1587
  data-active-filter="status"
1587
1588
  data-filter-match-count={matchCount}
1588
1589
  data-filter-match-aliases={matchAliases.join(',')}
1589
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in"
1590
+ 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"
1590
1591
  title={matchCount > 0 ? `${matchPreview}${matchSuffix} — click to clear` : 'Click to clear filter'}
1591
1592
  onClick={() => setPinnedStatus(null)}
1592
1593
  style={{
@@ -1624,7 +1625,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1624
1625
  data-active-filter="group"
1625
1626
  data-filter-match-count={matchCount}
1626
1627
  data-filter-match-aliases={matchAliases.join(',')}
1627
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in"
1628
+ 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"
1628
1629
  title={matchCount > 0 ? `${matchPreview}${matchSuffix} — click to clear` : 'Click to clear filter'}
1629
1630
  onClick={() => setPinnedGroup(null)}
1630
1631
  style={{
@@ -1674,7 +1675,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1674
1675
  data-active-filter="vendor"
1675
1676
  data-filter-match-count={matchCount}
1676
1677
  data-filter-match-aliases={matchAliases.join(',')}
1677
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in"
1678
+ 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"
1678
1679
  title={matchCount > 0 ? `${matchPreview}${matchSuffix} — click to clear` : 'Click to clear vendor filter'}
1679
1680
  onClick={() => setPinnedVendor(null)}
1680
1681
  style={{
@@ -1722,7 +1723,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1722
1723
  data-filter-match-count={link.count}
1723
1724
  data-filter-match-aliases={`${link.from},${link.to}`}
1724
1725
  data-active-filter-edge-hot={isHot ? 'true' : 'false'}
1725
- className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in"
1726
+ 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"
1726
1727
  title={`${link.from} → ${link.to} (${link.count} msg${link.count === 1 ? '' : 's'}${isHot ? ', hot lane · ≥ 10' : ''}) — click to clear`}
1727
1728
  onClick={() => setPinnedEdgeKey(null)}
1728
1729
  style={{
@@ -1836,7 +1837,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1836
1837
  data-pin-intersection-count={matchAliases.length}
1837
1838
  data-pin-intersection-empty={isEmpty ? 'true' : 'false'}
1838
1839
  data-pin-intersection-aliases={matchAliases.join(',')}
1839
- className="hidden sm:inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md font-mono text-xs border anet-fade-in"
1840
+ className="hidden sm: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"
1840
1841
  title={tooltip}
1841
1842
  style={{
1842
1843
  background: isEmpty
@@ -1889,7 +1890,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1889
1890
  role="button"
1890
1891
  tabIndex={0}
1891
1892
  aria-pressed={isPinned}
1892
- className="inline-flex items-baseline gap-0.5 px-1 rounded"
1893
+ className="inline-flex items-baseline gap-0.5 px-1 rounded anet-topo-chip-focus"
1893
1894
  data-vendor-letter={v.initial}
1894
1895
  data-vendor-pinned={isPinned ? 'true' : 'false'}
1895
1896
  data-vendor-aliases={aliases.join(',')}
@@ -1959,7 +1960,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1959
1960
  : `${flowList}${flowSuffix} — hover brightens all · click to open /messages`;
1960
1961
  return (
1961
1962
  <span
1962
- className="hidden sm:inline px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20"
1963
+ className="hidden sm:inline px-2.5 py-1 rounded-md bg-gray-500/10 text-gray-400 border border-gray-500/20 anet-topo-chip-focus"
1963
1964
  data-active-links-chip
1964
1965
  data-active-links-flow-count={flowLinks.length}
1965
1966
  data-active-links-clickable={isInteractive ? 'true' : 'false'}
@@ -4227,8 +4228,12 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4227
4228
  behind the "%" label (looked like an indicator, not a button).
4228
4229
  Split into a plain % readout + an explicit reset button with
4229
4230
  its own icon + tooltip. */}
4230
- <div className="absolute bottom-3 right-3 flex items-center gap-1.5 text-xs select-none">
4231
- {/* #113: node size — S / M / L segmented control (Vincent 4727). */}
4231
+ <div className="absolute bottom-3 right-3 flex items-center gap-1.5 text-xs select-none" data-topo-chrome>
4232
+ {/* #113: node size — S / M / L segmented control (Vincent 4727).
4233
+ R154: stable data-* hooks for tests + focus-visible ring so
4234
+ keyboard navigation lands somewhere visible against the
4235
+ dark canvas (browser default outline often vanishes on
4236
+ cyber theme). */}
4232
4237
  <div
4233
4238
  className="flex items-center rounded-md border overflow-hidden"
4234
4239
  style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder }}
@@ -4240,8 +4245,10 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4240
4245
  key={lbl}
4241
4246
  onClick={() => pickNodeScale(v)}
4242
4247
  aria-pressed={nodeScale === v}
4248
+ data-topo-chrome-nodesize={lbl}
4249
+ data-topo-chrome-nodesize-active={nodeScale === v ? 'true' : 'false'}
4243
4250
  title={`Node size: ${lbl === 'S' ? 'small' : lbl === 'M' ? 'medium' : 'large'}`}
4244
- className={`px-2 py-1 transition-colors ${idx > 0 ? 'border-l' : ''} ${nodeScale === v ? 'bg-cyan-500/15 text-cyan-300' : 'hover:bg-white/5'}`}
4251
+ className={`px-2 py-1 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset ${idx > 0 ? 'border-l' : ''} ${nodeScale === v ? 'bg-cyan-500/15 text-cyan-300' : 'hover:bg-white/5'}`}
4245
4252
  style={{ color: nodeScale === v ? undefined : pal.legendText, borderColor: pal.containerBorder }}
4246
4253
  >
4247
4254
  {lbl}
@@ -4254,7 +4261,8 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4254
4261
  >
4255
4262
  <button
4256
4263
  onClick={() => zoomBy(1 / 1.2)}
4257
- className="px-2 py-1 hover:bg-white/5 transition-colors"
4264
+ data-topo-chrome-zoom-out
4265
+ className="px-2 py-1 hover:bg-white/5 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset"
4258
4266
  style={{ color: pal.legendText }}
4259
4267
  aria-label="Zoom out"
4260
4268
  title="Zoom out (−)"
@@ -4263,6 +4271,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4263
4271
  </button>
4264
4272
  <span
4265
4273
  className="px-2 py-1 tabular-nums border-x text-center"
4274
+ data-topo-chrome-zoom-level
4266
4275
  style={{ color: pal.legendText, borderColor: pal.containerBorder, minWidth: 46 }}
4267
4276
  title="Current zoom level"
4268
4277
  >
@@ -4270,7 +4279,8 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4270
4279
  </span>
4271
4280
  <button
4272
4281
  onClick={() => zoomBy(1.2)}
4273
- className="px-2 py-1 hover:bg-white/5 transition-colors"
4282
+ data-topo-chrome-zoom-in
4283
+ className="px-2 py-1 hover:bg-white/5 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60 focus-visible:ring-inset"
4274
4284
  style={{ color: pal.legendText }}
4275
4285
  aria-label="Zoom in"
4276
4286
  title="Zoom in (+)"
@@ -4280,7 +4290,8 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4280
4290
  </div>
4281
4291
  <button
4282
4292
  onClick={resetView}
4283
- className="p-1.5 rounded-md border hover:bg-white/5 transition-colors"
4293
+ data-topo-chrome-reset
4294
+ className="p-1.5 rounded-md border hover:bg-white/5 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60"
4284
4295
  style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder, color: pal.legendText }}
4285
4296
  aria-label="Reset view"
4286
4297
  title="Reset zoom + pan (0, or double-click the canvas)"
@@ -4292,7 +4303,9 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
4292
4303
  </button>
4293
4304
  <button
4294
4305
  onClick={toggleFullscreen}
4295
- className="p-1.5 rounded-md border hover:bg-white/5 transition-colors"
4306
+ data-topo-chrome-fullscreen
4307
+ data-topo-chrome-fullscreen-active={isFullscreen ? 'true' : 'false'}
4308
+ className="p-1.5 rounded-md border hover:bg-white/5 transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/60"
4296
4309
  style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder, color: pal.legendText }}
4297
4310
  aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}
4298
4311
  title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
package/app/globals.css CHANGED
@@ -856,6 +856,21 @@ body {
856
856
  animation-iteration-count: infinite;
857
857
  }
858
858
 
859
+ /* R155 — focus-visible outline for TopoGraph chip-row interactives.
860
+ Cyber theme's dark canvas often swallows the browser default focus
861
+ ring; R154 fixed it for chrome buttons via Tailwind's focus-visible:
862
+ ring (box-shadow). Chip-row chips reuse `box-shadow` for the R88 /
863
+ R139 / R140 pin-mirror inset — so a focus box-shadow would conflict
864
+ with the pinned-state shadow. `outline` is a separate CSS property
865
+ and doesn't fight box-shadow, so we use it here. `currentColor`
866
+ inherits the chip's own accent (green for working, cyan for online,
867
+ per-vendor for letters, etc.). Only fires on :focus-visible
868
+ (keyboard) — mouse focus stays unstyled. */
869
+ .anet-topo-chip-focus:focus-visible {
870
+ outline: 2px solid currentColor;
871
+ outline-offset: 1px;
872
+ }
873
+
859
874
  /* Round 46 — animated dashed spokes flowing from hub outward. Each spoke
860
875
  gets a small animationDelay (set inline) so the dashes don't all flow
861
876
  in sync — reads as "command relay" pulse rather than a metronome.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.160",
3
+ "version": "0.4.6-preview.162",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,95 @@
1
+ /* Round 155 verification: chip-row interactives gain
2
+ * `.anet-topo-chip-focus` for keyboard focus-visible outline,
3
+ * matching R154's chrome-button treatment.
4
+ *
5
+ * Why `outline` not `box-shadow`: the R88 vendor letter / R139
6
+ * working chip / R140 online chip already use inline boxShadow
7
+ * for the pin-mirror inset. Adding focus-visible:ring (which
8
+ * Tailwind paints via box-shadow) would conflict — inline style
9
+ * wins specificity. `outline: 2px solid currentColor` is on a
10
+ * separate CSS property, no conflict; `currentColor` inherits
11
+ * the chip's own accent (green / cyan / per-vendor / etc.).
12
+ *
13
+ * Test: every chip-row interactive surface carries the class.
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
+
21
+ const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
22
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
23
+ await ctx.addInitScript(() => {
24
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
25
+ });
26
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
27
+ await ctx.route('**/api/hub/status*', async (route) => {
28
+ const r = await route.fetch();
29
+ const b = await r.json();
30
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
31
+ const mk = (alias, status, model) => ({
32
+ alias, status, model, runtime: 'cli-claude-code',
33
+ network_id: nid, project_dir: null,
34
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
35
+ });
36
+ await route.fulfill({ response: r, json: { ...b, sessions: [
37
+ mk('alpha', 'working', 'claude-opus-4'),
38
+ mk('beta', 'idle', 'gpt-4o'),
39
+ ] } });
40
+ });
41
+
42
+ const now = Date.now();
43
+ // 1 message to populate flowLinks → active-links chip is interactive
44
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [
45
+ { id: 'm0', from_alias: 'alpha', to_alias: 'beta', content: 'hi',
46
+ network_id: 'default', created_at: new Date(now - 10000).toISOString() },
47
+ ] } }));
48
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
49
+
50
+ const page = await ctx.newPage();
51
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
52
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 2, { timeout: 30000 });
53
+ await page.waitForTimeout(400);
54
+
55
+ // Pin status + vendor to surface filter pills + intersection chip
56
+ await page.evaluate(() => {
57
+ window.dispatchEvent(new CustomEvent('anet:topo-pin', { detail: { kind: 'status', value: 'working' } }));
58
+ window.dispatchEvent(new CustomEvent('anet:topo-pin', { detail: { kind: 'vendor', value: 'A' } }));
59
+ });
60
+ await page.waitForTimeout(300);
61
+
62
+ const inspect = () => page.evaluate(() => {
63
+ const has = (sel) => {
64
+ const el = document.querySelector(sel);
65
+ return el && (el.className || '').includes('anet-topo-chip-focus');
66
+ };
67
+ return {
68
+ pressureSeg_working: has('[data-pressure-seg="working"]'),
69
+ workingChip: has('[data-working-chip]'),
70
+ onlineChip: has('[data-online-chip]'),
71
+ vendorLetter_A: has('[data-vendor-letter="A"]'),
72
+ activeLinks: has('[data-active-links-chip]'),
73
+ filterPill_status: has('[data-active-filter="status"]'),
74
+ filterPill_vendor: has('[data-active-filter="vendor"]'),
75
+ intersectionChip: has('[data-pin-intersection]'),
76
+ };
77
+ });
78
+
79
+ const result = await inspect();
80
+ await browser.close();
81
+
82
+ const results = {
83
+ pressureSeg_focusClass: result.pressureSeg_working === true,
84
+ workingChip_focusClass: result.workingChip === true,
85
+ onlineChip_focusClass: result.onlineChip === true,
86
+ vendorLetter_focusClass: result.vendorLetter_A === true,
87
+ activeLinks_focusClass: result.activeLinks === true,
88
+ filterPillStatus_focusClass: result.filterPill_status === true,
89
+ filterPillVendor_focusClass: result.filterPill_vendor === true,
90
+ intersectionChip_focusClass: result.intersectionChip === true,
91
+ };
92
+ const ok = Object.values(results).every(Boolean);
93
+ console.log(`${ok ? '✅' : '❌'} chip focus class:`, JSON.stringify(results),
94
+ `\n raw=`, result);
95
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,107 @@
1
+ /* Round 154 verification: TopoGraph chrome buttons gain stable
2
+ * data-* hooks for tests + focus-visible ring matching the
3
+ * dashboard's cyan accent (browser default focus outline often
4
+ * vanishes on the dark canvas).
5
+ *
6
+ * Chrome inventory (bottom-right of canvas):
7
+ * data-topo-chrome (wrapper div)
8
+ * data-topo-chrome-nodesize=S|M|L (segmented control, R113)
9
+ * data-topo-chrome-nodesize-active="true|false"
10
+ * data-topo-chrome-zoom-out (R104)
11
+ * data-topo-chrome-zoom-level (readout, also R104)
12
+ * data-topo-chrome-zoom-in
13
+ * data-topo-chrome-reset
14
+ * data-topo-chrome-fullscreen
15
+ * data-topo-chrome-fullscreen-active="true|false"
16
+ *
17
+ * Each button gains focus-visible:ring-1 ring-cyan-400/60. Tabs
18
+ * land somewhere visible.
19
+ *
20
+ * Test: every chrome button surfaces its data attribute, plus the
21
+ * three S/M/L buttons report active correctly when one is picked.
22
+ */
23
+ import { chromium } from 'playwright';
24
+ import { readFileSync } from 'node:fs';
25
+
26
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
27
+ const browser = await chromium.launch({ headless: true });
28
+
29
+ const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
30
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
31
+ await ctx.addInitScript(() => {
32
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
33
+ });
34
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
35
+ await ctx.route('**/api/hub/status*', async (route) => {
36
+ const r = await route.fetch();
37
+ const b = await r.json();
38
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
39
+ const mk = (alias) => ({
40
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
41
+ network_id: nid, project_dir: null,
42
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
43
+ });
44
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('alpha'), mk('beta')] } });
45
+ });
46
+ await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
47
+ await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
48
+
49
+ const page = await ctx.newPage();
50
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
51
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 2, { timeout: 30000 });
52
+ await page.waitForSelector('[data-topo-chrome]', { timeout: 10000 });
53
+ await page.waitForTimeout(300);
54
+
55
+ const inspect = () => page.evaluate(() => {
56
+ const sel = (s) => document.querySelector(s);
57
+ const all = (s) => [...document.querySelectorAll(s)];
58
+ return {
59
+ wrapper: !!sel('[data-topo-chrome]'),
60
+ nodesizeS: sel('[data-topo-chrome-nodesize="S"]')?.getAttribute('data-topo-chrome-nodesize-active'),
61
+ nodesizeM: sel('[data-topo-chrome-nodesize="M"]')?.getAttribute('data-topo-chrome-nodesize-active'),
62
+ nodesizeL: sel('[data-topo-chrome-nodesize="L"]')?.getAttribute('data-topo-chrome-nodesize-active'),
63
+ zoomOut: !!sel('[data-topo-chrome-zoom-out]'),
64
+ zoomLevel: sel('[data-topo-chrome-zoom-level]')?.textContent?.trim(),
65
+ zoomIn: !!sel('[data-topo-chrome-zoom-in]'),
66
+ reset: !!sel('[data-topo-chrome-reset]'),
67
+ fullscreen: !!sel('[data-topo-chrome-fullscreen]'),
68
+ fullscreenActive: sel('[data-topo-chrome-fullscreen]')?.getAttribute('data-topo-chrome-fullscreen-active'),
69
+ // focus-visible ring is a CSS pseudo-class; just verify the
70
+ // className carries the focus-visible:ring tokens.
71
+ chromeButtonsHaveFocusRing: all('[data-topo-chrome] button').every(b =>
72
+ (b.className || '').includes('focus-visible:ring')),
73
+ };
74
+ });
75
+
76
+ const before = await inspect();
77
+
78
+ // Click L → it becomes active, M becomes inactive (default)
79
+ await page.locator('[data-topo-chrome-nodesize="L"]').click();
80
+ await page.waitForTimeout(150);
81
+ const afterL = await inspect();
82
+
83
+ await browser.close();
84
+
85
+ const results = {
86
+ wrapper_present: before.wrapper === true,
87
+ nodesizeS_present: before.nodesizeS === 'false',
88
+ nodesizeM_activeDefault: before.nodesizeM === 'true', // default scale 0.84 → M
89
+ nodesizeL_present: before.nodesizeL === 'false',
90
+ zoomOut_present: before.zoomOut === true,
91
+ zoomLevel_100pct: before.zoomLevel === '100%',
92
+ zoomIn_present: before.zoomIn === true,
93
+ reset_present: before.reset === true,
94
+ fullscreen_present: before.fullscreen === true,
95
+ fullscreenActive_false: before.fullscreenActive === 'false',
96
+ focusRing_onAllButtons: before.chromeButtonsHaveFocusRing === true,
97
+
98
+ // After clicking L: active flips to L
99
+ afterL_LActive: afterL.nodesizeL === 'true',
100
+ afterL_MInactive: afterL.nodesizeM === 'false',
101
+ afterL_SInactive: afterL.nodesizeS === 'false',
102
+ };
103
+ const ok = Object.values(results).every(Boolean);
104
+ console.log(`${ok ? '✅' : '❌'} chrome a11y:`, JSON.stringify(results),
105
+ `\n before=`, before,
106
+ `\n afterL=`, afterL);
107
+ process.exit(ok ? 0 : 1);