@sleep2agi/agent-network-dashboard 0.4.6-preview.237 → 0.4.6-preview.239

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 (144) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +4 -4
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/index.html +2 -2
  30. package/.next/server/app/index.rsc +2 -2
  31. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/login.html +2 -2
  38. package/.next/server/app/login.rsc +2 -2
  39. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  40. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  45. package/.next/server/app/logs.html +1 -1
  46. package/.next/server/app/logs.rsc +1 -1
  47. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  53. package/.next/server/app/messages.html +1 -1
  54. package/.next/server/app/messages.rsc +1 -1
  55. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  61. package/.next/server/app/node.html +1 -1
  62. package/.next/server/app/node.rsc +1 -1
  63. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  69. package/.next/server/app/nodes.html +1 -1
  70. package/.next/server/app/nodes.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  77. package/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app/server-logs.html +1 -1
  79. package/.next/server/app/server-logs.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  86. package/.next/server/app/settings/networks.html +1 -1
  87. package/.next/server/app/settings/networks.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  95. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/settings/tokens.html +1 -1
  97. package/.next/server/app/settings/tokens.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  105. package/.next/server/app/settings.html +2 -2
  106. package/.next/server/app/settings.rsc +2 -2
  107. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  108. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  112. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/tasks.html +1 -1
  114. package/.next/server/app/tasks.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  121. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  122. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  123. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  124. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  125. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  126. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  127. package/.next/server/middleware-build-manifest.js +3 -3
  128. package/.next/server/pages/404.html +1 -1
  129. package/.next/server/pages/500.html +1 -1
  130. package/.next/server/server-reference-manifest.js +1 -1
  131. package/.next/server/server-reference-manifest.json +1 -1
  132. package/.next/static/chunks/016twt0dzcvbr.js +4 -0
  133. package/.next/static/chunks/{0n42f9nmie57y.js → 060boig1.kb45.js} +1 -1
  134. package/.next/static/chunks/{0id2xbrhif.kv.js → 0qiomyuyc18l2.js} +1 -1
  135. package/.next/trace +2 -2
  136. package/.next/trace-build +1 -1
  137. package/app/components/TopoGraph.tsx +49 -8
  138. package/package.json +1 -1
  139. package/scripts/topo-chip-row-tabular-test.mjs +111 -0
  140. package/scripts/topo-edge-smil-sync-test.mjs +148 -0
  141. package/.next/static/chunks/0e4mkpy3dl~zm.js +0 -4
  142. /package/.next/static/{5Hm18afbTSHGNYCF5p0Bc → ByZN0CutkfiQPs8EmEiL7}/_buildManifest.js +0 -0
  143. /package/.next/static/{5Hm18afbTSHGNYCF5p0Bc → ByZN0CutkfiQPs8EmEiL7}/_clientMiddlewareManifest.js +0 -0
  144. /package/.next/static/{5Hm18afbTSHGNYCF5p0Bc → ByZN0CutkfiQPs8EmEiL7}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":252,"timestamp":85630754193,"id":4,"parentId":1,"tags":{},"startTime":1778893603000,"traceId":"8dc731dd57e9bff1"},{"name":"load-custom-routes","duration":488,"timestamp":85630754597,"id":5,"parentId":1,"tags":{},"startTime":1778893603001,"traceId":"8dc731dd57e9bff1"},{"name":"create-dist-dir","duration":676,"timestamp":85630755141,"id":6,"parentId":1,"tags":{},"startTime":1778893603001,"traceId":"8dc731dd57e9bff1"},{"name":"clean","duration":808,"timestamp":85630756671,"id":7,"parentId":1,"tags":{},"startTime":1778893603003,"traceId":"8dc731dd57e9bff1"},{"name":"discover-routes","duration":9742,"timestamp":85630843753,"id":8,"parentId":1,"tags":{},"startTime":1778893603090,"traceId":"8dc731dd57e9bff1"},{"name":"create-root-mapping","duration":108,"timestamp":85630853552,"id":9,"parentId":1,"tags":{},"startTime":1778893603100,"traceId":"8dc731dd57e9bff1"},{"name":"generate-route-types","duration":31836,"timestamp":85630855882,"id":10,"parentId":1,"tags":{},"startTime":1778893603102,"traceId":"8dc731dd57e9bff1"},{"name":"public-dir-conflict-check","duration":112,"timestamp":85630887873,"id":11,"parentId":1,"tags":{},"startTime":1778893603134,"traceId":"8dc731dd57e9bff1"},{"name":"generate-routes-manifest","duration":4413,"timestamp":85630888137,"id":12,"parentId":1,"tags":{},"startTime":1778893603134,"traceId":"8dc731dd57e9bff1"},{"name":"run-turbopack","duration":5640042,"timestamp":85630897949,"id":14,"parentId":1,"tags":{},"startTime":1778893603144,"traceId":"8dc731dd57e9bff1"},{"name":"turbopack-build-events","duration":72,"timestamp":85631177481,"id":15,"parentId":1,"tags":{},"startTime":1778893603424,"traceId":"8dc731dd57e9bff1"},{"name":"run-typescript","duration":9016647,"timestamp":85636547350,"id":16,"parentId":1,"tags":{},"startTime":1778893608794,"traceId":"8dc731dd57e9bff1"},{"name":"generate-required-server-files","duration":2243,"timestamp":85645565080,"id":18,"parentId":1,"tags":{},"startTime":1778893617811,"traceId":"8dc731dd57e9bff1"},{"name":"check-static-error-page","duration":11345,"timestamp":85645742740,"id":20,"parentId":19,"tags":{},"startTime":1778893617989,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":452707,"timestamp":85645757188,"id":63,"parentId":22,"tags":{},"startTime":1778893618003,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":465003,"timestamp":85645745098,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778893617991,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":511754,"timestamp":85645757563,"id":66,"parentId":27,"tags":{},"startTime":1778893618004,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":521737,"timestamp":85645747678,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":515799,"timestamp":85645759932,"id":70,"parentId":32,"tags":{},"startTime":1778893618006,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":527462,"timestamp":85645748340,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778893617995,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":535273,"timestamp":85645760036,"id":71,"parentId":33,"tags":{},"startTime":1778893618006,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":546948,"timestamp":85645748437,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778893617995,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":540726,"timestamp":85645757827,"id":67,"parentId":28,"tags":{},"startTime":1778893618004,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":550859,"timestamp":85645747764,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":544524,"timestamp":85645760143,"id":73,"parentId":35,"tags":{},"startTime":1778893618006,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":556142,"timestamp":85645748604,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778893617995,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":551597,"timestamp":85645757457,"id":65,"parentId":26,"tags":{},"startTime":1778893618004,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":561521,"timestamp":85645747588,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":552023,"timestamp":85645760112,"id":72,"parentId":34,"tags":{},"startTime":1778893618006,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":563663,"timestamp":85645748517,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778893617995,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":557325,"timestamp":85645760297,"id":75,"parentId":37,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":568484,"timestamp":85645749198,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778893617995,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":557574,"timestamp":85645760312,"id":76,"parentId":38,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":568636,"timestamp":85645749300,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":558410,"timestamp":85645759730,"id":69,"parentId":30,"tags":{},"startTime":1778893618006,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":570206,"timestamp":85645747964,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":569342,"timestamp":85645760343,"id":79,"parentId":41,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":580216,"timestamp":85645749514,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":572745,"timestamp":85645760334,"id":78,"parentId":40,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":583673,"timestamp":85645749449,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":576572,"timestamp":85645756766,"id":62,"parentId":21,"tags":{},"startTime":1778893618003,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":589466,"timestamp":85645743906,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778893617990,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":574167,"timestamp":85645760363,"id":81,"parentId":43,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":584943,"timestamp":85645749681,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":579555,"timestamp":85645757337,"id":64,"parentId":25,"tags":{},"startTime":1778893618004,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":589505,"timestamp":85645747454,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":578263,"timestamp":85645760263,"id":74,"parentId":36,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":589560,"timestamp":85645749021,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778893617995,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":578515,"timestamp":85645760382,"id":83,"parentId":45,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":589126,"timestamp":85645749820,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":583031,"timestamp":85645760409,"id":86,"parentId":48,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":593403,"timestamp":85645750076,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":586818,"timestamp":85645759541,"id":68,"parentId":29,"tags":{},"startTime":1778893618006,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":598554,"timestamp":85645747847,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":585705,"timestamp":85645761496,"id":87,"parentId":49,"tags":{},"startTime":1778893618008,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":597095,"timestamp":85645750145,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":588087,"timestamp":85645760391,"id":84,"parentId":46,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":598636,"timestamp":85645749883,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":585964,"timestamp":85645766231,"id":89,"parentId":31,"tags":{},"startTime":1778893618013,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":604124,"timestamp":85645748111,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778893617994,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":587779,"timestamp":85645765074,"id":88,"parentId":24,"tags":{},"startTime":1778893618011,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":607356,"timestamp":85645745532,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778893617992,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":596200,"timestamp":85645760400,"id":85,"parentId":47,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":606654,"timestamp":85645749986,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":598470,"timestamp":85645760323,"id":77,"parentId":39,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":609702,"timestamp":85645749379,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":603506,"timestamp":85645760352,"id":80,"parentId":42,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":614286,"timestamp":85645749611,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":656983,"timestamp":85645760372,"id":82,"parentId":44,"tags":{},"startTime":1778893618007,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":667692,"timestamp":85645749744,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778893617996,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":656695,"timestamp":85645768683,"id":96,"parentId":56,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":672791,"timestamp":85645753116,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778893617999,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":666761,"timestamp":85645768645,"id":93,"parentId":52,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":683339,"timestamp":85645752133,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778893617998,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":666972,"timestamp":85645768692,"id":97,"parentId":57,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":682422,"timestamp":85645753285,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778893618000,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":667231,"timestamp":85645768619,"id":91,"parentId":50,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":684078,"timestamp":85645751804,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778893617998,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":672818,"timestamp":85645768591,"id":90,"parentId":23,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":696200,"timestamp":85645745337,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778893617992,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":673016,"timestamp":85645768705,"id":98,"parentId":59,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":688075,"timestamp":85645753693,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778893618000,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":676834,"timestamp":85645768735,"id":100,"parentId":61,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":691742,"timestamp":85645753885,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778893618000,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":662854,"timestamp":85645785801,"id":102,"parentId":55,"tags":{},"startTime":1778893618032,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":696018,"timestamp":85645752678,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778893617999,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":674466,"timestamp":85645774317,"id":101,"parentId":58,"tags":{},"startTime":1778893618021,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":695400,"timestamp":85645753410,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778893618000,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":681676,"timestamp":85645768659,"id":94,"parentId":53,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":698068,"timestamp":85645752315,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778893617999,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":682539,"timestamp":85645768722,"id":99,"parentId":60,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":697526,"timestamp":85645753790,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778893618000,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":684302,"timestamp":85645768671,"id":95,"parentId":54,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":700535,"timestamp":85645752505,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778893617999,"traceId":"8dc731dd57e9bff1"},{"name":"is-page-static","duration":687033,"timestamp":85645768635,"id":92,"parentId":51,"tags":{},"startTime":1778893618015,"traceId":"8dc731dd57e9bff1"},{"name":"check-page","duration":703724,"timestamp":85645751982,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778893617998,"traceId":"8dc731dd57e9bff1"},{"name":"static-check","duration":713879,"timestamp":85645741870,"id":19,"parentId":1,"tags":{},"startTime":1778893617988,"traceId":"8dc731dd57e9bff1"},{"name":"write-routes-manifest","duration":390,"timestamp":85646462588,"id":104,"parentId":1,"tags":{},"startTime":1778893618709,"traceId":"8dc731dd57e9bff1"},{"name":"load-dotenv","duration":46,"timestamp":85646474149,"id":107,"parentId":106,"tags":{},"startTime":1778893618720,"traceId":"8dc731dd57e9bff1"},{"name":"run-export-path-map","duration":562,"timestamp":85646478169,"id":108,"parentId":106,"tags":{},"startTime":1778893618724,"traceId":"8dc731dd57e9bff1"},{"name":"next-export","duration":570203,"timestamp":85646472896,"id":106,"parentId":1,"tags":{},"startTime":1778893618719,"traceId":"8dc731dd57e9bff1"}]
