@sleep2agi/agent-network-dashboard 0.6.3-preview.55 → 0.6.3-preview.57

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 (729) hide show
  1. package/.next/BUILD_COMMIT +1 -1
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/app-path-routes-manifest.json +9 -0
  4. package/.next/build-manifest.json +3 -3
  5. package/.next/diagnostics/route-bundle-stats.json +151 -101
  6. package/.next/fallback-build-manifest.json +3 -3
  7. package/.next/next-server.js.nft.json +1 -1
  8. package/.next/prerender-manifest.json +75 -19
  9. package/.next/required-server-files.js +4 -4
  10. package/.next/required-server-files.json +4 -4
  11. package/.next/routes-manifest.json +63 -0
  12. package/.next/server/app/_global-error.html +1 -1
  13. package/.next/server/app/_global-error.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/_not-found.html +2 -2
  20. package/.next/server/app/_not-found.rsc +14 -14
  21. package/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +13 -13
  23. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
  24. package/.next/server/app/admin/page.js.nft.json +1 -1
  25. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/admin.html +2 -2
  27. package/.next/server/app/admin.rsc +16 -16
  28. package/.next/server/app/admin.segments/_full.segment.rsc +16 -16
  29. package/.next/server/app/admin.segments/_tree.segment.rsc +3 -3
  30. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +15 -15
  31. package/.next/server/app/api/anet/host-supervisors/route.js.nft.json +1 -1
  32. package/.next/server/app/api/anet/node-config/route.js +1 -1
  33. package/.next/server/app/api/anet/node-config/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hub/people/route/app-paths-manifest.json +3 -0
  35. package/.next/server/app/api/hub/people/route/build-manifest.json +12 -0
  36. package/.next/server/app/api/hub/people/route/server-reference-manifest.json +4 -0
  37. package/.next/server/app/api/hub/people/route.js +7 -0
  38. package/.next/server/app/api/hub/people/route.js.map +5 -0
  39. package/.next/server/app/api/hub/people/route.js.nft.json +1 -0
  40. package/.next/server/app/api/hub/people/route_client-reference-manifest.js +3 -0
  41. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route/app-paths-manifest.json +3 -0
  42. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route/build-manifest.json +12 -0
  43. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route/server-reference-manifest.json +4 -0
  44. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route.js +7 -0
  45. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route.js.map +5 -0
  46. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route.js.nft.json +1 -0
  47. package/.next/server/app/api/hub/requirements/[id]/checklist/[itemId]/route_client-reference-manifest.js +3 -0
  48. package/.next/server/app/api/hub/requirements/[id]/comments/route/app-paths-manifest.json +3 -0
  49. package/.next/server/app/api/hub/requirements/[id]/comments/route/build-manifest.json +12 -0
  50. package/.next/server/app/api/hub/requirements/[id]/comments/route/server-reference-manifest.json +4 -0
  51. package/.next/server/app/api/hub/requirements/[id]/comments/route.js +7 -0
  52. package/.next/server/app/api/hub/requirements/[id]/comments/route.js.map +5 -0
  53. package/.next/server/app/api/hub/requirements/[id]/comments/route.js.nft.json +1 -0
  54. package/.next/server/app/api/hub/requirements/[id]/comments/route_client-reference-manifest.js +3 -0
  55. package/.next/server/app/api/hub/requirements/[id]/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/hub/requirements/[id]/route/build-manifest.json +12 -0
  57. package/.next/server/app/api/hub/requirements/[id]/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/hub/requirements/[id]/route.js +7 -0
  59. package/.next/server/app/api/hub/requirements/[id]/route.js.map +5 -0
  60. package/.next/server/app/api/hub/requirements/[id]/route.js.nft.json +1 -0
  61. package/.next/server/app/api/hub/requirements/[id]/route_client-reference-manifest.js +3 -0
  62. package/.next/server/app/api/hub/requirements/events/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/hub/requirements/events/route/build-manifest.json +12 -0
  64. package/.next/server/app/api/hub/requirements/events/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/hub/requirements/events/route.js +7 -0
  66. package/.next/server/app/api/hub/requirements/events/route.js.map +5 -0
  67. package/.next/server/app/api/hub/requirements/events/route.js.nft.json +1 -0
  68. package/.next/server/app/api/hub/requirements/events/route_client-reference-manifest.js +3 -0
  69. package/.next/server/app/api/hub/requirements/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/hub/requirements/route/build-manifest.json +12 -0
  71. package/.next/server/app/api/hub/requirements/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/hub/requirements/route.js +7 -0
  73. package/.next/server/app/api/hub/requirements/route.js.map +5 -0
  74. package/.next/server/app/api/hub/requirements/route.js.nft.json +1 -0
  75. package/.next/server/app/api/hub/requirements/route_client-reference-manifest.js +3 -0
  76. package/.next/server/app/index.html +2 -2
  77. package/.next/server/app/index.rsc +16 -16
  78. package/.next/server/app/index.segments/__PAGE__.segment.rsc +15 -15
  79. package/.next/server/app/index.segments/_full.segment.rsc +16 -16
  80. package/.next/server/app/index.segments/_tree.segment.rsc +3 -3
  81. package/.next/server/app/login/page.js.nft.json +1 -1
  82. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/login.html +2 -2
  84. package/.next/server/app/login.rsc +16 -16
  85. package/.next/server/app/login.segments/_full.segment.rsc +16 -16
  86. package/.next/server/app/login.segments/_tree.segment.rsc +3 -3
  87. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +15 -15
  88. package/.next/server/app/logs/page.js.nft.json +1 -1
  89. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app/logs.html +2 -2
  91. package/.next/server/app/logs.rsc +16 -16
  92. package/.next/server/app/logs.segments/_full.segment.rsc +16 -16
  93. package/.next/server/app/logs.segments/_tree.segment.rsc +3 -3
  94. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +15 -15
  95. package/.next/server/app/messages/page.js.nft.json +1 -1
  96. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  97. package/.next/server/app/messages.html +2 -2
  98. package/.next/server/app/messages.rsc +16 -16
  99. package/.next/server/app/messages.segments/_full.segment.rsc +16 -16
  100. package/.next/server/app/messages.segments/_tree.segment.rsc +3 -3
  101. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +15 -15
  102. package/.next/server/app/node/page.js.nft.json +1 -1
  103. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/node.html +2 -2
  105. package/.next/server/app/node.rsc +16 -16
  106. package/.next/server/app/node.segments/_full.segment.rsc +16 -16
  107. package/.next/server/app/node.segments/_tree.segment.rsc +3 -3
  108. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +15 -15
  109. package/.next/server/app/nodes/[alias]/page.js.nft.json +1 -1
  110. package/.next/server/app/nodes/[alias]/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/nodes/page.js.nft.json +1 -1
  112. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  113. package/.next/server/app/nodes.html +2 -2
  114. package/.next/server/app/nodes.rsc +16 -16
  115. package/.next/server/app/nodes.segments/_full.segment.rsc +16 -16
  116. package/.next/server/app/nodes.segments/_tree.segment.rsc +3 -3
  117. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +15 -15
  118. package/.next/server/app/org/page/app-paths-manifest.json +3 -0
  119. package/.next/server/app/org/page/build-manifest.json +20 -0
  120. package/.next/server/app/org/page/next-font-manifest.json +11 -0
  121. package/.next/server/app/org/page/react-loadable-manifest.json +1 -0
  122. package/.next/server/app/org/page/server-reference-manifest.json +4 -0
  123. package/.next/server/app/org/page.js +13 -0
  124. package/.next/server/app/org/page.js.map +5 -0
  125. package/.next/server/app/org/page.js.nft.json +1 -0
  126. package/.next/server/app/org/page_client-reference-manifest.js +3 -0
  127. package/.next/server/app/org.html +12 -0
  128. package/.next/server/app/org.meta +26 -0
  129. package/.next/server/app/org.rsc +27 -0
  130. package/.next/server/app/org.segments/_full.segment.rsc +27 -0
  131. package/.next/server/app/org.segments/_tree.segment.rsc +5 -0
  132. package/.next/server/app/org.segments/org/__PAGE__.segment.rsc +32 -0
  133. package/.next/server/app/page.js.nft.json +1 -1
  134. package/.next/server/app/page_client-reference-manifest.js +1 -1
  135. package/.next/server/app/providers/page.js.nft.json +1 -1
  136. package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
  137. package/.next/server/app/providers.html +2 -2
  138. package/.next/server/app/providers.rsc +16 -16
  139. package/.next/server/app/providers.segments/_full.segment.rsc +16 -16
  140. package/.next/server/app/providers.segments/_tree.segment.rsc +3 -3
  141. package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +15 -15
  142. package/.next/server/app/requirements/[id]/page/app-paths-manifest.json +3 -0
  143. package/.next/server/app/requirements/[id]/page/build-manifest.json +20 -0
  144. package/.next/server/app/requirements/[id]/page/next-font-manifest.json +11 -0
  145. package/.next/server/app/requirements/[id]/page/react-loadable-manifest.json +1 -0
  146. package/.next/server/app/requirements/[id]/page/server-reference-manifest.json +4 -0
  147. package/.next/server/app/requirements/[id]/page.js +13 -0
  148. package/.next/server/app/requirements/[id]/page.js.map +5 -0
  149. package/.next/server/app/requirements/[id]/page.js.nft.json +1 -0
  150. package/.next/server/app/requirements/[id]/page_client-reference-manifest.js +3 -0
  151. package/.next/server/app/requirements/page/app-paths-manifest.json +3 -0
  152. package/.next/server/app/requirements/page/build-manifest.json +20 -0
  153. package/.next/server/app/requirements/page/next-font-manifest.json +11 -0
  154. package/.next/server/app/requirements/page/react-loadable-manifest.json +1 -0
  155. package/.next/server/app/requirements/page/server-reference-manifest.json +4 -0
  156. package/.next/server/app/requirements/page.js +13 -0
  157. package/.next/server/app/requirements/page.js.map +5 -0
  158. package/.next/server/app/requirements/page.js.nft.json +1 -0
  159. package/.next/server/app/requirements/page_client-reference-manifest.js +3 -0
  160. package/.next/server/app/requirements.html +12 -0
  161. package/.next/server/app/requirements.meta +26 -0
  162. package/.next/server/app/requirements.rsc +27 -0
  163. package/.next/server/app/requirements.segments/_full.segment.rsc +27 -0
  164. package/.next/server/app/requirements.segments/_tree.segment.rsc +5 -0
  165. package/.next/server/app/requirements.segments/requirements/__PAGE__.segment.rsc +32 -0
  166. package/.next/server/app/scheduled-tasks/page.js.nft.json +1 -1
  167. package/.next/server/app/scheduled-tasks/page_client-reference-manifest.js +1 -1
  168. package/.next/server/app/scheduled-tasks.html +2 -2
  169. package/.next/server/app/scheduled-tasks.rsc +16 -16
  170. package/.next/server/app/scheduled-tasks.segments/_full.segment.rsc +16 -16
  171. package/.next/server/app/scheduled-tasks.segments/_tree.segment.rsc +3 -3
  172. package/.next/server/app/scheduled-tasks.segments/scheduled-tasks/__PAGE__.segment.rsc +15 -15
  173. package/.next/server/app/server-logs/page.js.nft.json +1 -1
  174. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  175. package/.next/server/app/server-logs.html +2 -2
  176. package/.next/server/app/server-logs.rsc +16 -16
  177. package/.next/server/app/server-logs.segments/_full.segment.rsc +16 -16
  178. package/.next/server/app/server-logs.segments/_tree.segment.rsc +3 -3
  179. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +15 -15
  180. package/.next/server/app/servers/page.js.nft.json +1 -1
  181. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  182. package/.next/server/app/servers.html +2 -2
  183. package/.next/server/app/servers.rsc +16 -16
  184. package/.next/server/app/servers.segments/_full.segment.rsc +16 -16
  185. package/.next/server/app/servers.segments/_tree.segment.rsc +3 -3
  186. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +15 -15
  187. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  188. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  189. package/.next/server/app/settings/networks.html +2 -2
  190. package/.next/server/app/settings/networks.rsc +16 -16
  191. package/.next/server/app/settings/networks.segments/_full.segment.rsc +16 -16
  192. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +3 -3
  193. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +15 -15
  194. package/.next/server/app/settings/page.js.nft.json +1 -1
  195. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  196. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  197. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  198. package/.next/server/app/settings/tokens.html +2 -2
  199. package/.next/server/app/settings/tokens.rsc +16 -16
  200. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +16 -16
  201. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +3 -3
  202. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +15 -15
  203. package/.next/server/app/settings.html +2 -2
  204. package/.next/server/app/settings.rsc +16 -16
  205. package/.next/server/app/settings.segments/_full.segment.rsc +16 -16
  206. package/.next/server/app/settings.segments/_tree.segment.rsc +3 -3
  207. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +15 -15
  208. package/.next/server/app/skillhub/page.js.nft.json +1 -1
  209. package/.next/server/app/skillhub/page_client-reference-manifest.js +1 -1
  210. package/.next/server/app/skillhub.html +2 -2
  211. package/.next/server/app/skillhub.rsc +16 -16
  212. package/.next/server/app/skillhub.segments/_full.segment.rsc +16 -16
  213. package/.next/server/app/skillhub.segments/_tree.segment.rsc +3 -3
  214. package/.next/server/app/skillhub.segments/skillhub/__PAGE__.segment.rsc +15 -15
  215. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  216. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/tasks/page.js.nft.json +1 -1
  218. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/tasks.html +2 -2
  220. package/.next/server/app/tasks.rsc +16 -16
  221. package/.next/server/app/tasks.segments/_full.segment.rsc +16 -16
  222. package/.next/server/app/tasks.segments/_tree.segment.rsc +3 -3
  223. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +15 -15
  224. package/.next/server/app-paths-manifest.json +9 -0
  225. package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_checklist_[itemId]_route_actions_05mpe5a.js +3 -0
  226. package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_checklist_[itemId]_route_actions_05mpe5a.js.map +1 -0
  227. package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_comments_route_actions_1lv4qr1.js +3 -0
  228. package/.next/server/chunks/1oeh_server_app_api_hub_requirements_[id]_comments_route_actions_1lv4qr1.js.map +1 -0
  229. package/.next/server/chunks/[root-of-the-server]__0-wvy_a._.js +1 -1
  230. package/.next/server/chunks/[root-of-the-server]__0-wvy_a._.js.map +1 -1
  231. package/.next/server/chunks/[root-of-the-server]__053z4wp._.js +3 -0
  232. package/.next/server/chunks/[root-of-the-server]__053z4wp._.js.map +1 -0
  233. package/.next/server/chunks/[root-of-the-server]__0if0bw1._.js +3 -0
  234. package/.next/server/chunks/[root-of-the-server]__0if0bw1._.js.map +1 -0
  235. package/.next/server/chunks/[root-of-the-server]__0liwkmx._.js +1 -1
  236. package/.next/server/chunks/[root-of-the-server]__0liwkmx._.js.map +1 -1
  237. package/.next/server/chunks/[root-of-the-server]__0q9xwca._.js +3 -0
  238. package/.next/server/chunks/[root-of-the-server]__0q9xwca._.js.map +1 -0
  239. package/.next/server/chunks/[root-of-the-server]__1941b2h._.js +3 -0
  240. package/.next/server/chunks/[root-of-the-server]__1941b2h._.js.map +1 -0
  241. package/.next/server/chunks/[root-of-the-server]__1_rzyvn._.js +3 -0
  242. package/.next/server/chunks/[root-of-the-server]__1_rzyvn._.js.map +1 -0
  243. package/.next/server/chunks/[root-of-the-server]__1vua9gf._.js +3 -0
  244. package/.next/server/chunks/[root-of-the-server]__1vua9gf._.js.map +1 -0
  245. package/.next/server/chunks/_05lpz54._.js +1 -1
  246. package/.next/server/chunks/_05lpz54._.js.map +1 -1
  247. package/.next/server/chunks/_next-internal_server_app_api_hub_people_route_actions_01pw78e.js +3 -0
  248. package/.next/server/chunks/_next-internal_server_app_api_hub_people_route_actions_01pw78e.js.map +1 -0
  249. package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_[id]_route_actions_1jkq5c6.js +3 -0
  250. package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_[id]_route_actions_1jkq5c6.js.map +1 -0
  251. package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_events_route_actions_1ypnpu5.js +3 -0
  252. package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_events_route_actions_1ypnpu5.js.map +1 -0
  253. package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_route_actions_1lyeno6.js +3 -0
  254. package/.next/server/chunks/_next-internal_server_app_api_hub_requirements_route_actions_1lyeno6.js.map +1 -0
  255. package/.next/server/chunks/ssr/[root-of-the-server]__0-94ipy._.js +3 -0
  256. package/.next/server/chunks/ssr/[root-of-the-server]__0-94ipy._.js.map +1 -0
  257. package/.next/server/chunks/ssr/[root-of-the-server]__09n7eih._.js +3 -0
  258. package/.next/server/chunks/ssr/[root-of-the-server]__09n7eih._.js.map +1 -0
  259. package/.next/server/chunks/ssr/[root-of-the-server]__0ol09h3._.js +3 -0
  260. package/.next/server/chunks/ssr/[root-of-the-server]__0ol09h3._.js.map +1 -0
  261. package/.next/server/chunks/ssr/[root-of-the-server]__14k36ti._.js +3 -0
  262. package/.next/server/chunks/ssr/[root-of-the-server]__14k36ti._.js.map +1 -0
  263. package/.next/server/chunks/ssr/[root-of-the-server]__1bn1jjm._.js +3 -0
  264. package/.next/server/chunks/ssr/[root-of-the-server]__1bn1jjm._.js.map +1 -0
  265. package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js +1 -1
  266. package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js.map +1 -1
  267. package/.next/server/chunks/ssr/_0q4m25o._.js +0 -0
  268. package/.next/server/chunks/ssr/_0q4m25o._.js.map +1 -1
  269. package/.next/server/chunks/ssr/_1z1o6o3._.js +0 -0
  270. package/.next/server/chunks/ssr/_1z1o6o3._.js.map +1 -1
  271. package/.next/server/chunks/ssr/_next-internal_server_app_org_page_actions_0hbcef1.js +3 -0
  272. package/.next/server/chunks/ssr/_next-internal_server_app_org_page_actions_0hbcef1.js.map +1 -0
  273. package/.next/server/chunks/ssr/_next-internal_server_app_requirements_[id]_page_actions_1wjoy4l.js +3 -0
  274. package/.next/server/chunks/ssr/_next-internal_server_app_requirements_[id]_page_actions_1wjoy4l.js.map +1 -0
  275. package/.next/server/chunks/ssr/_next-internal_server_app_requirements_page_actions_0x9m0gy.js +3 -0
  276. package/.next/server/chunks/ssr/_next-internal_server_app_requirements_page_actions_0x9m0gy.js.map +1 -0
  277. package/.next/server/chunks/ssr/app_05mfyco._.js +3 -0
  278. package/.next/server/chunks/ssr/app_05mfyco._.js.map +1 -0
  279. package/.next/server/chunks/ssr/{app_0_s8u96._.js → app_07bzc6w._.js} +1 -1
  280. package/.next/server/chunks/ssr/app_099f0wg._.js +3 -0
  281. package/.next/server/chunks/ssr/app_099f0wg._.js.map +1 -0
  282. package/.next/server/chunks/ssr/{app_1oxcq68._.js → app_0g7oz9w._.js} +1 -1
  283. package/.next/server/chunks/ssr/app_0iz553k._.js +1 -1
  284. package/.next/server/chunks/ssr/app_0iz553k._.js.map +1 -1
  285. package/.next/server/chunks/ssr/app_0los-eu._.js +1 -1
  286. package/.next/server/chunks/ssr/app_0los-eu._.js.map +1 -1
  287. package/.next/server/chunks/ssr/{app_0x7s72b._.js → app_0tt2ueo._.js} +2 -2
  288. package/.next/server/chunks/ssr/app_0tt2ueo._.js.map +1 -0
  289. package/.next/server/chunks/ssr/{app_081zy6c._.js → app_0ugqkd7._.js} +2 -2
  290. package/.next/server/chunks/ssr/app_0ugqkd7._.js.map +1 -0
  291. package/.next/server/chunks/ssr/app_1auk3il._.js +11 -0
  292. package/.next/server/chunks/ssr/app_1auk3il._.js.map +1 -0
  293. package/.next/server/chunks/ssr/{app_0o4bxq0._.js → app_1e91uc-._.js} +1 -1
  294. package/.next/server/chunks/ssr/{app_1psh956._.js → app_1f96aq_._.js} +1 -1
  295. package/.next/server/chunks/ssr/app_1rma_8a._.js +11 -0
  296. package/.next/server/chunks/ssr/app_1rma_8a._.js.map +1 -0
  297. package/.next/server/chunks/ssr/{app_0_dhiwi._.js → app_1ua57bx._.js} +1 -1
  298. package/.next/server/chunks/ssr/app_components_04a31va._.js +1 -1
  299. package/.next/server/chunks/ssr/app_components_04a31va._.js.map +1 -1
  300. package/.next/server/chunks/ssr/{app_lib_10o69j_._.js → app_lib_20-pe_0._.js} +2 -2
  301. package/.next/server/chunks/ssr/{app_lib_10o69j_._.js.map → app_lib_20-pe_0._.js.map} +1 -1
  302. package/.next/server/chunks/ssr/app_nodes_NodesView_tsx_1w6_d8p._.js +2 -2
  303. package/.next/server/chunks/ssr/app_nodes_NodesView_tsx_1w6_d8p._.js.map +1 -1
  304. package/.next/server/chunks/ssr/app_page_tsx_0pxmutw._.js +1 -1
  305. package/.next/server/chunks/ssr/app_page_tsx_0pxmutw._.js.map +1 -1
  306. package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js +1 -1
  307. package/.next/server/chunks/ssr/app_providers_page_tsx_0w7qdkp._.js.map +1 -1
  308. package/.next/server/chunks/ssr/app_scheduled-tasks_page_tsx_0xs70_6._.js +1 -1
  309. package/.next/server/chunks/ssr/app_scheduled-tasks_page_tsx_0xs70_6._.js.map +1 -1
  310. package/.next/server/chunks/ssr/app_tasks_TasksView_tsx_068vqml._.js +1 -1
  311. package/.next/server/chunks/ssr/app_tasks_TasksView_tsx_068vqml._.js.map +1 -1
  312. package/.next/server/functions-config-manifest.json +4 -0
  313. package/.next/server/middleware-build-manifest.js +3 -3
  314. package/.next/server/middleware.js.nft.json +1 -1
  315. package/.next/server/next-font-manifest.js +1 -1
  316. package/.next/server/next-font-manifest.json +12 -0
  317. package/.next/server/pages/404.html +2 -2
  318. package/.next/server/pages/500.html +1 -1
  319. package/.next/server/prefetch-hints.json +28 -0
  320. package/.next/server/server-reference-manifest.js +1 -1
  321. package/.next/server/server-reference-manifest.json +1 -1
  322. package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → _HZB6K84VKNaxf1K7dqqj}/_clientMiddlewareManifest.js +4 -0
  323. package/.next/static/chunks/{27b9kqyo7bmdr.js → 08-obrj2goweb.js} +2 -2
  324. package/.next/static/chunks/{3jjgc6skrbwx_.js → 0cuzbmf4k1kgl.js} +1 -1
  325. package/.next/static/chunks/0fih4pzed1syn.js +9 -0
  326. package/.next/static/chunks/0iiu4-g5k8jcq.js +1 -0
  327. package/.next/static/chunks/{37booeyruo9_l.js → 0iz44n632kw4w.js} +1 -1
  328. package/.next/static/chunks/0jt-1caejz1jv.js +1 -0
  329. package/.next/static/chunks/0k-4980o5t7_r.css +1 -0
  330. package/.next/static/chunks/{2vcrtfhj6hc_2.js → 0nqbg3txyq72t.js} +1 -1
  331. package/.next/static/chunks/114pblaedlrqs.js +1 -0
  332. package/.next/static/chunks/1tcaw8g6u6o-4.js +1 -0
  333. package/.next/static/chunks/1v5-qgib9884o.js +0 -0
  334. package/.next/static/chunks/{02303d1rbqx74.js → 2-x9r-1t3c1mn.js} +1 -1
  335. package/.next/static/chunks/{3_ixl_eog1g4p.js → 21djd6ixldlx0.js} +1 -1
  336. package/.next/static/chunks/2anlzel60my8y.js +2 -0
  337. package/.next/static/chunks/{0me1-941ysjh6.js → 2aymmcz4h9k0-.js} +1 -1
  338. package/.next/static/chunks/{326h2ihhnae5a.js → 2gsbf8zv54tds.js} +1 -1
  339. package/.next/static/chunks/{2501pshuqx52y.js → 2juzvtg9ne4yt.js} +1 -1
  340. package/.next/static/chunks/3cb3_kcec7bms.js +1 -0
  341. package/.next/static/chunks/{233p45nuh4m5b.css → 3d-1vk5hzu5rq.css} +2 -2
  342. package/.next/static/chunks/3shtxab8cmux9.js +1 -0
  343. package/.next/static/chunks/3u059pjgl4gcw.js +1 -0
  344. package/.next/trace +2 -2
  345. package/.next/trace-build +1 -1
  346. package/.next/types/routes.d.ts +11 -2
  347. package/.next/types/validator.ts +81 -0
  348. package/.vercel/.env.development.local +2 -0
  349. package/.vercel/.env.production.local +25 -0
  350. package/.vercel/README.txt +11 -0
  351. package/.vercel/output/builds.json +23 -0
  352. package/.vercel/output/config.json +489 -0
  353. package/.vercel/output/diagnostics/build-diagnostics.json +6 -0
  354. package/.vercel/output/diagnostics/cli_traces.json +1 -0
  355. package/.vercel/output/diagnostics/framework.json +1 -0
  356. package/.vercel/output/diagnostics/route-bundle-stats.json +245 -0
  357. package/.vercel/output/diagnostics/trace +2 -0
  358. package/.vercel/output/diagnostics/trace-build +1 -0
  359. package/.vercel/output/diagnostics/turbopack +0 -0
  360. package/.vercel/output/functions/_global-error.prerender-config.json +38 -0
  361. package/.vercel/output/functions/_global-error.prerender-fallback.html +1 -0
  362. package/.vercel/output/functions/_global-error.rsc.func/.next/routes-manifest.json +1 -0
  363. package/.vercel/output/functions/_global-error.rsc.func/.next/server/app-paths-manifest.json +1 -0
  364. package/.vercel/output/functions/_global-error.rsc.func/.next/server/pages-manifest.json +1 -0
  365. package/.vercel/output/functions/_global-error.rsc.func/.vc-config.json +807 -0
  366. package/.vercel/output/functions/_global-error.rsc.func/___next_launcher.cjs +68 -0
  367. package/.vercel/output/functions/_global-error.rsc.prerender-config.json +38 -0
  368. package/.vercel/output/functions/_global-error.rsc.prerender-fallback.rsc +15 -0
  369. package/.vercel/output/functions/_global-error.segments/__PAGE__.segment.rsc.prerender-config.json +28 -0
  370. package/.vercel/output/functions/_global-error.segments/__PAGE__.segment.rsc.prerender-fallback.rsc +5 -0
  371. package/.vercel/output/functions/_global-error.segments/_full.segment.rsc.prerender-config.json +28 -0
  372. package/.vercel/output/functions/_global-error.segments/_full.segment.rsc.prerender-fallback.rsc +15 -0
  373. package/.vercel/output/functions/_global-error.segments/_head.segment.rsc.prerender-config.json +28 -0
  374. package/.vercel/output/functions/_global-error.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  375. package/.vercel/output/functions/_global-error.segments/_index.segment.rsc.prerender-config.json +28 -0
  376. package/.vercel/output/functions/_global-error.segments/_index.segment.rsc.prerender-fallback.rsc +5 -0
  377. package/.vercel/output/functions/_global-error.segments/_tree.segment.rsc.prerender-config.json +28 -0
  378. package/.vercel/output/functions/_global-error.segments/_tree.segment.rsc.prerender-fallback.rsc +1 -0
  379. package/.vercel/output/functions/_middleware.func/.vc-config.json +107 -0
  380. package/.vercel/output/functions/_middleware.func/___next_launcher.cjs +135 -0
  381. package/.vercel/output/functions/_not-found.prerender-config.json +38 -0
  382. package/.vercel/output/functions/_not-found.prerender-fallback.html +12 -0
  383. package/.vercel/output/functions/_not-found.rsc.prerender-config.json +38 -0
  384. package/.vercel/output/functions/_not-found.rsc.prerender-fallback.rsc +21 -0
  385. package/.vercel/output/functions/_not-found.segments/_full.segment.rsc.prerender-config.json +28 -0
  386. package/.vercel/output/functions/_not-found.segments/_full.segment.rsc.prerender-fallback.rsc +21 -0
  387. package/.vercel/output/functions/_not-found.segments/_head.segment.rsc.prerender-config.json +28 -0
  388. package/.vercel/output/functions/_not-found.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  389. package/.vercel/output/functions/_not-found.segments/_index.segment.rsc.prerender-config.json +28 -0
  390. package/.vercel/output/functions/_not-found.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  391. package/.vercel/output/functions/_not-found.segments/_not-found/__PAGE__.segment.rsc.prerender-config.json +28 -0
  392. package/.vercel/output/functions/_not-found.segments/_not-found/__PAGE__.segment.rsc.prerender-fallback.rsc +5 -0
  393. package/.vercel/output/functions/_not-found.segments/_not-found.segment.rsc.prerender-config.json +28 -0
  394. package/.vercel/output/functions/_not-found.segments/_not-found.segment.rsc.prerender-fallback.rsc +5 -0
  395. package/.vercel/output/functions/_not-found.segments/_tree.segment.rsc.prerender-config.json +28 -0
  396. package/.vercel/output/functions/_not-found.segments/_tree.segment.rsc.prerender-fallback.rsc +3 -0
  397. package/.vercel/output/functions/admin.prerender-config.json +37 -0
  398. package/.vercel/output/functions/admin.prerender-fallback.html +12 -0
  399. package/.vercel/output/functions/admin.rsc.prerender-config.json +38 -0
  400. package/.vercel/output/functions/admin.rsc.prerender-fallback.rsc +27 -0
  401. package/.vercel/output/functions/admin.segments/_full.segment.rsc.prerender-config.json +28 -0
  402. package/.vercel/output/functions/admin.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  403. package/.vercel/output/functions/admin.segments/_head.segment.rsc.prerender-config.json +28 -0
  404. package/.vercel/output/functions/admin.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  405. package/.vercel/output/functions/admin.segments/_index.segment.rsc.prerender-config.json +28 -0
  406. package/.vercel/output/functions/admin.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  407. package/.vercel/output/functions/admin.segments/_tree.segment.rsc.prerender-config.json +28 -0
  408. package/.vercel/output/functions/admin.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  409. package/.vercel/output/functions/admin.segments/admin/__PAGE__.segment.rsc.prerender-config.json +28 -0
  410. package/.vercel/output/functions/admin.segments/admin/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  411. package/.vercel/output/functions/admin.segments/admin.segment.rsc.prerender-config.json +28 -0
  412. package/.vercel/output/functions/admin.segments/admin.segment.rsc.prerender-fallback.rsc +5 -0
  413. package/.vercel/output/functions/api/anet/config.func/.next/routes-manifest.json +1 -0
  414. package/.vercel/output/functions/api/anet/config.func/.next/server/app-paths-manifest.json +1 -0
  415. package/.vercel/output/functions/api/anet/config.func/.next/server/pages-manifest.json +1 -0
  416. package/.vercel/output/functions/api/anet/config.func/.vc-config.json +818 -0
  417. package/.vercel/output/functions/api/anet/config.func/___next_launcher.cjs +68 -0
  418. package/.vercel/output/functions/index.prerender-config.json +38 -0
  419. package/.vercel/output/functions/index.prerender-fallback.html +12 -0
  420. package/.vercel/output/functions/index.rsc.prerender-config.json +38 -0
  421. package/.vercel/output/functions/index.rsc.prerender-fallback.rsc +25 -0
  422. package/.vercel/output/functions/index.segments/__PAGE__.segment.rsc.prerender-config.json +28 -0
  423. package/.vercel/output/functions/index.segments/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  424. package/.vercel/output/functions/index.segments/_full.segment.rsc.prerender-config.json +28 -0
  425. package/.vercel/output/functions/index.segments/_full.segment.rsc.prerender-fallback.rsc +25 -0
  426. package/.vercel/output/functions/index.segments/_head.segment.rsc.prerender-config.json +28 -0
  427. package/.vercel/output/functions/index.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  428. package/.vercel/output/functions/index.segments/_index.segment.rsc.prerender-config.json +28 -0
  429. package/.vercel/output/functions/index.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  430. package/.vercel/output/functions/index.segments/_tree.segment.rsc.prerender-config.json +28 -0
  431. package/.vercel/output/functions/index.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  432. package/.vercel/output/functions/login.prerender-config.json +37 -0
  433. package/.vercel/output/functions/login.prerender-fallback.html +6 -0
  434. package/.vercel/output/functions/login.rsc.prerender-config.json +38 -0
  435. package/.vercel/output/functions/login.rsc.prerender-fallback.rsc +27 -0
  436. package/.vercel/output/functions/login.segments/_full.segment.rsc.prerender-config.json +28 -0
  437. package/.vercel/output/functions/login.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  438. package/.vercel/output/functions/login.segments/_head.segment.rsc.prerender-config.json +28 -0
  439. package/.vercel/output/functions/login.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  440. package/.vercel/output/functions/login.segments/_index.segment.rsc.prerender-config.json +28 -0
  441. package/.vercel/output/functions/login.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  442. package/.vercel/output/functions/login.segments/_tree.segment.rsc.prerender-config.json +28 -0
  443. package/.vercel/output/functions/login.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  444. package/.vercel/output/functions/login.segments/login/__PAGE__.segment.rsc.prerender-config.json +28 -0
  445. package/.vercel/output/functions/login.segments/login/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  446. package/.vercel/output/functions/login.segments/login.segment.rsc.prerender-config.json +28 -0
  447. package/.vercel/output/functions/login.segments/login.segment.rsc.prerender-fallback.rsc +5 -0
  448. package/.vercel/output/functions/logs.prerender-config.json +37 -0
  449. package/.vercel/output/functions/logs.prerender-fallback.html +12 -0
  450. package/.vercel/output/functions/logs.rsc.prerender-config.json +38 -0
  451. package/.vercel/output/functions/logs.rsc.prerender-fallback.rsc +27 -0
  452. package/.vercel/output/functions/logs.segments/_full.segment.rsc.prerender-config.json +28 -0
  453. package/.vercel/output/functions/logs.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  454. package/.vercel/output/functions/logs.segments/_head.segment.rsc.prerender-config.json +28 -0
  455. package/.vercel/output/functions/logs.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  456. package/.vercel/output/functions/logs.segments/_index.segment.rsc.prerender-config.json +28 -0
  457. package/.vercel/output/functions/logs.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  458. package/.vercel/output/functions/logs.segments/_tree.segment.rsc.prerender-config.json +28 -0
  459. package/.vercel/output/functions/logs.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  460. package/.vercel/output/functions/logs.segments/logs/__PAGE__.segment.rsc.prerender-config.json +28 -0
  461. package/.vercel/output/functions/logs.segments/logs/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  462. package/.vercel/output/functions/logs.segments/logs.segment.rsc.prerender-config.json +28 -0
  463. package/.vercel/output/functions/logs.segments/logs.segment.rsc.prerender-fallback.rsc +5 -0
  464. package/.vercel/output/functions/manifest.webmanifest.func/.next/routes-manifest.json +1 -0
  465. package/.vercel/output/functions/manifest.webmanifest.func/.next/server/app-paths-manifest.json +1 -0
  466. package/.vercel/output/functions/manifest.webmanifest.func/.next/server/pages-manifest.json +1 -0
  467. package/.vercel/output/functions/manifest.webmanifest.func/.vc-config.json +715 -0
  468. package/.vercel/output/functions/manifest.webmanifest.func/___next_launcher.cjs +68 -0
  469. package/.vercel/output/functions/manifest.webmanifest.prerender-config.json +38 -0
  470. package/.vercel/output/functions/manifest.webmanifest.prerender-fallback.body +1 -0
  471. package/.vercel/output/functions/messages.prerender-config.json +37 -0
  472. package/.vercel/output/functions/messages.prerender-fallback.html +12 -0
  473. package/.vercel/output/functions/messages.rsc.prerender-config.json +38 -0
  474. package/.vercel/output/functions/messages.rsc.prerender-fallback.rsc +27 -0
  475. package/.vercel/output/functions/messages.segments/_full.segment.rsc.prerender-config.json +28 -0
  476. package/.vercel/output/functions/messages.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  477. package/.vercel/output/functions/messages.segments/_head.segment.rsc.prerender-config.json +28 -0
  478. package/.vercel/output/functions/messages.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  479. package/.vercel/output/functions/messages.segments/_index.segment.rsc.prerender-config.json +28 -0
  480. package/.vercel/output/functions/messages.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  481. package/.vercel/output/functions/messages.segments/_tree.segment.rsc.prerender-config.json +28 -0
  482. package/.vercel/output/functions/messages.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  483. package/.vercel/output/functions/messages.segments/messages/__PAGE__.segment.rsc.prerender-config.json +28 -0
  484. package/.vercel/output/functions/messages.segments/messages/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  485. package/.vercel/output/functions/messages.segments/messages.segment.rsc.prerender-config.json +28 -0
  486. package/.vercel/output/functions/messages.segments/messages.segment.rsc.prerender-fallback.rsc +5 -0
  487. package/.vercel/output/functions/node.prerender-config.json +37 -0
  488. package/.vercel/output/functions/node.prerender-fallback.html +12 -0
  489. package/.vercel/output/functions/node.rsc.prerender-config.json +38 -0
  490. package/.vercel/output/functions/node.rsc.prerender-fallback.rsc +27 -0
  491. package/.vercel/output/functions/node.segments/_full.segment.rsc.prerender-config.json +28 -0
  492. package/.vercel/output/functions/node.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  493. package/.vercel/output/functions/node.segments/_head.segment.rsc.prerender-config.json +28 -0
  494. package/.vercel/output/functions/node.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  495. package/.vercel/output/functions/node.segments/_index.segment.rsc.prerender-config.json +28 -0
  496. package/.vercel/output/functions/node.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  497. package/.vercel/output/functions/node.segments/_tree.segment.rsc.prerender-config.json +28 -0
  498. package/.vercel/output/functions/node.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  499. package/.vercel/output/functions/node.segments/node/__PAGE__.segment.rsc.prerender-config.json +28 -0
  500. package/.vercel/output/functions/node.segments/node/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  501. package/.vercel/output/functions/node.segments/node.segment.rsc.prerender-config.json +28 -0
  502. package/.vercel/output/functions/node.segments/node.segment.rsc.prerender-fallback.rsc +5 -0
  503. package/.vercel/output/functions/nodes.prerender-config.json +37 -0
  504. package/.vercel/output/functions/nodes.prerender-fallback.html +12 -0
  505. package/.vercel/output/functions/nodes.rsc.prerender-config.json +38 -0
  506. package/.vercel/output/functions/nodes.rsc.prerender-fallback.rsc +27 -0
  507. package/.vercel/output/functions/nodes.segments/_full.segment.rsc.prerender-config.json +28 -0
  508. package/.vercel/output/functions/nodes.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  509. package/.vercel/output/functions/nodes.segments/_head.segment.rsc.prerender-config.json +28 -0
  510. package/.vercel/output/functions/nodes.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  511. package/.vercel/output/functions/nodes.segments/_index.segment.rsc.prerender-config.json +28 -0
  512. package/.vercel/output/functions/nodes.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  513. package/.vercel/output/functions/nodes.segments/_tree.segment.rsc.prerender-config.json +28 -0
  514. package/.vercel/output/functions/nodes.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  515. package/.vercel/output/functions/nodes.segments/nodes/__PAGE__.segment.rsc.prerender-config.json +28 -0
  516. package/.vercel/output/functions/nodes.segments/nodes/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  517. package/.vercel/output/functions/nodes.segments/nodes.segment.rsc.prerender-config.json +28 -0
  518. package/.vercel/output/functions/nodes.segments/nodes.segment.rsc.prerender-fallback.rsc +5 -0
  519. package/.vercel/output/functions/server-logs.prerender-config.json +37 -0
  520. package/.vercel/output/functions/server-logs.prerender-fallback.html +12 -0
  521. package/.vercel/output/functions/server-logs.rsc.prerender-config.json +38 -0
  522. package/.vercel/output/functions/server-logs.rsc.prerender-fallback.rsc +27 -0
  523. package/.vercel/output/functions/server-logs.segments/_full.segment.rsc.prerender-config.json +28 -0
  524. package/.vercel/output/functions/server-logs.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  525. package/.vercel/output/functions/server-logs.segments/_head.segment.rsc.prerender-config.json +28 -0
  526. package/.vercel/output/functions/server-logs.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  527. package/.vercel/output/functions/server-logs.segments/_index.segment.rsc.prerender-config.json +28 -0
  528. package/.vercel/output/functions/server-logs.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  529. package/.vercel/output/functions/server-logs.segments/_tree.segment.rsc.prerender-config.json +28 -0
  530. package/.vercel/output/functions/server-logs.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  531. package/.vercel/output/functions/server-logs.segments/server-logs/__PAGE__.segment.rsc.prerender-config.json +28 -0
  532. package/.vercel/output/functions/server-logs.segments/server-logs/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  533. package/.vercel/output/functions/server-logs.segments/server-logs.segment.rsc.prerender-config.json +28 -0
  534. package/.vercel/output/functions/server-logs.segments/server-logs.segment.rsc.prerender-fallback.rsc +5 -0
  535. package/.vercel/output/functions/servers.prerender-config.json +37 -0
  536. package/.vercel/output/functions/servers.prerender-fallback.html +12 -0
  537. package/.vercel/output/functions/servers.rsc.prerender-config.json +38 -0
  538. package/.vercel/output/functions/servers.rsc.prerender-fallback.rsc +27 -0
  539. package/.vercel/output/functions/servers.segments/_full.segment.rsc.prerender-config.json +28 -0
  540. package/.vercel/output/functions/servers.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  541. package/.vercel/output/functions/servers.segments/_head.segment.rsc.prerender-config.json +28 -0
  542. package/.vercel/output/functions/servers.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  543. package/.vercel/output/functions/servers.segments/_index.segment.rsc.prerender-config.json +28 -0
  544. package/.vercel/output/functions/servers.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  545. package/.vercel/output/functions/servers.segments/_tree.segment.rsc.prerender-config.json +28 -0
  546. package/.vercel/output/functions/servers.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  547. package/.vercel/output/functions/servers.segments/servers/__PAGE__.segment.rsc.prerender-config.json +28 -0
  548. package/.vercel/output/functions/servers.segments/servers/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  549. package/.vercel/output/functions/servers.segments/servers.segment.rsc.prerender-config.json +28 -0
  550. package/.vercel/output/functions/servers.segments/servers.segment.rsc.prerender-fallback.rsc +5 -0
  551. package/.vercel/output/functions/settings/networks.prerender-config.json +37 -0
  552. package/.vercel/output/functions/settings/networks.prerender-fallback.html +12 -0
  553. package/.vercel/output/functions/settings/networks.rsc.prerender-config.json +38 -0
  554. package/.vercel/output/functions/settings/networks.rsc.prerender-fallback.rsc +27 -0
  555. package/.vercel/output/functions/settings/networks.segments/_full.segment.rsc.prerender-config.json +28 -0
  556. package/.vercel/output/functions/settings/networks.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  557. package/.vercel/output/functions/settings/networks.segments/_head.segment.rsc.prerender-config.json +28 -0
  558. package/.vercel/output/functions/settings/networks.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  559. package/.vercel/output/functions/settings/networks.segments/_index.segment.rsc.prerender-config.json +28 -0
  560. package/.vercel/output/functions/settings/networks.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  561. package/.vercel/output/functions/settings/networks.segments/_tree.segment.rsc.prerender-config.json +28 -0
  562. package/.vercel/output/functions/settings/networks.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  563. package/.vercel/output/functions/settings/networks.segments/settings/networks/__PAGE__.segment.rsc.prerender-config.json +28 -0
  564. package/.vercel/output/functions/settings/networks.segments/settings/networks/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  565. package/.vercel/output/functions/settings/networks.segments/settings/networks.segment.rsc.prerender-config.json +28 -0
  566. package/.vercel/output/functions/settings/networks.segments/settings/networks.segment.rsc.prerender-fallback.rsc +5 -0
  567. package/.vercel/output/functions/settings/networks.segments/settings.segment.rsc.prerender-config.json +28 -0
  568. package/.vercel/output/functions/settings/networks.segments/settings.segment.rsc.prerender-fallback.rsc +5 -0
  569. package/.vercel/output/functions/settings/tokens.prerender-config.json +37 -0
  570. package/.vercel/output/functions/settings/tokens.prerender-fallback.html +12 -0
  571. package/.vercel/output/functions/settings/tokens.rsc.prerender-config.json +38 -0
  572. package/.vercel/output/functions/settings/tokens.rsc.prerender-fallback.rsc +27 -0
  573. package/.vercel/output/functions/settings/tokens.segments/_full.segment.rsc.prerender-config.json +28 -0
  574. package/.vercel/output/functions/settings/tokens.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  575. package/.vercel/output/functions/settings/tokens.segments/_head.segment.rsc.prerender-config.json +28 -0
  576. package/.vercel/output/functions/settings/tokens.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  577. package/.vercel/output/functions/settings/tokens.segments/_index.segment.rsc.prerender-config.json +28 -0
  578. package/.vercel/output/functions/settings/tokens.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  579. package/.vercel/output/functions/settings/tokens.segments/_tree.segment.rsc.prerender-config.json +28 -0
  580. package/.vercel/output/functions/settings/tokens.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  581. package/.vercel/output/functions/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc.prerender-config.json +28 -0
  582. package/.vercel/output/functions/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  583. package/.vercel/output/functions/settings/tokens.segments/settings/tokens.segment.rsc.prerender-config.json +28 -0
  584. package/.vercel/output/functions/settings/tokens.segments/settings/tokens.segment.rsc.prerender-fallback.rsc +5 -0
  585. package/.vercel/output/functions/settings/tokens.segments/settings.segment.rsc.prerender-config.json +28 -0
  586. package/.vercel/output/functions/settings/tokens.segments/settings.segment.rsc.prerender-fallback.rsc +5 -0
  587. package/.vercel/output/functions/settings.prerender-config.json +37 -0
  588. package/.vercel/output/functions/settings.prerender-fallback.html +12 -0
  589. package/.vercel/output/functions/settings.rsc.prerender-config.json +38 -0
  590. package/.vercel/output/functions/settings.rsc.prerender-fallback.rsc +27 -0
  591. package/.vercel/output/functions/settings.segments/_full.segment.rsc.prerender-config.json +28 -0
  592. package/.vercel/output/functions/settings.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  593. package/.vercel/output/functions/settings.segments/_head.segment.rsc.prerender-config.json +28 -0
  594. package/.vercel/output/functions/settings.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  595. package/.vercel/output/functions/settings.segments/_index.segment.rsc.prerender-config.json +28 -0
  596. package/.vercel/output/functions/settings.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  597. package/.vercel/output/functions/settings.segments/_tree.segment.rsc.prerender-config.json +28 -0
  598. package/.vercel/output/functions/settings.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  599. package/.vercel/output/functions/settings.segments/settings/__PAGE__.segment.rsc.prerender-config.json +28 -0
  600. package/.vercel/output/functions/settings.segments/settings/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  601. package/.vercel/output/functions/settings.segments/settings.segment.rsc.prerender-config.json +28 -0
  602. package/.vercel/output/functions/settings.segments/settings.segment.rsc.prerender-fallback.rsc +5 -0
  603. package/.vercel/output/functions/tasks/[id].func/.next/routes-manifest.json +1 -0
  604. package/.vercel/output/functions/tasks/[id].func/.next/server/app-paths-manifest.json +1 -0
  605. package/.vercel/output/functions/tasks/[id].func/.next/server/pages-manifest.json +1 -0
  606. package/.vercel/output/functions/tasks/[id].func/.vc-config.json +713 -0
  607. package/.vercel/output/functions/tasks/[id].func/___next_launcher.cjs +68 -0
  608. package/.vercel/output/functions/tasks.prerender-config.json +37 -0
  609. package/.vercel/output/functions/tasks.prerender-fallback.html +12 -0
  610. package/.vercel/output/functions/tasks.rsc.prerender-config.json +38 -0
  611. package/.vercel/output/functions/tasks.rsc.prerender-fallback.rsc +27 -0
  612. package/.vercel/output/functions/tasks.segments/_full.segment.rsc.prerender-config.json +28 -0
  613. package/.vercel/output/functions/tasks.segments/_full.segment.rsc.prerender-fallback.rsc +27 -0
  614. package/.vercel/output/functions/tasks.segments/_head.segment.rsc.prerender-config.json +28 -0
  615. package/.vercel/output/functions/tasks.segments/_head.segment.rsc.prerender-fallback.rsc +6 -0
  616. package/.vercel/output/functions/tasks.segments/_index.segment.rsc.prerender-config.json +28 -0
  617. package/.vercel/output/functions/tasks.segments/_index.segment.rsc.prerender-fallback.rsc +10 -0
  618. package/.vercel/output/functions/tasks.segments/_tree.segment.rsc.prerender-config.json +28 -0
  619. package/.vercel/output/functions/tasks.segments/_tree.segment.rsc.prerender-fallback.rsc +5 -0
  620. package/.vercel/output/functions/tasks.segments/tasks/__PAGE__.segment.rsc.prerender-config.json +28 -0
  621. package/.vercel/output/functions/tasks.segments/tasks/__PAGE__.segment.rsc.prerender-fallback.rsc +9 -0
  622. package/.vercel/output/functions/tasks.segments/tasks.segment.rsc.prerender-config.json +28 -0
  623. package/.vercel/output/functions/tasks.segments/tasks.segment.rsc.prerender-fallback.rsc +5 -0
  624. package/.vercel/output/static/404.html +12 -0
  625. package/.vercel/output/static/404.rsc.json +1 -0
  626. package/.vercel/output/static/404.segments/_tree.segment.rsc.json +1 -0
  627. package/.vercel/output/static/500.html +1 -0
  628. package/.vercel/output/static/500.rsc.json +1 -0
  629. package/.vercel/output/static/500.segments/_tree.segment.rsc.json +1 -0
  630. package/.vercel/output/static/_next/__private/trace +2 -0
  631. package/.vercel/output/static/_next/static/TakLsJFW-DjjhsqoZu3Ok/_buildManifest.js +11 -0
  632. package/.vercel/output/static/_next/static/TakLsJFW-DjjhsqoZu3Ok/_clientMiddlewareManifest.js +42 -0
  633. package/.vercel/output/static/_next/static/TakLsJFW-DjjhsqoZu3Ok/_ssgManifest.js +1 -0
  634. package/.vercel/output/static/_next/static/chunks/00~h525bo.q7f.js +1 -0
  635. package/.vercel/output/static/_next/static/chunks/01xlw8hd842-c.js +1 -0
  636. package/.vercel/output/static/_next/static/chunks/0257pdz1-imal.js +2 -0
  637. package/.vercel/output/static/_next/static/chunks/03~yq9q893hmn.js +1 -0
  638. package/.vercel/output/static/_next/static/chunks/04uju~n5s9g7..css +1 -0
  639. package/.vercel/output/static/_next/static/chunks/066jf0nk75nic.css +2 -0
  640. package/.vercel/output/static/_next/static/chunks/085gdrlppedvd.js +1 -0
  641. package/.vercel/output/static/_next/static/chunks/0a5rikwbpt8_7.js +4 -0
  642. package/.vercel/output/static/_next/static/chunks/0b9r.-87w.lvh.js +1 -0
  643. package/.vercel/output/static/_next/static/chunks/0ced2tacwy8v7.js +1 -0
  644. package/.vercel/output/static/_next/static/chunks/0e-.zgw81gela.js +31 -0
  645. package/.vercel/output/static/_next/static/chunks/0gu130fpple04.js +1 -0
  646. package/.vercel/output/static/_next/static/chunks/0jmypv56.iwft.js +1 -0
  647. package/.vercel/output/static/_next/static/chunks/0krr-nvdwqdj1.js +1 -0
  648. package/.vercel/output/static/_next/static/chunks/0mqs00d_9jvzx.js +1 -0
  649. package/.vercel/output/static/_next/static/chunks/0ore4vqiwv2nx.js +1 -0
  650. package/.vercel/output/static/_next/static/chunks/0pqt~8bl3ukh4.js +4 -0
  651. package/.vercel/output/static/_next/static/chunks/0q.t7da_-e4yl.js +4 -0
  652. package/.vercel/output/static/_next/static/chunks/0q3rj30g1oodv.js +7 -0
  653. package/.vercel/output/static/_next/static/chunks/0qp3_l.t4nzzq.js +1 -0
  654. package/.vercel/output/static/_next/static/chunks/0qy1ci2dqfaqg.js +1 -0
  655. package/.vercel/output/static/_next/static/chunks/0u359llqm1_01.js +1 -0
  656. package/.vercel/output/static/_next/static/chunks/0u7ftv8celiqa.js +1 -0
  657. package/.vercel/output/static/_next/static/chunks/0~ijg-d65glam.js +1 -0
  658. package/.vercel/output/static/_next/static/chunks/14bsg3_-taiw4.js +1 -0
  659. package/.vercel/output/static/_next/static/chunks/168q2d2bi7swr.js +7 -0
  660. package/.vercel/output/static/_next/static/chunks/16aqsgrwba4zk.js +1 -0
  661. package/.vercel/output/static/_next/static/chunks/16tw8s4cce9_x.js +1 -0
  662. package/.vercel/output/static/_next/static/chunks/turbopack-01f1xs~cq_~si.js +1 -0
  663. package/.vercel/output/static/_next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
  664. package/.vercel/output/static/_next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
  665. package/.vercel/output/static/_next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
  666. package/.vercel/output/static/_next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
  667. package/.vercel/output/static/_next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
  668. package/.vercel/output/static/_next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
  669. package/.vercel/output/static/_next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
  670. package/.vercel/output/static/_next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
  671. package/.vercel/output/static/_next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
  672. package/.vercel/output/static/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
  673. package/.vercel/output/static/_next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
  674. package/.vercel/output/static/_next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
  675. package/.vercel/output/static/_next/static/not-found.txt +1 -0
  676. package/.vercel/project.json +16 -0
  677. package/AGENTS.md +9 -0
  678. package/CLAUDE.md +1 -0
  679. package/README.md +1 -0
  680. package/app/api/anet/host-supervisors/route.ts +63 -2
  681. package/app/api/anet/node-config/route.ts +145 -168
  682. package/app/api/hub/people/route.ts +48 -0
  683. package/app/api/hub/requirements/[id]/checklist/[itemId]/route.ts +54 -0
  684. package/app/api/hub/requirements/[id]/comments/route.ts +51 -0
  685. package/app/api/hub/requirements/[id]/route.ts +89 -0
  686. package/app/api/hub/requirements/events/route.ts +45 -0
  687. package/app/api/hub/requirements/route.ts +53 -0
  688. package/app/components/CreateNodeWizard.tsx +7 -2
  689. package/app/components/HostSupervisorPicker.tsx +76 -29
  690. package/app/components/NodeLifecycleMenu.tsx +6 -1
  691. package/app/components/NodeSettingsPanel.tsx +28 -25
  692. package/app/components/Sidebar.tsx +4 -0
  693. package/app/components/TaskChatPanel.tsx +6 -6
  694. package/app/components/TaskDetail.tsx +8 -7
  695. package/app/components/TaskList.tsx +6 -7
  696. package/app/components/TopoGraph.tsx +3 -2
  697. package/app/lib/time.ts +23 -0
  698. package/app/org/page.tsx +222 -0
  699. package/app/providers/page.tsx +23 -4
  700. package/app/requirements/[id]/page.tsx +361 -0
  701. package/app/requirements/page.tsx +279 -0
  702. package/app/scheduled-tasks/page.tsx +98 -13
  703. package/app/settings/networks/page.tsx +9 -1
  704. package/app/settings/tokens/page.tsx +21 -1
  705. package/apps/desktop/icon.png +0 -0
  706. package/bun.lock +1688 -0
  707. package/electron-builder.json +5 -1
  708. package/package.json +4 -2
  709. package/proxy.ts +1 -0
  710. package/.next/server/chunks/ssr/[root-of-the-server]__0dwa10z._.js +0 -11
  711. package/.next/server/chunks/ssr/[root-of-the-server]__0dwa10z._.js.map +0 -1
  712. package/.next/server/chunks/ssr/[root-of-the-server]__202xetf._.js +0 -11
  713. package/.next/server/chunks/ssr/[root-of-the-server]__202xetf._.js.map +0 -1
  714. package/.next/server/chunks/ssr/app_081zy6c._.js.map +0 -1
  715. package/.next/server/chunks/ssr/app_0x7s72b._.js.map +0 -1
  716. package/.next/static/chunks/0pton-t_-fqyu.css +0 -1
  717. package/.next/static/chunks/0z8vfpga444t1.js +0 -1
  718. package/.next/static/chunks/2kp8-5cyc-jbg.js +0 -1
  719. package/.next/static/chunks/2mlxk28w-tx84.js +0 -0
  720. package/.next/static/chunks/3a53_ky07bdhz.js +0 -9
  721. package/.next/static/chunks/3im40-b21df3u.js +0 -2
  722. package/.next/static/chunks/3tnbxlq42_jjv.js +0 -1
  723. /package/.next/server/chunks/ssr/{app_0_s8u96._.js.map → app_07bzc6w._.js.map} +0 -0
  724. /package/.next/server/chunks/ssr/{app_0o4bxq0._.js.map → app_0g7oz9w._.js.map} +0 -0
  725. /package/.next/server/chunks/ssr/{app_1oxcq68._.js.map → app_1e91uc-._.js.map} +0 -0
  726. /package/.next/server/chunks/ssr/{app_1psh956._.js.map → app_1f96aq_._.js.map} +0 -0
  727. /package/.next/server/chunks/ssr/{app_0_dhiwi._.js.map → app_1ua57bx._.js.map} +0 -0
  728. /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → _HZB6K84VKNaxf1K7dqqj}/_buildManifest.js +0 -0
  729. /package/.next/static/{w9hvPuZKgr_FWvwa8gcX8 → _HZB6K84VKNaxf1K7dqqj}/_ssgManifest.js +0 -0
