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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (793) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build/chunks/{node_modules_13sb.px._.js → 00jm_02mlcew._.js} +167 -167
  3. package/.next/build/chunks/00jm_02mlcew._.js.map +47 -0
  4. package/.next/build/chunks/{[root-of-the-server]__0ubbtyl._.js → [root-of-the-server]__0tgc-8p._.js} +3 -3
  5. package/.next/build/chunks/{[root-of-the-server]__0d-m0h0._.js → [root-of-the-server]__13z64y.._.js} +7 -7
  6. package/.next/build/chunks/{[root-of-the-server]__0d-m0h0._.js.map → [root-of-the-server]__13z64y.._.js.map} +2 -2
  7. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0r4x5ys._.js +13 -0
  8. package/.next/build/chunks/[turbopack]_runtime.js +1 -1
  9. package/.next/build/postcss.js +4 -4
  10. package/.next/build-manifest.json +8 -8
  11. package/.next/diagnostics/route-bundle-stats.json +143 -143
  12. package/.next/fallback-build-manifest.json +3 -3
  13. package/.next/next-minimal-server.js.nft.json +1 -1
  14. package/.next/next-server.js.nft.json +1 -1
  15. package/.next/prerender-manifest.json +3 -3
  16. package/.next/required-server-files.js +4 -4
  17. package/.next/required-server-files.json +4 -4
  18. package/.next/server/app/_global-error/page/build-manifest.json +5 -5
  19. package/.next/server/app/_global-error/page.js +9 -9
  20. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  21. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/_global-error.html +1 -1
  23. package/.next/server/app/_global-error.rsc +8 -8
  24. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  25. package/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
  26. package/.next/server/app/_global-error.segments/_head.segment.rsc +4 -4
  27. package/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  28. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/_not-found/page/build-manifest.json +5 -5
  30. package/.next/server/app/_not-found/page/next-font-manifest.json +1 -1
  31. package/.next/server/app/_not-found/page.js +12 -12
  32. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  33. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/.next/server/app/_not-found.html +2 -2
  35. package/.next/server/app/_not-found.rsc +12 -12
  36. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  37. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  38. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  39. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  40. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  41. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  42. package/.next/server/app/admin/page/build-manifest.json +5 -5
  43. package/.next/server/app/admin/page/next-font-manifest.json +1 -1
  44. package/.next/server/app/admin/page.js +13 -13
  45. package/.next/server/app/admin/page.js.nft.json +1 -1
  46. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/admin.html +2 -2
  48. package/.next/server/app/admin.rsc +14 -14
  49. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  50. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  51. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  52. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  54. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  55. package/.next/server/app/api/anet/config/route.js +6 -6
  56. package/.next/server/app/api/anet/config/route.js.nft.json +1 -1
  57. package/.next/server/app/api/auth/login/route.js +7 -7
  58. package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  59. package/.next/server/app/api/auth/logout/route.js +7 -7
  60. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  61. package/.next/server/app/api/auth/v3/route.js +7 -7
  62. package/.next/server/app/api/auth/v3/route.js.nft.json +1 -1
  63. package/.next/server/app/api/hub/audit-log/route.js +6 -6
  64. package/.next/server/app/api/hub/audit-log/route.js.nft.json +1 -1
  65. package/.next/server/app/api/hub/auth/route.js +7 -7
  66. package/.next/server/app/api/hub/auth/route.js.nft.json +1 -1
  67. package/.next/server/app/api/hub/broadcast/route.js +6 -6
  68. package/.next/server/app/api/hub/broadcast/route.js.nft.json +1 -1
  69. package/.next/server/app/api/hub/events/route.js +6 -6
  70. package/.next/server/app/api/hub/events/route.js.nft.json +1 -1
  71. package/.next/server/app/api/hub/health/route.js +6 -6
  72. package/.next/server/app/api/hub/health/route.js.nft.json +1 -1
  73. package/.next/server/app/api/hub/inbox/route.js +6 -6
  74. package/.next/server/app/api/hub/inbox/route.js.nft.json +1 -1
  75. package/.next/server/app/api/hub/license/route.js +6 -6
  76. package/.next/server/app/api/hub/license/route.js.nft.json +1 -1
  77. package/.next/server/app/api/hub/messages/route.js +6 -6
  78. package/.next/server/app/api/hub/messages/route.js.nft.json +1 -1
  79. package/.next/server/app/api/hub/networks/route.js +6 -6
  80. package/.next/server/app/api/hub/networks/route.js.nft.json +1 -1
  81. package/.next/server/app/api/hub/nodes/route.js +6 -6
  82. package/.next/server/app/api/hub/nodes/route.js.nft.json +1 -1
  83. package/.next/server/app/api/hub/register/route.js +6 -6
  84. package/.next/server/app/api/hub/register/route.js.nft.json +1 -1
  85. package/.next/server/app/api/hub/send/route.js +6 -6
  86. package/.next/server/app/api/hub/send/route.js.nft.json +1 -1
  87. package/.next/server/app/api/hub/server-logs/route.js +6 -6
  88. package/.next/server/app/api/hub/server-logs/route.js.nft.json +1 -1
  89. package/.next/server/app/api/hub/session/route.js +6 -6
  90. package/.next/server/app/api/hub/session/route.js.nft.json +1 -1
  91. package/.next/server/app/api/hub/stats/route.js +6 -6
  92. package/.next/server/app/api/hub/stats/route.js.nft.json +1 -1
  93. package/.next/server/app/api/hub/status/route.js +6 -6
  94. package/.next/server/app/api/hub/status/route.js.nft.json +1 -1
  95. package/.next/server/app/api/hub/task-events/route.js +6 -6
  96. package/.next/server/app/api/hub/task-events/route.js.nft.json +1 -1
  97. package/.next/server/app/api/hub/tasks/route.js +6 -6
  98. package/.next/server/app/api/hub/tasks/route.js.nft.json +1 -1
  99. package/.next/server/app/api/hub/tmux/route.js +6 -6
  100. package/.next/server/app/api/hub/tmux/route.js.nft.json +1 -1
  101. package/.next/server/app/api/hub/tokens/route.js +6 -6
  102. package/.next/server/app/api/hub/tokens/route.js.nft.json +1 -1
  103. package/.next/server/app/favicon.ico/route.js +6 -6
  104. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  105. package/.next/server/app/index.html +2 -2
  106. package/.next/server/app/index.rsc +14 -14
  107. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  108. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  109. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  110. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  111. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  112. package/.next/server/app/login/page/build-manifest.json +5 -5
  113. package/.next/server/app/login/page/next-font-manifest.json +1 -1
  114. package/.next/server/app/login/page.js +13 -13
  115. package/.next/server/app/login/page.js.nft.json +1 -1
  116. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  117. package/.next/server/app/login.html +2 -2
  118. package/.next/server/app/login.rsc +14 -14
  119. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  120. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  121. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  122. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  123. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  124. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  125. package/.next/server/app/logs/page/build-manifest.json +5 -5
  126. package/.next/server/app/logs/page/next-font-manifest.json +1 -1
  127. package/.next/server/app/logs/page.js +13 -13
  128. package/.next/server/app/logs/page.js.nft.json +1 -1
  129. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  130. package/.next/server/app/logs.html +2 -2
  131. package/.next/server/app/logs.rsc +14 -14
  132. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  133. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  134. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  135. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  136. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  137. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  138. package/.next/server/app/messages/page/build-manifest.json +5 -5
  139. package/.next/server/app/messages/page/next-font-manifest.json +1 -1
  140. package/.next/server/app/messages/page.js +13 -13
  141. package/.next/server/app/messages/page.js.nft.json +1 -1
  142. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  143. package/.next/server/app/messages.html +2 -2
  144. package/.next/server/app/messages.rsc +14 -14
  145. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  146. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  147. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  148. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  149. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  150. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  151. package/.next/server/app/node/page/build-manifest.json +5 -5
  152. package/.next/server/app/node/page/next-font-manifest.json +1 -1
  153. package/.next/server/app/node/page.js +13 -13
  154. package/.next/server/app/node/page.js.nft.json +1 -1
  155. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/node.html +2 -2
  157. package/.next/server/app/node.rsc +14 -14
  158. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  159. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  160. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  161. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  162. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  163. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  164. package/.next/server/app/nodes/page/build-manifest.json +5 -5
  165. package/.next/server/app/nodes/page/next-font-manifest.json +1 -1
  166. package/.next/server/app/nodes/page.js +13 -13
  167. package/.next/server/app/nodes/page.js.nft.json +1 -1
  168. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  169. package/.next/server/app/nodes.html +2 -2
  170. package/.next/server/app/nodes.rsc +14 -14
  171. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  172. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  173. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  174. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  175. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  176. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  177. package/.next/server/app/page/build-manifest.json +5 -5
  178. package/.next/server/app/page/next-font-manifest.json +1 -1
  179. package/.next/server/app/page.js +13 -13
  180. package/.next/server/app/page.js.nft.json +1 -1
  181. package/.next/server/app/page_client-reference-manifest.js +1 -1
  182. package/.next/server/app/server-logs/page/build-manifest.json +5 -5
  183. package/.next/server/app/server-logs/page/next-font-manifest.json +1 -1
  184. package/.next/server/app/server-logs/page.js +13 -13
  185. package/.next/server/app/server-logs/page.js.nft.json +1 -1
  186. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  187. package/.next/server/app/server-logs.html +2 -2
  188. package/.next/server/app/server-logs.rsc +14 -14
  189. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  190. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  191. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  192. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  193. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  194. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  195. package/.next/server/app/settings/networks/page/build-manifest.json +5 -5
  196. package/.next/server/app/settings/networks/page/next-font-manifest.json +1 -1
  197. package/.next/server/app/settings/networks/page.js +13 -13
  198. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  199. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  200. package/.next/server/app/settings/networks.html +2 -2
  201. package/.next/server/app/settings/networks.rsc +14 -14
  202. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  203. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  204. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  205. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  206. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  207. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  208. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  209. package/.next/server/app/settings/page/build-manifest.json +5 -5
  210. package/.next/server/app/settings/page/next-font-manifest.json +1 -1
  211. package/.next/server/app/settings/page.js +13 -13
  212. package/.next/server/app/settings/page.js.nft.json +1 -1
  213. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  214. package/.next/server/app/settings/tokens/page/build-manifest.json +5 -5
  215. package/.next/server/app/settings/tokens/page/next-font-manifest.json +1 -1
  216. package/.next/server/app/settings/tokens/page.js +13 -13
  217. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  218. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/settings/tokens.html +2 -2
  220. package/.next/server/app/settings/tokens.rsc +14 -14
  221. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  222. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  223. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  224. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  225. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  226. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  227. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  228. package/.next/server/app/settings.html +2 -2
  229. package/.next/server/app/settings.rsc +14 -14
  230. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  231. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  232. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  233. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  234. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  235. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  236. package/.next/server/app/tasks/[id]/page/build-manifest.json +5 -5
  237. package/.next/server/app/tasks/[id]/page/next-font-manifest.json +1 -1
  238. package/.next/server/app/tasks/[id]/page.js +13 -13
  239. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  240. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/tasks/page/build-manifest.json +5 -5
  242. package/.next/server/app/tasks/page/next-font-manifest.json +1 -1
  243. package/.next/server/app/tasks/page.js +13 -13
  244. package/.next/server/app/tasks/page.js.nft.json +1 -1
  245. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/tasks.html +2 -2
  247. package/.next/server/app/tasks.rsc +14 -14
  248. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  249. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  250. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  251. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  252. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  253. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  254. package/.next/server/chunks/00jm_next_04f3gac._.js +10 -0
  255. package/.next/server/chunks/00jm_next_04f3gac._.js.map +1 -0
  256. package/.next/server/chunks/00jm_next_dist_esm_build_templates_app-route_02f430o.js +3 -0
  257. package/.next/server/chunks/00jm_next_dist_esm_build_templates_app-route_02f430o.js.map +1 -0
  258. package/.next/server/chunks/0ci9_nt-network-dashboard__next-internal_server_app_api_auth_v3_route_actions_0f5nbzr.js +3 -0
  259. package/.next/server/chunks/0ci9_nt-network-dashboard__next-internal_server_app_favicon_ico_route_actions_0t0eu9r.js +3 -0
  260. package/.next/server/chunks/0ykm__next-internal_server_app_api_anet_config_route_actions_0a~v55_.js +3 -0
  261. package/.next/server/chunks/0ykm__next-internal_server_app_api_auth_login_route_actions_0xnxfs4.js +3 -0
  262. package/.next/server/chunks/0ykm__next-internal_server_app_api_auth_logout_route_actions_0p8p0rn.js +3 -0
  263. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_audit-log_route_actions_06uquwi.js +3 -0
  264. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_auth_route_actions_0f_y1ey.js +3 -0
  265. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_broadcast_route_actions_0ao3j43.js +3 -0
  266. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_events_route_actions_0_5ndld.js +3 -0
  267. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_health_route_actions_0mpzl74.js +3 -0
  268. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_inbox_route_actions_0stoyto.js +3 -0
  269. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js +3 -0
  270. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_messages_route_actions_059rw1o.js +3 -0
  271. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_networks_route_actions_03sehpn.js +3 -0
  272. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_nodes_route_actions_11fbp28.js +3 -0
  273. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_register_route_actions_0l.d7~n.js +3 -0
  274. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_send_route_actions_0.p82vy.js +3 -0
  275. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_server-logs_route_actions_05~c5lb.js +3 -0
  276. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_session_route_actions_0b9ef2i.js +3 -0
  277. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_stats_route_actions_03u65u0.js +3 -0
  278. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_status_route_actions_0_71ear.js +3 -0
  279. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_task-events_route_actions_07md_ee.js +3 -0
  280. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_tasks_route_actions_0er3uvk.js +3 -0
  281. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_tmux_route_actions_0o_1-8u.js +3 -0
  282. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_tokens_route_actions_09doluz.js +3 -0
  283. package/.next/server/chunks/[root-of-the-server]__0-2le8-._.js +3 -0
  284. package/.next/server/chunks/[root-of-the-server]__0-2le8-._.js.map +1 -0
  285. package/.next/server/chunks/[root-of-the-server]__0-g~15e._.js +3 -0
  286. package/.next/server/chunks/[root-of-the-server]__0-g~15e._.js.map +1 -0
  287. package/.next/server/chunks/[root-of-the-server]__00194.t._.js +3 -0
  288. package/.next/server/chunks/{[root-of-the-server]__03ueci3._.js.map → [root-of-the-server]__00194.t._.js.map} +1 -1
  289. package/.next/server/chunks/[root-of-the-server]__02p2n3n._.js +3 -0
  290. package/.next/server/chunks/[root-of-the-server]__02p2n3n._.js.map +1 -0
  291. package/.next/server/chunks/[root-of-the-server]__02y-i-p._.js +6 -0
  292. package/.next/server/chunks/[root-of-the-server]__02y-i-p._.js.map +1 -0
  293. package/.next/server/chunks/[root-of-the-server]__043tnx2._.js +3 -0
  294. package/.next/server/chunks/{[root-of-the-server]__0o4qfn9._.js.map → [root-of-the-server]__043tnx2._.js.map} +1 -1
  295. package/.next/server/chunks/[root-of-the-server]__04z62zk._.js +3 -0
  296. package/.next/server/chunks/[root-of-the-server]__04z62zk._.js.map +1 -0
  297. package/.next/server/chunks/[root-of-the-server]__06p6kkp._.js +3 -0
  298. package/.next/server/chunks/[root-of-the-server]__06p6kkp._.js.map +1 -0
  299. package/.next/server/chunks/[root-of-the-server]__07ztet2._.js +3 -0
  300. package/.next/server/chunks/[root-of-the-server]__07ztet2._.js.map +1 -0
  301. package/.next/server/chunks/[root-of-the-server]__08uyvdq._.js +20 -0
  302. package/.next/server/chunks/[root-of-the-server]__08uyvdq._.js.map +1 -0
  303. package/.next/server/chunks/[root-of-the-server]__0b7v51y._.js +3 -0
  304. package/.next/server/chunks/[root-of-the-server]__0b7v51y._.js.map +1 -0
  305. package/.next/server/chunks/[root-of-the-server]__0e3ucl1._.js +3 -0
  306. package/.next/server/chunks/{[root-of-the-server]__0rg9ifx._.js.map → [root-of-the-server]__0e3ucl1._.js.map} +1 -1
  307. package/.next/server/chunks/[root-of-the-server]__0e6yail._.js +3 -0
  308. package/.next/server/chunks/[root-of-the-server]__0e6yail._.js.map +1 -0
  309. package/.next/server/chunks/[root-of-the-server]__0gx2_6a._.js +3 -0
  310. package/.next/server/chunks/[root-of-the-server]__0gx2_6a._.js.map +1 -0
  311. package/.next/server/chunks/[root-of-the-server]__0hcnyp.._.js +3 -0
  312. package/.next/server/chunks/{[root-of-the-server]__0o29v8c._.js.map → [root-of-the-server]__0hcnyp.._.js.map} +1 -1
  313. package/.next/server/chunks/[root-of-the-server]__0hg3_8r._.js +3 -0
  314. package/.next/server/chunks/[root-of-the-server]__0hg3_8r._.js.map +1 -0
  315. package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js +3 -0
  316. package/.next/server/chunks/[root-of-the-server]__0mxw4vb._.js.map +1 -0
  317. package/.next/server/chunks/[root-of-the-server]__0mzopco._.js +3 -0
  318. package/.next/server/chunks/[root-of-the-server]__0mzopco._.js.map +1 -0
  319. package/.next/server/chunks/[root-of-the-server]__0o45a4q._.js +3 -0
  320. package/.next/server/chunks/{[root-of-the-server]__0p6tutt._.js.map → [root-of-the-server]__0o45a4q._.js.map} +1 -1
  321. package/.next/server/chunks/[root-of-the-server]__0q-teo6._.js +3 -0
  322. package/.next/server/chunks/[root-of-the-server]__0q-teo6._.js.map +1 -0
  323. package/.next/server/chunks/[root-of-the-server]__0qcxxzf._.js +3 -0
  324. package/.next/server/chunks/[root-of-the-server]__0qcxxzf._.js.map +1 -0
  325. package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js +3 -0
  326. package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js.map +1 -0
  327. package/.next/server/chunks/[root-of-the-server]__0xtp-et._.js +3 -0
  328. package/.next/server/chunks/[root-of-the-server]__0xtp-et._.js.map +1 -0
  329. package/.next/server/chunks/[root-of-the-server]__10pvabe._.js +3 -0
  330. package/.next/server/chunks/[root-of-the-server]__10pvabe._.js.map +1 -0
  331. package/.next/server/chunks/[root-of-the-server]__10t11zq._.js +3 -0
  332. package/.next/server/chunks/[root-of-the-server]__10t11zq._.js.map +1 -0
  333. package/.next/server/chunks/[root-of-the-server]__12r~omy._.js +3 -0
  334. package/.next/server/chunks/[root-of-the-server]__12r~omy._.js.map +1 -0
  335. package/.next/server/chunks/[root-of-the-server]__1389~cs._.js +3 -0
  336. package/.next/server/chunks/[root-of-the-server]__1389~cs._.js.map +1 -0
  337. package/.next/server/chunks/[root-of-the-server]__13n8t..._.js +3 -0
  338. package/.next/server/chunks/[root-of-the-server]__13n8t..._.js.map +1 -0
  339. package/.next/server/chunks/[turbopack]_runtime.js +1 -1
  340. package/.next/server/chunks/ssr/{node_modules_0r_.s40._.js → 00jm_03rn9vn._.js} +2 -2
  341. package/.next/server/chunks/ssr/00jm_03rn9vn._.js.map +1 -0
  342. package/.next/server/chunks/ssr/{node_modules_09w7yel._.js → 00jm_059ns68._.js} +3 -3
  343. package/.next/server/chunks/ssr/00jm_059ns68._.js.map +1 -0
  344. package/.next/server/chunks/ssr/00jm_09ae-q0._.js +3 -0
  345. package/.next/server/chunks/ssr/00jm_09ae-q0._.js.map +1 -0
  346. package/.next/server/chunks/ssr/00jm_0j7__z.._.js +3 -0
  347. package/.next/server/chunks/ssr/00jm_0j7__z.._.js.map +1 -0
  348. package/.next/server/chunks/ssr/00jm_next_01-0urn._.js +6 -0
  349. package/.next/server/chunks/ssr/00jm_next_01-0urn._.js.map +1 -0
  350. package/.next/server/chunks/ssr/00jm_next_dist_05rlh5d._.js +6 -0
  351. package/.next/server/chunks/ssr/00jm_next_dist_05rlh5d._.js.map +1 -0
  352. package/.next/server/chunks/ssr/00jm_next_dist_client_components_0gkudcq._.js +3 -0
  353. package/.next/server/chunks/ssr/00jm_next_dist_client_components_0gkudcq._.js.map +1 -0
  354. package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_forbidden_0ecus3e.js +3 -0
  355. package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_forbidden_0ecus3e.js.map +1 -0
  356. package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_global-error_07n8pg2.js +3 -0
  357. package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_global-error_07n8pg2.js.map +1 -0
  358. package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_unauthorized_0r0uq4j.js +3 -0
  359. package/.next/server/chunks/ssr/00jm_next_dist_client_components_builtin_unauthorized_0r0uq4j.js.map +1 -0
  360. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_002l7yi.js → 00jm_next_dist_esm_build_templates_app-page_0..ddwm.js} +3 -3
  361. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0..ddwm.js.map +1 -0
  362. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0qm1-a1.js → 00jm_next_dist_esm_build_templates_app-page_02bxi6j.js} +3 -3
  363. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_02bxi6j.js.map +1 -0
  364. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_02suzhc.js → 00jm_next_dist_esm_build_templates_app-page_05oassd.js} +3 -3
  365. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05oassd.js.map +1 -0
  366. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0dm~kj8.js → 00jm_next_dist_esm_build_templates_app-page_05vxtby.js} +3 -3
  367. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05vxtby.js.map +1 -0
  368. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0uccf9z.js → 00jm_next_dist_esm_build_templates_app-page_05~eml4.js} +3 -3
  369. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_05~eml4.js.map +1 -0
  370. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0l-fh0i.js → 00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js} +3 -3
  371. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_-g_q2.js.map +1 -0
  372. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0uv6jyc.js → 00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js} +3 -3
  373. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0_ec0xu.js.map +1 -0
  374. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js +4 -0
  375. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0czb6wz.js.map +1 -0
  376. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_13s07li.js → 00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js} +3 -3
  377. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0e-cn.p.js.map +1 -0
  378. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0o9vt1n.js → 00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js} +3 -3
  379. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0k8_sr8.js.map +1 -0
  380. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0nsg22r.js → 00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js} +3 -3
  381. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0lt_3bw.js.map +1 -0
  382. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0d2yq5t.js → 00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js} +3 -3
  383. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0uyh3yt.js.map +1 -0
  384. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0foejvu.js → 00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js} +3 -3
  385. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_0v-a2ps.js.map +1 -0
  386. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js +4 -0
  387. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_12.4r9~.js.map +1 -0
  388. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_07uu-xq.js → 00jm_next_dist_esm_build_templates_app-page_13mqkay.js} +3 -3
  389. package/.next/server/chunks/ssr/00jm_next_dist_esm_build_templates_app-page_13mqkay.js.map +1 -0
  390. package/.next/server/chunks/ssr/0dwh_ent-network-dashboard__next-internal_server_app_server-logs_page_actions_0hkk815.js +3 -0
  391. package/.next/server/chunks/ssr/0yas_gent-network-dashboard__next-internal_server_app__not-found_page_actions_0u.f-rz.js +3 -0
  392. package/.next/server/chunks/ssr/0yas_gent-network-dashboard__next-internal_server_app_tasks_[id]_page_actions_0r3~lho.js +3 -0
  393. package/.next/server/chunks/ssr/0ykm__next-internal_server_app__global-error_page_actions_100fxls.js +3 -0
  394. package/.next/server/chunks/ssr/0ykm__next-internal_server_app_settings_networks_page_actions_0jgy57m.js +3 -0
  395. package/.next/server/chunks/ssr/0ykm__next-internal_server_app_settings_tokens_page_actions_0l5h.k~.js +3 -0
  396. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +3 -0
  397. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -0
  398. package/.next/server/chunks/ssr/[root-of-the-server]__03b.f76._.js +3 -0
  399. package/.next/server/chunks/ssr/[root-of-the-server]__03b.f76._.js.map +1 -0
  400. package/.next/server/chunks/ssr/[root-of-the-server]__063~dul._.js +3 -0
  401. package/.next/server/chunks/ssr/[root-of-the-server]__063~dul._.js.map +1 -0
  402. package/.next/server/chunks/ssr/[root-of-the-server]__07io.d8._.js +3 -0
  403. package/.next/server/chunks/ssr/[root-of-the-server]__07io.d8._.js.map +1 -0
  404. package/.next/server/chunks/ssr/[root-of-the-server]__08d6lp4._.js +3 -0
  405. package/.next/server/chunks/ssr/[root-of-the-server]__08d6lp4._.js.map +1 -0
  406. package/.next/server/chunks/ssr/[root-of-the-server]__09f1wn6._.js +3 -0
  407. package/.next/server/chunks/ssr/[root-of-the-server]__09f1wn6._.js.map +1 -0
  408. package/.next/server/chunks/ssr/[root-of-the-server]__0c4xtkg._.js +3 -0
  409. package/.next/server/chunks/ssr/[root-of-the-server]__0c4xtkg._.js.map +1 -0
  410. package/.next/server/chunks/ssr/[root-of-the-server]__0erfzjn._.js +3 -0
  411. package/.next/server/chunks/ssr/[root-of-the-server]__0erfzjn._.js.map +1 -0
  412. package/.next/server/chunks/ssr/[root-of-the-server]__0ezjwje._.js +3 -0
  413. package/.next/server/chunks/ssr/[root-of-the-server]__0ezjwje._.js.map +1 -0
  414. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +3 -0
  415. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -0
  416. package/.next/server/chunks/ssr/{[root-of-the-server]__08qr2ji._.js → [root-of-the-server]__0gc.4uk._.js} +3 -3
  417. package/.next/server/chunks/ssr/[root-of-the-server]__0gc.4uk._.js.map +1 -0
  418. package/.next/server/chunks/ssr/[root-of-the-server]__0h_p~-4._.js +19 -0
  419. package/.next/server/chunks/ssr/[root-of-the-server]__0h_p~-4._.js.map +1 -0
  420. package/.next/server/chunks/ssr/[root-of-the-server]__0jdr1e5._.js +3 -0
  421. package/.next/server/chunks/ssr/[root-of-the-server]__0jdr1e5._.js.map +1 -0
  422. package/.next/server/chunks/ssr/[root-of-the-server]__0lw16mu._.js +3 -0
  423. package/.next/server/chunks/ssr/[root-of-the-server]__0lw16mu._.js.map +1 -0
  424. package/.next/server/chunks/ssr/[root-of-the-server]__0mjly~-._.js +33 -0
  425. package/.next/server/chunks/ssr/[root-of-the-server]__0mjly~-._.js.map +1 -0
  426. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +3 -0
  427. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +1 -0
  428. package/.next/server/chunks/ssr/[root-of-the-server]__0p-95r_._.js +3 -0
  429. package/.next/server/chunks/ssr/[root-of-the-server]__0p-95r_._.js.map +1 -0
  430. package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js +8 -0
  431. package/.next/server/chunks/ssr/[root-of-the-server]__0u5aqkk._.js.map +1 -0
  432. package/.next/server/chunks/ssr/[root-of-the-server]__0ue5.fy._.js +3 -0
  433. package/.next/server/chunks/ssr/[root-of-the-server]__0ue5.fy._.js.map +1 -0
  434. package/.next/server/chunks/ssr/[root-of-the-server]__0uggxvx._.js +3 -0
  435. package/.next/server/chunks/ssr/[root-of-the-server]__0uggxvx._.js.map +1 -0
  436. package/.next/server/chunks/ssr/[root-of-the-server]__0zjk5ro._.js +3 -0
  437. package/.next/server/chunks/ssr/[root-of-the-server]__0zjk5ro._.js.map +1 -0
  438. package/.next/server/chunks/ssr/[root-of-the-server]__0zz3v7a._.js +3 -0
  439. package/.next/server/chunks/ssr/[root-of-the-server]__0zz3v7a._.js.map +1 -0
  440. package/.next/server/chunks/ssr/[root-of-the-server]__0~y12ef._.js +3 -0
  441. package/.next/server/chunks/ssr/[root-of-the-server]__0~y12ef._.js.map +1 -0
  442. package/.next/server/chunks/ssr/[root-of-the-server]__129sc_9._.js +3 -0
  443. package/.next/server/chunks/ssr/[root-of-the-server]__129sc_9._.js.map +1 -0
  444. package/.next/server/chunks/ssr/[turbopack]_runtime.js +1 -1
  445. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -0
  446. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -0
  447. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_admin_page_actions_0i~.x~j.js +3 -0
  448. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_login_page_actions_0frwl15.js +3 -0
  449. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_logs_page_actions_0xa2ox_.js +3 -0
  450. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_messages_page_actions_10j3tg4.js +3 -0
  451. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_node_page_actions_0sl4ntd.js +3 -0
  452. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_nodes_page_actions_0cpgkfs.js +3 -0
  453. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_page_actions_08nuo36.js +3 -0
  454. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_settings_page_actions_0iv.lmk.js +3 -0
  455. package/.next/server/chunks/ssr/agent-network-dashboard__next-internal_server_app_tasks_page_actions_08c7qlx.js +3 -0
  456. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +3 -0
  457. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -0
  458. package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js +3 -0
  459. package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js.map +1 -0
  460. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +3 -0
  461. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -0
  462. package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js +3 -0
  463. package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js.map +1 -0
  464. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +3 -0
  465. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -0
  466. package/.next/server/chunks/ssr/{app_0izi28j._.js → agent-network-dashboard_app_0xgney8._.js} +2 -2
  467. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -0
  468. package/.next/server/chunks/ssr/{app_0_agk0r._.js → agent-network-dashboard_app_10hjgv4._.js} +2 -2
  469. package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -0
  470. package/.next/server/chunks/ssr/{app_0.zbtn5._.js → agent-network-dashboard_app_1153xeb._.js} +2 -2
  471. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +1 -0
  472. package/.next/server/chunks/ssr/{app_04n78pr._.js → agent-network-dashboard_app_12l4oto._.js} +2 -2
  473. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js.map +1 -0
  474. package/.next/server/chunks/ssr/{app_components_08ys5y3._.js → agent-network-dashboard_app_components_0mvyi-4._.js} +3 -3
  475. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js.map +1 -0
  476. package/.next/server/chunks/ssr/{app_server-logs_page_tsx_0_kpp1p._.js → agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js} +2 -2
  477. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map +1 -0
  478. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js +3 -0
  479. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map +1 -0
  480. package/.next/server/middleware-build-manifest.js +8 -8
  481. package/.next/server/middleware.js +3 -3
  482. package/.next/server/middleware.js.nft.json +1 -1
  483. package/.next/server/next-font-manifest.js +1 -1
  484. package/.next/server/next-font-manifest.json +14 -14
  485. package/.next/server/pages/404.html +2 -2
  486. package/.next/server/pages/500.html +1 -1
  487. package/.next/server/server-reference-manifest.js +1 -1
  488. package/.next/server/server-reference-manifest.json +1 -1
  489. package/.next/static/chunks/0-7iowzu4.798.js +1 -0
  490. package/.next/static/chunks/{0gtbwcilfu6b7.js → 0.66f3.rtcybb.js} +1 -1
  491. package/.next/static/chunks/02t5jr4shh.hy.js +1 -0
  492. package/.next/static/chunks/039-b.v_9-_rm.js +1 -0
  493. package/.next/static/chunks/03cra9~ibhxtq.js +1 -0
  494. package/.next/static/chunks/05oi25hh7b81r.js +31 -0
  495. package/.next/static/chunks/07~8sx3_5uiox.js +1 -0
  496. package/.next/static/chunks/{0pqt~8bl3ukh4.js → 0_pxg.4pebw__.js} +2 -2
  497. package/.next/static/chunks/0_qfg5s5uzs7..js +7 -0
  498. package/.next/static/chunks/0b8wnt4put-5n.js +2 -0
  499. package/.next/static/chunks/{0-hlcuoemhe7w.js → 0cj5qr_a8dzky.js} +2 -2
  500. package/.next/static/chunks/0elalb9n_.~di.js +1 -0
  501. package/.next/static/chunks/{01xlw8hd842-c.js → 0eov~nkwaf-qa.js} +1 -1
  502. package/.next/static/chunks/0g-urk~xe4p41.js +1 -0
  503. package/.next/static/chunks/0j_q__o8p6g83.js +1 -0
  504. package/.next/static/chunks/0jl6_w50zh4l5.js +1 -0
  505. package/.next/static/chunks/{0w1zwt8kq_7nb.js → 0ku0fjqlm9mca.js} +1 -1
  506. package/.next/static/chunks/0r4q73.-1bkyl.js +1 -0
  507. package/.next/static/chunks/0r_c8eccg3z2o.js +1 -0
  508. package/.next/static/chunks/0r~2i_zubnm0u.js +1 -0
  509. package/.next/static/chunks/0u3b93reo9xci.js +1 -0
  510. package/.next/static/chunks/0~5-jv77qynyc.css +2 -0
  511. package/.next/static/chunks/10oi7l-tycgl9.js +1 -0
  512. package/.next/static/chunks/11uk1izuv3~0t.js +1 -0
  513. package/.next/static/chunks/{turbopack-01f1xs~cq_~si.js → turbopack-0.7dvsf9rllt0.js} +1 -1
  514. package/.next/trace +2 -2
  515. package/.next/trace-build +1 -1
  516. package/app/components/ChatPopover.tsx +6 -6
  517. package/app/components/TaskChatPanel.tsx +39 -39
  518. package/app/components/TopoGraph.tsx +429 -78
  519. package/app/components/types.ts +7 -0
  520. package/app/lib/vendorIdentity.ts +145 -0
  521. package/app/page.tsx +18 -1
  522. package/package.json +1 -1
  523. package/scripts/chat-popover-test.mjs +91 -0
  524. package/scripts/chat-theme-test.mjs +98 -0
  525. package/scripts/topo-groupbox-test.mjs +118 -0
  526. package/scripts/topo-layout-test.mjs +113 -0
  527. package/scripts/topo-overlap-test.mjs +137 -0
  528. package/scripts/topo-p0round-test.mjs +166 -0
  529. package/scripts/topo-rename-test.mjs +107 -0
  530. package/scripts/topo-vendor-test.mjs +97 -0
  531. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_06e.r3r._.js +0 -13
  532. package/.next/build/chunks/node_modules_13sb.px._.js.map +0 -47
  533. package/.next/server/chunks/[root-of-the-server]__0-mykaf._.js +0 -3
  534. package/.next/server/chunks/[root-of-the-server]__0-mykaf._.js.map +0 -1
  535. package/.next/server/chunks/[root-of-the-server]__0.d_kqy._.js +0 -3
  536. package/.next/server/chunks/[root-of-the-server]__0.d_kqy._.js.map +0 -1
  537. package/.next/server/chunks/[root-of-the-server]__02pocyg._.js +0 -3
  538. package/.next/server/chunks/[root-of-the-server]__02pocyg._.js.map +0 -1
  539. package/.next/server/chunks/[root-of-the-server]__03ueci3._.js +0 -3
  540. package/.next/server/chunks/[root-of-the-server]__04aud7x._.js +0 -3
  541. package/.next/server/chunks/[root-of-the-server]__04aud7x._.js.map +0 -1
  542. package/.next/server/chunks/[root-of-the-server]__05fnt3n._.js +0 -3
  543. package/.next/server/chunks/[root-of-the-server]__05fnt3n._.js.map +0 -1
  544. package/.next/server/chunks/[root-of-the-server]__077tsd.._.js +0 -20
  545. package/.next/server/chunks/[root-of-the-server]__077tsd.._.js.map +0 -1
  546. package/.next/server/chunks/[root-of-the-server]__08wy1jr._.js +0 -3
  547. package/.next/server/chunks/[root-of-the-server]__08wy1jr._.js.map +0 -1
  548. package/.next/server/chunks/[root-of-the-server]__0adhu1m._.js +0 -3
  549. package/.next/server/chunks/[root-of-the-server]__0adhu1m._.js.map +0 -1
  550. package/.next/server/chunks/[root-of-the-server]__0aqv02v._.js +0 -3
  551. package/.next/server/chunks/[root-of-the-server]__0aqv02v._.js.map +0 -1
  552. package/.next/server/chunks/[root-of-the-server]__0cawhfq._.js +0 -3
  553. package/.next/server/chunks/[root-of-the-server]__0cawhfq._.js.map +0 -1
  554. package/.next/server/chunks/[root-of-the-server]__0d_-_k.._.js +0 -3
  555. package/.next/server/chunks/[root-of-the-server]__0d_-_k.._.js.map +0 -1
  556. package/.next/server/chunks/[root-of-the-server]__0f6bxfl._.js +0 -3
  557. package/.next/server/chunks/[root-of-the-server]__0f6bxfl._.js.map +0 -1
  558. package/.next/server/chunks/[root-of-the-server]__0h15edq._.js +0 -3
  559. package/.next/server/chunks/[root-of-the-server]__0h15edq._.js.map +0 -1
  560. package/.next/server/chunks/[root-of-the-server]__0k.vegl._.js +0 -3
  561. package/.next/server/chunks/[root-of-the-server]__0k.vegl._.js.map +0 -1
  562. package/.next/server/chunks/[root-of-the-server]__0kltbce._.js +0 -3
  563. package/.next/server/chunks/[root-of-the-server]__0kltbce._.js.map +0 -1
  564. package/.next/server/chunks/[root-of-the-server]__0mn04fw._.js +0 -3
  565. package/.next/server/chunks/[root-of-the-server]__0mn04fw._.js.map +0 -1
  566. package/.next/server/chunks/[root-of-the-server]__0o29v8c._.js +0 -3
  567. package/.next/server/chunks/[root-of-the-server]__0o4qfn9._.js +0 -3
  568. package/.next/server/chunks/[root-of-the-server]__0o7ya7r._.js +0 -3
  569. package/.next/server/chunks/[root-of-the-server]__0o7ya7r._.js.map +0 -1
  570. package/.next/server/chunks/[root-of-the-server]__0p3fo6l._.js +0 -6
  571. package/.next/server/chunks/[root-of-the-server]__0p3fo6l._.js.map +0 -1
  572. package/.next/server/chunks/[root-of-the-server]__0p6tutt._.js +0 -3
  573. package/.next/server/chunks/[root-of-the-server]__0pn3wsx._.js +0 -3
  574. package/.next/server/chunks/[root-of-the-server]__0pn3wsx._.js.map +0 -1
  575. package/.next/server/chunks/[root-of-the-server]__0rg9ifx._.js +0 -3
  576. package/.next/server/chunks/[root-of-the-server]__0x.-194._.js +0 -3
  577. package/.next/server/chunks/[root-of-the-server]__0x.-194._.js.map +0 -1
  578. package/.next/server/chunks/[root-of-the-server]__0x.a_yh._.js +0 -3
  579. package/.next/server/chunks/[root-of-the-server]__0x.a_yh._.js.map +0 -1
  580. package/.next/server/chunks/[root-of-the-server]__0~h2uqi._.js +0 -3
  581. package/.next/server/chunks/[root-of-the-server]__0~h2uqi._.js.map +0 -1
  582. package/.next/server/chunks/[root-of-the-server]__139~d6a._.js +0 -3
  583. package/.next/server/chunks/[root-of-the-server]__139~d6a._.js.map +0 -1
  584. package/.next/server/chunks/_next-internal_server_app_api_anet_config_route_actions_0xzy73j.js +0 -3
  585. package/.next/server/chunks/_next-internal_server_app_api_auth_login_route_actions_0zukc38.js +0 -3
  586. package/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0fm~3ij.js +0 -3
  587. package/.next/server/chunks/_next-internal_server_app_api_auth_v3_route_actions_0ndzs5l.js +0 -3
  588. package/.next/server/chunks/_next-internal_server_app_api_hub_audit-log_route_actions_11k8fqt.js +0 -3
  589. package/.next/server/chunks/_next-internal_server_app_api_hub_auth_route_actions_0gs7ttk.js +0 -3
  590. package/.next/server/chunks/_next-internal_server_app_api_hub_broadcast_route_actions_0ads-kd.js +0 -3
  591. package/.next/server/chunks/_next-internal_server_app_api_hub_events_route_actions_0opktby.js +0 -3
  592. package/.next/server/chunks/_next-internal_server_app_api_hub_health_route_actions_0tzzt~x.js +0 -3
  593. package/.next/server/chunks/_next-internal_server_app_api_hub_inbox_route_actions_0xvslrg.js +0 -3
  594. package/.next/server/chunks/_next-internal_server_app_api_hub_license_route_actions_0i3tlr3.js +0 -3
  595. package/.next/server/chunks/_next-internal_server_app_api_hub_messages_route_actions_08-gi-s.js +0 -3
  596. package/.next/server/chunks/_next-internal_server_app_api_hub_networks_route_actions_02vejq2.js +0 -3
  597. package/.next/server/chunks/_next-internal_server_app_api_hub_nodes_route_actions_0nx8ryn.js +0 -3
  598. package/.next/server/chunks/_next-internal_server_app_api_hub_register_route_actions_086wi_3.js +0 -3
  599. package/.next/server/chunks/_next-internal_server_app_api_hub_send_route_actions_0-ga_ug.js +0 -3
  600. package/.next/server/chunks/_next-internal_server_app_api_hub_server-logs_route_actions_00euexv.js +0 -3
  601. package/.next/server/chunks/_next-internal_server_app_api_hub_session_route_actions_041wa62.js +0 -3
  602. package/.next/server/chunks/_next-internal_server_app_api_hub_stats_route_actions_1242~od.js +0 -3
  603. package/.next/server/chunks/_next-internal_server_app_api_hub_status_route_actions_0aml09a.js +0 -3
  604. package/.next/server/chunks/_next-internal_server_app_api_hub_task-events_route_actions_02v1tmm.js +0 -3
  605. package/.next/server/chunks/_next-internal_server_app_api_hub_tasks_route_actions_0nl77v4.js +0 -3
  606. package/.next/server/chunks/_next-internal_server_app_api_hub_tmux_route_actions_0u~aaza.js +0 -3
  607. package/.next/server/chunks/_next-internal_server_app_api_hub_tokens_route_actions_09hzf_1.js +0 -3
  608. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +0 -3
  609. package/.next/server/chunks/node_modules_next_11synfn._.js +0 -10
  610. package/.next/server/chunks/node_modules_next_11synfn._.js.map +0 -1
  611. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0yubv2d.js +0 -3
  612. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0yubv2d.js.map +0 -1
  613. package/.next/server/chunks/ssr/[root-of-the-server]__014uja_._.js +0 -3
  614. package/.next/server/chunks/ssr/[root-of-the-server]__014uja_._.js.map +0 -1
  615. package/.next/server/chunks/ssr/[root-of-the-server]__02hi65f._.js +0 -3
  616. package/.next/server/chunks/ssr/[root-of-the-server]__02hi65f._.js.map +0 -1
  617. package/.next/server/chunks/ssr/[root-of-the-server]__02xqa5z._.js +0 -3
  618. package/.next/server/chunks/ssr/[root-of-the-server]__02xqa5z._.js.map +0 -1
  619. package/.next/server/chunks/ssr/[root-of-the-server]__04ph1de._.js +0 -3
  620. package/.next/server/chunks/ssr/[root-of-the-server]__04ph1de._.js.map +0 -1
  621. package/.next/server/chunks/ssr/[root-of-the-server]__05wc5-z._.js +0 -3
  622. package/.next/server/chunks/ssr/[root-of-the-server]__05wc5-z._.js.map +0 -1
  623. package/.next/server/chunks/ssr/[root-of-the-server]__06-2p1a._.js +0 -33
  624. package/.next/server/chunks/ssr/[root-of-the-server]__06-2p1a._.js.map +0 -1
  625. package/.next/server/chunks/ssr/[root-of-the-server]__08qr2ji._.js.map +0 -1
  626. package/.next/server/chunks/ssr/[root-of-the-server]__09l8xaa._.js +0 -3
  627. package/.next/server/chunks/ssr/[root-of-the-server]__09l8xaa._.js.map +0 -1
  628. package/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +0 -19
  629. package/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js.map +0 -1
  630. package/.next/server/chunks/ssr/[root-of-the-server]__0a0ffmv._.js +0 -3
  631. package/.next/server/chunks/ssr/[root-of-the-server]__0a0ffmv._.js.map +0 -1
  632. package/.next/server/chunks/ssr/[root-of-the-server]__0b7uu-_._.js +0 -3
  633. package/.next/server/chunks/ssr/[root-of-the-server]__0b7uu-_._.js.map +0 -1
  634. package/.next/server/chunks/ssr/[root-of-the-server]__0bl_wqk._.js +0 -3
  635. package/.next/server/chunks/ssr/[root-of-the-server]__0bl_wqk._.js.map +0 -1
  636. package/.next/server/chunks/ssr/[root-of-the-server]__0ft0rpu._.js +0 -3
  637. package/.next/server/chunks/ssr/[root-of-the-server]__0ft0rpu._.js.map +0 -1
  638. package/.next/server/chunks/ssr/[root-of-the-server]__0i~g-2t._.js +0 -3
  639. package/.next/server/chunks/ssr/[root-of-the-server]__0i~g-2t._.js.map +0 -1
  640. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js +0 -3
  641. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js.map +0 -1
  642. package/.next/server/chunks/ssr/[root-of-the-server]__0mook08._.js +0 -3
  643. package/.next/server/chunks/ssr/[root-of-the-server]__0mook08._.js.map +0 -1
  644. package/.next/server/chunks/ssr/[root-of-the-server]__0n46s~k._.js +0 -3
  645. package/.next/server/chunks/ssr/[root-of-the-server]__0n46s~k._.js.map +0 -1
  646. package/.next/server/chunks/ssr/[root-of-the-server]__0qchqb~._.js +0 -3
  647. package/.next/server/chunks/ssr/[root-of-the-server]__0qchqb~._.js.map +0 -1
  648. package/.next/server/chunks/ssr/[root-of-the-server]__0rrm~-q._.js +0 -3
  649. package/.next/server/chunks/ssr/[root-of-the-server]__0rrm~-q._.js.map +0 -1
  650. package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js +0 -3
  651. package/.next/server/chunks/ssr/[root-of-the-server]__0w2ay2h._.js.map +0 -1
  652. package/.next/server/chunks/ssr/[root-of-the-server]__0xjish~._.js +0 -3
  653. package/.next/server/chunks/ssr/[root-of-the-server]__0xjish~._.js.map +0 -1
  654. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js +0 -3
  655. package/.next/server/chunks/ssr/[root-of-the-server]__0xm3h9x._.js.map +0 -1
  656. package/.next/server/chunks/ssr/[root-of-the-server]__0ywihy_._.js +0 -8
  657. package/.next/server/chunks/ssr/[root-of-the-server]__0ywihy_._.js.map +0 -1
  658. package/.next/server/chunks/ssr/[root-of-the-server]__12ad1n.._.js +0 -3
  659. package/.next/server/chunks/ssr/[root-of-the-server]__12ad1n.._.js.map +0 -1
  660. package/.next/server/chunks/ssr/_0nne7mz._.js +0 -3
  661. package/.next/server/chunks/ssr/_0nne7mz._.js.map +0 -1
  662. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
  663. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +0 -3
  664. package/.next/server/chunks/ssr/_next-internal_server_app_admin_page_actions_0ycnu8f.js +0 -3
  665. package/.next/server/chunks/ssr/_next-internal_server_app_login_page_actions_02kefem.js +0 -3
  666. package/.next/server/chunks/ssr/_next-internal_server_app_logs_page_actions_0rvsl~d.js +0 -3
  667. package/.next/server/chunks/ssr/_next-internal_server_app_messages_page_actions_0gsqep_.js +0 -3
  668. package/.next/server/chunks/ssr/_next-internal_server_app_node_page_actions_0wd8cgl.js +0 -3
  669. package/.next/server/chunks/ssr/_next-internal_server_app_nodes_page_actions_0-.rv67.js +0 -3
  670. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +0 -3
  671. package/.next/server/chunks/ssr/_next-internal_server_app_server-logs_page_actions_0g1gb5c.js +0 -3
  672. package/.next/server/chunks/ssr/_next-internal_server_app_settings_networks_page_actions_09uw.sw.js +0 -3
  673. package/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_0mr68ai.js +0 -3
  674. package/.next/server/chunks/ssr/_next-internal_server_app_settings_tokens_page_actions_0yi54x8.js +0 -3
  675. package/.next/server/chunks/ssr/_next-internal_server_app_tasks_[id]_page_actions_0k_hm9g.js +0 -3
  676. package/.next/server/chunks/ssr/_next-internal_server_app_tasks_page_actions_0_2o_cr.js +0 -3
  677. package/.next/server/chunks/ssr/app_0.zbtn5._.js.map +0 -1
  678. package/.next/server/chunks/ssr/app_01y-~mp._.js +0 -3
  679. package/.next/server/chunks/ssr/app_01y-~mp._.js.map +0 -1
  680. package/.next/server/chunks/ssr/app_04n78pr._.js.map +0 -1
  681. package/.next/server/chunks/ssr/app_0_agk0r._.js.map +0 -1
  682. package/.next/server/chunks/ssr/app_0aenxef._.js +0 -3
  683. package/.next/server/chunks/ssr/app_0aenxef._.js.map +0 -1
  684. package/.next/server/chunks/ssr/app_0aum_g5._.js +0 -3
  685. package/.next/server/chunks/ssr/app_0aum_g5._.js.map +0 -1
  686. package/.next/server/chunks/ssr/app_0emvkn2._.js +0 -3
  687. package/.next/server/chunks/ssr/app_0emvkn2._.js.map +0 -1
  688. package/.next/server/chunks/ssr/app_0esuljp._.js +0 -3
  689. package/.next/server/chunks/ssr/app_0esuljp._.js.map +0 -1
  690. package/.next/server/chunks/ssr/app_0izi28j._.js.map +0 -1
  691. package/.next/server/chunks/ssr/app_components_08ys5y3._.js.map +0 -1
  692. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js.map +0 -1
  693. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js +0 -3
  694. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js.map +0 -1
  695. package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +0 -1
  696. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +0 -3
  697. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +0 -1
  698. package/.next/server/chunks/ssr/node_modules_0r_.s40._.js.map +0 -1
  699. package/.next/server/chunks/ssr/node_modules_0vtdjw7._.js +0 -3
  700. package/.next/server/chunks/ssr/node_modules_0vtdjw7._.js.map +0 -1
  701. package/.next/server/chunks/ssr/node_modules_next_0w2y7fz._.js +0 -6
  702. package/.next/server/chunks/ssr/node_modules_next_0w2y7fz._.js.map +0 -1
  703. package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +0 -6
  704. package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +0 -1
  705. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js +0 -3
  706. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js.map +0 -1
  707. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +0 -3
  708. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js.map +0 -1
  709. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +0 -3
  710. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +0 -1
  711. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +0 -3
  712. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +0 -1
  713. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_002l7yi.js.map +0 -1
  714. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_02suzhc.js.map +0 -1
  715. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07uu-xq.js.map +0 -1
  716. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0d2yq5t.js.map +0 -1
  717. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dm~kj8.js.map +0 -1
  718. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0foejvu.js.map +0 -1
  719. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0l-fh0i.js.map +0 -1
  720. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0nsg22r.js.map +0 -1
  721. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0o9vt1n.js.map +0 -1
  722. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qm1-a1.js.map +0 -1
  723. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uccf9z.js.map +0 -1
  724. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0uv6jyc.js.map +0 -1
  725. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10~~o-h.js +0 -4
  726. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_10~~o-h.js.map +0 -1
  727. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13leyhk.js +0 -4
  728. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13leyhk.js.map +0 -1
  729. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_13s07li.js.map +0 -1
  730. package/.next/static/chunks/0257pdz1-imal.js +0 -2
  731. package/.next/static/chunks/02_zpo7taex9o.js +0 -7
  732. package/.next/static/chunks/06n3d~fbbtagk.js +0 -1
  733. package/.next/static/chunks/07eba1lz2u3p4.js +0 -1
  734. package/.next/static/chunks/0av2~0.96~d~g.js +0 -1
  735. package/.next/static/chunks/0bazlsfn4c~8b.js +0 -1
  736. package/.next/static/chunks/0c1bp~g7.8ru..js +0 -1
  737. package/.next/static/chunks/0e-.zgw81gela.js +0 -31
  738. package/.next/static/chunks/0g9aof0ob_fcj.js +0 -1
  739. package/.next/static/chunks/0s8jo6jypzkx5.js +0 -1
  740. package/.next/static/chunks/0u359llqm1_01.js +0 -1
  741. package/.next/static/chunks/0ubqqhhpsaez4.js +0 -1
  742. package/.next/static/chunks/0ux36eo4a-0ry.css +0 -2
  743. package/.next/static/chunks/0yi50lip8s7cb.js +0 -1
  744. package/.next/static/chunks/0~qw9kxksr1v2.js +0 -1
  745. package/.next/static/chunks/12gprw3l0kvvf.js +0 -1
  746. package/.next/static/chunks/12yuo353giomx.js +0 -1
  747. package/.next/static/chunks/14bsg3_-taiw4.js +0 -1
  748. package/.next/static/chunks/160ungf2_xdzs.js +0 -1
  749. /package/.next/build/chunks/{[root-of-the-server]__0ubbtyl._.js.map → [root-of-the-server]__0tgc-8p._.js.map} +0 -0
  750. /package/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_06e.r3r._.js.map → [turbopack-node]_transforms_postcss_ts_0r4x5ys._.js.map} +0 -0
  751. /package/.next/server/chunks/{_next-internal_server_app_api_anet_config_route_actions_0xzy73j.js.map → 0ci9_nt-network-dashboard__next-internal_server_app_api_auth_v3_route_actions_0f5nbzr.js.map} +0 -0
  752. /package/.next/server/chunks/{_next-internal_server_app_api_auth_login_route_actions_0zukc38.js.map → 0ci9_nt-network-dashboard__next-internal_server_app_favicon_ico_route_actions_0t0eu9r.js.map} +0 -0
  753. /package/.next/server/chunks/{_next-internal_server_app_api_auth_logout_route_actions_0fm~3ij.js.map → 0ykm__next-internal_server_app_api_anet_config_route_actions_0a~v55_.js.map} +0 -0
  754. /package/.next/server/chunks/{_next-internal_server_app_api_auth_v3_route_actions_0ndzs5l.js.map → 0ykm__next-internal_server_app_api_auth_login_route_actions_0xnxfs4.js.map} +0 -0
  755. /package/.next/server/chunks/{_next-internal_server_app_api_hub_audit-log_route_actions_11k8fqt.js.map → 0ykm__next-internal_server_app_api_auth_logout_route_actions_0p8p0rn.js.map} +0 -0
  756. /package/.next/server/chunks/{_next-internal_server_app_api_hub_auth_route_actions_0gs7ttk.js.map → 0ykm__next-internal_server_app_api_hub_audit-log_route_actions_06uquwi.js.map} +0 -0
  757. /package/.next/server/chunks/{_next-internal_server_app_api_hub_broadcast_route_actions_0ads-kd.js.map → 0ykm__next-internal_server_app_api_hub_auth_route_actions_0f_y1ey.js.map} +0 -0
  758. /package/.next/server/chunks/{_next-internal_server_app_api_hub_events_route_actions_0opktby.js.map → 0ykm__next-internal_server_app_api_hub_broadcast_route_actions_0ao3j43.js.map} +0 -0
  759. /package/.next/server/chunks/{_next-internal_server_app_api_hub_health_route_actions_0tzzt~x.js.map → 0ykm__next-internal_server_app_api_hub_events_route_actions_0_5ndld.js.map} +0 -0
  760. /package/.next/server/chunks/{_next-internal_server_app_api_hub_inbox_route_actions_0xvslrg.js.map → 0ykm__next-internal_server_app_api_hub_health_route_actions_0mpzl74.js.map} +0 -0
  761. /package/.next/server/chunks/{_next-internal_server_app_api_hub_license_route_actions_0i3tlr3.js.map → 0ykm__next-internal_server_app_api_hub_inbox_route_actions_0stoyto.js.map} +0 -0
  762. /package/.next/server/chunks/{_next-internal_server_app_api_hub_messages_route_actions_08-gi-s.js.map → 0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js.map} +0 -0
  763. /package/.next/server/chunks/{_next-internal_server_app_api_hub_networks_route_actions_02vejq2.js.map → 0ykm__next-internal_server_app_api_hub_messages_route_actions_059rw1o.js.map} +0 -0
  764. /package/.next/server/chunks/{_next-internal_server_app_api_hub_nodes_route_actions_0nx8ryn.js.map → 0ykm__next-internal_server_app_api_hub_networks_route_actions_03sehpn.js.map} +0 -0
  765. /package/.next/server/chunks/{_next-internal_server_app_api_hub_register_route_actions_086wi_3.js.map → 0ykm__next-internal_server_app_api_hub_nodes_route_actions_11fbp28.js.map} +0 -0
  766. /package/.next/server/chunks/{_next-internal_server_app_api_hub_send_route_actions_0-ga_ug.js.map → 0ykm__next-internal_server_app_api_hub_register_route_actions_0l.d7~n.js.map} +0 -0
  767. /package/.next/server/chunks/{_next-internal_server_app_api_hub_server-logs_route_actions_00euexv.js.map → 0ykm__next-internal_server_app_api_hub_send_route_actions_0.p82vy.js.map} +0 -0
  768. /package/.next/server/chunks/{_next-internal_server_app_api_hub_session_route_actions_041wa62.js.map → 0ykm__next-internal_server_app_api_hub_server-logs_route_actions_05~c5lb.js.map} +0 -0
  769. /package/.next/server/chunks/{_next-internal_server_app_api_hub_stats_route_actions_1242~od.js.map → 0ykm__next-internal_server_app_api_hub_session_route_actions_0b9ef2i.js.map} +0 -0
  770. /package/.next/server/chunks/{_next-internal_server_app_api_hub_status_route_actions_0aml09a.js.map → 0ykm__next-internal_server_app_api_hub_stats_route_actions_03u65u0.js.map} +0 -0
  771. /package/.next/server/chunks/{_next-internal_server_app_api_hub_task-events_route_actions_02v1tmm.js.map → 0ykm__next-internal_server_app_api_hub_status_route_actions_0_71ear.js.map} +0 -0
  772. /package/.next/server/chunks/{_next-internal_server_app_api_hub_tasks_route_actions_0nl77v4.js.map → 0ykm__next-internal_server_app_api_hub_task-events_route_actions_07md_ee.js.map} +0 -0
  773. /package/.next/server/chunks/{_next-internal_server_app_api_hub_tmux_route_actions_0u~aaza.js.map → 0ykm__next-internal_server_app_api_hub_tasks_route_actions_0er3uvk.js.map} +0 -0
  774. /package/.next/server/chunks/{_next-internal_server_app_api_hub_tokens_route_actions_09hzf_1.js.map → 0ykm__next-internal_server_app_api_hub_tmux_route_actions_0o_1-8u.js.map} +0 -0
  775. /package/.next/server/chunks/{_next-internal_server_app_favicon_ico_route_actions_095lj93.js.map → 0ykm__next-internal_server_app_api_hub_tokens_route_actions_09doluz.js.map} +0 -0
  776. /package/.next/server/chunks/ssr/{_next-internal_server_app__global-error_page_actions_0k77kol.js.map → 0dwh_ent-network-dashboard__next-internal_server_app_server-logs_page_actions_0hkk815.js.map} +0 -0
  777. /package/.next/server/chunks/ssr/{_next-internal_server_app__not-found_page_actions_0eq97pa.js.map → 0yas_gent-network-dashboard__next-internal_server_app__not-found_page_actions_0u.f-rz.js.map} +0 -0
  778. /package/.next/server/chunks/ssr/{_next-internal_server_app_admin_page_actions_0ycnu8f.js.map → 0yas_gent-network-dashboard__next-internal_server_app_tasks_[id]_page_actions_0r3~lho.js.map} +0 -0
  779. /package/.next/server/chunks/ssr/{_next-internal_server_app_login_page_actions_02kefem.js.map → 0ykm__next-internal_server_app__global-error_page_actions_100fxls.js.map} +0 -0
  780. /package/.next/server/chunks/ssr/{_next-internal_server_app_logs_page_actions_0rvsl~d.js.map → 0ykm__next-internal_server_app_settings_networks_page_actions_0jgy57m.js.map} +0 -0
  781. /package/.next/server/chunks/ssr/{_next-internal_server_app_messages_page_actions_0gsqep_.js.map → 0ykm__next-internal_server_app_settings_tokens_page_actions_0l5h.k~.js.map} +0 -0
  782. /package/.next/server/chunks/ssr/{_next-internal_server_app_node_page_actions_0wd8cgl.js.map → agent-network-dashboard__next-internal_server_app_admin_page_actions_0i~.x~j.js.map} +0 -0
  783. /package/.next/server/chunks/ssr/{_next-internal_server_app_nodes_page_actions_0-.rv67.js.map → agent-network-dashboard__next-internal_server_app_login_page_actions_0frwl15.js.map} +0 -0
  784. /package/.next/server/chunks/ssr/{_next-internal_server_app_page_actions_09-gtaw.js.map → agent-network-dashboard__next-internal_server_app_logs_page_actions_0xa2ox_.js.map} +0 -0
  785. /package/.next/server/chunks/ssr/{_next-internal_server_app_server-logs_page_actions_0g1gb5c.js.map → agent-network-dashboard__next-internal_server_app_messages_page_actions_10j3tg4.js.map} +0 -0
  786. /package/.next/server/chunks/ssr/{_next-internal_server_app_settings_networks_page_actions_09uw.sw.js.map → agent-network-dashboard__next-internal_server_app_node_page_actions_0sl4ntd.js.map} +0 -0
  787. /package/.next/server/chunks/ssr/{_next-internal_server_app_settings_page_actions_0mr68ai.js.map → agent-network-dashboard__next-internal_server_app_nodes_page_actions_0cpgkfs.js.map} +0 -0
  788. /package/.next/server/chunks/ssr/{_next-internal_server_app_settings_tokens_page_actions_0yi54x8.js.map → agent-network-dashboard__next-internal_server_app_page_actions_08nuo36.js.map} +0 -0
  789. /package/.next/server/chunks/ssr/{_next-internal_server_app_tasks_[id]_page_actions_0k_hm9g.js.map → agent-network-dashboard__next-internal_server_app_settings_page_actions_0iv.lmk.js.map} +0 -0
  790. /package/.next/server/chunks/ssr/{_next-internal_server_app_tasks_page_actions_0_2o_cr.js.map → agent-network-dashboard__next-internal_server_app_tasks_page_actions_08c7qlx.js.map} +0 -0
  791. /package/.next/static/{dTHZkhRTLxCqMY86_0Ln9 → -dh0O1dlTLFw1pzDolqQ3}/_buildManifest.js +0 -0
  792. /package/.next/static/{dTHZkhRTLxCqMY86_0Ln9 → -dh0O1dlTLFw1pzDolqQ3}/_clientMiddlewareManifest.js +0 -0
  793. /package/.next/static/{dTHZkhRTLxCqMY86_0Ln9 → -dh0O1dlTLFw1pzDolqQ3}/_ssgManifest.js +0 -0
