@sleep2agi/agent-network-dashboard 0.6.3-preview.0 → 0.6.3-preview.2

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 (887) hide show
  1. package/.next/BUILD_COMMIT +1 -0
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/app-path-routes-manifest.json +3 -0
  4. package/.next/build/chunks/{0eys_0hzxj57._.js → 0emd_0_wlp72._.js} +167 -167
  5. package/.next/build/chunks/0emd_0_wlp72._.js.map +47 -0
  6. package/.next/build/chunks/{[root-of-the-server]__0jzknqm._.js → [root-of-the-server]__0cyvgtf._.js} +7 -7
  7. package/.next/build/chunks/{[root-of-the-server]__0jzknqm._.js.map → [root-of-the-server]__0cyvgtf._.js.map} +2 -2
  8. package/.next/build/chunks/{[root-of-the-server]__02~~60i._.js → [root-of-the-server]__0z.4hvh._.js} +3 -3
  9. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0ji7sn2._.js +13 -0
  10. package/.next/build/postcss.js +4 -4
  11. package/.next/build-manifest.json +8 -8
  12. package/.next/cache/.previewinfo +1 -1
  13. package/.next/cache/.rscinfo +1 -1
  14. package/.next/diagnostics/route-bundle-stats.json +168 -168
  15. package/.next/fallback-build-manifest.json +3 -3
  16. package/.next/prerender-manifest.json +3 -3
  17. package/.next/required-server-files.js +2 -2
  18. package/.next/required-server-files.json +2 -2
  19. package/.next/routes-manifest.json +18 -0
  20. package/.next/server/app/_global-error/page/build-manifest.json +5 -5
  21. package/.next/server/app/_global-error/page.js +9 -9
  22. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  23. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/_global-error.html +1 -1
  25. package/.next/server/app/_global-error.rsc +8 -8
  26. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  27. package/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
  28. package/.next/server/app/_global-error.segments/_head.segment.rsc +4 -4
  29. package/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  30. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  31. package/.next/server/app/_not-found/page/build-manifest.json +5 -5
  32. package/.next/server/app/_not-found/page/next-font-manifest.json +1 -1
  33. package/.next/server/app/_not-found/page.js +12 -12
  34. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  35. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/_not-found.html +2 -2
  37. package/.next/server/app/_not-found.rsc +13 -13
  38. package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -13
  39. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  40. package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -8
  41. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  42. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  43. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/admin/page/build-manifest.json +5 -5
  45. package/.next/server/app/admin/page/next-font-manifest.json +1 -1
  46. package/.next/server/app/admin/page.js +13 -13
  47. package/.next/server/app/admin/page.js.nft.json +1 -1
  48. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  49. package/.next/server/app/admin.html +2 -2
  50. package/.next/server/app/admin.rsc +15 -15
  51. package/.next/server/app/admin.segments/_full.segment.rsc +15 -15
  52. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  53. package/.next/server/app/admin.segments/_index.segment.rsc +8 -8
  54. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  55. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  56. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  57. package/.next/server/app/api/anet/config/route.js +6 -6
  58. package/.next/server/app/api/anet/config/route.js.nft.json +1 -1
  59. package/.next/server/app/api/anet/node-config/route/app-paths-manifest.json +3 -0
  60. package/.next/server/app/api/anet/node-config/route/build-manifest.json +9 -0
  61. package/.next/server/app/api/anet/node-config/route/server-reference-manifest.json +4 -0
  62. package/.next/server/app/api/anet/node-config/route.js +7 -0
  63. package/.next/server/app/api/anet/node-config/route.js.map +5 -0
  64. package/.next/server/app/api/anet/node-config/route.js.nft.json +1 -0
  65. package/.next/server/app/api/anet/node-config/route_client-reference-manifest.js +3 -0
  66. package/.next/server/app/api/anet/node-create/route/app-paths-manifest.json +3 -0
  67. package/.next/server/app/api/anet/node-create/route/build-manifest.json +9 -0
  68. package/.next/server/app/api/anet/node-create/route/server-reference-manifest.json +4 -0
  69. package/.next/server/app/api/anet/node-create/route.js +7 -0
  70. package/.next/server/app/api/anet/node-create/route.js.map +5 -0
  71. package/.next/server/app/api/anet/node-create/route.js.nft.json +1 -0
  72. package/.next/server/app/api/anet/node-create/route_client-reference-manifest.js +3 -0
  73. package/.next/server/app/api/anet/node-lifecycle/route/app-paths-manifest.json +3 -0
  74. package/.next/server/app/api/anet/node-lifecycle/route/build-manifest.json +9 -0
  75. package/.next/server/app/api/anet/node-lifecycle/route/server-reference-manifest.json +4 -0
  76. package/.next/server/app/api/anet/node-lifecycle/route.js +7 -0
  77. package/.next/server/app/api/anet/node-lifecycle/route.js.map +5 -0
  78. package/.next/server/app/api/anet/node-lifecycle/route.js.nft.json +1 -0
  79. package/.next/server/app/api/anet/node-lifecycle/route_client-reference-manifest.js +3 -0
  80. package/.next/server/app/api/auth/login/route.js +7 -7
  81. package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  82. package/.next/server/app/api/auth/logout/route.js +7 -7
  83. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  84. package/.next/server/app/api/auth/v3/route.js +7 -7
  85. package/.next/server/app/api/auth/v3/route.js.nft.json +1 -1
  86. package/.next/server/app/api/hub/audit-log/route.js +6 -6
  87. package/.next/server/app/api/hub/audit-log/route.js.nft.json +1 -1
  88. package/.next/server/app/api/hub/auth/route.js +7 -7
  89. package/.next/server/app/api/hub/auth/route.js.nft.json +1 -1
  90. package/.next/server/app/api/hub/broadcast/route.js +6 -6
  91. package/.next/server/app/api/hub/broadcast/route.js.nft.json +1 -1
  92. package/.next/server/app/api/hub/events/route.js +6 -6
  93. package/.next/server/app/api/hub/events/route.js.nft.json +1 -1
  94. package/.next/server/app/api/hub/health/route.js +6 -6
  95. package/.next/server/app/api/hub/health/route.js.nft.json +1 -1
  96. package/.next/server/app/api/hub/inbox/route.js +6 -6
  97. package/.next/server/app/api/hub/inbox/route.js.nft.json +1 -1
  98. package/.next/server/app/api/hub/messages/route.js +6 -6
  99. package/.next/server/app/api/hub/messages/route.js.nft.json +1 -1
  100. package/.next/server/app/api/hub/networks/route.js +6 -6
  101. package/.next/server/app/api/hub/networks/route.js.nft.json +1 -1
  102. package/.next/server/app/api/hub/nodes/route.js +6 -6
  103. package/.next/server/app/api/hub/nodes/route.js.nft.json +1 -1
  104. package/.next/server/app/api/hub/register/route.js +6 -6
  105. package/.next/server/app/api/hub/register/route.js.nft.json +1 -1
  106. package/.next/server/app/api/hub/send/route.js +6 -6
  107. package/.next/server/app/api/hub/send/route.js.nft.json +1 -1
  108. package/.next/server/app/api/hub/server/[hostname]/agents/route.js +6 -6
  109. package/.next/server/app/api/hub/server/[hostname]/agents/route.js.nft.json +1 -1
  110. package/.next/server/app/api/hub/server/[hostname]/health/route.js +6 -6
  111. package/.next/server/app/api/hub/server/[hostname]/health/route.js.nft.json +1 -1
  112. package/.next/server/app/api/hub/server-logs/route.js +6 -6
  113. package/.next/server/app/api/hub/server-logs/route.js.nft.json +1 -1
  114. package/.next/server/app/api/hub/servers/route.js +6 -6
  115. package/.next/server/app/api/hub/servers/route.js.nft.json +1 -1
  116. package/.next/server/app/api/hub/session/route.js +6 -6
  117. package/.next/server/app/api/hub/session/route.js.nft.json +1 -1
  118. package/.next/server/app/api/hub/stats/route.js +6 -6
  119. package/.next/server/app/api/hub/stats/route.js.nft.json +1 -1
  120. package/.next/server/app/api/hub/status/route.js +6 -6
  121. package/.next/server/app/api/hub/status/route.js.nft.json +1 -1
  122. package/.next/server/app/api/hub/task-events/route.js +6 -6
  123. package/.next/server/app/api/hub/task-events/route.js.nft.json +1 -1
  124. package/.next/server/app/api/hub/tasks/route.js +6 -6
  125. package/.next/server/app/api/hub/tasks/route.js.nft.json +1 -1
  126. package/.next/server/app/api/hub/tmux/route.js +6 -6
  127. package/.next/server/app/api/hub/tmux/route.js.nft.json +1 -1
  128. package/.next/server/app/api/hub/tokens/route.js +6 -6
  129. package/.next/server/app/api/hub/tokens/route.js.nft.json +1 -1
  130. package/.next/server/app/api/hub/upload/route.js +6 -6
  131. package/.next/server/app/api/hub/upload/route.js.nft.json +1 -1
  132. package/.next/server/app/favicon.ico/route.js +6 -6
  133. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  134. package/.next/server/app/index.html +2 -2
  135. package/.next/server/app/index.rsc +15 -15
  136. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  137. package/.next/server/app/index.segments/_full.segment.rsc +15 -15
  138. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  139. package/.next/server/app/index.segments/_index.segment.rsc +8 -8
  140. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  141. package/.next/server/app/login/page/build-manifest.json +5 -5
  142. package/.next/server/app/login/page/next-font-manifest.json +1 -1
  143. package/.next/server/app/login/page.js +13 -13
  144. package/.next/server/app/login/page.js.nft.json +1 -1
  145. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  146. package/.next/server/app/login.html +2 -2
  147. package/.next/server/app/login.rsc +15 -15
  148. package/.next/server/app/login.segments/_full.segment.rsc +15 -15
  149. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  150. package/.next/server/app/login.segments/_index.segment.rsc +8 -8
  151. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  152. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  153. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  154. package/.next/server/app/logs/page/build-manifest.json +5 -5
  155. package/.next/server/app/logs/page/next-font-manifest.json +1 -1
  156. package/.next/server/app/logs/page.js +13 -13
  157. package/.next/server/app/logs/page.js.nft.json +1 -1
  158. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  159. package/.next/server/app/logs.html +2 -2
  160. package/.next/server/app/logs.rsc +15 -15
  161. package/.next/server/app/logs.segments/_full.segment.rsc +15 -15
  162. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  163. package/.next/server/app/logs.segments/_index.segment.rsc +8 -8
  164. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  165. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  166. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  167. package/.next/server/app/manifest.webmanifest/route.js +6 -6
  168. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  169. package/.next/server/app/messages/page/build-manifest.json +5 -5
  170. package/.next/server/app/messages/page/next-font-manifest.json +1 -1
  171. package/.next/server/app/messages/page.js +13 -13
  172. package/.next/server/app/messages/page.js.nft.json +1 -1
  173. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  174. package/.next/server/app/messages.html +2 -2
  175. package/.next/server/app/messages.rsc +15 -15
  176. package/.next/server/app/messages.segments/_full.segment.rsc +15 -15
  177. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  178. package/.next/server/app/messages.segments/_index.segment.rsc +8 -8
  179. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  180. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  181. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  182. package/.next/server/app/node/page/build-manifest.json +5 -5
  183. package/.next/server/app/node/page/next-font-manifest.json +1 -1
  184. package/.next/server/app/node/page.js +13 -13
  185. package/.next/server/app/node/page.js.nft.json +1 -1
  186. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  187. package/.next/server/app/node.html +2 -2
  188. package/.next/server/app/node.rsc +15 -15
  189. package/.next/server/app/node.segments/_full.segment.rsc +15 -15
  190. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  191. package/.next/server/app/node.segments/_index.segment.rsc +8 -8
  192. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  193. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  194. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  195. package/.next/server/app/nodes/page/build-manifest.json +5 -5
  196. package/.next/server/app/nodes/page/next-font-manifest.json +1 -1
  197. package/.next/server/app/nodes/page.js +13 -13
  198. package/.next/server/app/nodes/page.js.nft.json +1 -1
  199. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  200. package/.next/server/app/nodes.html +2 -2
  201. package/.next/server/app/nodes.rsc +15 -15
  202. package/.next/server/app/nodes.segments/_full.segment.rsc +15 -15
  203. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  204. package/.next/server/app/nodes.segments/_index.segment.rsc +8 -8
  205. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  206. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  207. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  208. package/.next/server/app/page/build-manifest.json +5 -5
  209. package/.next/server/app/page/next-font-manifest.json +1 -1
  210. package/.next/server/app/page.js +13 -13
  211. package/.next/server/app/page.js.nft.json +1 -1
  212. package/.next/server/app/page_client-reference-manifest.js +1 -1
  213. package/.next/server/app/server-logs/page/build-manifest.json +5 -5
  214. package/.next/server/app/server-logs/page/next-font-manifest.json +1 -1
  215. package/.next/server/app/server-logs/page.js +13 -13
  216. package/.next/server/app/server-logs/page.js.nft.json +1 -1
  217. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  218. package/.next/server/app/server-logs.html +2 -2
  219. package/.next/server/app/server-logs.rsc +15 -15
  220. package/.next/server/app/server-logs.segments/_full.segment.rsc +15 -15
  221. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  222. package/.next/server/app/server-logs.segments/_index.segment.rsc +8 -8
  223. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  224. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  225. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  226. package/.next/server/app/servers/page/build-manifest.json +5 -5
  227. package/.next/server/app/servers/page/next-font-manifest.json +1 -1
  228. package/.next/server/app/servers/page.js +13 -13
  229. package/.next/server/app/servers/page.js.nft.json +1 -1
  230. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/servers.html +2 -2
  232. package/.next/server/app/servers.rsc +15 -15
  233. package/.next/server/app/servers.segments/_full.segment.rsc +15 -15
  234. package/.next/server/app/servers.segments/_head.segment.rsc +4 -4
  235. package/.next/server/app/servers.segments/_index.segment.rsc +8 -8
  236. package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
  237. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +4 -4
  238. package/.next/server/app/servers.segments/servers.segment.rsc +3 -3
  239. package/.next/server/app/settings/networks/page/build-manifest.json +5 -5
  240. package/.next/server/app/settings/networks/page/next-font-manifest.json +1 -1
  241. package/.next/server/app/settings/networks/page.js +13 -13
  242. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  243. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/settings/networks.html +2 -2
  245. package/.next/server/app/settings/networks.rsc +15 -15
  246. package/.next/server/app/settings/networks.segments/_full.segment.rsc +15 -15
  247. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  248. package/.next/server/app/settings/networks.segments/_index.segment.rsc +8 -8
  249. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  250. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  251. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  252. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  253. package/.next/server/app/settings/page/build-manifest.json +5 -5
  254. package/.next/server/app/settings/page/next-font-manifest.json +1 -1
  255. package/.next/server/app/settings/page.js +13 -13
  256. package/.next/server/app/settings/page.js.nft.json +1 -1
  257. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  258. package/.next/server/app/settings/tokens/page/build-manifest.json +5 -5
  259. package/.next/server/app/settings/tokens/page/next-font-manifest.json +1 -1
  260. package/.next/server/app/settings/tokens/page.js +13 -13
  261. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  262. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  263. package/.next/server/app/settings/tokens.html +2 -2
  264. package/.next/server/app/settings/tokens.rsc +15 -15
  265. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +15 -15
  266. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  267. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +8 -8
  268. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  269. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  270. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  271. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  272. package/.next/server/app/settings.html +2 -2
  273. package/.next/server/app/settings.rsc +15 -15
  274. package/.next/server/app/settings.segments/_full.segment.rsc +15 -15
  275. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  276. package/.next/server/app/settings.segments/_index.segment.rsc +8 -8
  277. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  278. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  279. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  280. package/.next/server/app/tasks/[id]/page/build-manifest.json +5 -5
  281. package/.next/server/app/tasks/[id]/page/next-font-manifest.json +1 -1
  282. package/.next/server/app/tasks/[id]/page.js +13 -13
  283. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  284. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app/tasks/page/build-manifest.json +5 -5
  286. package/.next/server/app/tasks/page/next-font-manifest.json +1 -1
  287. package/.next/server/app/tasks/page.js +13 -13
  288. package/.next/server/app/tasks/page.js.nft.json +1 -1
  289. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  290. package/.next/server/app/tasks.html +2 -2
  291. package/.next/server/app/tasks.rsc +15 -15
  292. package/.next/server/app/tasks.segments/_full.segment.rsc +15 -15
  293. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  294. package/.next/server/app/tasks.segments/_index.segment.rsc +8 -8
  295. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  296. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  297. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  298. package/.next/server/app-paths-manifest.json +3 -0
  299. package/.next/server/chunks/0emd_next_0zjoz0g._.js +10 -0
  300. package/.next/server/chunks/0emd_next_0zjoz0g._.js.map +1 -0
  301. package/.next/server/chunks/0emd_next_dist_07_njzq._.js +18 -0
  302. package/.next/server/chunks/0emd_next_dist_07_njzq._.js.map +1 -0
  303. package/.next/server/chunks/0emd_next_dist_esm_build_templates_app-route_0ze.4~8.js +3 -0
  304. package/.next/server/chunks/0emd_next_dist_esm_build_templates_app-route_0ze.4~8.js.map +1 -0
  305. package/.next/server/chunks/0eys__next-internal_server_app_api_anet_node-config_route_actions_0vpbqmt.js +3 -0
  306. package/.next/server/chunks/0eys__next-internal_server_app_api_anet_node-create_route_actions_0ack5_x.js +3 -0
  307. package/.next/server/chunks/0eys__next-internal_server_app_api_anet_node-lifecycle_route_actions_13z6pk9.js +3 -0
  308. package/.next/server/chunks/0eys__next-internal_server_app_api_hub_server-logs_route_actions_13k0lzq.js +3 -0
  309. package/.next/server/chunks/0eys__next-internal_server_app_api_hub_task-events_route_actions_0eayccx.js +3 -0
  310. package/.next/server/chunks/0eys__next-internal_server_app_manifest_webmanifest_route_actions_03s5neg.js +3 -0
  311. package/.next/server/chunks/0raa_next-internal_server_app_api_hub_server_[hostname]_agents_route_actions_0q9dcjz.js +3 -0
  312. package/.next/server/chunks/0raa_next-internal_server_app_api_hub_server_[hostname]_health_route_actions_0s8k6m..js +3 -0
  313. package/.next/server/chunks/[root-of-the-server]__0-jphjp._.js +6 -0
  314. package/.next/server/chunks/[root-of-the-server]__0-jphjp._.js.map +1 -0
  315. package/.next/server/chunks/[root-of-the-server]__0-po71t._.js +3 -0
  316. package/.next/server/chunks/[root-of-the-server]__0-po71t._.js.map +1 -0
  317. package/.next/server/chunks/[root-of-the-server]__0.5kg~w._.js +3 -0
  318. package/.next/server/chunks/[root-of-the-server]__0.5kg~w._.js.map +1 -0
  319. package/.next/server/chunks/[root-of-the-server]__0._v9vf._.js +3 -0
  320. package/.next/server/chunks/{[root-of-the-server]__01cxv~5._.js.map → [root-of-the-server]__0._v9vf._.js.map} +1 -1
  321. package/.next/server/chunks/[root-of-the-server]__00gb0kv._.js +3 -0
  322. package/.next/server/chunks/{[root-of-the-server]__0fk~j-f._.js.map → [root-of-the-server]__00gb0kv._.js.map} +1 -1
  323. package/.next/server/chunks/[root-of-the-server]__013ptvb._.js +3 -0
  324. package/.next/server/chunks/[root-of-the-server]__013ptvb._.js.map +1 -0
  325. package/.next/server/chunks/[root-of-the-server]__03c6cit._.js +3 -0
  326. package/.next/server/chunks/[root-of-the-server]__03c6cit._.js.map +1 -0
  327. package/.next/server/chunks/[root-of-the-server]__04a200m._.js +3 -0
  328. package/.next/server/chunks/{[root-of-the-server]__0p77uu0._.js.map → [root-of-the-server]__04a200m._.js.map} +1 -1
  329. package/.next/server/chunks/[root-of-the-server]__05494tj._.js +3 -0
  330. package/.next/server/chunks/[root-of-the-server]__05494tj._.js.map +1 -0
  331. package/.next/server/chunks/[root-of-the-server]__065pywy._.js +3 -0
  332. package/.next/server/chunks/[root-of-the-server]__065pywy._.js.map +1 -0
  333. package/.next/server/chunks/[root-of-the-server]__07kt6aj._.js +3 -0
  334. package/.next/server/chunks/[root-of-the-server]__07kt6aj._.js.map +1 -0
  335. package/.next/server/chunks/[root-of-the-server]__07x377i._.js +3 -0
  336. package/.next/server/chunks/[root-of-the-server]__07x377i._.js.map +1 -0
  337. package/.next/server/chunks/[root-of-the-server]__0anx8ak._.js +3 -0
  338. package/.next/server/chunks/[root-of-the-server]__0anx8ak._.js.map +1 -0
  339. package/.next/server/chunks/[root-of-the-server]__0dqs1t5._.js +3 -0
  340. package/.next/server/chunks/[root-of-the-server]__0dqs1t5._.js.map +1 -0
  341. package/.next/server/chunks/[root-of-the-server]__0efa-e~._.js +3 -0
  342. package/.next/server/chunks/[root-of-the-server]__0efa-e~._.js.map +1 -0
  343. package/.next/server/chunks/[root-of-the-server]__0eonvri._.js +3 -0
  344. package/.next/server/chunks/[root-of-the-server]__0eonvri._.js.map +1 -0
  345. package/.next/server/chunks/[root-of-the-server]__0f5-nhl._.js +3 -0
  346. package/.next/server/chunks/{[root-of-the-server]__0t-zv8i._.js.map → [root-of-the-server]__0f5-nhl._.js.map} +1 -1
  347. package/.next/server/chunks/[root-of-the-server]__0f~mkgn._.js +3 -0
  348. package/.next/server/chunks/[root-of-the-server]__0f~mkgn._.js.map +1 -0
  349. package/.next/server/chunks/[root-of-the-server]__0go6s0b._.js +3 -0
  350. package/.next/server/chunks/{[root-of-the-server]__0r.6ku0._.js.map → [root-of-the-server]__0go6s0b._.js.map} +1 -1
  351. package/.next/server/chunks/[root-of-the-server]__0ixnvi-._.js +3 -0
  352. package/.next/server/chunks/{[root-of-the-server]__0ncl1y5._.js.map → [root-of-the-server]__0ixnvi-._.js.map} +1 -1
  353. package/.next/server/chunks/[root-of-the-server]__0jlzmrm._.js +3 -0
  354. package/.next/server/chunks/[root-of-the-server]__0jlzmrm._.js.map +1 -0
  355. package/.next/server/chunks/[root-of-the-server]__0k-0~jy._.js +3 -0
  356. package/.next/server/chunks/[root-of-the-server]__0k-0~jy._.js.map +1 -0
  357. package/.next/server/chunks/[root-of-the-server]__0kalz0~._.js +3 -0
  358. package/.next/server/chunks/[root-of-the-server]__0kalz0~._.js.map +1 -0
  359. package/.next/server/chunks/[root-of-the-server]__0ksm0bm._.js +3 -0
  360. package/.next/server/chunks/[root-of-the-server]__0ksm0bm._.js.map +1 -0
  361. package/.next/server/chunks/[root-of-the-server]__0lcdg4r._.js +3 -0
  362. package/.next/server/chunks/[root-of-the-server]__0lcdg4r._.js.map +1 -0
  363. package/.next/server/chunks/[root-of-the-server]__0lud1_2._.js +3 -0
  364. package/.next/server/chunks/[root-of-the-server]__0lud1_2._.js.map +1 -0
  365. package/.next/server/chunks/[root-of-the-server]__0n__sw5._.js +3 -0
  366. package/.next/server/chunks/[root-of-the-server]__0n__sw5._.js.map +1 -0
  367. package/.next/server/chunks/[root-of-the-server]__0ocd-7~._.js +3 -0
  368. package/.next/server/chunks/[root-of-the-server]__0ocd-7~._.js.map +1 -0
  369. package/.next/server/chunks/[root-of-the-server]__0osz.5l._.js +3 -0
  370. package/.next/server/chunks/{[root-of-the-server]__117_h7d._.js.map → [root-of-the-server]__0osz.5l._.js.map} +1 -1
  371. package/.next/server/chunks/[root-of-the-server]__0uc.~eb._.js +3 -0
  372. package/.next/server/chunks/[root-of-the-server]__0uc.~eb._.js.map +1 -0
  373. package/.next/server/chunks/[root-of-the-server]__0z~3-vx._.js +3 -0
  374. package/.next/server/chunks/[root-of-the-server]__0z~3-vx._.js.map +1 -0
  375. package/.next/server/chunks/[root-of-the-server]__0z~50bw._.js +3 -0
  376. package/.next/server/chunks/[root-of-the-server]__0z~50bw._.js.map +1 -0
  377. package/.next/server/chunks/[root-of-the-server]__10z4o-.._.js +3 -0
  378. package/.next/server/chunks/[root-of-the-server]__10z4o-.._.js.map +1 -0
  379. package/.next/server/chunks/[root-of-the-server]__11swhm2._.js +20 -0
  380. package/.next/server/chunks/[root-of-the-server]__11swhm2._.js.map +1 -0
  381. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_anet_config_route_actions_0eb-2a9.js +3 -0
  382. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_auth_login_route_actions_0_0zk8~.js +3 -0
  383. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_auth_logout_route_actions_0yy6u4n.js +3 -0
  384. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_auth_v3_route_actions_09dg3rk.js +3 -0
  385. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_audit-log_route_actions_03wia4o.js +3 -0
  386. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_auth_route_actions_0k.l0a-.js +3 -0
  387. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_broadcast_route_actions_02wotps.js +3 -0
  388. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_events_route_actions_0i1zyq~.js +3 -0
  389. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_health_route_actions_0fe6lsz.js +3 -0
  390. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_inbox_route_actions_0iup.xe.js +3 -0
  391. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_messages_route_actions_0syf65m.js +3 -0
  392. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_networks_route_actions_04dtp_m.js +3 -0
  393. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_nodes_route_actions_0aghuq9.js +3 -0
  394. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_register_route_actions_04g3.gx.js +3 -0
  395. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_send_route_actions_01m4__p.js +3 -0
  396. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_servers_route_actions_10lz59w.js +3 -0
  397. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_session_route_actions_03ce57x.js +3 -0
  398. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_stats_route_actions_0~xcq1-.js +3 -0
  399. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_status_route_actions_0slss8r.js +3 -0
  400. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_tasks_route_actions_0yvhaa_.js +3 -0
  401. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_tmux_route_actions_0_f8h.h.js +3 -0
  402. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_tokens_route_actions_0ke~8y8.js +3 -0
  403. package/.next/server/chunks/dash-main-prep__next-internal_server_app_api_hub_upload_route_actions_02jnx8r.js +3 -0
  404. package/.next/server/chunks/dash-main-prep__next-internal_server_app_favicon_ico_route_actions_09bgfok.js +3 -0
  405. package/.next/server/chunks/ssr/0emd_047jqdj._.js +33 -0
  406. package/.next/server/chunks/ssr/0emd_047jqdj._.js.map +1 -0
  407. package/.next/server/chunks/ssr/0emd_06kedq-._.js +3 -0
  408. package/.next/server/chunks/ssr/0emd_06kedq-._.js.map +1 -0
  409. package/.next/server/chunks/ssr/0emd_0_26t76._.js +3 -0
  410. package/.next/server/chunks/ssr/0emd_0_26t76._.js.map +1 -0
  411. package/.next/server/chunks/ssr/0emd_13t5_lo._.js +3 -0
  412. package/.next/server/chunks/ssr/0emd_13t5_lo._.js.map +1 -0
  413. package/.next/server/chunks/ssr/{0eys_next_0_~e226._.js → 0emd_next_0bnhxgq._.js} +3 -3
  414. package/.next/server/chunks/ssr/0emd_next_0bnhxgq._.js.map +1 -0
  415. package/.next/server/chunks/ssr/0emd_next_dist_00jgl6k._.js +6 -0
  416. package/.next/server/chunks/ssr/0emd_next_dist_00jgl6k._.js.map +1 -0
  417. package/.next/server/chunks/ssr/0emd_next_dist_client_components_00j7vwk._.js +3 -0
  418. package/.next/server/chunks/ssr/0emd_next_dist_client_components_00j7vwk._.js.map +1 -0
  419. package/.next/server/chunks/ssr/0emd_next_dist_client_components_builtin_forbidden_1087x.v.js +3 -0
  420. package/.next/server/chunks/ssr/0emd_next_dist_client_components_builtin_forbidden_1087x.v.js.map +1 -0
  421. package/.next/server/chunks/ssr/0emd_next_dist_client_components_builtin_global-error_0qrbd.p.js +3 -0
  422. package/.next/server/chunks/ssr/0emd_next_dist_client_components_builtin_global-error_0qrbd.p.js.map +1 -0
  423. package/.next/server/chunks/ssr/0emd_next_dist_client_components_builtin_unauthorized_0~qxw.r.js +3 -0
  424. package/.next/server/chunks/ssr/0emd_next_dist_client_components_builtin_unauthorized_0~qxw.r.js.map +1 -0
  425. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_038w~o4.js → 0emd_next_dist_esm_build_templates_app-page_0.3fpy_.js} +3 -3
  426. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0.3fpy_.js.map +1 -0
  427. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0gg19s6.js → 0emd_next_dist_esm_build_templates_app-page_016_j7..js} +3 -3
  428. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_016_j7..js.map +1 -0
  429. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0q4gvif.js → 0emd_next_dist_esm_build_templates_app-page_06x82hl.js} +3 -3
  430. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_06x82hl.js.map +1 -0
  431. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0unqv4v.js → 0emd_next_dist_esm_build_templates_app-page_0c0fklb.js} +3 -3
  432. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0c0fklb.js.map +1 -0
  433. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0j5dp2i.js +4 -0
  434. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0j5dp2i.js.map +1 -0
  435. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0kgge41.js +4 -0
  436. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0kgge41.js.map +1 -0
  437. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_097i4vb.js → 0emd_next_dist_esm_build_templates_app-page_0ospxq4.js} +3 -3
  438. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0ospxq4.js.map +1 -0
  439. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0otan.0.js → 0emd_next_dist_esm_build_templates_app-page_0oz02hy.js} +3 -3
  440. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0oz02hy.js.map +1 -0
  441. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0g0ea16.js → 0emd_next_dist_esm_build_templates_app-page_0r4~r~z.js} +3 -3
  442. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0r4~r~z.js.map +1 -0
  443. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0ikgf-7.js → 0emd_next_dist_esm_build_templates_app-page_0rjp8.q.js} +3 -3
  444. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0rjp8.q.js.map +1 -0
  445. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0tqydx2.js +4 -0
  446. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0tqydx2.js.map +1 -0
  447. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0s.as54.js → 0emd_next_dist_esm_build_templates_app-page_0u.fjk1.js} +3 -3
  448. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0u.fjk1.js.map +1 -0
  449. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_10~-.q1.js → 0emd_next_dist_esm_build_templates_app-page_0v3so27.js} +3 -3
  450. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0v3so27.js.map +1 -0
  451. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0t88_uc.js → 0emd_next_dist_esm_build_templates_app-page_0xikgs1.js} +3 -3
  452. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_0xikgs1.js.map +1 -0
  453. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0xry76m.js → 0emd_next_dist_esm_build_templates_app-page_10jwiid.js} +3 -3
  454. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_10jwiid.js.map +1 -0
  455. package/.next/server/chunks/ssr/{0eys_next_dist_esm_build_templates_app-page_0fy2_ot.js → 0emd_next_dist_esm_build_templates_app-page_133cpo2.js} +3 -3
  456. package/.next/server/chunks/ssr/0emd_next_dist_esm_build_templates_app-page_133cpo2.js.map +1 -0
  457. package/.next/server/chunks/ssr/[root-of-the-server]__00c-m~h._.js +3 -0
  458. package/.next/server/chunks/ssr/[root-of-the-server]__00c-m~h._.js.map +1 -0
  459. package/.next/server/chunks/ssr/[root-of-the-server]__00t8yko._.js +3 -0
  460. package/.next/server/chunks/ssr/[root-of-the-server]__00t8yko._.js.map +1 -0
  461. package/.next/server/chunks/ssr/[root-of-the-server]__02e9x~u._.js +3 -0
  462. package/.next/server/chunks/ssr/[root-of-the-server]__02e9x~u._.js.map +1 -0
  463. package/.next/server/chunks/ssr/[root-of-the-server]__0337u7~._.js +3 -0
  464. package/.next/server/chunks/ssr/[root-of-the-server]__0337u7~._.js.map +1 -0
  465. package/.next/server/chunks/ssr/{[root-of-the-server]__0.bq9qd._.js → [root-of-the-server]__0342o.i._.js} +2 -2
  466. package/.next/server/chunks/ssr/[root-of-the-server]__0342o.i._.js.map +1 -0
  467. package/.next/server/chunks/ssr/[root-of-the-server]__03mvbey._.js +3 -0
  468. package/.next/server/chunks/ssr/[root-of-the-server]__03mvbey._.js.map +1 -0
  469. package/.next/server/chunks/ssr/[root-of-the-server]__0_nj.h9._.js +3 -0
  470. package/.next/server/chunks/ssr/[root-of-the-server]__0_nj.h9._.js.map +1 -0
  471. package/.next/server/chunks/ssr/[root-of-the-server]__0a..bh5._.js +3 -0
  472. package/.next/server/chunks/ssr/[root-of-the-server]__0a..bh5._.js.map +1 -0
  473. package/.next/server/chunks/ssr/[root-of-the-server]__0bhrs1j._.js +3 -0
  474. package/.next/server/chunks/ssr/[root-of-the-server]__0bhrs1j._.js.map +1 -0
  475. package/.next/server/chunks/ssr/[root-of-the-server]__0c1te6d._.js +3 -0
  476. package/.next/server/chunks/ssr/[root-of-the-server]__0c1te6d._.js.map +1 -0
  477. package/.next/server/chunks/ssr/[root-of-the-server]__0cbfccb._.js +3 -0
  478. package/.next/server/chunks/ssr/[root-of-the-server]__0cbfccb._.js.map +1 -0
  479. package/.next/server/chunks/ssr/[root-of-the-server]__0dog1cm._.js +3 -0
  480. package/.next/server/chunks/ssr/[root-of-the-server]__0dog1cm._.js.map +1 -0
  481. package/.next/server/chunks/ssr/[root-of-the-server]__0ei826c._.js +3 -0
  482. package/.next/server/chunks/ssr/[root-of-the-server]__0ei826c._.js.map +1 -0
  483. package/.next/server/chunks/ssr/[root-of-the-server]__0es3uv3._.js +3 -0
  484. package/.next/server/chunks/ssr/[root-of-the-server]__0es3uv3._.js.map +1 -0
  485. package/.next/server/chunks/ssr/[root-of-the-server]__0j5c4hr._.js +8 -0
  486. package/.next/server/chunks/ssr/[root-of-the-server]__0j5c4hr._.js.map +1 -0
  487. package/.next/server/chunks/ssr/[root-of-the-server]__0otzd58._.js +3 -0
  488. package/.next/server/chunks/ssr/[root-of-the-server]__0otzd58._.js.map +1 -0
  489. package/.next/server/chunks/ssr/[root-of-the-server]__0ppvi5_._.js +3 -0
  490. package/.next/server/chunks/ssr/[root-of-the-server]__0ppvi5_._.js.map +1 -0
  491. package/.next/server/chunks/ssr/[root-of-the-server]__0p~jybs._.js +3 -0
  492. package/.next/server/chunks/ssr/[root-of-the-server]__0p~jybs._.js.map +1 -0
  493. package/.next/server/chunks/ssr/[root-of-the-server]__0utp0~w._.js +33 -0
  494. package/.next/server/chunks/ssr/[root-of-the-server]__0utp0~w._.js.map +1 -0
  495. package/.next/server/chunks/ssr/[root-of-the-server]__0x7j2o1._.js +3 -0
  496. package/.next/server/chunks/ssr/[root-of-the-server]__0x7j2o1._.js.map +1 -0
  497. package/.next/server/chunks/ssr/[root-of-the-server]__0yacr~n._.js +6 -0
  498. package/.next/server/chunks/ssr/{[root-of-the-server]__0xsrxaq._.js.map → [root-of-the-server]__0yacr~n._.js.map} +1 -1
  499. package/.next/server/chunks/ssr/[root-of-the-server]__0~jfwze._.js +19 -0
  500. package/.next/server/chunks/ssr/[root-of-the-server]__0~jfwze._.js.map +1 -0
  501. package/.next/server/chunks/ssr/[root-of-the-server]__0~zzavb._.js +3 -0
  502. package/.next/server/chunks/ssr/[root-of-the-server]__0~zzavb._.js.map +1 -0
  503. package/.next/server/chunks/ssr/[root-of-the-server]__12oz5~2._.js +3 -0
  504. package/.next/server/chunks/ssr/[root-of-the-server]__12oz5~2._.js.map +1 -0
  505. package/.next/server/chunks/ssr/[root-of-the-server]__13ti3mc._.js +33 -0
  506. package/.next/server/chunks/ssr/[root-of-the-server]__13ti3mc._.js.map +1 -0
  507. package/.next/server/chunks/ssr/{p248-dash-release_03jozqe._.js → dash-main-prep_04jom44._.js} +3 -3
  508. package/.next/server/chunks/ssr/dash-main-prep_04jom44._.js.map +1 -0
  509. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app__global-error_page_actions_07kk3nm.js +3 -0
  510. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app__not-found_page_actions_0cb6n8e.js +3 -0
  511. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_admin_page_actions_0whq~om.js +3 -0
  512. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_login_page_actions_0lfb5vh.js +3 -0
  513. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_logs_page_actions_0a9g2gh.js +3 -0
  514. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_messages_page_actions_0_0a~oj.js +3 -0
  515. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_node_page_actions_0nt83da.js +3 -0
  516. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_nodes_page_actions_001898j.js +3 -0
  517. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_page_actions_10t6_cb.js +3 -0
  518. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_server-logs_page_actions_10i2y0v.js +3 -0
  519. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_servers_page_actions_0yfsnrz.js +3 -0
  520. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_settings_networks_page_actions_0.6z6e9.js +3 -0
  521. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_settings_page_actions_0t_etc1.js +3 -0
  522. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_settings_tokens_page_actions_0g~ilh~.js +3 -0
  523. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_settings_tokens_page_actions_0g~ilh~.js.map +1 -0
  524. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_tasks_[id]_page_actions_0jc~43n.js +3 -0
  525. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_tasks_[id]_page_actions_0jc~43n.js.map +1 -0
  526. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_tasks_page_actions_0k0da_-.js +3 -0
  527. package/.next/server/chunks/ssr/dash-main-prep__next-internal_server_app_tasks_page_actions_0k0da_-.js.map +1 -0
  528. package/.next/server/chunks/ssr/dash-main-prep_app_0-ei3ea._.js +3 -0
  529. package/.next/server/chunks/ssr/dash-main-prep_app_0-ei3ea._.js.map +1 -0
  530. package/.next/server/chunks/ssr/{p248-dash-release_app_01r5cp-._.js → dash-main-prep_app_00xe5ww._.js} +2 -2
  531. package/.next/server/chunks/ssr/dash-main-prep_app_00xe5ww._.js.map +1 -0
  532. package/.next/server/chunks/ssr/{p248-dash-release_app_0heiqx4._.js → dash-main-prep_app_02jbzgm._.js} +2 -2
  533. package/.next/server/chunks/ssr/dash-main-prep_app_02jbzgm._.js.map +1 -0
  534. package/.next/server/chunks/ssr/{p248-dash-release_app_0r.6wo3._.js → dash-main-prep_app_0_8.j.9._.js} +2 -2
  535. package/.next/server/chunks/ssr/dash-main-prep_app_0_8.j.9._.js.map +1 -0
  536. package/.next/server/chunks/ssr/dash-main-prep_app_0em9eg-._.js +3 -0
  537. package/.next/server/chunks/ssr/dash-main-prep_app_0em9eg-._.js.map +1 -0
  538. package/.next/server/chunks/ssr/{p248-dash-release_app_0415ugh._.js → dash-main-prep_app_0l5pr3q._.js} +2 -2
  539. package/.next/server/chunks/ssr/dash-main-prep_app_0l5pr3q._.js.map +1 -0
  540. package/.next/server/chunks/ssr/dash-main-prep_app_0vx7mgv._.js +3 -0
  541. package/.next/server/chunks/ssr/dash-main-prep_app_0vx7mgv._.js.map +1 -0
  542. package/.next/server/chunks/ssr/{p248-dash-release_app_07ks..b._.js → dash-main-prep_app_0z7jy81._.js} +2 -2
  543. package/.next/server/chunks/ssr/dash-main-prep_app_0z7jy81._.js.map +1 -0
  544. package/.next/server/chunks/ssr/{p248-dash-release_app_0.xbj-j._.js → dash-main-prep_app_0~~c86p._.js} +2 -2
  545. package/.next/server/chunks/ssr/dash-main-prep_app_0~~c86p._.js.map +1 -0
  546. package/.next/server/chunks/ssr/{p248-dash-release_app_0ict6f_._.js → dash-main-prep_app_105mjhx._.js} +2 -2
  547. package/.next/server/chunks/ssr/dash-main-prep_app_105mjhx._.js.map +1 -0
  548. package/.next/server/chunks/ssr/{p248-dash-release_app_components_0l8tz~8._.js → dash-main-prep_app_components_0p9bpx_._.js} +3 -3
  549. package/.next/server/chunks/ssr/dash-main-prep_app_components_0p9bpx_._.js.map +1 -0
  550. package/.next/server/chunks/ssr/dash-main-prep_app_nodes_page_tsx_0k20g4a._.js +3 -0
  551. package/.next/server/chunks/ssr/dash-main-prep_app_nodes_page_tsx_0k20g4a._.js.map +1 -0
  552. package/.next/server/chunks/ssr/{p248-dash-release_app_servers_page_tsx_0gjg_-r._.js → dash-main-prep_app_servers_page_tsx_0zrm2-z._.js} +2 -2
  553. package/.next/server/chunks/ssr/dash-main-prep_app_servers_page_tsx_0zrm2-z._.js.map +1 -0
  554. package/.next/server/chunks/ssr/{p248-dash-release_app_tasks_page_tsx_0qdyj8l._.js → dash-main-prep_app_tasks_page_tsx_013t47c._.js} +2 -2
  555. package/.next/server/chunks/ssr/dash-main-prep_app_tasks_page_tsx_013t47c._.js.map +1 -0
  556. package/.next/server/middleware-build-manifest.js +8 -8
  557. package/.next/server/middleware.js +3 -3
  558. package/.next/server/middleware.js.nft.json +1 -1
  559. package/.next/server/next-font-manifest.js +1 -1
  560. package/.next/server/next-font-manifest.json +15 -15
  561. package/.next/server/pages/404.html +2 -2
  562. package/.next/server/pages/500.html +1 -1
  563. package/.next/server/server-reference-manifest.js +1 -1
  564. package/.next/server/server-reference-manifest.json +1 -1
  565. package/.next/static/chunks/0..6bvayc~2v_.js +31 -0
  566. package/.next/static/chunks/0.4it~9-lgmdc.js +7 -0
  567. package/.next/static/chunks/008f8y0vjzx6q.js +1 -0
  568. package/.next/static/chunks/026_lvbjd5ehm.js +1 -0
  569. package/.next/static/chunks/038w1~wz8c.b_.js +1 -0
  570. package/.next/static/chunks/04ab~m7-c0hma.js +1 -0
  571. package/.next/static/chunks/05n6g8whg1rnw.js +4 -0
  572. package/.next/static/chunks/074qn1p5esp6v.js +1 -0
  573. package/.next/static/chunks/{11c-24vhb~5d5.js → 0_eh6-xnv.vas.js} +1 -1
  574. package/.next/static/chunks/0_q1lcvifkup1.js +4 -0
  575. package/.next/static/chunks/0cj3regqtbzgi.js +1 -0
  576. package/.next/static/chunks/{0u6y82jjwp2k_.js → 0e.5fp53g~gjx.js} +1 -1
  577. package/.next/static/chunks/{0f1nxmo-ba2au.js → 0fval~_yhzi56.js} +1 -1
  578. package/.next/static/chunks/0g76.rws7jb6p.js +4 -0
  579. package/.next/static/chunks/0lfg~2g8_-82b.js +1 -0
  580. package/.next/static/chunks/{0e~mf5-e4dl_e.js → 0n5d~z6jskv75.js} +1 -1
  581. package/.next/static/chunks/{0655qv_ed4zqk.js → 0nvbpp15hjh1k.js} +1 -1
  582. package/.next/static/chunks/0p..-4gjx~ua~.css +1 -0
  583. package/.next/static/chunks/{0td.dx.r1h_nl.js → 0r5q0e.lci5bj.js} +2 -2
  584. package/.next/static/chunks/0u5kv-8r.53y_.js +1 -0
  585. package/.next/static/chunks/0uroeke.37_qr.js +1 -0
  586. package/.next/static/chunks/0w66-7icvft37.js +2 -0
  587. package/.next/static/chunks/0w8djdzyh1ar0.js +1 -0
  588. package/.next/static/chunks/0wikbewneplt6.js +1 -0
  589. package/.next/static/chunks/0zozgpnx9_ex_.js +1 -0
  590. package/.next/static/chunks/135hvx8t2m~5~.js +1 -0
  591. package/.next/static/chunks/turbopack-1071etkj.k-n~.js +1 -0
  592. package/.next/trace +2 -2
  593. package/.next/trace-build +1 -1
  594. package/.next/types/routes.d.ts +4 -1
  595. package/.next/types/validator.ts +27 -0
  596. package/app/api/anet/node-config/route.ts +140 -0
  597. package/app/api/anet/node-create/route.ts +174 -0
  598. package/app/api/anet/node-lifecycle/route.ts +108 -0
  599. package/app/components/AgentCard.tsx +33 -3
  600. package/app/components/CreateNodeWizard.tsx +288 -0
  601. package/app/components/NodeSettingsPanel.tsx +695 -0
  602. package/app/lib/hub-mcp.ts +94 -0
  603. package/app/nodes/page.tsx +17 -1
  604. package/package.json +2 -1
  605. package/.next/build/chunks/0eys_0hzxj57._.js.map +0 -47
  606. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0f_tr7e._.js +0 -13
  607. package/.next/server/chunks/0ctr__next-internal_server_app_api_anet_config_route_actions_0vfnpq~.js +0 -3
  608. package/.next/server/chunks/0ctr__next-internal_server_app_api_auth_logout_route_actions_0mnkdb1.js +0 -3
  609. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_audit-log_route_actions_01da9km.js +0 -3
  610. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_broadcast_route_actions_0-mzp~m.js +0 -3
  611. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_messages_route_actions_0yqdey-.js +0 -3
  612. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_networks_route_actions_08zwxgz.js +0 -3
  613. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_register_route_actions_059ib7..js +0 -3
  614. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_server-logs_route_actions_0.lpvmu.js +0 -3
  615. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_servers_route_actions_0n9er6w.js +0 -3
  616. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_session_route_actions_0clahzh.js +0 -3
  617. package/.next/server/chunks/0ctr__next-internal_server_app_api_hub_task-events_route_actions_0eupv~7.js +0 -3
  618. package/.next/server/chunks/0ctr__next-internal_server_app_manifest_webmanifest_route_actions_0zwabxo.js +0 -3
  619. package/.next/server/chunks/0eys_next_0qdv7h5._.js +0 -10
  620. package/.next/server/chunks/0eys_next_0qdv7h5._.js.map +0 -1
  621. package/.next/server/chunks/0eys_next_dist_0k3eipb._.js +0 -18
  622. package/.next/server/chunks/0eys_next_dist_0k3eipb._.js.map +0 -1
  623. package/.next/server/chunks/0eys_next_dist_esm_build_templates_app-route_0squ2oo.js +0 -3
  624. package/.next/server/chunks/0eys_next_dist_esm_build_templates_app-route_0squ2oo.js.map +0 -1
  625. package/.next/server/chunks/0n8__next-internal_server_app_api_hub_server_[hostname]_agents_route_actions_0td~w-3.js +0 -3
  626. package/.next/server/chunks/0n8__next-internal_server_app_api_hub_server_[hostname]_health_route_actions_0-cx2k4.js +0 -3
  627. package/.next/server/chunks/[root-of-the-server]__0030c3d._.js +0 -3
  628. package/.next/server/chunks/[root-of-the-server]__0030c3d._.js.map +0 -1
  629. package/.next/server/chunks/[root-of-the-server]__006ofg~._.js +0 -3
  630. package/.next/server/chunks/[root-of-the-server]__006ofg~._.js.map +0 -1
  631. package/.next/server/chunks/[root-of-the-server]__00hv4s.._.js +0 -3
  632. package/.next/server/chunks/[root-of-the-server]__00hv4s.._.js.map +0 -1
  633. package/.next/server/chunks/[root-of-the-server]__01cxv~5._.js +0 -3
  634. package/.next/server/chunks/[root-of-the-server]__03kos9q._.js +0 -3
  635. package/.next/server/chunks/[root-of-the-server]__03kos9q._.js.map +0 -1
  636. package/.next/server/chunks/[root-of-the-server]__03oze7j._.js +0 -3
  637. package/.next/server/chunks/[root-of-the-server]__03oze7j._.js.map +0 -1
  638. package/.next/server/chunks/[root-of-the-server]__04cd_-f._.js +0 -3
  639. package/.next/server/chunks/[root-of-the-server]__04cd_-f._.js.map +0 -1
  640. package/.next/server/chunks/[root-of-the-server]__04g4e2s._.js +0 -3
  641. package/.next/server/chunks/[root-of-the-server]__04g4e2s._.js.map +0 -1
  642. package/.next/server/chunks/[root-of-the-server]__06gsfmz._.js +0 -3
  643. package/.next/server/chunks/[root-of-the-server]__06gsfmz._.js.map +0 -1
  644. package/.next/server/chunks/[root-of-the-server]__06ze71n._.js +0 -6
  645. package/.next/server/chunks/[root-of-the-server]__06ze71n._.js.map +0 -1
  646. package/.next/server/chunks/[root-of-the-server]__0afgpqa._.js +0 -3
  647. package/.next/server/chunks/[root-of-the-server]__0afgpqa._.js.map +0 -1
  648. package/.next/server/chunks/[root-of-the-server]__0c36sc~._.js +0 -3
  649. package/.next/server/chunks/[root-of-the-server]__0c36sc~._.js.map +0 -1
  650. package/.next/server/chunks/[root-of-the-server]__0ef15nv._.js +0 -3
  651. package/.next/server/chunks/[root-of-the-server]__0ef15nv._.js.map +0 -1
  652. package/.next/server/chunks/[root-of-the-server]__0fk~j-f._.js +0 -3
  653. package/.next/server/chunks/[root-of-the-server]__0jd4sw5._.js +0 -3
  654. package/.next/server/chunks/[root-of-the-server]__0jd4sw5._.js.map +0 -1
  655. package/.next/server/chunks/[root-of-the-server]__0kp05ch._.js +0 -3
  656. package/.next/server/chunks/[root-of-the-server]__0kp05ch._.js.map +0 -1
  657. package/.next/server/chunks/[root-of-the-server]__0ncl1y5._.js +0 -3
  658. package/.next/server/chunks/[root-of-the-server]__0p77uu0._.js +0 -3
  659. package/.next/server/chunks/[root-of-the-server]__0q5wxvv._.js +0 -3
  660. package/.next/server/chunks/[root-of-the-server]__0q5wxvv._.js.map +0 -1
  661. package/.next/server/chunks/[root-of-the-server]__0q9lm4b._.js +0 -3
  662. package/.next/server/chunks/[root-of-the-server]__0q9lm4b._.js.map +0 -1
  663. package/.next/server/chunks/[root-of-the-server]__0qygdtt._.js +0 -20
  664. package/.next/server/chunks/[root-of-the-server]__0qygdtt._.js.map +0 -1
  665. package/.next/server/chunks/[root-of-the-server]__0r.6ku0._.js +0 -3
  666. package/.next/server/chunks/[root-of-the-server]__0r9rxeu._.js +0 -3
  667. package/.next/server/chunks/[root-of-the-server]__0r9rxeu._.js.map +0 -1
  668. package/.next/server/chunks/[root-of-the-server]__0sk08ba._.js +0 -3
  669. package/.next/server/chunks/[root-of-the-server]__0sk08ba._.js.map +0 -1
  670. package/.next/server/chunks/[root-of-the-server]__0t-zv8i._.js +0 -3
  671. package/.next/server/chunks/[root-of-the-server]__0ucvqha._.js +0 -3
  672. package/.next/server/chunks/[root-of-the-server]__0ucvqha._.js.map +0 -1
  673. package/.next/server/chunks/[root-of-the-server]__0wrd5yg._.js +0 -3
  674. package/.next/server/chunks/[root-of-the-server]__0wrd5yg._.js.map +0 -1
  675. package/.next/server/chunks/[root-of-the-server]__0xyksgx._.js +0 -3
  676. package/.next/server/chunks/[root-of-the-server]__0xyksgx._.js.map +0 -1
  677. package/.next/server/chunks/[root-of-the-server]__0zy55xw._.js +0 -3
  678. package/.next/server/chunks/[root-of-the-server]__0zy55xw._.js.map +0 -1
  679. package/.next/server/chunks/[root-of-the-server]__0~7jz1t._.js +0 -3
  680. package/.next/server/chunks/[root-of-the-server]__0~7jz1t._.js.map +0 -1
  681. package/.next/server/chunks/[root-of-the-server]__117_h7d._.js +0 -3
  682. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_auth_login_route_actions_0p0o8hb.js +0 -3
  683. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_auth_v3_route_actions_0gygcdb.js +0 -3
  684. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_auth_route_actions_0qldbc..js +0 -3
  685. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_events_route_actions_0dif~y4.js +0 -3
  686. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_health_route_actions_006d2v..js +0 -3
  687. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_inbox_route_actions_0hzbelp.js +0 -3
  688. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_nodes_route_actions_0.v335w.js +0 -3
  689. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_send_route_actions_0-c6c80.js +0 -3
  690. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_stats_route_actions_10r2dnb.js +0 -3
  691. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_status_route_actions_029-bam.js +0 -3
  692. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_tasks_route_actions_03j_ebz.js +0 -3
  693. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_tmux_route_actions_0w~1rqo.js +0 -3
  694. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_tokens_route_actions_0u1pfzb.js +0 -3
  695. package/.next/server/chunks/p248-dash-release__next-internal_server_app_api_hub_upload_route_actions_0n4mpaq.js +0 -3
  696. package/.next/server/chunks/p248-dash-release__next-internal_server_app_favicon_ico_route_actions_0upntbn.js +0 -3
  697. package/.next/server/chunks/ssr/0ctr__next-internal_server_app_settings_networks_page_actions_0722nti.js +0 -3
  698. package/.next/server/chunks/ssr/0eys_0.9fypy._.js +0 -3
  699. package/.next/server/chunks/ssr/0eys_0.9fypy._.js.map +0 -1
  700. package/.next/server/chunks/ssr/0eys_0cilv2n._.js +0 -3
  701. package/.next/server/chunks/ssr/0eys_0cilv2n._.js.map +0 -1
  702. package/.next/server/chunks/ssr/0eys_0o_uhv8._.js +0 -33
  703. package/.next/server/chunks/ssr/0eys_0o_uhv8._.js.map +0 -1
  704. package/.next/server/chunks/ssr/0eys_0v03z7d._.js +0 -3
  705. package/.next/server/chunks/ssr/0eys_0v03z7d._.js.map +0 -1
  706. package/.next/server/chunks/ssr/0eys_next_0_~e226._.js.map +0 -1
  707. package/.next/server/chunks/ssr/0eys_next_dist_0temmfx._.js +0 -6
  708. package/.next/server/chunks/ssr/0eys_next_dist_0temmfx._.js.map +0 -1
  709. package/.next/server/chunks/ssr/0eys_next_dist_client_components_0j3h5if._.js +0 -3
  710. package/.next/server/chunks/ssr/0eys_next_dist_client_components_0j3h5if._.js.map +0 -1
  711. package/.next/server/chunks/ssr/0eys_next_dist_client_components_builtin_forbidden_0h3lxo-.js +0 -3
  712. package/.next/server/chunks/ssr/0eys_next_dist_client_components_builtin_forbidden_0h3lxo-.js.map +0 -1
  713. package/.next/server/chunks/ssr/0eys_next_dist_client_components_builtin_global-error_05on~t..js +0 -3
  714. package/.next/server/chunks/ssr/0eys_next_dist_client_components_builtin_global-error_05on~t..js.map +0 -1
  715. package/.next/server/chunks/ssr/0eys_next_dist_client_components_builtin_unauthorized_0jjp4gf.js +0 -3
  716. package/.next/server/chunks/ssr/0eys_next_dist_client_components_builtin_unauthorized_0jjp4gf.js.map +0 -1
  717. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0-rhsex.js +0 -4
  718. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0-rhsex.js.map +0 -1
  719. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_038w~o4.js.map +0 -1
  720. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_097i4vb.js.map +0 -1
  721. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0fy2_ot.js.map +0 -1
  722. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0g0ea16.js.map +0 -1
  723. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0gg19s6.js.map +0 -1
  724. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0ikgf-7.js.map +0 -1
  725. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0otan.0.js.map +0 -1
  726. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0q4gvif.js.map +0 -1
  727. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0s.as54.js.map +0 -1
  728. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0t88_uc.js.map +0 -1
  729. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0unqv4v.js.map +0 -1
  730. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0vrz6hg.js +0 -4
  731. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0vrz6hg.js.map +0 -1
  732. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0xb3.u..js +0 -4
  733. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0xb3.u..js.map +0 -1
  734. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_0xry76m.js.map +0 -1
  735. package/.next/server/chunks/ssr/0eys_next_dist_esm_build_templates_app-page_10~-.q1.js.map +0 -1
  736. package/.next/server/chunks/ssr/[root-of-the-server]__0.bq9qd._.js.map +0 -1
  737. package/.next/server/chunks/ssr/[root-of-the-server]__0.p4.9p._.js +0 -3
  738. package/.next/server/chunks/ssr/[root-of-the-server]__0.p4.9p._.js.map +0 -1
  739. package/.next/server/chunks/ssr/[root-of-the-server]__02e2~_p._.js +0 -3
  740. package/.next/server/chunks/ssr/[root-of-the-server]__02e2~_p._.js.map +0 -1
  741. package/.next/server/chunks/ssr/[root-of-the-server]__07iv~-v._.js +0 -3
  742. package/.next/server/chunks/ssr/[root-of-the-server]__07iv~-v._.js.map +0 -1
  743. package/.next/server/chunks/ssr/[root-of-the-server]__08c1l7e._.js +0 -3
  744. package/.next/server/chunks/ssr/[root-of-the-server]__08c1l7e._.js.map +0 -1
  745. package/.next/server/chunks/ssr/[root-of-the-server]__09tg-yx._.js +0 -3
  746. package/.next/server/chunks/ssr/[root-of-the-server]__09tg-yx._.js.map +0 -1
  747. package/.next/server/chunks/ssr/[root-of-the-server]__09wz11l._.js +0 -19
  748. package/.next/server/chunks/ssr/[root-of-the-server]__09wz11l._.js.map +0 -1
  749. package/.next/server/chunks/ssr/[root-of-the-server]__0c0po7z._.js +0 -3
  750. package/.next/server/chunks/ssr/[root-of-the-server]__0c0po7z._.js.map +0 -1
  751. package/.next/server/chunks/ssr/[root-of-the-server]__0c~slby._.js +0 -3
  752. package/.next/server/chunks/ssr/[root-of-the-server]__0c~slby._.js.map +0 -1
  753. package/.next/server/chunks/ssr/[root-of-the-server]__0dhdbz9._.js +0 -3
  754. package/.next/server/chunks/ssr/[root-of-the-server]__0dhdbz9._.js.map +0 -1
  755. package/.next/server/chunks/ssr/[root-of-the-server]__0j_fyz7._.js +0 -33
  756. package/.next/server/chunks/ssr/[root-of-the-server]__0j_fyz7._.js.map +0 -1
  757. package/.next/server/chunks/ssr/[root-of-the-server]__0jsgoje._.js +0 -33
  758. package/.next/server/chunks/ssr/[root-of-the-server]__0jsgoje._.js.map +0 -1
  759. package/.next/server/chunks/ssr/[root-of-the-server]__0k2x-ou._.js +0 -3
  760. package/.next/server/chunks/ssr/[root-of-the-server]__0k2x-ou._.js.map +0 -1
  761. package/.next/server/chunks/ssr/[root-of-the-server]__0mwy~nq._.js +0 -3
  762. package/.next/server/chunks/ssr/[root-of-the-server]__0mwy~nq._.js.map +0 -1
  763. package/.next/server/chunks/ssr/[root-of-the-server]__0ni6cq0._.js +0 -3
  764. package/.next/server/chunks/ssr/[root-of-the-server]__0ni6cq0._.js.map +0 -1
  765. package/.next/server/chunks/ssr/[root-of-the-server]__0ny5rkb._.js +0 -8
  766. package/.next/server/chunks/ssr/[root-of-the-server]__0ny5rkb._.js.map +0 -1
  767. package/.next/server/chunks/ssr/[root-of-the-server]__0oj.su5._.js +0 -3
  768. package/.next/server/chunks/ssr/[root-of-the-server]__0oj.su5._.js.map +0 -1
  769. package/.next/server/chunks/ssr/[root-of-the-server]__0q0h5.4._.js +0 -3
  770. package/.next/server/chunks/ssr/[root-of-the-server]__0q0h5.4._.js.map +0 -1
  771. package/.next/server/chunks/ssr/[root-of-the-server]__0se0pbf._.js +0 -3
  772. package/.next/server/chunks/ssr/[root-of-the-server]__0se0pbf._.js.map +0 -1
  773. package/.next/server/chunks/ssr/[root-of-the-server]__0tb8onm._.js +0 -3
  774. package/.next/server/chunks/ssr/[root-of-the-server]__0tb8onm._.js.map +0 -1
  775. package/.next/server/chunks/ssr/[root-of-the-server]__0wm_kxh._.js +0 -3
  776. package/.next/server/chunks/ssr/[root-of-the-server]__0wm_kxh._.js.map +0 -1
  777. package/.next/server/chunks/ssr/[root-of-the-server]__0wt_.5g._.js +0 -3
  778. package/.next/server/chunks/ssr/[root-of-the-server]__0wt_.5g._.js.map +0 -1
  779. package/.next/server/chunks/ssr/[root-of-the-server]__0xmwsru._.js +0 -3
  780. package/.next/server/chunks/ssr/[root-of-the-server]__0xmwsru._.js.map +0 -1
  781. package/.next/server/chunks/ssr/[root-of-the-server]__0xsrxaq._.js +0 -6
  782. package/.next/server/chunks/ssr/[root-of-the-server]__0z12w52._.js +0 -3
  783. package/.next/server/chunks/ssr/[root-of-the-server]__0z12w52._.js.map +0 -1
  784. package/.next/server/chunks/ssr/p248-dash-release_03jozqe._.js.map +0 -1
  785. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app__global-error_page_actions_0-_psx0.js +0 -3
  786. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app__not-found_page_actions_0ab90fb.js +0 -3
  787. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_admin_page_actions_0-3dd6g.js +0 -3
  788. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_login_page_actions_0cxgr5r.js +0 -3
  789. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_logs_page_actions_13ncn5w.js +0 -3
  790. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_messages_page_actions_03eny7a.js +0 -3
  791. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_node_page_actions_01g~v8e.js +0 -3
  792. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_nodes_page_actions_0rp9d.z.js +0 -3
  793. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_page_actions_12.zc2x.js +0 -3
  794. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_server-logs_page_actions_12.~xmh.js +0 -3
  795. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_servers_page_actions_01fbube.js +0 -3
  796. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_settings_page_actions_049o_zl.js +0 -3
  797. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_settings_tokens_page_actions_0kwlo85.js +0 -3
  798. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_tasks_[id]_page_actions_0gaayz2.js +0 -3
  799. package/.next/server/chunks/ssr/p248-dash-release__next-internal_server_app_tasks_page_actions_05-6rq9.js +0 -3
  800. package/.next/server/chunks/ssr/p248-dash-release_app_0.xbj-j._.js.map +0 -1
  801. package/.next/server/chunks/ssr/p248-dash-release_app_01r5cp-._.js.map +0 -1
  802. package/.next/server/chunks/ssr/p248-dash-release_app_0415ugh._.js.map +0 -1
  803. package/.next/server/chunks/ssr/p248-dash-release_app_07ks..b._.js.map +0 -1
  804. package/.next/server/chunks/ssr/p248-dash-release_app_08-_z~z._.js +0 -3
  805. package/.next/server/chunks/ssr/p248-dash-release_app_08-_z~z._.js.map +0 -1
  806. package/.next/server/chunks/ssr/p248-dash-release_app_0heiqx4._.js.map +0 -1
  807. package/.next/server/chunks/ssr/p248-dash-release_app_0ict6f_._.js.map +0 -1
  808. package/.next/server/chunks/ssr/p248-dash-release_app_0m1nag5._.js +0 -3
  809. package/.next/server/chunks/ssr/p248-dash-release_app_0m1nag5._.js.map +0 -1
  810. package/.next/server/chunks/ssr/p248-dash-release_app_0me0gyz._.js +0 -3
  811. package/.next/server/chunks/ssr/p248-dash-release_app_0me0gyz._.js.map +0 -1
  812. package/.next/server/chunks/ssr/p248-dash-release_app_0r.6wo3._.js.map +0 -1
  813. package/.next/server/chunks/ssr/p248-dash-release_app_components_0l8tz~8._.js.map +0 -1
  814. package/.next/server/chunks/ssr/p248-dash-release_app_servers_page_tsx_0gjg_-r._.js.map +0 -1
  815. package/.next/server/chunks/ssr/p248-dash-release_app_tasks_page_tsx_0qdyj8l._.js.map +0 -1
  816. package/.next/static/chunks/0-.8ljnci668r.js +0 -4
  817. package/.next/static/chunks/0-wn37qh25iv8.js +0 -4
  818. package/.next/static/chunks/01rl0zgit9fpi.js +0 -1
  819. package/.next/static/chunks/03hid7at2hts9.js +0 -1
  820. package/.next/static/chunks/04z~zcny7e-hu.js +0 -1
  821. package/.next/static/chunks/097dcrj-frket.js +0 -1
  822. package/.next/static/chunks/0_b1~xhhddi_..js +0 -2
  823. package/.next/static/chunks/0cip10~ax7ih8.js +0 -1
  824. package/.next/static/chunks/0fgpa9eurf21a.js +0 -4
  825. package/.next/static/chunks/0fjr78ak.7m7k.js +0 -1
  826. package/.next/static/chunks/0hy~u-wxdvw2u.js +0 -1
  827. package/.next/static/chunks/0i_zf1gx2iz9e.js +0 -1
  828. package/.next/static/chunks/0kgcx1x2p~.3f.js +0 -31
  829. package/.next/static/chunks/0my4koa~eoc3m.js +0 -1
  830. package/.next/static/chunks/0oa_op0qrdcyz.js +0 -1
  831. package/.next/static/chunks/0po5q8_1xmof_.js +0 -1
  832. package/.next/static/chunks/0t_ctpqz4qkkt.css +0 -1
  833. package/.next/static/chunks/105_kfixakoke.js +0 -7
  834. package/.next/static/chunks/137i49j2u~mpw.js +0 -1
  835. package/.next/static/chunks/1529ngs_24ts..js +0 -1
  836. package/.next/static/chunks/turbopack-0yv4qlj-3gvbg.js +0 -1
  837. package/bun.lock +0 -1663
  838. /package/.next/build/chunks/{[root-of-the-server]__02~~60i._.js.map → [root-of-the-server]__0z.4hvh._.js.map} +0 -0
  839. /package/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_0f_tr7e._.js.map → [turbopack-node]_transforms_postcss_ts_0ji7sn2._.js.map} +0 -0
  840. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_anet_config_route_actions_0vfnpq~.js.map → 0eys__next-internal_server_app_api_anet_node-config_route_actions_0vpbqmt.js.map} +0 -0
  841. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_auth_logout_route_actions_0mnkdb1.js.map → 0eys__next-internal_server_app_api_anet_node-create_route_actions_0ack5_x.js.map} +0 -0
  842. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_audit-log_route_actions_01da9km.js.map → 0eys__next-internal_server_app_api_anet_node-lifecycle_route_actions_13z6pk9.js.map} +0 -0
  843. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_broadcast_route_actions_0-mzp~m.js.map → 0eys__next-internal_server_app_api_hub_server-logs_route_actions_13k0lzq.js.map} +0 -0
  844. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_messages_route_actions_0yqdey-.js.map → 0eys__next-internal_server_app_api_hub_task-events_route_actions_0eayccx.js.map} +0 -0
  845. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_networks_route_actions_08zwxgz.js.map → 0eys__next-internal_server_app_manifest_webmanifest_route_actions_03s5neg.js.map} +0 -0
  846. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_register_route_actions_059ib7..js.map → 0raa_next-internal_server_app_api_hub_server_[hostname]_agents_route_actions_0q9dcjz.js.map} +0 -0
  847. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_server-logs_route_actions_0.lpvmu.js.map → 0raa_next-internal_server_app_api_hub_server_[hostname]_health_route_actions_0s8k6m..js.map} +0 -0
  848. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_servers_route_actions_0n9er6w.js.map → dash-main-prep__next-internal_server_app_api_anet_config_route_actions_0eb-2a9.js.map} +0 -0
  849. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_session_route_actions_0clahzh.js.map → dash-main-prep__next-internal_server_app_api_auth_login_route_actions_0_0zk8~.js.map} +0 -0
  850. /package/.next/server/chunks/{0ctr__next-internal_server_app_api_hub_task-events_route_actions_0eupv~7.js.map → dash-main-prep__next-internal_server_app_api_auth_logout_route_actions_0yy6u4n.js.map} +0 -0
  851. /package/.next/server/chunks/{0ctr__next-internal_server_app_manifest_webmanifest_route_actions_0zwabxo.js.map → dash-main-prep__next-internal_server_app_api_auth_v3_route_actions_09dg3rk.js.map} +0 -0
  852. /package/.next/server/chunks/{0n8__next-internal_server_app_api_hub_server_[hostname]_agents_route_actions_0td~w-3.js.map → dash-main-prep__next-internal_server_app_api_hub_audit-log_route_actions_03wia4o.js.map} +0 -0
  853. /package/.next/server/chunks/{0n8__next-internal_server_app_api_hub_server_[hostname]_health_route_actions_0-cx2k4.js.map → dash-main-prep__next-internal_server_app_api_hub_auth_route_actions_0k.l0a-.js.map} +0 -0
  854. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_auth_login_route_actions_0p0o8hb.js.map → dash-main-prep__next-internal_server_app_api_hub_broadcast_route_actions_02wotps.js.map} +0 -0
  855. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_auth_v3_route_actions_0gygcdb.js.map → dash-main-prep__next-internal_server_app_api_hub_events_route_actions_0i1zyq~.js.map} +0 -0
  856. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_auth_route_actions_0qldbc..js.map → dash-main-prep__next-internal_server_app_api_hub_health_route_actions_0fe6lsz.js.map} +0 -0
  857. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_events_route_actions_0dif~y4.js.map → dash-main-prep__next-internal_server_app_api_hub_inbox_route_actions_0iup.xe.js.map} +0 -0
  858. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_health_route_actions_006d2v..js.map → dash-main-prep__next-internal_server_app_api_hub_messages_route_actions_0syf65m.js.map} +0 -0
  859. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_inbox_route_actions_0hzbelp.js.map → dash-main-prep__next-internal_server_app_api_hub_networks_route_actions_04dtp_m.js.map} +0 -0
  860. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_nodes_route_actions_0.v335w.js.map → dash-main-prep__next-internal_server_app_api_hub_nodes_route_actions_0aghuq9.js.map} +0 -0
  861. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_send_route_actions_0-c6c80.js.map → dash-main-prep__next-internal_server_app_api_hub_register_route_actions_04g3.gx.js.map} +0 -0
  862. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_stats_route_actions_10r2dnb.js.map → dash-main-prep__next-internal_server_app_api_hub_send_route_actions_01m4__p.js.map} +0 -0
  863. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_status_route_actions_029-bam.js.map → dash-main-prep__next-internal_server_app_api_hub_servers_route_actions_10lz59w.js.map} +0 -0
  864. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_tasks_route_actions_03j_ebz.js.map → dash-main-prep__next-internal_server_app_api_hub_session_route_actions_03ce57x.js.map} +0 -0
  865. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_tmux_route_actions_0w~1rqo.js.map → dash-main-prep__next-internal_server_app_api_hub_stats_route_actions_0~xcq1-.js.map} +0 -0
  866. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_tokens_route_actions_0u1pfzb.js.map → dash-main-prep__next-internal_server_app_api_hub_status_route_actions_0slss8r.js.map} +0 -0
  867. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_api_hub_upload_route_actions_0n4mpaq.js.map → dash-main-prep__next-internal_server_app_api_hub_tasks_route_actions_0yvhaa_.js.map} +0 -0
  868. /package/.next/server/chunks/{p248-dash-release__next-internal_server_app_favicon_ico_route_actions_0upntbn.js.map → dash-main-prep__next-internal_server_app_api_hub_tmux_route_actions_0_f8h.h.js.map} +0 -0
  869. /package/.next/server/chunks/{ssr/0ctr__next-internal_server_app_settings_networks_page_actions_0722nti.js.map → dash-main-prep__next-internal_server_app_api_hub_tokens_route_actions_0ke~8y8.js.map} +0 -0
  870. /package/.next/server/chunks/{ssr/p248-dash-release__next-internal_server_app__global-error_page_actions_0-_psx0.js.map → dash-main-prep__next-internal_server_app_api_hub_upload_route_actions_02jnx8r.js.map} +0 -0
  871. /package/.next/server/chunks/{ssr/p248-dash-release__next-internal_server_app__not-found_page_actions_0ab90fb.js.map → dash-main-prep__next-internal_server_app_favicon_ico_route_actions_09bgfok.js.map} +0 -0
  872. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_admin_page_actions_0-3dd6g.js.map → dash-main-prep__next-internal_server_app__global-error_page_actions_07kk3nm.js.map} +0 -0
  873. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_login_page_actions_0cxgr5r.js.map → dash-main-prep__next-internal_server_app__not-found_page_actions_0cb6n8e.js.map} +0 -0
  874. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_logs_page_actions_13ncn5w.js.map → dash-main-prep__next-internal_server_app_admin_page_actions_0whq~om.js.map} +0 -0
  875. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_messages_page_actions_03eny7a.js.map → dash-main-prep__next-internal_server_app_login_page_actions_0lfb5vh.js.map} +0 -0
  876. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_node_page_actions_01g~v8e.js.map → dash-main-prep__next-internal_server_app_logs_page_actions_0a9g2gh.js.map} +0 -0
  877. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_nodes_page_actions_0rp9d.z.js.map → dash-main-prep__next-internal_server_app_messages_page_actions_0_0a~oj.js.map} +0 -0
  878. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_page_actions_12.zc2x.js.map → dash-main-prep__next-internal_server_app_node_page_actions_0nt83da.js.map} +0 -0
  879. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_server-logs_page_actions_12.~xmh.js.map → dash-main-prep__next-internal_server_app_nodes_page_actions_001898j.js.map} +0 -0
  880. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_servers_page_actions_01fbube.js.map → dash-main-prep__next-internal_server_app_page_actions_10t6_cb.js.map} +0 -0
  881. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_settings_page_actions_049o_zl.js.map → dash-main-prep__next-internal_server_app_server-logs_page_actions_10i2y0v.js.map} +0 -0
  882. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_settings_tokens_page_actions_0kwlo85.js.map → dash-main-prep__next-internal_server_app_servers_page_actions_0yfsnrz.js.map} +0 -0
  883. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_tasks_[id]_page_actions_0gaayz2.js.map → dash-main-prep__next-internal_server_app_settings_networks_page_actions_0.6z6e9.js.map} +0 -0
  884. /package/.next/server/chunks/ssr/{p248-dash-release__next-internal_server_app_tasks_page_actions_05-6rq9.js.map → dash-main-prep__next-internal_server_app_settings_page_actions_0t_etc1.js.map} +0 -0
  885. /package/.next/static/{88n5t5Pxmw08hbmLba3jI → aIXvzZuknEQ-phwB09c_j}/_buildManifest.js +0 -0
  886. /package/.next/static/{88n5t5Pxmw08hbmLba3jI → aIXvzZuknEQ-phwB09c_j}/_clientMiddlewareManifest.js +0 -0
  887. /package/.next/static/{88n5t5Pxmw08hbmLba3jI → aIXvzZuknEQ-phwB09c_j}/_ssgManifest.js +0 -0