2
- [{"name":"move-exported-app-not-found-","duration":1710,"timestamp":85647046254,"id":109,"parentId":105,"tags":{},"startTime":1778893619293,"traceId":"8dc731dd57e9bff1"},{"name":"move-exported-app-global-error-","duration":1000,"timestamp":85647048074,"id":110,"parentId":105,"tags":{},"startTime":1778893619294,"traceId":"8dc731dd57e9bff1"},{"name":"static-generation","duration":584414,"timestamp":85646466635,"id":105,"parentId":1,"tags":{},"startTime":1778893618713,"traceId":"8dc731dd57e9bff1"},{"name":"write-routes-manifest","duration":543,"timestamp":85647051273,"id":111,"parentId":1,"tags":{},"startTime":1778893619298,"traceId":"8dc731dd57e9bff1"},{"name":"print-tree-view","duration":4871,"timestamp":85647059665,"id":112,"parentId":1,"tags":{},"startTime":1778893619306,"traceId":"8dc731dd57e9bff1"},{"name":"write-route-bundle-stats","duration":19175,"timestamp":85647064575,"id":113,"parentId":1,"tags":{},"startTime":1778893619311,"traceId":"8dc731dd57e9bff1"},{"name":"telemetry-flush","duration":34450,"timestamp":85647083781,"id":114,"parentId":1,"tags":{},"startTime":1778893619330,"traceId":"8dc731dd57e9bff1"},{"name":"next-build","duration":16415272,"timestamp":85630702999,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778893602949,"traceId":"8dc731dd57e9bff1"}]
1
+ [{"name":"generate-buildid","duration":340,"timestamp":86376737840,"id":4,"parentId":1,"tags":{},"startTime":1778894348984,"traceId":"50acbbc424f66a4b"},{"name":"load-custom-routes","duration":449,"timestamp":86376738322,"id":5,"parentId":1,"tags":{},"startTime":1778894348985,"traceId":"50acbbc424f66a4b"},{"name":"create-dist-dir","duration":628,"timestamp":86376738810,"id":6,"parentId":1,"tags":{},"startTime":1778894348985,"traceId":"50acbbc424f66a4b"},{"name":"clean","duration":451,"timestamp":86376740066,"id":7,"parentId":1,"tags":{},"startTime":1778894348986,"traceId":"50acbbc424f66a4b"},{"name":"discover-routes","duration":10508,"timestamp":86376825527,"id":8,"parentId":1,"tags":{},"startTime":1778894349072,"traceId":"50acbbc424f66a4b"},{"name":"create-root-mapping","duration":151,"timestamp":86376836111,"id":9,"parentId":1,"tags":{},"startTime":1778894349082,"traceId":"50acbbc424f66a4b"},{"name":"generate-route-types","duration":39763,"timestamp":86376838884,"id":10,"parentId":1,"tags":{},"startTime":1778894349085,"traceId":"50acbbc424f66a4b"},{"name":"public-dir-conflict-check","duration":165,"timestamp":86376878882,"id":11,"parentId":1,"tags":{},"startTime":1778894349125,"traceId":"50acbbc424f66a4b"},{"name":"generate-routes-manifest","duration":6554,"timestamp":86376879226,"id":12,"parentId":1,"tags":{},"startTime":1778894349126,"traceId":"50acbbc424f66a4b"},{"name":"run-turbopack","duration":9181015,"timestamp":86376894117,"id":14,"parentId":1,"tags":{},"startTime":1778894349140,"traceId":"50acbbc424f66a4b"},{"name":"turbopack-build-events","duration":106,"timestamp":86377253195,"id":15,"parentId":1,"tags":{},"startTime":1778894349499,"traceId":"50acbbc424f66a4b"},{"name":"run-typescript","duration":12494925,"timestamp":86386087157,"id":16,"parentId":1,"tags":{},"startTime":1778894358333,"traceId":"50acbbc424f66a4b"},{"name":"generate-required-server-files","duration":6401,"timestamp":86398583384,"id":18,"parentId":1,"tags":{},"startTime":1778894370830,"traceId":"50acbbc424f66a4b"},{"name":"check-static-error-page","duration":17351,"timestamp":86398757342,"id":20,"parentId":19,"tags":{},"startTime":1778894371004,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":833267,"timestamp":86398782473,"id":66,"parentId":27,"tags":{},"startTime":1778894371029,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":851693,"timestamp":86398764237,"id":27,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1778894371011,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":836602,"timestamp":86398782969,"id":68,"parentId":29,"tags":{},"startTime":1778894371029,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":855098,"timestamp":86398764532,"id":29,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1778894371011,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":830472,"timestamp":86398790617,"id":69,"parentId":30,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":856437,"timestamp":86398764701,"id":30,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1778894371011,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":851417,"timestamp":86398782333,"id":65,"parentId":26,"tags":{},"startTime":1778894371029,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":869714,"timestamp":86398764090,"id":26,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1778894371010,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":863740,"timestamp":86398790982,"id":72,"parentId":34,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":889327,"timestamp":86398765469,"id":34,"parentId":19,"tags":{"page":"/api/hub/license"},"startTime":1778894371012,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":870181,"timestamp":86398790804,"id":70,"parentId":32,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":895869,"timestamp":86398765197,"id":32,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1778894371011,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":870465,"timestamp":86398790885,"id":71,"parentId":33,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":896046,"timestamp":86398765346,"id":33,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1778894371012,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":880939,"timestamp":86398780600,"id":63,"parentId":22,"tags":{},"startTime":1778894371027,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":900985,"timestamp":86398760594,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1778894371007,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":900079,"timestamp":86398780212,"id":62,"parentId":21,"tags":{},"startTime":1778894371026,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":921411,"timestamp":86398758944,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1778894371005,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":919314,"timestamp":86398791030,"id":73,"parentId":35,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":944804,"timestamp":86398765605,"id":35,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1778894371012,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":919392,"timestamp":86398791183,"id":75,"parentId":37,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":944260,"timestamp":86398766340,"id":37,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":919684,"timestamp":86398791146,"id":74,"parentId":36,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":944710,"timestamp":86398766153,"id":36,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1778894371012,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":937084,"timestamp":86398791250,"id":80,"parentId":42,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":961707,"timestamp":86398766703,"id":42,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":937397,"timestamp":86398791241,"id":79,"parentId":41,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":962038,"timestamp":86398766635,"id":41,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":951671,"timestamp":86398791228,"id":78,"parentId":40,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":976395,"timestamp":86398766573,"id":40,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":953064,"timestamp":86398791276,"id":82,"parentId":44,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":977567,"timestamp":86398766824,"id":44,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":960309,"timestamp":86398791263,"id":81,"parentId":43,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":984872,"timestamp":86398766764,"id":43,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":960523,"timestamp":86398791289,"id":83,"parentId":45,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":984965,"timestamp":86398766889,"id":45,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":972824,"timestamp":86398791326,"id":86,"parentId":48,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":993374,"timestamp":86398770840,"id":48,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1778894371017,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":978911,"timestamp":86398791313,"id":85,"parentId":47,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":999574,"timestamp":86398770702,"id":47,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1778894371017,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":981987,"timestamp":86398791335,"id":87,"parentId":49,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1002417,"timestamp":86398770971,"id":49,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1778894371017,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":986219,"timestamp":86398791211,"id":77,"parentId":39,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1010970,"timestamp":86398766509,"id":39,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":976485,"timestamp":86398803886,"id":89,"parentId":31,"tags":{},"startTime":1778894371050,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1015566,"timestamp":86398764852,"id":31,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1778894371011,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":992539,"timestamp":86398791299,"id":84,"parentId":46,"tags":{},"startTime":1778894371038,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1016925,"timestamp":86398766962,"id":46,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":990140,"timestamp":86398802704,"id":88,"parentId":24,"tags":{},"startTime":1778894371049,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1031703,"timestamp":86398761193,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1778894371007,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":962668,"timestamp":86398831457,"id":90,"parentId":23,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1033288,"timestamp":86398760891,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1778894371007,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":976679,"timestamp":86398831543,"id":94,"parentId":53,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1036154,"timestamp":86398772113,"id":53,"parentId":19,"tags":{"page":"/node"},"startTime":1778894371018,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":992108,"timestamp":86398831557,"id":95,"parentId":54,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1051400,"timestamp":86398772327,"id":54,"parentId":19,"tags":{"page":"/nodes"},"startTime":1778894371019,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1040898,"timestamp":86398791201,"id":76,"parentId":38,"tags":{},"startTime":1778894371037,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1065714,"timestamp":86398766442,"id":38,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1778894371013,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1084175,"timestamp":86398782773,"id":67,"parentId":28,"tags":{},"startTime":1778894371029,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1102650,"timestamp":86398764388,"id":28,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1778894371011,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1035661,"timestamp":86398831571,"id":96,"parentId":56,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1094080,"timestamp":86398773184,"id":56,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1778894371019,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1035893,"timestamp":86398831503,"id":91,"parentId":50,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1096056,"timestamp":86398771366,"id":50,"parentId":19,"tags":{"page":"/login"},"startTime":1778894371018,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1087683,"timestamp":86398782147,"id":64,"parentId":25,"tags":{},"startTime":1778894371028,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1106022,"timestamp":86398763887,"id":25,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1778894371010,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1060217,"timestamp":86398831626,"id":100,"parentId":61,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1117470,"timestamp":86398774432,"id":61,"parentId":19,"tags":{"page":"/tasks"},"startTime":1778894371021,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1023499,"timestamp":86398878686,"id":102,"parentId":55,"tags":{},"startTime":1778894371125,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1129659,"timestamp":86398772576,"id":55,"parentId":19,"tags":{"page":"/"},"startTime":1778894371019,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1071796,"timestamp":86398831611,"id":99,"parentId":60,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1129188,"timestamp":86398774271,"id":60,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1778894371021,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1075799,"timestamp":86398831581,"id":97,"parentId":57,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1134049,"timestamp":86398773375,"id":57,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1778894371020,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1103644,"timestamp":86398831529,"id":93,"parentId":52,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1163384,"timestamp":86398771893,"id":52,"parentId":19,"tags":{"page":"/messages"},"startTime":1778894371018,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1107816,"timestamp":86398831519,"id":92,"parentId":51,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1167744,"timestamp":86398771726,"id":51,"parentId":19,"tags":{"page":"/logs"},"startTime":1778894371018,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1134523,"timestamp":86398831594,"id":98,"parentId":59,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1192073,"timestamp":86398774100,"id":59,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1778894371020,"traceId":"50acbbc424f66a4b"},{"name":"is-page-static","duration":1146153,"timestamp":86398831640,"id":101,"parentId":58,"tags":{},"startTime":1778894371078,"traceId":"50acbbc424f66a4b"},{"name":"check-page","duration":1204328,"timestamp":86398773527,"id":58,"parentId":19,"tags":{"page":"/settings"},"startTime":1778894371020,"traceId":"50acbbc424f66a4b"},{"name":"static-check","duration":1221729,"timestamp":86398756202,"id":19,"parentId":1,"tags":{},"startTime":1778894371002,"traceId":"50acbbc424f66a4b"},{"name":"write-routes-manifest","duration":503,"timestamp":86399985029,"id":104,"parentId":1,"tags":{},"startTime":1778894372231,"traceId":"50acbbc424f66a4b"},{"name":"load-dotenv","duration":81,"timestamp":86399999947,"id":107,"parentId":106,"tags":{},"startTime":1778894372246,"traceId":"50acbbc424f66a4b"},{"name":"run-export-path-map","duration":935,"timestamp":86400004680,"id":108,"parentId":106,"tags":{},"startTime":1778894372251,"traceId":"50acbbc424f66a4b"},{"name":"next-export","duration":779013,"timestamp":86399998140,"id":106,"parentId":1,"tags":{},"startTime":1778894372244,"traceId":"50acbbc424f66a4b"}]
2
+ [{"name":"move-exported-app-not-found-","duration":2579,"timestamp":86400782081,"id":109,"parentId":105,"tags":{},"startTime":1778894373028,"traceId":"50acbbc424f66a4b"},{"name":"move-exported-app-global-error-","duration":1612,"timestamp":86400784776,"id":110,"parentId":105,"tags":{},"startTime":1778894373031,"traceId":"50acbbc424f66a4b"},{"name":"static-generation","duration":798788,"timestamp":86399990209,"id":105,"parentId":1,"tags":{},"startTime":1778894372236,"traceId":"50acbbc424f66a4b"},{"name":"write-routes-manifest","duration":506,"timestamp":86400789233,"id":111,"parentId":1,"tags":{},"startTime":1778894373036,"traceId":"50acbbc424f66a4b"},{"name":"print-tree-view","duration":9650,"timestamp":86400798772,"id":112,"parentId":1,"tags":{},"startTime":1778894373045,"traceId":"50acbbc424f66a4b"},{"name":"write-route-bundle-stats","duration":24594,"timestamp":86400808462,"id":113,"parentId":1,"tags":{},"startTime":1778894373055,"traceId":"50acbbc424f66a4b"},{"name":"telemetry-flush","duration":78648,"timestamp":86400833094,"id":114,"parentId":1,"tags":{},"startTime":1778894373079,"traceId":"50acbbc424f66a4b"},{"name":"next-build","duration":24234382,"timestamp":86376677410,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778894348924,"traceId":"50acbbc424f66a4b"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5640042,"timestamp":85630897949,"id":14,"parentId":1,"tags":{},"startTime":1778893603144,"traceId":"8dc731dd57e9bff1"},{"name":"turbopack-build-events","duration":72,"timestamp":85631177481,"id":15,"parentId":1,"tags":{},"startTime":1778893603424,"traceId":"8dc731dd57e9bff1"},{"name":"run-typescript","duration":9016647,"timestamp":85636547350,"id":16,"parentId":1,"tags":{},"startTime":1778893608794,"traceId":"8dc731dd57e9bff1"},{"name":"static-check","duration":713879,"timestamp":85645741870,"id":19,"parentId":1,"tags":{},"startTime":1778893617988,"traceId":"8dc731dd57e9bff1"},{"name":"static-generation","duration":584414,"timestamp":85646466635,"id":105,"parentId":1,"tags":{},"startTime":1778893618713,"traceId":"8dc731dd57e9bff1"},{"name":"telemetry-flush","duration":34450,"timestamp":85647083781,"id":114,"parentId":1,"tags":{},"startTime":1778893619330,"traceId":"8dc731dd57e9bff1"},{"name":"next-build","duration":16415272,"timestamp":85630702999,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778893602949,"traceId":"8dc731dd57e9bff1"}]
1
+ [{"name":"run-turbopack","duration":9181015,"timestamp":86376894117,"id":14,"parentId":1,"tags":{},"startTime":1778894349140,"traceId":"50acbbc424f66a4b"},{"name":"turbopack-build-events","duration":106,"timestamp":86377253195,"id":15,"parentId":1,"tags":{},"startTime":1778894349499,"traceId":"50acbbc424f66a4b"},{"name":"run-typescript","duration":12494925,"timestamp":86386087157,"id":16,"parentId":1,"tags":{},"startTime":1778894358333,"traceId":"50acbbc424f66a4b"},{"name":"static-check","duration":1221729,"timestamp":86398756202,"id":19,"parentId":1,"tags":{},"startTime":1778894371002,"traceId":"50acbbc424f66a4b"},{"name":"static-generation","duration":798788,"timestamp":86399990209,"id":105,"parentId":1,"tags":{},"startTime":1778894372236,"traceId":"50acbbc424f66a4b"},{"name":"telemetry-flush","duration":78648,"timestamp":86400833094,"id":114,"parentId":1,"tags":{},"startTime":1778894373079,"traceId":"50acbbc424f66a4b"},{"name":"next-build","duration":24234382,"timestamp":86376677410,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778894348924,"traceId":"50acbbc424f66a4b"}]
@@ -1512,7 +1512,24 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1512
1512
  // (10→15 bg, 20→30 border) only when clickable.