@@ -0,0 +1,53 @@
1
+ import { requireDashboardAuth, getV3UserToken } from '@/app/lib/dashboard-auth';
2
+
3
+ const HUB_URL = process.env.COMMHUB_URL || 'http://127.0.0.1:9200';
4
+
5
+ async function hubHeaders(): Promise<Record<string, string>> {
6
+ const userToken = await getV3UserToken();
7
+ const h: Record<string, string> = {};
8
+ if (userToken) h['Authorization'] = `Bearer ${userToken}`;
9
+ return h;
10
+ }
11
+
12
+ /**
13
+ * Requirements (需求) list proxy — #1633.
14
+ *
15
+ * The dashboard has always been about dispatch tasks (/api/tasks); the
16
+ * requirement board people actually work from had no route here at all.
17
+ * Hub side is a plain REST read, so this stays a thin proxy: filters in,
18
+ * `{ok, requirements[], has_more, next_cursor}` out, no reshaping.
19
+ */
20
+ export async function GET(req: Request) {
21
+ const authFailure = await requireDashboardAuth();
22
+ if (authFailure) return authFailure;
23
+
24
+ const { searchParams } = new URL(req.url);
25
+ const params = new URLSearchParams();
26
+ for (const key of ['status', 'tag', 'project_id', 'owner', 'agent_owner', 'q', 'limit', 'cursor', 'view', 'parent_id']) {
27
+ const value = searchParams.get(key);
28
+ if (value) params.set(key, value);
29
+ }
30
+ if (!params.has('limit')) params.set('limit', '100');
31
+ if (!params.has('view')) params.set('view', 'summary');
32
+
33
+ try {
34
+ const res = await fetch(`${HUB_URL}/api/requirements?${params.toString()}`, {
35
+ headers: await hubHeaders(),
36
+ next: { revalidate: 0 },
37
+ });
38
+ const contentType = res.headers.get('content-type') || '';
39
+ if (!contentType.includes('application/json')) {
40
+ return Response.json(
41
+ { ok: false, error: 'hub_not_json', status: res.status },
42
+ { status: 502 },
43
+ );
44
+ }
45
+ const data = await res.json();
46
+ return Response.json(data, { status: res.status });
47
+ } catch (e: unknown) {
48
+ return Response.json(
49
+ { ok: false, error: 'CommHub unreachable', detail: e instanceof Error ? e.message : String(e) },
50
+ { status: 502 },
51
+ );
52
+ }
53
+ }
@@ -17,7 +17,7 @@ import { DaemonOption, HostSupervisorPicker } from './HostSupervisorPicker';
17
17
  * The wizard now ALWAYS passes daemon_node_id to /api/anet/node-create (the
18
18
  * route's `resolveLocalDaemonNodeId` fallback only fires if daemon_node_id is
19
19
  * absent — kept for back-compat with non-wizard callers but no longer used
20
- * from this flow). Per [[feedback_doc_capability_claim_verify_code_path]] —
20
+ * from this flow). Per 「文档宣称的能力必须对着代码路径逐条验证」这条判据 —
21
21
  * the API contract is exercised locally before any prod hub touches the path.
