@sleep2agi/agent-network-dashboard 0.5.7-preview.5 → 0.5.7-preview.66

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/{0jp~cs9-zkmqa.js → 00b4y77vxfabl.js} +1 -1
  240. package/.next/static/chunks/00y0qgigxb62-.js +1 -0
  241. package/.next/static/chunks/049vx3qljs1tt.js +1 -0
  242. package/.next/static/chunks/04cf.98_cyxen.js +1 -0
  243. package/.next/static/chunks/066jf0nk75nic.css +2 -0
  244. package/.next/static/chunks/07sj5zwg46-5~.css +1 -0
  245. package/.next/static/chunks/0_bn~gcrgo.4n.js +1 -0
  246. package/.next/static/chunks/0g4d-_fi-d9hg.js +1 -0
  247. package/.next/static/chunks/0t4lpxu4ny9-3.js +1 -0
  248. package/.next/static/chunks/0vgrwqsgja19l.js +1 -0
  249. package/.next/static/chunks/0wz0122ym_gr3.js +1 -0
  250. package/.next/static/chunks/0xxx7yeapw~2a.js +1 -0
  251. package/.next/static/chunks/0y5gol09tlu63.js +1 -0
  252. package/.next/static/chunks/143g3n8za083f.js +7 -0
  253. package/.next/static/chunks/149a4l50_3vw-.js +7 -0
  254. package/.next/static/chunks/14lac~_cpjlh..js +1 -0
  255. package/.next/static/chunks/152_p6jt7txp6.js +1 -0
  256. package/.next/static/chunks/165v74i3j-wk0.js +1 -0
  257. package/.next/static/chunks/16glr1c4nc85n.js +4 -0
  258. package/.next/static/chunks/17-7ama~oijou.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 +38 -17
  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 +11 -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 +40 -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 +84 -57
  302. package/app/node/page.tsx +27 -17
  303. package/app/nodes/page.tsx +62 -49
  304. package/app/page.tsx +40 -269
  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 +90 -95
  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/0.t1evm65itbw.js +0 -1
  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/0a.9~-nf0gpec.js +0 -1
  353. package/.next/static/chunks/0az0wa3gxme68.js +0 -1
  354. package/.next/static/chunks/0dq6wv-e0vk_o.css +0 -1
  355. package/.next/static/chunks/0gi_03g-uxj0r.js +0 -1
  356. package/.next/static/chunks/0im751o4n61c7.js +0 -1
  357. package/.next/static/chunks/0inql3s9ldyx5.js +0 -1
  358. package/.next/static/chunks/0ku0fjqlm9mca.js +0 -1
  359. package/.next/static/chunks/0nqm.7w9_inwd.js +0 -7
  360. package/.next/static/chunks/13yktdzuatx3d.js +0 -1
  361. package/.next/static/chunks/15-ltfhot3b4n.js +0 -7
  362. package/.next/static/chunks/15qxef.ilfysw.js +0 -4
  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/{e-lUTefNl8edrYCV4yWtG → 2dHfsg3G4Q4tXXzlz3hFv}/_buildManifest.js +0 -0
  375. /package/.next/static/{e-lUTefNl8edrYCV4yWtG → 2dHfsg3G4Q4tXXzlz3hFv}/_clientMiddlewareManifest.js +0 -0
  376. /package/.next/static/{e-lUTefNl8edrYCV4yWtG → 2dHfsg3G4Q4tXXzlz3hFv}/_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
10
  const { health } = useHealth();
11
- const { license: licData } = useLicense();
12
- const [licKey, setLicKey] = useState('');
13
- const [licResult, setLicResult] = useState('');
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,7 +122,7 @@ 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
  )}
