@sleep2agi/agent-network-dashboard 0.5.7-preview.7 → 0.5.7-preview.73

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 (376) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +0 -1
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/diagnostics/route-bundle-stats.json +65 -65
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/routes-manifest.json +0 -6
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found/page/next-font-manifest.json +2 -1
  16. package/.next/server/app/_not-found/page.js +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 +4 -4
  20. package/.next/server/app/_not-found.rsc +16 -16
  21. package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
  22. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  23. package/.next/server/app/_not-found.segments/_index.segment.rsc +9 -9
  24. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  26. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
  27. package/.next/server/app/admin/page/next-font-manifest.json +2 -1
  28. package/.next/server/app/admin/page.js +1 -1
  29. package/.next/server/app/admin/page.js.nft.json +1 -1
  30. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/admin.html +4 -4
  32. package/.next/server/app/admin.rsc +20 -19
  33. package/.next/server/app/admin.segments/_full.segment.rsc +20 -19
  34. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  35. package/.next/server/app/admin.segments/_index.segment.rsc +9 -9
  36. package/.next/server/app/admin.segments/_tree.segment.rsc +5 -4
  37. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  38. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  39. package/.next/server/app/index.html +4 -4
  40. package/.next/server/app/index.rsc +20 -19
  41. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  42. package/.next/server/app/index.segments/_full.segment.rsc +20 -19
  43. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  44. package/.next/server/app/index.segments/_index.segment.rsc +9 -9
  45. package/.next/server/app/index.segments/_tree.segment.rsc +5 -4
  46. package/.next/server/app/login/page/next-font-manifest.json +2 -1
  47. package/.next/server/app/login/page.js +1 -1
  48. package/.next/server/app/login/page.js.nft.json +1 -1
  49. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  50. package/.next/server/app/login.html +2 -2
  51. package/.next/server/app/login.rsc +20 -19
  52. package/.next/server/app/login.segments/_full.segment.rsc +20 -19
  53. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  54. package/.next/server/app/login.segments/_index.segment.rsc +9 -9
  55. package/.next/server/app/login.segments/_tree.segment.rsc +5 -4
  56. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  57. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  58. package/.next/server/app/logs/page/next-font-manifest.json +2 -1
  59. package/.next/server/app/logs/page.js +1 -1
  60. package/.next/server/app/logs/page.js.nft.json +1 -1
  61. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  62. package/.next/server/app/logs.html +4 -4
  63. package/.next/server/app/logs.rsc +20 -19
  64. package/.next/server/app/logs.segments/_full.segment.rsc +20 -19
  65. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  66. package/.next/server/app/logs.segments/_index.segment.rsc +9 -9
  67. package/.next/server/app/logs.segments/_tree.segment.rsc +5 -4
  68. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  69. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  70. package/.next/server/app/manifest.webmanifest.body +1 -1
  71. package/.next/server/app/messages/page/next-font-manifest.json +2 -1
  72. package/.next/server/app/messages/page.js +1 -1
  73. package/.next/server/app/messages/page.js.nft.json +1 -1
  74. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/messages.html +4 -4
  76. package/.next/server/app/messages.rsc +20 -19
  77. package/.next/server/app/messages.segments/_full.segment.rsc +20 -19
  78. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  79. package/.next/server/app/messages.segments/_index.segment.rsc +9 -9
  80. package/.next/server/app/messages.segments/_tree.segment.rsc +5 -4
  81. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  82. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  83. package/.next/server/app/node/page/next-font-manifest.json +2 -1
  84. package/.next/server/app/node/page.js +1 -1
  85. package/.next/server/app/node/page.js.nft.json +1 -1
  86. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  87. package/.next/server/app/node.html +4 -4
  88. package/.next/server/app/node.rsc +20 -19
  89. package/.next/server/app/node.segments/_full.segment.rsc +20 -19
  90. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  91. package/.next/server/app/node.segments/_index.segment.rsc +9 -9
  92. package/.next/server/app/node.segments/_tree.segment.rsc +5 -4
  93. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  94. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  95. package/.next/server/app/nodes/page/next-font-manifest.json +2 -1
  96. package/.next/server/app/nodes/page.js +1 -1
  97. package/.next/server/app/nodes/page.js.nft.json +1 -1
  98. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  99. package/.next/server/app/nodes.html +4 -4
  100. package/.next/server/app/nodes.rsc +20 -19
  101. package/.next/server/app/nodes.segments/_full.segment.rsc +20 -19
  102. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  103. package/.next/server/app/nodes.segments/_index.segment.rsc +9 -9
  104. package/.next/server/app/nodes.segments/_tree.segment.rsc +5 -4
  105. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  106. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  107. package/.next/server/app/page/next-font-manifest.json +2 -1
  108. package/.next/server/app/page.js +1 -1
  109. package/.next/server/app/page.js.nft.json +1 -1
  110. package/.next/server/app/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/server-logs/page/next-font-manifest.json +2 -1
  112. package/.next/server/app/server-logs/page.js +1 -1
  113. package/.next/server/app/server-logs/page.js.nft.json +1 -1
  114. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/server-logs.html +4 -4
  116. package/.next/server/app/server-logs.rsc +20 -19
  117. package/.next/server/app/server-logs.segments/_full.segment.rsc +20 -19
  118. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  119. package/.next/server/app/server-logs.segments/_index.segment.rsc +9 -9
  120. package/.next/server/app/server-logs.segments/_tree.segment.rsc +5 -4
  121. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  122. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  123. package/.next/server/app/servers/page/next-font-manifest.json +2 -1
  124. package/.next/server/app/servers/page.js +1 -1
  125. package/.next/server/app/servers/page.js.nft.json +1 -1
  126. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  127. package/.next/server/app/servers.html +4 -4
  128. package/.next/server/app/servers.rsc +20 -19
  129. package/.next/server/app/servers.segments/_full.segment.rsc +20 -19
  130. package/.next/server/app/servers.segments/_head.segment.rsc +4 -4
  131. package/.next/server/app/servers.segments/_index.segment.rsc +9 -9
  132. package/.next/server/app/servers.segments/_tree.segment.rsc +5 -4
  133. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +4 -4
  134. package/.next/server/app/servers.segments/servers.segment.rsc +3 -3
  135. package/.next/server/app/settings/networks/page/next-font-manifest.json +2 -1
  136. package/.next/server/app/settings/networks/page.js +1 -1
  137. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  138. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  139. package/.next/server/app/settings/networks.html +4 -4
  140. package/.next/server/app/settings/networks.rsc +20 -19
  141. package/.next/server/app/settings/networks.segments/_full.segment.rsc +20 -19
  142. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  143. package/.next/server/app/settings/networks.segments/_index.segment.rsc +9 -9
  144. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +5 -4
  145. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  146. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  147. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  148. package/.next/server/app/settings/page/next-font-manifest.json +2 -1
  149. package/.next/server/app/settings/page.js +1 -1
  150. package/.next/server/app/settings/page.js.nft.json +1 -1
  151. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/settings/tokens/page/next-font-manifest.json +2 -1
  153. package/.next/server/app/settings/tokens/page.js +1 -1
  154. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  155. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/settings/tokens.html +4 -4
  157. package/.next/server/app/settings/tokens.rsc +20 -19
  158. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +20 -19
  159. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  160. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +9 -9
  161. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +5 -4
  162. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  163. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  164. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  165. package/.next/server/app/settings.html +4 -4
  166. package/.next/server/app/settings.rsc +20 -19
  167. package/.next/server/app/settings.segments/_full.segment.rsc +20 -19
  168. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  169. package/.next/server/app/settings.segments/_index.segment.rsc +9 -9
  170. package/.next/server/app/settings.segments/_tree.segment.rsc +5 -4
  171. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  172. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  173. package/.next/server/app/tasks/[id]/page/next-font-manifest.json +2 -1
  174. package/.next/server/app/tasks/[id]/page.js +1 -1
  175. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  176. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  177. package/.next/server/app/tasks/page/next-font-manifest.json +2 -1
  178. package/.next/server/app/tasks/page.js +1 -1
  179. package/.next/server/app/tasks/page.js.nft.json +1 -1
  180. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  181. package/.next/server/app/tasks.html +4 -4
  182. package/.next/server/app/tasks.rsc +20 -19
  183. package/.next/server/app/tasks.segments/_full.segment.rsc +20 -19
  184. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  185. package/.next/server/app/tasks.segments/_index.segment.rsc +9 -9
  186. package/.next/server/app/tasks.segments/_tree.segment.rsc +5 -4
  187. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  188. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  189. package/.next/server/app-paths-manifest.json +0 -1
  190. package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js +1 -1
  191. package/.next/server/chunks/00jm_next_dist_0ju_ux9._.js.map +1 -1
  192. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js +1 -1
  193. package/.next/server/chunks/ssr/[root-of-the-server]__030vg4n._.js.map +1 -1
  194. package/.next/server/chunks/ssr/[root-of-the-server]__04gz75y._.js +3 -0
  195. package/.next/server/chunks/ssr/[root-of-the-server]__04gz75y._.js.map +1 -0
  196. package/.next/server/chunks/ssr/[root-of-the-server]__05kf31s._.js +3 -0
  197. package/.next/server/chunks/ssr/[root-of-the-server]__05kf31s._.js.map +1 -0
  198. package/.next/server/chunks/ssr/[root-of-the-server]__096ytyk._.js +3 -0
  199. package/.next/server/chunks/ssr/[root-of-the-server]__096ytyk._.js.map +1 -0
  200. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +1 -1
  201. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -1
  202. package/.next/server/chunks/ssr/[root-of-the-server]__0u4-66w._.js +8 -0
  203. package/.next/server/chunks/ssr/[root-of-the-server]__0u4-66w._.js.map +1 -0
  204. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +3 -3
  205. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  206. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  207. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  208. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  209. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  210. package/.next/server/chunks/ssr/agent-network-dashboard_app_0_870i8._.js +3 -0
  211. package/.next/server/chunks/ssr/agent-network-dashboard_app_0_870i8._.js.map +1 -0
  212. package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js +1 -1
  213. package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js.map +1 -1
  214. package/.next/server/chunks/ssr/agent-network-dashboard_app_0fjlnh~._.js +3 -0
  215. package/.next/server/chunks/ssr/agent-network-dashboard_app_0fjlnh~._.js.map +1 -0
  216. package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js +9 -0
  217. package/.next/server/chunks/ssr/agent-network-dashboard_app_0gd.4pc._.js.map +1 -0
  218. package/.next/server/chunks/ssr/agent-network-dashboard_app_0wn4jc5._.js +3 -0
  219. package/.next/server/chunks/ssr/agent-network-dashboard_app_0wn4jc5._.js.map +1 -0
  220. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +1 -1
  221. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -1
  222. package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js +1 -1
  223. package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -1
  224. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +1 -1
  225. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js.map +1 -1
  226. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0r7kb.o._.js +9 -0
  227. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0r7kb.o._.js.map +1 -0
  228. package/.next/server/chunks/ssr/agent-network-dashboard_app_servers_page_tsx_0jib5qm._.js +1 -1
  229. package/.next/server/chunks/ssr/agent-network-dashboard_app_servers_page_tsx_0jib5qm._.js.map +1 -1
  230. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js +1 -1
  231. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map +1 -1
  232. package/.next/server/middleware-build-manifest.js +3 -3
  233. package/.next/server/next-font-manifest.js +1 -1
  234. package/.next/server/next-font-manifest.json +30 -15
  235. package/.next/server/pages/404.html +4 -4
  236. package/.next/server/pages/500.html +1 -1
  237. package/.next/server/server-reference-manifest.js +1 -1
  238. package/.next/server/server-reference-manifest.json +1 -1
  239. package/.next/static/chunks/0..h8s._z~uek.js +1 -0
  240. package/.next/static/chunks/0.mh8n0itrii5.js +1 -0
  241. package/.next/static/chunks/{0jp~cs9-zkmqa.js → 00b4y77vxfabl.js} +1 -1
  242. package/.next/static/chunks/049vx3qljs1tt.js +1 -0
  243. package/.next/static/chunks/066jf0nk75nic.css +2 -0
  244. package/.next/static/chunks/06vp7429lrzl7.js +1 -0
  245. package/.next/static/chunks/06xxn73qy0qiz.js +7 -0
  246. package/.next/static/chunks/0_bn~gcrgo.4n.js +1 -0
  247. package/.next/static/chunks/0_tvbie.c68h5.js +1 -0
  248. package/.next/static/chunks/0cp0cz3mxejl~.js +4 -0
  249. package/.next/static/chunks/0g4d-_fi-d9hg.js +1 -0
  250. package/.next/static/chunks/0scww97p6z5z..css +1 -0
  251. package/.next/static/chunks/0shtnff1p8hzw.js +1 -0
  252. package/.next/static/chunks/0wz0122ym_gr3.js +1 -0
  253. package/.next/static/chunks/0y5gol09tlu63.js +1 -0
  254. package/.next/static/chunks/13l-ngu707546.js +1 -0
  255. package/.next/static/chunks/14141xj5.1t3t.js +1 -0
  256. package/.next/static/chunks/149a4l50_3vw-.js +7 -0
  257. package/.next/static/chunks/152_p6jt7txp6.js +1 -0
  258. package/.next/static/chunks/15hos-r_t7doi.js +1 -0
  259. package/.next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
  260. package/.next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
  261. package/.next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
  262. package/.next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
  263. package/.next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
  264. package/.next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
  265. package/.next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
  266. package/.next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
  267. package/.next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
  268. package/.next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
  269. package/.next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
  270. package/.next/trace +2 -2
  271. package/.next/trace-build +1 -1
  272. package/.next/types/routes.d.ts +1 -2
  273. package/.next/types/validator.ts +0 -9
  274. package/app/admin/page.tsx +53 -38
  275. package/app/components/AgentCard.tsx +36 -20
  276. package/app/components/AppShell.tsx +7 -1
  277. package/app/components/ChatPopover.tsx +1 -1
  278. package/app/components/CollapsibleSearch.tsx +127 -0
  279. package/app/components/CommandCenter.tsx +14 -4
  280. package/app/components/CommandPalette.tsx +6 -6
  281. package/app/components/DispatchPanel.tsx +13 -10
  282. package/app/components/EmptyState.tsx +19 -4
  283. package/app/components/HealthBanner.tsx +28 -4
  284. package/app/components/HelpOverlay.tsx +4 -7
  285. package/app/components/LoadingSkeleton.tsx +31 -21
  286. package/app/components/MobileNav.tsx +28 -21
  287. package/app/components/Sidebar.tsx +30 -23
  288. package/app/components/StatsBar.tsx +69 -42
  289. package/app/components/TaskChatPanel.tsx +19 -5
  290. package/app/components/TaskDrawer.tsx +9 -7
  291. package/app/components/ThemeSwitcher.tsx +15 -79
  292. package/app/components/TopoGraph.tsx +31 -21
  293. package/app/components/UserBar.tsx +5 -5
  294. package/app/globals.css +1757 -1776
  295. package/app/layout.tsx +37 -4
  296. package/app/lib/hooks.ts +0 -5
  297. package/app/lib/status.ts +24 -17
  298. package/app/login/page.tsx +7 -7
  299. package/app/logs/page.tsx +12 -6
  300. package/app/manifest.ts +2 -2
  301. package/app/messages/page.tsx +67 -47
  302. package/app/node/page.tsx +27 -17
  303. package/app/nodes/page.tsx +62 -49
  304. package/app/page.tsx +60 -282
  305. package/app/server-logs/page.tsx +40 -14
  306. package/app/servers/page.tsx +33 -12
  307. package/app/settings/networks/page.tsx +17 -15
  308. package/app/settings/page.tsx +102 -96
  309. package/app/settings/tokens/page.tsx +5 -5
  310. package/app/tasks/[id]/page.tsx +10 -10
  311. package/app/tasks/page.tsx +58 -34
  312. package/bin/start.js +0 -0
  313. package/package.json +1 -1
  314. package/public/favicon.svg +1 -1
  315. package/public/manifest.webmanifest +24 -0
  316. package/public/robots.txt +7 -0
  317. package/.next/server/app/api/hub/license/route/app-paths-manifest.json +0 -3
  318. package/.next/server/app/api/hub/license/route/build-manifest.json +0 -9
  319. package/.next/server/app/api/hub/license/route/server-reference-manifest.json +0 -4
  320. package/.next/server/app/api/hub/license/route.js +0 -7
  321. package/.next/server/app/api/hub/license/route.js.map +0 -5
  322. package/.next/server/app/api/hub/license/route.js.nft.json +0 -1
  323. package/.next/server/app/api/hub/license/route_client-reference-manifest.js +0 -3
  324. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js +0 -3
  325. package/.next/server/chunks/0ykm__next-internal_server_app_api_hub_license_route_actions_0a4.fuh.js.map +0 -1
  326. package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js +0 -3
  327. package/.next/server/chunks/[root-of-the-server]__0rovr5-._.js.map +0 -1
  328. package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js +0 -8
  329. package/.next/server/chunks/ssr/[root-of-the-server]__0lu1wok._.js.map +0 -1
  330. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +0 -3
  331. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +0 -1
  332. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +0 -3
  333. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +0 -1
  334. package/.next/server/chunks/ssr/[root-of-the-server]__11fu-5m._.js +0 -3
  335. package/.next/server/chunks/ssr/[root-of-the-server]__11fu-5m._.js.map +0 -1
  336. package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js +0 -3
  337. package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.js.map +0 -1
  338. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +0 -3
  339. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +0 -1
  340. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +0 -9
  341. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +0 -1
  342. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0s5uqlp._.js +0 -9
  343. package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0s5uqlp._.js.map +0 -1
  344. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js +0 -3
  345. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map +0 -1
  346. package/.next/static/chunks/0-mpa_947ipeq.js +0 -1
  347. package/.next/static/chunks/02to42x11p557.js +0 -7
  348. package/.next/static/chunks/03~5pxwbxxw-b.js +0 -1
  349. package/.next/static/chunks/04~fkia6-79k3.js +0 -1
  350. package/.next/static/chunks/0561vp5-q5.zp.js +0 -1
  351. package/.next/static/chunks/05uk96gc~9mni.js +0 -1
  352. package/.next/static/chunks/085rejlait1fs.js +0 -1
  353. package/.next/static/chunks/0a.9~-nf0gpec.js +0 -1
  354. package/.next/static/chunks/0im751o4n61c7.js +0 -1
  355. package/.next/static/chunks/0inql3s9ldyx5.js +0 -1
  356. package/.next/static/chunks/0ku0fjqlm9mca.js +0 -1
  357. package/.next/static/chunks/0mcamnu4w_x1r.js +0 -4
  358. package/.next/static/chunks/0ss8u23bnbyry.js +0 -1
  359. package/.next/static/chunks/0~rv5y.y5my9s.css +0 -1
  360. package/.next/static/chunks/13yktdzuatx3d.js +0 -1
  361. package/.next/static/chunks/15-ltfhot3b4n.js +0 -7
  362. package/.next/static/chunks/16ls93seuyj8a.js +0 -1
  363. package/.next/static/chunks/17sxlwlx5fhrp.css +0 -1
  364. package/.next/static/chunks/181u38qblp8lz.js +0 -1
  365. package/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
  366. package/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
  367. package/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
  368. package/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
  369. package/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
  370. package/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
  371. package/app/api/hub/license/route.ts +0 -33
  372. package/app/components/BroadcastBar.tsx +0 -84
  373. package/app/components/InboxPanel.tsx +0 -36
  374. /package/.next/static/{vv4Gz5yVhOzydMI2UlT1l → TDZA1Sx9EZPbGBOvEQtJ7}/_buildManifest.js +0 -0
  375. /package/.next/static/{vv4Gz5yVhOzydMI2UlT1l → TDZA1Sx9EZPbGBOvEQtJ7}/_clientMiddlewareManifest.js +0 -0
  376. /package/.next/static/{vv4Gz5yVhOzydMI2UlT1l → TDZA1Sx9EZPbGBOvEQtJ7}/_ssgManifest.js +0 -0
