@sleep2agi/agent-network-dashboard 0.6.3-preview.13 → 0.6.3-preview.14

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 (180) 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 +10 -10
  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 +3 -3
  68. package/.next/server/app/node.segments/_full.segment.rsc +3 -3
  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 +2 -2
  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 +3 -3
  77. package/.next/server/app/nodes.segments/_full.segment.rsc +3 -3
  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 +2 -2
  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/providers/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/providers.html +2 -2
  86. package/.next/server/app/providers.rsc +2 -2
  87. package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
  88. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  90. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  91. package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/providers.segments/providers.segment.rsc +1 -1
  93. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  94. package/.next/server/app/server-logs.html +2 -2
  95. package/.next/server/app/server-logs.rsc +2 -2
  96. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  97. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  98. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  99. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  100. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  101. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  102. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/servers.html +2 -2
  104. package/.next/server/app/servers.rsc +2 -2
  105. package/.next/server/app/servers.segments/_full.segment.rsc +2 -2
  106. package/.next/server/app/servers.segments/_head.segment.rsc +1 -1
  107. package/.next/server/app/servers.segments/_index.segment.rsc +2 -2
  108. package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
  109. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  110. package/.next/server/app/servers.segments/servers.segment.rsc +1 -1
  111. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  112. package/.next/server/app/settings/networks.html +2 -2
  113. package/.next/server/app/settings/networks.rsc +2 -2
  114. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  115. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  117. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  118. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  119. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  120. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/settings/tokens.html +2 -2
  124. package/.next/server/app/settings/tokens.rsc +2 -2
  125. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  131. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  132. package/.next/server/app/settings.html +2 -2
  133. package/.next/server/app/settings.rsc +3 -3
  134. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  135. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  136. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  137. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  138. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  139. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  140. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  141. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  142. package/.next/server/app/tasks.html +2 -2
  143. package/.next/server/app/tasks.rsc +2 -2
  144. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  145. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  146. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  147. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  148. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  149. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  150. package/.next/server/chunks/ssr/[root-of-the-server]__091su60._.js +2 -2
  151. package/.next/server/chunks/ssr/[root-of-the-server]__091su60._.js.map +1 -1
  152. package/.next/server/chunks/ssr/[root-of-the-server]__0vc.3k7._.js +1 -1
  153. package/.next/server/chunks/ssr/[root-of-the-server]__0vc.3k7._.js.map +1 -1
  154. package/.next/server/chunks/ssr/dash-loop-wt_0rh8p9o._.js +1 -1
  155. package/.next/server/chunks/ssr/dash-loop-wt_0rh8p9o._.js.map +1 -1
  156. package/.next/server/chunks/ssr/dash-loop-wt_app_0~.1~ew._.js +1 -1
  157. package/.next/server/chunks/ssr/dash-loop-wt_app_0~.1~ew._.js.map +1 -1
  158. package/.next/server/chunks/ssr/dash-loop-wt_app_13k3-ai._.js +1 -1
  159. package/.next/server/chunks/ssr/dash-loop-wt_app_13k3-ai._.js.map +1 -1
  160. package/.next/server/middleware-build-manifest.js +3 -3
  161. package/.next/server/pages/404.html +2 -2
  162. package/.next/server/pages/500.html +1 -1
  163. package/.next/server/server-reference-manifest.js +1 -1
  164. package/.next/server/server-reference-manifest.json +1 -1
  165. package/.next/static/chunks/{03f7qjy0ruw9t.js → 00_m_epf7h806.js} +1 -1
  166. package/.next/static/chunks/{0lxlyi7jro74u.js → 0_4kwsiltvp~l.js} +1 -1
  167. package/.next/static/chunks/{0_51bg9gfw9i..js → 0wd05udmyiwvk.js} +2 -2
  168. package/.next/static/chunks/{0z-4v9hqzypm-.js → 146p-0l764ojl.js} +1 -1
  169. package/.next/static/chunks/{0-7o8cy_tbz2u.js → 1566p5peao240.js} +1 -1
  170. package/.next/static/chunks/180t32do_.c~c.css +1 -0
  171. package/.next/trace +2 -2
  172. package/.next/trace-build +1 -1
  173. package/app/components/AgentCard.tsx +19 -2
  174. package/app/components/CommandCenter.tsx +5 -3
  175. package/app/components/TaskChatPanel.tsx +115 -22
  176. package/package.json +1 -1
  177. package/.next/static/chunks/0lgvx1l4roc~..css +0 -1
  178. /package/.next/static/{0BXnhObFcvXecoQLBxzRv → qpprKezd_zujs8ouGr3LY}/_buildManifest.js +0 -0
  179. /package/.next/static/{0BXnhObFcvXecoQLBxzRv → qpprKezd_zujs8ouGr3LY}/_clientMiddlewareManifest.js +0 -0
  180. /package/.next/static/{0BXnhObFcvXecoQLBxzRv → qpprKezd_zujs8ouGr3LY}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":450,"timestamp":5778214681201,"id":4,"parentId":1,"tags":{},"startTime":1784586186927,"traceId":"27a56f9227385779"},{"name":"load-custom-routes","duration":762,"timestamp":5778214681883,"id":5,"parentId":1,"tags":{},"startTime":1784586186928,"traceId":"27a56f9227385779"},{"name":"create-dist-dir","duration":1161,"timestamp":5778214682717,"id":6,"parentId":1,"tags":{},"startTime":1784586186929,"traceId":"27a56f9227385779"},{"name":"clean","duration":51011,"timestamp":5778214684865,"id":7,"parentId":1,"tags":{},"startTime":1784586186931,"traceId":"27a56f9227385779"},{"name":"discover-routes","duration":28942,"timestamp":5778214830738,"id":8,"parentId":1,"tags":{},"startTime":1784586187077,"traceId":"27a56f9227385779"},{"name":"create-root-mapping","duration":194,"timestamp":5778214859766,"id":9,"parentId":1,"tags":{},"startTime":1784586187106,"traceId":"27a56f9227385779"},{"name":"generate-route-types","duration":22378,"timestamp":5778214863160,"id":10,"parentId":1,"tags":{},"startTime":1784586187109,"traceId":"27a56f9227385779"},{"name":"public-dir-conflict-check","duration":106,"timestamp":5778214885722,"id":11,"parentId":1,"tags":{},"startTime":1784586187132,"traceId":"27a56f9227385779"},{"name":"generate-routes-manifest","duration":5674,"timestamp":5778214885954,"id":12,"parentId":1,"tags":{},"startTime":1784586187132,"traceId":"27a56f9227385779"},{"name":"run-turbopack","duration":9176141,"timestamp":5778214903948,"id":14,"parentId":1,"tags":{},"startTime":1784586187150,"traceId":"27a56f9227385779"},{"name":"turbopack-build-events","duration":80,"timestamp":5778215273116,"id":15,"parentId":1,"tags":{},"startTime":1784586187519,"traceId":"27a56f9227385779"},{"name":"run-typescript","duration":13770874,"timestamp":5778224129919,"id":16,"parentId":1,"tags":{},"startTime":1784586196376,"traceId":"27a56f9227385779"},{"name":"generate-required-server-files","duration":7393,"timestamp":5778237906254,"id":18,"parentId":1,"tags":{},"startTime":1784586210153,"traceId":"27a56f9227385779"},{"name":"check-static-error-page","duration":25468,"timestamp":5778238172391,"id":20,"parentId":19,"tags":{},"startTime":1784586210419,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":664460,"timestamp":5778238201427,"id":77,"parentId":30,"tags":{},"startTime":1784586210448,"traceId":"27a56f9227385779"},{"name":"check-page","duration":682305,"timestamp":5778238183788,"id":30,"parentId":19,"tags":{"page":"/api/anet/providers/probe"},"startTime":1784586210430,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":670087,"timestamp":5778238202086,"id":81,"parentId":35,"tags":{},"startTime":1784586210448,"traceId":"27a56f9227385779"},{"name":"check-page","duration":687340,"timestamp":5778238184906,"id":35,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1784586210431,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":706299,"timestamp":5778238201183,"id":75,"parentId":22,"tags":{},"startTime":1784586210447,"traceId":"27a56f9227385779"},{"name":"check-page","duration":732004,"timestamp":5778238175582,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1784586210422,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":718471,"timestamp":5778238200741,"id":74,"parentId":21,"tags":{},"startTime":1784586210447,"traceId":"27a56f9227385779"},{"name":"check-page","duration":745176,"timestamp":5778238174119,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1784586210420,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":819427,"timestamp":5778238202279,"id":82,"parentId":36,"tags":{},"startTime":1784586210449,"traceId":"27a56f9227385779"},{"name":"check-page","duration":836279,"timestamp":5778238185511,"id":36,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1784586210432,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":831535,"timestamp":5778238201773,"id":79,"parentId":33,"tags":{},"startTime":1784586210448,"traceId":"27a56f9227385779"},{"name":"check-page","duration":848767,"timestamp":5778238184623,"id":33,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1784586210431,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":831325,"timestamp":5778238202413,"id":84,"parentId":39,"tags":{},"startTime":1784586210449,"traceId":"27a56f9227385779"},{"name":"check-page","duration":846863,"timestamp":5778238186918,"id":39,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1784586210433,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":849695,"timestamp":5778238203808,"id":87,"parentId":42,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":866226,"timestamp":5778238187356,"id":42,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":855523,"timestamp":5778238203828,"id":88,"parentId":43,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":872020,"timestamp":5778238187421,"id":43,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":861089,"timestamp":5778238203842,"id":89,"parentId":44,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":878644,"timestamp":5778238187496,"id":44,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":865034,"timestamp":5778238201528,"id":78,"parentId":32,"tags":{},"startTime":1784586210448,"traceId":"27a56f9227385779"},{"name":"check-page","duration":882150,"timestamp":5778238184455,"id":32,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1784586210431,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":866785,"timestamp":5778238202444,"id":85,"parentId":40,"tags":{},"startTime":1784586210449,"traceId":"27a56f9227385779"},{"name":"check-page","duration":882161,"timestamp":5778238187119,"id":40,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1784586210433,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":874630,"timestamp":5778238203851,"id":90,"parentId":45,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":890948,"timestamp":5778238187599,"id":45,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":880954,"timestamp":5778238203888,"id":93,"parentId":50,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":895990,"timestamp":5778238188908,"id":50,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1784586210435,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":885496,"timestamp":5778238203901,"id":94,"parentId":51,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":900326,"timestamp":5778238189130,"id":51,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1784586210435,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":894493,"timestamp":5778238203913,"id":95,"parentId":52,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":909215,"timestamp":5778238189260,"id":52,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":894927,"timestamp":5778238203731,"id":86,"parentId":41,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":911454,"timestamp":5778238187256,"id":41,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":897559,"timestamp":5778238203879,"id":92,"parentId":48,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":913473,"timestamp":5778238188028,"id":48,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":899858,"timestamp":5778238203926,"id":96,"parentId":53,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":914452,"timestamp":5778238189375,"id":53,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":904942,"timestamp":5778238201922,"id":80,"parentId":34,"tags":{},"startTime":1784586210448,"traceId":"27a56f9227385779"},{"name":"check-page","duration":922151,"timestamp":5778238184759,"id":34,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1784586210431,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":903873,"timestamp":5778238203936,"id":97,"parentId":54,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":918342,"timestamp":5778238189511,"id":54,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":904483,"timestamp":5778238203962,"id":99,"parentId":56,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":918715,"timestamp":5778238189769,"id":56,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":909526,"timestamp":5778238203950,"id":98,"parentId":55,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":923874,"timestamp":5778238189658,"id":55,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":926665,"timestamp":5778238204029,"id":102,"parentId":61,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":939964,"timestamp":5778238190806,"id":61,"parentId":19,"tags":{"page":"/manifest.webmanifest"},"startTime":1784586210437,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":924156,"timestamp":5778238212133,"id":104,"parentId":25,"tags":{},"startTime":1784586210458,"traceId":"27a56f9227385779"},{"name":"check-page","duration":956071,"timestamp":5778238180301,"id":25,"parentId":19,"tags":{"page":"/api/anet/host-supervisors"},"startTime":1784586210427,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":926542,"timestamp":5778238214671,"id":105,"parentId":26,"tags":{},"startTime":1784586210461,"traceId":"27a56f9227385779"},{"name":"check-page","duration":959713,"timestamp":5778238181572,"id":26,"parentId":19,"tags":{"page":"/api/anet/node-config"},"startTime":1784586210428,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":948963,"timestamp":5778238203984,"id":101,"parentId":58,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":963054,"timestamp":5778238189998,"id":58,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":949355,"timestamp":5778238203865,"id":91,"parentId":46,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":965538,"timestamp":5778238187720,"id":46,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":935971,"timestamp":5778238217390,"id":106,"parentId":27,"tags":{},"startTime":1784586210464,"traceId":"27a56f9227385779"},{"name":"check-page","duration":971333,"timestamp":5778238182123,"id":27,"parentId":19,"tags":{"page":"/api/anet/node-create"},"startTime":1784586210428,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":954579,"timestamp":5778238202342,"id":83,"parentId":37,"tags":{},"startTime":1784586210449,"traceId":"27a56f9227385779"},{"name":"check-page","duration":971248,"timestamp":5778238185745,"id":37,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1784586210432,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":938881,"timestamp":5778238220032,"id":107,"parentId":28,"tags":{},"startTime":1784586210466,"traceId":"27a56f9227385779"},{"name":"check-page","duration":975831,"timestamp":5778238183129,"id":28,"parentId":19,"tags":{"page":"/api/anet/node-lifecycle"},"startTime":1784586210429,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":960831,"timestamp":5778238210733,"id":103,"parentId":24,"tags":{},"startTime":1784586210457,"traceId":"27a56f9227385779"},{"name":"check-page","duration":995208,"timestamp":5778238176418,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1784586210423,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":945787,"timestamp":5778238225994,"id":109,"parentId":38,"tags":{},"startTime":1784586210472,"traceId":"27a56f9227385779"},{"name":"check-page","duration":985954,"timestamp":5778238185877,"id":38,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1784586210432,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":942985,"timestamp":5778238228968,"id":111,"parentId":49,"tags":{},"startTime":1784586210475,"traceId":"27a56f9227385779"},{"name":"check-page","duration":983812,"timestamp":5778238188169,"id":49,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":947514,"timestamp":5778238224618,"id":108,"parentId":31,"tags":{},"startTime":1784586210471,"traceId":"27a56f9227385779"},{"name":"check-page","duration":988172,"timestamp":5778238183984,"id":31,"parentId":19,"tags":{"page":"/api/anet/providers"},"startTime":1784586210430,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":948839,"timestamp":5778238226904,"id":110,"parentId":47,"tags":{},"startTime":1784586210473,"traceId":"27a56f9227385779"},{"name":"check-page","duration":988008,"timestamp":5778238187796,"id":47,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1784586210434,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":990300,"timestamp":5778238203972,"id":100,"parentId":57,"tags":{},"startTime":1784586210450,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1004469,"timestamp":5778238189882,"id":57,"parentId":19,"tags":{"page":"/api/hub/upload"},"startTime":1784586210436,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":951572,"timestamp":5778238242957,"id":113,"parentId":59,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1004127,"timestamp":5778238190432,"id":59,"parentId":19,"tags":{"page":"/login"},"startTime":1784586210437,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":968712,"timestamp":5778238243044,"id":118,"parentId":66,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1019572,"timestamp":5778238192257,"id":66,"parentId":19,"tags":{"page":"/providers"},"startTime":1784586210439,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":986287,"timestamp":5778238243059,"id":119,"parentId":67,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1036913,"timestamp":5778238192508,"id":67,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1784586210439,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":999916,"timestamp":5778238243072,"id":120,"parentId":68,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1048860,"timestamp":5778238194228,"id":68,"parentId":19,"tags":{"page":"/servers"},"startTime":1784586210441,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1000442,"timestamp":5778238242982,"id":115,"parentId":62,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1052480,"timestamp":5778238190991,"id":62,"parentId":19,"tags":{"page":"/messages"},"startTime":1784586210437,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1009084,"timestamp":5778238243094,"id":122,"parentId":71,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1056971,"timestamp":5778238195261,"id":71,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1784586210442,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1016887,"timestamp":5778238242906,"id":112,"parentId":23,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"}]
2
- [{"name":"check-page","duration":1084214,"timestamp":5778238176122,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1784586210422,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1023272,"timestamp":5778238242972,"id":114,"parentId":60,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1075679,"timestamp":5778238190624,"id":60,"parentId":19,"tags":{"page":"/logs"},"startTime":1784586210437,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1023377,"timestamp":5778238243085,"id":121,"parentId":69,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1072018,"timestamp":5778238194473,"id":69,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1784586210441,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1030246,"timestamp":5778238243121,"id":124,"parentId":73,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1075933,"timestamp":5778238197488,"id":73,"parentId":19,"tags":{"page":"/tasks"},"startTime":1784586210444,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1033649,"timestamp":5778238243107,"id":123,"parentId":72,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1080456,"timestamp":5778238196353,"id":72,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1784586210443,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1034958,"timestamp":5778238243144,"id":126,"parentId":70,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1083424,"timestamp":5778238194734,"id":70,"parentId":19,"tags":{"page":"/settings"},"startTime":1784586210441,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1037471,"timestamp":5778238243130,"id":125,"parentId":65,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1088842,"timestamp":5778238191808,"id":65,"parentId":19,"tags":{"page":"/"},"startTime":1784586210438,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1048704,"timestamp":5778238242996,"id":116,"parentId":63,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1100494,"timestamp":5778238191289,"id":63,"parentId":19,"tags":{"page":"/node"},"startTime":1784586210438,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1049810,"timestamp":5778238243034,"id":117,"parentId":64,"tags":{},"startTime":1784586210489,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1101362,"timestamp":5778238191544,"id":64,"parentId":19,"tags":{"page":"/nodes"},"startTime":1784586210438,"traceId":"27a56f9227385779"},{"name":"is-page-static","duration":1108831,"timestamp":5778238201313,"id":76,"parentId":29,"tags":{},"startTime":1784586210448,"traceId":"27a56f9227385779"},{"name":"check-page","duration":1126658,"timestamp":5778238183576,"id":29,"parentId":19,"tags":{"page":"/api/anet/providers/probe-results"},"startTime":1784586210430,"traceId":"27a56f9227385779"},{"name":"static-check","duration":1138916,"timestamp":5778238171373,"id":19,"parentId":1,"tags":{},"startTime":1784586210418,"traceId":"27a56f9227385779"},{"name":"write-routes-manifest","duration":796,"timestamp":5778239323842,"id":128,"parentId":1,"tags":{},"startTime":1784586211570,"traceId":"27a56f9227385779"},{"name":"load-dotenv","duration":60,"timestamp":5778239342449,"id":131,"parentId":130,"tags":{},"startTime":1784586211589,"traceId":"27a56f9227385779"},{"name":"run-export-path-map","duration":995,"timestamp":5778239347060,"id":132,"parentId":130,"tags":{},"startTime":1784586211593,"traceId":"27a56f9227385779"},{"name":"next-export","duration":829793,"timestamp":5778239340198,"id":130,"parentId":1,"tags":{},"startTime":1784586211586,"traceId":"27a56f9227385779"},{"name":"move-exported-app-not-found-","duration":809,"timestamp":5778240173667,"id":133,"parentId":129,"tags":{},"startTime":1784586212420,"traceId":"27a56f9227385779"},{"name":"move-exported-app-global-error-","duration":540,"timestamp":5778240174615,"id":134,"parentId":129,"tags":{},"startTime":1784586212421,"traceId":"27a56f9227385779"},{"name":"static-generation","duration":846759,"timestamp":5778239330441,"id":129,"parentId":1,"tags":{},"startTime":1784586211577,"traceId":"27a56f9227385779"},{"name":"write-routes-manifest","duration":451,"timestamp":5778240177434,"id":135,"parentId":1,"tags":{},"startTime":1784586212424,"traceId":"27a56f9227385779"},{"name":"print-tree-view","duration":5179,"timestamp":5778240194369,"id":136,"parentId":1,"tags":{},"startTime":1784586212441,"traceId":"27a56f9227385779"},{"name":"write-route-bundle-stats","duration":21060,"timestamp":5778240199595,"id":137,"parentId":1,"tags":{},"startTime":1784586212446,"traceId":"27a56f9227385779"},{"name":"telemetry-flush","duration":61947,"timestamp":5778240220699,"id":138,"parentId":1,"tags":{},"startTime":1784586212467,"traceId":"27a56f9227385779"},{"name":"next-build","duration":25699138,"timestamp":5778214583545,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784586186830,"traceId":"27a56f9227385779"}]
1
+ [{"name":"generate-buildid","duration":296,"timestamp":5779869276575,"id":4,"parentId":1,"tags":{},"startTime":1784587841523,"traceId":"275fb4c4ea495391"},{"name":"load-custom-routes","duration":525,"timestamp":5779869277066,"id":5,"parentId":1,"tags":{},"startTime":1784587841523,"traceId":"275fb4c4ea495391"},{"name":"create-dist-dir","duration":787,"timestamp":5779869277642,"id":6,"parentId":1,"tags":{},"startTime":1784587841524,"traceId":"275fb4c4ea495391"},{"name":"clean","duration":42999,"timestamp":5779869279381,"id":7,"parentId":1,"tags":{},"startTime":1784587841526,"traceId":"275fb4c4ea495391"},{"name":"discover-routes","duration":18046,"timestamp":5779869446733,"id":8,"parentId":1,"tags":{},"startTime":1784587841693,"traceId":"275fb4c4ea495391"},{"name":"create-root-mapping","duration":214,"timestamp":5779869464879,"id":9,"parentId":1,"tags":{},"startTime":1784587841711,"traceId":"275fb4c4ea495391"},{"name":"generate-route-types","duration":74829,"timestamp":5779869469760,"id":10,"parentId":1,"tags":{},"startTime":1784587841716,"traceId":"275fb4c4ea495391"},{"name":"public-dir-conflict-check","duration":182,"timestamp":5779869544736,"id":11,"parentId":1,"tags":{},"startTime":1784587841791,"traceId":"275fb4c4ea495391"},{"name":"generate-routes-manifest","duration":9205,"timestamp":5779869545133,"id":12,"parentId":1,"tags":{},"startTime":1784587841791,"traceId":"275fb4c4ea495391"},{"name":"run-turbopack","duration":8786238,"timestamp":5779869566174,"id":14,"parentId":1,"tags":{},"startTime":1784587841812,"traceId":"275fb4c4ea495391"},{"name":"turbopack-build-events","duration":76,"timestamp":5779869939581,"id":15,"parentId":1,"tags":{},"startTime":1784587842186,"traceId":"275fb4c4ea495391"},{"name":"run-typescript","duration":13779176,"timestamp":5779878366323,"id":16,"parentId":1,"tags":{},"startTime":1784587850613,"traceId":"275fb4c4ea495391"},{"name":"generate-required-server-files","duration":3546,"timestamp":5779892146862,"id":18,"parentId":1,"tags":{},"startTime":1784587864393,"traceId":"275fb4c4ea495391"},{"name":"check-static-error-page","duration":24899,"timestamp":5779892417278,"id":20,"parentId":19,"tags":{},"startTime":1784587864664,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":639245,"timestamp":5779892447432,"id":77,"parentId":30,"tags":{},"startTime":1784587864694,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":661097,"timestamp":5779892425761,"id":30,"parentId":19,"tags":{"page":"/api/anet/providers/probe"},"startTime":1784587864672,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":643186,"timestamp":5779892450746,"id":81,"parentId":35,"tags":{},"startTime":1784587864697,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":667305,"timestamp":5779892426741,"id":35,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1784587864673,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":659127,"timestamp":5779892446494,"id":74,"parentId":21,"tags":{},"startTime":1784587864693,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":687000,"timestamp":5779892418694,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1784587864665,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":719808,"timestamp":5779892453650,"id":83,"parentId":37,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":745991,"timestamp":5779892427553,"id":37,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1784587864674,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":740124,"timestamp":5779892450955,"id":82,"parentId":36,"tags":{},"startTime":1784587864697,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":763827,"timestamp":5779892427343,"id":36,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1784587864674,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":739156,"timestamp":5779892453765,"id":84,"parentId":39,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":765048,"timestamp":5779892427932,"id":39,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1784587864674,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":742740,"timestamp":5779892453804,"id":85,"parentId":40,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":768537,"timestamp":5779892428059,"id":40,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1784587864674,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":752292,"timestamp":5779892453943,"id":86,"parentId":41,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":778119,"timestamp":5779892428162,"id":41,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1784587864674,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":752503,"timestamp":5779892454040,"id":87,"parentId":42,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":778325,"timestamp":5779892428257,"id":42,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":759025,"timestamp":5779892454072,"id":88,"parentId":43,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":784797,"timestamp":5779892428344,"id":43,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":759192,"timestamp":5779892454089,"id":89,"parentId":44,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":784854,"timestamp":5779892428455,"id":44,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":761426,"timestamp":5779892454106,"id":90,"parentId":45,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":787010,"timestamp":5779892428566,"id":45,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":764944,"timestamp":5779892454118,"id":91,"parentId":46,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":790408,"timestamp":5779892428698,"id":46,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":775318,"timestamp":5779892447548,"id":78,"parentId":32,"tags":{},"startTime":1784587864694,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":796570,"timestamp":5779892426348,"id":32,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1784587864673,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":769612,"timestamp":5779892454151,"id":93,"parentId":50,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":792603,"timestamp":5779892431200,"id":50,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1784587864677,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":773961,"timestamp":5779892454134,"id":92,"parentId":48,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":798994,"timestamp":5779892429160,"id":48,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":775546,"timestamp":5779892454179,"id":95,"parentId":52,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":796345,"timestamp":5779892433430,"id":52,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1784587864680,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":776787,"timestamp":5779892454163,"id":94,"parentId":51,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":797780,"timestamp":5779892433246,"id":51,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1784587864680,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":778792,"timestamp":5779892454196,"id":96,"parentId":53,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":799494,"timestamp":5779892433592,"id":53,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1784587864680,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":780850,"timestamp":5779892454212,"id":97,"parentId":54,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":801322,"timestamp":5779892433782,"id":54,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1784587864680,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":783871,"timestamp":5779892454240,"id":99,"parentId":56,"tags":{},"startTime":1784587864701,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":804033,"timestamp":5779892434119,"id":56,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1784587864680,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":785965,"timestamp":5779892454255,"id":100,"parentId":57,"tags":{},"startTime":1784587864701,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":805971,"timestamp":5779892434288,"id":57,"parentId":19,"tags":{"page":"/api/hub/upload"},"startTime":1784587864681,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":791449,"timestamp":5779892454283,"id":102,"parentId":61,"tags":{},"startTime":1784587864701,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":809887,"timestamp":5779892435890,"id":61,"parentId":19,"tags":{"page":"/manifest.webmanifest"},"startTime":1784587864682,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":785449,"timestamp":5779892468464,"id":103,"parentId":24,"tags":{},"startTime":1784587864715,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":833419,"timestamp":5779892420556,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1784587864667,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":799961,"timestamp":5779892454266,"id":101,"parentId":58,"tags":{},"startTime":1784587864701,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":819849,"timestamp":5779892434427,"id":58,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1784587864681,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":804844,"timestamp":5779892450531,"id":80,"parentId":34,"tags":{},"startTime":1784587864697,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":828807,"timestamp":5779892426617,"id":34,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1784587864673,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":781898,"timestamp":5779892476776,"id":104,"parentId":25,"tags":{},"startTime":1784587864723,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":835599,"timestamp":5779892423126,"id":25,"parentId":19,"tags":{"page":"/api/anet/host-supervisors"},"startTime":1784587864669,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":763284,"timestamp":5779892496940,"id":105,"parentId":27,"tags":{},"startTime":1784587864743,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":839018,"timestamp":5779892424775,"id":27,"parentId":19,"tags":{"page":"/api/anet/node-create"},"startTime":1784587864671,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":748672,"timestamp":5779892515270,"id":106,"parentId":26,"tags":{},"startTime":1784587864762,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":839573,"timestamp":5779892424396,"id":26,"parentId":19,"tags":{"page":"/api/anet/node-config"},"startTime":1784587864671,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":725178,"timestamp":5779892538930,"id":107,"parentId":28,"tags":{},"startTime":1784587864785,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":838956,"timestamp":5779892425202,"id":28,"parentId":19,"tags":{"page":"/api/anet/node-lifecycle"},"startTime":1784587864671,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":728221,"timestamp":5779892539760,"id":108,"parentId":47,"tags":{},"startTime":1784587864786,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":839267,"timestamp":5779892428813,"id":47,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1784587864675,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":708220,"timestamp":5779892564499,"id":111,"parentId":49,"tags":{},"startTime":1784587864811,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":843102,"timestamp":5779892429658,"id":49,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1784587864676,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":717434,"timestamp":5779892555937,"id":110,"parentId":31,"tags":{},"startTime":1784587864802,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":847506,"timestamp":5779892425925,"id":31,"parentId":19,"tags":{"page":"/api/anet/providers"},"startTime":1784587864672,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":659314,"timestamp":5779892621651,"id":112,"parentId":23,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":860689,"timestamp":5779892420350,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1784587864667,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":668075,"timestamp":5779892621724,"id":114,"parentId":60,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":854281,"timestamp":5779892435666,"id":60,"parentId":19,"tags":{"page":"/logs"},"startTime":1784587864682,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":678605,"timestamp":5779892621733,"id":115,"parentId":62,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":864356,"timestamp":5779892436040,"id":62,"parentId":19,"tags":{"page":"/messages"},"startTime":1784587864682,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":846345,"timestamp":5779892454224,"id":98,"parentId":55,"tags":{},"startTime":1784587864700,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":866641,"timestamp":5779892433966,"id":55,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1784587864680,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":686343,"timestamp":5779892621743,"id":116,"parentId":63,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":871739,"timestamp":5779892436408,"id":63,"parentId":19,"tags":{"page":"/node"},"startTime":1784587864683,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":693971,"timestamp":5779892621762,"id":118,"parentId":66,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":878057,"timestamp":5779892437732,"id":66,"parentId":19,"tags":{"page":"/providers"},"startTime":1784587864684,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":702168,"timestamp":5779892621771,"id":119,"parentId":67,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":885964,"timestamp":5779892438035,"id":67,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1784587864684,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":709733,"timestamp":5779892621780,"id":120,"parentId":68,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":893248,"timestamp":5779892438325,"id":68,"parentId":19,"tags":{"page":"/servers"},"startTime":1784587864685,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":790934,"timestamp":5779892548176,"id":109,"parentId":38,"tags":{},"startTime":1784587864794,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":911519,"timestamp":5779892427667,"id":38,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1784587864674,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":723316,"timestamp":5779892621789,"id":121,"parentId":69,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":906590,"timestamp":5779892438586,"id":69,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1784587864685,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":729396,"timestamp":5779892621807,"id":123,"parentId":72,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"}]
2
+ [{"name":"check-page","duration":910405,"timestamp":5779892441111,"id":72,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1784587864687,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":741078,"timestamp":5779892621710,"id":113,"parentId":59,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":927452,"timestamp":5779892435415,"id":59,"parentId":19,"tags":{"page":"/login"},"startTime":1784587864682,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":741230,"timestamp":5779892621816,"id":124,"parentId":73,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":921539,"timestamp":5779892441539,"id":73,"parentId":19,"tags":{"page":"/tasks"},"startTime":1784587864688,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":927986,"timestamp":5779892446997,"id":75,"parentId":22,"tags":{},"startTime":1784587864693,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":955049,"timestamp":5779892420063,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1784587864666,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":753457,"timestamp":5779892621824,"id":125,"parentId":65,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":938223,"timestamp":5779892437087,"id":65,"parentId":19,"tags":{"page":"/"},"startTime":1784587864683,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":755073,"timestamp":5779892621832,"id":126,"parentId":70,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":938055,"timestamp":5779892438896,"id":70,"parentId":19,"tags":{"page":"/settings"},"startTime":1784587864685,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":774629,"timestamp":5779892621752,"id":117,"parentId":64,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":959776,"timestamp":5779892436735,"id":64,"parentId":19,"tags":{"page":"/nodes"},"startTime":1784587864683,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":968108,"timestamp":5779892447301,"id":76,"parentId":29,"tags":{},"startTime":1784587864694,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":989915,"timestamp":5779892425571,"id":29,"parentId":19,"tags":{"page":"/api/anet/providers/probe-results"},"startTime":1784587864672,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":832006,"timestamp":5779892621798,"id":122,"parentId":71,"tags":{},"startTime":1784587864868,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":1013159,"timestamp":5779892440779,"id":71,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1784587864687,"traceId":"275fb4c4ea495391"},{"name":"is-page-static","duration":1082971,"timestamp":5779892447807,"id":79,"parentId":33,"tags":{},"startTime":1784587864694,"traceId":"275fb4c4ea495391"},{"name":"check-page","duration":1104356,"timestamp":5779892426502,"id":33,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1784587864673,"traceId":"275fb4c4ea495391"},{"name":"static-check","duration":1114717,"timestamp":5779892416194,"id":19,"parentId":1,"tags":{},"startTime":1784587864662,"traceId":"275fb4c4ea495391"},{"name":"write-routes-manifest","duration":812,"timestamp":5779893549173,"id":128,"parentId":1,"tags":{},"startTime":1784587865795,"traceId":"275fb4c4ea495391"},{"name":"load-dotenv","duration":66,"timestamp":5779893567481,"id":131,"parentId":130,"tags":{},"startTime":1784587865814,"traceId":"275fb4c4ea495391"},{"name":"run-export-path-map","duration":855,"timestamp":5779893571514,"id":132,"parentId":130,"tags":{},"startTime":1784587865818,"traceId":"275fb4c4ea495391"},{"name":"next-export","duration":958269,"timestamp":5779893565560,"id":130,"parentId":1,"tags":{},"startTime":1784587865812,"traceId":"275fb4c4ea495391"},{"name":"move-exported-app-not-found-","duration":796,"timestamp":5779894528496,"id":133,"parentId":129,"tags":{},"startTime":1784587866775,"traceId":"275fb4c4ea495391"},{"name":"move-exported-app-global-error-","duration":521,"timestamp":5779894529443,"id":134,"parentId":129,"tags":{},"startTime":1784587866776,"traceId":"275fb4c4ea495391"},{"name":"static-generation","duration":975819,"timestamp":5779893556892,"id":129,"parentId":1,"tags":{},"startTime":1784587865803,"traceId":"275fb4c4ea495391"},{"name":"write-routes-manifest","duration":621,"timestamp":5779894533124,"id":135,"parentId":1,"tags":{},"startTime":1784587866779,"traceId":"275fb4c4ea495391"},{"name":"print-tree-view","duration":8102,"timestamp":5779894548771,"id":136,"parentId":1,"tags":{},"startTime":1784587866795,"traceId":"275fb4c4ea495391"},{"name":"write-route-bundle-stats","duration":27515,"timestamp":5779894556931,"id":137,"parentId":1,"tags":{},"startTime":1784587866803,"traceId":"275fb4c4ea495391"},{"name":"telemetry-flush","duration":10735,"timestamp":5779894584494,"id":138,"parentId":1,"tags":{},"startTime":1784587866831,"traceId":"275fb4c4ea495391"},{"name":"next-build","duration":25379438,"timestamp":5779869215834,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784587841462,"traceId":"275fb4c4ea495391"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":9176141,"timestamp":5778214903948,"id":14,"parentId":1,"tags":{},"startTime":1784586187150,"traceId":"27a56f9227385779"},{"name":"turbopack-build-events","duration":80,"timestamp":5778215273116,"id":15,"parentId":1,"tags":{},"startTime":1784586187519,"traceId":"27a56f9227385779"},{"name":"run-typescript","duration":13770874,"timestamp":5778224129919,"id":16,"parentId":1,"tags":{},"startTime":1784586196376,"traceId":"27a56f9227385779"},{"name":"static-check","duration":1138916,"timestamp":5778238171373,"id":19,"parentId":1,"tags":{},"startTime":1784586210418,"traceId":"27a56f9227385779"},{"name":"static-generation","duration":846759,"timestamp":5778239330441,"id":129,"parentId":1,"tags":{},"startTime":1784586211577,"traceId":"27a56f9227385779"},{"name":"telemetry-flush","duration":61947,"timestamp":5778240220699,"id":138,"parentId":1,"tags":{},"startTime":1784586212467,"traceId":"27a56f9227385779"},{"name":"next-build","duration":25699138,"timestamp":5778214583545,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784586186830,"traceId":"27a56f9227385779"}]
1
+ [{"name":"run-turbopack","duration":8786238,"timestamp":5779869566174,"id":14,"parentId":1,"tags":{},"startTime":1784587841812,"traceId":"275fb4c4ea495391"},{"name":"turbopack-build-events","duration":76,"timestamp":5779869939581,"id":15,"parentId":1,"tags":{},"startTime":1784587842186,"traceId":"275fb4c4ea495391"},{"name":"run-typescript","duration":13779176,"timestamp":5779878366323,"id":16,"parentId":1,"tags":{},"startTime":1784587850613,"traceId":"275fb4c4ea495391"},{"name":"static-check","duration":1114717,"timestamp":5779892416194,"id":19,"parentId":1,"tags":{},"startTime":1784587864662,"traceId":"275fb4c4ea495391"},{"name":"static-generation","duration":975819,"timestamp":5779893556892,"id":129,"parentId":1,"tags":{},"startTime":1784587865803,"traceId":"275fb4c4ea495391"},{"name":"telemetry-flush","duration":10735,"timestamp":5779894584494,"id":138,"parentId":1,"tags":{},"startTime":1784587866831,"traceId":"275fb4c4ea495391"},{"name":"next-build","duration":25379438,"timestamp":5779869215834,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784587841462,"traceId":"275fb4c4ea495391"}]
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useState } from 'react';
3
+ import { useState, memo } from 'react';
4
4
  import Link from 'next/link';
5
5
  import { Session } from './types';
6
6
  import { timeAgo } from './utils';
@@ -23,7 +23,7 @@ const STATUS_CONFIG: Record<string, { bg: string; text: string; dot: string; glo
23
23
 
24
24
  const DEFAULT_STATUS = { bg: 'bg-gray-800/50 border-gray-700/30', text: 'text-gray-500', dot: 'bg-gray-500', glow: '' };
25
25
 
26
- export function AgentCard({ session: s, hasSse, sseCount, onChat }: AgentCardProps) {
26
+ function AgentCardInner({ session: s, hasSse, sseCount, onChat }: AgentCardProps) {
27
27
  const cfg = hasSse ? (STATUS_CONFIG[s.status] || DEFAULT_STATUS) : DEFAULT_STATUS;
28
28
  // #260: per-node settings panel (UI-only stub). Local open state — the
29
29
  // panel itself is presentational and issues no backend calls.
@@ -182,3 +182,20 @@ export function AgentCard({ session: s, hasSse, sseCount, onChat }: AgentCardPro
182
182
  </>
183
183
  );
184
184
  }
185
+
186
+ /* Loop R6 (性能主线): SWR revalidation hands each card a NEW session object
187
+ every poll/SSE mutate even when nothing changed, so all ~190 cards
188
+ re-rendered on every event. memo + field comparison skips cards whose
189
+ visible data (and the fields the settings panel reads) are unchanged.
190
+ onChat is stable (useCallback in useCommandCenter). */
191
+ const CARD_FIELDS = [
192
+ 'alias', 'status', 'agent', 'task', 'progress', 'server', 'updated_at',
193
+ 'node_id', 'network_id', 'model', 'runtime', 'channels', 'session_id',
194
+ ] as const;
195
+
196
+ export const AgentCard = memo(AgentCardInner, (prev, next) => {
197
+ if (prev.hasSse !== next.hasSse || prev.sseCount !== next.sseCount || prev.onChat !== next.onChat) return false;
198
+ const a = prev.session as unknown as Record<string, unknown>, b = next.session as unknown as Record<string, unknown>;
199
+ for (const k of CARD_FIELDS) if (a[k] !== b[k]) return false;
200
+ return true;
201
+ });
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useState } from 'react';
3
+ import { useState, useCallback } from 'react';
4
4
  import { TaskChatPanel } from './TaskChatPanel';
5
5
 
6
6
  interface CommandCenterProps {
@@ -104,10 +104,12 @@ export function useCommandCenter() {
104
104
  const [tabs, setTabs] = useState<string[]>([]);
105
105
  const [activeTab, setActiveTab] = useState('');
106
106
 
107
- const openTab = (alias: string) => {
107
+ // Loop R6: stable identities so memo'd consumers (AgentCard) don't
108
+ // re-render just because the Overview re-rendered.
109
+ const openTab = useCallback((alias: string) => {
108
110
  setTabs(prev => prev.includes(alias) ? prev : [...prev, alias]);
109
111
  setActiveTab(alias);
110
- };
112
+ }, []);
111
113
 
112
114
  const closeTab = (alias: string) => {
113
115
  setTabs(prev => {
@@ -28,21 +28,29 @@ type ChatEvent =
28
28
  older with the year. Exact per-message time survives in the bubble's
29
29
  title tooltip. */
30
30
  const TIME_GROUP_GAP_MS = 5 * 60 * 1000;
31
- const WEEKDAYS = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
32
31
 
32
+ // R4 polish: locale-aware (R3 hardcoded Chinese weekdays — English users saw
33
+ // 星期二). zh keeps the native WeChat wording; other locales get Intl output.
33
34
  function formatWeChatTime(value: string): string {
34
35
  const t = eventTime(value);
35
36
  if (!t) return '';
36
37
  const d = new Date(t);
37
38
  const now = new Date();
39
+ const zh = typeof navigator !== 'undefined' && (navigator.language || '').toLowerCase().startsWith('zh');
38
40
  const hm = `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;
39
41
  const startOfDay = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();
40
42
  const dayDiff = Math.round((startOfDay(now) - startOfDay(d)) / 86400000);
41
43
  if (dayDiff === 0) return hm;
42
- if (dayDiff === 1) return `昨天 ${hm}`;
43
- if (dayDiff > 1 && dayDiff < 7) return `${WEEKDAYS[d.getDay()]} ${hm}`;
44
- if (d.getFullYear() === now.getFullYear()) return `${d.getMonth() + 1}月${d.getDate()}日 ${hm}`;
45
- return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日 ${hm}`;
44
+ if (dayDiff === 1) return zh ? `昨天 ${hm}` : `Yesterday ${hm}`;
45
+ if (dayDiff > 1 && dayDiff < 7) {
46
+ const wd = new Intl.DateTimeFormat(zh ? 'zh-CN' : undefined, { weekday: zh ? 'long' : 'short' }).format(d);
47
+ return `${wd} ${hm}`;
48
+ }
49
+ const md = new Intl.DateTimeFormat(zh ? 'zh-CN' : undefined, {
50
+ month: zh ? 'long' : 'short', day: 'numeric',
51
+ ...(d.getFullYear() !== now.getFullYear() ? { year: 'numeric' } : {}),
52
+ }).format(d);
53
+ return `${md} ${hm}`;
46
54
  }
47
55
 
48
56
  function eventTime(value?: string) {
@@ -460,25 +468,61 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
460
468
  // them and patch the matching bubble immediately. No polling needed for
461
469
  // the normal path. The polling block below remains as a safety-net for
462
470
  // SSE-unavailable environments / disconnect windows.
471
+ // Loop R5 (实时收消息): the subscription used to be gated on
472
+ // pollingIds>0 — an IDLE panel was deaf, so messages sent to this alias
473
+ // by OTHERS (or replies to tasks sent before mount) only appeared on
474
+ // reopen. R1's shared channel makes an always-on subscription free (no
475
+ // extra connection), so:
476
+ // · new_reply for OUR in-flight sends keeps the fast targeted patch;
477
+ // · any other new_task/new_message/new_reply soft-refreshes the
478
+ // window (debounced 1.5s trailing; runFetch merge-by-id keeps
479
+ // optimistic bubbles, so a refresh never drops an in-flight send).
480
+ const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
481
+ useEffect(() => () => { if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); }, []);
463
482
  useSSE({
464
483
  url: '/api/hub/events',
465
- enabled: pollingIds.size > 0,
484
+ enabled: true,
466
485
  onEvent: async (e: { type?: string; in_reply_to?: string; message_id?: string }) => {
467
- if (e?.type !== 'new_reply' || !e.in_reply_to) return;
468
- // Refetch the task to get the full reply text + final status.
469
- try {
470
- const res = await fetch(`/api/hub/tasks?task_id=${encodeURIComponent(e.in_reply_to)}`);
471
- const data = await res.json();
472
- const updated = data?.tasks?.[0];
473
- if (!updated) return;
474
- setMessages(prev => prev.map(m => m.task_id === e.in_reply_to ? { ...m, ...updated } : m));
475
- if (['replied', 'failed', 'closed', 'expired', 'cancelled'].includes(updated.status)) {
476
- setPollingIds(prev => { const n = new Set(prev); n.delete(e.in_reply_to!); return n; });
477
- }
478
- } catch {}
486
+ const t = e?.type || '';
487
+ if (t === 'new_reply' && e.in_reply_to && pollingIds.has(e.in_reply_to)) {
488
+ // Fast path: a reply to a task WE sent from this panel.
489
+ try {
490
+ const res = await fetch(`/api/hub/tasks?task_id=${encodeURIComponent(e.in_reply_to)}`);
491
+ const data = await res.json();
492
+ const updated = data?.tasks?.[0];
493
+ if (!updated) return;
494
+ setMessages(prev => prev.map(m => m.task_id === e.in_reply_to ? { ...m, ...updated } : m));
495
+ if (['replied', 'failed', 'closed', 'expired', 'cancelled'].includes(updated.status)) {
496
+ setPollingIds(prev => { const n = new Set(prev); n.delete(e.in_reply_to!); return n; });
497
+ }
498
+ } catch {}
499
+ return; // handled — don't ALSO soft-refresh for the same event
500
+ }
501
+ if (!['new_task', 'new_message', 'new_reply', 'broadcast'].includes(t)) return;
502
+ if (!historyLoaded) return; // initial load owns the first paint
503
+ if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);
504
+ refreshTimerRef.current = setTimeout(() => {
505
+ runFetch(histLimitRef.current, 12_000);
506
+ }, 1500);
479
507
  },
480
508
  });
481
509
 
510
+ // Loop R5b (honest finding): the hub only pushes events on the
511
+ // sender's/recipient's OWN channels — a dashboard observer's channel gets
512
+ // NOTHING for third-party traffic (verified: 12s capture during an
513
+ // api→node send = only "connected"). Until the hub grows an observer
514
+ // stream (ask filed), an OPEN panel soft-refreshes every 15s — paused
515
+ // while the tab is hidden — so incoming messages appear without a
516
+ // reopen. runFetch's merge-by-id keeps optimistic bubbles intact.
517
+ useEffect(() => {
518
+ if (!historyLoaded) return;
519
+ const id = setInterval(() => {
520
+ if (document.visibilityState === 'hidden') return;
521
+ runFetch(histLimitRef.current, 12_000);
522
+ }, 15_000);
523
+ return () => clearInterval(id);
524
+ }, [historyLoaded, runFetch]);
525
+
482
526
  // Polling fallback (SSE-unavailable / proxies stripping events).
483
527
  // Slow cadence so we're not the bulk of server load — SSE handles the fast path.
484
528
  useEffect(() => {
@@ -580,6 +624,21 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
580
624
  m.task_id === localTaskId ? { ...m, content: taskContent } : m,
581
625
  ));
582
626
  }
627
+ await postTask(taskContent, sendTo, localTaskId, uploaded);
628
+ } catch (e: unknown) {
629
+ const msg = e instanceof Error ? e.message : String(e);
630
+ setMessages(prev => prev.map(m =>
631
+ m.task_id === localTaskId ? { ...m, status: 'failed', result: `❌ network error: ${msg}` } : m,
632
+ ));
633
+ }
634
+ setSending(false);
635
+ textareaRef.current?.focus();
636
+ };
637
+
638
+ // Core POST shared by send() and the failed-bubble retry (R4: WeChat-style
639
+ // resend — a failed message shouldn't force the user to retype it).
640
+ const postTask = async (taskContent: string, sendTo: string, localTaskId: string, uploaded: { path: string; url: string }[] = []) => {
641
+ try {
583
642
  const res = await fetch('/api/hub/send', {
584
643
  method: 'POST',
585
644
  headers: { 'Content-Type': 'application/json' },
@@ -607,8 +666,25 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
607
666
  m.task_id === localTaskId ? { ...m, status: 'failed', result: `❌ network error: ${msg}` } : m,
608
667
  ));
609
668
  }
610
- setSending(false);
611
- textareaRef.current?.focus();
669
+ };
670
+
671
+ // R4: tap-to-retry a failed send — reset the SAME bubble to in-flight and
672
+ // re-POST with identical content/target; no retyping (WeChat red-! flow).
673
+ const retryLockRef = useRef<Set<string>>(new Set());
674
+ const retrySend = async (m: ChatTask) => {
675
+ // R5 (R4 self-review debt): double-click guard — a second tap while the
676
+ // retry POST is in flight must not fire a duplicate send.
677
+ if (retryLockRef.current.has(m.task_id)) return;
678
+ retryLockRef.current.add(m.task_id);
679
+ const cleanContent = m.content;
680
+ setMessages(prev => prev.map(x =>
681
+ x.task_id === m.task_id ? { ...x, status: 'created', result: '' } : x,
682
+ ));
683
+ try {
684
+ await postTask(cleanContent, m.to_name, m.task_id);
685
+ } finally {
686
+ retryLockRef.current.delete(m.task_id);
687
+ }
612
688
  };
613
689
 
614
690
  const handleKeyDown = (e: React.KeyboardEvent) => {
@@ -750,7 +826,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
750
826
  const showSep = !prevAt || eventTime(event.at) - eventTime(prevAt) > TIME_GROUP_GAP_MS;
751
827
  const sepEl = showSep ? (
752
828
  <div className="flex justify-center py-1.5">
753
- <span className="text-[10px] text-[var(--fg-dim)] bg-black/10 rounded px-2 py-0.5">{formatWeChatTime(event.at)}</span>
829
+ <span className="text-[10px] text-[var(--fg-dim)] bg-[var(--bg-elevated)] rounded px-2 py-0.5">{formatWeChatTime(event.at)}</span>
754
830
  </div>
755
831
  ) : null;
756
832
  // Distinguish task source so users can tell when a peer agent
@@ -807,7 +883,24 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes }: TaskCh
807
883
  </div>
808
884
  <div className="flex flex-wrap items-center justify-between mt-1.5 gap-2 sm:gap-3">
809
885
  <StatusBar status={m.status} />
810
- {senderBadge && <div className="flex items-center gap-2 shrink-0">{senderBadge}</div>}
886
+ <div className="flex items-center gap-2 shrink-0">
887
+ {/* R4: WeChat send-feedback loop — spinner while the
888
+ optimistic bubble is still in flight; tap-to-resend
889
+ on failure (same bubble, no retyping). */}
890
+ {m.task_id.startsWith('tmp-') && m.status !== 'failed' && (
891
+ <span aria-label="发送中" className="inline-block h-3 w-3 animate-spin rounded-full border-2 border-cyan-500/30 border-t-cyan-400" />
892
+ )}
893
+ {m.status === 'failed' && fromUser && (
894
+ <button
895
+ type="button"
896
+ onClick={() => retrySend(m)}
897
+ className="inline-flex items-center gap-1 rounded-md border border-red-500/40 bg-red-500/10 px-1.5 py-0.5 text-[10px] font-medium text-red-300 hover:bg-red-500/20"
898
+ >
899
+ <span aria-hidden>↻</span> 重发
900
+ </button>
901
+ )}
902
+ {senderBadge}
903
+ </div>
811
904
  </div>
812
905
  </div>
813
906
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.6.3-preview.13",
3
+ "version": "0.6.3-preview.14",
4
4
  "description": "Agent Network Dashboard — Web UI for managing AI Agent networks",
5
5
  "main": "apps/desktop/electron/main.cjs",
6
6
  "scripts": {