@@ -83,7 +130,7 @@ export default function SettingsPage() {
83
130
  </section>
84
131
 
85
132
  {/* Server Info */}
86
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
133
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
87
134
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Server Info</h2>
88
135
  <div className="space-y-3 text-sm">
89
136
  <div className={rowClass}>
@@ -106,7 +153,7 @@ export default function SettingsPage() {
106
153
  </section>
107
154
 
108
155
  {/* Dashboard Info */}
109
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
156
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
110
157
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Dashboard</h2>
111
158
  <div className="space-y-3 text-sm">
112
159
  <div className={rowClass}>
@@ -131,90 +178,17 @@ export default function SettingsPage() {
131
178
  <div id="account" className="space-y-4 scroll-mt-6">
132
179
  <div className="flex items-center gap-2 px-1">
133
180
  <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Account</div>
134
- <div className="flex-1 h-px bg-[#2a2a4a]" />
181
+ <div className="flex-1 h-px bg-[#26262b]" />
135
182
  </div>
136
183
 
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
184
  {/* Change Password */}
211
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
185
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
212
186
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Change Password</h2>
213
187
  <div className="space-y-3">
214
188
  <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" />
189
+ 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
190
  <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" />
191
+ 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
192
  <button onClick={async () => {
219
193
  if (!oldPwd || !newPwd) return;
220
194
  const saved = sessionStorage.getItem('anet_v3_auth');
@@ -244,7 +218,7 @@ export default function SettingsPage() {
244
218
  </section>
245
219
 
246
220
  {/* Session — tone-neutral, no longer "danger zone" red */}
247
- <section className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5">
221
+ <section className="bg-[#161618] border border-[#26262b] rounded-xl p-5">
248
222
  <h2 className="text-sm font-semibold text-gray-300 mb-4">Sign out</h2>
249
223
  <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
224
  <button
@@ -252,7 +226,7 @@ export default function SettingsPage() {
252
226
  await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});
253
227
  window.location.assign('/login');
254
228
  }}
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"
229
+ 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
230
  >
257
231
  Sign out
258
232
  </button>
@@ -263,21 +237,42 @@ export default function SettingsPage() {
263
237
  <div id="resources" className="space-y-4 scroll-mt-6">
264
238
  <div className="flex items-center gap-2 px-1">
265
239
  <div className="text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold">Resources</div>
266
- <div className="flex-1 h-px bg-[#2a2a4a]" />
240
+ <div className="flex-1 h-px bg-[#26262b]" />
267
241
  </div>
268
242
 
269
- {/* API Tokens + Networks */}
243
+ {/* #209 (per Vincent 521/522): the low-frequency pages 通信龙
244
+ moved out of the sidebar (Messages, Audit Log, Server Logs)
245
+ need a discovery surface that isn't the primary nav — folded
246
+ into the Settings/Resources grid alongside Tokens + Networks
247
+ so the page tree stays the same (pages NOT deleted), the
248
+ sidebar stays at 6, and users still have a one-tap way to
249
+ reach them without remembering URLs or opening Cmd+K. */}
270
250
  <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">
251
+ <Link href="/settings/tokens" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
272
252
  <h2 className="text-sm font-semibold text-gray-300">API Tokens</h2>
273
253
  <p className="text-xs text-gray-500 mt-2">Create and manage tokens for CLI access.</p>
274
254
  <span className="text-xs text-cyan-400 mt-3 inline-block">Manage &rarr;</span>
275
255
  </Link>
276
- <Link href="/settings/networks" className="bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
256
+ <Link href="/settings/networks" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
277
257
  <h2 className="text-sm font-semibold text-gray-300">Networks</h2>
278
258
  <p className="text-xs text-gray-500 mt-2">Create, manage, and delete agent networks.</p>
279
259
  <span className="text-xs text-cyan-400 mt-3 inline-block">Manage &rarr;</span>
280
260
  </Link>
261
+ <Link href="/messages" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
262
+ <h2 className="text-sm font-semibold text-gray-300">Messages</h2>
263
+ <p className="text-xs text-gray-500 mt-2">Global timeline of CommHub messages across all agents.</p>
264
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
265
+ </Link>
266
+ <Link href="/logs" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
267
+ <h2 className="text-sm font-semibold text-gray-300">Audit Log</h2>
268
+ <p className="text-xs text-gray-500 mt-2">Authentication, token rotations, and admin actions.</p>
269
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
270
+ </Link>
271
+ <Link href="/server-logs" className="bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors">
272
+ <h2 className="text-sm font-semibold text-gray-300">Server Logs</h2>
273
+ <p className="text-xs text-gray-500 mt-2">Live stdout / stderr from the CommHub server.</p>
274
+ <span className="text-xs text-cyan-400 mt-3 inline-block">Open &rarr;</span>
275
+ </Link>
281
276
  </div>
282
277
  </div>
283
278
 
@@ -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) => (