@sleep2agi/agent-network-dashboard 0.6.3-preview.20 → 0.6.3-preview.22

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 (225) 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 +26 -26
  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 +3 -3
  25. package/.next/server/app/admin.segments/_full.segment.rsc +3 -3
  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 +2 -2
  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 +3 -3
  50. package/.next/server/app/logs.segments/_full.segment.rsc +3 -3
  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 +2 -2
  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 +3 -3
  59. package/.next/server/app/messages.segments/_full.segment.rsc +3 -3
  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 +2 -2
  64. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  65. package/.next/server/app/node/page.js.nft.json +1 -1
  66. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/node.html +2 -2
  68. package/.next/server/app/node.rsc +3 -3
  69. package/.next/server/app/node.segments/_full.segment.rsc +3 -3
  70. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  71. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  72. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  73. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +2 -2
  74. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  75. package/.next/server/app/nodes/page.js.nft.json +1 -1
  76. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/nodes.html +2 -2
  78. package/.next/server/app/nodes.rsc +3 -3
  79. package/.next/server/app/nodes.segments/_full.segment.rsc +3 -3
  80. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  82. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  83. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
  84. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  85. package/.next/server/app/page.js.nft.json +1 -1
  86. package/.next/server/app/page_client-reference-manifest.js +1 -1
  87. package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
  88. package/.next/server/app/providers.html +2 -2
  89. package/.next/server/app/providers.rsc +2 -2
  90. package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
  91. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  92. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  93. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  94. package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +1 -1
  95. package/.next/server/app/providers.segments/providers.segment.rsc +1 -1
  96. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  97. package/.next/server/app/server-logs.html +2 -2
  98. package/.next/server/app/server-logs.rsc +2 -2
  99. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  100. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  101. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  102. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  103. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  104. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  105. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  106. package/.next/server/app/servers.html +2 -2
  107. package/.next/server/app/servers.rsc +2 -2
  108. package/.next/server/app/servers.segments/_full.segment.rsc +2 -2
  109. package/.next/server/app/servers.segments/_head.segment.rsc +1 -1
  110. package/.next/server/app/servers.segments/_index.segment.rsc +2 -2
  111. package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
  112. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  113. package/.next/server/app/servers.segments/servers.segment.rsc +1 -1
  114. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/settings/networks.html +2 -2
  116. package/.next/server/app/settings/networks.rsc +3 -3
  117. package/.next/server/app/settings/networks.segments/_full.segment.rsc +3 -3
  118. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  119. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  120. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  121. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
  122. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  123. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  124. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  125. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  126. package/.next/server/app/settings/tokens.html +2 -2
  127. package/.next/server/app/settings/tokens.rsc +2 -2
  128. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  129. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  130. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  131. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  132. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  133. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  134. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  135. package/.next/server/app/settings.html +2 -2
  136. package/.next/server/app/settings.rsc +3 -3
  137. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  138. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  139. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  140. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  141. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  142. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  143. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  144. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  145. package/.next/server/app/tasks.html +2 -2
  146. package/.next/server/app/tasks.rsc +3 -3
  147. package/.next/server/app/tasks.segments/_full.segment.rsc +3 -3
  148. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  149. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  150. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  151. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +2 -2
  152. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  153. package/.next/server/chunks/ssr/0zg~_pinyin-pro_dist_index_mjs_0fj60.q._.js +3 -0
  154. package/.next/server/chunks/ssr/0zg~_pinyin-pro_dist_index_mjs_0fj60.q._.js.map +1 -0
  155. package/.next/server/chunks/ssr/[root-of-the-server]__0-tk.iv._.js +3 -0
  156. package/.next/server/chunks/ssr/[root-of-the-server]__0-tk.iv._.js.map +1 -0
  157. package/.next/server/chunks/ssr/[root-of-the-server]__091su60._.js +2 -2
  158. package/.next/server/chunks/ssr/[root-of-the-server]__091su60._.js.map +1 -1
  159. package/.next/server/chunks/ssr/[root-of-the-server]__0k~m-.b._.js +3 -0
  160. package/.next/server/chunks/ssr/[root-of-the-server]__0k~m-.b._.js.map +1 -0
  161. package/.next/server/chunks/ssr/[root-of-the-server]__0v2rgdn._.js +3 -0
  162. package/.next/server/chunks/ssr/[root-of-the-server]__0v2rgdn._.js.map +1 -0
  163. package/.next/server/chunks/ssr/dash-loop-wt_0rh8p9o._.js +3 -3
  164. package/.next/server/chunks/ssr/dash-loop-wt_0rh8p9o._.js.map +1 -1
  165. package/.next/server/chunks/ssr/dash-loop-wt_app_0-ky8pi._.js +1 -1
  166. package/.next/server/chunks/ssr/dash-loop-wt_app_0-ky8pi._.js.map +1 -1
  167. package/.next/server/chunks/ssr/dash-loop-wt_app_0ax3klf._.js +1 -1
  168. package/.next/server/chunks/ssr/dash-loop-wt_app_0ax3klf._.js.map +1 -1
  169. package/.next/server/chunks/ssr/dash-loop-wt_app_0cxknnm._.js +1 -1
  170. package/.next/server/chunks/ssr/dash-loop-wt_app_0cxknnm._.js.map +1 -1
  171. package/.next/server/chunks/ssr/dash-loop-wt_app_0mxr2l9._.js +1 -1
  172. package/.next/server/chunks/ssr/dash-loop-wt_app_0mxr2l9._.js.map +1 -1
  173. package/.next/server/chunks/ssr/dash-loop-wt_app_0pcz05f._.js +1 -1
  174. package/.next/server/chunks/ssr/dash-loop-wt_app_0pcz05f._.js.map +1 -1
  175. package/.next/server/chunks/ssr/dash-loop-wt_app_0~.1~ew._.js +1 -1
  176. package/.next/server/chunks/ssr/dash-loop-wt_app_0~.1~ew._.js.map +1 -1
  177. package/.next/server/chunks/ssr/dash-loop-wt_app_13k3-ai._.js +1 -1
  178. package/.next/server/chunks/ssr/dash-loop-wt_app_13k3-ai._.js.map +1 -1
  179. package/.next/server/middleware-build-manifest.js +3 -3
  180. package/.next/server/pages/404.html +2 -2
  181. package/.next/server/pages/500.html +1 -1
  182. package/.next/server/server-reference-manifest.js +1 -1
  183. package/.next/server/server-reference-manifest.json +1 -1
  184. package/.next/static/chunks/0-g~4q8j8mxm4.js +2 -0
  185. package/.next/static/chunks/0.324peadzie3.js +1 -0
  186. package/.next/static/chunks/016h47ls_.eb3.js +1 -0
  187. package/.next/static/chunks/03vplr5e8v~uy.js +1 -0
  188. package/.next/static/chunks/05srmv31apvro.css +1 -0
  189. package/.next/static/chunks/0a0xa8~ux8yj2.js +1 -0
  190. package/.next/static/chunks/{13t5k3_w2mgd4.js → 0a9ilbebmnl47.js} +1 -1
  191. package/.next/static/chunks/0b9n013t4o.m7.js +7 -0
  192. package/.next/static/chunks/0cdo0a8-9gjs0.js +1 -0
  193. package/.next/static/chunks/0da-je9qrw1o6.js +1 -0
  194. package/.next/static/chunks/{0rhjfleuyvtd8.js → 0q-cs_6ry76lh.js} +1 -1
  195. package/.next/static/chunks/0q5xir~9v-77t.js +1 -0
  196. package/.next/static/chunks/{13vqo73myw3fe.js → 0z31ajz1sgl21.js} +2 -2
  197. package/.next/static/chunks/17-dam4fv0tzs.js +4 -0
  198. package/.next/trace +2 -2
  199. package/.next/trace-build +1 -1
  200. package/app/components/AliasAvatar.tsx +31 -0
  201. package/app/components/NodeSettingsPanel.tsx +52 -0
  202. package/app/components/TaskChatPanel.tsx +116 -11
  203. package/app/lib/avatars.ts +79 -0
  204. package/app/page.tsx +8 -2
  205. package/package.json +3 -2
  206. package/public/avatars/manifest.json +3 -0
  207. package/.next/server/chunks/ssr/[root-of-the-server]__04nqr0~._.js +0 -3
  208. package/.next/server/chunks/ssr/[root-of-the-server]__04nqr0~._.js.map +0 -1
  209. package/.next/server/chunks/ssr/[root-of-the-server]__0rcs2vk._.js +0 -3
  210. package/.next/server/chunks/ssr/[root-of-the-server]__0rcs2vk._.js.map +0 -1
  211. package/.next/server/chunks/ssr/[root-of-the-server]__0vc.3k7._.js +0 -3
  212. package/.next/server/chunks/ssr/[root-of-the-server]__0vc.3k7._.js.map +0 -1
  213. package/.next/static/chunks/00wka73f9rki_.js +0 -1
  214. package/.next/static/chunks/02r4vb97r~-7r.js +0 -1
  215. package/.next/static/chunks/08medgd.1p151.js +0 -2
  216. package/.next/static/chunks/09ju~nqgg3wpf.js +0 -4
  217. package/.next/static/chunks/0_gs9wrgf86-h.js +0 -7
  218. package/.next/static/chunks/0dq_d9k9asnws.js +0 -1
  219. package/.next/static/chunks/0usafm~4wag7t.js +0 -1
  220. package/.next/static/chunks/0z52qau1ofv1z.js +0 -1
  221. package/.next/static/chunks/12jet.4d8djw0.js +0 -1
  222. package/.next/static/chunks/12x~60u05l-xj.css +0 -1
  223. /package/.next/static/{F09kAlh9X67Chm49jMtd_ → Wh2iA_9c_IGG1Gq1ludnh}/_buildManifest.js +0 -0
  224. /package/.next/static/{F09kAlh9X67Chm49jMtd_ → Wh2iA_9c_IGG1Gq1ludnh}/_clientMiddlewareManifest.js +0 -0
  225. /package/.next/static/{F09kAlh9X67Chm49jMtd_ → Wh2iA_9c_IGG1Gq1ludnh}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1,2 +1,2 @@