1513
1513
  // transition-colors duration-200 blends the swap to
1514
1514
  // match R193's timing on the active-links chip.
1515
- className={`px-2.5 py-1 rounded-md border anet-topo-chip-focus transition-colors duration-200 ${
1515
+ /* Round 232 / Loop: HTML chip row picks up the
1516
+ tabular-nums info-density treatment R224-R230
1517
+ established on the SVG side. The chip text reads
1518
+ "{N} working"; when workingCount crosses 9→10
1519
+ the leading digit's width shift propagates the
1520
+ trailing ' working' label right by the digit-vs-
1521
+ control glyph delta, and the chip's right edge
1522
+ re-flows because the parent is inline flex. The
1523
+ Tailwind `tabular-nums` utility sets font-variant-
1524
+ numeric: tabular-nums, locking the digit width
1525
+ so the chip text + chip width stay stable across
1526
+ all counter values. Sibling chips (online,
1527
+ active-links) get the same treatment in this
1528
+ round so the three-chip row reads uniformly.
1529
+ 7th surface in the info-density tabular-nums
1530
+ sweep — and the first on the HTML side
1531
+ (previous 6 were SVG <text>/<tspan>). */
1532
+ className={`tabular-nums px-2.5 py-1 rounded-md border anet-topo-chip-focus transition-colors duration-200 ${
1516
1533
  workingCount > 0
1517
1534
  ? 'bg-green-500/10 text-green-300 border-green-500/20 hover:bg-green-500/15 hover:border-green-500/30'
1518
1535
  : 'bg-green-500/10 text-green-300 border-green-500/20'
@@ -1589,7 +1606,10 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
1589
1606
  // working chip · green 10→15 (R201)
1590
1607
  // online chip · cyan 10→15 (R201)
1591
1608
  // active-links · gray → cyan (R193)
1592
- className={`px-2.5 py-1 rounded-md border anet-topo-chip-focus transition-colors duration-200 ${
1609
+ /* Round 232 / Loop: tabular-nums on online chip
1610
+ (sibling treatment to working chip — same row,
1611
+ same digit-jitter physics on count crossings). */
1612
+ className={`tabular-nums px-2.5 py-1 rounded-md border anet-topo-chip-focus transition-colors duration-200 ${
1593
1613
  onlineNodes.length > 0
1594
1614
  ? 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20 hover:bg-cyan-500/15 hover:border-cyan-500/30'
1595
1615
  : 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20'
@@ -2253,7 +2273,11 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
2253
2273
  // we replicate color/bg/border transitions inline
2254
2274
  // alongside the new opacity 200ms — same splice idiom
2255
2275
  // R201 used on the working/online chips.
2256
- className={`hidden sm:inline px-2.5 py-1 rounded-md border anet-topo-chip-focus ${
2276
+ /* Round 232 / Loop: tabular-nums on active-links chip
2277
+ (third chip in the row — matches working + online
2278
+ chip treatment so all three digits in the chip row
2279
+ stay width-stable across counter crossings). */
2280
+ className={`tabular-nums hidden sm:inline px-2.5 py-1 rounded-md border anet-topo-chip-focus ${
2257
2281
  isInteractive
2258
2282
  ? 'bg-gray-500/10 text-gray-400 border-gray-500/20 hover:bg-cyan-500/10 hover:text-cyan-200 hover:border-cyan-500/30'
2259
2283
  : 'bg-gray-500/10 text-gray-400 border-gray-500/20'
@@ -3177,6 +3201,23 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3177
3201
  const path = curvePath(from, to, lift);
3178
3202
  const width = Math.min(2 + link.count, 7);
3179
3203
  const duration = Math.max(0.9, 2.6 / Math.sqrt(link.count));
3204
+ // Round 231 / Loop: per-edge phase stagger lifted into a
3205
+ // named constant so the R75 arrival ping + R76 dispatch
3206
+ // pulse SMIL animates can RE-COUPLE to the R103 particle's
3207
+ // cycle. Pre-R103 (when particle started at phase 0) the
3208
+ // ping fired at "near end of cycle" (-0.92*dur) and dispatch
3209
+ // at "cycle start" (0) — both phase-coincident with particle
3210
+ // arrival/departure respectively. R103's golden-ratio
3211
+ // stagger broke that coupling — particle now started at
3212
+ // phase (index*0.37)%dur while ping+pulse stayed at fixed
3213
+ // offsets, so the rings fired at random moments relative
3214
+ // to particle position. R231 expresses dispatch_begin and
3215
+ // arrival_begin in terms of THIS stagger so they fire
3216
+ // exactly when the particle is at source / near destination
3217
+ // respectively — restoring R75/R76's original semantic
3218
+ // and unifying the three SMIL elements into one
3219
+ // synchronised per-edge animation set.
3220
+ const stagger = (index * 0.37) % duration;
3180
3221
  // Round 10 / Loop: freshness fade. An edge that fired ≤30s ago
3181
3222
  // stays at full intensity; over 5 minutes it decays to ~35%.
3182
3223
  // Surfaces "what's happening now" vs background chatter without
@@ -3353,7 +3394,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3353
3394
  <circle r="4" fill={pal.flowParticle} filter={isLight ? undefined : 'url(#topo-glow)'} opacity={Math.min(1, fresh * edgeOpacityMul)}>
3354
3395
  <animateMotion
3355
3396
  dur={`${duration}s`}
3356
- begin={`-${((index * 0.37) % duration).toFixed(3)}s`}
3397
+ begin={`-${stagger.toFixed(3)}s`}
3357
3398
  repeatCount="indefinite"
3358
3399
  path={path}
3359
3400
  />
@@ -3402,7 +3443,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3402
3443
  attributeName="r"
3403
3444
  values="0;14;22"
3404
3445
  dur={`${duration}s`}
3405
- begin={`-${(duration * 0.92).toFixed(2)}s`}
3446
+ begin={`-${((stagger + duration * 0.92) % duration).toFixed(3)}s`}
3406
3447
  repeatCount="indefinite"
3407
3448
  calcMode="spline"
3408
3449
  keyTimes="0;0.5;1"
@@ -3412,7 +3453,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3412
3453
  attributeName="opacity"
3413
3454
  values="0;0.55;0"
3414
3455
  dur={`${duration}s`}
3415
- begin={`-${(duration * 0.92).toFixed(2)}s`}
3456
+ begin={`-${((stagger + duration * 0.92) % duration).toFixed(3)}s`}
3416
3457
  repeatCount="indefinite"
3417
3458
  calcMode="spline"
3418
3459
  keyTimes="0;0.5;1"
@@ -3454,7 +3495,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3454
3495
  attributeName="r"
3455
3496
  values="0;12;18"
3456
3497
  dur={`${duration}s`}
3457
- begin="0s"
3498
+ begin={`-${stagger.toFixed(3)}s`}
3458
3499
  repeatCount="indefinite"
3459
3500
  calcMode="spline"
3460
3501
  keyTimes="0;0.5;1"
@@ -3464,7 +3505,7 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
3464
3505
  attributeName="opacity"
3465
3506
  values="0;0.45;0"
3466
3507
  dur={`${duration}s`}
3467
- begin="0s"
3508
+ begin={`-${stagger.toFixed(3)}s`}
3468
3509
  repeatCount="indefinite"
3469
3510
  calcMode="spline"
3470
3511
  keyTimes="0;0.5;1"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.4.6-preview.237",
3
+ "version": "0.4.6-preview.239",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
@@ -0,0 +1,111 @@
1
+ /* Round 232 verification: HTML chip row (working / online / active-
2
+ * links) gains the Tailwind `tabular-nums` utility class so the digit
3
+ * width stays stable across counter rollovers (9→10, 99→100).
4
+ *
5
+ * 7th surface in the info-density tabular-nums sweep — first on the
6
+ * HTML side (previous 6 were SVG <text>/<tspan>):
7
+ * R224 edge midpoint badge digit
8
+ * R225 hub center digit
9
+ * R225 recent panel header tspan
10
+ * R225 recent row count tspan
11
+ * R229 group-label · count chip
12
+ * R230 R58 status pip strip × 3 tiers
13
+ * R232 chip row × 3 chips (this round)
14
+ *
15
+ * Scenario: 4 working agents + 1 flow alpha→beta count=5. Drives
16
+ * workingCount=4, onlineNodes.length=4, flowLinks.length=1 → all
17
+ * three chips render with non-empty digits.
18
+ *
19
+ * Verifies for each chip:
20
+ * - element present at its data attr selector
21
+ * - getComputedStyle().fontVariantNumeric includes 'tabular-nums'
22
+ * - textContent starts with the expected digit (sanity)
23
+ */
24
+ import { chromium } from 'playwright';
25
+ import { readFileSync } from 'node:fs';
26
+
27
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
28
+ const browser = await chromium.launch({ headless: true });
29
+ const ctx = await browser.newContext({ viewport: { width: 1500, 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: 'claude-code-cli',
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: [
45
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
46
+ ] } });
47
+ });
48
+ const now = Date.now();
49
+ const msgs = [];
50
+ for (let i = 0; i < 5; i++) {
51
+ msgs.push({
52
+ id: `m${i}`, from_alias: 'alpha', to_alias: 'beta', content: 'hi',
53
+ network_id: 'default', created_at: new Date(now - (1000 + i * 50)).toISOString(),
54
+ });
55
+ }
56
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: msgs } }));
57
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
58
+
59
+ const page = await ctx.newPage();
60
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
61
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
62
+ await page.waitForSelector('[data-working-chip]', { timeout: 10000, state: 'attached' });
63
+ await page.waitForSelector('[data-online-chip]', { timeout: 10000, state: 'attached' });
64
+ await page.waitForSelector('[data-active-links-chip]', { timeout: 10000, state: 'attached' });
65
+ await page.waitForTimeout(300);
66
+
67
+ const out = await page.evaluate(() => {
68
+ const grab = (sel, expectedPrefix) => {
69
+ const el = document.querySelector(sel);
70
+ if (!el) return null;
71
+ return {
72
+ present: true,
73
+ fontVarNumeric: getComputedStyle(el).fontVariantNumeric,
74
+ hasUtility: el.className.split(/\s+/).includes('tabular-nums'),
75
+ textStartsWith: (el.textContent || '').trim().startsWith(expectedPrefix),
76
+ text: (el.textContent || '').trim().slice(0, 30),
77
+ };
78
+ };
79
+ return {
80
+ working: grab('[data-working-chip]', '4 working'),
81
+ online: grab('[data-online-chip]', '4 online'),
82
+ activeLinks: grab('[data-active-links-chip]', '1 active'),
83
+ };
84
+ });
85
+ await browser.close();
86
+
87
+ const hasTab = (s) => /tabular-nums/.test(s || '');
88
+ const present = (o) => o && o.present;
89
+
90
+ const results = {
91
+ working_present: present(out.working),
92
+ working_class_utility: out.working?.hasUtility === true,
93
+ working_fvn_tabular: hasTab(out.working?.fontVarNumeric),
94
+ working_text_ok: out.working?.textStartsWith === true,
95
+
96
+ online_present: present(out.online),
97
+ online_class_utility: out.online?.hasUtility === true,
98
+ online_fvn_tabular: hasTab(out.online?.fontVarNumeric),
99
+ online_text_ok: out.online?.textStartsWith === true,
100
+
101
+ active_present: present(out.activeLinks),
102
+ active_class_utility: out.activeLinks?.hasUtility === true,
103
+ active_fvn_tabular: hasTab(out.activeLinks?.fontVarNumeric),
104
+ active_text_ok: out.activeLinks?.textStartsWith === true,
105
+ };
106
+ const ok = Object.values(results).every(Boolean);
107
+ console.log(`${ok ? '✅' : '❌'} chip row tabular-nums:`, JSON.stringify(results),
108
+ '\n working: ', out.working,
109
+ '\n online: ', out.online,
110
+ '\n activeLinks:', out.activeLinks);
111
+ process.exit(ok ? 0 : 1);
@@ -0,0 +1,148 @@
1
+ /* Round 231 verification: edge SMIL trio (R103 particle motion +
2
+ * R76 dispatch pulse + R75 arrival ping) now share a single per-edge
3
+ * stagger so all three fire phase-coherently with the particle:
4
+ *
5
+ * particle.animateMotion.begin = -stagger
6
+ * dispatch.animate.begin = -stagger (= particle's)
7
+ * arrival.animate.begin = -(stagger + 0.92*dur) mod dur
8
+ *
9
+ * where stagger = (edgeIndex * 0.37) % duration,
10
+ * duration = max(0.9, 2.6 / sqrt(link.count)).
11
+ *
12
+ * Scenario: 4 working agents + 2 flows (alpha→beta count=5, gamma→
13
+ * delta count=4) — both flows have count ≥ 3 so dispatch pulse
14
+ * fires on both, and fresh > 0.5 so arrival ping fires on both.
15
+ *
16
+ * Per edge:
17
+ * - probe particle's animateMotion.begin
18
+ * - probe dispatch's two <animate>.begin (r + opacity, must match)
19
+ * - probe arrival's two <animate>.begin (r + opacity, must match)
20
+ * - verify all three follow the formula given index + duration
21
+ */
22
+ import { chromium } from 'playwright';
23
+ import { readFileSync } from 'node:fs';
24
+
25
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
26
+ const browser = await chromium.launch({ headless: true });
27
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
28
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
29
+ await ctx.addInitScript(() => {
30
+ try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
31
+ });
32
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
33
+ await ctx.route('**/api/hub/status*', async (route) => {
34
+ const r = await route.fetch();
35
+ const b = await r.json();
36
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
37
+ const mk = (alias) => ({
38
+ alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
39
+ network_id: nid, project_dir: null,
40
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
41
+ });
42
+ await route.fulfill({ response: r, json: { ...b, sessions: [
43
+ mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
44
+ ] } });
45
+ });
46
+ const now = Date.now();
47
+ const msgs = [];
48
+ // flow 0: alpha→beta count=5 — sorted by recent activity, this will be
49
+ // the more-recent flow; edge index depends on flowLinks.sort by last_at desc.
50
+ for (let i = 0; i < 5; i++) {
51
+ msgs.push({
52
+ id: `ab${i}`, from_alias: 'alpha', to_alias: 'beta', content: 'hi',
53
+ network_id: 'default', created_at: new Date(now - (500 + i * 50)).toISOString(),
54
+ });
55
+ }
56
+ // flow 1: gamma→delta count=4 — older
57
+ for (let i = 0; i < 4; i++) {
58
+ msgs.push({
59
+ id: `gd${i}`, from_alias: 'gamma', to_alias: 'delta', content: 'hi',
60
+ network_id: 'default', created_at: new Date(now - (5000 + i * 50)).toISOString(),
61
+ });
62
+ }
63
+ await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: msgs } }));
64
+ await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
65
+
66
+ const page = await ctx.newPage();
67
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
68
+ await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
69
+ await page.waitForSelector('[data-arrival-ping]', { timeout: 10000, state: 'attached' });
70
+ await page.waitForSelector('[data-dispatch-pulse]', { timeout: 10000, state: 'attached' });
71
+ await page.waitForTimeout(400);
72
+
73
+ const probe = await page.evaluate(() => {
74
+ // Edges keyed by link.key ("from→to"). We grab pairs of (arrival, dispatch)
75
+ // by data attr, plus particle's animateMotion inside the edge <g>.
76
+ const pings = Array.from(document.querySelectorAll('[data-arrival-ping]'));
77
+ const pulses = Array.from(document.querySelectorAll('[data-dispatch-pulse]'));
78
+ // Each ping/pulse lives inside an edge <g> that also contains the animateMotion
79
+ // for the particle. We walk up to find the shared parent.
80
+ return pings.map((ping) => {
81
+ const key = ping.getAttribute('data-arrival-ping');
82
+ const pulse = pulses.find(p => p.getAttribute('data-dispatch-pulse') === key);
83
+ // animateMotion lives in a sibling <circle> within the same parent <g>
84
+ const edgeG = ping.closest('g[data-edge-visible-parent]') || ping.parentElement;
85
+ const motion = edgeG?.querySelector('animateMotion');
86
+ const pingAnims = Array.from(ping.querySelectorAll('animate'));
87
+ const pulseAnims = pulse ? Array.from(pulse.querySelectorAll('animate')) : [];
88
+ return {
89
+ key,
90
+ pingBeginR: pingAnims.find(a => a.getAttribute('attributeName') === 'r')?.getAttribute('begin') || null,
91
+ pingBeginOpacity: pingAnims.find(a => a.getAttribute('attributeName') === 'opacity')?.getAttribute('begin') || null,
92
+ pulseBeginR: pulseAnims.find(a => a.getAttribute('attributeName') === 'r')?.getAttribute('begin') || null,
93
+ pulseBeginOpacity: pulseAnims.find(a => a.getAttribute('attributeName') === 'opacity')?.getAttribute('begin') || null,
94
+ motionBegin: motion?.getAttribute('begin') || null,
95
+ motionDur: motion?.getAttribute('dur') || null,
96
+ };
97
+ });
98
+ });
99
+ await browser.close();
100
+
101
+ const parseS = (s) => {
102
+ if (!s) return null;
103
+ const m = String(s).match(/^-?(\d+(?:\.\d+)?)s$/);
104
+ if (!m) return null;
105
+ return s.startsWith('-') ? -parseFloat(m[1]) : parseFloat(m[1]);
106
+ };
107
+
108
+ const close = (a, b, eps = 0.005) => Math.abs(a - b) < eps;
109
+
110
+ const validate = (edge) => {
111
+ const dur = parseS(edge.motionDur);
112
+ const motionBegin = parseS(edge.motionBegin); // -stagger
113
+ const pingR = parseS(edge.pingBeginR);
114
+ const pingOp = parseS(edge.pingBeginOpacity);
115
+ const pulseR = parseS(edge.pulseBeginR);
116
+ const pulseOp = parseS(edge.pulseBeginOpacity);
117
+ if (dur === null || motionBegin === null || motionBegin > 0) return null;
118
+ const stagger = -motionBegin; // positive
119
+ // Expected ping begin = -(stagger + 0.92*dur) mod dur → in [-dur, 0]
120
+ const wrapped = (stagger + 0.92 * dur) % dur;
121
+ const expectedPing = -wrapped;
122
+ return {
123
+ dur,
124
+ motionBegin,
125
+ stagger,
126
+ expectedPing,
127
+ pulseR,
128
+ pulseOp,
129
+ pingR,
130
+ pingOp,
131
+ dispatch_matches_particle: close(pulseR, motionBegin) && close(pulseOp, motionBegin),
132
+ arrival_matches_formula: close(pingR, expectedPing) && close(pingOp, expectedPing),
133
+ };
134
+ };
135
+
136
+ const edges = probe.map(validate).filter(e => e !== null);
137
+
138
+ const results = {
139
+ at_least_one_edge: edges.length >= 1,
140
+ all_dispatch_match_particle: edges.every(e => e.dispatch_matches_particle),
141
+ all_arrival_match_formula: edges.every(e => e.arrival_matches_formula),
142
+ pulse_r_op_consistent: edges.every(e => Math.abs(e.pulseR - e.pulseOp) < 0.005),
143
+ ping_r_op_consistent: edges.every(e => Math.abs(e.pingR - e.pingOp) < 0.005),
144
+ };
145
+ const ok = Object.values(results).every(Boolean);
146
+ console.log(`${ok ? '✅' : '❌'} edge SMIL sync:`, JSON.stringify(results),
147
+ '\n edges:', edges);
148
+ process.exit(ok ? 0 : 1);