@@ -0,0 +1,695 @@
1
+ 'use client';
2
+
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { Session } from './types';
5
+ import { AliasAvatar } from './AliasAvatar';
6
+
7
+ /**
8
+ * Per-node settings panel (issue #260 → v0.11 flagship #262, Vincent tg
9
+ * 2026-06-24, "must actually work").
10
+ *
11
+ * STATUS (F1/F2/F3, 通信龙 review round 2):
12
+ * - **Wired (real)**: B Runtime·模型 model select + C 运行模式 flags
13
+ * (permissionMode / dangerouslySkipPermissions / teammateMode / maxTurns /
14
+ * budget / timeout). Controlled form state, loaded on mount from
15
+ * `GET /api/anet/node-config` and persisted via `POST`. The six flags +
16
+ * model are the editable contract 通信龙 specified.
17
+ * - **F3 apply lifecycle**: after Save the panel runs a take-effect state
18
+ * machine — saving → applying (node restarting) → applied | rejected |
19
+ * timeout — polling `GET ?apply_id` for real backends and showing a colored
20
+ * status strip ("toast") for the outcome.
21
+ * - **Still P2 stub (disabled)**: A 接入 Channel (display-only) and D 运维
22
+ * ops buttons (no-op), each with its own local "暂未接后端" note.
23
+ *
24
+ * ⚠️ The hub-side tool is not deployed yet (工程马 WIP): the route mock-falls
25
+ * back with `mock: true` + `status: pending`, so the lifecycle is *simulated*
26
+ * on local timers and the UI says so ("模拟 · 后端未接入") rather than claiming a
27
+ * node actually restarted. Runtime + imageCapable stay read-only (auto-derived).
28
+ * Field names mirror anet's real config.json.
29
+ */
30
+
31
+ // B. Runtime → selectable model presets (from anet VENDORS, bin/cli.ts).
32
+ // Runtime itself is read-only this round; only the model is editable.
33
+ const RUNTIME_MODELS: Record<string, string[]> = {
34
+ 'claude-agent-sdk': ['deepseek-v4-pro', 'MiniMax-M3', 'MiniMax-M2.7', 'claude-sonnet-4-6', 'claude-opus-4-x', 'intern', 'mimo'],
35
+ 'claude-code-cli': ['(由 CLI 管理)'],
36
+ 'codex-sdk': ['gpt-5.5'],
37
+ 'grok-build-acp': ['grok-build'],
38
+ };
39
+
40
+ // C. config.flags contract (per 通信龙). permissionMode is a select; two
41
+ // booleans; three numeric bounds. These six are the entire editable flag set.
42
+ const PERMISSION_MODES = ['auto', 'default', 'bypassPermissions'];
43
+
44
+ // A. Channel display (P2 — read-only this round). `roadmap` = greyed "即将支持".
45
+ const CHANNELS: { key: string; label: string; roadmap?: boolean; fields: { label: string; value?: string }[] }[] = [
46
+ {
47
+ key: 'telegram', label: 'Telegram',
48
+ fields: [
49
+ { label: 'Bot Token', value: '••••••••••••' },
50
+ { label: '允许的 chat id (allowFrom)', value: '—' },
51
+ { label: '状态目录', value: '~/.anet/channels/telegram' },
52
+ ],
53
+ },
54
+ {
55
+ key: 'feishu', label: '飞书 Feishu',
56
+ fields: [
57
+ { label: 'App ID', value: 'cli_••••••' },
58
+ { label: 'App Secret', value: '••••••••••••' },
59
+ { label: '允许的 open_id (allowFrom)', value: '—' },
60
+ { label: '允许的群 chat_id (allowChats)', value: '—' },
61
+ { label: '群触发策略', value: 'mention' },
62
+ ],
63
+ },
64
+ {
65
+ key: 'commhub', label: 'CommHub',
66
+ fields: [
67
+ { label: 'Hub 地址', value: '<hub-address>' },
68
+ { label: '节点 token(自动)', value: '••••••••' },
69
+ ],
70
+ },
71
+ { key: 'wechat', label: 'WeChat', roadmap: true, fields: [] },
72
+ ];
73
+
74
+ // D. Node ops — still P2 no-op stubs this round. `danger` = destructive styling.
75
+
76
+ // Editable flag form shape. Numeric fields are kept as strings for controlled
77
+ // inputs and coerced (or dropped when blank) at save time.
78
+ type FlagsForm = {
79
+ permissionMode: string;
80
+ dangerouslySkipPermissions: boolean;
81
+ teammateMode: boolean;
82
+ maxTurns: string;
83
+ budget: string;
84
+ timeout: string;
85
+ };
86
+
87
+ const DEFAULT_FLAGS: FlagsForm = {
88
+ permissionMode: 'default',
89
+ dangerouslySkipPermissions: false,
90
+ teammateMode: false,
91
+ maxTurns: '',
92
+ budget: '',
93
+ timeout: '',
94
+ };
95
+
96
+ // F3 apply lifecycle. A save flows:
97
+ // idle → saving (POST in flight) → applying (config dispatched, node
98
+ // restarting / taking effect) → applied | rejected | timeout.
99
+ // `error` = the save POST itself failed. The `mock` flag flavours the terminal
100
+ // copy when the hub tool isn't deployed (the lifecycle is then simulated on
101
+ // local timers rather than polled).
102
+ type ApplyPhase = 'idle' | 'saving' | 'applying' | 'applied' | 'rejected' | 'timeout' | 'error';
103
+
104
+ // Real-backend apply-status poll cadence + ceiling. The mock path uses its own
105
+ // short timers instead of polling (the route would only ever return pending).
106
+ const APPLY_POLL_MS = 1500;
107
+ const APPLY_TIMEOUT_MS = 30000;
108
+ // Simulated mock progression delay (dispatched → applied).
109
+ const MOCK_APPLY_MS = 1400;
110
+ // Auto-dismiss the success strip after this long.
111
+ const SUCCESS_DISMISS_MS = 4000;
112
+ // Per-request ceiling so a hung hub proxy can't freeze the lifecycle — every
113
+ // POST/poll fetch is aborted past this (通信牛 review #11 blocker 2).
114
+ const FETCH_TIMEOUT_MS = 8000;
115
+
116
+ function isAbort(e: unknown): boolean {
117
+ return e instanceof DOMException && e.name === 'AbortError';
118
+ }
119
+
120
+ /** fetch + json with a hard AbortController timeout. Rejects (AbortError) if it
121
+ * doesn't resolve in `timeoutMs` — callers treat that as transient/abort. */
122
+ async function fetchJson(url: string, init: RequestInit, timeoutMs: number): Promise<{ res: Response; data: Record<string, unknown> }> {
123
+ const ctrl = new AbortController();
124
+ const to = setTimeout(() => ctrl.abort(), timeoutMs);
125
+ try {
126
+ const res = await fetch(url, { ...init, signal: ctrl.signal });
127
+ const data = (await res.json().catch(() => ({}))) as Record<string, unknown>;
128
+ return { res, data };
129
+ } finally {
130
+ clearTimeout(to);
131
+ }
132
+ }
133
+
134
+ function channelSet(channels: Session['channels']): Set<string> {
135
+ if (!channels) return new Set();
136
+ const list = Array.isArray(channels) ? channels : String(channels).split(/[,\s]+/);
137
+ return new Set(list.map(c => c.trim().toLowerCase()).filter(Boolean));
138
+ }
139
+
140
+ /** Coerce a snapshot flag value into the string form fields expect. */
141
+ function numStr(v: unknown): string {
142
+ return v === undefined || v === null || v === '' ? '' : String(v);
143
+ }
144
+
145
+ /** Section heading. */
146
+ function SectionTitle({ children }: { children: React.ReactNode }) {
147
+ return <h3 className="text-[11px] font-medium uppercase tracking-wide text-gray-500 mb-2">{children}</h3>;
148
+ }
149
+
150
+ /** Read-only label/value row. */
151
+ function InfoRow({ label, value }: { label: string; value: string }) {
152
+ return (
153
+ <div className="flex items-center justify-between gap-3 px-3 py-1.5 text-[12px]">
154
+ <span className="text-gray-500 shrink-0">{label}</span>
155
+ <span className="text-gray-300 truncate font-mono text-[11px]" title={value}>{value}</span>
156
+ </div>
157
+ );
158
+ }
159
+
160
+ /** Disabled text field (P2 channel display). */
161
+ function StubField({ label, value }: { label: string; value?: string }) {
162
+ return (
163
+ <label className="block">
164
+ <span className="text-[11px] text-gray-500">{label}</span>
165
+ <input
166
+ type="text" disabled readOnly value={value ?? ''} placeholder="未配置"
167
+ className="mt-0.5 w-full rounded-md border border-[#26262b] bg-[#0e0e10] px-2.5 py-1.5 text-[12px] text-gray-300 cursor-not-allowed disabled:opacity-100"
168
+ />
169
+ </label>
170
+ );
171
+ }
172
+
173
+ /** Live controlled toggle. */
174
+ function Toggle({ label, checked, onChange, disabled }: { label: string; checked: boolean; onChange: (v: boolean) => void; disabled?: boolean }) {
175
+ return (
176
+ <button
177
+ type="button"
178
+ role="switch"
179
+ aria-checked={checked}
180
+ disabled={disabled}
181
+ onClick={() => onChange(!checked)}
182
+ className={`flex w-full items-center justify-between rounded-lg border border-[#26262b] bg-[#161618] px-3 py-2 text-sm text-gray-300 transition-colors ${disabled ? 'cursor-not-allowed opacity-60' : 'hover:bg-[#1c1c1f]'}`}
183
+ >
184
+ <span className="text-left pr-3">{label}</span>
185
+ <span className={`relative inline-block h-5 w-9 shrink-0 rounded-full transition-colors ${checked ? 'bg-cyan-600' : 'bg-[#2a2a30]'}`}>
186
+ <span className={`absolute top-0.5 h-4 w-4 rounded-full bg-white transition-all ${checked ? 'left-[18px]' : 'left-0.5'}`} />
187
+ </span>
188
+ </button>
189
+ );
190
+ }
191
+
192
+ /** Live controlled select. */
193
+ function Select({ label, value, options, onChange }: { label: string; value: string; options: string[]; onChange: (v: string) => void }) {
194
+ return (
195
+ <label className="block">
196
+ <span className="text-[11px] text-gray-500">{label}</span>
197
+ <select
198
+ value={value}
199
+ onChange={e => onChange(e.target.value)}
200
+ className="mt-0.5 w-full appearance-none rounded-md border border-[#26262b] bg-[#161618] px-2.5 py-1.5 text-[12px] text-gray-200 hover:border-[#3a3a42] focus:border-cyan-600 focus:outline-none"
201
+ >
202
+ {options.map(o => <option key={o} value={o}>{o}</option>)}
203
+ </select>
204
+ </label>
205
+ );
206
+ }
207
+
208
+ /** Live controlled numeric field (kept as string; coerced at save). */
209
+ function NumberField({ label, value, onChange, placeholder }: { label: string; value: string; onChange: (v: string) => void; placeholder?: string }) {
210
+ return (
211
+ <label className="block">
212
+ <span className="text-[11px] text-gray-500">{label}</span>
213
+ <input
214
+ type="number"
215
+ inputMode="numeric"
216
+ value={value}
217
+ placeholder={placeholder ?? '默认'}
218
+ onChange={e => onChange(e.target.value)}
219
+ className="mt-0.5 w-full rounded-md border border-[#26262b] bg-[#0e0e10] px-2.5 py-1.5 text-[12px] text-gray-200 focus:border-cyan-600 focus:outline-none"
220
+ />
221
+ </label>
222
+ );
223
+ }
224
+
225
+ export function NodeSettingsPanel({ session: s, onClose }: { session: Session; onClose: () => void }) {
226
+ const active = channelSet(s.channels);
227
+ const runtime = s.runtime || '—';
228
+ const initialModel = s.model || s.agent || '';
229
+ // imageCapable: read-only, auto from model (MiniMax-M3 / Claude = yes).
230
+ const imageCapable = /minimax-m3|claude/i.test(initialModel);
231
+ // Model options for this runtime; always include the current value so a
232
+ // server-set model outside the preset list stays selectable.
233
+ const presetModels = RUNTIME_MODELS[runtime] || [];
234
+ const modelOptions = Array.from(new Set([initialModel, ...presetModels].filter(Boolean)));
235
+
236
+ const nodeKey = s.node_id || s.alias;
237
+
238
+ // ---- Editable form state (B model + C flags) ----
239
+ const [model, setModel] = useState(initialModel);
240
+ const [flags, setFlags] = useState<FlagsForm>(DEFAULT_FLAGS);
241
+ const [dirty, setDirty] = useState(false);
242
+ const [loading, setLoading] = useState(true);
243
+ // ---- F3 apply lifecycle ----
244
+ const [phase, setPhase] = useState<ApplyPhase>('idle');
245
+ const [phaseMsg, setPhaseMsg] = useState('');
246
+ const [phaseMock, setPhaseMock] = useState(false);
247
+ // ---- M1 node lifecycle actions (restart wired to RFC-024 restart_node;
248
+ // rename/stop/delete gated on backend → shown as 即将支持). Self-contained,
249
+ // independent of the config apply lifecycle above.
250
+ const [lcBusy, setLcBusy] = useState(false);
251
+ const [lcResult, setLcResult] = useState<{ tone: 'info' | 'ok' | 'warn' | 'err'; text: string } | null>(null);
252
+ // Outstanding lifecycle timers (mock progression, real poll, auto-dismiss);
253
+ // cleared on unmount and at the start of each new save so a stale timer can't
254
+ // overwrite a fresh result.
255
+ const timersRef = useRef<ReturnType<typeof setTimeout>[]>([]);
256
+ const clearTimers = useCallback(() => {
257
+ timersRef.current.forEach(clearTimeout);
258
+ timersRef.current = [];
259
+ }, []);
260
+ const after = useCallback((ms: number, fn: () => void) => {
261
+ timersRef.current.push(setTimeout(fn, ms));
262
+ }, []);
263
+ // Avoid setState after unmount (panel closes mid-request).
264
+ const mounted = useRef(true);
265
+ useEffect(() => () => { mounted.current = false; clearTimers(); }, [clearTimers]);
266
+
267
+ // Monotonic run id, bumped on every save. Each async lifecycle callback
268
+ // captures the run id it belongs to and bails if a newer save superseded it —
269
+ // this guards the callback that has ALREADY passed `await fetch` and so can't
270
+ // be cancelled by clearTimers() (通信牛 review #11 blocker 1: stale poll
271
+ // overwriting a fresh save).
272
+ const applySeqRef = useRef(0);
273
+ // "First terminal wins" within a run: once applied/rejected/timeout is set, a
274
+ // late result can't overwrite it — this makes the 30s ceiling truly hard
275
+ // (通信牛 review #11 blocker 2).
276
+ const settledRef = useRef(false);
277
+ const isCurrent = useCallback((runId: number) => mounted.current && runId === applySeqRef.current, []);
278
+ const settle = useCallback((runId: number, apply: () => void) => {
279
+ if (!isCurrent(runId) || settledRef.current) return;
280
+ settledRef.current = true;
281
+ apply();
282
+ }, [isCurrent]);
283
+
284
+ const setFlag = useCallback(<K extends keyof FlagsForm>(key: K, v: FlagsForm[K]) => {
285
+ setFlags(f => ({ ...f, [key]: v }));
286
+ setDirty(true);
287
+ }, []);
288
+
289
+ // Load current config on mount. Falls back to session-derived defaults when
290
+ // the hub tool isn't deployed (route returns mock with empty flags).
291
+ useEffect(() => {
292
+ let cancelled = false;
293
+ (async () => {
294
+ try {
295
+ const res = await fetch(`/api/anet/node-config?node_id=${encodeURIComponent(nodeKey)}`, { cache: 'no-store' });
296
+ const data = await res.json().catch(() => ({}));
297
+ if (cancelled || !mounted.current) return;
298
+ if (data?.model) setModel(String(data.model));
299
+ const f = data?.flags && typeof data.flags === 'object' ? data.flags : {};
300
+ setFlags({
301
+ permissionMode: typeof f.permissionMode === 'string' && PERMISSION_MODES.includes(f.permissionMode) ? f.permissionMode : DEFAULT_FLAGS.permissionMode,
302
+ dangerouslySkipPermissions: !!f.dangerouslySkipPermissions,
303
+ teammateMode: !!f.teammateMode,
304
+ maxTurns: numStr(f.maxTurns),
305
+ budget: numStr(f.budget),
306
+ timeout: numStr(f.timeout),
307
+ });
308
+ } catch {
309
+ // keep defaults — Save still works (mock path) so the UI is reviewable
310
+ } finally {
311
+ if (!cancelled && mounted.current) setLoading(false);
312
+ }
313
+ })();
314
+ return () => { cancelled = true; };
315
+ }, [nodeKey]);
316
+
317
+ // Terminal "applied" state + auto-dismiss of the success strip.
318
+ const finishApplied = useCallback((mock: boolean, runId: number) => {
319
+ settle(runId, () => {
320
+ setPhase('applied');
321
+ setPhaseMock(mock);
322
+ setPhaseMsg(mock ? '已应用(模拟 · 后端未接入,未真正下发)' : '配置已生效');
323
+ after(SUCCESS_DISMISS_MS, () => {
324
+ if (isCurrent(runId)) setPhase(p => (p === 'applied' ? 'idle' : p));
325
+ });
326
+ });
327
+ }, [after, isCurrent, settle]);
328
+
329
+ const markTimeout = useCallback((runId: number) => {
330
+ settle(runId, () => {
331
+ setPhase('timeout');
332
+ setPhaseMsg('应用超时未确认,请稍后在节点详情核对');
333
+ });
334
+ }, [settle]);
335
+
336
+ // Poll the real apply-status endpoint until terminal or timeout. `runId` ties
337
+ // every callback to the save that started it; a newer save (or a settled
338
+ // result) makes it bail before touching state.
339
+ const pollApply = useCallback((applyId: string, startedAt: number, runId: number) => {
340
+ after(APPLY_POLL_MS, async () => {
341
+ if (!isCurrent(runId) || settledRef.current) return;
342
+ let status: string | undefined;
343
+ let detail: string | undefined;
344
+ try {
345
+ const { data } = await fetchJson(`/api/anet/node-config?apply_id=${encodeURIComponent(applyId)}`, { cache: 'no-store' }, FETCH_TIMEOUT_MS);
346
+ status = data?.status as string | undefined;
347
+ detail = data?.detail as string | undefined;
348
+ } catch { /* transient / aborted — fall through to retry or timeout */ }
349
+ // Re-check AFTER the await: a newer save may have superseded this poll.
350
+ if (!isCurrent(runId) || settledRef.current) return;
351
+ if (status === 'applied') { finishApplied(false, runId); return; }
352
+ if (status === 'rejected') {
353
+ settle(runId, () => {
354
+ setPhase('rejected');
355
+ setPhaseMsg(detail ? `应用被拒绝:${detail}` : '应用被拒绝');
356
+ });
357
+ return;
358
+ }
359
+ if (Date.now() - startedAt >= APPLY_TIMEOUT_MS) { markTimeout(runId); return; }
360
+ pollApply(applyId, startedAt, runId); // still pending → keep polling
361
+ });
362
+ }, [after, finishApplied, isCurrent, markTimeout, settle]);
363
+
364
+ async function handleSave() {
365
+ clearTimers(); // cancel any pending timers from a prior run
366
+ const runId = ++applySeqRef.current; // supersede any in-flight (post-await) callback
367
+ settledRef.current = false;
368
+ setPhase('saving');
369
+ setPhaseMsg('');
370
+ setPhaseMock(false);
371
+ // Coerce numeric strings → numbers; drop blanks so unset fields aren't
372
+ // forced to 0 on the backend.
373
+ const numOrUndef = (v: string) => (v.trim() === '' ? undefined : Number(v));
374
+ const payload = {
375
+ node_id: nodeKey,
376
+ model,
377
+ flags: {
378
+ permissionMode: flags.permissionMode,
379
+ dangerouslySkipPermissions: flags.dangerouslySkipPermissions,
380
+ teammateMode: flags.teammateMode,
381
+ maxTurns: numOrUndef(flags.maxTurns),
382
+ budget: numOrUndef(flags.budget),
383
+ timeout: numOrUndef(flags.timeout),
384
+ },
385
+ };
386
+ let data: { ok?: boolean; error?: string; mock?: boolean; applied?: boolean; status?: string; applyId?: string } = {};
387
+ try {
388
+ const r = await fetchJson('/api/anet/node-config', {
389
+ method: 'POST',
390
+ headers: { 'Content-Type': 'application/json' },
391
+ body: JSON.stringify(payload),
392
+ }, FETCH_TIMEOUT_MS);
393
+ if (!isCurrent(runId)) return; // a newer save started while this POST was in flight
394
+ data = r.data as typeof data;
395
+ if (!r.res.ok || data?.ok === false) {
396
+ settledRef.current = true;
397
+ setPhase('error');
398
+ setPhaseMsg(data?.error ? `保存失败:${data.error}` : '保存失败');
399
+ return;
400
+ }
401
+ } catch (e) {
402
+ if (!isCurrent(runId)) return;
403
+ settledRef.current = true;
404
+ setPhase('error');
405
+ setPhaseMsg(isAbort(e) ? '保存超时,请重试' : e instanceof Error ? `保存失败:${e.message}` : '保存失败');
406
+ return;
407
+ }
408
+
409
+ // Save accepted — now drive the take-effect lifecycle.
410
+ setDirty(false);
411
+ const mock = !!(data.mock || data.applied === false);
412
+ if (data.status === 'applied') { finishApplied(mock, runId); return; }
413
+ if (data.status === 'rejected') { settle(runId, () => { setPhase('rejected'); setPhaseMsg('应用被拒绝'); }); return; }
414
+
415
+ // Optimistic "applying" — node is restarting / taking the new config.
416
+ setPhase('applying');
417
+ setPhaseMock(mock);
418
+ if (mock) {
419
+ // Backend not live: simulate the apply so the lifecycle UI is reviewable.
420
+ after(MOCK_APPLY_MS, () => finishApplied(true, runId));
421
+ } else if (data.applyId) {
422
+ // Hard 30s ceiling that fires regardless of whether a poll is in flight
423
+ // or the hub proxy is hanging — `settle` makes the first terminal win, so
424
+ // a late poll result can't reopen it (通信牛 review #11 blocker 2).
425
+ after(APPLY_TIMEOUT_MS, () => markTimeout(runId));
426
+ pollApply(data.applyId, Date.now(), runId);
427
+ } else {
428
+ // Real success with no applyId to poll → treat as applied.
429
+ finishApplied(false, runId);
430
+ }
431
+ }
432
+
433
+ async function handleRestart() {
434
+ if (lcBusy) return;
435
+ if (typeof window !== 'undefined' && !window.confirm(`重启节点「${s.alias}」?当前会话会中断,节点将以现有配置重新启动。`)) return;
436
+ setLcBusy(true);
437
+ setLcResult({ tone: 'info', text: '重启指令下发中…' });
438
+ try {
439
+ const r = await fetch('/api/anet/node-lifecycle', {
440
+ method: 'POST',
441
+ headers: { 'Content-Type': 'application/json' },
442
+ // Pass the node's own network so multi-network users (whose default
443
+ // network may differ from this node's) restart the right node.
444
+ body: JSON.stringify({ node_id: nodeKey, action: 'restart', ...(s.network_id ? { network_id: s.network_id } : {}) }),
445
+ });
446
+ const data = await r.json().catch(() => ({}));
447
+ if (!mounted.current) return;
448
+ if (r.ok && data?.ok) {
449
+ setLcResult({ tone: 'ok', text: '重启已下发,节点正在重启生效中…' });
450
+ } else if (data?.unconfirmed) {
451
+ setLcResult({ tone: 'warn', text: `后端工具未上线:${data?.error || 'restart_node 不可用'}` });
452
+ } else {
453
+ setLcResult({ tone: 'err', text: data?.error ? `重启失败:${data.error}` : '重启失败' });
454
+ }
455
+ } catch (e) {
456
+ if (mounted.current) setLcResult({ tone: 'err', text: `重启失败:${e instanceof Error ? e.message : '网络错误'}` });
457
+ } finally {
458
+ if (mounted.current) setLcBusy(false);
459
+ }
460
+ }
461
+
462
+ return (
463
+ <>
464
+ <div className="fixed inset-0 bg-black/40 z-40" onClick={onClose} aria-hidden />
465
+
466
+ <div
467
+ role="dialog"
468
+ aria-label={`${s.alias} 节点设置`}
469
+ className="fixed top-0 right-0 h-[100dvh] w-full sm:w-[440px] bg-[#0f0f11] border-l border-[#26262b] z-50 flex flex-col shadow-2xl shadow-black/60 animate-slide-in"
470
+ >
471
+ {/* Header */}
472
+ <div className="flex items-center gap-2.5 px-4 py-3 border-b border-[#26262b]">
473
+ <AliasAvatar alias={s.alias} size={26} />
474
+ <div className="min-w-0 flex-1">
475
+ <div className="text-sm font-semibold text-white truncate" title={s.alias}>{s.alias}</div>
476
+ <div className="text-[11px] text-gray-500">节点设置</div>
477
+ </div>
478
+ <button onClick={onClose} aria-label="关闭设置" className="inline-flex h-9 w-9 items-center justify-center text-gray-500 hover:text-white rounded-md hover:bg-white/5">
479
+ <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
480
+ <path strokeLinecap="round" strokeLinejoin="round" d="M6 18L18 6M6 6l12 12" />
481
+ </svg>
482
+ </button>
483
+ </div>
484
+
485
+ <div className="flex-1 overflow-y-auto px-4 py-4 space-y-5">
486
+ {/* E. 基础信息(只读) */}
487
+ <section>
488
+ <SectionTitle>基础信息</SectionTitle>
489
+ <div className="rounded-lg border border-[#26262b] bg-[#161618] divide-y divide-[#1c1c1f]">
490
+ <InfoRow label="别名" value={s.alias} />
491
+ <InfoRow label="node_id" value={s.node_id || '—'} />
492
+ <InfoRow label="所属 network" value={s.network_id || '—'} />
493
+ <InfoRow label="当前 session" value={s.session_id || '—'} />
494
+ <InfoRow label="在线状态" value={s.status || '—'} />
495
+ </div>
496
+ </section>
497
+
498
+ {/* B. Runtime + 模型 (model editable) */}
499
+ <section>
500
+ <SectionTitle>Runtime · 模型</SectionTitle>
501
+ <div className="space-y-2.5">
502
+ <div>
503
+ <span className="text-[11px] text-gray-500">Runtime(只读)</span>
504
+ <div className="mt-0.5 rounded-md border border-[#26262b] bg-[#0e0e10] px-2.5 py-1.5 text-[12px] text-gray-400 font-mono">{runtime}</div>
505
+ </div>
506
+ {modelOptions.length > 1 ? (
507
+ <Select label="模型 / Preset" value={model} options={modelOptions} onChange={v => { setModel(v); setDirty(true); }} />
508
+ ) : (
509
+ <label className="block">
510
+ <span className="text-[11px] text-gray-500">模型 / Preset</span>
511
+ <input
512
+ type="text" value={model} onChange={e => { setModel(e.target.value); setDirty(true); }}
513
+ placeholder="未配置"
514
+ className="mt-0.5 w-full rounded-md border border-[#26262b] bg-[#0e0e10] px-2.5 py-1.5 text-[12px] text-gray-200 focus:border-cyan-600 focus:outline-none"
515
+ />
516
+ </label>
517
+ )}
518
+ <div className="flex items-center gap-2 text-[11px] text-gray-500">
519
+ <span>图片能力 (imageCapable)</span>
520
+ <span className={`px-1.5 py-0.5 rounded ${imageCapable ? 'bg-green-900/30 text-green-300' : 'bg-[#2a2a30] text-gray-400'}`}>
521
+ {imageCapable ? '支持' : '不支持'} · 只读
522
+ </span>
523
+ </div>
524
+ </div>
525
+ </section>
526
+
527
+ {/* C. 运行模式 / flags (editable) */}
528
+ <section>
529
+ <SectionTitle>运行模式 · flags</SectionTitle>
530
+ <div className="space-y-2">
531
+ <Select
532
+ label="权限模式 permissionMode"
533
+ value={flags.permissionMode}
534
+ options={PERMISSION_MODES}
535
+ onChange={v => setFlag('permissionMode', v)}
536
+ />
537
+ <Toggle
538
+ label="跳过权限确认 dangerouslySkipPermissions"
539
+ checked={flags.dangerouslySkipPermissions}
540
+ onChange={v => setFlag('dangerouslySkipPermissions', v)}
541
+ />
542
+ <Toggle
543
+ label="团队模式 teammateMode"
544
+ checked={flags.teammateMode}
545
+ onChange={v => setFlag('teammateMode', v)}
546
+ />
547
+ <div className="grid grid-cols-3 gap-2 pt-0.5">
548
+ <NumberField label="maxTurns" value={flags.maxTurns} onChange={v => setFlag('maxTurns', v)} />
549
+ <NumberField label="budget" value={flags.budget} onChange={v => setFlag('budget', v)} />
550
+ <NumberField label="timeout(s)" value={flags.timeout} onChange={v => setFlag('timeout', v)} />
551
+ </div>
552
+ </div>
553
+ </section>
554
+
555
+ {/* Save bar + F3 apply lifecycle (optimistic → restarting → ack) */}
556
+ <section>
557
+ {(() => {
558
+ const busy = phase === 'saving' || phase === 'applying';
559
+ const btnDisabled = loading || busy || !dirty;
560
+ const btnLabel = phase === 'saving' ? '保存中…'
561
+ : phase === 'applying' ? '应用中…'
562
+ : loading ? '加载中…'
563
+ : dirty ? '保存模型 / flags'
564
+ : '无改动';
565
+ return (
566
+ <button
567
+ type="button"
568
+ onClick={handleSave}
569
+ disabled={btnDisabled}
570
+ className={`flex w-full items-center justify-center gap-2 rounded-lg px-3 py-2.5 text-sm font-medium transition-colors ${
571
+ btnDisabled ? 'bg-[#1c1c1f] text-gray-600 cursor-not-allowed' : 'bg-cyan-600 text-white hover:bg-cyan-500'
572
+ }`}
573
+ >
574
+ {busy && (
575
+ <svg className="h-4 w-4 animate-spin" viewBox="0 0 24 24" fill="none" aria-hidden>
576
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
577
+ <path className="opacity-90" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z" />
578
+ </svg>
579
+ )}
580
+ {btnLabel}
581
+ </button>
582
+ );
583
+ })()}
584
+
585
+ {/* Lifecycle status strip — the "toast" for the apply outcome. */}
586
+ {phase !== 'idle' && (() => {
587
+ const map: Record<Exclude<ApplyPhase, 'idle'>, { tone: string; icon: string; text: string }> = {
588
+ saving: { tone: 'border-[#26262b] bg-[#161618] text-gray-300', icon: '·', text: '正在提交配置…' },
589
+ applying: { tone: 'border-cyan-800/50 bg-cyan-900/15 text-cyan-300', icon: '↻', text: '已下发,正在应用(节点重启生效中)…' },
590
+ applied: { tone: 'border-green-800/50 bg-green-900/15 text-green-300', icon: '✓', text: phaseMsg || '配置已生效' },
591
+ rejected: { tone: 'border-red-800/50 bg-red-900/15 text-red-300', icon: '✗', text: phaseMsg || '应用被拒绝' },
592
+ timeout: { tone: 'border-amber-700/50 bg-amber-900/15 text-amber-300', icon: '⚠', text: phaseMsg || '应用超时未确认' },
593
+ error: { tone: 'border-red-800/50 bg-red-900/15 text-red-300', icon: '✗', text: phaseMsg || '保存失败' },
594
+ };
595
+ const v = map[phase];
596
+ return (
597
+ <div role="status" aria-live="polite" className={`mt-2 flex items-start gap-2 rounded-lg border px-3 py-2 text-[12px] ${v.tone}`}>
598
+ <span className={`shrink-0 leading-5 ${phase === 'applying' ? 'inline-block animate-spin' : ''}`} aria-hidden>{v.icon}</span>
599
+ <span>{v.text}</span>
600
+ </div>
601
+ );
602
+ })()}
603
+ {phaseMock && (phase === 'applying' || phase === 'applied') && (
604
+ <p className="mt-1 text-[10px] text-gray-600">后端工具未上线,应用流程为模拟演示(不会真正下发到节点)</p>
605
+ )}
606
+ </section>
607
+
608
+ {/* A. 接入 Channel (P2 — display only) */}
609
+ <section>
610
+ <SectionTitle>接入 Channel</SectionTitle>
611
+ <div className="space-y-2">
612
+ {CHANNELS.map(ch => (
613
+ <div key={ch.key} className={`rounded-lg border border-[#26262b] bg-[#161618] ${ch.roadmap ? 'opacity-50' : ''}`}>
614
+ <label className="flex items-center justify-between px-3 py-2 text-sm text-gray-300 cursor-not-allowed">
615
+ <span className="flex items-center gap-2">
616
+ {ch.label}
617
+ {ch.roadmap && <span className="text-[10px] px-1.5 py-0.5 rounded bg-[#2a2a30] text-gray-400">即将支持</span>}
618
+ </span>
619
+ <input type="checkbox" checked={!ch.roadmap && active.has(ch.key)} disabled readOnly className="h-4 w-4 accent-cyan-500 cursor-not-allowed" />
620
+ </label>
621
+ {!ch.roadmap && active.has(ch.key) && ch.fields.length > 0 && (
622
+ <div className="px-3 pb-3 pt-1 space-y-2 border-t border-[#1c1c1f]">
623
+ {ch.fields.map(f => <StubField key={f.label} label={f.label} value={f.value} />)}
624
+ </div>
625
+ )}
626
+ </div>
627
+ ))}
628
+ </div>
629
+ <p className="mt-2 text-[11px] text-gray-600">Channel 绑定为下一阶段(P2)· 当前仅展示,暂未接后端</p>
630
+ </section>
631
+
632
+ {/* D. 节点操作 (M1 lifecycle — restart wired to RFC-024 restart_node;
633
+ rename/stop/delete gated on backend, shown as 即将支持). */}
634
+ <section>
635
+ <SectionTitle>节点操作</SectionTitle>
636
+ <button
637
+ type="button"
638
+ onClick={handleRestart}
639
+ disabled={lcBusy}
640
+ className={`flex w-full items-center justify-center gap-2 rounded-lg border px-3 py-2.5 text-[13px] font-medium transition-colors ${
641
+ lcBusy
642
+ ? 'border-[#26262b] bg-[#1c1c1f] text-gray-600 cursor-not-allowed'
643
+ : 'border-amber-700/50 bg-amber-900/15 text-amber-300 hover:bg-amber-900/25'
644
+ }`}
645
+ >
646
+ {lcBusy && (
647
+ <svg className="h-4 w-4 animate-spin" viewBox="0 0 24 24" fill="none" aria-hidden>
648
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
649
+ <path className="opacity-90" fill="currentColor" d="M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z" />
650
+ </svg>
651
+ )}
652
+ 重启节点
653
+ </button>
654
+ {lcResult && (() => {
655
+ const tone = lcResult.tone === 'ok' ? 'border-green-800/50 bg-green-900/15 text-green-300'
656
+ : lcResult.tone === 'warn' ? 'border-amber-700/50 bg-amber-900/15 text-amber-300'
657
+ : lcResult.tone === 'err' ? 'border-red-800/50 bg-red-900/15 text-red-300'
658
+ : 'border-[#26262b] bg-[#161618] text-gray-300';
659
+ return (
660
+ <div role="status" aria-live="polite" className={`mt-2 rounded-lg border px-3 py-2 text-[12px] ${tone}`}>
661
+ {lcResult.text}
662
+ </div>
663
+ );
664
+ })()}
665
+ {/* Gated actions — backend not yet available (RFC-024 rename / RFC-027 stop+delete). */}
666
+ <div className="mt-2 grid grid-cols-3 gap-2">
667
+ {[{ label: '重命名' }, { label: '停止' }, { label: '删除', danger: true }].map(op => (
668
+ <div
669
+ key={op.label}
670
+ aria-disabled="true"
671
+ title="后端待上线"
672
+ className={`flex flex-col items-center justify-center gap-1 rounded-lg border px-2 py-2 text-[12px] cursor-not-allowed ${
673
+ op.danger ? 'border-red-900/30 bg-red-900/[0.06] text-red-300/55' : 'border-[#26262b] bg-[#161618] text-gray-500'
674
+ }`}
675
+ >
676
+ {op.label}
677
+ <span className="text-[9px] px-1 py-0.5 rounded bg-[#2a2a30] text-gray-400">即将支持</span>
678
+ </div>
679
+ ))}
680
+ </div>
681
+ <p className="mt-2 text-[11px] text-gray-600">重启已接入后端;重命名 / 停止 / 删除待后端(RFC-024 改名 · RFC-027 停止/删除)上线。</p>
682
+ </section>
683
+ </div>
684
+ </div>
685
+
686
+ <style jsx global>{`
687
+ @keyframes node-settings-slide-in {
688
+ from { transform: translateX(100%); }
689
+ to { transform: translateX(0); }
690
+ }
691
+ .animate-slide-in { animation: node-settings-slide-in 0.2s ease-out; }
692
+ `}</style>
693
+ </>
694
+ );
695
+ }