22
22
  */
23
23
 
@@ -113,6 +113,11 @@ export function CreateNodeWizard({
113
113
  const busy = phase === 'creating';
114
114
 
115
115
  async function handleCreate() {
116
+ if (!daemonNodeId) {
117
+ setPhase('error');
118
+ setMsg('创建失败:请先选择一台有 daemon 在线的服务器');
119
+ return;
120
+ }
116
121
  setPhase('creating');
117
122
  setMsg('');
118
123
  const numOrUndef = (v: string) => (v.trim() === '' ? undefined : Number(v));
@@ -139,7 +144,7 @@ export function CreateNodeWizard({
139
144
  headers: { 'Content-Type': 'application/json' },
140
145
  body: JSON.stringify({
141
146
  node_spec,
142
- ...(daemonNodeId ? { daemon_node_id: daemonNodeId } : {}),
147
+ daemon_node_id: daemonNodeId,
143
148
  ...(networkId ? { network_id: networkId } : {}),
144
149
  }),
145
150
  });
@@ -20,7 +20,7 @@ import { useEffect, useState } from 'react';
20
20
  * Data shape mirrors `/api/anet/host-supervisors`, which in turn mirrors the
21
21
  * hub's GET /api/host-supervisors (#338 PR2 — needs commhub-server@0.9.0-preview.8+).
22
22
  * On `unconfirmed` (older hub), we degrade honestly to an upgrade hint — never
23
- * show a fake empty list. Per [[feedback_doc_capability_claim_verify_code_path]].
23
+ * show a fake empty list. Per 「文档宣称的能力必须对着代码路径逐条验证」这条判据.
24
24
  */
25
25
 
26
26
  export interface DaemonOption {
@@ -41,12 +41,20 @@ export interface DaemonOption {
41
41
  };
42
42
  }
43
43
 
44
+ interface HostOption {
45
+ hostname: string;
46
+ status?: 'online' | 'offline';
47
+ daemon: DaemonOption | null;
48
+ has_daemon: boolean;
49
+ }
50
+
44
51
  interface PickResponse {
45
52
  ok: boolean;
46
53
  unconfirmed?: boolean;
47
54
  error?: string;
48
55
  count: number;
49
56
  daemons: DaemonOption[];
57
+ hosts?: HostOption[];
50
58
  selected?: string | null;
51
59
  }
52
60
 
@@ -66,6 +74,7 @@ export function HostSupervisorPicker({
66
74
  }) {
67
75
  const [state, setState] = useState<LoadState>('loading');
68
76
  const [daemons, setDaemons] = useState<DaemonOption[]>([]);
77
+ const [hosts, setHosts] = useState<HostOption[]>([]);
69
78
  const [errMsg, setErrMsg] = useState('');
70
79
  const [forcePicker, setForcePicker] = useState(false);
71
80
 
@@ -84,16 +93,24 @@ export function HostSupervisorPicker({
84
93
  setState('unconfirmed');
85
94
  setErrMsg(body?.error || 'hub /api/host-supervisors unavailable — upgrade to >=0.9.0-preview.8');
86
95
  setDaemons([]);
96
+ setHosts([]);
87
97
  return;
88
98
  }
89
99
  if (!body?.ok) {
90
100
  setState('error');
91
101
  setErrMsg(body?.error || `hub ${status}`);
92
102
  setDaemons([]);
103
+ setHosts([]);
93
104
  return;
94
105
  }
95
106
  const list = Array.isArray(body.daemons) ? body.daemons : [];
107
+ const hostList = Array.isArray(body.hosts) ? body.hosts : list.map(d => ({
108
+ hostname: d.hostname || d.alias || d.daemon_node_id,
109
+ daemon: d,
110
+ has_daemon: true,
111
+ }));
96
112
  setDaemons(list);
113
+ setHosts(hostList);
97
114
  setState('ready');
98
115
  // count=1 auto-pick: preselect the only daemon. count≥2 leaves the
99
116
  // selection to the user (parent value stays null until click).
@@ -104,6 +121,7 @@ export function HostSupervisorPicker({
104
121
  setState('error');
105
122
  setErrMsg(e instanceof Error ? e.message : String(e));
106
123
  setDaemons([]);
124
+ setHosts([]);
107
125
  });
108
126
  return () => { alive = false; };
109
127
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -144,7 +162,7 @@ export function HostSupervisorPicker({
144
162
  }
145
163
 
146
164
  // count=0 — onboarding
147
- if (daemons.length === 0) {
165
+ if (daemons.length === 0 && hosts.length === 0) {
148
166
  return (
149
167
  <div className="rounded-md border border-[#26262b] bg-[#0e0e10] px-3 py-4 text-xs text-gray-300">
150
168
  <div className="text-sm font-semibold text-gray-200">还没有可用的 host_supervisor 节点</div>
@@ -161,7 +179,7 @@ anet daemon up my-daemon`}</pre>
161
179
  }
162
180
 
163
181
  // count=1 — auto-pick (collapsed). User can opt into picker via "换一个 →".
164
- if (daemons.length === 1 && !forcePicker) {
182
+ if (daemons.length === 1 && hosts.length === 1 && !forcePicker) {
165
183
  const d = daemons[0];
166
184
  return (
167
185
  <div className="rounded-md border border-cyan-700/40 bg-cyan-900/10 px-3 py-3 text-xs text-cyan-100">
@@ -192,8 +210,8 @@ anet daemon up my-daemon`}</pre>
192
210
  return (
193
211
  <div className="space-y-2">
194
212
  <div className="flex items-center justify-between text-xs text-gray-400">
195
- <span>选择一台 host_supervisor 节点({daemons.length} 台在线)</span>
196
- {forcePicker && daemons.length === 1 && (
213
+ <span>选择一台服务器({daemons.length} 台 daemon 在线)</span>
214
+ {forcePicker && daemons.length === 1 && hosts.length === 1 && (
197
215
  <button
198
216
  type="button"
199
217
  onClick={() => setForcePicker(false)}
@@ -204,12 +222,12 @@ anet daemon up my-daemon`}</pre>
204
222
  )}
205
223
  </div>
206
224
  <div className="grid grid-cols-1 gap-2 md:grid-cols-2 lg:grid-cols-3">
207
- {daemons.map(d => (
208
- <DaemonCard
209
- key={d.daemon_node_id}
210
- daemon={d}
211
- selected={d.daemon_node_id === value}
212
- onClick={() => onChange(d.daemon_node_id, d)}
225
+ {hosts.map(h => (
226
+ <HostCard
227
+ key={h.hostname}
228
+ host={h}
229
+ selected={Boolean(h.daemon && h.daemon.daemon_node_id === value)}
230
+ onPick={() => h.daemon && onChange(h.daemon.daemon_node_id, h.daemon)}
213
231
  />
214
232
  ))}
215
233
  </div>
@@ -219,21 +237,19 @@ anet daemon up my-daemon`}</pre>
219
237
 
220
238
  // ───── subcomponents ──────────────────────────────────────────────────
221
239
 
222
- function DaemonCard({
223
- daemon,
240
+ function HostCard({
241
+ host,
224
242
  selected,
225
- onClick,
243
+ onPick,
226
244
  }: {
227
- daemon: DaemonOption;
245
+ host: HostOption;
228
246
  selected: boolean;
229
- onClick: () => void;
247
+ onPick: () => void;
230
248
  }) {
231
- const alert = daemon.host_telemetry?.alert_level || 'gray';
249
+ const daemon = host.daemon;
250
+ const alert = daemon?.host_telemetry?.alert_level || (host.status === 'online' ? 'green' : 'gray');
232
251
  return (
233
- <button
234
- type="button"
235
- onClick={onClick}
236
- aria-pressed={selected}
252
+ <div
237
253
  className={`flex w-full flex-col gap-1.5 rounded-md border px-3 py-2.5 text-left text-xs transition-colors ${
238
254
  selected
239
255
  ? 'border-cyan-600 bg-cyan-900/15 text-cyan-100'
@@ -241,18 +257,49 @@ function DaemonCard({
241
257
  }`}
242
258
  >
243
259
  <div className="flex items-center justify-between gap-2">
244
- <span className="truncate font-semibold">{daemon.alias}</span>
260
+ <span className="truncate font-semibold">{host.hostname}</span>
245
261
  <AlertChip level={alert} />
246
262
  </div>
247
- <div className="truncate text-[11px] text-gray-500">{daemon.hostname || '—'}</div>
248
- <RuntimeList runtimes={daemon.runtimes_supported} />
249
- {(daemon.host_telemetry?.cpu_cores != null || daemon.host_telemetry?.mem_gb != null) && (
250
- <div className="flex gap-3 text-[10px] text-gray-500">
251
- {daemon.host_telemetry?.cpu_cores != null && <span>{daemon.host_telemetry.cpu_cores} 核</span>}
252
- {daemon.host_telemetry?.mem_gb != null && <span>{daemon.host_telemetry.mem_gb} GB</span>}
263
+ <div className="flex flex-wrap gap-x-3 gap-y-1 text-[10px] text-gray-500">
264
+ <span>{host.status === 'online' ? 'online' : host.status === 'offline' ? 'offline' : 'status unknown'}</span>
265
+ </div>
266
+ {daemon ? (
267
+ <>
268
+ <div className="truncate text-[11px] text-gray-500">daemon: {daemon.alias}</div>
269
+ <RuntimeList runtimes={daemon.runtimes_supported} />
270
+ <button
271
+ type="button"
272
+ onClick={onPick}
273
+ aria-pressed={selected}
274
+ className="mt-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium"
275
+ style={{
276
+ background: selected ? '#0891b2' : '#1c1c1f',
277
+ color: selected ? '#ffffff' : '#67e8f9',
278
+ }}
279
+ >
280
+ {selected ? '已选择这台服务器' : '在这台服务器创建'}
281
+ </button>
282
+ </>
283
+ ) : (
284
+ <div
285
+ className="mt-1 rounded-md border px-2 py-2"
286
+ style={{ borderColor: 'rgb(245 158 11 / 0.35)', background: 'rgb(245 158 11 / 0.10)', color: '#fef3c7' }}
287
+ >
288
+ <div className="font-semibold">无 daemon,不能在这里创建节点</div>
289
+ <div className="mt-0.5 text-[11px]" style={{ color: 'rgb(253 230 138 / 0.75)' }}>
290
+ 去这台服务器的终端安装并启动 daemon 后再回来选择。
291
+ </div>
292
+ <button
293
+ type="button"
294
+ onClick={() => navigator.clipboard?.writeText(`anet daemon up ${host.hostname}-daemon`).catch(() => {})}
295
+ className="mt-2 rounded-md px-2 py-1 text-[11px] font-medium"
296
+ style={{ background: 'rgb(217 119 6 / 0.20)', color: '#fde68a' }}
297
+ >
298
+ 复制安装命令
299
+ </button>
253
300
  </div>
254
301
  )}
255
- </button>
302
+ </div>
256
303
  );
257
304
  }
258
305
 
@@ -71,7 +71,12 @@ const normalizeState = (s: LifecycleState | null | undefined): LifecycleState =>
71
71
  export function useLifecycleCaps(): Record<string, boolean> | null {
72
72
  const { data } = useSWR<{ ok: boolean; tools?: Record<string, boolean> }>(
73
73
  '/api/anet/node-lifecycle',
74
- (url: string) => fetch(url).then(r => r.json()),
74
+ // Non-2xx must reject, or SWR treats an error payload as data.
75
+ async (url: string) => {
76
+ const r = await fetch(url);
77
+ if (!r.ok) throw new Error(`HTTP ${r.status}`);
78
+ return r.json();
79
+ },
75
80
  { revalidateOnFocus: false, dedupingInterval: 60_000, shouldRetryOnError: false },
76
81
  );
77
82
  return data?.ok && data.tools ? data.tools : null;
@@ -22,20 +22,21 @@ import { useLifecycleCaps } from './NodeLifecycleMenu';
22
22
  * `update_node_config` with a minimal diff `patch` + `base_revision`.
23
23
  * Channels ride inside the same patch — the tool schema is
24
24
  * { model?, flags?, channels? }.
25
- * - **Apply lifecycle (revision-compare)**: saving → applying → applied |
26
- * timeout | error. After the POST is accepted the panel polls the snapshot
27
- * and treats `config_revision > base_revision` as applied (the node wrote
28
- * its config + reported back). `apply_mode` (hot / restart) flavours the
29
- * progress copy. Stale-hardened (runId guard + first-terminal-wins + hard
30
- * 30s ceiling). update_node_config error codes map to UI messages.
25
+ * - **Apply lifecycle (node ack via revision bump)**: saving → applying →
26
+ * applied | timeout | error. After the POST is accepted the panel polls the
27
+ * config snapshot and treats `config_revision > base_revision` as applied.
28
+ * That revision bump is written after the node-side get_config_update /
29
+ * ack_config_update path completes. `apply_mode` (hot / restart) flavours
30
+ * the progress copy. Stale-hardened (runId guard + first-terminal-wins +
31
+ * hard 30s ceiling). update_node_config error codes map to UI messages.
31
32
  * - **Channel red-line**: only the on/off flip is on the wire. Per-channel
32
33
  * bot token / app secret / allowFrom stay in the node's local config.json
33
34
  * and are shown here as masked read-only (StubField).
34
35
  * - **Still P2 stub**: D 运维 ops buttons other than restart (rename/stop/
35
36
  * delete) — gated on RFC-024 rename + RFC-027 stop/delete backends.
36
37
  *
37
- * If the hub is unreachable the GET mock-falls back (no `config_revision`) and
38
- * the panel disables Save with an honest note. `config_update_capable:false`
38
+ * If the hub/config tools are unreachable the panel disables Save with an
39
+ * honest note. `config_update_capable:false`
39
40
  * (node not under a W1 supervisor) surfaces a "重启类改动可能不生效" warning.
40
41
  * Runtime + imageCapable stay read-only (auto-derived).
41
42
  */
@@ -102,13 +103,10 @@ const DEFAULT_FLAGS: FlagsForm = {
102
103
  // F3 apply lifecycle. A save flows:
103
104
  // idle → saving (POST in flight) → applying (config dispatched, node
104
105
  // restarting / taking effect) → applied | rejected | timeout.
105
- // `error` = the save POST itself failed. The `mock` flag flavours the terminal
106
- // copy when the hub tool isn't deployed (the lifecycle is then simulated on
107
- // local timers rather than polled).
106
+ // `error` = the save POST failed or the backend cannot confirm apply.
108
107
  type ApplyPhase = 'idle' | 'saving' | 'applying' | 'applied' | 'rejected' | 'timeout' | 'error';
109
108
 
110
- // Real-backend apply-status poll cadence + ceiling. The mock path uses its own
111
- // short timers instead of polling (the route would only ever return pending).
109
+ // Real-backend apply-status poll cadence + ceiling.
112
110
  const APPLY_POLL_MS = 1500;
113
111
  const APPLY_TIMEOUT_MS = 30000;
114
112
  // Auto-dismiss the success strip after this long.
@@ -405,10 +403,9 @@ export function NodeSettingsPanel({ session: s, onClose, positioning = 'fixed' }
405
403
  const loadedChannelsRef = useRef<Set<string>>(channelSet(s.channels));
406
404
  const [capable, setCapable] = useState(true);
407
405
  const [snapUnavailable, setSnapUnavailable] = useState(false);
408
- // ---- apply lifecycle (revision-compare) ----
406
+ // ---- apply lifecycle (node ack observed through config_revision) ----
409
407
  const [phase, setPhase] = useState<ApplyPhase>('idle');
410
408
  const [phaseMsg, setPhaseMsg] = useState('');
411
- const [phaseMock, setPhaseMock] = useState(false);
412
409
  // ---- M1 node lifecycle actions (restart wired to RFC-024 restart_node;
413
410
  // rename/stop/delete gated on backend → shown as 即将支持). Self-contained,
414
411
  // independent of the config apply lifecycle above.
@@ -419,7 +416,7 @@ export function NodeSettingsPanel({ session: s, onClose, positioning = 'fixed' }
419
416
  const lifecycleCaps = useLifecycleCaps();
420
417
  const [renameVal, setRenameVal] = useState('');
421
418
  const [applyMode, setApplyMode] = useState<string | null>(null);
422
- // Outstanding lifecycle timers (mock progression, real poll, auto-dismiss);
419
+ // Outstanding lifecycle timers (real poll, auto-dismiss);
423
420
  // cleared on unmount and at the start of each new save so a stale timer can't
424
421
  // overwrite a fresh result.
425
422
  const timersRef = useRef<ReturnType<typeof setTimeout>[]>([]);
@@ -510,9 +507,9 @@ export function NodeSettingsPanel({ session: s, onClose, positioning = 'fixed' }
510
507
  const res = await fetch(`/api/anet/node-config?node_id=${encodeURIComponent(nodeKey)}`, { cache: 'no-store' });
511
508
  const data = await res.json().catch(() => ({}));
512
509
  if (cancelled || !mounted.current) return;
513
- // No readable revision (hub down / mock fallback / node error) → can't
510
+ // No readable revision (hub/config tool error) → can't
514
511
  // safely write; flag so Save disables with an honest note.
515
- if (data?.ok === false || data?.mock || typeof data?.config_revision !== 'number') {
512
+ if (data?.ok === false || typeof data?.config_revision !== 'number') {
516
513
  setSnapUnavailable(true);
517
514
  }
518
515
  syncFromSnapshot(data);
@@ -607,21 +604,27 @@ export function NodeSettingsPanel({ session: s, onClose, positioning = 'fixed' }
607
604
 
608
605
  setPhase('saving');
609
606
  setPhaseMsg('');
610
- setPhaseMock(false);
611
607
 
612
- // Apply = config_revision bump. Poll GET snapshot, compare against the
613
- // base_revision we sent; a bump means the node applied + reported back.
608
+ // Apply = config_revision bump. The node performs get_config_update /
609
+ // ack_config_update; the dashboard observes the resulting snapshot fact.
614
610
  const poll = (startedAt: number) => {
615
611
  after(APPLY_POLL_MS, async () => {
616
612
  if (!isCurrent(runId) || settledRef.current) return;
617
613
  let snap: Record<string, unknown> | null = null;
618
614
  try {
619
- const { data } = await fetchJson(`/api/anet/node-config?node_id=${encodeURIComponent(nodeKey)}`, { cache: 'no-store' }, FETCH_TIMEOUT_MS);
615
+ const { res, data } = await fetchJson(`/api/anet/node-config?node_id=${encodeURIComponent(nodeKey)}&base_revision=${encodeURIComponent(String(baseRevision))}`, { cache: 'no-store' }, FETCH_TIMEOUT_MS);
616
+ if (!res.ok || data?.ok === false) {
617
+ settle(runId, () => {
618
+ setPhase('error');
619
+ setPhaseMsg(`${mapUpdateError(data)}。当前请用 anet node 在目标机器上修改。`);
620
+ });
621
+ return;
622
+ }
620
623
  if (typeof data?.config_revision === 'number') snap = data;
621
624
  } catch { /* transient — retry until the 30s ceiling */ }
622
625
  if (!isCurrent(runId) || settledRef.current) return;
623
626
  if (snap && (snap.config_revision as number) > baseRevision) {
624
- syncFromSnapshot(snap); // re-sync form + base_revision to the applied state
627
+ syncFromSnapshot(snap);
625
628
  finishApplied(runId);
626
629
  return;
627
630
  }
@@ -643,7 +646,7 @@ export function NodeSettingsPanel({ session: s, onClose, positioning = 'fixed' }
643
646
  if (!r.res.ok || d?.ok === false) {
644
647
  settledRef.current = true;
645
648
  setPhase('error');
646
- setPhaseMsg(mapUpdateError(d));
649
+ setPhaseMsg(`${mapUpdateError(d)}。当前请用 anet node 在目标机器上修改。`);
647
650
  // On a revision conflict, refresh the snapshot so a retry uses the
648
651
  // latest base_revision (and the form shows the other writer's values).
649
652
  if (d?.error === 'revision_conflict') {
@@ -659,7 +662,7 @@ export function NodeSettingsPanel({ session: s, onClose, positioning = 'fixed' }
659
662
  if (!isCurrent(runId)) return;
660
663
  settledRef.current = true;
661
664
  setPhase('error');
662
- setPhaseMsg(isAbort(e) ? '保存超时,请重试' : e instanceof Error ? `保存失败:${e.message}` : '保存失败');
665
+ setPhaseMsg(isAbort(e) ? '保存超时,请重试' : e instanceof Error ? `保存失败:${e.message}。当前请用 anet node 在目标机器上修改。` : '保存失败。当前请用 anet node 在目标机器上修改。');
663
666
  return;
664
667
  }
665
668
 
@@ -52,6 +52,10 @@ const NAV_ITEMS = [
52
52
  { href: '/scheduled-tasks', label: 'Schedules', icon: 'M12 6v6l4 2m5-2a9 9 0 11-18 0 9 9 0 0118 0z' },
53
53
  { href: '/skillhub', label: 'SkillHub', icon: 'M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5s3.332.477 4.5 1.253v13C19.832 18.477 18.246 18 16.5 18s-3.332.477-4.5 1.253' },
54
54
  { href: '/tasks', label: 'Tasks', icon: 'M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4' },
55
+ // #1633 — 需求池/进行中/完成。Tasks 是「谁派给谁」,这里是「大家在做的需求」。
56
+ { href: '/requirements', label: 'Requirements', icon: 'M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2M9 9h6M9 13h6M9 17h3' },
57
+ // #1635 — 人 + 部门 + 名下 Agent(数据源与 MCP requirements_people 同源)。
58
+ { href: '/org', label: 'Organization', icon: 'M17 20h5v-2a4 4 0 00-3-3.87M9 20H4v-2a4 4 0 013-3.87m6-1.13a4 4 0 10-4-4 4 4 0 004 4zm6 0a3 3 0 10-2.6-4.5M9 7a3 3 0 10-2.6 4.5' },
55
59
  { href: '/servers', label: 'Servers', icon: 'M4 6.5A2.5 2.5 0 016.5 4h11A2.5 2.5 0 0120 6.5v1A2.5 2.5 0 0117.5 10h-11A2.5 2.5 0 014 7.5v-1zM4 16.5A2.5 2.5 0 016.5 14h11a2.5 2.5 0 012.5 2.5v1a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 014 17.5v-1zM7 7h.01M7 17h.01' },
56
60
  { href: '/providers', label: 'Providers', icon: 'M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z' },
57
61
  { href: '/admin', label: 'Admin', icon: 'M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z' },
@@ -661,7 +661,6 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
661
661
  const [pollingIds, setPollingIds] = useState<Set<string>>(new Set());
662
662
  const [historyLoaded, setHistoryLoaded] = useState(false);
663
663
  const [historyError, setHistoryError] = useState(false);
664
- const [targetAlias, setTargetAlias] = useState(alias);
665
664
  const [showMentions, setShowMentions] = useState(false);
666
665
  const [mentionIndex, setMentionIndex] = useState(0);
667
666
  // R23→R25: pinyin matching moved to the shared lib (also powers /nodes
@@ -773,9 +772,6 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
773
772
  }).catch(() => {});
774
773
  }, [availableNodes]);
775
774
 
776
- // Reset target when alias changes
777
- useEffect(() => { setTargetAlias(alias); }, [alias]);
778
-
779
775
  // Loop R9 (微信草稿): unsent text survives closing the panel, switching
780
776
  // conversations and refreshing, per conversation. Text only — File
781
777
  // attachments can't be serialized. The debounced write covers "typing,
@@ -1143,7 +1139,11 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1143
1139
  const send = async () => {
1144
1140
  if ((!input.trim() && attachedFiles.length === 0) || sending) return;
1145
1141
  let taskContent = input.trim();
1146
- let sendTo = targetAlias;
1142
+ // `alias` is the target rendered in the panel header. Do not mirror it in
1143
+ // effect-synchronised state: after switching the singleton chat popover,
1144
+ // React can render the new header one frame before that effect runs, and
1145
+ // an immediate send would otherwise be delivered to the previous node.
1146
+ let sendTo = alias;
1147
1147
 
1148
1148
  // Parse @mention at start: "@NodeName rest of message"
1149
1149
  const atMatch = taskContent.match(/^@(\S+)\s+([\s\S]+)/);
@@ -1787,7 +1787,7 @@ export function TaskChatPanel({ alias, onClose, inline, availableNodes, active }
1787
1787
  </div>
1788
1788
  )}
1789
1789
  <div className="hidden sm:flex justify-between text-[9px] text-[var(--fg-dim)] mt-1.5">
1790
- <span>{input.includes('@') ? `Sending to: ${targetAlias}` : `Type @ to mention another node`}</span>
1790
+ <span>{input.includes('@') ? `Sending to: ${alias}` : `Type @ to mention another node`}</span>
1791
1791
  <span>Enter to send · paste image</span>
1792
1792
  </div>
1793
1793
  </div>
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useState } from 'react';
4
+ import { relativeAgo } from '../lib/time';
4
5
  import useSWR from 'swr';
5
6
  import { AliasAvatar } from './AliasAvatar';
6
7
  import { STATUS_CHIP_CLASS as STATUS_CHIP } from '../lib/status';
@@ -69,14 +70,14 @@ function isDeliveryStaleObservation(event: TaskEvent): boolean {
69
70
  const POLL_TASK_MS = 5000;
70
71
  const POLL_EVENTS_MS = 10000;
71
72
 
73
+ // Round 38 / Round 44 已经把时间戳解析统一到 lib/time;这里是漏网的一处。
74
+ // 旧的内联写法对**已经是 ISO** 的输入会补成 "…ZZ" → Date.parse 得 NaN
75
+ // → 后续 `NaN < 60` 全 false,一路落到最后一行显示 "NaNd ago"。
76
+ // 现在 hub 只发裸 SQL,所以那条路径尚未发生;这是提前关掉它。
77
+ // 同时拿到 relativeAgo 的时钟偏移兜底(未来时间戳 → 'just now',而不是负数)。
78
+
72
79
  function timeAgo(dateStr: string): string {
73
- if (!dateStr) return '--';
74
- const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();
75
- const s = Math.floor(diff / 1000);
76
- if (s < 60) return `${s}s ago`;
77
- if (s < 3600) return `${Math.floor(s / 60)}m ago`;
78
- if (s < 86400) return `${Math.floor(s / 3600)}h ago`;
79
- return `${Math.floor(s / 86400)}d ago`;
80
+ return relativeAgo(dateStr) ?? '--';
80
81
  }
81
82
 
82
83
  function priorityClass(priority: string) {
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { AliasAvatar } from './AliasAvatar';
4
+ import { relativeAgo } from '../lib/time';
4
5
  import { previewContent } from './utils';
5
6
  import { STATUS_CHIP_CLASS, STATUS_DOT_HEX } from '../lib/status';
6
7
 
@@ -25,14 +26,12 @@ export interface TaskListItem {
25
26
  created_at: string;
26
27
  }
27
28
 
29
+ // 同 TaskDetail:统一到 lib/time,关掉 ISO→"…ZZ"→NaN 那条路径。
30
+ // 注意这里的输出**不带 " ago" 后缀**(列表里空间紧),所以要把后缀去掉,
31
+ // 保持既有视觉不变。
28
32
  function timeAgo(dateStr: string): string {
29
- if (!dateStr) return '--';
30
- const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();
31
- const s = Math.floor(diff / 1000);
32
- if (s < 60) return `${s}s`;
33
- if (s < 3600) return `${Math.floor(s / 60)}m`;
34
- if (s < 86400) return `${Math.floor(s / 3600)}h`;
35
- return `${Math.floor(s / 86400)}d`;
33
+ const v = relativeAgo(dateStr);
34
+ return v === null ? '--' : v.replace(/ ago$/, '');
36
35
  }
37
36
 
38
37
  export function TaskList({
@@ -8,7 +8,7 @@ import { aliasAvatarColors, aliasInitial } from './AliasAvatar';
8
8
  import { getAvatarUrl, useAvatarsVersion } from '../lib/avatars';
9
9
  import { ChatPopover } from './ChatPopover';
10
10
  import { vendorForModel, runtimeIdentity, identityLine } from '../lib/vendorIdentity';
11
- import { parseHubTime, relativeAgo } from '../lib/time';
11
+ import { parseHubTime, relativeAgo, NODE_STALE_MS } from '../lib/time';
12
12
  import { DASHBOARD_VERSION } from '../lib/version';
13
13
  import { useChatUnread } from '../lib/chat-unread';
14
14
  import { isOnline as presenceIsOnline, sseCountFor as presenceSseCountFor } from '../lib/presence';
@@ -835,7 +835,8 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
835
835
  // healthy agent heartbeats every few seconds; if it's been silent for
836
836
  // an hour it's effectively gone. 1 h gives a fresh disconnect time to
837
837
  // come back while removing dead nodes well within an operator session.
838
- const GHOST_MS = 60 * 60 * 1000;
838
+ // 阈值提到 app/lib/time.ts 共享,避免这里和节点选择器各飘各的(#751)。
839
+ const GHOST_MS = NODE_STALE_MS;
839
840
  const now = Date.now();
840
841
  // #515 note: isGhost is deliberately NOT converted to presenceIsOnline —
841
842
  // it's a different concept (age-based pruning of stale offline nodes) and
package/app/lib/time.ts CHANGED
@@ -21,6 +21,29 @@ export function parseHubTime(dateStr: string | null | undefined): number | null
21
21
  return Number.isFinite(t) ? t : null;
22
22
  }
23
23
 
24
+ /** 一个节点静默多久算「陈旧」。
25
+ *
26
+ * 这个阈值原本只活在 TopoGraph 里(Round 27 / P0 把它从 24h 收到 1h:
27
+ * 健康 agent 每几秒心跳一次,静默一小时基本等于没了)。但同一份节点数据
28
+ * 有多个入口,而只有拓扑图知道这个阈值 —— 定时任务的节点选择器完全不知道,
29
+ * 于是下拉框里几个月前的死节点和刚心跳过的节点长得一模一样。
30
+ *
31
+ * 实测(2026-08-13 生产):171 个节点里 110 个 `updated_at` 超过一小时,
32
+ * 最久的停在三个月前,而 **171/171 的 `lifecycle_state` 都是 "active"** ——
33
+ * 除了时间戳,没有任何字段能分辨(hub 侧见 #751)。
34
+ *
35
+ * 提到这里是为了让两个入口不会各飘各的。注意**只有阈值可共享**:
36
+ * TopoGraph 的 `isGhost` 还要求 `status === 'offline'` 且无 SSE 连接,
37
+ * 那些字段 `/api/nodes` 不返回,不能照搬。 */
38
+ export const NODE_STALE_MS = 60 * 60 * 1000;
39
+
40
+ /** 按 `NODE_STALE_MS` 判断一个 hub 时间戳是否已陈旧。
41
+ * 时间戳缺失/不可解析时返回 false —— 保守:宁可不标记,也不误标一个新节点。 */
42
+ export function isHubTimeStale(dateStr: string | null | undefined): boolean {
43
+ const t = parseHubTime(dateStr);
44
+ return t !== null && Date.now() - t > NODE_STALE_MS;
45
+ }
46
+
24
47
  /** Format `dateStr` as a short relative-time string ("6m ago" / "2h ago").
25
48
  * Future timestamps (clock skew) collapse to "just now". Returns null when
26
49
  * the input doesn't parse — callers can decide on a fallback. */