@@ -4,6 +4,7 @@ import { useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { Session } from './types';
5
5
  import { aliasAvatarColors, aliasInitial } from './AliasAvatar';
6
6
  import { ChatPopover } from './ChatPopover';
7
+ import { vendorForModel, runtimeIdentity, identityLine } from '../lib/vendorIdentity';
7
8
 
8
9
  interface MessageFlow {
9
10
  from_alias: string;
@@ -15,6 +16,9 @@ interface MessageFlow {
15
16
  interface TopoGraphProps {
16
17
  sessions: Session[];
17
18
  sseSessions: Record<string, number>;
19
+ // #84: a node.renamed event from the Overview's SSE listener. When the
20
+ // currently open chat popover targets `from`, it follows the rename to `to`.
21
+ renameSignal?: { from: string; to: string; ts: number } | null;
18
22
  }
19
23
 
20
24
  interface Point {
@@ -236,22 +240,59 @@ function commonPrefix(a: string, b: string): string {
236
240
  return a.slice(0, i);
237
241
  }
238
242
 
239
- function computeGroupKeys(aliases: string[]): Record<string, string> {
240
- const sorted = [...aliases].sort((a, b) => a.localeCompare(b));
243
+ /** #83 + #111: group nodes that share a ≥2-char alias prefix OR a project_dir
244
+ * ("either criterion same group", Vincent 4724). Union-find over the
245
+ * sessions; the component label prefers the shared project_dir's basename,
246
+ * else the common alias prefix. Returns alias → groupKey. */
247
+ function computeGroups(sessions: { alias: string; project_dir?: string | null }[]): Record<string, string> {
248
+ const n = sessions.length;
249
+ const parent = sessions.map((_, i) => i);
250
+ const find = (i: number): number => {
251
+ while (parent[i] !== i) { parent[i] = parent[parent[i]]; i = parent[i]; }
252
+ return i;
253
+ };
254
+ const union = (a: number, b: number) => {
255
+ const ra = find(a), rb = find(b);
256
+ if (ra !== rb) parent[ra] = rb;
257
+ };
258
+
259
+ // union by shared project_dir
260
+ const byDir: Record<string, number[]> = {};
261
+ sessions.forEach((s, i) => {
262
+ const d = s.project_dir?.trim();
263
+ if (d) (byDir[d] ||= []).push(i);
264
+ });
265
+ for (const idxs of Object.values(byDir)) {
266
+ for (let k = 1; k < idxs.length; k++) union(idxs[0], idxs[k]);
267
+ }
268
+
269
+ // union by shared ≥2-char alias prefix — sort, link adjacent pairs
270
+ const order = sessions.map((_, i) => i).sort((a, b) => sessions[a].alias.localeCompare(sessions[b].alias));
271
+ for (let k = 0; k + 1 < order.length; k++) {
272
+ if (commonPrefix(sessions[order[k]].alias, sessions[order[k + 1]].alias).length >= 2) {
273
+ union(order[k], order[k + 1]);
274
+ }
275
+ }
276
+
277
+ // label each connected component
278
+ const comps: Record<number, number[]> = {};
279
+ for (let i = 0; i < n; i++) (comps[find(i)] ||= []).push(i);
241
280
  const keys: Record<string, string> = {};
242
- let i = 0;
243
- while (i < sorted.length) {
244
- let j = i;
245
- let prefix = sorted[i];
246
- while (j + 1 < sorted.length) {
247
- const lcp = commonPrefix(prefix, sorted[j + 1]);
248
- if (lcp.length < 2) break;
249
- prefix = lcp;
250
- j++;
281
+ for (const members of Object.values(comps)) {
282
+ let label: string;
283
+ if (members.length === 1) {
284
+ label = sessions[members[0]].alias;
285
+ } else {
286
+ const dirs = new Set(members.map(i => sessions[i].project_dir?.trim()).filter(Boolean) as string[]);
287
+ if (dirs.size === 1) {
288
+ const d = [...dirs][0];
289
+ label = d.split('/').filter(Boolean).pop() || d;
290
+ } else {
291
+ label = members.map(i => sessions[i].alias).reduce((a, b) => commonPrefix(a, b));
292
+ if (label.length < 2) label = sessions[members[0]].alias;
293
+ }
251
294
  }
252
- const key = j > i ? prefix : sorted[i];
253
- for (let k = i; k <= j; k++) keys[sorted[k]] = key;
254
- i = j + 1;
295
+ for (const i of members) keys[sessions[i].alias] = label;
255
296
  }
256
297
  return keys;
257
298
  }
@@ -283,13 +324,43 @@ function buildFlowLinks(messages: MessageFlow[], positions: Record<string, Point
283
324
  return [...links.values()].slice(0, 18);
284
325
  }
285
326
 
286
- export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
327
+ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProps) {
287
328
  const theme = useTheme();
288
329
  const isLight = theme === 'light';
289
330
  const pal = isLight ? LIGHT_PALETTE : DARK_PALETTE;
290
331
  const brand = useBrand();
291
332
  const isIntern = brand === 'intern';
292
333
  const [messages, setMessages] = useState<MessageFlow[]>([]);
334
+ // Issue #87: ring | grid layout toggle. Ring is the tiered-radial default;
335
+ // grid arranges nodes in an N×M grid (better for 30+ nodes). Persisted to
336
+ // localStorage like the zoom/pan view state. Declared above nodePositions
337
+ // since that useMemo branches on it.
338
+ const [layout, setLayout] = useState<'ring' | 'grid'>('ring');
339
+ useEffect(() => {
340
+ try {
341
+ const saved = localStorage.getItem('anet-topo-layout');
342
+ if (saved === 'grid' || saved === 'ring') setLayout(saved);
343
+ } catch {}
344
+ }, []);
345
+ const toggleLayout = () => setLayout(prev => {
346
+ const next = prev === 'ring' ? 'grid' : 'ring';
347
+ try { localStorage.setItem('anet-topo-layout', next); } catch {}
348
+ return next;
349
+ });
350
+ // Issue #113: node size scale (Vincent 4727 — nodes too big / crowded at
351
+ // ~22 nodes). S/M/L → 0.7/0.84/1.0; default M (one notch down from the old
352
+ // fixed size). Persisted like the layout toggle.
353
+ const [nodeScale, setNodeScale] = useState(0.84);
354
+ useEffect(() => {
355
+ try {
356
+ const saved = parseFloat(localStorage.getItem('anet-topo-nodescale') || '');
357
+ if (saved === 0.7 || saved === 0.84 || saved === 1) setNodeScale(saved);
358
+ } catch {}
359
+ }, []);
360
+ const pickNodeScale = (v: number) => {
361
+ setNodeScale(v);
362
+ try { localStorage.setItem('anet-topo-nodescale', String(v)); } catch {}
363
+ };
293
364
 
294
365
  useEffect(() => {
295
366
  const fetchMessages = async () => {
@@ -316,6 +387,7 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
316
387
  flowLinks,
317
388
  activeAliases,
318
389
  groupKeys,
390
+ groupBoxes,
319
391
  } = useMemo(() => {
320
392
  const sseCount = (s: { alias: string; network_id?: string }) =>
321
393
  (s.network_id ? sseSessions[`${s.network_id}:${s.alias}`] : undefined) ?? sseSessions[s.alias];
@@ -325,10 +397,133 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
325
397
  // index, so contiguous-in-array becomes contiguous-in-ring, i.e.
326
398
  // each team visually clusters. localeCompare keeps CJK ordering sane.
327
399
  const byAlias = (a: Session, b: Session) => a.alias.localeCompare(b.alias);
400
+ // #112 umbrella: ghost age-out — an offline node not seen for over a day
401
+ // is almost certainly a deleted node the server `/api/status` still
402
+ // returns (#74 root cause is server-side; this is the dashboard-side
403
+ // fallback so stale ghosts stop cluttering the topology). A missing
404
+ // last_seen_at is kept (conservative — could be a legitimately new node).
405
+ const GHOST_MS = 24 * 60 * 60 * 1000;
406
+ const now = Date.now();
407
+ const isGhost = (s: Session) => {
408
+ if (s.status !== 'offline' || sseCount(s) || !s.last_seen_at) return false;
409
+ const t = Date.parse(s.last_seen_at);
410
+ return !Number.isNaN(t) && now - t > GHOST_MS;
411
+ };
328
412
  const online = sessions.filter(s => s.status !== 'offline' || sseCount(s)).sort(byAlias);
329
- const offline = sessions.filter(s => s.status === 'offline' && !sseCount(s)).sort(byAlias);
413
+ const offline = sessions.filter(s => s.status === 'offline' && !sseCount(s) && !isGhost(s)).sort(byAlias);
330
414
  const positions: Record<string, Point> = {};
331
415
 
416
+ if (layout === 'grid') {
417
+ // Issue #87 + #111: group-banded grid. Nodes are sorted by alias so
418
+ // same-prefix aliases are adjacent; each multi-member prefix group then
419
+ // gets its OWN row(s) starting at column 0, while singletons pack into
420
+ // shared rows. Group-banded placement keeps every group's bounding box
421
+ // (#111) a clean rectangle — no box ever overlaps another group's.
422
+ const all = [...online, ...offline];
423
+ const groupKeys = computeGroups(all);
424
+ const cols = Math.max(1, Math.ceil(Math.sqrt(all.length)));
425
+ // #112: gy0 starts below the (now compact) recent-signal / legend
426
+ // overlay panels — their max bottom edge is y≈112 — so grid row 0 is
427
+ // never occluded; gy1 extends near the canvas bottom for breathing room.
428
+ const gx0 = 150, gx1 = 850, gy0 = 126, gy1 = 652;
429
+ const cellW = (gx1 - gx0) / cols;
430
+ // largest node radius at the current size scale — drives the group
431
+ // label band + the row-height floor so nothing ever overlaps.
432
+ const nodeR = Math.round(26 * nodeScale);
433
+
434
+ // ordered runs of consecutive same-group-key nodes (≥2 = real group)
435
+ const runs: { key: string; members: Session[] }[] = [];
436
+ for (const s of all) {
437
+ const gk = groupKeys[s.alias];
438
+ const last = runs[runs.length - 1];
439
+ if (last && last.key === gk) last.members.push(s);
440
+ else runs.push({ key: gk, members: [s] });
441
+ }
442
+
443
+ // Pass 1 — assign each run to a band: a multi-member group owns its
444
+ // rows (left-aligned, so its bounding box is a tidy rect); contiguous
445
+ // singletons pack into shared rows (centred). Collect total row count.
446
+ type Band = { members: Session[]; startRow: number; centred: boolean; isGroup: boolean };
447
+ const bands: Band[] = [];
448
+ let row = 0;
449
+ let i = 0;
450
+ while (i < runs.length) {
451
+ if (runs[i].members.length >= 2) {
452
+ bands.push({ members: runs[i].members, startRow: row, centred: false, isGroup: true });
453
+ row += Math.ceil(runs[i].members.length / cols);
454
+ i++;
455
+ } else {
456
+ const singles: Session[] = [];
457
+ while (i < runs.length && runs[i].members.length < 2) {
458
+ singles.push(runs[i].members[0]);
459
+ i++;
460
+ }
461
+ bands.push({ members: singles, startRow: row, centred: true, isGroup: false });
462
+ row += Math.ceil(singles.length / cols);
463
+ }
464
+ }
465
+ const totalRows = Math.max(1, row);
466
+ // #112: the group label sits in a band ABOVE the topmost node, so the
467
+ // band must clear the node radius — GROUP_TOP is node-relative, never
468
+ // cellH-derived (cellH-derived was the label↔node overlap bug Vincent
469
+ // hit). cellH then floors at GROUP_TOP + 30 so the label band + bottom
470
+ // padding always fit and stacked group boxes never touch; past the
471
+ // floor the grid overflows and zoom/pan handles it.
472
+ const GROUP_TOP = nodeR + 20;
473
+ // Row-height floor = the tightest of: a node + its label below it
474
+ // (2·nodeR + ~22), and the label band + min box padding (GROUP_TOP + 12).
475
+ // Below this, rows would overlap; past it the grid overflows and
476
+ // zoom/pan covers the rest.
477
+ const cellH = Math.max(2 * nodeR + 22, GROUP_TOP + 12, Math.min(100, (gy1 - gy0) / totalRows));
478
+
479
+ // Pass 2 — place each band's members.
480
+ for (const band of bands) {
481
+ band.members.forEach((s, idx) => {
482
+ const rowInBand = Math.floor(idx / cols);
483
+ const c = idx % cols;
484
+ const inRow = Math.min(cols, band.members.length - rowInBand * cols);
485
+ const inset = band.centred ? ((cols - inRow) * cellW) / 2 : 0;
486
+ positions[s.alias] = {
487
+ x: gx0 + inset + (c + 0.5) * cellW,
488
+ y: gy0 + (band.startRow + rowInBand + 0.5) * cellH,
489
+ };
490
+ });
491
+ }
492
+
493
+ const links = buildFlowLinks(messages, positions);
494
+ const active = new Set<string>();
495
+ links.forEach(link => { active.add(link.from); active.add(link.to); });
496
+ // #111: one bounding box per multi-member group (Vincent 4722). Each
497
+ // group owns its rows; GROUP_PAD fills the row space left below the
498
+ // nodes after the label band, so stacked group boxes always have a
499
+ // gap between them (GROUP_TOP is defined above, with cellH).
500
+ const GROUP_PAD = Math.max(8, Math.min(26, cellH - GROUP_TOP - 8)); // side/bottom
501
+ const groupBoxes = bands
502
+ .filter(b => b.isGroup)
503
+ .map(band => {
504
+ const pts = band.members.map(s => positions[s.alias]).filter(Boolean);
505
+ const xs = pts.map(p => p.x);
506
+ const ys = pts.map(p => p.y);
507
+ const minX = Math.min(...xs), minY = Math.min(...ys);
508
+ return {
509
+ key: band.members.length ? groupKeys[band.members[0].alias] : '',
510
+ x: minX - GROUP_PAD,
511
+ y: minY - GROUP_TOP,
512
+ w: Math.max(...xs) - minX + GROUP_PAD * 2,
513
+ h: Math.max(...ys) - minY + GROUP_TOP + GROUP_PAD,
514
+ };
515
+ });
516
+ return {
517
+ onlineNodes: online,
518
+ offlineNodes: offline,
519
+ nodePositions: positions,
520
+ flowLinks: links,
521
+ activeAliases: active,
522
+ groupKeys,
523
+ groupBoxes,
524
+ };
525
+ }
526
+
332
527
  // Round 97 (issue #50) + 98 (issue #61): three layout modes by N.
333
528
  // N ≤ 8 → single ring (r=220)
334
529
  // 8 < N ≤ 14 → two rings (inner r=175, outer r=260, half-step rot)
@@ -396,7 +591,7 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
396
591
  });
397
592
 
398
593
  // Round 106 (issue #83): group key per alias → shared hue per team.
399
- const groupKeys = computeGroupKeys([...online, ...offline].map(s => s.alias));
594
+ const groupKeys = computeGroups([...online, ...offline]);
400
595
 
401
596
  return {
402
597
  onlineNodes: online,
@@ -405,8 +600,11 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
405
600
  flowLinks: links,
406
601
  activeAliases: active,
407
602
  groupKeys,
603
+ // #111: group boxes are a grid-layout feature only — radially scattered
604
+ // ring nodes can't be cleanly boxed. Ring keeps the #83 prefix hue.
605
+ groupBoxes: [] as { key: string; x: number; y: number; w: number; h: number }[],
408
606
  };
409
- }, [messages, sessions, sseSessions]);
607
+ }, [messages, sessions, sseSessions, layout, nodeScale]);
410
608
 
411
609
  const workingCount = onlineNodes.filter(s => s.status === 'working').length;
412
610
  // Round 109 (Vincent 4582 P0): hover-gated labels above this node count
@@ -433,6 +631,16 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
433
631
  // Issue #100: singleton chat popover. One alias at a time — clicking
434
632
  // another node swaps the target and the conversation switches in place.
435
633
  const [chatAlias, setChatAlias] = useState<string | null>(null);
634
+ // #84: when a node is renamed while its chat popover is open, follow the
635
+ // rename so the conversation keeps targeting a live alias.
636
+ useEffect(() => {
637
+ if (renameSignal && renameSignal.from === chatAlias) {
638
+ setChatAlias(renameSignal.to);
639
+ }
640
+ // chatAlias intentionally omitted — only react to a new rename signal,
641
+ // not to the user opening/closing the popover.
642
+ // eslint-disable-next-line react-hooks/exhaustive-deps
643
+ }, [renameSignal]);
436
644
 
437
645
  useEffect(() => { viewRef.current = view; }, [view]);
438
646
 
@@ -555,7 +763,25 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
555
763
  <div className="text-xs uppercase text-gray-600 tracking-wider">Network Topology</div>
556
764
  <h2 className="text-lg text-white font-semibold">Command mesh</h2>
557
765
  </div>
558
- <div className="flex flex-wrap gap-2 text-xs">
766
+ <div className="flex flex-wrap items-center gap-2 text-xs">
767
+ {/* Issue #87: ring | grid layout toggle — segmented control,
768
+ persisted to localStorage anet-topo-layout. */}
769
+ <div className="inline-flex rounded-md border border-gray-500/25 overflow-hidden" role="group" aria-label="Topology layout">
770
+ <button
771
+ onClick={() => { if (layout !== 'ring') toggleLayout(); }}
772
+ aria-pressed={layout === 'ring'}
773
+ className={`px-2.5 py-1 transition-colors ${layout === 'ring' ? 'bg-cyan-500/15 text-cyan-300' : 'text-gray-500 hover:text-gray-400'}`}
774
+ >
775
+ Ring
776
+ </button>
777
+ <button
778
+ onClick={() => { if (layout !== 'grid') toggleLayout(); }}
779
+ aria-pressed={layout === 'grid'}
780
+ className={`px-2.5 py-1 border-l border-gray-500/25 transition-colors ${layout === 'grid' ? 'bg-cyan-500/15 text-cyan-300' : 'text-gray-500 hover:text-gray-400'}`}
781
+ >
782
+ Grid
783
+ </button>
784
+ </div>
559
785
  <span className="px-2.5 py-1 rounded-md bg-green-500/10 text-green-300 border border-green-500/20">
560
786
  {workingCount} working
561
787
  </span>
@@ -624,6 +850,10 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
624
850
  {/* Round 103 (issue #81): everything inside this <g> zooms + pans
625
851
  together. transform order = translate then scale. */}
626
852
  <g transform={`translate(${view.x} ${view.y}) scale(${view.zoom})`}>
853
+ {/* Issue #87: radar/ring ambiance renders only in ring layout —
854
+ grid mode drops it so the concentric rings don't sit behind a
855
+ rectangular grid. */}
856
+ {layout === 'ring' && (<>
627
857
  <circle cx={cx} cy={cy} r="330" fill="url(#topo-radar)" />
628
858
 
629
859
  {/* Round 45: subtle star field — 24 deterministic dots scattered
@@ -705,12 +935,13 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
705
935
  opacity={isLight ? 0.35 : 0.18}
706
936
  />
707
937
  ))}
938
+ </>)}
708
939
 
709
940
  {/* hub links — round 46: idle spokes now have animated
710
941
  stroke-dashoffset so dashes flow outward from the hub
711
942
  ("command relay" feel). Active spokes carrying live message
712
943
  flow stay as solid bright strokes. */}
713
- {onlineNodes.map((session, idx) => {
944
+ {layout === 'ring' && onlineNodes.map((session, idx) => {
714
945
  const pos = nodePositions[session.alias];
715
946
  if (!pos) return null;
716
947
  const path = curvePath({ x: cx, y: cy }, pos, 0);
@@ -731,6 +962,37 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
731
962
  );
732
963
  })}
733
964
 
965
+ {/* #111: prefix-group boundary boxes (Vincent 4722). Grid layout
966
+ only — groupBoxes is empty in ring mode. Rendered behind the
967
+ flow links + nodes; pointer-events off so they never intercept
968
+ a node click. Restrained dashed container + group-name label. */}
969
+ {groupBoxes.map(box => (
970
+ <g key={`grp-${box.key}`} data-group={box.key} style={{ pointerEvents: 'none' }}>
971
+ <rect
972
+ x={box.x}
973
+ y={box.y}
974
+ width={box.w}
975
+ height={box.h}
976
+ rx="14"
977
+ fill={isLight ? '#0f172a' : '#a5b4fc'}
978
+ fillOpacity={isLight ? 0.025 : 0.045}
979
+ stroke={pal.ringStroke}
980
+ strokeWidth="1.5"
981
+ strokeDasharray="6 6"
982
+ />
983
+ <text
984
+ x={box.x + 12}
985
+ y={box.y + 14}
986
+ fill={pal.legendText}
987
+ fontSize="13"
988
+ fontFamily="monospace"
989
+ fontWeight="700"
990
+ >
991
+ {box.key}
992
+ </text>
993
+ </g>
994
+ ))}
995
+
734
996
  {/* directed message flows */}
735
997
  {flowLinks.map((link, index) => {
736
998
  const from = nodePositions[link.from];
@@ -775,7 +1037,7 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
775
1037
  visually; two outward pulses keep the "signal source" idea
776
1038
  from r17. Light theme gets a paler core to avoid hot-spotting
777
1039
  the bg. */}
778
- <g>
1040
+ {layout === 'ring' && (<g>
779
1041
  {/* static grounding halo — sits underneath, low opacity */}
780
1042
  <circle
781
1043
  cx={cx} cy={cy} r="18"
@@ -795,7 +1057,7 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
795
1057
  {/* core — 20px diameter, larger inner highlight reads as a "lit lamp" */}
796
1058
  <circle cx={cx} cy={cy} r="10" fill={isLight ? '#059669' : '#10b981'} />
797
1059
  <circle cx={cx} cy={cy} r="5" fill="#d1fae5" opacity="0.9" />
798
- </g>
1060
+ </g>)}
799
1061
 
800
1062
  {/* agent nodes */}
801
1063
  {[...onlineNodes, ...offlineNodes].map(session => {
@@ -806,7 +1068,9 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
806
1068
  const isOnline = session.status !== 'offline' || !!sseCountFor;
807
1069
  const status = nodeStatus(session, isOnline, isLight);
808
1070
  const isActive = activeAliases.has(session.alias);
809
- const radius = isOnline ? 26 : 18;
1071
+ // #113: node size scales with the S/M/L control; halos, labels,
1072
+ // badge and avatar all derive from `radius` so they follow.
1073
+ const radius = Math.round((isOnline ? 26 : 18) * nodeScale);
810
1074
  // Round 109/110 (Vincent 4582 + 4583 P0): at high node counts
811
1075
  // the 100px opaque label cards overlapped each other and
812
1076
  // covered neighbouring avatars. But hiding text entirely went
@@ -820,7 +1084,14 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
820
1084
  return (
821
1085
  <g
822
1086
  key={session.alias}
823
- className="transition-opacity"
1087
+ data-node={session.alias}
1088
+ // Round 3 / Loop: `anet-fade-in` runs once when the <g>
1089
+ // mounts — a new session entering the fleet (or the topology
1090
+ // first rendering) eases in instead of popping. Re-renders of
1091
+ // an existing node don't re-trigger (React preserves the <g>
1092
+ // via the alias key), so status changes don't flicker. The
1093
+ // global prefers-reduced-motion sweep already neutralises it.
1094
+ className="group transition-opacity anet-fade-in"
824
1095
  style={{ cursor: 'pointer' }}
825
1096
  // Stop the pointerdown from reaching the SVG pan handler: the
826
1097
  // SVG calls setPointerCapture, and a captured pointer makes
@@ -833,6 +1104,29 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
833
1104
  onPointerLeave={() => denseLayout && setHoveredAlias(prev => (prev === session.alias ? null : prev))}
834
1105
  onClick={() => setChatAlias(session.alias)}
835
1106
  >
1107
+ {/* Issue #96: native hover tooltip — "Vendor · model · Runtime".
1108
+ Falls back to just the alias when the node reports no
1109
+ model/runtime. */}
1110
+ <title>{identityLine(session.model, session.runtime) || session.alias}</title>
1111
+ {/* Round 2 / Loop: hover ring — a thin outer stroke that fades
1112
+ in when the cursor enters the node, signalling clickability
1113
+ (real-user feedback for the chat-popover open). Pure CSS via
1114
+ Tailwind group-hover, so it costs nothing per frame and
1115
+ respects prefers-reduced-motion via the global media query. */}
1116
+ <circle
1117
+ cx={pos.x}
1118
+ cy={pos.y}
1119
+ r={radius + 12}
1120
+ fill="none"
1121
+ stroke={status.primary}
1122
+ // strokeWidth must NOT be 1.5 (offline status ring) or 3
1123
+ // (online status ring) — the overlap test selects by those
1124
+ // exact widths and would mis-count this invisible hover
1125
+ // ring as a node footprint.
1126
+ strokeWidth="2"
1127
+ className="opacity-0 group-hover:opacity-70 transition-opacity duration-150"
1128
+ style={{ pointerEvents: 'none' }}
1129
+ />
836
1130
  {isActive && (
837
1131
  <circle cx={pos.x} cy={pos.y} r={radius + 14} fill={status.primary} opacity={isLight ? 0.08 : 0.12}>
838
1132
  <animate attributeName="r" values={`${radius + 8};${radius + 22};${radius + 8}`} dur="2.4s" repeatCount="indefinite" />
@@ -850,33 +1144,26 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
850
1144
  strokeDasharray={isOnline ? 'none' : '5 5'}
851
1145
  filter={isOnline && !isLight ? 'url(#topo-glow)' : undefined}
852
1146
  />
853
- {/* Round 99 (issue #79): node "avatar" hue-hashed
854
- initials circle inside the status ring. Round 100:
855
- when brand=intern, swap the initials for the 书小生
856
- mascot image (asset from 群星马 task 51dd0d1d). The
857
- image already has a transparent bg so it sits cleanly
858
- on the node's dark/light fill; the outer status ring
859
- still carries working/idle/etc. */}
1147
+ {/* Issue #96: node "avatar" is now driven by the model
1148
+ vendor. Decision order:
1149
+ 1. ?brand=intern flag, or an intern-aliased node with
1150
+ no model field 书生 coin (preserves #79).
1151
+ 2. vendor has a packaged logo asset that logo image
1152
+ (intern-s1-* models land here via vendorForModel).
1153
+ 3. known vendor, logo asset not shipped yet → a
1154
+ vendor-tinted monogram (spec-mandated fallback).
1155
+ 4. unknown vendor / null model → the prefix-group
1156
+ hue-hashed initial (#83/#99 behaviour, unchanged). */}
860
1157
  {(() => {
861
- const ar = isOnline ? 14 : 10;
862
- // Round 108 (issue #79 reopened): show the 书小生 avatar
863
- // coin for any agent whose alias marks it as an Intern /
864
- // 书生 runtime — not only under the global ?brand=intern
865
- // flag. Vincent 4565: a fleet of 书生N号 nodes should SHOW
866
- // 书生, not a generic "书" initial. ?brand=intern still
867
- // forces the coin on every node (full brand showcase).
868
- const isInternNode = isIntern || /书生|书小生|intern/i.test(session.alias);
869
- if (isInternNode) {
870
- // Round 102: self-contained "avatar coin" — 书小生 figure
871
- // keyed off its white background and composited onto a
872
- // cream circular backplate. The cream coin gives the
873
- // dark-haired figure consistent contrast on BOTH the
874
- // dark cyber theme and light theme. Render at the node
875
- // diameter so the coin fills inside the status ring.
876
- const size = radius * 2;
1158
+ const ar = Math.round((isOnline ? 14 : 10) * nodeScale);
1159
+ const size = radius * 2;
1160
+ const vendor = vendorForModel(session.model);
1161
+ const internByAlias = /书生|书小生|intern/i.test(session.alias);
1162
+
1163
+ if (isIntern || internByAlias || vendor.logo) {
877
1164
  return (
878
1165
  <image
879
- href="/intern_avatar.png"
1166
+ href={vendor.logo ?? '/intern_avatar.png'}
880
1167
  x={pos.x - size / 2}
881
1168
  y={pos.y - size / 2}
882
1169
  width={size}
@@ -885,12 +1172,25 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
885
1172
  />
886
1173
  );
887
1174
  }
1175
+ if (vendor.id !== 'unknown') {
1176
+ // Known model house, logo asset not in public/vendors/
1177
+ // yet — vendor-tinted monogram stands in.
1178
+ return (
1179
+ <>
1180
+ <circle cx={pos.x} cy={pos.y} r={ar} fill={vendor.mono.bg} stroke={vendor.mono.ring} strokeWidth="1" />
1181
+ <text
1182
+ x={pos.x} y={pos.y} dy="0.34em" textAnchor="middle"
1183
+ fill={vendor.mono.text} fontSize={ar}
1184
+ fontFamily="monospace" fontWeight="700"
1185
+ >
1186
+ {vendor.initial}
1187
+ </text>
1188
+ </>
1189
+ );
1190
+ }
888
1191
  // Round 106 (issue #83): hue keyed to the prefix group,
889
- // not the full alias — every 通信* node shares one color,
890
- // every 研究员* another, so teams cluster visually even
891
- // when the tier layout spreads them across rings.
1192
+ // not the full alias — every 通信* node shares one color.
892
1193
  const c = aliasAvatarColors(groupKeys[session.alias] || session.alias);
893
- const fs = isOnline ? 14 : 10;
894
1194
  return (
895
1195
  <>
896
1196
  <circle cx={pos.x} cy={pos.y} r={ar} fill={c.bg} stroke={c.ring} strokeWidth="1" />
@@ -900,7 +1200,7 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
900
1200
  dy="0.34em"
901
1201
  textAnchor="middle"
902
1202
  fill={c.text}
903
- fontSize={fs}
1203
+ fontSize={ar}
904
1204
  fontFamily="monospace"
905
1205
  fontWeight="700"
906
1206
  >
@@ -909,12 +1209,32 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
909
1209
  </>
910
1210
  );
911
1211
  })()}
1212
+ {/* Issue #96: runtime badge — small corner glyph marking the
1213
+ execution shell (CLI / SDK / HTTP API). Sits bottom-right
1214
+ of the avatar; colours kept off the working/idle/offline
1215
+ status hues. Absent when the node reports no runtime. */}
1216
+ {(() => {
1217
+ const rt = runtimeIdentity(session.runtime);
1218
+ if (!rt) return null;
1219
+ const br = isOnline ? 7 : 5.5;
1220
+ const bx = pos.x + radius * 0.72;
1221
+ const by = pos.y + radius * 0.72;
1222
+ const icon = br * 2 * 0.62;
1223
+ return (
1224
+ <g style={{ pointerEvents: 'none' }}>
1225
+ <circle cx={bx} cy={by} r={br} fill={pal.containerBg} stroke={rt.color} strokeWidth="1.5" />
1226
+ <g transform={`translate(${bx - icon / 2} ${by - icon / 2}) scale(${icon / 24})`}>
1227
+ <path d={rt.iconPath} fill="none" stroke={rt.color} strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round" />
1228
+ </g>
1229
+ </g>
1230
+ );
1231
+ })()}
912
1232
  {session.status === 'working' && (
913
1233
  // working pulse — small dot just inside the status ring,
914
1234
  // above the avatar text. Was a 18px horizontal bar at
915
1235
  // y+11 which now collides with the avatar; the dot reads
916
1236
  // as the same "active" cue without occluding the initial.
917
- <circle cx={pos.x} cy={pos.y - (isOnline ? 18 : 13)} r="2.5" fill={pal.flowParticle}>
1237
+ <circle cx={pos.x} cy={pos.y - (radius - 6)} r="2.5" fill={pal.flowParticle}>
918
1238
  <animate attributeName="opacity" values="1;0.25;1" dur="1.1s" repeatCount="indefinite" />
919
1239
  </circle>
920
1240
  )}
@@ -955,29 +1275,37 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
955
1275
  );
956
1276
  })}
957
1277
 
1278
+ </g>
1279
+
1280
+ {/* #112: overlay panels (recent-signal + legend) render OUTSIDE the
1281
+ zoom/pan <g> so they stay fixed while the topology pans/zooms.
1282
+ They're sized + tucked into the top corners so every corner of
1283
+ each panel is >325px from the canvas centre — i.e. fully outside
1284
+ the outermost (offline) ring. No node on any ring can reach the
1285
+ corner triangles, so the panels never overlap a node, in ring
1286
+ OR grid layout (Vincent 4727 zero-overlap criterion). */}
958
1287
  {/* latest flow labels */}
959
- <g transform="translate(28, 34)">
960
- <rect x="0" y="0" width="285" height={60 + Math.min(flowLinks.length, 4) * 20} rx="8" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 1 : 0.94} />
961
- <text x="16" y="26" fill={pal.legendHeadline} fontSize="13" fontFamily="monospace" fontWeight="700">recent signal</text>
962
- <text x="178" y="26" fill={pal.legendAccent} fontSize="11" fontFamily="monospace">{messages.length} messages</text>
963
- {flowLinks.slice(0, 4).map((link, index) => (
964
- <text key={link.key} x="16" y={54 + index * 20} fill={pal.legendText} fontSize="10" fontFamily="monospace">
965
- {truncate(link.from, 8)} {'->'} {truncate(link.to, 8)} / {link.count} / {truncate(link.content, 18)}
1288
+ <g transform="translate(16, 16)">
1289
+ <rect x="0" y="0" width="230" height="84" rx="10" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 0.97 : 0.92} />
1290
+ <text x="13" y="21" fill={pal.legendHeadline} fontSize="12" fontFamily="monospace" fontWeight="700">recent signal</text>
1291
+ <text x="150" y="21" fill={pal.legendAccent} fontSize="10" fontFamily="monospace">{messages.length} msgs</text>
1292
+ {flowLinks.slice(0, 3).map((link, index) => (
1293
+ <text key={link.key} x="13" y={38 + index * 16} fill={pal.legendText} fontSize="9" fontFamily="monospace">
1294
+ {truncate(link.from, 6)} {'->'} {truncate(link.to, 6)} / {link.count} / {truncate(link.content, 12)}
966
1295
  </text>
967
1296
  ))}
968
1297
  </g>
969
1298
 
970
1299
  {/* legend */}
971
- <g transform="translate(720, 34)">
972
- <rect x="0" y="0" width="250" height="112" rx="8" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 1 : 0.94} />
973
- <circle cx="18" cy="26" r="6" fill={isLight ? '#059669' : '#22c55e'} />
974
- <text x="34" y="30" fill={pal.legendText} fontSize="11" fontFamily="monospace">working node</text>
975
- <circle cx="18" cy="52" r="6" fill={isLight ? '#0d9488' : '#2dd4bf'} />
976
- <text x="34" y="56" fill={pal.legendText} fontSize="11" fontFamily="monospace">online idle</text>
977
- <circle cx="18" cy="78" r="6" fill={isLight ? '#94a3b8' : '#6b7280'} />
978
- <text x="34" y="82" fill={pal.legendText} fontSize="11" fontFamily="monospace">offline / no SSE</text>
979
- <path d="M150,78 Q176,52 210,78" fill="none" stroke={pal.flowEdge} strokeWidth="3" markerEnd="url(#topo-arrow)" />
980
- </g>
1300
+ <g transform="translate(760, 16)">
1301
+ <rect x="0" y="0" width="224" height="96" rx="10" fill={pal.legendBox.fill} stroke={pal.legendBox.stroke} opacity={isLight ? 0.97 : 0.92} />
1302
+ <circle cx="16" cy="24" r="5.5" fill={isLight ? '#059669' : '#22c55e'} />
1303
+ <text x="30" y="28" fill={pal.legendText} fontSize="11" fontFamily="monospace">working node</text>
1304
+ <circle cx="16" cy="48" r="5.5" fill={isLight ? '#0d9488' : '#2dd4bf'} />
1305
+ <text x="30" y="52" fill={pal.legendText} fontSize="11" fontFamily="monospace">online idle</text>
1306
+ <circle cx="16" cy="72" r="5.5" fill={isLight ? '#94a3b8' : '#6b7280'} />
1307
+ <text x="30" y="76" fill={pal.legendText} fontSize="11" fontFamily="monospace">offline / no SSE</text>
1308
+ <path d="M140,72 Q164,48 196,72" fill="none" stroke={pal.flowEdge} strokeWidth="3" markerEnd="url(#topo-arrow)" />
981
1309
  </g>
982
1310
  </svg>
983
1311
 
@@ -988,6 +1316,26 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
988
1316
  Split into a plain % readout + an explicit reset button with
989
1317
  its own icon + tooltip. */}
990
1318
  <div className="absolute bottom-3 right-3 flex items-center gap-1.5 text-xs select-none">
1319
+ {/* #113: node size — S / M / L segmented control (Vincent 4727). */}
1320
+ <div
1321
+ className="flex items-center rounded-md border overflow-hidden"
1322
+ style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder }}
1323
+ role="group"
1324
+ aria-label="Node size"
1325
+ >
1326
+ {([['S', 0.7], ['M', 0.84], ['L', 1]] as const).map(([lbl, v], idx) => (
1327
+ <button
1328
+ key={lbl}
1329
+ onClick={() => pickNodeScale(v)}
1330
+ aria-pressed={nodeScale === v}
1331
+ title={`Node size: ${lbl === 'S' ? 'small' : lbl === 'M' ? 'medium' : 'large'}`}
1332
+ className={`px-2 py-1 transition-colors ${idx > 0 ? 'border-l' : ''} ${nodeScale === v ? 'bg-cyan-500/15 text-cyan-300' : 'hover:bg-white/5'}`}
1333
+ style={{ color: nodeScale === v ? undefined : pal.legendText, borderColor: pal.containerBorder }}
1334
+ >
1335
+ {lbl}
1336
+ </button>
1337
+ ))}
1338
+ </div>
991
1339
  <div
992
1340
  className="flex items-center rounded-md border overflow-hidden"
993
1341
  style={{ background: pal.legendBox.fill, borderColor: pal.containerBorder }}
@@ -1046,14 +1394,17 @@ export function TopoGraph({ sessions, sseSessions }: TopoGraphProps) {
1046
1394
  )}
1047
1395
  </button>
1048
1396
  </div>
1049
- </div>
1050
1397
 
1051
- {/* Issue #100: draggable singleton chat popover. position:fixed, so it
1052
- floats above the page and isn't clipped by the graph container's
1053
- overflow-hidden. */}
1054
- {chatAlias && (
1055
- <ChatPopover alias={chatAlias} onClose={() => setChatAlias(null)} />
1056
- )}
1398
+ {/* Issue #100/#106: draggable, resizable singleton chat popover.
1399
+ position:fixed so it floats above the page (overflow-hidden here
1400
+ doesn't clip fixed children). Rendered *inside* the container so
1401
+ that when the graph goes fullscreen (#81) the popover joins the
1402
+ fullscreen subtree and stays visible — a sibling render would be
1403
+ outside the fullscreened element and disappear. */}
1404
+ {chatAlias && (
1405
+ <ChatPopover alias={chatAlias} onClose={() => setChatAlias(null)} />
1406
+ )}
1407
+ </div>
1057
1408
  </section>
1058
1409
  );
1059
1410
  }