1
- [{"name":"generate-buildid","duration":317,"timestamp":5788284111385,"id":4,"parentId":1,"tags":{},"startTime":1784596256358,"traceId":"ff99179654b74581"},{"name":"load-custom-routes","duration":562,"timestamp":5788284111882,"id":5,"parentId":1,"tags":{},"startTime":1784596256358,"traceId":"ff99179654b74581"},{"name":"create-dist-dir","duration":965,"timestamp":5788284112512,"id":6,"parentId":1,"tags":{},"startTime":1784596256359,"traceId":"ff99179654b74581"},{"name":"clean","duration":47053,"timestamp":5788284114235,"id":7,"parentId":1,"tags":{},"startTime":1784596256361,"traceId":"ff99179654b74581"},{"name":"discover-routes","duration":28959,"timestamp":5788284268705,"id":8,"parentId":1,"tags":{},"startTime":1784596256515,"traceId":"ff99179654b74581"},{"name":"create-root-mapping","duration":177,"timestamp":5788284297752,"id":9,"parentId":1,"tags":{},"startTime":1784596256544,"traceId":"ff99179654b74581"},{"name":"generate-route-types","duration":26882,"timestamp":5788284301768,"id":10,"parentId":1,"tags":{},"startTime":1784596256548,"traceId":"ff99179654b74581"},{"name":"public-dir-conflict-check","duration":240,"timestamp":5788284328944,"id":11,"parentId":1,"tags":{},"startTime":1784596256575,"traceId":"ff99179654b74581"},{"name":"generate-routes-manifest","duration":9221,"timestamp":5788284329637,"id":12,"parentId":1,"tags":{},"startTime":1784596256576,"traceId":"ff99179654b74581"},{"name":"run-turbopack","duration":8996895,"timestamp":5788284361787,"id":14,"parentId":1,"tags":{},"startTime":1784596256608,"traceId":"ff99179654b74581"},{"name":"turbopack-build-events","duration":100,"timestamp":5788284719557,"id":15,"parentId":1,"tags":{},"startTime":1784596256966,"traceId":"ff99179654b74581"},{"name":"run-typescript","duration":13362616,"timestamp":5788293370018,"id":16,"parentId":1,"tags":{},"startTime":1784596265616,"traceId":"ff99179654b74581"},{"name":"generate-required-server-files","duration":4058,"timestamp":5788306734396,"id":18,"parentId":1,"tags":{},"startTime":1784596278981,"traceId":"ff99179654b74581"},{"name":"check-static-error-page","duration":28193,"timestamp":5788307028417,"id":20,"parentId":19,"tags":{},"startTime":1784596279275,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":601722,"timestamp":5788307060692,"id":78,"parentId":32,"tags":{},"startTime":1784596279307,"traceId":"ff99179654b74581"},{"name":"check-page","duration":618532,"timestamp":5788307044060,"id":32,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1784596279290,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":604147,"timestamp":5788307065194,"id":81,"parentId":35,"tags":{},"startTime":1784596279311,"traceId":"ff99179654b74581"},{"name":"check-page","duration":624886,"timestamp":5788307044542,"id":35,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1784596279291,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":648012,"timestamp":5788307065385,"id":82,"parentId":36,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":668267,"timestamp":5788307045204,"id":36,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1784596279291,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":669677,"timestamp":5788307065459,"id":83,"parentId":37,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":689783,"timestamp":5788307045434,"id":37,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1784596279292,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":674734,"timestamp":5788307065538,"id":84,"parentId":39,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":692529,"timestamp":5788307047824,"id":39,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1784596279294,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":679665,"timestamp":5788307065605,"id":85,"parentId":40,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":697492,"timestamp":5788307047964,"id":40,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1784596279294,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":684458,"timestamp":5788307065731,"id":86,"parentId":41,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":702113,"timestamp":5788307048152,"id":41,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1784596279294,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":692344,"timestamp":5788307065764,"id":87,"parentId":42,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":709858,"timestamp":5788307048320,"id":42,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":694057,"timestamp":5788307065783,"id":88,"parentId":43,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":711496,"timestamp":5788307048414,"id":43,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":699029,"timestamp":5788307065797,"id":89,"parentId":44,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":716375,"timestamp":5788307048513,"id":44,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":703641,"timestamp":5788307065806,"id":90,"parentId":45,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":720904,"timestamp":5788307048600,"id":45,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":712471,"timestamp":5788307065819,"id":91,"parentId":46,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":729652,"timestamp":5788307048709,"id":46,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":735951,"timestamp":5788307060244,"id":75,"parentId":22,"tags":{},"startTime":1784596279307,"traceId":"ff99179654b74581"},{"name":"check-page","duration":762800,"timestamp":5788307033529,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1784596279280,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":756306,"timestamp":5788307065833,"id":92,"parentId":48,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":773169,"timestamp":5788307049074,"id":48,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":758351,"timestamp":5788307065856,"id":94,"parentId":51,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":774557,"timestamp":5788307049708,"id":51,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1784596279296,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":763445,"timestamp":5788307065870,"id":95,"parentId":52,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":779530,"timestamp":5788307049844,"id":52,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1784596279296,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":767859,"timestamp":5788307065882,"id":96,"parentId":53,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":783865,"timestamp":5788307049948,"id":53,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1784596279296,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":772511,"timestamp":5788307065892,"id":97,"parentId":54,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":788400,"timestamp":5788307050065,"id":54,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1784596279296,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":780208,"timestamp":5788307065906,"id":98,"parentId":55,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":795990,"timestamp":5788307050202,"id":55,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1784596279296,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":786627,"timestamp":5788307059794,"id":74,"parentId":21,"tags":{},"startTime":1784596279306,"traceId":"ff99179654b74581"},{"name":"check-page","duration":815227,"timestamp":5788307031239,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1784596279278,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":781645,"timestamp":5788307065919,"id":99,"parentId":56,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":797329,"timestamp":5788307050293,"id":56,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1784596279297,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":789446,"timestamp":5788307065945,"id":101,"parentId":58,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":805023,"timestamp":5788307050476,"id":58,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1784596279297,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":794560,"timestamp":5788307065957,"id":102,"parentId":61,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":809311,"timestamp":5788307051268,"id":61,"parentId":19,"tags":{"page":"/manifest.webmanifest"},"startTime":1784596279298,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":784521,"timestamp":5788307086846,"id":103,"parentId":24,"tags":{},"startTime":1784596279333,"traceId":"ff99179654b74581"},{"name":"check-page","duration":837187,"timestamp":5788307034256,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1784596279281,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":816417,"timestamp":5788307060513,"id":77,"parentId":30,"tags":{},"startTime":1784596279307,"traceId":"ff99179654b74581"},{"name":"check-page","duration":833647,"timestamp":5788307043382,"id":30,"parentId":19,"tags":{"page":"/api/anet/providers/probe"},"startTime":1784596279290,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":790025,"timestamp":5788307092045,"id":104,"parentId":25,"tags":{},"startTime":1784596279338,"traceId":"ff99179654b74581"},{"name":"check-page","duration":842843,"timestamp":5788307039311,"id":25,"parentId":19,"tags":{"page":"/api/anet/host-supervisors"},"startTime":1784596279286,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":784212,"timestamp":5788307101621,"id":105,"parentId":26,"tags":{},"startTime":1784596279348,"traceId":"ff99179654b74581"},{"name":"check-page","duration":846143,"timestamp":5788307039765,"id":26,"parentId":19,"tags":{"page":"/api/anet/node-config"},"startTime":1784596279286,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":792358,"timestamp":5788307110917,"id":106,"parentId":27,"tags":{},"startTime":1784596279357,"traceId":"ff99179654b74581"},{"name":"check-page","duration":862946,"timestamp":5788307040401,"id":27,"parentId":19,"tags":{"page":"/api/anet/node-create"},"startTime":1784596279287,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":787809,"timestamp":5788307129554,"id":107,"parentId":28,"tags":{},"startTime":1784596279376,"traceId":"ff99179654b74581"},{"name":"check-page","duration":876640,"timestamp":5788307040871,"id":28,"parentId":19,"tags":{"page":"/api/anet/node-lifecycle"},"startTime":1784596279287,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":784973,"timestamp":5788307140845,"id":108,"parentId":31,"tags":{},"startTime":1784596279387,"traceId":"ff99179654b74581"},{"name":"check-page","duration":882342,"timestamp":5788307043555,"id":31,"parentId":19,"tags":{"page":"/api/anet/providers"},"startTime":1784596279290,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":795665,"timestamp":5788307143467,"id":110,"parentId":47,"tags":{},"startTime":1784596279390,"traceId":"ff99179654b74581"},{"name":"check-page","duration":890436,"timestamp":5788307048803,"id":47,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":873477,"timestamp":5788307065936,"id":100,"parentId":57,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":889061,"timestamp":5788307050382,"id":57,"parentId":19,"tags":{"page":"/api/hub/upload"},"startTime":1784596279297,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":799882,"timestamp":5788307144594,"id":111,"parentId":49,"tags":{},"startTime":1784596279391,"traceId":"ff99179654b74581"},{"name":"check-page","duration":895345,"timestamp":5788307049205,"id":49,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1784596279295,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":810092,"timestamp":5788307142554,"id":109,"parentId":38,"tags":{},"startTime":1784596279389,"traceId":"ff99179654b74581"},{"name":"check-page","duration":907125,"timestamp":5788307045595,"id":38,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1784596279292,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":779390,"timestamp":5788307173498,"id":112,"parentId":23,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":919025,"timestamp":5788307033907,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1784596279280,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":900780,"timestamp":5788307060965,"id":79,"parentId":33,"tags":{},"startTime":1784596279307,"traceId":"ff99179654b74581"},{"name":"check-page","duration":917621,"timestamp":5788307044245,"id":33,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1784596279291,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":795075,"timestamp":5788307173590,"id":115,"parentId":62,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":917369,"timestamp":5788307051366,"id":62,"parentId":19,"tags":{"page":"/messages"},"startTime":1784596279298,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":803968,"timestamp":5788307173616,"id":117,"parentId":64,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":925810,"timestamp":5788307051840,"id":64,"parentId":19,"tags":{"page":"/nodes"},"startTime":1784596279298,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":812071,"timestamp":5788307173632,"id":118,"parentId":66,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":931871,"timestamp":5788307053901,"id":66,"parentId":19,"tags":{"page":"/providers"},"startTime":1784596279300,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":821171,"timestamp":5788307173647,"id":119,"parentId":67,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":940701,"timestamp":5788307054192,"id":67,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1784596279300,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":829612,"timestamp":5788307173660,"id":120,"parentId":68,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":948858,"timestamp":5788307054479,"id":68,"parentId":19,"tags":{"page":"/servers"},"startTime":1784596279301,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":840173,"timestamp":5788307173670,"id":121,"parentId":69,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":959282,"timestamp":5788307054640,"id":69,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1784596279301,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":846813,"timestamp":5788307173685,"id":122,"parentId":71,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":964952,"timestamp":5788307055615,"id":71,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1784596279302,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":867416,"timestamp":5788307173700,"id":123,"parentId":72,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"}]
2
- [{"name":"check-page","duration":985625,"timestamp":5788307055811,"id":72,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1784596279302,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":897898,"timestamp":5788307173710,"id":124,"parentId":73,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1015496,"timestamp":5788307056205,"id":73,"parentId":19,"tags":{"page":"/tasks"},"startTime":1784596279302,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":1006000,"timestamp":5788307065846,"id":93,"parentId":50,"tags":{},"startTime":1784596279312,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1022302,"timestamp":5788307049586,"id":50,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1784596279296,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":913310,"timestamp":5788307173576,"id":114,"parentId":60,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1035892,"timestamp":5788307051089,"id":60,"parentId":19,"tags":{"page":"/logs"},"startTime":1784596279297,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":913613,"timestamp":5788307173560,"id":113,"parentId":59,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1036332,"timestamp":5788307050884,"id":59,"parentId":19,"tags":{"page":"/login"},"startTime":1784596279297,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":943245,"timestamp":5788307173726,"id":125,"parentId":65,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1064971,"timestamp":5788307052120,"id":65,"parentId":19,"tags":{"page":"/"},"startTime":1784596279298,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":950123,"timestamp":5788307173605,"id":116,"parentId":63,"tags":{},"startTime":1784596279420,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1072189,"timestamp":5788307051614,"id":63,"parentId":19,"tags":{"page":"/node"},"startTime":1784596279298,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":1078625,"timestamp":5788307060386,"id":76,"parentId":29,"tags":{},"startTime":1784596279307,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1095979,"timestamp":5788307043139,"id":29,"parentId":19,"tags":{"page":"/api/anet/providers/probe-results"},"startTime":1784596279289,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":1145184,"timestamp":5788307061167,"id":80,"parentId":34,"tags":{},"startTime":1784596279307,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1162048,"timestamp":5788307044396,"id":34,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1784596279291,"traceId":"ff99179654b74581"},{"name":"is-page-static","duration":1044574,"timestamp":5788307177172,"id":126,"parentId":70,"tags":{},"startTime":1784596279423,"traceId":"ff99179654b74581"},{"name":"check-page","duration":1166942,"timestamp":5788307054885,"id":70,"parentId":19,"tags":{"page":"/settings"},"startTime":1784596279301,"traceId":"ff99179654b74581"},{"name":"static-check","duration":1194899,"timestamp":5788307026987,"id":19,"parentId":1,"tags":{},"startTime":1784596279273,"traceId":"ff99179654b74581"},{"name":"write-routes-manifest","duration":649,"timestamp":5788308241590,"id":128,"parentId":1,"tags":{},"startTime":1784596280488,"traceId":"ff99179654b74581"},{"name":"load-dotenv","duration":59,"timestamp":5788308257785,"id":131,"parentId":130,"tags":{},"startTime":1784596280504,"traceId":"ff99179654b74581"},{"name":"run-export-path-map","duration":903,"timestamp":5788308270639,"id":132,"parentId":130,"tags":{},"startTime":1784596280517,"traceId":"ff99179654b74581"},{"name":"next-export","duration":920872,"timestamp":5788308255929,"id":130,"parentId":1,"tags":{},"startTime":1784596280502,"traceId":"ff99179654b74581"},{"name":"move-exported-app-not-found-","duration":8278,"timestamp":5788309183196,"id":133,"parentId":129,"tags":{},"startTime":1784596281429,"traceId":"ff99179654b74581"},{"name":"move-exported-app-global-error-","duration":11660,"timestamp":5788309191652,"id":134,"parentId":129,"tags":{},"startTime":1784596281438,"traceId":"ff99179654b74581"},{"name":"static-generation","duration":973577,"timestamp":5788308247420,"id":129,"parentId":1,"tags":{},"startTime":1784596280494,"traceId":"ff99179654b74581"},{"name":"write-routes-manifest","duration":478,"timestamp":5788309221348,"id":135,"parentId":1,"tags":{},"startTime":1784596281468,"traceId":"ff99179654b74581"},{"name":"print-tree-view","duration":6261,"timestamp":5788309246705,"id":136,"parentId":1,"tags":{},"startTime":1784596281493,"traceId":"ff99179654b74581"},{"name":"write-route-bundle-stats","duration":20680,"timestamp":5788309253081,"id":137,"parentId":1,"tags":{},"startTime":1784596281499,"traceId":"ff99179654b74581"},{"name":"telemetry-flush","duration":16345,"timestamp":5788309273807,"id":138,"parentId":1,"tags":{},"startTime":1784596281520,"traceId":"ff99179654b74581"},{"name":"next-build","duration":25242491,"timestamp":5788284047719,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784596256294,"traceId":"ff99179654b74581"}]
1
+ [{"name":"generate-buildid","duration":395,"timestamp":5791254407375,"id":4,"parentId":1,"tags":{},"startTime":1784599226654,"traceId":"c660bb1185959f0c"},{"name":"load-custom-routes","duration":706,"timestamp":5791254407972,"id":5,"parentId":1,"tags":{},"startTime":1784599226654,"traceId":"c660bb1185959f0c"},{"name":"create-dist-dir","duration":948,"timestamp":5791254408746,"id":6,"parentId":1,"tags":{},"startTime":1784599226655,"traceId":"c660bb1185959f0c"},{"name":"clean","duration":45043,"timestamp":5791254410551,"id":7,"parentId":1,"tags":{},"startTime":1784599226657,"traceId":"c660bb1185959f0c"},{"name":"discover-routes","duration":11889,"timestamp":5791254556641,"id":8,"parentId":1,"tags":{},"startTime":1784599226803,"traceId":"c660bb1185959f0c"},{"name":"create-root-mapping","duration":117,"timestamp":5791254568591,"id":9,"parentId":1,"tags":{},"startTime":1784599226815,"traceId":"c660bb1185959f0c"},{"name":"generate-route-types","duration":41683,"timestamp":5791254571393,"id":10,"parentId":1,"tags":{},"startTime":1784599226818,"traceId":"c660bb1185959f0c"},{"name":"public-dir-conflict-check","duration":156,"timestamp":5791254613323,"id":11,"parentId":1,"tags":{},"startTime":1784599226860,"traceId":"c660bb1185959f0c"},{"name":"generate-routes-manifest","duration":6168,"timestamp":5791254613661,"id":12,"parentId":1,"tags":{},"startTime":1784599226860,"traceId":"c660bb1185959f0c"},{"name":"run-turbopack","duration":8740568,"timestamp":5791254627705,"id":14,"parentId":1,"tags":{},"startTime":1784599226874,"traceId":"c660bb1185959f0c"},{"name":"turbopack-build-events","duration":120,"timestamp":5791255036108,"id":15,"parentId":1,"tags":{},"startTime":1784599227282,"traceId":"c660bb1185959f0c"},{"name":"run-typescript","duration":12741740,"timestamp":5791263405485,"id":16,"parentId":1,"tags":{},"startTime":1784599235652,"traceId":"c660bb1185959f0c"},{"name":"generate-required-server-files","duration":3266,"timestamp":5791276148459,"id":18,"parentId":1,"tags":{},"startTime":1784599248395,"traceId":"c660bb1185959f0c"},{"name":"check-static-error-page","duration":20837,"timestamp":5791276443237,"id":20,"parentId":19,"tags":{},"startTime":1784599248690,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":602155,"timestamp":5791276467650,"id":75,"parentId":22,"tags":{},"startTime":1784599248714,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":623826,"timestamp":5791276446160,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1784599248692,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":633938,"timestamp":5791276467999,"id":78,"parentId":32,"tags":{},"startTime":1784599248714,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":650221,"timestamp":5791276451873,"id":32,"parentId":19,"tags":{"page":"/api/auth/login"},"startTime":1784599248698,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":686919,"timestamp":5791276468852,"id":82,"parentId":36,"tags":{},"startTime":1784599248715,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":702867,"timestamp":5791276452992,"id":36,"parentId":19,"tags":{"page":"/api/hub/auth"},"startTime":1784599248699,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":704741,"timestamp":5791276468924,"id":83,"parentId":37,"tags":{},"startTime":1784599248715,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":720525,"timestamp":5791276453225,"id":37,"parentId":19,"tags":{"page":"/api/hub/broadcast"},"startTime":1784599248699,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":705434,"timestamp":5791276472906,"id":84,"parentId":39,"tags":{},"startTime":1784599248719,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":723239,"timestamp":5791276455190,"id":39,"parentId":19,"tags":{"page":"/api/hub/health"},"startTime":1784599248701,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":713101,"timestamp":5791276472960,"id":85,"parentId":40,"tags":{},"startTime":1784599248719,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":730817,"timestamp":5791276455331,"id":40,"parentId":19,"tags":{"page":"/api/hub/inbox"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":722878,"timestamp":5791276467195,"id":74,"parentId":21,"tags":{},"startTime":1784599248713,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":745226,"timestamp":5791276444925,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1784599248691,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":717226,"timestamp":5791276473145,"id":86,"parentId":41,"tags":{},"startTime":1784599248719,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":734885,"timestamp":5791276455527,"id":41,"parentId":19,"tags":{"page":"/api/hub/messages"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":738648,"timestamp":5791276473212,"id":88,"parentId":43,"tags":{},"startTime":1784599248719,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":756190,"timestamp":5791276455755,"id":43,"parentId":19,"tags":{"page":"/api/hub/nodes"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":744273,"timestamp":5791276473223,"id":89,"parentId":44,"tags":{},"startTime":1784599248719,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":761725,"timestamp":5791276455848,"id":44,"parentId":19,"tags":{"page":"/api/hub/register"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":749396,"timestamp":5791276473236,"id":90,"parentId":45,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":766790,"timestamp":5791276455918,"id":45,"parentId":19,"tags":{"page":"/api/hub/send"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":754936,"timestamp":5791276473249,"id":91,"parentId":46,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":772211,"timestamp":5791276456050,"id":46,"parentId":19,"tags":{"page":"/api/hub/server-logs"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":784761,"timestamp":5791276468669,"id":81,"parentId":35,"tags":{},"startTime":1784599248715,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":801124,"timestamp":5791276452401,"id":35,"parentId":19,"tags":{"page":"/api/hub/audit-log"},"startTime":1784599248699,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":780538,"timestamp":5791276473259,"id":92,"parentId":48,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":797447,"timestamp":5791276456407,"id":48,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/health"},"startTime":1784599248703,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":786269,"timestamp":5791276468305,"id":79,"parentId":33,"tags":{},"startTime":1784599248715,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":802541,"timestamp":5791276452082,"id":33,"parentId":19,"tags":{"page":"/api/auth/logout"},"startTime":1784599248698,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":792083,"timestamp":5791276468500,"id":80,"parentId":34,"tags":{},"startTime":1784599248715,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":808388,"timestamp":5791276452256,"id":34,"parentId":19,"tags":{"page":"/api/auth/v3"},"startTime":1784599248699,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":787609,"timestamp":5791276473301,"id":95,"parentId":52,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":803649,"timestamp":5791276457323,"id":52,"parentId":19,"tags":{"page":"/api/hub/status"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":794432,"timestamp":5791276473273,"id":93,"parentId":50,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":810653,"timestamp":5791276457120,"id":50,"parentId":19,"tags":{"page":"/api/hub/session"},"startTime":1784599248703,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":798003,"timestamp":5791276473289,"id":94,"parentId":51,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":814110,"timestamp":5791276457243,"id":51,"parentId":19,"tags":{"page":"/api/hub/stats"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":798171,"timestamp":5791276473311,"id":96,"parentId":53,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":814125,"timestamp":5791276457387,"id":53,"parentId":19,"tags":{"page":"/api/hub/task-events"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":811294,"timestamp":5791276473358,"id":98,"parentId":55,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":827187,"timestamp":5791276457538,"id":55,"parentId":19,"tags":{"page":"/api/hub/tmux"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":811512,"timestamp":5791276473376,"id":99,"parentId":56,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":827334,"timestamp":5791276457590,"id":56,"parentId":19,"tags":{"page":"/api/hub/tokens"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":830937,"timestamp":5791276473340,"id":97,"parentId":54,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":846912,"timestamp":5791276457455,"id":54,"parentId":19,"tags":{"page":"/api/hub/tasks"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":836142,"timestamp":5791276473415,"id":102,"parentId":61,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":851297,"timestamp":5791276458350,"id":61,"parentId":19,"tags":{"page":"/manifest.webmanifest"},"startTime":1784599248705,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":832803,"timestamp":5791276497580,"id":104,"parentId":27,"tags":{},"startTime":1784599248744,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":880331,"timestamp":5791276450138,"id":27,"parentId":19,"tags":{"page":"/api/anet/node-create"},"startTime":1784599248696,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":836457,"timestamp":5791276494218,"id":103,"parentId":24,"tags":{},"startTime":1784599248741,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":884103,"timestamp":5791276446620,"id":24,"parentId":19,"tags":{"page":"/api/anet/config"},"startTime":1784599248693,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":860254,"timestamp":5791276473390,"id":100,"parentId":57,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":876062,"timestamp":5791276457637,"id":57,"parentId":19,"tags":{"page":"/api/hub/upload"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":867927,"timestamp":5791276473403,"id":101,"parentId":58,"tags":{},"startTime":1784599248720,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":883702,"timestamp":5791276457705,"id":58,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":873792,"timestamp":5791276467780,"id":76,"parentId":29,"tags":{},"startTime":1784599248714,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":890708,"timestamp":5791276450969,"id":29,"parentId":19,"tags":{"page":"/api/anet/providers/probe-results"},"startTime":1784599248697,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":827113,"timestamp":5791276514926,"id":107,"parentId":28,"tags":{},"startTime":1784599248761,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":891562,"timestamp":5791276450546,"id":28,"parentId":19,"tags":{"page":"/api/anet/node-lifecycle"},"startTime":1784599248697,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":844314,"timestamp":5791276502271,"id":106,"parentId":26,"tags":{},"startTime":1784599248749,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":896920,"timestamp":5791276449720,"id":26,"parentId":19,"tags":{"page":"/api/anet/node-config"},"startTime":1784599248696,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":849073,"timestamp":5791276498977,"id":105,"parentId":25,"tags":{},"startTime":1784599248745,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":898781,"timestamp":5791276449331,"id":25,"parentId":19,"tags":{"page":"/api/anet/host-supervisors"},"startTime":1784599248696,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":885140,"timestamp":5791276473193,"id":87,"parentId":42,"tags":{},"startTime":1784599248719,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":902776,"timestamp":5791276455653,"id":42,"parentId":19,"tags":{"page":"/api/hub/networks"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":837521,"timestamp":5791276527366,"id":109,"parentId":38,"tags":{},"startTime":1784599248774,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":910136,"timestamp":5791276454840,"id":38,"parentId":19,"tags":{"page":"/api/hub/events"},"startTime":1784599248701,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":837370,"timestamp":5791276528400,"id":110,"parentId":47,"tags":{},"startTime":1784599248775,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":909666,"timestamp":5791276456173,"id":47,"parentId":19,"tags":{"page":"/api/hub/server/[hostname]/agents"},"startTime":1784599248702,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":837445,"timestamp":5791276529622,"id":111,"parentId":49,"tags":{},"startTime":1784599248776,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":910595,"timestamp":5791276456550,"id":49,"parentId":19,"tags":{"page":"/api/hub/servers"},"startTime":1784599248703,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":843551,"timestamp":5791276525776,"id":108,"parentId":31,"tags":{},"startTime":1784599248772,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":917965,"timestamp":5791276451411,"id":31,"parentId":19,"tags":{"page":"/api/anet/providers"},"startTime":1784599248698,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":834167,"timestamp":5791276541416,"id":113,"parentId":59,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":917602,"timestamp":5791276458050,"id":59,"parentId":19,"tags":{"page":"/login"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":843440,"timestamp":5791276541480,"id":118,"parentId":66,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":923879,"timestamp":5791276461112,"id":66,"parentId":19,"tags":{"page":"/providers"},"startTime":1784599248707,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":856656,"timestamp":5791276541491,"id":119,"parentId":67,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":936819,"timestamp":5791276461415,"id":67,"parentId":19,"tags":{"page":"/server-logs"},"startTime":1784599248708,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":862001,"timestamp":5791276541503,"id":120,"parentId":68,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":941888,"timestamp":5791276461701,"id":68,"parentId":19,"tags":{"page":"/servers"},"startTime":1784599248708,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":871164,"timestamp":5791276541514,"id":121,"parentId":69,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":950888,"timestamp":5791276461876,"id":69,"parentId":19,"tags":{"page":"/settings/networks"},"startTime":1784599248708,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":948600,"timestamp":5791276467882,"id":77,"parentId":30,"tags":{},"startTime":1784599248714,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":965331,"timestamp":5791276451218,"id":30,"parentId":19,"tags":{"page":"/api/anet/providers/probe"},"startTime":1784599248697,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":880580,"timestamp":5791276541526,"id":122,"parentId":71,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"}]
2
+ [{"name":"check-page","duration":959562,"timestamp":5791276462940,"id":71,"parentId":19,"tags":{"page":"/settings/tokens"},"startTime":1784599248709,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":895592,"timestamp":5791276541549,"id":124,"parentId":73,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":973641,"timestamp":5791276463597,"id":73,"parentId":19,"tags":{"page":"/tasks"},"startTime":1784599248710,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":900172,"timestamp":5791276541442,"id":115,"parentId":62,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":983285,"timestamp":5791276458413,"id":62,"parentId":19,"tags":{"page":"/messages"},"startTime":1784599248705,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":906323,"timestamp":5791276541560,"id":125,"parentId":65,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":988641,"timestamp":5791276459345,"id":65,"parentId":19,"tags":{"page":"/"},"startTime":1784599248706,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":900361,"timestamp":5791276548040,"id":126,"parentId":70,"tags":{},"startTime":1784599248794,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":986293,"timestamp":5791276462162,"id":70,"parentId":19,"tags":{"page":"/settings"},"startTime":1784599248708,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":922355,"timestamp":5791276541356,"id":112,"parentId":23,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":1017381,"timestamp":5791276446413,"id":23,"parentId":19,"tags":{"page":"/admin"},"startTime":1784599248693,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":926945,"timestamp":5791276541430,"id":114,"parentId":60,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":1010246,"timestamp":5791276458218,"id":60,"parentId":19,"tags":{"page":"/logs"},"startTime":1784599248704,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":938037,"timestamp":5791276541456,"id":116,"parentId":63,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":1020980,"timestamp":5791276458588,"id":63,"parentId":19,"tags":{"page":"/node"},"startTime":1784599248705,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":939083,"timestamp":5791276541467,"id":117,"parentId":64,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":1021457,"timestamp":5791276459128,"id":64,"parentId":19,"tags":{"page":"/nodes"},"startTime":1784599248705,"traceId":"c660bb1185959f0c"},{"name":"is-page-static","duration":973732,"timestamp":5791276541538,"id":123,"parentId":72,"tags":{},"startTime":1784599248788,"traceId":"c660bb1185959f0c"},{"name":"check-page","duration":1052170,"timestamp":5791276463196,"id":72,"parentId":19,"tags":{"page":"/tasks/[id]"},"startTime":1784599248709,"traceId":"c660bb1185959f0c"},{"name":"static-check","duration":1073491,"timestamp":5791276441954,"id":19,"parentId":1,"tags":{},"startTime":1784599248688,"traceId":"c660bb1185959f0c"},{"name":"write-routes-manifest","duration":653,"timestamp":5791277528603,"id":128,"parentId":1,"tags":{},"startTime":1784599249775,"traceId":"c660bb1185959f0c"},{"name":"load-dotenv","duration":86,"timestamp":5791277547661,"id":131,"parentId":130,"tags":{},"startTime":1784599249794,"traceId":"c660bb1185959f0c"},{"name":"run-export-path-map","duration":1128,"timestamp":5791277551588,"id":132,"parentId":130,"tags":{},"startTime":1784599249798,"traceId":"c660bb1185959f0c"},{"name":"next-export","duration":789011,"timestamp":5791277545457,"id":130,"parentId":1,"tags":{},"startTime":1784599249792,"traceId":"c660bb1185959f0c"},{"name":"move-exported-app-not-found-","duration":799,"timestamp":5791278339451,"id":133,"parentId":129,"tags":{},"startTime":1784599250586,"traceId":"c660bb1185959f0c"},{"name":"move-exported-app-global-error-","duration":558,"timestamp":5791278340387,"id":134,"parentId":129,"tags":{},"startTime":1784599250587,"traceId":"c660bb1185959f0c"},{"name":"static-generation","duration":808163,"timestamp":5791277535324,"id":129,"parentId":1,"tags":{},"startTime":1784599249782,"traceId":"c660bb1185959f0c"},{"name":"write-routes-manifest","duration":707,"timestamp":5791278343974,"id":135,"parentId":1,"tags":{},"startTime":1784599250590,"traceId":"c660bb1185959f0c"},{"name":"print-tree-view","duration":4809,"timestamp":5791278359576,"id":136,"parentId":1,"tags":{},"startTime":1784599250606,"traceId":"c660bb1185959f0c"},{"name":"write-route-bundle-stats","duration":27801,"timestamp":5791278364431,"id":137,"parentId":1,"tags":{},"startTime":1784599250611,"traceId":"c660bb1185959f0c"},{"name":"telemetry-flush","duration":18147,"timestamp":5791278392291,"id":138,"parentId":1,"tags":{},"startTime":1784599250639,"traceId":"c660bb1185959f0c"},{"name":"next-build","duration":24062971,"timestamp":5791254347510,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784599226594,"traceId":"c660bb1185959f0c"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":8996895,"timestamp":5788284361787,"id":14,"parentId":1,"tags":{},"startTime":1784596256608,"traceId":"ff99179654b74581"},{"name":"turbopack-build-events","duration":100,"timestamp":5788284719557,"id":15,"parentId":1,"tags":{},"startTime":1784596256966,"traceId":"ff99179654b74581"},{"name":"run-typescript","duration":13362616,"timestamp":5788293370018,"id":16,"parentId":1,"tags":{},"startTime":1784596265616,"traceId":"ff99179654b74581"},{"name":"static-check","duration":1194899,"timestamp":5788307026987,"id":19,"parentId":1,"tags":{},"startTime":1784596279273,"traceId":"ff99179654b74581"},{"name":"static-generation","duration":973577,"timestamp":5788308247420,"id":129,"parentId":1,"tags":{},"startTime":1784596280494,"traceId":"ff99179654b74581"},{"name":"telemetry-flush","duration":16345,"timestamp":5788309273807,"id":138,"parentId":1,"tags":{},"startTime":1784596281520,"traceId":"ff99179654b74581"},{"name":"next-build","duration":25242491,"timestamp":5788284047719,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784596256294,"traceId":"ff99179654b74581"}]
1
+ [{"name":"run-turbopack","duration":8740568,"timestamp":5791254627705,"id":14,"parentId":1,"tags":{},"startTime":1784599226874,"traceId":"c660bb1185959f0c"},{"name":"turbopack-build-events","duration":120,"timestamp":5791255036108,"id":15,"parentId":1,"tags":{},"startTime":1784599227282,"traceId":"c660bb1185959f0c"},{"name":"run-typescript","duration":12741740,"timestamp":5791263405485,"id":16,"parentId":1,"tags":{},"startTime":1784599235652,"traceId":"c660bb1185959f0c"},{"name":"static-check","duration":1073491,"timestamp":5791276441954,"id":19,"parentId":1,"tags":{},"startTime":1784599248688,"traceId":"c660bb1185959f0c"},{"name":"static-generation","duration":808163,"timestamp":5791277535324,"id":129,"parentId":1,"tags":{},"startTime":1784599249782,"traceId":"c660bb1185959f0c"},{"name":"telemetry-flush","duration":18147,"timestamp":5791278392291,"id":138,"parentId":1,"tags":{},"startTime":1784599250639,"traceId":"c660bb1185959f0c"},{"name":"next-build","duration":24062971,"timestamp":5791254347510,"id":1,"tags":{"buildMode":"default","version":"16.2.3","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1784599226594,"traceId":"c660bb1185959f0c"}]
@@ -1,3 +1,8 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useState } from 'react';
4
+ import { useAvatarUrl } from '../lib/avatars';
5
+
1
6
  /** Hue-hashed avatar pill for agent aliases. Same alias → same color across
2
7
  * every page (Messages, Nodes, TopoGraph). Use the `size` prop for inline
3
8
  * pills (16/20) vs card headers (28). Round 21 introduced the palette;
@@ -33,6 +38,32 @@ interface AliasAvatarProps {
33
38
  }
34
39
 
35
40
  export function AliasAvatar({ alias, size = 28, className = '' }: AliasAvatarProps) {
41
+ // R24 (Vincent: 头像换血): a custom image (user-set or designed default)
42
+ // wins over every generated style — ONE seam, all 13 avatar surfaces.
43
+ // Shimmer while loading, silent fallback to the pill on error.
44
+ const url = useAvatarUrl(alias);
45
+ const [imgState, setImgState] = useState<'loading' | 'ready' | 'error'>('loading');
46
+ useEffect(() => { setImgState('loading'); }, [url]);
47
+ if (url && imgState !== 'error') {
48
+ return (
49
+ <span
50
+ className={`anet-alias-avatar relative inline-flex shrink-0 overflow-hidden rounded-full border border-[var(--border)] ${imgState === 'loading' ? 'animate-pulse bg-[var(--bg-elevated)]' : ''} ${className}`}
51
+ style={{ width: size, height: size }}
52
+ title={alias}
53
+ aria-hidden
54
+ >
55
+ {/* eslint-disable-next-line @next/next/no-img-element */}
56
+ <img
57
+ src={url}
58
+ alt=""
59
+ loading="lazy"
60
+ onLoad={() => setImgState('ready')}
61
+ onError={() => setImgState('error')}
62
+ className={`h-full w-full rounded-full object-cover transition-opacity duration-150 ${imgState === 'ready' ? 'opacity-100' : 'opacity-0'}`}
63
+ />
64
+ </span>
65
+ );
66
+ }
36
67
  if (isGrokAlias(alias)) {
37
68
  return (
38
69
  <span
@@ -3,6 +3,7 @@
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
4
  import { Session } from './types';
5
5
  import { AliasAvatar } from './AliasAvatar';
6
+ import { setAvatarUrl, useAvatarUrl } from '../lib/avatars';
6
7
  import { useLifecycleCaps } from './NodeLifecycleMenu';
7
8
 
8
9
  /**
@@ -147,6 +148,55 @@ function SectionTitle({ children }: { children: React.ReactNode }) {
147
148
  return <h3 className="text-[11px] font-medium uppercase tracking-wide text-gray-500 mb-2">{children}</h3>;
148
149
  }
149
150
 
151
+ /* R24 (Vincent 亲点: 头像换血) — per-node custom avatar. Stored browser-side
152
+ (localStorage via app/lib/avatars) until the hub grows an RFC-024
153
+ whitelist entry for avatar_url; the designed default set rides
154
+ /avatars/manifest.json. Live preview through the SAME AliasAvatar every
155
+ surface renders. */
156
+ function AvatarSection({ alias }: { alias: string }) {
157
+ const current = useAvatarUrl(alias);
158
+ const [draft, setDraft] = useState(current);
159
+ useEffect(() => { setDraft(current); }, [current]);
160
+ const dirty = draft.trim() !== current;
161
+ return (
162
+ <section>
163
+ <SectionTitle>头像</SectionTitle>
164
+ <div className="flex items-start gap-3">
165
+ <AliasAvatar alias={alias} size={44} />
166
+ <div className="flex-1 space-y-1.5">
167
+ <input
168
+ type="url"
169
+ value={draft}
170
+ onChange={(e) => setDraft(e.target.value)}
171
+ placeholder="图片 URL(留空恢复默认)"
172
+ className="w-full rounded-md border border-[#26262b] bg-[#0e0e10] px-2.5 py-1.5 text-[12px] text-gray-200 focus:border-cyan-600 focus:outline-none"
173
+ />
174
+ <div className="flex items-center gap-2">
175
+ <button
176
+ type="button"
177
+ disabled={!dirty}
178
+ onClick={() => setAvatarUrl(alias, draft)}
179
+ className="rounded-md border border-cyan-600/40 bg-cyan-600/15 px-2.5 py-1 text-[11px] text-cyan-300 hover:bg-cyan-600/25 disabled:opacity-40"
180
+ >
181
+ 保存
182
+ </button>
183
+ {current && (
184
+ <button
185
+ type="button"
186
+ onClick={() => { setAvatarUrl(alias, ''); setDraft(''); }}
187
+ className="rounded-md border border-[#26262b] px-2.5 py-1 text-[11px] text-gray-400 hover:text-gray-200"
188
+ >
189
+ 恢复默认
190
+ </button>
191
+ )}
192
+ <span className="text-[10px] text-gray-600">存本浏览器;跨设备同步待 hub 支持</span>
193
+ </div>
194
+ </div>
195
+ </div>
196
+ </section>
197
+ );
198
+ }
199
+
150
200
  /** Read-only label/value row. */
151
201
  function InfoRow({ label, value }: { label: string; value: string }) {
152
202
  return (
@@ -587,6 +637,8 @@ export function NodeSettingsPanel({ session: s, onClose }: { session: Session; o
587
637
  </div>
588
638
  </section>
589
639
 
640
+ <AvatarSection alias={s.alias} />
641
+
590
642
  {/* B. Runtime + 模型 (model editable) */}
591
643
  <section>
592
644
  <SectionTitle>Runtime · 模型</SectionTitle>
@@ -74,6 +74,7 @@ function ChatImage({ src, alt, thumbClass, onOpen }: { src: string; alt?: string
74
74
  return (
75
75
  <button
76
76
  type="button"
77
+ data-chat-image={src}
77
78
  onClick={() => onOpen(src)}
78
79
  aria-label={alt || t('查看大图', 'View full image')}
79
80
  className={`relative block overflow-hidden ${state === 'loading' ? 'animate-pulse bg-[var(--bg-elevated)]' : ''} ${thumbClass}`}
@@ -90,8 +91,20 @@ function ChatImage({ src, alt, thumbClass, onOpen }: { src: string; alt?: string
90
91
  );
91
92
  }
92
93
 
93
- function ImageLightbox({ url, onClose, opener }: { url: string; onClose: () => void; opener: HTMLElement | null }) {
94
+ function ImageLightbox({ urls, initialIndex, onClose, opener }: { urls: string[]; initialIndex: number; onClose: () => void; opener: HTMLElement | null }) {
95
+ // R21 (多图还债): navigate all images of the LOADED conversation —
96
+ // ‹ › buttons + arrow keys, WeChat-style no-wrap ends.
97
+ const [idx, setIdx] = useState(initialIndex);
98
+ const url = urls[Math.min(idx, urls.length - 1)];
94
99
  const [loaded, setLoaded] = useState(false);
100
+ const idxRef = useRef(idx);
101
+ idxRef.current = idx;
102
+ const step = (d: number) => {
103
+ setIdx((i) => Math.max(0, Math.min(urls.length - 1, i + d)));
104
+ setLoaded(false);
105
+ };
106
+ const stepRef = useRef(step);
107
+ stepRef.current = step;
95
108
  const dialogRef = useRef<HTMLDivElement>(null);
96
109
  // onClose is recreated on every parent render (and the panel re-renders
97
110
  // every few seconds from soft refreshes) — a [onClose] dep would tear
@@ -113,6 +126,8 @@ function ImageLightbox({ url, onClose, opener }: { url: string; onClose: () => v
113
126
  // behind it (panel hosts listen for Escape too).
114
127
  const onKey = (e: KeyboardEvent) => {
115
128
  if (e.key === 'Escape') { e.stopPropagation(); onClose(); return; }
129
+ if (e.key === 'ArrowLeft') { stepRef.current(-1); return; }
130
+ if (e.key === 'ArrowRight') { stepRef.current(1); return; }
116
131
  if (e.key !== 'Tab') return;
117
132
  const items = focusables();
118
133
  if (items.length === 0) return;
@@ -147,11 +162,33 @@ function ImageLightbox({ url, onClose, opener }: { url: string; onClose: () => v
147
162
  <div ref={dialogRef} className="fixed inset-0 z-[100] flex items-center justify-center bg-black/85" onClick={onClose} role="dialog" aria-modal="true" aria-label={t('图片预览', 'Image preview')}>
148
163
  {!loaded && <div className="absolute h-6 w-6 animate-spin rounded-full border-2 border-white/30 border-t-white" />}
149
164
  <img
165
+ key={url}
150
166
  src={url}
151
167
  alt=""
152
168
  onLoad={() => setLoaded(true)}
153
169
  className={`max-h-[92vh] max-w-[92vw] rounded object-contain transition-opacity duration-150 ${loaded ? 'opacity-100' : 'opacity-0'}`}
154
170
  />
171
+ {urls.length > 1 && (
172
+ <>
173
+ <span className="absolute left-3 top-3 text-[11px] tabular-nums text-white/70">{idx + 1}/{urls.length}</span>
174
+ <button
175
+ onClick={(e) => { e.stopPropagation(); step(-1); }}
176
+ disabled={idx === 0}
177
+ aria-label={t('上一张', 'Previous image')}
178
+ className="absolute left-1 top-1/2 flex h-11 w-11 -translate-y-1/2 items-center justify-center rounded-full text-2xl text-white/80 hover:bg-white/10 disabled:opacity-25"
179
+ >
180
+ ‹
181
+ </button>
182
+ <button
183
+ onClick={(e) => { e.stopPropagation(); step(1); }}
184
+ disabled={idx === urls.length - 1}
185
+ aria-label={t('下一张', 'Next image')}
186
+ className="absolute right-1 top-1/2 flex h-11 w-11 -translate-y-1/2 items-center justify-center rounded-full text-2xl text-white/80 hover:bg-white/10 disabled:opacity-25"
187
+ >
188
+ ›
189
+ </button>
190
+ </>
191
+ )}
155
192
  <a
156
193
  href={url}
157
194
  target="_blank"
@@ -397,6 +434,33 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
397
434
  const [historyError, setHistoryError] = useState(false);
398
435
  const [targetAlias, setTargetAlias] = useState(alias);
399
436
  const [showMentions, setShowMentions] = useState(false);
437
+ const [mentionIndex, setMentionIndex] = useState(0);
438
+ // R23 (拼音债): Chinese aliases are unreachable by typing pinyin — load
439
+ // pinyin-pro lazily the FIRST time the @ dropdown opens (own chunk;
440
+ // zero cost to first paint) and match against full pinyin + initials.
441
+ const pinyinRef = useRef<((text: string) => [string, string]) | null>(null);
442
+ const pinyinCacheRef = useRef<Map<string, [string, string]>>(new Map());
443
+ const [, bumpPinyin] = useState(0);
444
+ useEffect(() => {
445
+ if (!showMentions || pinyinRef.current) return;
446
+ import('pinyin-pro').then((m) => {
447
+ pinyinRef.current = (text: string) => [
448
+ m.pinyin(text, { toneType: 'none', type: 'array' }).join('').toLowerCase(),
449
+ m.pinyin(text, { pattern: 'first', toneType: 'none', type: 'array' }).join('').toLowerCase(),
450
+ ];
451
+ bumpPinyin((v) => v + 1);
452
+ }).catch(() => {});
453
+ }, [showMentions]);
454
+ const mentionMatches = useCallback((alias: string, filter: string) => {
455
+ if (!filter) return true;
456
+ if (alias.toLowerCase().includes(filter)) return true;
457
+ const py = pinyinRef.current;
458
+ if (!py) return false;
459
+ let entry = pinyinCacheRef.current.get(alias);
460
+ if (!entry) { entry = py(alias); pinyinCacheRef.current.set(alias, entry); }
461
+ return entry[0].includes(filter) || entry[1].includes(filter);
462
+ }, []);
463
+ const [attachLimitHit, setAttachLimitHit] = useState(false);
400
464
  const [mentionFilter, setMentionFilter] = useState('');
401
465
  const [mentionNodes, setMentionNodes] = useState<string[]>([]);
402
466
  const messagesEndRef = useRef<HTMLDivElement>(null);
@@ -425,7 +489,8 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
425
489
  // would always look "not at bottom" because the new content itself
426
490
  // grew the distance).
427
491
  const [newBelow, setNewBelow] = useState(0);
428
- const [lightboxUrl, setLightboxUrl] = useState<string | null>(null);
492
+ const [lightbox, setLightbox] = useState<{ urls: string[]; idx: number } | null>(null);
493
+ const [errorFor, setErrorFor] = useState<string | null>(null);
429
494
  // Loop R15 (会话内搜索): client-side filter over the LOADED window —
430
495
  // honest scope (the hint says so); load earlier messages to widen it.
431
496
  const [searchOpen, setSearchOpen] = useState(false);
@@ -435,7 +500,13 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
435
500
  const lightboxOpenerRef = useRef<HTMLElement | null>(null);
436
501
  const openLightbox = useCallback((url: string) => {
437
502
  lightboxOpenerRef.current = document.activeElement as HTMLElement | null;
438
- setLightboxUrl(url);
503
+ // Collect every image of the loaded conversation in document order —
504
+ // DOM-driven so it exactly matches what's rendered (markdown +
505
+ // attachments, collapsed content included).
506
+ const nodes = Array.from(scrollRef.current?.querySelectorAll<HTMLElement>('[data-chat-image]') || []);
507
+ const urls = Array.from(new Set(nodes.map((n) => n.getAttribute('data-chat-image') || '').filter(Boolean)));
508
+ const idx = Math.max(0, urls.indexOf(url));
509
+ setLightbox({ urls: urls.length ? urls : [url], idx });
439
510
  }, []);
440
511
  const atBottomRef = useRef(true);
441
512
  const prevBubblesRef = useRef(0);
@@ -571,6 +642,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
571
642
  atBottomRef.current = true;
572
643
  prevBubblesRef.current = 0;
573
644
  setNewBelow(0);
645
+ setErrorFor(null);
574
646
  setHasOlder(true);
575
647
  loadInitial();
576
648
  // Focus textarea
@@ -886,6 +958,17 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
886
958
  };
887
959
 
888
960
  const handleKeyDown = (e: React.KeyboardEvent) => {
961
+ // R22: while the @ mention dropdown is open the keyboard drives IT —
962
+ // previously Enter SENT the half-typed "@通" as a message. ↑↓ move,
963
+ // Enter/Tab select, Escape closes (below).
964
+ if (showMentions && filteredMentions.length > 0) {
965
+ if (e.key === 'ArrowDown') { e.preventDefault(); setMentionIndex((i) => (i + 1) % filteredMentions.length); return; }
966
+ if (e.key === 'ArrowUp') { e.preventDefault(); setMentionIndex((i) => (i - 1 + filteredMentions.length) % filteredMentions.length); return; }
967
+ if (e.key === 'Enter' || e.key === 'Tab') {
968
+ if (!e.nativeEvent.isComposing) { e.preventDefault(); insertMention(filteredMentions[Math.min(mentionIndex, filteredMentions.length - 1)]); }
969
+ return;
970
+ }
971
+ }
889
972
  // Enter sends, Shift+Enter inserts newline (standard DESKTOP chat UX —
890
973
  // users habit-pressed Enter expecting send). On touch (coarse pointer)
891
974
  // Enter inserts a newline instead: phones have no Shift, and WeChat
@@ -906,6 +989,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
906
989
  const after = value.slice(lastAt + 1);
907
990
  if (!after.includes(' ') && !after.includes('\n')) {
908
991
  setMentionFilter(after.toLowerCase());
992
+ setMentionIndex(0);
909
993
  setShowMentions(true);
910
994
  return;
911
995
  }
@@ -916,6 +1000,11 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
916
1000
  const addImageFiles = (files: FileList | File[]) => {
917
1001
  const images = Array.from(files).filter(file => file.type.startsWith('image/'));
918
1002
  if (images.length === 0) return;
1003
+ // R22: the 6-image cap used to truncate silently — surface it.
1004
+ if (attachedFiles.length + images.length > 6) {
1005
+ setAttachLimitHit(true);
1006
+ setTimeout(() => setAttachLimitHit(false), 3000);
1007
+ }
919
1008
  setAttachedFiles(prev => [...prev, ...images].slice(0, 6));
920
1009
  };
921
1010
 
@@ -936,7 +1025,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
936
1025
  };
937
1026
 
938
1027
  const filteredMentions = mentionNodes.filter(n =>
939
- n !== alias && n.toLowerCase().includes(mentionFilter)
1028
+ n !== alias && mentionMatches(n, mentionFilter)
940
1029
  ).slice(0, 8);
941
1030
 
942
1031
  const autoResize = (el: HTMLTextAreaElement) => {
@@ -1134,13 +1223,16 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1134
1223
  {/* Outgoing task — labeled with origin so peer-forwarded tasks are obvious */}
1135
1224
  <div className="flex items-center justify-end gap-1.5" data-ev={`${m.task_id}:task`}>
1136
1225
  {m.status === 'failed' && fromUser && (
1137
- <span
1226
+ <button
1227
+ type="button"
1228
+ onClick={() => setErrorFor((cur) => (cur === m.task_id ? null : m.task_id))}
1138
1229
  title={(m.result || '').replace(/^❌\s*/, '') || t('发送失败', 'Send failed')}
1139
- aria-label={t('发送失败', 'Send failed')}
1140
- className="flex h-[18px] w-[18px] shrink-0 cursor-help items-center justify-center rounded-full bg-red-500 text-[11px] font-bold leading-none text-white"
1230
+ aria-label={t('发送失败,点击查看原因', 'Send failed — tap for reason')}
1231
+ aria-expanded={errorFor === m.task_id}
1232
+ className="flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full bg-red-500 text-[11px] font-bold leading-none text-white"
1141
1233
  >
1142
1234
  !
1143
- </span>
1235
+ </button>
1144
1236
  )}
1145
1237
  <div title={m.created_at} className={`max-w-[92%] sm:max-w-[min(85%,56ch)] bg-cyan-500/8 border border-cyan-500/15 rounded-2xl rounded-br-md px-3 py-2.5 sm:px-4 shadow-sm ${currentMatchKey === `${m.task_id}:task` ? 'ring-2 ring-yellow-400/60' : ''}`}>
1146
1238
  <div className="flex items-center gap-2 mb-1">
@@ -1175,6 +1267,14 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1175
1267
  </div>
1176
1268
  </div>
1177
1269
 
1270
+ {m.status === 'failed' && errorFor === m.task_id && (
1271
+ <div className="flex justify-end">
1272
+ <div className="max-w-[92%] rounded-lg border border-red-500/30 bg-red-500/10 px-2.5 py-1.5 text-[11px] leading-5 text-red-300">
1273
+ {(m.result || '').replace(/^❌\s*/, '') || t('发送失败', 'Send failed')}
1274
+ </div>
1275
+ </div>
1276
+ )}
1277
+
1178
1278
  {/* Typing indicator when running */}
1179
1279
  {m.status === 'running' && !m.result && (
1180
1280
  <div className="flex justify-start">
@@ -1216,9 +1316,11 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1216
1316
  {/* @ mention dropdown */}
1217
1317
  {showMentions && filteredMentions.length > 0 && (
1218
1318
  <div className="absolute bottom-full left-0 right-0 mb-1 bg-[var(--bg-secondary)] border border-[var(--border)] rounded-lg shadow-xl shadow-black/50 overflow-hidden z-10 max-h-48 overflow-y-auto">
1219
- {filteredMentions.map(node => (
1319
+ {filteredMentions.map((node, i) => (
1220
1320
  <button key={node} onClick={() => insertMention(node)}
1221
- className="w-full flex items-center gap-2 px-3 py-2 text-xs text-left hover:bg-cyan-500/10 transition-colors">
1321
+ onMouseEnter={() => setMentionIndex(i)}
1322
+ aria-selected={i === mentionIndex}
1323
+ className={`w-full flex items-center gap-2 px-3 py-2 text-xs text-left transition-colors ${i === mentionIndex ? 'bg-cyan-500/10' : 'hover:bg-cyan-500/10'}`}>
1222
1324
  <AliasAvatar alias={node} size={16} />
1223
1325
  <span className="text-[var(--fg-muted)]">{node}</span>
1224
1326
  </button>
@@ -1270,6 +1372,9 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1270
1372
  )}
1271
1373
  </button>
1272
1374
  </div>
1375
+ {attachLimitHit && (
1376
+ <div className="mt-1 text-[10px] text-amber-400" role="status">{t('最多同时附带 6 张图片', 'Up to 6 images at a time')}</div>
1377
+ )}
1273
1378
  {attachedFiles.length > 0 && (
1274
1379
  <div className="mt-2 flex flex-wrap gap-2">
1275
1380
  {attachedFiles.map((file, index) => (
@@ -1286,7 +1391,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1286
1391
  <span>Enter to send · paste image</span>
1287
1392
  </div>
1288
1393
  </div>
1289
- {lightboxUrl && <ImageLightbox url={lightboxUrl} opener={lightboxOpenerRef.current} onClose={() => setLightboxUrl(null)} />}
1394
+ {lightbox && <ImageLightbox urls={lightbox.urls} initialIndex={lightbox.idx} opener={lightboxOpenerRef.current} onClose={() => setLightbox(null)} />}
1290
1395
  </>
1291
1396
  );
1292
1397
 
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+
3
+ import { useSyncExternalStore } from 'react';
4
+
5
+ /* Loop R24 (Vincent 亲点: 头像换血) — custom avatar infrastructure.
6
+ *
7
+ * Resolution order, per alias:
8
+ * 1. user override — localStorage map, settable in the node settings UI
9
+ * 2. designed default — /avatars/manifest.json (static, alias → image URL);
10
+ * the design-side illustration set lands there later with ZERO code
11
+ * change (drop files under public/avatars/ + list them in the manifest)
12
+ * 3. '' → caller falls back to the hue-hashed initial pill
13
+ *
14
+ * Hub-side persistence (cross-device) needs an RFC-024 whitelist extension
15
+ * (`avatar_url` is not an editable flag today — update would return
16
+ * invalid_patch); when the hub grows it, hydrate the store from the hub here
17
+ * without touching any consumer.
18
+ */
19
+
20
+ const STORE_KEY = 'anet_avatars_v1';
21
+ const AVATAR_EVENT = 'anet-avatars-updated';
22
+
23
+ let manifest: Record<string, string> | null = null;
24
+ let manifestRequested = false;
25
+
26
+ function fetchManifestOnce() {
27
+ if (manifestRequested || typeof window === 'undefined') return;
28
+ manifestRequested = true;
29
+ fetch('/avatars/manifest.json', { cache: 'no-cache' })
30
+ .then((r) => (r.ok ? r.json() : null))
31
+ .then((j) => {
32
+ if (j && typeof j === 'object') {
33
+ manifest = j as Record<string, string>;
34
+ window.dispatchEvent(new Event(AVATAR_EVENT));
35
+ }
36
+ })
37
+ .catch(() => {});
38
+ }
39
+
40
+ function readMap(): Record<string, string> {
41
+ if (typeof window === 'undefined') return {};
42
+ try {
43
+ const parsed = JSON.parse(window.localStorage.getItem(STORE_KEY) || '{}');
44
+ return parsed && typeof parsed === 'object' ? parsed : {};
45
+ } catch {
46
+ return {};
47
+ }
48
+ }
49
+
50
+ export function getAvatarUrl(alias?: string | null): string {
51
+ if (!alias) return '';
52
+ return readMap()[alias] || manifest?.[alias] || '';
53
+ }
54
+
55
+ /** Empty/whitespace url removes the override (falls back to manifest/pill). */
56
+ export function setAvatarUrl(alias: string, url: string) {
57
+ if (typeof window === 'undefined' || !alias) return;
58
+ try {
59
+ const m = readMap();
60
+ if (url.trim()) m[alias] = url.trim();
61
+ else delete m[alias];
62
+ window.localStorage.setItem(STORE_KEY, JSON.stringify(m));
63
+ window.dispatchEvent(new Event(AVATAR_EVENT));
64
+ } catch {}
65
+ }
66
+
67
+ function subscribe(callback: () => void) {
68
+ fetchManifestOnce();
69
+ window.addEventListener(AVATAR_EVENT, callback);
70
+ window.addEventListener('storage', callback);
71
+ return () => {
72
+ window.removeEventListener(AVATAR_EVENT, callback);
73
+ window.removeEventListener('storage', callback);
74
+ };
75
+ }
76
+
77
+ export function useAvatarUrl(alias?: string | null): string {
78
+ return useSyncExternalStore(subscribe, () => getAvatarUrl(alias), () => '');
79
+ }