@@ -96,24 +96,24 @@ export default function NetworksPage() {
96
96
  };
97
97
 
98
98
  return (
99
- <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
100
- <div className="flex items-center gap-4 mb-6">
101
- <Link href="/settings" className="text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10">&larr; Settings</Link>
99
+ <div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
100
+ {/* #217 D9: back link stacks above the title instead of sitting
101
+ beside it the old single row read as an off-balance
102
+ "← Settings Networks" pair on phones. */}
103
+ <div className="mb-6">
104
+ <Link href="/settings" className="inline-block text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10 mb-1">&larr; Settings</Link>
102
105
  <h1 className="text-2xl font-bold text-white">Networks</h1>
103
- {/* Round 93: dropped {networks.length} header chip — the
104
- My Networks panel below already carries `<N> total` in its
105
- own subhead. Matches r86/r87 pattern. */}
106
106
  </div>
107
107
 
108
108
  <div className="max-w-2xl space-y-6">
109
109
  {/* Create */}
110
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
110
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
111
111
  <h2 className="text-sm font-semibold text-gray-300 mb-3">Create Network</h2>
112
112
  <div className="space-y-3">
113
113
  <input type="text" value={newName} onChange={e => setNewName(e.target.value)} placeholder="Network name"
114
- className="w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
114
+ className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
115
115
  <input type="text" value={newDesc} onChange={e => setNewDesc(e.target.value)} placeholder="Description (optional)"
116
- className="w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
116
+ className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
117
117
  <button onClick={createNetwork} disabled={!newName.trim()}
118
118
  className="px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors">
119
119
  Create
@@ -123,10 +123,12 @@ export default function NetworksPage() {
123
123
  </section>
124
124
 
125
125
  {/* List */}
126
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
126
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
127
127
  <div className="flex items-center justify-between mb-3">
128
128
  <h2 className="text-sm font-semibold text-gray-300">My Networks</h2>
129
- {networks.length > 0 && (
129
+ {/* #217 D9: "N TOTAL" counter dropped below 4 rows — counting
130
+ a visibly one-item list is noise (D6 conditional rule). */}
131
+ {networks.length > 3 && (
130
132
  <span className="text-[10px] text-gray-600 uppercase tracking-wide">{networks.length} total</span>
131
133
  )}
132
134
  </div>
@@ -141,7 +143,7 @@ export default function NetworksPage() {
141
143
  ) : (
142
144
  <div className="space-y-3">
143
145
  {networks.map(n => (
144
- <div key={n.network_id} className="bg-[#0a0a15] rounded-lg px-4 py-3 border border-[#1a1a2a]">
146
+ <div key={n.network_id} className="bg-[#0e0e10] rounded-lg px-4 py-3 border border-[#1c1c1f]">
145
147
  <div className="flex items-start justify-between gap-3">
146
148
  <div className="flex items-start gap-3 min-w-0">
147
149
  <AliasAvatar alias={n.network_name} size={28} />
@@ -173,7 +175,7 @@ export default function NetworksPage() {
173
175
  </div>
174
176
 
175
177
  {expandedNetwork === n.network_id && (
176
- <div className="mt-3 pt-3 border-t border-[#1a1a2a]">
178
+ <div className="mt-3 pt-3 border-t border-[#1c1c1f]">
177
179
  <div className="text-xs text-gray-500 mb-2">Members ({(members[n.network_id] || []).length})</div>
178
180
  {(members[n.network_id] || []).length === 0 ? (
179
181
  <div className="text-[10px] text-gray-600">No members or V3 auth required</div>
@@ -195,11 +197,11 @@ export default function NetworksPage() {
195
197
  )}
196
198
 
197
199
  {/* Invite */}
198
- <div className="mt-3 pt-3 border-t border-[#1a1a2a]">
200
+ <div className="mt-3 pt-3 border-t border-[#1c1c1f]">
199
201
  <div className="text-xs text-gray-500 mb-2">Invite</div>
200
202
  <div className="flex gap-2">
201
203
  <select value={inviteRole} onChange={e => setInviteRole(e.target.value)}
202
- className="bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white focus:outline-none">
204
+ className="bg-[#0e0e10] border border-[#26262b] rounded px-2 py-1 text-base sm:text-xs text-white focus:outline-none">
203
205
  <option value="member">member</option>
204
206
  <option value="admin">admin</option>
205
207
  <option value="viewer">viewer</option>
@@ -2,15 +2,16 @@
2
2
 
3
3
  import { useState } from 'react';
4
4
  import Link from 'next/link';
5
- import { useAnetConfig, useHealth, useLicense } from '../lib/hooks';
5
+ import { useAnetConfig, useHealth } from '../lib/hooks';
6
6
  import { DASHBOARD_VERSION } from '../lib/version';
7
7
 
8
8
  export default function SettingsPage() {
9
9
  const { config } = useAnetConfig();
10
- const { health } = useHealth();
11
- const { license: licData } = useLicense();
12
- const [licKey, setLicKey] = useState('');
13
- const [licResult, setLicResult] = useState('');
10
+ const { health, error: healthError } = useHealth();
11
+ const [theme, setTheme] = useState<string>(() => {
12
+ if (typeof window === 'undefined') return 'cyber';
13
+ try { return localStorage.getItem('anet-theme') || 'cyber'; } catch { return 'cyber'; }
14
+ });
14
15
  const [oldPwd, setOldPwd] = useState('');
15
16
  const [newPwd, setNewPwd] = useState('');
16
17
  const [pwdResult, setPwdResult] = useState('');
@@ -18,7 +19,7 @@ export default function SettingsPage() {
18
19
  const valueClass = 'break-all sm:max-w-[320px] sm:text-right';
19
20
 
20
21
  return (
21
- <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
22
+ <div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
22
23
  <h1 className="text-2xl font-bold text-white mb-3 lg:ml-0 ml-10">Settings</h1>
23
24
 
24
25
  {/* Section anchor nav (round 28) — jump to a group instead of scrolling
@@ -27,29 +28,75 @@ export default function SettingsPage() {
27
28
  R3 of #190 mobile polish: matches the /admin chip treatment
28
29
  (preview.3) — 44px tap-target + visible border so the chips read
29
30
  as tappable rather than as inert headings on 375–390px. */}
30
- <nav className="mb-8 flex flex-wrap gap-2 text-xs">
31
+ {/* #209 R36: mb-8 mb-4 sm:mb-8 — same pattern R31 applied to
32
+ /admin's identical jump-nav. Saves 16 px on phones. */}
33
+ <nav className="mb-4 sm:mb-8 flex flex-wrap gap-2 text-xs">
31
34
  {[
35
+ { href: '#appearance', label: 'Appearance' },
32
36
  { href: '#connection', label: 'Connection' },
33
37
  { href: '#account', label: 'Account' },
34
38
  { href: '#resources', label: 'Resources' },
35
39
  ].map(a => (
36
40
  <a key={a.href} href={a.href}
37
- className="inline-flex min-h-[44px] items-center rounded-md border border-[#2a2a4a] bg-[#0a0a15]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors">
41
+ className="inline-flex min-h-[44px] items-center rounded-md border border-[#26262b] bg-[#0e0e10]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors">
38
42
  {a.label}
39
43
  </a>
40
44
  ))}
41
45
  </nav>
42
46
 
43
47
  <div className="max-w-2xl space-y-10">
48
+ {/* ── Group: Appearance (#217 S6 — Vincent: "设置里面再来一个
49
+ 优化白色的主题"). The light theme tokens were restored from
50
+ pre-R8 history; this card is the visible owner of the toggle
51
+ (previously theme switching hid inside Cmd+K only). */}
52
+ <div id="appearance" className="space-y-4 scroll-mt-6">
53
+ <div className="flex items-center gap-2 px-1">
54
+ <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Appearance</div>
55
+ <div className="flex-1 h-px bg-[#26262b]" />
56
+ </div>
57
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
58
+ <h2 className="text-sm font-semibold text-gray-300 mb-4">Theme</h2>
59
+ <div className="grid grid-cols-2 gap-3">
60
+ {([
61
+ { id: 'cyber', label: 'Dark', swatch: '#0b0b0d', ring: '#22d3ee' },
62
+ { id: 'light', label: 'Light', swatch: '#f6f7f9', ring: '#009e7e' },
63
+ ] as const).map(t => (
64
+ <button
65
+ key={t.id}
66
+ onClick={() => {
67
+ try { localStorage.setItem('anet-theme', t.id); } catch {}
68
+ document.documentElement.setAttribute('data-theme', t.id);
69
+ setTheme(t.id);
70
+ }}
71
+ aria-pressed={theme === t.id}
72
+ className={`flex items-center gap-3 rounded-lg border px-4 py-3 text-sm transition-colors ${
73
+ theme === t.id
74
+ ? 'border-cyan-500/60 bg-cyan-500/10 text-gray-100'
75
+ : 'border-[#26262b] text-gray-400 hover:border-[#3a3a41]'
76
+ }`}
77
+ >
78
+ <span
79
+ aria-hidden
80
+ className="inline-block w-5 h-5 rounded-full border border-black/20 shrink-0"
81
+ style={{ backgroundColor: t.swatch }}
82
+ />
83
+ {t.label}
84
+ {theme === t.id && <span className="ml-auto text-cyan-400">✓</span>}
85
+ </button>
86
+ ))}
87
+ </div>
88
+ </section>
89
+ </div>
90
+
44
91
  {/* ── Group: Connection ─────────────────────────────────── */}
45
92
  <div id="connection" className="space-y-4 scroll-mt-6">
46
93
  <div className="flex items-center gap-2 px-1">
47
94
  <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Connection</div>
48
- <div className="flex-1 h-px bg-[#2a2a4a]" />
95
+ <div className="flex-1 h-px bg-[#26262b]" />
49
96
  </div>
50
97
 
51
98
  {/* CommHub Connection */}
52
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
99
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
53
100
  <h2 className="text-sm font-semibold text-gray-300 mb-4">CommHub Connection</h2>
54
101
  <div className="space-y-3 text-sm">
55
102
  <div className={rowClass}>
@@ -75,15 +122,26 @@ export default function SettingsPage() {
75
122
  </span>
76
123
  </div>
77
124
  {config?.error && (
78
- <div className="border-t border-[#2a2a4a] pt-3 text-xs text-gray-600">
125
+ <div className="border-t border-[#26262b] pt-3 text-xs text-gray-600">
79
126
  {config.error}
80
127
  </div>
81
128
  )}
129
+ {/* #214 F5: the red HealthBanner's "Open Settings" CTA used to
130
+ land on a read-only page with no next step. When the hub is
131
+ unreachable, give the user actual recovery commands. */}
132
+ {(healthError || health?.ok === false) && (
133
+ <div className="border-t border-red-500/20 pt-3 text-xs space-y-1.5" role="alert">
134
+ <div className="text-red-300 font-medium">CommHub unreachable — how to recover:</div>
135
+ <div className="text-gray-400">1. Check the hub process on the server: <code className="font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5">anet hub status</code></div>
136
+ <div className="text-gray-400">2. Start it if stopped: <code className="font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5">anet hub start</code></div>
137
+ <div className="text-gray-400">3. Confirm the Hub URL above matches where the hub actually listens.</div>
138
+ </div>
139
+ )}
82
140
  </div>
83
141
  </section>
84
142
 
85
143
  {/* Server Info */}
86
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
144
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
87
145
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Server Info</h2>
88
146
  <div className="space-y-3 text-sm">
89
147
  <div className={rowClass}>
@@ -106,7 +164,7 @@ export default function SettingsPage() {
106
164
  </section>
107
165
 
108
166
  {/* Dashboard Info */}
109
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
167
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
110
168
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Dashboard</h2>
111
169
  <div className="space-y-3 text-sm">
112
170
  <div className={rowClass}>
@@ -131,90 +189,17 @@ export default function SettingsPage() {
131
189
  <div id="account" className="space-y-4 scroll-mt-6">
132
190
  <div className="flex items-center gap-2 px-1">
133
191
  <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Account</div>
134
- <div className="flex-1 h-px bg-[#2a2a4a]" />
192
+ <div className="flex-1 h-px bg-[#26262b]" />
135
193
  </div>
136
194
 
137
- {/* License */}
138
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
139
- <h2 className="text-sm font-semibold text-gray-300 mb-4 flex items-center gap-2">
140
- License
141
- {licData?.license && (
142
- <span
143
- className={`inline-flex items-center gap-1.5 text-[10px] font-medium px-2 py-0.5 rounded-full border ${
144
- licData.license.type === 'pro'
145
- ? 'text-green-300 bg-green-500/10 border-green-500/30'
146
- : licData.license.days_left <= 7
147
- ? 'text-red-300 bg-red-500/10 border-red-500/30'
148
- : 'text-amber-300 bg-amber-500/10 border-amber-500/30'
149
- }`}
150
- >
151
- <span aria-hidden className="w-1.5 h-1.5 rounded-full bg-current" />
152
- {licData.license.type}{licData.license.days_left ? ` · ${licData.license.days_left}d left` : ''}
153
- </span>
154
- )}
155
- </h2>
156
- {licData?.license ? (
157
- <div className="space-y-3 text-sm">
158
- {/* Type + Days Left are summarized in the inline chip in the
159
- header. Surface "expiring soon" only when relevant. */}
160
- {licData.license.days_left <= 7 && (
161
- <div className={rowClass}>
162
- <span className="text-red-400 font-medium">⚠ Expiring soon</span>
163
- <span className="text-red-400">{licData.license.days_left} days left</span>
164
- </div>
165
- )}
166
- <div className={rowClass}>
167
- <span className="text-gray-500">Expires</span>
168
- <span className={`text-gray-300 ${valueClass}`}>{licData.license.expires_at}</span>
169
- </div>
170
- {licData.limits && (
171
- <>
172
- <div className={rowClass}>
173
- <span className="text-gray-500">Max Agents</span>
174
- <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_agents}</span>
175
- </div>
176
- <div className={rowClass}>
177
- <span className="text-gray-500">Max Networks</span>
178
- <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_networks}</span>
179
- </div>
180
- <div className={rowClass}>
181
- <span className="text-gray-500">Tasks/Day</span>
182
- <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_tasks_day}</span>
183
- </div>
184
- </>
185
- )}
186
- <div className="pt-3 border-t border-[#2a2a4a]">
187
- <div className="flex gap-2">
188
- <input type="text" value={licKey} onChange={e => setLicKey(e.target.value)}
189
- placeholder="anet-XXXX-XXXX-XXXX-XXXX"
190
- className="flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none" />
191
- <button onClick={async () => {
192
- if (!licKey.trim()) return;
193
- const res = await fetch('/api/hub/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: licKey }) });
194
- const data = await res.json();
195
- setLicResult(data.ok ? `Activated: ${data.type}` : `Failed: ${data.error}`);
196
- if (data.ok) setLicKey('');
197
- setTimeout(() => setLicResult(''), 5000);
198
- }} className="px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors">
199
- Activate
200
- </button>
201
- </div>
202
- {licResult && <div className={`mt-2 text-xs ${licResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{licResult}</div>}
203
- </div>
204
- </div>
205
- ) : (
206
- <div className="text-xs text-gray-600">License info not available</div>
207
- )}
208
- </section>
209
-
210
195
  {/* Change Password */}
211
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
196
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
212
197
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Change Password</h2>
213
198
  <div className="space-y-3">
214
199
  <input type="password" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder="Current password"
215
- className="w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
200
+ className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
216
201
  <input type="password" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder="New password"
217
- className="w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
202
+ className="w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
218
203
  <button onClick={async () => {
219
204
  if (!oldPwd || !newPwd) return;
220
205
  const saved = sessionStorage.getItem('anet_v3_auth');
@@ -244,7 +229,7 @@ export default function SettingsPage() {
244
229
  </section>
245
230
 
246
231
  {/* Session — tone-neutral, no longer "danger zone" red */}
247
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
232
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
248
233
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Sign out</h2>
249
234
  <p className="text-xs text-gray-500 mb-3">Signing out clears your dashboard session cookie. You'll return to the login page.</p>
250
235
  <button
@@ -252,7 +237,7 @@ export default function SettingsPage() {
252
237
  await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});
253
238
  window.location.assign('/login');
254
239
  }}
255
- className="px-4 py-2 bg-transparent hover:bg-[#1a1a2a] text-gray-300 text-sm rounded-lg border border-[#2a2a4a] hover:border-[#3a3a5a] transition-colors"
240
+ className="px-4 py-2 bg-transparent hover:bg-[#1c1c1f] text-gray-300 text-sm rounded-lg border border-[#26262b] hover:border-[#3a3a41] transition-colors"
256
241
  >
257
242
  Sign out
258
243
  </button>
@@ -263,21 +248,42 @@ export default function SettingsPage() {
263
248
  <div id="resources" className="space-y-4 scroll-mt-6">
264
249
  <div className="flex items-center gap-2 px-1">
265
250
  <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Resources</div>
266
- <div className="flex-1 h-px bg-[#2a2a4a]" />
251
+ <div className="flex-1 h-px bg-[#26262b]" />
267
252
  </div>
268
253
 
269
- {/* API Tokens + Networks */}
254
+ {/* #209 (per Vincent 521/522): the low-frequency pages 通信龙
255
+ moved out of the sidebar (Messages, Audit Log, Server Logs)
256
+ need a discovery surface that isn't the primary nav — folded
257
+ into the Settings/Resources grid alongside Tokens + Networks
258
+ so the page tree stays the same (pages NOT deleted), the
259
+ sidebar stays at 6, and users still have a one-tap way to
260
+ reach them without remembering URLs or opening Cmd+K. */}
270
261
  <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
271
- <Link href="/settings/tokens" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
262
+ <Link href="/settings/tokens" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
272
263
  <h2 className="text-sm font-semibold text-gray-300">API Tokens</h2>
273
264
  <p className="text-xs text-gray-500 mt-2">Create and manage tokens for CLI access.</p>
274
265
  <span className="text-xs text-cyan-400 mt-3 inline-block">Manage &rarr;</span>
275
266
  </Link>
276
- <Link href="/settings/networks" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
267
+ <Link href="/settings/networks" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
277
268
  <h2 className="text-sm font-semibold text-gray-300">Networks</h2>
278
269
  <p className="text-xs text-gray-500 mt-2">Create, manage, and delete agent networks.</p>
279
270
  <span className="text-xs text-cyan-400 mt-3 inline-block">Manage &rarr;</span>
280
271
  </Link>
272
+ <Link href="/messages" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
273
+ <h2 className="text-sm font-semibold text-gray-300">Messages</h2>
274
+ <p className="text-xs text-gray-500 mt-2">Global timeline of CommHub messages across all agents.</p>
275
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
276
+ </Link>
277
+ <Link href="/logs" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
278
+ <h2 className="text-sm font-semibold text-gray-300">Audit Log</h2>
279
+ <p className="text-xs text-gray-500 mt-2">Authentication, token rotations, and admin actions.</p>
280
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
281
+ </Link>
282
+ <Link href="/server-logs" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
283
+ <h2 className="text-sm font-semibold text-gray-300">Server Logs</h2>
284
+ <p className="text-xs text-gray-500 mt-2">Live stdout / stderr from the CommHub server.</p>
285
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
286
+ </Link>
281
287
  </div>
282
288
  </div>
283
289
 
@@ -67,7 +67,7 @@ export default function TokensPage() {
67
67
  };
68
68
 
69
69
  return (
70
- <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
70
+ <div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
71
71
  <div className="flex items-center gap-4 mb-6">
72
72
  <Link href="/settings" className="text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10">&larr; Settings</Link>
73
73
  <h1 className="text-2xl font-bold text-white">API Tokens</h1>
@@ -75,12 +75,12 @@ export default function TokensPage() {
75
75
 
76
76
  <div className="max-w-2xl space-y-6">
77
77
  {/* Create token */}
78
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
78
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
79
79
  <h2 className="text-sm font-semibold text-gray-300 mb-3">Create Token</h2>
80
80
  <div className="flex gap-2">
81
81
  <input type="text" value={newName} onChange={e => setNewName(e.target.value)}
82
82
  placeholder="Token name (e.g. my-cli)"
83
- className="flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
83
+ className="flex-1 bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none" />
84
84
  <button onClick={createToken} disabled={!newName.trim()}
85
85
  className="px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors">
86
86
  Create
@@ -96,7 +96,7 @@ export default function TokensPage() {
96
96
  </section>
97
97
 
98
98
  {/* Token list */}
99
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
99
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
100
100
  <h2 className="text-sm font-semibold text-gray-300 mb-3">Active Tokens ({tokens.length})</h2>
101
101
  {loading ? (
102
102
  <div className="animate-pulse space-y-2">{[1,2].map(i => <div key={i} className="h-12 bg-gray-800/20 rounded" />)}</div>
@@ -109,7 +109,7 @@ export default function TokensPage() {
109
109
  ) : (
110
110
  <div className="space-y-2">
111
111
  {tokens.map(t => (
112
- <div key={t.token_id} className="flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]">
112
+ <div key={t.token_id} className="flex items-center justify-between bg-[#0e0e10] rounded-lg px-3 py-2 border border-[#1c1c1f]">
113
113
  <div>
114
114
  <div className="flex items-center gap-2">
115
115
  <span className="text-sm text-white font-medium">{t.name}</span>
@@ -73,7 +73,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
73
73
 
74
74
  if (isLoading) {
75
75
  return (
76
- <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
76
+ <div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
77
77
  <div className="animate-pulse space-y-4">
78
78
  <div className="h-8 w-48 bg-gray-800 rounded" />
79
79
  <div className="h-64 bg-gray-800/20 rounded-lg" />
@@ -84,7 +84,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
84
84
 
85
85
  if (!task) {
86
86
  return (
87
- <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono flex items-center justify-center">
87
+ <div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-6 flex items-center justify-center">
88
88
  <div className="text-center">
89
89
  <div className="text-gray-600 text-4xl mb-4">--</div>
90
90
  <p className="text-gray-400">Task not found</p>
@@ -103,7 +103,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
103
103
  ];
104
104
 
105
105
  return (
106
- <div className="min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono">
106
+ <div className="min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6">
107
107
  <div className="flex items-center gap-4 mb-6">
108
108
  <Link href="/tasks" className="text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10">&larr; Tasks</Link>
109
109
  <h1 className="text-xl font-bold text-white truncate">Task Detail</h1>
@@ -113,12 +113,12 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
113
113
  <div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
114
114
  {/* Left: Timeline + Info */}
115
115
  <div className="space-y-4">
116
- <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-4">
116
+ <div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
117
117
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Timeline</h2>
118
118
  <Timeline steps={steps} />
119
119
  </div>
120
120
 
121
- <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-4">
121
+ <div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
122
122
  <h2 className="text-sm font-semibold text-gray-300 mb-3">Info</h2>
123
123
  <div className="space-y-2 text-xs">
124
124
  {[
@@ -140,17 +140,17 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
140
140
 
141
141
  {/* Right: Content + Result */}
142
142
  <div className="lg:col-span-2 space-y-4">
143
- <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-4">
143
+ <div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
144
144
  <h2 className="text-sm font-semibold text-gray-300 mb-2">Content</h2>
145
- <div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-4 py-3 border border-[#1a1a2a]">
145
+ <div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#0e0e10] rounded-lg px-4 py-3 border border-[#1c1c1f]">
146
146
  {task.content || '--'}
147
147
  </div>
148
148
  </div>
149
149
 
150
150
  {task.result && (
151
- <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-4">
151
+ <div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
152
152
  <h2 className="text-sm font-semibold text-gray-300 mb-2">Result</h2>
153
- <div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-4 py-3 border border-[#1a1a2a] max-h-96 overflow-y-auto">
153
+ <div className="text-sm text-gray-300 whitespace-pre-wrap bg-[#0e0e10] rounded-lg px-4 py-3 border border-[#1c1c1f] max-h-96 overflow-y-auto">
154
154
  {task.result}
155
155
  </div>
156
156
  </div>
@@ -158,7 +158,7 @@ export default function TaskDetailPage({ params }: { params: Promise<{ id: strin
158
158
 
159
159
  {/* Task Events */}
160
160
  {eventsData?.events && eventsData.events.length > 0 && (
161
- <div className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-4">
161
+ <div className="bg-[#161618] border border-[#26262b] rounded-xl p-4">
162
162
  <h2 className="text-sm font-semibold text-gray-300 mb-3">Events ({eventsData.events.length})</h2>
163
163
  <div className="space-y-2 max-h-64 overflow-y-auto">
164
164
  {eventsData.events.map((e: { id: number; event_type: string; from_status: string; to_status: string; detail: string; created_at: string }, i: number) => (