@sleep2agi/agent-network-dashboard 0.4.3-preview.1 → 0.4.5-preview.0

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 (272) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +6 -6
  3. package/.next/diagnostics/route-bundle-stats.json +106 -92
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error/page/build-manifest.json +3 -3
  7. package/.next/server/app/_global-error.html +1 -1
  8. package/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page/build-manifest.json +3 -3
  15. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +2 -2
  18. package/.next/server/app/_not-found.rsc +12 -12
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/.next/server/app/admin/page/build-manifest.json +3 -3
  26. package/.next/server/app/admin/page.js.nft.json +1 -1
  27. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/admin.html +2 -2
  29. package/.next/server/app/admin.rsc +14 -14
  30. package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
  31. package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
  32. package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
  33. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  34. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
  35. package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
  36. package/.next/server/app/index.html +2 -2
  37. package/.next/server/app/index.rsc +14 -14
  38. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  39. package/.next/server/app/index.segments/_full.segment.rsc +14 -14
  40. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  41. package/.next/server/app/index.segments/_index.segment.rsc +7 -7
  42. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  43. package/.next/server/app/login/page/build-manifest.json +3 -3
  44. package/.next/server/app/login/page.js.nft.json +1 -1
  45. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  46. package/.next/server/app/login.html +2 -2
  47. package/.next/server/app/login.rsc +14 -14
  48. package/.next/server/app/login.segments/_full.segment.rsc +14 -14
  49. package/.next/server/app/login.segments/_head.segment.rsc +4 -4
  50. package/.next/server/app/login.segments/_index.segment.rsc +7 -7
  51. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  52. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
  53. package/.next/server/app/login.segments/login.segment.rsc +3 -3
  54. package/.next/server/app/logs/page/build-manifest.json +3 -3
  55. package/.next/server/app/logs/page.js.nft.json +1 -1
  56. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/logs.html +2 -2
  58. package/.next/server/app/logs.rsc +14 -14
  59. package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
  60. package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
  61. package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
  62. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  63. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
  64. package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
  65. package/.next/server/app/messages/page/build-manifest.json +3 -3
  66. package/.next/server/app/messages/page.js.nft.json +1 -1
  67. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  68. package/.next/server/app/messages.html +2 -2
  69. package/.next/server/app/messages.rsc +14 -14
  70. package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
  71. package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
  72. package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
  73. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  74. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
  75. package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
  76. package/.next/server/app/node/page/build-manifest.json +3 -3
  77. package/.next/server/app/node/page.js.nft.json +1 -1
  78. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  79. package/.next/server/app/node.html +2 -2
  80. package/.next/server/app/node.rsc +14 -14
  81. package/.next/server/app/node.segments/_full.segment.rsc +14 -14
  82. package/.next/server/app/node.segments/_head.segment.rsc +4 -4
  83. package/.next/server/app/node.segments/_index.segment.rsc +7 -7
  84. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  85. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
  86. package/.next/server/app/node.segments/node.segment.rsc +3 -3
  87. package/.next/server/app/nodes/page/build-manifest.json +3 -3
  88. package/.next/server/app/nodes/page.js.nft.json +1 -1
  89. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  90. package/.next/server/app/nodes.html +2 -2
  91. package/.next/server/app/nodes.rsc +14 -14
  92. package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
  93. package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
  94. package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
  95. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  96. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
  97. package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
  98. package/.next/server/app/page/build-manifest.json +3 -3
  99. package/.next/server/app/page.js.nft.json +1 -1
  100. package/.next/server/app/page_client-reference-manifest.js +1 -1
  101. package/.next/server/app/server-logs/page/build-manifest.json +3 -3
  102. package/.next/server/app/server-logs/page.js.nft.json +1 -1
  103. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/server-logs.html +2 -2
  105. package/.next/server/app/server-logs.rsc +14 -14
  106. package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
  107. package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
  108. package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
  109. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
  111. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
  112. package/.next/server/app/settings/networks/page/build-manifest.json +3 -3
  113. package/.next/server/app/settings/networks/page.js.nft.json +1 -1
  114. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/settings/networks.html +2 -2
  116. package/.next/server/app/settings/networks.rsc +14 -14
  117. package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
  118. package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
  119. package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
  120. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  121. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
  122. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
  123. package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
  124. package/.next/server/app/settings/page/build-manifest.json +3 -3
  125. package/.next/server/app/settings/page.js.nft.json +1 -1
  126. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  127. package/.next/server/app/settings/tokens/page/build-manifest.json +3 -3
  128. package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
  129. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  130. package/.next/server/app/settings/tokens.html +2 -2
  131. package/.next/server/app/settings/tokens.rsc +14 -14
  132. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
  133. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
  134. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
  135. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  136. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
  137. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
  138. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
  139. package/.next/server/app/settings.html +2 -2
  140. package/.next/server/app/settings.rsc +14 -14
  141. package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
  142. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  143. package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
  144. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  145. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  146. package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  147. package/.next/server/app/tasks/[id]/page/build-manifest.json +3 -3
  148. package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
  149. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/tasks/page/build-manifest.json +3 -3
  151. package/.next/server/app/tasks/page.js.nft.json +1 -1
  152. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  153. package/.next/server/app/tasks.html +2 -2
  154. package/.next/server/app/tasks.rsc +14 -14
  155. package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
  156. package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
  157. package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
  158. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  159. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
  160. package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
  161. package/.next/server/chunks/ssr/[root-of-the-server]__013i9e9._.js +9 -0
  162. package/.next/server/chunks/ssr/[root-of-the-server]__013i9e9._.js.map +1 -0
  163. package/.next/server/chunks/ssr/[root-of-the-server]__0_jnflc._.js +3 -0
  164. package/.next/server/chunks/ssr/[root-of-the-server]__0_jnflc._.js.map +1 -0
  165. package/.next/server/chunks/ssr/[root-of-the-server]__12mpoig._.js +3 -0
  166. package/.next/server/chunks/ssr/[root-of-the-server]__12mpoig._.js.map +1 -0
  167. package/.next/server/chunks/ssr/_0d-fuox._.js +3 -0
  168. package/.next/server/chunks/ssr/_0d-fuox._.js.map +1 -0
  169. package/.next/server/chunks/ssr/app_0.0wpa~._.js +3 -0
  170. package/.next/server/chunks/ssr/app_0.0wpa~._.js.map +1 -0
  171. package/.next/server/chunks/ssr/app_0dk5wao._.js +1 -1
  172. package/.next/server/chunks/ssr/app_0dk5wao._.js.map +1 -1
  173. package/.next/server/chunks/ssr/app_0et5yua._.js +3 -0
  174. package/.next/server/chunks/ssr/app_0et5yua._.js.map +1 -0
  175. package/.next/server/chunks/ssr/app_0ff~kjj._.js +9 -0
  176. package/.next/server/chunks/ssr/app_0ff~kjj._.js.map +1 -0
  177. package/.next/server/chunks/ssr/app_0izi28j._.js +3 -0
  178. package/.next/server/chunks/ssr/app_0izi28j._.js.map +1 -0
  179. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
  180. package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +1 -1
  181. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +1 -1
  182. package/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js.map +1 -1
  183. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js +1 -1
  184. package/.next/server/chunks/ssr/app_server-logs_page_tsx_0_kpp1p._.js.map +1 -1
  185. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js +1 -1
  186. package/.next/server/chunks/ssr/app_tasks_page_tsx_0z-d6mp._.js.map +1 -1
  187. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js +3 -0
  188. package/.next/server/chunks/ssr/node_modules_0ck2~9g._.js.map +1 -0
  189. package/.next/server/middleware-build-manifest.js +6 -6
  190. package/.next/server/pages/404.html +2 -2
  191. package/.next/server/pages/500.html +1 -1
  192. package/.next/server/server-reference-manifest.js +1 -1
  193. package/.next/server/server-reference-manifest.json +1 -1
  194. package/.next/static/chunks/0257pdz1-imal.js +2 -0
  195. package/.next/static/chunks/02flrewxlf_m_.js +1 -0
  196. package/.next/static/chunks/051gslfjka1kj.js +1 -0
  197. package/.next/static/chunks/06t_vzei8s9_h.js +1 -0
  198. package/.next/static/chunks/0e-.zgw81gela.js +31 -0
  199. package/.next/static/chunks/0e7c40p~wq665.js +1 -0
  200. package/.next/static/chunks/0g7m7zk.v7g6h.js +1 -0
  201. package/.next/static/chunks/0hyhubmh-__wg.js +1 -0
  202. package/.next/static/chunks/0khpyxpdrp~ty.js +1 -0
  203. package/.next/static/chunks/0lo_g.q1fm-hr.js +7 -0
  204. package/.next/static/chunks/0snd~q2ucn.h1.css +2 -0
  205. package/.next/static/chunks/0w1zwt8kq_7nb.js +1 -0
  206. package/.next/static/chunks/0xn9.0ejo1s_a.js +7 -0
  207. package/.next/static/chunks/0y0lo-~k2c~00.js +1 -0
  208. package/.next/static/chunks/10njj7kn9ylkf.js +1 -0
  209. package/.next/static/chunks/13.dst7liziwo.js +1 -0
  210. package/.next/static/chunks/{turbopack-0vsvjs02l449s.js → turbopack-01f1xs~cq_~si.js} +1 -1
  211. package/.next/trace +2 -2
  212. package/.next/trace-build +1 -1
  213. package/app/components/EmptyState.tsx +189 -0
  214. package/app/components/LoadingSkeleton.tsx +3 -18
  215. package/app/components/Sidebar.tsx +72 -11
  216. package/app/components/StatsBar.tsx +7 -1
  217. package/app/components/TopoGraph.tsx +151 -62
  218. package/app/globals.css +108 -8
  219. package/app/login/page.tsx +26 -13
  220. package/app/logs/page.tsx +24 -11
  221. package/app/messages/page.tsx +2 -5
  222. package/app/nodes/page.tsx +6 -1
  223. package/app/page.tsx +36 -12
  224. package/app/server-logs/page.tsx +22 -11
  225. package/app/settings/networks/page.tsx +6 -1
  226. package/app/settings/page.tsx +56 -29
  227. package/app/settings/tokens/page.tsx +6 -1
  228. package/app/tasks/page.tsx +7 -9
  229. package/docs/loop-design-rounds.md +502 -0
  230. package/docs/oss-readiness-report.md +189 -0
  231. package/package.json +1 -1
  232. package/.mcp.json +0 -11
  233. package/.next/server/chunks/ssr/[root-of-the-server]__093ymui._.js +0 -3
  234. package/.next/server/chunks/ssr/[root-of-the-server]__093ymui._.js.map +0 -1
  235. package/.next/server/chunks/ssr/[root-of-the-server]__0i1gizm._.js +0 -9
  236. package/.next/server/chunks/ssr/[root-of-the-server]__0i1gizm._.js.map +0 -1
  237. package/.next/server/chunks/ssr/[root-of-the-server]__0~yad5w._.js +0 -3
  238. package/.next/server/chunks/ssr/[root-of-the-server]__0~yad5w._.js.map +0 -1
  239. package/.next/server/chunks/ssr/_06_xh1~._.js +0 -3
  240. package/.next/server/chunks/ssr/_06_xh1~._.js.map +0 -1
  241. package/.next/server/chunks/ssr/app_01vhyfx._.js +0 -9
  242. package/.next/server/chunks/ssr/app_01vhyfx._.js.map +0 -1
  243. package/.next/server/chunks/ssr/app_023a94i._.js +0 -3
  244. package/.next/server/chunks/ssr/app_023a94i._.js.map +0 -1
  245. package/.next/server/chunks/ssr/app_0basiqb._.js +0 -3
  246. package/.next/server/chunks/ssr/app_0basiqb._.js.map +0 -1
  247. package/.next/server/chunks/ssr/app_0pljk5o._.js +0 -3
  248. package/.next/server/chunks/ssr/app_0pljk5o._.js.map +0 -1
  249. package/.next/server/chunks/ssr/node_modules_next_dist_0t-hj0x._.js +0 -3
  250. package/.next/server/chunks/ssr/node_modules_next_dist_0t-hj0x._.js.map +0 -1
  251. package/.next/static/chunks/0.z~9klrgd.t-.js +0 -1
  252. package/.next/static/chunks/08aj9~75raaah.js +0 -7
  253. package/.next/static/chunks/08iom_z8w-wmz.js +0 -7
  254. package/.next/static/chunks/08v0-ki6vwpxf.js +0 -1
  255. package/.next/static/chunks/0agna31q2fjq1.css +0 -2
  256. package/.next/static/chunks/0dkkv90do9a4r.js +0 -1
  257. package/.next/static/chunks/0e-wrhqh4h3r5.js +0 -2
  258. package/.next/static/chunks/0ejz4zwhu3a3y.js +0 -1
  259. package/.next/static/chunks/0o5zj~5vjeks3.js +0 -1
  260. package/.next/static/chunks/0ttvcv6~g0f6i.js +0 -1
  261. package/.next/static/chunks/0uqfv6rc-xdru.js +0 -1
  262. package/.next/static/chunks/0xrnwfefpke-g.js +0 -31
  263. package/.next/static/chunks/0y_po~f~fk~ap.js +0 -1
  264. package/.next/static/chunks/0~93h~zb55yh9.js +0 -1
  265. package/.next/static/chunks/140l7~i5q9wrv.js +0 -1
  266. package/AGENTS.md +0 -5
  267. package/DASHBOARD_OPTIMIZATION_PLAN.md +0 -414
  268. package/docs/iteration-plan.md +0 -62
  269. package/docs/v4-plan.md +0 -38
  270. /package/.next/static/{7dwKlhAm5uyghPmkAubQK → 2m1yIfZCIYDWMYrrJEKSC}/_buildManifest.js +0 -0
  271. /package/.next/static/{7dwKlhAm5uyghPmkAubQK → 2m1yIfZCIYDWMYrrJEKSC}/_clientMiddlewareManifest.js +0 -0
  272. /package/.next/static/{7dwKlhAm5uyghPmkAubQK → 2m1yIfZCIYDWMYrrJEKSC}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/components/utils.ts","../../../../app/lib/hooks.ts","../../../../node_modules/styled-jsx/dist/index/index.js","../../../../node_modules/styled-jsx/style.js","../../../../app/nodes/page.tsx"],"sourcesContent":["export function timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","import useSWR from 'swr';\nimport { Session, Health, AnetConfig } from '../components/types';\nimport { useNetworkId } from './network-context';\n\nconst fetcher = async (url: string) => {\n const res = await fetch(url);\n if (res.status === 401) {\n window.location.assign('/login');\n throw new Error('unauthorized');\n }\n return res.json();\n};\n\nconst SWR_OPTIONS = { refreshInterval: 5000, dedupingInterval: 3000 };\n\n/** Append network_id to URL if set */\nfunction withNetwork(url: string, networkId: string): string {\n if (!networkId) return url;\n const sep = url.includes('?') ? '&' : '?';\n return `${url}${sep}network_id=${encodeURIComponent(networkId)}`;\n}\n\nexport function useSessions() {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR<{ sessions: Session[]; _hint?: { global_count?: number; filtered_network?: string } }>(\n withNetwork('/api/hub/status', networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { sessions: data?.sessions || [], hint: data?._hint, error, isLoading };\n}\n\nexport function useHealth() {\n const { data, error } = useSWR<Health>('/api/hub/health', fetcher, SWR_OPTIONS);\n return { health: data || null, error };\n}\n\nexport function useAnetConfig() {\n const { data } = useSWR<AnetConfig>('/api/anet/config', fetcher, { refreshInterval: 30000 });\n return { config: data || null };\n}\n\nexport function useTasks(params?: Record<string, string>) {\n const { networkId } = useNetworkId();\n const query = new URLSearchParams({ limit: '100', ...params }).toString();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/tasks?${query}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return {\n tasks: data?.tasks || [],\n count: data?.count ?? 0,\n source: data?.source,\n error,\n isLoading,\n };\n}\n\nexport function useStats() {\n const { networkId } = useNetworkId();\n const { data, error } = useSWR(withNetwork('/api/hub/stats', networkId), fetcher, SWR_OPTIONS);\n return { stats: data?.ok ? data : null, error };\n}\n\nexport function useLicense() {\n const { data, error } = useSWR('/api/hub/license', fetcher, { refreshInterval: 60000 });\n return { license: data?.ok ? data : null, error };\n}\n\nexport function useMessages(limit = 100) {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/messages?limit=${limit}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { messages: data?.messages || [], error, isLoading };\n}\n\nexport function useNodeSession(alias: string) {\n const { data, error, isLoading } = useSWR(\n alias ? `/api/hub/session?alias=${encodeURIComponent(alias)}` : null,\n fetcher,\n SWR_OPTIONS,\n );\n return {\n session: data?.session || null,\n inbox: data?.inbox || [],\n sse: data?.sse || 0,\n error,\n isLoading,\n };\n}\n","require('client-only');\nvar React = require('react');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar React__default = /*#__PURE__*/_interopDefaultLegacy(React);\n\n/*\nBased on Glamor's sheet\nhttps://github.com/threepointone/glamor/blob/667b480d31b3721a905021b26e1290ce92ca2879/src/sheet.js\n*/ function _defineProperties(target, props) {\n for(var i = 0; i < props.length; i++){\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nvar isProd = typeof process !== \"undefined\" && process.env && process.env.NODE_ENV === \"production\";\nvar isString = function(o) {\n return Object.prototype.toString.call(o) === \"[object String]\";\n};\nvar StyleSheet = /*#__PURE__*/ function() {\n function StyleSheet(param) {\n var ref = param === void 0 ? {} : param, _name = ref.name, name = _name === void 0 ? \"stylesheet\" : _name, _optimizeForSpeed = ref.optimizeForSpeed, optimizeForSpeed = _optimizeForSpeed === void 0 ? isProd : _optimizeForSpeed;\n invariant$1(isString(name), \"`name` must be a string\");\n this._name = name;\n this._deletedRulePlaceholder = \"#\" + name + \"-deleted-rule____{}\";\n invariant$1(typeof optimizeForSpeed === \"boolean\", \"`optimizeForSpeed` must be a boolean\");\n this._optimizeForSpeed = optimizeForSpeed;\n this._serverSheet = undefined;\n this._tags = [];\n this._injected = false;\n this._rulesCount = 0;\n var node = typeof window !== \"undefined\" && document.querySelector('meta[property=\"csp-nonce\"]');\n this._nonce = node ? node.getAttribute(\"content\") : null;\n }\n var _proto = StyleSheet.prototype;\n _proto.setOptimizeForSpeed = function setOptimizeForSpeed(bool) {\n invariant$1(typeof bool === \"boolean\", \"`setOptimizeForSpeed` accepts a boolean\");\n invariant$1(this._rulesCount === 0, \"optimizeForSpeed cannot be when rules have already been inserted\");\n this.flush();\n this._optimizeForSpeed = bool;\n this.inject();\n };\n _proto.isOptimizeForSpeed = function isOptimizeForSpeed() {\n return this._optimizeForSpeed;\n };\n _proto.inject = function inject() {\n var _this = this;\n invariant$1(!this._injected, \"sheet already injected\");\n this._injected = true;\n if (typeof window !== \"undefined\" && this._optimizeForSpeed) {\n this._tags[0] = this.makeStyleTag(this._name);\n this._optimizeForSpeed = \"insertRule\" in this.getSheet();\n if (!this._optimizeForSpeed) {\n if (!isProd) {\n console.warn(\"StyleSheet: optimizeForSpeed mode not supported falling back to standard mode.\");\n }\n this.flush();\n this._injected = true;\n }\n return;\n }\n this._serverSheet = {\n cssRules: [],\n insertRule: function(rule, index) {\n if (typeof index === \"number\") {\n _this._serverSheet.cssRules[index] = {\n cssText: rule\n };\n } else {\n _this._serverSheet.cssRules.push({\n cssText: rule\n });\n }\n return index;\n },\n deleteRule: function(index) {\n _this._serverSheet.cssRules[index] = null;\n }\n };\n };\n _proto.getSheetForTag = function getSheetForTag(tag) {\n if (tag.sheet) {\n return tag.sheet;\n }\n // this weirdness brought to you by firefox\n for(var i = 0; i < document.styleSheets.length; i++){\n if (document.styleSheets[i].ownerNode === tag) {\n return document.styleSheets[i];\n }\n }\n };\n _proto.getSheet = function getSheet() {\n return this.getSheetForTag(this._tags[this._tags.length - 1]);\n };\n _proto.insertRule = function insertRule(rule, index) {\n invariant$1(isString(rule), \"`insertRule` accepts only strings\");\n if (typeof window === \"undefined\") {\n if (typeof index !== \"number\") {\n index = this._serverSheet.cssRules.length;\n }\n this._serverSheet.insertRule(rule, index);\n return this._rulesCount++;\n }\n if (this._optimizeForSpeed) {\n var sheet = this.getSheet();\n if (typeof index !== \"number\") {\n index = sheet.cssRules.length;\n }\n // this weirdness for perf, and chrome's weird bug\n // https://stackoverflow.com/questions/20007992/chrome-suddenly-stopped-accepting-insertrule\n try {\n sheet.insertRule(rule, index);\n } catch (error) {\n if (!isProd) {\n console.warn(\"StyleSheet: illegal rule: \\n\\n\" + rule + \"\\n\\nSee https://stackoverflow.com/q/20007992 for more info\");\n }\n return -1;\n }\n } else {\n var insertionPoint = this._tags[index];\n this._tags.push(this.makeStyleTag(this._name, rule, insertionPoint));\n }\n return this._rulesCount++;\n };\n _proto.replaceRule = function replaceRule(index, rule) {\n if (this._optimizeForSpeed || typeof window === \"undefined\") {\n var sheet = typeof window !== \"undefined\" ? this.getSheet() : this._serverSheet;\n if (!rule.trim()) {\n rule = this._deletedRulePlaceholder;\n }\n if (!sheet.cssRules[index]) {\n // @TBD Should we throw an error?\n return index;\n }\n sheet.deleteRule(index);\n try {\n sheet.insertRule(rule, index);\n } catch (error) {\n if (!isProd) {\n console.warn(\"StyleSheet: illegal rule: \\n\\n\" + rule + \"\\n\\nSee https://stackoverflow.com/q/20007992 for more info\");\n }\n // In order to preserve the indices we insert a deleteRulePlaceholder\n sheet.insertRule(this._deletedRulePlaceholder, index);\n }\n } else {\n var tag = this._tags[index];\n invariant$1(tag, \"old rule at index `\" + index + \"` not found\");\n tag.textContent = rule;\n }\n return index;\n };\n _proto.deleteRule = function deleteRule(index) {\n if (typeof window === \"undefined\") {\n this._serverSheet.deleteRule(index);\n return;\n }\n if (this._optimizeForSpeed) {\n this.replaceRule(index, \"\");\n } else {\n var tag = this._tags[index];\n invariant$1(tag, \"rule at index `\" + index + \"` not found\");\n tag.parentNode.removeChild(tag);\n this._tags[index] = null;\n }\n };\n _proto.flush = function flush() {\n this._injected = false;\n this._rulesCount = 0;\n if (typeof window !== \"undefined\") {\n this._tags.forEach(function(tag) {\n return tag && tag.parentNode.removeChild(tag);\n });\n this._tags = [];\n } else {\n // simpler on server\n this._serverSheet.cssRules = [];\n }\n };\n _proto.cssRules = function cssRules() {\n var _this = this;\n if (typeof window === \"undefined\") {\n return this._serverSheet.cssRules;\n }\n return this._tags.reduce(function(rules, tag) {\n if (tag) {\n rules = rules.concat(Array.prototype.map.call(_this.getSheetForTag(tag).cssRules, function(rule) {\n return rule.cssText === _this._deletedRulePlaceholder ? null : rule;\n }));\n } else {\n rules.push(null);\n }\n return rules;\n }, []);\n };\n _proto.makeStyleTag = function makeStyleTag(name, cssString, relativeToTag) {\n if (cssString) {\n invariant$1(isString(cssString), \"makeStyleTag accepts only strings as second parameter\");\n }\n var tag = document.createElement(\"style\");\n if (this._nonce) tag.setAttribute(\"nonce\", this._nonce);\n tag.type = \"text/css\";\n tag.setAttribute(\"data-\" + name, \"\");\n if (cssString) {\n tag.appendChild(document.createTextNode(cssString));\n }\n var head = document.head || document.getElementsByTagName(\"head\")[0];\n if (relativeToTag) {\n head.insertBefore(tag, relativeToTag);\n } else {\n head.appendChild(tag);\n }\n return tag;\n };\n _createClass(StyleSheet, [\n {\n key: \"length\",\n get: function get() {\n return this._rulesCount;\n }\n }\n ]);\n return StyleSheet;\n}();\nfunction invariant$1(condition, message) {\n if (!condition) {\n throw new Error(\"StyleSheet: \" + message + \".\");\n }\n}\n\nfunction hash(str) {\n var _$hash = 5381, i = str.length;\n while(i){\n _$hash = _$hash * 33 ^ str.charCodeAt(--i);\n }\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */ return _$hash >>> 0;\n}\nvar stringHash = hash;\n\nvar sanitize = function(rule) {\n return rule.replace(/\\/style/gi, \"\\\\/style\");\n};\nvar cache = {};\n/**\n * computeId\n *\n * Compute and memoize a jsx id from a basedId and optionally props.\n */ function computeId(baseId, props) {\n if (!props) {\n return \"jsx-\" + baseId;\n }\n var propsToString = String(props);\n var key = baseId + propsToString;\n if (!cache[key]) {\n cache[key] = \"jsx-\" + stringHash(baseId + \"-\" + propsToString);\n }\n return cache[key];\n}\n/**\n * computeSelector\n *\n * Compute and memoize dynamic selectors.\n */ function computeSelector(id, css) {\n var selectoPlaceholderRegexp = /__jsx-style-dynamic-selector/g;\n // Sanitize SSR-ed CSS.\n // Client side code doesn't need to be sanitized since we use\n // document.createTextNode (dev) and the CSSOM api sheet.insertRule (prod).\n if (typeof window === \"undefined\") {\n css = sanitize(css);\n }\n var idcss = id + css;\n if (!cache[idcss]) {\n cache[idcss] = css.replace(selectoPlaceholderRegexp, id);\n }\n return cache[idcss];\n}\n\nfunction mapRulesToStyle(cssRules, options) {\n if (options === void 0) options = {};\n return cssRules.map(function(args) {\n var id = args[0];\n var css = args[1];\n return /*#__PURE__*/ React__default[\"default\"].createElement(\"style\", {\n id: \"__\" + id,\n // Avoid warnings upon render with a key\n key: \"__\" + id,\n nonce: options.nonce ? options.nonce : undefined,\n dangerouslySetInnerHTML: {\n __html: css\n }\n });\n });\n}\nvar StyleSheetRegistry = /*#__PURE__*/ function() {\n function StyleSheetRegistry(param) {\n var ref = param === void 0 ? {} : param, _styleSheet = ref.styleSheet, styleSheet = _styleSheet === void 0 ? null : _styleSheet, _optimizeForSpeed = ref.optimizeForSpeed, optimizeForSpeed = _optimizeForSpeed === void 0 ? false : _optimizeForSpeed;\n this._sheet = styleSheet || new StyleSheet({\n name: \"styled-jsx\",\n optimizeForSpeed: optimizeForSpeed\n });\n this._sheet.inject();\n if (styleSheet && typeof optimizeForSpeed === \"boolean\") {\n this._sheet.setOptimizeForSpeed(optimizeForSpeed);\n this._optimizeForSpeed = this._sheet.isOptimizeForSpeed();\n }\n this._fromServer = undefined;\n this._indices = {};\n this._instancesCounts = {};\n }\n var _proto = StyleSheetRegistry.prototype;\n _proto.add = function add(props) {\n var _this = this;\n if (undefined === this._optimizeForSpeed) {\n this._optimizeForSpeed = Array.isArray(props.children);\n this._sheet.setOptimizeForSpeed(this._optimizeForSpeed);\n this._optimizeForSpeed = this._sheet.isOptimizeForSpeed();\n }\n if (typeof window !== \"undefined\" && !this._fromServer) {\n this._fromServer = this.selectFromServer();\n this._instancesCounts = Object.keys(this._fromServer).reduce(function(acc, tagName) {\n acc[tagName] = 0;\n return acc;\n }, {});\n }\n var ref = this.getIdAndRules(props), styleId = ref.styleId, rules = ref.rules;\n // Deduping: just increase the instances count.\n if (styleId in this._instancesCounts) {\n this._instancesCounts[styleId] += 1;\n return;\n }\n var indices = rules.map(function(rule) {\n return _this._sheet.insertRule(rule);\n })// Filter out invalid rules\n .filter(function(index) {\n return index !== -1;\n });\n this._indices[styleId] = indices;\n this._instancesCounts[styleId] = 1;\n };\n _proto.remove = function remove(props) {\n var _this = this;\n var styleId = this.getIdAndRules(props).styleId;\n invariant(styleId in this._instancesCounts, \"styleId: `\" + styleId + \"` not found\");\n this._instancesCounts[styleId] -= 1;\n if (this._instancesCounts[styleId] < 1) {\n var tagFromServer = this._fromServer && this._fromServer[styleId];\n if (tagFromServer) {\n tagFromServer.parentNode.removeChild(tagFromServer);\n delete this._fromServer[styleId];\n } else {\n this._indices[styleId].forEach(function(index) {\n return _this._sheet.deleteRule(index);\n });\n delete this._indices[styleId];\n }\n delete this._instancesCounts[styleId];\n }\n };\n _proto.update = function update(props, nextProps) {\n this.add(nextProps);\n this.remove(props);\n };\n _proto.flush = function flush() {\n this._sheet.flush();\n this._sheet.inject();\n this._fromServer = undefined;\n this._indices = {};\n this._instancesCounts = {};\n };\n _proto.cssRules = function cssRules() {\n var _this = this;\n var fromServer = this._fromServer ? Object.keys(this._fromServer).map(function(styleId) {\n return [\n styleId,\n _this._fromServer[styleId]\n ];\n }) : [];\n var cssRules = this._sheet.cssRules();\n return fromServer.concat(Object.keys(this._indices).map(function(styleId) {\n return [\n styleId,\n _this._indices[styleId].map(function(index) {\n return cssRules[index].cssText;\n }).join(_this._optimizeForSpeed ? \"\" : \"\\n\")\n ];\n })// filter out empty rules\n .filter(function(rule) {\n return Boolean(rule[1]);\n }));\n };\n _proto.styles = function styles(options) {\n return mapRulesToStyle(this.cssRules(), options);\n };\n _proto.getIdAndRules = function getIdAndRules(props) {\n var css = props.children, dynamic = props.dynamic, id = props.id;\n if (dynamic) {\n var styleId = computeId(id, dynamic);\n return {\n styleId: styleId,\n rules: Array.isArray(css) ? css.map(function(rule) {\n return computeSelector(styleId, rule);\n }) : [\n computeSelector(styleId, css)\n ]\n };\n }\n return {\n styleId: computeId(id),\n rules: Array.isArray(css) ? css : [\n css\n ]\n };\n };\n /**\n * selectFromServer\n *\n * Collects style tags from the document with id __jsx-XXX\n */ _proto.selectFromServer = function selectFromServer() {\n var elements = Array.prototype.slice.call(document.querySelectorAll('[id^=\"__jsx-\"]'));\n return elements.reduce(function(acc, element) {\n var id = element.id.slice(2);\n acc[id] = element;\n return acc;\n }, {});\n };\n return StyleSheetRegistry;\n}();\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(\"StyleSheetRegistry: \" + message + \".\");\n }\n}\nvar StyleSheetContext = /*#__PURE__*/ React.createContext(null);\nStyleSheetContext.displayName = \"StyleSheetContext\";\nfunction createStyleRegistry() {\n return new StyleSheetRegistry();\n}\nfunction StyleRegistry(param) {\n var configuredRegistry = param.registry, children = param.children;\n var rootRegistry = React.useContext(StyleSheetContext);\n var ref = React.useState(function() {\n return rootRegistry || configuredRegistry || createStyleRegistry();\n }), registry = ref[0];\n return /*#__PURE__*/ React__default[\"default\"].createElement(StyleSheetContext.Provider, {\n value: registry\n }, children);\n}\nfunction useStyleRegistry() {\n return React.useContext(StyleSheetContext);\n}\n\n// Opt-into the new `useInsertionEffect` API in React 18, fallback to `useLayoutEffect`.\n// https://github.com/reactwg/react-18/discussions/110\nvar useInsertionEffect = React__default[\"default\"].useInsertionEffect || React__default[\"default\"].useLayoutEffect;\nvar defaultRegistry = typeof window !== \"undefined\" ? createStyleRegistry() : undefined;\nfunction JSXStyle(props) {\n var registry = defaultRegistry ? defaultRegistry : useStyleRegistry();\n // If `registry` does not exist, we do nothing here.\n if (!registry) {\n return null;\n }\n if (typeof window === \"undefined\") {\n registry.add(props);\n return null;\n }\n useInsertionEffect(function() {\n registry.add(props);\n return function() {\n registry.remove(props);\n };\n // props.children can be string[], will be striped since id is identical\n }, [\n props.id,\n String(props.dynamic)\n ]);\n return null;\n}\nJSXStyle.dynamic = function(info) {\n return info.map(function(tagInfo) {\n var baseId = tagInfo[0];\n var props = tagInfo[1];\n return computeId(baseId, props);\n }).join(\" \");\n};\n\nexports.StyleRegistry = StyleRegistry;\nexports.createStyleRegistry = createStyleRegistry;\nexports.style = JSXStyle;\nexports.useStyleRegistry = useStyleRegistry;\n","module.exports = require('./dist/index').style\n","'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { timeAgo } from '../components/utils';\nimport { useSessions, useHealth } from '../lib/hooks';\nimport { TaskChatPanel } from '../components/TaskChatPanel';\nimport type { Session } from '../components/types';\n\nconst STATUS_COLORS: Record<string, string> = {\n working: 'bg-green-500/10 text-green-300 border-green-500/20',\n idle: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n blocked: 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20',\n error: 'bg-red-500/10 text-red-300 border-red-500/20',\n offline: 'bg-gray-500/10 text-gray-500 border-gray-500/20',\n};\n\ntype ViewMode = 'list' | 'grid';\ntype SessionRow = Session & { online: boolean };\n\nexport default function NodesPage() {\n const { sessions, isLoading: loading } = useSessions();\n const { health } = useHealth();\n const sseMap = health?.sse_sessions || {};\n // SSE keys are `network_id:alias` since server v0.7+. Look up with the\n // composite key first, fall back to alias-only for legacy hubs.\n const sseFor = (s: { alias: string; network_id?: string }) =>\n (s.network_id ? sseMap[`${s.network_id}:${s.alias}`] : undefined) ?? sseMap[s.alias];\n const [filterStatus, setFilterStatus] = useState('');\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [taskDrafts, setTaskDrafts] = useState<Record<string, string>>({});\n const [taskOpenFor, setTaskOpenFor] = useState<string | null>(null);\n const [sendState, setSendState] = useState<Record<string, { sending?: boolean; error?: string; success?: string }>>({});\n const [chatAlias, setChatAlias] = useState<string | null>(null);\n\n const filtered: SessionRow[] = sessions\n .map(s => ({ ...s, online: !!sseFor(s) }))\n .filter(s => {\n if (filterStatus === 'online') return s.online;\n if (filterStatus === 'offline') return !s.online;\n if (filterStatus && filterStatus !== s.status) return false;\n return true;\n })\n .filter(s => !search || s.alias.toLowerCase().includes(search.toLowerCase()) || (s.agent || '').toLowerCase().includes(search.toLowerCase()))\n .sort((a, b) => (b.online ? 1 : 0) - (a.online ? 1 : 0) || (b.status === 'working' ? 1 : 0) - (a.status === 'working' ? 1 : 0));\n\n const onlineCount = sessions.filter(s => sseFor(s)).length;\n\n const openSendTask = (alias: string) => {\n setTaskOpenFor(current => current === alias ? null : alias);\n setSendState(prev => ({ ...prev, [alias]: {} }));\n };\n\n const updateTaskDraft = (alias: string, value: string) => {\n setTaskDrafts(prev => ({ ...prev, [alias]: value }));\n };\n\n const sendTask = async (alias: string) => {\n const task = taskDrafts[alias]?.trim() || '';\n if (!task) return;\n\n setSendState(prev => ({ ...prev, [alias]: { sending: true } }));\n\n try {\n const res = await fetch('/api/hub/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alias, task }),\n });\n const data = await res.json();\n\n if (!res.ok || data?.ok === false) {\n throw new Error(data?.error || 'Send failed');\n }\n\n setTaskDrafts(prev => ({ ...prev, [alias]: '' }));\n setSendState(prev => ({ ...prev, [alias]: { success: 'Task sent' } }));\n setTaskOpenFor(null);\n } catch (error: unknown) {\n setSendState(prev => ({\n ...prev,\n [alias]: { error: error instanceof Error ? error.message : 'Send failed' },\n }));\n }\n };\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <div className=\"flex items-center gap-4 mb-6\">\n <h1 className=\"text-2xl font-bold text-white lg:ml-0 ml-10\">Nodes</h1>\n <span className=\"text-xs bg-green-900/30 text-green-400 px-2 py-0.5 rounded-full border border-green-800/30\">\n {onlineCount} online\n </span>\n <span className=\"text-xs bg-gray-900/30 text-gray-400 px-2 py-0.5 rounded-full border border-gray-800/30\">\n {sessions.length} total\n </span>\n </div>\n\n {/* Status bar */}\n {sessions.length > 0 && (() => {\n const working = filtered.filter(s => s.online && s.status === 'working').length;\n const idle = filtered.filter(s => s.online && s.status === 'idle').length;\n const offline = filtered.filter(s => !s.online).length;\n const total = filtered.length || 1;\n return (\n <div className=\"mb-6\">\n <div className=\"flex h-2 rounded-full overflow-hidden bg-gray-800\">\n {working > 0 && <div className=\"bg-green-500\" style={{ width: `${(working/total)*100}%` }} />}\n {idle > 0 && <div className=\"bg-cyan-500\" style={{ width: `${(idle/total)*100}%` }} />}\n {offline > 0 && <div className=\"bg-gray-600\" style={{ width: `${(offline/total)*100}%` }} />}\n </div>\n <div className=\"flex gap-4 mt-1.5 text-[10px] text-gray-500\">\n {working > 0 && <span><span className=\"inline-block w-2 h-2 rounded-full bg-green-500 mr-1\" />{working} working</span>}\n {idle > 0 && <span><span className=\"inline-block w-2 h-2 rounded-full bg-cyan-500 mr-1\" />{idle} idle</span>}\n {offline > 0 && <span><span className=\"inline-block w-2 h-2 rounded-full bg-gray-600 mr-1\" />{offline} offline</span>}\n </div>\n </div>\n );\n })()}\n\n <div className=\"flex flex-wrap gap-3 mb-6\">\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search nodes...\"\n className=\"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:outline-none w-48\"\n />\n <select\n value={filterStatus}\n onChange={e => setFilterStatus(e.target.value)}\n className=\"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-blue-500/50 focus:outline-none\"\n >\n <option value=\"\">All</option>\n <option value=\"online\">Online</option>\n <option value=\"offline\">Offline</option>\n <option value=\"working\">Working</option>\n <option value=\"idle\">Idle</option>\n <option value=\"blocked\">Blocked</option>\n <option value=\"error\">Error</option>\n </select>\n <div className=\"ml-auto flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 text-sm\">\n {(['list', 'grid'] as const).map(mode => (\n <button\n key={mode}\n type=\"button\"\n onClick={() => setViewMode(mode)}\n className={`rounded-md px-3 py-1.5 transition-colors ${\n viewMode === mode\n ? 'bg-cyan-500/10 text-cyan-300'\n : 'text-gray-500 hover:text-gray-200'\n }`}\n >\n {mode === 'list' ? 'List' : 'Grid'}\n </button>\n ))}\n </div>\n </div>\n\n {loading ? (\n <div className=\"animate-pulse space-y-2\">\n {[1,2,3,4].map(i => <div key={i} className=\"h-16 bg-gray-800/20 rounded-lg\" />)}\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"text-center py-16 text-gray-600\">No nodes match your filters.</div>\n ) : viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {filtered.map(s => {\n const statusKey = s.online ? s.status : 'offline';\n const state = sendState[s.alias] || {};\n const progress = typeof s.progress === 'number' ? s.progress : 0;\n\n return (\n <div\n key={s.alias}\n className={`relative overflow-hidden rounded-xl border border-[#2a2a4a] bg-[#111128] p-4 transition-colors ${!s.online ? 'opacity-60' : ''}`}\n >\n {!s.online && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span className=\"rotate-[-20deg] rounded-xl border border-white/10 bg-black/20 px-5 py-2 text-xl font-bold uppercase tracking-[0.35em] text-white/10\">\n Offline\n </span>\n </div>\n )}\n <div className=\"flex items-start justify-between gap-3\">\n <Link href={`/node?alias=${encodeURIComponent(s.alias)}`} className=\"min-w-0 flex-1 hover:text-cyan-300\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-base font-semibold text-white\">{s.alias}</span>\n <span className={`shrink-0 rounded-md border px-2 py-0.5 text-[11px] ${STATUS_COLORS[statusKey] || STATUS_COLORS.offline}`}>\n {statusKey}\n </span>\n </div>\n </Link>\n <div className=\"flex gap-1.5 shrink-0\">\n <button type=\"button\" onClick={() => setChatAlias(s.alias)}\n className=\"rounded-lg border border-green-500/20 bg-green-500/10 px-3 py-1.5 text-xs text-green-300 transition-colors hover:bg-green-500/20\">\n Chat\n </button>\n <button type=\"button\" onClick={() => openSendTask(s.alias)}\n className=\"rounded-lg border border-cyan-500/20 bg-cyan-500/10 px-3 py-1.5 text-xs text-cyan-300 transition-colors hover:bg-cyan-500/20\">\n Task\n </button>\n </div>\n </div>\n\n <div className=\"mt-3 space-y-2 text-xs text-gray-500\">\n <div className=\"flex justify-between gap-3\">\n <span>Agent</span>\n <span className=\"truncate text-gray-300\">{s.agent || '--'}</span>\n </div>\n <div className=\"flex justify-between gap-3\">\n <span>Server</span>\n <span className=\"truncate text-gray-300\">{s.server || '--'}</span>\n </div>\n <div className=\"flex justify-between gap-3\">\n <span>Updated</span>\n <span className=\"text-gray-300\">{timeAgo(s.last_seen_at || s.updated_at)}</span>\n </div>\n </div>\n\n <div className=\"mt-3 rounded-lg border border-[#1a1a2a] bg-[#0a0a15] px-3 py-2 text-xs text-gray-400\">\n {s.task ? s.task : 'No current task'}\n </div>\n\n {progress > 0 && progress < 100 && (\n <div className=\"mt-3 h-1.5 overflow-hidden rounded-full bg-gray-800\">\n <div className=\"h-1.5 rounded-full bg-cyan-400 transition-all\" style={{ width: `${progress}%` }} />\n </div>\n )}\n\n {taskOpenFor === s.alias && (\n <div className=\"mt-4 space-y-2 rounded-lg border border-[#2a2a4a] bg-[#0a0a15] p-3\">\n <input\n type=\"text\"\n value={taskDrafts[s.alias] || ''}\n onChange={e => updateTaskDraft(s.alias, e.target.value)}\n onKeyDown={e => e.key === 'Enter' && sendTask(s.alias)}\n placeholder={`Send task to ${s.alias}...`}\n className=\"w-full rounded-lg border border-[#2a2a4a] bg-[#050510] px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-cyan-500 focus:outline-none\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setTaskOpenFor(null)}\n className=\"rounded-lg border border-gray-700 px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => sendTask(s.alias)}\n disabled={state.sending || !(taskDrafts[s.alias] || '').trim()}\n className=\"rounded-lg bg-cyan-600 px-3 py-1.5 text-xs text-white hover:bg-cyan-500 disabled:cursor-not-allowed disabled:bg-gray-700\"\n >\n {state.sending ? 'Sending...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n\n {state.error && <div className=\"mt-2 text-xs text-red-400\">{state.error}</div>}\n {state.success && taskOpenFor !== s.alias && <div className=\"mt-2 text-xs text-green-400\">{state.success}</div>}\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase\">\n <div className=\"col-span-1\">Status</div>\n <div className=\"col-span-2\">Alias</div>\n <div className=\"col-span-2\">Agent</div>\n <div className=\"col-span-2\">Server</div>\n <div className=\"col-span-2\">Current Task</div>\n <div className=\"col-span-1\">Updated</div>\n <div className=\"col-span-2 text-right\">Actions</div>\n </div>\n {filtered.map(s => {\n const statusKey = s.online ? s.status : 'offline';\n const state = sendState[s.alias] || {};\n\n return (\n <div\n key={s.alias}\n className={`rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 transition-colors hover:border-[#3a3a5a] ${!s.online ? 'opacity-50' : ''}`}\n >\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 items-center\">\n <div className=\"col-span-1\">\n <span className={`text-xs px-2 py-0.5 rounded-md border ${STATUS_COLORS[statusKey] || STATUS_COLORS.offline}`}>\n {statusKey}\n </span>\n </div>\n <div className=\"col-span-2 min-w-0\">\n <Link href={`/node?alias=${encodeURIComponent(s.alias)}`} className=\"truncate text-sm font-medium text-white hover:text-cyan-300\">\n {s.alias}\n </Link>\n </div>\n <div className=\"col-span-2 truncate text-xs text-gray-400\">{s.agent || '--'}</div>\n <div className=\"col-span-2 truncate text-xs text-gray-400\">{s.server || '--'}</div>\n <div className=\"col-span-2 truncate text-xs text-gray-500\">{s.task || '--'}</div>\n <div className=\"col-span-1 text-xs text-gray-500\">{timeAgo(s.last_seen_at || s.updated_at)}</div>\n <div className=\"col-span-2 flex justify-end gap-1.5\">\n <button type=\"button\" onClick={() => setChatAlias(s.alias)}\n className=\"rounded-lg border border-green-500/20 bg-green-500/10 px-2 py-1 text-xs text-green-300 hover:bg-green-500/20\">\n Chat\n </button>\n <button type=\"button\" onClick={() => openSendTask(s.alias)}\n className=\"rounded-lg border border-cyan-500/20 bg-cyan-500/10 px-2 py-1 text-xs text-cyan-300 hover:bg-cyan-500/20\">\n Task\n </button>\n </div>\n </div>\n <div className=\"sm:hidden space-y-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <Link href={`/node?alias=${encodeURIComponent(s.alias)}`} className=\"truncate text-sm font-medium text-white hover:text-cyan-300\">\n {s.alias}\n </Link>\n <span className={`shrink-0 text-xs px-2 py-0.5 rounded-md border ${STATUS_COLORS[statusKey] || STATUS_COLORS.offline}`}>\n {statusKey}\n </span>\n </div>\n <div className=\"text-xs text-gray-500\">{s.agent || '--'} · {timeAgo(s.last_seen_at || s.updated_at)}</div>\n {s.task && <div className=\"truncate text-xs text-gray-500\">{s.task}</div>}\n <div className=\"flex gap-2\">\n <button type=\"button\" onClick={() => setChatAlias(s.alias)}\n className=\"flex-1 rounded-lg border border-green-500/20 bg-green-500/10 px-3 py-2 text-xs text-green-300 hover:bg-green-500/20\">\n Chat\n </button>\n <button type=\"button\" onClick={() => openSendTask(s.alias)}\n className=\"flex-1 rounded-lg border border-cyan-500/20 bg-cyan-500/10 px-3 py-2 text-xs text-cyan-300 hover:bg-cyan-500/20\">\n Send Task\n </button>\n </div>\n </div>\n\n {taskOpenFor === s.alias && (\n <div className=\"mt-3 space-y-2 border-t border-[#2a2a4a] pt-3\">\n <input\n type=\"text\"\n value={taskDrafts[s.alias] || ''}\n onChange={e => updateTaskDraft(s.alias, e.target.value)}\n onKeyDown={e => e.key === 'Enter' && sendTask(s.alias)}\n placeholder={`Send task to ${s.alias}...`}\n className=\"w-full rounded-lg border border-[#2a2a4a] bg-[#0a0a15] px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-cyan-500 focus:outline-none\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setTaskOpenFor(null)}\n className=\"rounded-lg border border-gray-700 px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => sendTask(s.alias)}\n disabled={state.sending || !(taskDrafts[s.alias] || '').trim()}\n className=\"rounded-lg bg-cyan-600 px-3 py-1.5 text-xs text-white hover:bg-cyan-500 disabled:cursor-not-allowed disabled:bg-gray-700\"\n >\n {state.sending ? 'Sending...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n\n {state.error && <div className=\"mt-2 text-xs text-red-400\">{state.error}</div>}\n {state.success && taskOpenFor !== s.alias && <div className=\"mt-2 text-xs text-green-400\">{state.success}</div>}\n </div>\n );\n })}\n </div>\n )}\n\n {chatAlias && <TaskChatPanel alias={chatAlias} onClose={() => setChatAlias(null)} />}\n </div>\n );\n}\n"],"names":["timeAgo","dateStr","diff","Date","now","replace","getTime","s","Math","floor","statusColor","status","hasSse","formatUptime","seconds","h","m","fetcher","url","res","fetch","window","location","assign","Error","json","SWR_OPTIONS","refreshInterval","dedupingInterval","withNetwork","networkId","sep","includes","encodeURIComponent","useSessions","data","error","isLoading","sessions","hint","_hint","useHealth","health","useAnetConfig","config","useTasks","params","query","URLSearchParams","limit","toString","tasks","count","source","useStats","stats","ok","useLicense","license","useMessages","messages","useNodeSession","alias","session","inbox","sse","React","_interopDefaultLegacy","e","React__default","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","Constructor","protoProps","staticProps","prototype","isProd","process","env","isString","o","call","StyleSheet","param","ref","_name","name","_optimizeForSpeed","optimizeForSpeed","invariant$1","_deletedRulePlaceholder","_serverSheet","undefined","_tags","_injected","_rulesCount","node","document","querySelector","_nonce","_proto","setOptimizeForSpeed","bool","flush","inject","isOptimizeForSpeed","_this","cssRules","insertRule","rule","index","cssText","push","deleteRule","getSheetForTag","tag","sheet","styleSheets","ownerNode","getSheet","insertionPoint","replaceRule","trim","console","warn","makeStyleTag","cssString","relativeToTag","createElement","setAttribute","type","appendChild","createTextNode","head","getElementsByTagName","insertBefore","get","condition","message","hash","str","_$hash","charCodeAt","stringHash","sanitize","cache","computeId","baseId","propsToString","String","computeSelector","id","css","selectoPlaceholderRegexp","idcss","mapRulesToStyle","options","map","args","nonce","dangerouslySetInnerHTML","__html","StyleSheetRegistry","_styleSheet","styleSheet","_sheet","_fromServer","_indices","_instancesCounts","add","Array","isArray","children","getIdAndRules","styleId","rules","indices","filter","remove","invariant","tagFromServer","parentNode","removeChild","forEach","update","nextProps","fromServer","keys","concat","join","Boolean","styles","dynamic","selectFromServer","elements","slice","querySelectorAll","reduce","acc","element","StyleSheetContext","createContext","displayName","createStyleRegistry","StyleRegistry","configuredRegistry","registry","rootRegistry","useContext","useState","Provider","value","useStyleRegistry","useInsertionEffect","useLayoutEffect","defaultRegistry","JSXStyle","info","tagInfo","exports","style","module","STATUS_COLORS","working","idle","blocked","offline","NodesPage","loading","sseMap","sse_sessions","sseFor","network_id","filterStatus","setFilterStatus","search","setSearch","viewMode","setViewMode","taskDrafts","setTaskDrafts","taskOpenFor","setTaskOpenFor","sendState","setSendState","chatAlias","setChatAlias","filtered","online","toLowerCase","agent","sort","a","b","onlineCount","openSendTask","current","prev","updateTaskDraft","sendTask","task","sending","method","headers","body","JSON","stringify","success","className","total","width","onChange","placeholder","mode","onClick","statusKey","state","progress","href","server","last_seen_at","updated_at","onKeyDown","disabled","onClose"],"mappings":"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","ignoreList":[2,3]}
@@ -1,3 +0,0 @@
1
- module.exports=[43515,a=>{"use strict";a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"timeAgo",0,function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}])},54826,(a,b,c)=>{},15299,(a,b,c)=>{a.r(54826);var d=a.r(72131),e=d&&"object"==typeof d&&"default"in d?d:{default:d},f="u">typeof process&&process.env&&!0,g=function(a){return"[object String]"===Object.prototype.toString.call(a)},h=function(){function a(a){var b=void 0===a?{}:a,c=b.name,d=void 0===c?"stylesheet":c,e=b.optimizeForSpeed,h=void 0===e?f:e;i(g(d),"`name` must be a string"),this._name=d,this._deletedRulePlaceholder="#"+d+"-deleted-rule____{}",i("boolean"==typeof h,"`optimizeForSpeed` must be a boolean"),this._optimizeForSpeed=h,this._serverSheet=void 0,this._tags=[],this._injected=!1,this._rulesCount=0,this._nonce=null}var b,c=a.prototype;return c.setOptimizeForSpeed=function(a){i("boolean"==typeof a,"`setOptimizeForSpeed` accepts a boolean"),i(0===this._rulesCount,"optimizeForSpeed cannot be when rules have already been inserted"),this.flush(),this._optimizeForSpeed=a,this.inject()},c.isOptimizeForSpeed=function(){return this._optimizeForSpeed},c.inject=function(){var a=this;i(!this._injected,"sheet already injected"),this._injected=!0,this._serverSheet={cssRules:[],insertRule:function(b,c){return"number"==typeof c?a._serverSheet.cssRules[c]={cssText:b}:a._serverSheet.cssRules.push({cssText:b}),c},deleteRule:function(b){a._serverSheet.cssRules[b]=null}}},c.getSheetForTag=function(a){if(a.sheet)return a.sheet;for(var b=0;b<document.styleSheets.length;b++)if(document.styleSheets[b].ownerNode===a)return document.styleSheets[b]},c.getSheet=function(){return this.getSheetForTag(this._tags[this._tags.length-1])},c.insertRule=function(a,b){return i(g(a),"`insertRule` accepts only strings"),"number"!=typeof b&&(b=this._serverSheet.cssRules.length),this._serverSheet.insertRule(a,b),this._rulesCount++},c.replaceRule=function(a,b){this._optimizeForSpeed;var c=this._serverSheet;if(b.trim()||(b=this._deletedRulePlaceholder),!c.cssRules[a])return a;c.deleteRule(a);try{c.insertRule(b,a)}catch(d){f||console.warn("StyleSheet: illegal rule: \n\n"+b+"\n\nSee https://stackoverflow.com/q/20007992 for more info"),c.insertRule(this._deletedRulePlaceholder,a)}return a},c.deleteRule=function(a){this._serverSheet.deleteRule(a)},c.flush=function(){this._injected=!1,this._rulesCount=0,this._serverSheet.cssRules=[]},c.cssRules=function(){return this._serverSheet.cssRules},c.makeStyleTag=function(a,b,c){b&&i(g(b),"makeStyleTag accepts only strings as second parameter");var d=document.createElement("style");this._nonce&&d.setAttribute("nonce",this._nonce),d.type="text/css",d.setAttribute("data-"+a,""),b&&d.appendChild(document.createTextNode(b));var e=document.head||document.getElementsByTagName("head")[0];return c?e.insertBefore(d,c):e.appendChild(d),d},b=[{key:"length",get:function(){return this._rulesCount}}],function(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}(a.prototype,b),a}();function i(a,b){if(!a)throw Error("StyleSheet: "+b+".")}var j=function(a){for(var b=5381,c=a.length;c;)b=33*b^a.charCodeAt(--c);return b>>>0},k={};function l(a,b){if(!b)return"jsx-"+a;var c=String(b),d=a+c;return k[d]||(k[d]="jsx-"+j(a+"-"+c)),k[d]}function m(a,b){var c=a+(b=b.replace(/\/style/gi,"\\/style"));return k[c]||(k[c]=b.replace(/__jsx-style-dynamic-selector/g,a)),k[c]}var n=function(){function a(a){var b=void 0===a?{}:a,c=b.styleSheet,d=void 0===c?null:c,e=b.optimizeForSpeed,f=void 0!==e&&e;this._sheet=d||new h({name:"styled-jsx",optimizeForSpeed:f}),this._sheet.inject(),d&&"boolean"==typeof f&&(this._sheet.setOptimizeForSpeed(f),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed()),this._fromServer=void 0,this._indices={},this._instancesCounts={}}var b=a.prototype;return b.add=function(a){var b=this;void 0===this._optimizeForSpeed&&(this._optimizeForSpeed=Array.isArray(a.children),this._sheet.setOptimizeForSpeed(this._optimizeForSpeed),this._optimizeForSpeed=this._sheet.isOptimizeForSpeed());var c=this.getIdAndRules(a),d=c.styleId,e=c.rules;if(d in this._instancesCounts){this._instancesCounts[d]+=1;return}var f=e.map(function(a){return b._sheet.insertRule(a)}).filter(function(a){return -1!==a});this._indices[d]=f,this._instancesCounts[d]=1},b.remove=function(a){var b=this,c=this.getIdAndRules(a).styleId;if(function(a,b){if(!a)throw Error("StyleSheetRegistry: "+b+".")}(c in this._instancesCounts,"styleId: `"+c+"` not found"),this._instancesCounts[c]-=1,this._instancesCounts[c]<1){var d=this._fromServer&&this._fromServer[c];d?(d.parentNode.removeChild(d),delete this._fromServer[c]):(this._indices[c].forEach(function(a){return b._sheet.deleteRule(a)}),delete this._indices[c]),delete this._instancesCounts[c]}},b.update=function(a,b){this.add(b),this.remove(a)},b.flush=function(){this._sheet.flush(),this._sheet.inject(),this._fromServer=void 0,this._indices={},this._instancesCounts={}},b.cssRules=function(){var a=this,b=this._fromServer?Object.keys(this._fromServer).map(function(b){return[b,a._fromServer[b]]}):[],c=this._sheet.cssRules();return b.concat(Object.keys(this._indices).map(function(b){return[b,a._indices[b].map(function(a){return c[a].cssText}).join(a._optimizeForSpeed?"":"\n")]}).filter(function(a){return!!a[1]}))},b.styles=function(a){var b,c;return b=this.cssRules(),void 0===(c=a)&&(c={}),b.map(function(a){var b=a[0],d=a[1];return e.default.createElement("style",{id:"__"+b,key:"__"+b,nonce:c.nonce?c.nonce:void 0,dangerouslySetInnerHTML:{__html:d}})})},b.getIdAndRules=function(a){var b=a.children,c=a.dynamic,d=a.id;if(c){var e=l(d,c);return{styleId:e,rules:Array.isArray(b)?b.map(function(a){return m(e,a)}):[m(e,b)]}}return{styleId:l(d),rules:Array.isArray(b)?b:[b]}},b.selectFromServer=function(){return Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')).reduce(function(a,b){return a[b.id.slice(2)]=b,a},{})},a}(),o=d.createContext(null);function p(){return new n}function q(){return d.useContext(o)}function r(a){var b=q();return b&&b.add(a),null}o.displayName="StyleSheetContext",e.default.useInsertionEffect||e.default.useLayoutEffect,r.dynamic=function(a){return a.map(function(a){return l(a[0],a[1])}).join(" ")},c.StyleRegistry=function(a){var b=a.registry,c=a.children,f=d.useContext(o),g=d.useState(function(){return f||b||p()})[0];return e.default.createElement(o.Provider,{value:g},c)},c.createStyleRegistry=p,c.style=r,c.useStyleRegistry=q},31626,(a,b,c)=>{b.exports=a.r(15299).style}];
2
-
3
- //# sourceMappingURL=_06_xh1~._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/components/utils.ts","../../../../node_modules/styled-jsx/dist/index/index.js","../../../../node_modules/styled-jsx/style.js"],"sourcesContent":["export function timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","require('client-only');\nvar React = require('react');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar React__default = /*#__PURE__*/_interopDefaultLegacy(React);\n\n/*\nBased on Glamor's sheet\nhttps://github.com/threepointone/glamor/blob/667b480d31b3721a905021b26e1290ce92ca2879/src/sheet.js\n*/ function _defineProperties(target, props) {\n for(var i = 0; i < props.length; i++){\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nvar isProd = typeof process !== \"undefined\" && process.env && process.env.NODE_ENV === \"production\";\nvar isString = function(o) {\n return Object.prototype.toString.call(o) === \"[object String]\";\n};\nvar StyleSheet = /*#__PURE__*/ function() {\n function StyleSheet(param) {\n var ref = param === void 0 ? {} : param, _name = ref.name, name = _name === void 0 ? \"stylesheet\" : _name, _optimizeForSpeed = ref.optimizeForSpeed, optimizeForSpeed = _optimizeForSpeed === void 0 ? isProd : _optimizeForSpeed;\n invariant$1(isString(name), \"`name` must be a string\");\n this._name = name;\n this._deletedRulePlaceholder = \"#\" + name + \"-deleted-rule____{}\";\n invariant$1(typeof optimizeForSpeed === \"boolean\", \"`optimizeForSpeed` must be a boolean\");\n this._optimizeForSpeed = optimizeForSpeed;\n this._serverSheet = undefined;\n this._tags = [];\n this._injected = false;\n this._rulesCount = 0;\n var node = typeof window !== \"undefined\" && document.querySelector('meta[property=\"csp-nonce\"]');\n this._nonce = node ? node.getAttribute(\"content\") : null;\n }\n var _proto = StyleSheet.prototype;\n _proto.setOptimizeForSpeed = function setOptimizeForSpeed(bool) {\n invariant$1(typeof bool === \"boolean\", \"`setOptimizeForSpeed` accepts a boolean\");\n invariant$1(this._rulesCount === 0, \"optimizeForSpeed cannot be when rules have already been inserted\");\n this.flush();\n this._optimizeForSpeed = bool;\n this.inject();\n };\n _proto.isOptimizeForSpeed = function isOptimizeForSpeed() {\n return this._optimizeForSpeed;\n };\n _proto.inject = function inject() {\n var _this = this;\n invariant$1(!this._injected, \"sheet already injected\");\n this._injected = true;\n if (typeof window !== \"undefined\" && this._optimizeForSpeed) {\n this._tags[0] = this.makeStyleTag(this._name);\n this._optimizeForSpeed = \"insertRule\" in this.getSheet();\n if (!this._optimizeForSpeed) {\n if (!isProd) {\n console.warn(\"StyleSheet: optimizeForSpeed mode not supported falling back to standard mode.\");\n }\n this.flush();\n this._injected = true;\n }\n return;\n }\n this._serverSheet = {\n cssRules: [],\n insertRule: function(rule, index) {\n if (typeof index === \"number\") {\n _this._serverSheet.cssRules[index] = {\n cssText: rule\n };\n } else {\n _this._serverSheet.cssRules.push({\n cssText: rule\n });\n }\n return index;\n },\n deleteRule: function(index) {\n _this._serverSheet.cssRules[index] = null;\n }\n };\n };\n _proto.getSheetForTag = function getSheetForTag(tag) {\n if (tag.sheet) {\n return tag.sheet;\n }\n // this weirdness brought to you by firefox\n for(var i = 0; i < document.styleSheets.length; i++){\n if (document.styleSheets[i].ownerNode === tag) {\n return document.styleSheets[i];\n }\n }\n };\n _proto.getSheet = function getSheet() {\n return this.getSheetForTag(this._tags[this._tags.length - 1]);\n };\n _proto.insertRule = function insertRule(rule, index) {\n invariant$1(isString(rule), \"`insertRule` accepts only strings\");\n if (typeof window === \"undefined\") {\n if (typeof index !== \"number\") {\n index = this._serverSheet.cssRules.length;\n }\n this._serverSheet.insertRule(rule, index);\n return this._rulesCount++;\n }\n if (this._optimizeForSpeed) {\n var sheet = this.getSheet();\n if (typeof index !== \"number\") {\n index = sheet.cssRules.length;\n }\n // this weirdness for perf, and chrome's weird bug\n // https://stackoverflow.com/questions/20007992/chrome-suddenly-stopped-accepting-insertrule\n try {\n sheet.insertRule(rule, index);\n } catch (error) {\n if (!isProd) {\n console.warn(\"StyleSheet: illegal rule: \\n\\n\" + rule + \"\\n\\nSee https://stackoverflow.com/q/20007992 for more info\");\n }\n return -1;\n }\n } else {\n var insertionPoint = this._tags[index];\n this._tags.push(this.makeStyleTag(this._name, rule, insertionPoint));\n }\n return this._rulesCount++;\n };\n _proto.replaceRule = function replaceRule(index, rule) {\n if (this._optimizeForSpeed || typeof window === \"undefined\") {\n var sheet = typeof window !== \"undefined\" ? this.getSheet() : this._serverSheet;\n if (!rule.trim()) {\n rule = this._deletedRulePlaceholder;\n }\n if (!sheet.cssRules[index]) {\n // @TBD Should we throw an error?\n return index;\n }\n sheet.deleteRule(index);\n try {\n sheet.insertRule(rule, index);\n } catch (error) {\n if (!isProd) {\n console.warn(\"StyleSheet: illegal rule: \\n\\n\" + rule + \"\\n\\nSee https://stackoverflow.com/q/20007992 for more info\");\n }\n // In order to preserve the indices we insert a deleteRulePlaceholder\n sheet.insertRule(this._deletedRulePlaceholder, index);\n }\n } else {\n var tag = this._tags[index];\n invariant$1(tag, \"old rule at index `\" + index + \"` not found\");\n tag.textContent = rule;\n }\n return index;\n };\n _proto.deleteRule = function deleteRule(index) {\n if (typeof window === \"undefined\") {\n this._serverSheet.deleteRule(index);\n return;\n }\n if (this._optimizeForSpeed) {\n this.replaceRule(index, \"\");\n } else {\n var tag = this._tags[index];\n invariant$1(tag, \"rule at index `\" + index + \"` not found\");\n tag.parentNode.removeChild(tag);\n this._tags[index] = null;\n }\n };\n _proto.flush = function flush() {\n this._injected = false;\n this._rulesCount = 0;\n if (typeof window !== \"undefined\") {\n this._tags.forEach(function(tag) {\n return tag && tag.parentNode.removeChild(tag);\n });\n this._tags = [];\n } else {\n // simpler on server\n this._serverSheet.cssRules = [];\n }\n };\n _proto.cssRules = function cssRules() {\n var _this = this;\n if (typeof window === \"undefined\") {\n return this._serverSheet.cssRules;\n }\n return this._tags.reduce(function(rules, tag) {\n if (tag) {\n rules = rules.concat(Array.prototype.map.call(_this.getSheetForTag(tag).cssRules, function(rule) {\n return rule.cssText === _this._deletedRulePlaceholder ? null : rule;\n }));\n } else {\n rules.push(null);\n }\n return rules;\n }, []);\n };\n _proto.makeStyleTag = function makeStyleTag(name, cssString, relativeToTag) {\n if (cssString) {\n invariant$1(isString(cssString), \"makeStyleTag accepts only strings as second parameter\");\n }\n var tag = document.createElement(\"style\");\n if (this._nonce) tag.setAttribute(\"nonce\", this._nonce);\n tag.type = \"text/css\";\n tag.setAttribute(\"data-\" + name, \"\");\n if (cssString) {\n tag.appendChild(document.createTextNode(cssString));\n }\n var head = document.head || document.getElementsByTagName(\"head\")[0];\n if (relativeToTag) {\n head.insertBefore(tag, relativeToTag);\n } else {\n head.appendChild(tag);\n }\n return tag;\n };\n _createClass(StyleSheet, [\n {\n key: \"length\",\n get: function get() {\n return this._rulesCount;\n }\n }\n ]);\n return StyleSheet;\n}();\nfunction invariant$1(condition, message) {\n if (!condition) {\n throw new Error(\"StyleSheet: \" + message + \".\");\n }\n}\n\nfunction hash(str) {\n var _$hash = 5381, i = str.length;\n while(i){\n _$hash = _$hash * 33 ^ str.charCodeAt(--i);\n }\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */ return _$hash >>> 0;\n}\nvar stringHash = hash;\n\nvar sanitize = function(rule) {\n return rule.replace(/\\/style/gi, \"\\\\/style\");\n};\nvar cache = {};\n/**\n * computeId\n *\n * Compute and memoize a jsx id from a basedId and optionally props.\n */ function computeId(baseId, props) {\n if (!props) {\n return \"jsx-\" + baseId;\n }\n var propsToString = String(props);\n var key = baseId + propsToString;\n if (!cache[key]) {\n cache[key] = \"jsx-\" + stringHash(baseId + \"-\" + propsToString);\n }\n return cache[key];\n}\n/**\n * computeSelector\n *\n * Compute and memoize dynamic selectors.\n */ function computeSelector(id, css) {\n var selectoPlaceholderRegexp = /__jsx-style-dynamic-selector/g;\n // Sanitize SSR-ed CSS.\n // Client side code doesn't need to be sanitized since we use\n // document.createTextNode (dev) and the CSSOM api sheet.insertRule (prod).\n if (typeof window === \"undefined\") {\n css = sanitize(css);\n }\n var idcss = id + css;\n if (!cache[idcss]) {\n cache[idcss] = css.replace(selectoPlaceholderRegexp, id);\n }\n return cache[idcss];\n}\n\nfunction mapRulesToStyle(cssRules, options) {\n if (options === void 0) options = {};\n return cssRules.map(function(args) {\n var id = args[0];\n var css = args[1];\n return /*#__PURE__*/ React__default[\"default\"].createElement(\"style\", {\n id: \"__\" + id,\n // Avoid warnings upon render with a key\n key: \"__\" + id,\n nonce: options.nonce ? options.nonce : undefined,\n dangerouslySetInnerHTML: {\n __html: css\n }\n });\n });\n}\nvar StyleSheetRegistry = /*#__PURE__*/ function() {\n function StyleSheetRegistry(param) {\n var ref = param === void 0 ? {} : param, _styleSheet = ref.styleSheet, styleSheet = _styleSheet === void 0 ? null : _styleSheet, _optimizeForSpeed = ref.optimizeForSpeed, optimizeForSpeed = _optimizeForSpeed === void 0 ? false : _optimizeForSpeed;\n this._sheet = styleSheet || new StyleSheet({\n name: \"styled-jsx\",\n optimizeForSpeed: optimizeForSpeed\n });\n this._sheet.inject();\n if (styleSheet && typeof optimizeForSpeed === \"boolean\") {\n this._sheet.setOptimizeForSpeed(optimizeForSpeed);\n this._optimizeForSpeed = this._sheet.isOptimizeForSpeed();\n }\n this._fromServer = undefined;\n this._indices = {};\n this._instancesCounts = {};\n }\n var _proto = StyleSheetRegistry.prototype;\n _proto.add = function add(props) {\n var _this = this;\n if (undefined === this._optimizeForSpeed) {\n this._optimizeForSpeed = Array.isArray(props.children);\n this._sheet.setOptimizeForSpeed(this._optimizeForSpeed);\n this._optimizeForSpeed = this._sheet.isOptimizeForSpeed();\n }\n if (typeof window !== \"undefined\" && !this._fromServer) {\n this._fromServer = this.selectFromServer();\n this._instancesCounts = Object.keys(this._fromServer).reduce(function(acc, tagName) {\n acc[tagName] = 0;\n return acc;\n }, {});\n }\n var ref = this.getIdAndRules(props), styleId = ref.styleId, rules = ref.rules;\n // Deduping: just increase the instances count.\n if (styleId in this._instancesCounts) {\n this._instancesCounts[styleId] += 1;\n return;\n }\n var indices = rules.map(function(rule) {\n return _this._sheet.insertRule(rule);\n })// Filter out invalid rules\n .filter(function(index) {\n return index !== -1;\n });\n this._indices[styleId] = indices;\n this._instancesCounts[styleId] = 1;\n };\n _proto.remove = function remove(props) {\n var _this = this;\n var styleId = this.getIdAndRules(props).styleId;\n invariant(styleId in this._instancesCounts, \"styleId: `\" + styleId + \"` not found\");\n this._instancesCounts[styleId] -= 1;\n if (this._instancesCounts[styleId] < 1) {\n var tagFromServer = this._fromServer && this._fromServer[styleId];\n if (tagFromServer) {\n tagFromServer.parentNode.removeChild(tagFromServer);\n delete this._fromServer[styleId];\n } else {\n this._indices[styleId].forEach(function(index) {\n return _this._sheet.deleteRule(index);\n });\n delete this._indices[styleId];\n }\n delete this._instancesCounts[styleId];\n }\n };\n _proto.update = function update(props, nextProps) {\n this.add(nextProps);\n this.remove(props);\n };\n _proto.flush = function flush() {\n this._sheet.flush();\n this._sheet.inject();\n this._fromServer = undefined;\n this._indices = {};\n this._instancesCounts = {};\n };\n _proto.cssRules = function cssRules() {\n var _this = this;\n var fromServer = this._fromServer ? Object.keys(this._fromServer).map(function(styleId) {\n return [\n styleId,\n _this._fromServer[styleId]\n ];\n }) : [];\n var cssRules = this._sheet.cssRules();\n return fromServer.concat(Object.keys(this._indices).map(function(styleId) {\n return [\n styleId,\n _this._indices[styleId].map(function(index) {\n return cssRules[index].cssText;\n }).join(_this._optimizeForSpeed ? \"\" : \"\\n\")\n ];\n })// filter out empty rules\n .filter(function(rule) {\n return Boolean(rule[1]);\n }));\n };\n _proto.styles = function styles(options) {\n return mapRulesToStyle(this.cssRules(), options);\n };\n _proto.getIdAndRules = function getIdAndRules(props) {\n var css = props.children, dynamic = props.dynamic, id = props.id;\n if (dynamic) {\n var styleId = computeId(id, dynamic);\n return {\n styleId: styleId,\n rules: Array.isArray(css) ? css.map(function(rule) {\n return computeSelector(styleId, rule);\n }) : [\n computeSelector(styleId, css)\n ]\n };\n }\n return {\n styleId: computeId(id),\n rules: Array.isArray(css) ? css : [\n css\n ]\n };\n };\n /**\n * selectFromServer\n *\n * Collects style tags from the document with id __jsx-XXX\n */ _proto.selectFromServer = function selectFromServer() {\n var elements = Array.prototype.slice.call(document.querySelectorAll('[id^=\"__jsx-\"]'));\n return elements.reduce(function(acc, element) {\n var id = element.id.slice(2);\n acc[id] = element;\n return acc;\n }, {});\n };\n return StyleSheetRegistry;\n}();\nfunction invariant(condition, message) {\n if (!condition) {\n throw new Error(\"StyleSheetRegistry: \" + message + \".\");\n }\n}\nvar StyleSheetContext = /*#__PURE__*/ React.createContext(null);\nStyleSheetContext.displayName = \"StyleSheetContext\";\nfunction createStyleRegistry() {\n return new StyleSheetRegistry();\n}\nfunction StyleRegistry(param) {\n var configuredRegistry = param.registry, children = param.children;\n var rootRegistry = React.useContext(StyleSheetContext);\n var ref = React.useState(function() {\n return rootRegistry || configuredRegistry || createStyleRegistry();\n }), registry = ref[0];\n return /*#__PURE__*/ React__default[\"default\"].createElement(StyleSheetContext.Provider, {\n value: registry\n }, children);\n}\nfunction useStyleRegistry() {\n return React.useContext(StyleSheetContext);\n}\n\n// Opt-into the new `useInsertionEffect` API in React 18, fallback to `useLayoutEffect`.\n// https://github.com/reactwg/react-18/discussions/110\nvar useInsertionEffect = React__default[\"default\"].useInsertionEffect || React__default[\"default\"].useLayoutEffect;\nvar defaultRegistry = typeof window !== \"undefined\" ? createStyleRegistry() : undefined;\nfunction JSXStyle(props) {\n var registry = defaultRegistry ? defaultRegistry : useStyleRegistry();\n // If `registry` does not exist, we do nothing here.\n if (!registry) {\n return null;\n }\n if (typeof window === \"undefined\") {\n registry.add(props);\n return null;\n }\n useInsertionEffect(function() {\n registry.add(props);\n return function() {\n registry.remove(props);\n };\n // props.children can be string[], will be striped since id is identical\n }, [\n props.id,\n String(props.dynamic)\n ]);\n return null;\n}\nJSXStyle.dynamic = function(info) {\n return info.map(function(tagInfo) {\n var baseId = tagInfo[0];\n var props = tagInfo[1];\n return computeId(baseId, props);\n }).join(\" \");\n};\n\nexports.StyleRegistry = StyleRegistry;\nexports.createStyleRegistry = createStyleRegistry;\nexports.style = JSXStyle;\nexports.useStyleRegistry = useStyleRegistry;\n","module.exports = require('./dist/index').style\n"],"names":["timeAgo","dateStr","diff","Date","now","replace","getTime","s","Math","floor","statusColor","status","hasSse","formatUptime","seconds","h","m","React","_interopDefaultLegacy","e","React__default","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","Constructor","protoProps","staticProps","prototype","isProd","process","env","isString","o","toString","call","StyleSheet","param","ref","_name","name","_optimizeForSpeed","optimizeForSpeed","invariant$1","_deletedRulePlaceholder","_serverSheet","undefined","_tags","_injected","_rulesCount","node","document","querySelector","_nonce","_proto","setOptimizeForSpeed","bool","flush","inject","isOptimizeForSpeed","_this","cssRules","insertRule","rule","index","cssText","push","deleteRule","getSheetForTag","tag","sheet","styleSheets","ownerNode","getSheet","insertionPoint","replaceRule","trim","error","console","warn","makeStyleTag","cssString","relativeToTag","createElement","setAttribute","type","appendChild","createTextNode","head","getElementsByTagName","insertBefore","get","condition","message","Error","hash","str","_$hash","charCodeAt","stringHash","sanitize","cache","computeId","baseId","propsToString","String","computeSelector","id","css","selectoPlaceholderRegexp","idcss","mapRulesToStyle","options","map","args","nonce","dangerouslySetInnerHTML","__html","StyleSheetRegistry","_styleSheet","styleSheet","_sheet","_fromServer","_indices","_instancesCounts","add","Array","isArray","children","getIdAndRules","styleId","rules","indices","filter","remove","invariant","tagFromServer","parentNode","removeChild","forEach","update","nextProps","fromServer","keys","concat","join","Boolean","styles","dynamic","selectFromServer","elements","slice","querySelectorAll","reduce","acc","element","StyleSheetContext","createContext","displayName","createStyleRegistry","StyleRegistry","configuredRegistry","registry","rootRegistry","useContext","useState","Provider","value","useStyleRegistry","useInsertionEffect","useLayoutEffect","defaultRegistry","JSXStyle","info","tagInfo","exports","style","module"],"mappings":"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","ignoreList":[1,2]}
@@ -1,9 +0,0 @@
1
- module.exports=[43515,a=>{"use strict";a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"timeAgo",0,function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}])},44332,a=>{"use strict";var b=a.i(72596),c=a.i(22397);let d=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()},e={refreshInterval:5e3,dedupingInterval:3e3};function f(a,b){if(!b)return a;let c=a.includes("?")?"&":"?";return`${a}${c}network_id=${encodeURIComponent(b)}`}a.s(["useAnetConfig",0,function(){let{data:a}=(0,b.default)("/api/anet/config",d,{refreshInterval:3e4});return{config:a||null}},"useHealth",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/health",d,e);return{health:a||null,error:c}},"useLicense",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/license",d,{refreshInterval:6e4});return{license:a?.ok?a:null,error:c}},"useMessages",0,function(a=100){let{networkId:g}=(0,c.useNetworkId)(),{data:h,error:i,isLoading:j}=(0,b.default)(f(`/api/hub/messages?limit=${a}`,g),d,e);return{messages:h?.messages||[],error:i,isLoading:j}},"useSessions",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h,isLoading:i}=(0,b.default)(f("/api/hub/status",a),d,e);return{sessions:g?.sessions||[],hint:g?._hint,error:h,isLoading:i}},"useStats",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h}=(0,b.default)(f("/api/hub/stats",a),d,e);return{stats:g?.ok?g:null,error:h}},"useTasks",0,function(a){let{networkId:g}=(0,c.useNetworkId)(),h=new URLSearchParams({limit:"100",...a}).toString(),{data:i,error:j,isLoading:k}=(0,b.default)(f(`/api/hub/tasks?${h}`,g),d,e);return{tasks:i?.tasks||[],count:i?.count??0,source:i?.source,error:j,isLoading:k}}])},59718,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(44332),e=a.i(43515);let f={task:"bg-green-500/10 text-green-300 border-green-500/20",message:"bg-blue-500/10 text-blue-300 border-blue-500/20",broadcast:"bg-purple-500/10 text-purple-300 border-purple-500/20",reply:"bg-cyan-500/10 text-cyan-300 border-cyan-500/20"};function g(a){return a?new Date(a.replace(" ","T")+"Z").getTime():0}a.s(["default",0,function(){let{messages:a,isLoading:h}=(0,d.useMessages)(200),[i,j]=(0,c.useState)(""),[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(!1),[o,p]=(0,c.useState)("timeline"),q=(0,c.useMemo)(()=>{let b=new Set;return a.forEach(a=>{let c=a.from_alias?.trim();c&&"dashboard"!==c.toLowerCase()&&b.add(c)}),[...b].slice(0,8)},[a]),r=(0,c.useMemo)(()=>{let b=k.trim().toLowerCase(),c=b.startsWith("from:")?b.slice(5).trim():"";return[...a].filter(a=>(!i||a.type===i)&&(c?(a.from_alias||"").toLowerCase().includes(c):!b||(a.from_alias||"").toLowerCase().includes(b)||(a.to_alias||"").toLowerCase().includes(b)||(a.content||"").toLowerCase().includes(b))).sort((a,b)=>g(a.created_at)-g(b.created_at))},[i,a,k]),s=(0,c.useMemo)(()=>{let a=new Map;return r.forEach(b=>{let c=b.from_alias||"?",d=b.to_alias||"?",e=[c,d].sort().join("↔"),f=a.get(e)||{participants:[c,d].sort(),messages:[],lastTime:0};f.messages.push(b),f.lastTime=Math.max(f.lastTime,g(b.created_at)),a.set(e,f)}),[...a.values()].sort((a,b)=>b.lastTime-a.lastTime)},[r]);return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-6",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white lg:ml-0 ml-10",children:"Messages"}),(0,b.jsx)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30",children:a.length}),r.length>0&&(0,b.jsx)("button",{onClick:()=>{let a=r.map(a=>`**${a.from_alias||"?"}** → ${a.to_alias||"?"} (${a.type||"?"}) — ${a.created_at||""}
2
-
3
- ${a.content||"--"}
4
-
5
- ---`).join("\n\n"),b=new Blob([`# Messages Export
6
-
7
- ${a}`],{type:"text/markdown"}),c=URL.createObjectURL(b),d=document.createElement("a");d.href=c,d.download=`messages-${new Date().toISOString().slice(0,10)}.md`,d.click(),URL.revokeObjectURL(c)},className:"text-xs text-gray-500 hover:text-gray-300 border border-gray-700/50 px-2.5 py-1 rounded-lg transition-colors",children:"Export MD"})]}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-3 mb-3",children:[(0,b.jsx)("input",{type:"text",value:k,onChange:a=>l(a.target.value),placeholder:"Search from/to/content or use from:alias",className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:outline-none w-full sm:w-72"}),(0,b.jsxs)("select",{value:i,onChange:a=>j(a.target.value),className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-blue-500/50 focus:outline-none",children:[(0,b.jsx)("option",{value:"",children:"All types"}),(0,b.jsx)("option",{value:"task",children:"task"}),(0,b.jsx)("option",{value:"message",children:"message"}),(0,b.jsx)("option",{value:"broadcast",children:"broadcast"}),(0,b.jsx)("option",{value:"reply",children:"reply"})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-0.5",children:["timeline","grouped"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>p(a),className:`rounded-md px-2.5 py-1.5 text-xs transition-colors ${o===a?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"timeline"===a?"Timeline":"Grouped"},a))}),(0,b.jsx)("button",{onClick:()=>n(!m),className:`text-xs px-3 py-2 rounded-lg border transition-colors ${m?"bg-yellow-500/10 text-yellow-300 border-yellow-500/20":"text-gray-500 border-gray-700/50 hover:text-gray-300"}`,children:m?"Debug ON":"Debug"})]}),q.length>0&&(0,b.jsxs)("div",{className:"mb-6 flex flex-wrap gap-2",children:[q.map(a=>(0,b.jsxs)("button",{type:"button",onClick:()=>l(`from:${a}`),className:`rounded-full border px-3 py-1 text-xs transition-colors ${k===`from:${a}`?"border-cyan-500/30 bg-cyan-500/10 text-cyan-300":"border-[#2a2a4a] bg-[#111128] text-gray-400 hover:text-gray-200"}`,children:["from:",a]},a)),k.startsWith("from:")&&(0,b.jsx)("button",{type:"button",onClick:()=>l(""),className:"rounded-full border border-gray-700 px-3 py-1 text-xs text-gray-500 hover:text-gray-200",children:"Clear"})]}),h?(0,b.jsx)("div",{className:"animate-pulse space-y-3",children:[1,2,3,4,5].map(a=>(0,b.jsx)("div",{className:"h-20 rounded-2xl bg-gray-800/20"},a))}):0===r.length?(0,b.jsxs)("div",{className:"text-center py-16",children:[(0,b.jsx)("div",{className:"text-gray-600 text-4xl mb-4",children:"--"}),(0,b.jsx)("h3",{className:"text-gray-400 text-lg font-medium mb-2",children:"No messages"}),(0,b.jsx)("p",{className:"text-gray-600 text-sm",children:"Messages between agents will appear here."})]}):"grouped"===o?(0,b.jsx)("div",{className:"space-y-4",children:s.map((a,c)=>(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl overflow-hidden",children:[(0,b.jsxs)("div",{className:"px-4 py-2.5 border-b border-[#2a2a4a] flex items-center justify-between",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-sm text-cyan-300 font-medium",children:a.participants[0]}),(0,b.jsx)("span",{className:"text-gray-600 text-xs",children:"↔"}),(0,b.jsx)("span",{className:"text-sm text-green-300 font-medium",children:a.participants[1]})]}),(0,b.jsxs)("span",{className:"text-[10px] text-gray-600",children:[a.messages.length," messages"]})]}),(0,b.jsx)("div",{className:"px-4 py-2 space-y-2 max-h-64 overflow-y-auto",children:a.messages.map(c=>(0,b.jsxs)("div",{className:"flex items-start gap-2 text-xs py-1",children:[(0,b.jsx)("span",{className:`shrink-0 font-medium ${c.from_alias===a.participants[0]?"text-cyan-400":"text-green-400"}`,children:c.from_alias}),(0,b.jsx)("span",{className:"text-gray-400 flex-1",children:c.content?.slice(0,120)||"--"}),(0,b.jsx)("span",{className:"text-[9px] text-gray-600 shrink-0",children:(0,e.timeAgo)(c.created_at||"")})]},c.id))})]},c))}):(0,b.jsx)("div",{className:"space-y-3",children:r.map((a,c)=>{var d;let h=r[c-1],i=!!h&&g(a.created_at)-g(h.created_at)>3e5,j="broadcast"===a.type?"broadcast":"dashboard"===(a.from_alias||"").toLowerCase()?"outgoing":"incoming";return(0,b.jsxs)("div",{children:[i&&(0,b.jsxs)("div",{className:"my-4 flex items-center gap-3",children:[(0,b.jsx)("div",{className:"h-px flex-1 bg-[#2a2a4a]"}),(0,b.jsx)("div",{className:"text-[11px] text-gray-600",children:(d=a.created_at)?new Date(d.replace(" ","T")+"Z").toLocaleString():"Time gap"}),(0,b.jsx)("div",{className:"h-px flex-1 bg-[#2a2a4a]"})]}),(0,b.jsx)("div",{className:"broadcast"===j?"":"outgoing"===j?"flex justify-end":"flex justify-start",children:(0,b.jsxs)("div",{className:`rounded-2xl border px-4 py-3 shadow-sm ${"broadcast"===j?"w-full border-purple-500/20 bg-purple-500/10":"outgoing"===j?"max-w-3xl border-green-500/20 bg-green-500/10":"max-w-3xl border-blue-500/20 bg-blue-500/10"}`,children:[(0,b.jsxs)("div",{className:"mb-2 flex flex-wrap items-center gap-2",children:[(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded-md border ${f[a.type||""]||"bg-gray-500/10 text-gray-400 border-gray-500/20"}`,children:a.type||"unknown"}),(0,b.jsx)("span",{className:`text-sm font-medium ${"outgoing"===j?"text-green-300":"broadcast"===j?"text-purple-200":"text-blue-300"}`,children:a.from_alias||"--"}),"broadcast"!==j&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-xs text-gray-600",children:"→"}),(0,b.jsx)("span",{className:"text-sm text-gray-300",children:a.to_alias||"--"})]}),"broadcast"===j&&a.to_alias&&(0,b.jsxs)("span",{className:"text-xs text-purple-200/80",children:["to ",a.to_alias]}),"high"===a.priority&&(0,b.jsx)("span",{className:"text-xs text-red-400",children:"HIGH"}),(0,b.jsx)("span",{className:"ml-auto text-xs text-gray-500",children:a.created_at?(0,e.timeAgo)(a.created_at):"--"})]}),(0,b.jsx)("div",{className:"whitespace-pre-wrap text-sm leading-relaxed text-gray-200",children:(()=>{let c=a.content||"--",d=k.trim();if(!d||d.startsWith("from:"))return c;let e=c.toLowerCase().indexOf(d.toLowerCase());return e<0?c:(0,b.jsxs)(b.Fragment,{children:[c.slice(0,e),(0,b.jsx)("mark",{className:"bg-yellow-500/30 text-yellow-200 rounded px-0.5",children:c.slice(e,e+d.length)}),c.slice(e+d.length)]})})()}),m&&(0,b.jsxs)("div",{className:"mt-3 border-t border-white/10 pt-3 text-xs text-gray-500 space-y-1",children:[(0,b.jsxs)("div",{children:["ID: ",a.id]}),a.task_id&&(0,b.jsxs)("div",{children:["Task ID: ",a.task_id]}),(0,b.jsxs)("div",{children:["Created: ",a.created_at]})]})]})})]},a.id)})})]})}])}];
8
-
9
- //# sourceMappingURL=app_01vhyfx._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/components/utils.ts","../../../../app/lib/hooks.ts","../../../../app/messages/page.tsx"],"sourcesContent":["export function timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","import useSWR from 'swr';\nimport { Session, Health, AnetConfig } from '../components/types';\nimport { useNetworkId } from './network-context';\n\nconst fetcher = async (url: string) => {\n const res = await fetch(url);\n if (res.status === 401) {\n window.location.assign('/login');\n throw new Error('unauthorized');\n }\n return res.json();\n};\n\nconst SWR_OPTIONS = { refreshInterval: 5000, dedupingInterval: 3000 };\n\n/** Append network_id to URL if set */\nfunction withNetwork(url: string, networkId: string): string {\n if (!networkId) return url;\n const sep = url.includes('?') ? '&' : '?';\n return `${url}${sep}network_id=${encodeURIComponent(networkId)}`;\n}\n\nexport function useSessions() {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR<{ sessions: Session[]; _hint?: { global_count?: number; filtered_network?: string } }>(\n withNetwork('/api/hub/status', networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { sessions: data?.sessions || [], hint: data?._hint, error, isLoading };\n}\n\nexport function useHealth() {\n const { data, error } = useSWR<Health>('/api/hub/health', fetcher, SWR_OPTIONS);\n return { health: data || null, error };\n}\n\nexport function useAnetConfig() {\n const { data } = useSWR<AnetConfig>('/api/anet/config', fetcher, { refreshInterval: 30000 });\n return { config: data || null };\n}\n\nexport function useTasks(params?: Record<string, string>) {\n const { networkId } = useNetworkId();\n const query = new URLSearchParams({ limit: '100', ...params }).toString();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/tasks?${query}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return {\n tasks: data?.tasks || [],\n count: data?.count ?? 0,\n source: data?.source,\n error,\n isLoading,\n };\n}\n\nexport function useStats() {\n const { networkId } = useNetworkId();\n const { data, error } = useSWR(withNetwork('/api/hub/stats', networkId), fetcher, SWR_OPTIONS);\n return { stats: data?.ok ? data : null, error };\n}\n\nexport function useLicense() {\n const { data, error } = useSWR('/api/hub/license', fetcher, { refreshInterval: 60000 });\n return { license: data?.ok ? data : null, error };\n}\n\nexport function useMessages(limit = 100) {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/messages?limit=${limit}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { messages: data?.messages || [], error, isLoading };\n}\n\nexport function useNodeSession(alias: string) {\n const { data, error, isLoading } = useSWR(\n alias ? `/api/hub/session?alias=${encodeURIComponent(alias)}` : null,\n fetcher,\n SWR_OPTIONS,\n );\n return {\n session: data?.session || null,\n inbox: data?.inbox || [],\n sse: data?.sse || 0,\n error,\n isLoading,\n };\n}\n","'use client';\n\nimport { useMemo, useState } from 'react';\nimport { useMessages } from '../lib/hooks';\nimport { timeAgo } from '../components/utils';\n\ninterface MessageItem {\n id: string;\n type?: string;\n from_alias?: string;\n to_alias?: string;\n priority?: string;\n content?: string;\n created_at?: string;\n task_id?: string;\n}\n\nconst TYPE_COLORS: Record<string, string> = {\n task: 'bg-green-500/10 text-green-300 border-green-500/20',\n message: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n broadcast: 'bg-purple-500/10 text-purple-300 border-purple-500/20',\n reply: 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20',\n};\n\nfunction normalizeDate(value?: string) {\n if (!value) return 0;\n return new Date(value.replace(' ', 'T') + 'Z').getTime();\n}\n\nfunction formatDividerLabel(value?: string) {\n if (!value) return 'Time gap';\n const date = new Date(value.replace(' ', 'T') + 'Z');\n return date.toLocaleString();\n}\n\nfunction bubbleVariant(message: MessageItem) {\n if (message.type === 'broadcast') return 'broadcast';\n if ((message.from_alias || '').toLowerCase() === 'dashboard') return 'outgoing';\n return 'incoming';\n}\n\nexport default function MessagesPage() {\n const { messages, isLoading } = useMessages(200);\n const [filterType, setFilterType] = useState('');\n const [search, setSearch] = useState('');\n const [debug, setDebug] = useState(false);\n const [viewMode, setViewMode] = useState<'timeline' | 'grouped'>('timeline');\n\n const quickFromChips = useMemo(() => {\n const aliases = new Set<string>();\n messages.forEach((message: MessageItem) => {\n const alias = message.from_alias?.trim();\n if (alias && alias.toLowerCase() !== 'dashboard') aliases.add(alias);\n });\n return [...aliases].slice(0, 8);\n }, [messages]);\n\n const filtered = useMemo(() => {\n const query = search.trim().toLowerCase();\n const fromFilter = query.startsWith('from:') ? query.slice(5).trim() : '';\n\n return [...messages]\n .filter((m: MessageItem) => {\n if (filterType && m.type !== filterType) return false;\n if (fromFilter) {\n return (m.from_alias || '').toLowerCase().includes(fromFilter);\n }\n if (query) {\n return (m.from_alias || '').toLowerCase().includes(query)\n || (m.to_alias || '').toLowerCase().includes(query)\n || (m.content || '').toLowerCase().includes(query);\n }\n return true;\n })\n .sort((a: MessageItem, b: MessageItem) => normalizeDate(a.created_at) - normalizeDate(b.created_at));\n }, [filterType, messages, search]);\n\n // Group messages by conversation pair\n const conversations = useMemo(() => {\n const groups = new Map<string, { participants: string[]; messages: MessageItem[]; lastTime: number }>();\n filtered.forEach(m => {\n const a = m.from_alias || '?';\n const b = m.to_alias || '?';\n const key = [a, b].sort().join('↔');\n const group = groups.get(key) || { participants: [a, b].sort(), messages: [] as MessageItem[], lastTime: 0 };\n group.messages.push(m);\n group.lastTime = Math.max(group.lastTime, normalizeDate(m.created_at));\n groups.set(key, group);\n });\n return [...groups.values()].sort((a, b) => b.lastTime - a.lastTime);\n }, [filtered]);\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <div className=\"flex items-center gap-4 mb-6\">\n <h1 className=\"text-2xl font-bold text-white lg:ml-0 ml-10\">Messages</h1>\n <span className=\"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30\">\n {messages.length}\n </span>\n {filtered.length > 0 && (\n <button\n onClick={() => {\n const md = filtered.map((m: MessageItem) =>\n `**${m.from_alias || '?'}** → ${m.to_alias || '?'} (${m.type || '?'}) — ${m.created_at || ''}\\n\\n${m.content || '--'}\\n\\n---`\n ).join('\\n\\n');\n const blob = new Blob([`# Messages Export\\n\\n${md}`], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = `messages-${new Date().toISOString().slice(0,10)}.md`;\n a.click(); URL.revokeObjectURL(url);\n }}\n className=\"text-xs text-gray-500 hover:text-gray-300 border border-gray-700/50 px-2.5 py-1 rounded-lg transition-colors\"\n >\n Export MD\n </button>\n )}\n </div>\n\n <div className=\"flex flex-wrap gap-3 mb-3\">\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search from/to/content or use from:alias\"\n className=\"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:outline-none w-full sm:w-72\"\n />\n <select\n value={filterType}\n onChange={e => setFilterType(e.target.value)}\n className=\"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-blue-500/50 focus:outline-none\"\n >\n <option value=\"\">All types</option>\n <option value=\"task\">task</option>\n <option value=\"message\">message</option>\n <option value=\"broadcast\">broadcast</option>\n <option value=\"reply\">reply</option>\n </select>\n <div className=\"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-0.5\">\n {(['timeline', 'grouped'] as const).map(mode => (\n <button key={mode} type=\"button\" onClick={() => setViewMode(mode)}\n className={`rounded-md px-2.5 py-1.5 text-xs transition-colors ${viewMode === mode ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {mode === 'timeline' ? 'Timeline' : 'Grouped'}\n </button>\n ))}\n </div>\n <button\n onClick={() => setDebug(!debug)}\n className={`text-xs px-3 py-2 rounded-lg border transition-colors ${\n debug ? 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20' : 'text-gray-500 border-gray-700/50 hover:text-gray-300'\n }`}\n >\n {debug ? 'Debug ON' : 'Debug'}\n </button>\n </div>\n\n {quickFromChips.length > 0 && (\n <div className=\"mb-6 flex flex-wrap gap-2\">\n {quickFromChips.map(alias => (\n <button\n key={alias}\n type=\"button\"\n onClick={() => setSearch(`from:${alias}`)}\n className={`rounded-full border px-3 py-1 text-xs transition-colors ${\n search === `from:${alias}`\n ? 'border-cyan-500/30 bg-cyan-500/10 text-cyan-300'\n : 'border-[#2a2a4a] bg-[#111128] text-gray-400 hover:text-gray-200'\n }`}\n >\n from:{alias}\n </button>\n ))}\n {search.startsWith('from:') && (\n <button\n type=\"button\"\n onClick={() => setSearch('')}\n className=\"rounded-full border border-gray-700 px-3 py-1 text-xs text-gray-500 hover:text-gray-200\"\n >\n Clear\n </button>\n )}\n </div>\n )}\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2, 3, 4, 5].map(i => <div key={i} className=\"h-20 rounded-2xl bg-gray-800/20\" />)}\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"text-center py-16\">\n <div className=\"text-gray-600 text-4xl mb-4\">--</div>\n <h3 className=\"text-gray-400 text-lg font-medium mb-2\">No messages</h3>\n <p className=\"text-gray-600 text-sm\">Messages between agents will appear here.</p>\n </div>\n ) : viewMode === 'grouped' ? (\n <div className=\"space-y-4\">\n {conversations.map((conv, ci) => (\n <div key={ci} className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl overflow-hidden\">\n <div className=\"px-4 py-2.5 border-b border-[#2a2a4a] flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-cyan-300 font-medium\">{conv.participants[0]}</span>\n <span className=\"text-gray-600 text-xs\">↔</span>\n <span className=\"text-sm text-green-300 font-medium\">{conv.participants[1]}</span>\n </div>\n <span className=\"text-[10px] text-gray-600\">{conv.messages.length} messages</span>\n </div>\n <div className=\"px-4 py-2 space-y-2 max-h-64 overflow-y-auto\">\n {conv.messages.map(m => (\n <div key={m.id} className=\"flex items-start gap-2 text-xs py-1\">\n <span className={`shrink-0 font-medium ${m.from_alias === conv.participants[0] ? 'text-cyan-400' : 'text-green-400'}`}>{m.from_alias}</span>\n <span className=\"text-gray-400 flex-1\">{m.content?.slice(0, 120) || '--'}</span>\n <span className=\"text-[9px] text-gray-600 shrink-0\">{timeAgo(m.created_at || '')}</span>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {filtered.map((message: MessageItem, index) => {\n const previous = filtered[index - 1];\n const gapExceeded = previous\n ? normalizeDate(message.created_at) - normalizeDate(previous.created_at) > 5 * 60 * 1000\n : false;\n const variant = bubbleVariant(message);\n\n return (\n <div key={message.id}>\n {gapExceeded && (\n <div className=\"my-4 flex items-center gap-3\">\n <div className=\"h-px flex-1 bg-[#2a2a4a]\" />\n <div className=\"text-[11px] text-gray-600\">{formatDividerLabel(message.created_at)}</div>\n <div className=\"h-px flex-1 bg-[#2a2a4a]\" />\n </div>\n )}\n\n <div className={\n variant === 'broadcast'\n ? ''\n : variant === 'outgoing'\n ? 'flex justify-end'\n : 'flex justify-start'\n }>\n <div className={`rounded-2xl border px-4 py-3 shadow-sm ${\n variant === 'broadcast'\n ? 'w-full border-purple-500/20 bg-purple-500/10'\n : variant === 'outgoing'\n ? 'max-w-3xl border-green-500/20 bg-green-500/10'\n : 'max-w-3xl border-blue-500/20 bg-blue-500/10'\n }`}>\n <div className=\"mb-2 flex flex-wrap items-center gap-2\">\n <span className={`text-xs px-2 py-0.5 rounded-md border ${TYPE_COLORS[message.type || ''] || 'bg-gray-500/10 text-gray-400 border-gray-500/20'}`}>\n {message.type || 'unknown'}\n </span>\n <span className={`text-sm font-medium ${variant === 'outgoing' ? 'text-green-300' : variant === 'broadcast' ? 'text-purple-200' : 'text-blue-300'}`}>\n {message.from_alias || '--'}\n </span>\n {variant !== 'broadcast' && (\n <>\n <span className=\"text-xs text-gray-600\">&rarr;</span>\n <span className=\"text-sm text-gray-300\">{message.to_alias || '--'}</span>\n </>\n )}\n {variant === 'broadcast' && message.to_alias && (\n <span className=\"text-xs text-purple-200/80\">to {message.to_alias}</span>\n )}\n {message.priority === 'high' && <span className=\"text-xs text-red-400\">HIGH</span>}\n <span className=\"ml-auto text-xs text-gray-500\">{message.created_at ? timeAgo(message.created_at) : '--'}</span>\n </div>\n\n <div className=\"whitespace-pre-wrap text-sm leading-relaxed text-gray-200\">\n {(() => {\n const text = message.content || '--';\n const q = search.trim();\n if (!q || q.startsWith('from:')) return text;\n const idx = text.toLowerCase().indexOf(q.toLowerCase());\n if (idx < 0) return text;\n return <>{text.slice(0, idx)}<mark className=\"bg-yellow-500/30 text-yellow-200 rounded px-0.5\">{text.slice(idx, idx + q.length)}</mark>{text.slice(idx + q.length)}</>;\n })()}\n </div>\n\n {debug && (\n <div className=\"mt-3 border-t border-white/10 pt-3 text-xs text-gray-500 space-y-1\">\n <div>ID: {message.id}</div>\n {message.task_id && <div>Task ID: {message.task_id}</div>}\n <div>Created: {message.created_at}</div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"],"names":["timeAgo","dateStr","diff","Date","now","replace","getTime","s","Math","floor","statusColor","status","hasSse","formatUptime","seconds","h","m","fetcher","url","res","fetch","window","location","assign","Error","json","SWR_OPTIONS","refreshInterval","dedupingInterval","withNetwork","networkId","sep","includes","encodeURIComponent","useSessions","data","error","isLoading","sessions","hint","_hint","useHealth","health","useAnetConfig","config","useTasks","params","query","URLSearchParams","limit","toString","tasks","count","source","useStats","stats","ok","useLicense","license","useMessages","messages","useNodeSession","alias","session","inbox","sse","TYPE_COLORS","task","message","broadcast","reply","normalizeDate","value","formatDividerLabel","date","toLocaleString","bubbleVariant","type","from_alias","toLowerCase","MessagesPage","filterType","setFilterType","search","setSearch","debug","setDebug","viewMode","setViewMode","quickFromChips","aliases","Set","forEach","trim","add","slice","filtered","fromFilter","startsWith","filter","to_alias","content","sort","a","b","created_at","conversations","groups","Map","key","join","group","get","participants","lastTime","push","max","set","values","className","length","onClick","md","map","blob","Blob","URL","createObjectURL","document","createElement","href","download","toISOString","click","revokeObjectURL","onChange","e","target","placeholder","mode","i","conv","ci","id","index","previous","gapExceeded","variant","priority","text","q","idx","indexOf","task_id"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- module.exports=[43515,a=>{"use strict";a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"timeAgo",0,function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}])},51904,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(43515),f=a.i(72596);let g=a=>fetch(a).then(a=>a.json());a.s(["default",0,function(){let{data:a,mutate:h}=(0,f.default)("/api/hub/networks",g,{refreshInterval:1e4}),i=a?.networks||[],j=!a,[k,l]=(0,c.useState)(""),[m,n]=(0,c.useState)(""),[o,p]=(0,c.useState)(""),[q,r]=(0,c.useState)(null),[s,t]=(0,c.useState)(null),[u,v]=(0,c.useState)({}),[w,x]=(0,c.useState)("member"),[y,z]=(0,c.useState)(""),A=()=>{try{let a=sessionStorage.getItem("anet_v3_auth");if(a)return JSON.parse(a).token}catch{}return""},B=async()=>{if(!k.trim())return;let a=A();if(!a)return void p("V3 auth required — sign in via Agent Network login");let b=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"create_network",token:a,name:k,description:m})}),c=await b.json();p(c.ok?`Created: ${c.network_id}`:`Failed: ${c.error}`),c.ok&&(l(""),n(""),h()),setTimeout(()=>p(""),5e3)},C=async a=>{let b=A();if(!b)return;let c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"delete_network",token:b,network_id:a})}),d=await c.json();p(d.ok?"Deleted":`Failed: ${d.error}`),r(null),d.ok&&h(),setTimeout(()=>p(""),5e3)},D=async a=>{let b=A();if(!b)return;let c=await fetch(`/api/hub/auth?endpoint=/api/networks/${a}/members&token=${b}`),d=await c.json();v(b=>({...b,[a]:d.members||[]}))},E=async a=>{let b=A();if(!b)return;let c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"invite_member",token:b,network_id:a,role:w})}),d=await c.json();d.ok&&d.invite_code?z(d.invite_code):p(`Invite failed: ${d.error}`)};return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-6",children:[(0,b.jsx)(d.default,{href:"/settings",className:"text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10",children:"← Settings"}),(0,b.jsx)("h1",{className:"text-2xl font-bold text-white",children:"Networks"}),(0,b.jsx)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30",children:i.length})]}),(0,b.jsxs)("div",{className:"max-w-2xl space-y-6",children:[(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:"Create Network"}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("input",{type:"text",value:k,onChange:a=>l(a.target.value),placeholder:"Network name",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"}),(0,b.jsx)("input",{type:"text",value:m,onChange:a=>n(a.target.value),placeholder:"Description (optional)",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"}),(0,b.jsx)("button",{onClick:B,disabled:!k.trim(),className:"px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors",children:"Create"})]}),o&&(0,b.jsx)("div",{className:`mt-2 text-xs ${o.startsWith("Failed")||o.startsWith("V3")||o.startsWith("Invite")?"text-red-400":"text-green-400"}`,children:o})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:"My Networks"}),j?(0,b.jsx)("div",{className:"animate-pulse space-y-2",children:[1,2].map(a=>(0,b.jsx)("div",{className:"h-14 bg-gray-800/20 rounded"},a))}):0===i.length?(0,b.jsx)("div",{className:"text-xs text-gray-600 text-center py-4",children:"No networks found. Create one or sign in with V3 auth."}):(0,b.jsx)("div",{className:"space-y-3",children:i.map(a=>(0,b.jsxs)("div",{className:"bg-[#0a0a15] rounded-lg px-4 py-3 border border-[#1a1a2a]",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-sm text-white font-medium",children:a.network_name}),(0,b.jsxs)("div",{className:"text-[10px] text-gray-500",children:[a.network_id," · ",(0,e.timeAgo)(a.created_at)]}),a.description&&(0,b.jsx)("div",{className:"text-xs text-gray-400 mt-1",children:a.description})]}),(0,b.jsxs)("div",{className:"flex gap-2 shrink-0",children:[(0,b.jsx)("button",{onClick:()=>{s===a.network_id?t(null):(t(a.network_id),D(a.network_id))},className:"text-xs text-cyan-400 hover:text-cyan-300 px-2 py-1 rounded border border-cyan-800/30 hover:bg-cyan-500/10",children:s===a.network_id?"Hide":"Members"}),q===a.network_id?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{onClick:()=>C(a.network_id),className:"text-xs text-red-400 px-2 py-1 rounded border border-red-800/30 bg-red-500/10",children:"Confirm"}),(0,b.jsx)("button",{onClick:()=>r(null),className:"text-xs text-gray-500",children:"Cancel"})]}):(0,b.jsx)("button",{onClick:()=>r(a.network_id),className:"text-xs text-red-400 hover:text-red-300 px-2 py-1 rounded border border-red-800/30 hover:bg-red-500/10",children:"Delete"})]})]}),s===a.network_id&&(0,b.jsxs)("div",{className:"mt-3 pt-3 border-t border-[#1a1a2a]",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-500 mb-2",children:["Members (",(u[a.network_id]||[]).length,")"]}),0===(u[a.network_id]||[]).length?(0,b.jsx)("div",{className:"text-[10px] text-gray-600",children:"No members or V3 auth required"}):(u[a.network_id]||[]).map(a=>(0,b.jsxs)("div",{className:"flex items-center justify-between text-xs py-1",children:[(0,b.jsx)("span",{className:"text-gray-300",children:a.username||a.display_name}),(0,b.jsx)("span",{className:`px-1.5 py-0.5 rounded border text-[10px] ${"owner"===a.role?"text-yellow-300 border-yellow-500/20":"text-gray-400 border-gray-600/20"}`,children:a.role})]},a.user_id)),(0,b.jsxs)("div",{className:"mt-3 pt-3 border-t border-[#1a1a2a]",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 mb-2",children:"Invite"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsxs)("select",{value:w,onChange:a=>x(a.target.value),className:"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white focus:outline-none",children:[(0,b.jsx)("option",{value:"member",children:"member"}),(0,b.jsx)("option",{value:"admin",children:"admin"}),(0,b.jsx)("option",{value:"viewer",children:"viewer"})]}),(0,b.jsx)("button",{onClick:()=>E(a.network_id),className:"px-2 py-1 bg-green-600 hover:bg-green-500 text-white text-xs rounded",children:"Generate Code"})]}),y&&(0,b.jsxs)("div",{className:"mt-2 bg-green-500/5 border border-green-500/20 rounded px-3 py-2",children:[(0,b.jsx)("div",{className:"text-[10px] text-green-400 mb-1",children:"Invite code:"}),(0,b.jsx)("code",{className:"text-xs text-green-300 select-all",children:y})]})]})]})]},a.network_id))})]})]})]})}])}];
2
-
3
- //# sourceMappingURL=app_023a94i._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/components/utils.ts","../../../../app/settings/networks/page.tsx"],"sourcesContent":["export function timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport Link from 'next/link';\nimport { timeAgo } from '../../components/utils';\nimport useSWR from 'swr';\n\nconst fetcher = (url: string) => fetch(url).then(r => r.json());\n\ninterface Network {\n network_id: string;\n network_name: string;\n owner_id: string;\n description: string;\n created_at: string;\n}\n\ninterface Member {\n user_id: string;\n username: string;\n display_name: string;\n role: string;\n joined_at: string;\n}\n\nexport default function NetworksPage() {\n const { data, mutate } = useSWR('/api/hub/networks', fetcher, { refreshInterval: 10000 });\n const networks: Network[] = data?.networks || [];\n const loading = !data;\n\n const [newName, setNewName] = useState('');\n const [newDesc, setNewDesc] = useState('');\n const [result, setResult] = useState('');\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [expandedNetwork, setExpandedNetwork] = useState<string | null>(null);\n const [members, setMembers] = useState<Record<string, Member[]>>({});\n const [inviteRole, setInviteRole] = useState('member');\n const [inviteCode, setInviteCode] = useState('');\n\n const getToken = () => {\n try {\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (saved) return JSON.parse(saved).token;\n } catch {}\n return '';\n };\n\n const createNetwork = async () => {\n if (!newName.trim()) return;\n const token = getToken();\n if (!token) { setResult('V3 auth required — sign in via Agent Network login'); return; }\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'create_network', token, name: newName, description: newDesc }),\n });\n const d = await res.json();\n setResult(d.ok ? `Created: ${d.network_id}` : `Failed: ${d.error}`);\n if (d.ok) { setNewName(''); setNewDesc(''); mutate(); }\n setTimeout(() => setResult(''), 5000);\n };\n\n const deleteNetwork = async (networkId: string) => {\n const token = getToken();\n if (!token) return;\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'delete_network', token, network_id: networkId }),\n });\n const d = await res.json();\n setResult(d.ok ? 'Deleted' : `Failed: ${d.error}`);\n setConfirmDelete(null);\n if (d.ok) mutate();\n setTimeout(() => setResult(''), 5000);\n };\n\n const fetchMembers = async (networkId: string) => {\n const token = getToken();\n if (!token) return;\n const res = await fetch(`/api/hub/auth?endpoint=/api/networks/${networkId}/members&token=${token}`);\n const d = await res.json();\n setMembers(prev => ({ ...prev, [networkId]: d.members || [] }));\n };\n\n const generateInvite = async (networkId: string) => {\n const token = getToken();\n if (!token) return;\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'invite_member', token, network_id: networkId, role: inviteRole }),\n });\n const d = await res.json();\n if (d.ok && d.invite_code) setInviteCode(d.invite_code);\n else setResult(`Invite failed: ${d.error}`);\n };\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <div className=\"flex items-center gap-4 mb-6\">\n <Link href=\"/settings\" className=\"text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10\">&larr; Settings</Link>\n <h1 className=\"text-2xl font-bold text-white\">Networks</h1>\n <span className=\"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30\">\n {networks.length}\n </span>\n </div>\n\n <div className=\"max-w-2xl space-y-6\">\n {/* Create */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-3\">Create Network</h2>\n <div className=\"space-y-3\">\n <input type=\"text\" value={newName} onChange={e => setNewName(e.target.value)} placeholder=\"Network name\"\n 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\" />\n <input type=\"text\" value={newDesc} onChange={e => setNewDesc(e.target.value)} placeholder=\"Description (optional)\"\n 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\" />\n <button onClick={createNetwork} disabled={!newName.trim()}\n className=\"px-4 py-2 bg-green-600 hover:bg-green-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors\">\n Create\n </button>\n </div>\n {result && <div className={`mt-2 text-xs ${result.startsWith('Failed') || result.startsWith('V3') || result.startsWith('Invite') ? 'text-red-400' : 'text-green-400'}`}>{result}</div>}\n </section>\n\n {/* List */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-3\">My Networks</h2>\n {loading ? (\n <div className=\"animate-pulse space-y-2\">{[1,2].map(i => <div key={i} className=\"h-14 bg-gray-800/20 rounded\" />)}</div>\n ) : networks.length === 0 ? (\n <div className=\"text-xs text-gray-600 text-center py-4\">No networks found. Create one or sign in with V3 auth.</div>\n ) : (\n <div className=\"space-y-3\">\n {networks.map(n => (\n <div key={n.network_id} className=\"bg-[#0a0a15] rounded-lg px-4 py-3 border border-[#1a1a2a]\">\n <div className=\"flex items-center justify-between\">\n <div className=\"min-w-0\">\n <div className=\"text-sm text-white font-medium\">{n.network_name}</div>\n <div className=\"text-[10px] text-gray-500\">{n.network_id} · {timeAgo(n.created_at)}</div>\n {n.description && <div className=\"text-xs text-gray-400 mt-1\">{n.description}</div>}\n </div>\n <div className=\"flex gap-2 shrink-0\">\n <button onClick={() => {\n if (expandedNetwork === n.network_id) { setExpandedNetwork(null); return; }\n setExpandedNetwork(n.network_id);\n fetchMembers(n.network_id);\n }} className=\"text-xs text-cyan-400 hover:text-cyan-300 px-2 py-1 rounded border border-cyan-800/30 hover:bg-cyan-500/10\">\n {expandedNetwork === n.network_id ? 'Hide' : 'Members'}\n </button>\n {confirmDelete === n.network_id ? (\n <>\n <button onClick={() => deleteNetwork(n.network_id)} className=\"text-xs text-red-400 px-2 py-1 rounded border border-red-800/30 bg-red-500/10\">Confirm</button>\n <button onClick={() => setConfirmDelete(null)} className=\"text-xs text-gray-500\">Cancel</button>\n </>\n ) : (\n <button onClick={() => setConfirmDelete(n.network_id)} className=\"text-xs text-red-400 hover:text-red-300 px-2 py-1 rounded border border-red-800/30 hover:bg-red-500/10\">\n Delete\n </button>\n )}\n </div>\n </div>\n\n {expandedNetwork === n.network_id && (\n <div className=\"mt-3 pt-3 border-t border-[#1a1a2a]\">\n <div className=\"text-xs text-gray-500 mb-2\">Members ({(members[n.network_id] || []).length})</div>\n {(members[n.network_id] || []).length === 0 ? (\n <div className=\"text-[10px] text-gray-600\">No members or V3 auth required</div>\n ) : (\n (members[n.network_id] || []).map(m => (\n <div key={m.user_id} className=\"flex items-center justify-between text-xs py-1\">\n <span className=\"text-gray-300\">{m.username || m.display_name}</span>\n <span className={`px-1.5 py-0.5 rounded border text-[10px] ${\n m.role === 'owner' ? 'text-yellow-300 border-yellow-500/20' : 'text-gray-400 border-gray-600/20'\n }`}>{m.role}</span>\n </div>\n ))\n )}\n\n {/* Invite */}\n <div className=\"mt-3 pt-3 border-t border-[#1a1a2a]\">\n <div className=\"text-xs text-gray-500 mb-2\">Invite</div>\n <div className=\"flex gap-2\">\n <select value={inviteRole} onChange={e => setInviteRole(e.target.value)}\n className=\"bg-[#0a0a15] border border-[#2a2a4a] rounded px-2 py-1 text-xs text-white focus:outline-none\">\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"viewer\">viewer</option>\n </select>\n <button onClick={() => generateInvite(n.network_id)}\n className=\"px-2 py-1 bg-green-600 hover:bg-green-500 text-white text-xs rounded\">\n Generate Code\n </button>\n </div>\n {inviteCode && (\n <div className=\"mt-2 bg-green-500/5 border border-green-500/20 rounded px-3 py-2\">\n <div className=\"text-[10px] text-green-400 mb-1\">Invite code:</div>\n <code className=\"text-xs text-green-300 select-all\">{inviteCode}</code>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n </div>\n </div>\n );\n}\n"],"names":["timeAgo","dateStr","diff","Date","now","replace","getTime","s","Math","floor","statusColor","status","hasSse","formatUptime","seconds","h","m","fetcher","url","fetch","then","r","json","NetworksPage","data","mutate","refreshInterval","networks","loading","newName","setNewName","newDesc","setNewDesc","result","setResult","confirmDelete","setConfirmDelete","expandedNetwork","setExpandedNetwork","members","setMembers","inviteRole","setInviteRole","inviteCode","setInviteCode","getToken","saved","sessionStorage","getItem","JSON","parse","token","createNetwork","trim","res","method","headers","body","stringify","action","name","description","d","ok","network_id","error","setTimeout","deleteNetwork","networkId","fetchMembers","prev","generateInvite","role","invite_code","className","href","length","type","value","onChange","e","target","placeholder","onClick","disabled","startsWith","map","i","n","network_name","created_at","username","display_name","user_id"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- module.exports=[43515,a=>{"use strict";a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"timeAgo",0,function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}])},89220,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(43515);a.s(["default",0,function(){let[a,f]=(0,c.useState)([]),[g,h]=(0,c.useState)(!0),[i,j]=(0,c.useState)(""),[k,l]=(0,c.useState)({}),m=(0,c.useCallback)(async()=>{try{let a=await fetch("/api/hub/tokens"),b=await a.json();f(b.tokens||[])}catch{}finally{h(!1)}},[]);(0,c.useEffect)(()=>{m()},[m]);let n=async()=>{if(i.trim())try{let a=sessionStorage.getItem("anet_v3_auth");if(!a)return;let{token:b}=JSON.parse(a),c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"create_token",token:b,name:i})}),d=await c.json();d.ok?(l({token:d.token}),j(""),m()):l({error:d.error})}catch{l({error:"Failed"})}},o=async a=>{try{let b=sessionStorage.getItem("anet_v3_auth");if(!b)return;let{token:c}=JSON.parse(b);await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"revoke_token",token:c,token_id:a})}),m()}catch{}};return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-6",children:[(0,b.jsx)(d.default,{href:"/settings",className:"text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10",children:"← Settings"}),(0,b.jsx)("h1",{className:"text-2xl font-bold text-white",children:"API Tokens"})]}),(0,b.jsxs)("div",{className:"max-w-2xl space-y-6",children:[(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:"Create Token"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("input",{type:"text",value:i,onChange:a=>j(a.target.value),placeholder:"Token name (e.g. my-cli)",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"}),(0,b.jsx)("button",{onClick:n,disabled:!i.trim(),className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors",children:"Create"})]}),k.token&&(0,b.jsxs)("div",{className:"mt-3 bg-green-500/5 border border-green-500/20 rounded-lg px-3 py-2",children:[(0,b.jsx)("div",{className:"text-xs text-green-400 mb-1",children:"Token created (copy now, shown only once):"}),(0,b.jsx)("code",{className:"text-sm text-green-300 break-all select-all",children:k.token})]}),k.error&&(0,b.jsx)("div",{className:"mt-2 text-xs text-red-400",children:k.error})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsxs)("h2",{className:"text-sm font-semibold text-gray-300 mb-3",children:["Active Tokens (",a.length,")"]}),g?(0,b.jsx)("div",{className:"animate-pulse space-y-2",children:[1,2].map(a=>(0,b.jsx)("div",{className:"h-12 bg-gray-800/20 rounded"},a))}):0===a.length?(0,b.jsx)("div",{className:"text-xs text-gray-600 text-center py-4",children:"No tokens. V3 auth required."}):(0,b.jsx)("div",{className:"space-y-2",children:a.map(a=>(0,b.jsxs)("div",{className:"flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-sm text-white font-medium",children:a.name}),(0,b.jsx)("span",{className:`text-[10px] px-1.5 py-0.5 rounded border ${"full"===a.scope?"text-cyan-300 border-cyan-500/20 bg-cyan-500/5":"text-gray-400 border-gray-600/20"}`,children:a.scope})]}),(0,b.jsxs)("div",{className:"text-[10px] text-gray-500",children:[a.token_id," · network: ",a.network_id?.slice(0,12)||"--"," · used ",(0,e.timeAgo)(a.last_used_at)]})]}),(0,b.jsx)("button",{onClick:()=>o(a.token_id),className:"text-xs text-red-400 hover:text-red-300 px-2 py-1 rounded border border-red-800/30 hover:bg-red-500/10 transition-colors",children:"Revoke"})]},a.token_id))})]})]})]})}])}];
2
-
3
- //# sourceMappingURL=app_0basiqb._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/components/utils.ts","../../../../app/settings/tokens/page.tsx"],"sourcesContent":["export function timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport Link from 'next/link';\nimport { timeAgo } from '../../components/utils';\n\ninterface Token {\n token_id: string;\n name: string;\n scope: string;\n network_id: string;\n last_used_at: string;\n created_at: string;\n}\n\nexport default function TokensPage() {\n const [tokens, setTokens] = useState<Token[]>([]);\n const [loading, setLoading] = useState(true);\n const [newName, setNewName] = useState('');\n const [createResult, setCreateResult] = useState<{ token?: string; error?: string }>({});\n\n const fetchTokens = useCallback(async () => {\n try {\n const res = await fetch('/api/hub/tokens');\n const data = await res.json();\n setTokens(data.tokens || []);\n } catch {} finally { setLoading(false); }\n }, []);\n\n useEffect(() => { fetchTokens(); }, [fetchTokens]);\n\n const createToken = async () => {\n if (!newName.trim()) return;\n try {\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (!saved) return;\n const { token } = JSON.parse(saved);\n const res = await fetch('/api/hub/auth', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'create_token', token, name: newName }),\n });\n const data = await res.json();\n if (data.ok) {\n setCreateResult({ token: data.token });\n setNewName('');\n fetchTokens();\n } else {\n setCreateResult({ error: data.error });\n }\n } catch { setCreateResult({ error: 'Failed' }); }\n };\n\n const revokeToken = async (tokenId: string) => {\n try {\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (!saved) return;\n const { token } = JSON.parse(saved);\n await fetch('/api/hub/auth', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'revoke_token', token, token_id: tokenId }),\n });\n fetchTokens();\n } catch {}\n };\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <div className=\"flex items-center gap-4 mb-6\">\n <Link href=\"/settings\" className=\"text-gray-500 hover:text-gray-300 text-sm lg:ml-0 ml-10\">&larr; Settings</Link>\n <h1 className=\"text-2xl font-bold text-white\">API Tokens</h1>\n </div>\n\n <div className=\"max-w-2xl space-y-6\">\n {/* Create token */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-3\">Create Token</h2>\n <div className=\"flex gap-2\">\n <input type=\"text\" value={newName} onChange={e => setNewName(e.target.value)}\n placeholder=\"Token name (e.g. my-cli)\"\n 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\" />\n <button onClick={createToken} disabled={!newName.trim()}\n className=\"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 text-white text-sm rounded-lg transition-colors\">\n Create\n </button>\n </div>\n {createResult.token && (\n <div className=\"mt-3 bg-green-500/5 border border-green-500/20 rounded-lg px-3 py-2\">\n <div className=\"text-xs text-green-400 mb-1\">Token created (copy now, shown only once):</div>\n <code className=\"text-sm text-green-300 break-all select-all\">{createResult.token}</code>\n </div>\n )}\n {createResult.error && <div className=\"mt-2 text-xs text-red-400\">{createResult.error}</div>}\n </section>\n\n {/* Token list */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-3\">Active Tokens ({tokens.length})</h2>\n {loading ? (\n <div className=\"animate-pulse space-y-2\">{[1,2].map(i => <div key={i} className=\"h-12 bg-gray-800/20 rounded\" />)}</div>\n ) : tokens.length === 0 ? (\n <div className=\"text-xs text-gray-600 text-center py-4\">No tokens. V3 auth required.</div>\n ) : (\n <div className=\"space-y-2\">\n {tokens.map(t => (\n <div key={t.token_id} className=\"flex items-center justify-between bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]\">\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-white font-medium\">{t.name}</span>\n <span className={`text-[10px] px-1.5 py-0.5 rounded border ${\n t.scope === 'full' ? 'text-cyan-300 border-cyan-500/20 bg-cyan-500/5' : 'text-gray-400 border-gray-600/20'\n }`}>{t.scope}</span>\n </div>\n <div className=\"text-[10px] text-gray-500\">{t.token_id} · network: {t.network_id?.slice(0, 12) || '--'} · used {timeAgo(t.last_used_at)}</div>\n </div>\n <button onClick={() => revokeToken(t.token_id)}\n className=\"text-xs text-red-400 hover:text-red-300 px-2 py-1 rounded border border-red-800/30 hover:bg-red-500/10 transition-colors\">\n Revoke\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n </div>\n </div>\n );\n}\n"],"names":["timeAgo","dateStr","diff","Date","now","replace","getTime","s","Math","floor","statusColor","status","hasSse","formatUptime","seconds","h","m","TokensPage","tokens","setTokens","loading","setLoading","newName","setNewName","createResult","setCreateResult","fetchTokens","res","fetch","data","json","createToken","trim","saved","sessionStorage","getItem","token","JSON","parse","method","headers","body","stringify","action","name","ok","error","revokeToken","tokenId","token_id","className","href","type","value","onChange","e","target","placeholder","onClick","disabled","length","map","i","t","scope","network_id","slice","last_used_at"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- module.exports=[43515,a=>{"use strict";a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"timeAgo",0,function(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}])},29254,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(43515),e=a.i(22397);let f={register:"bg-green-500/10 text-green-300 border-green-500/20",login:"bg-blue-500/10 text-blue-300 border-blue-500/20",login_failed:"bg-red-500/10 text-red-300 border-red-500/20",create_network:"bg-purple-500/10 text-purple-300 border-purple-500/20",send_task:"bg-cyan-500/10 text-cyan-300 border-cyan-500/20"};a.s(["default",0,function(){let a,{networkId:g}=(0,e.useNetworkId)(),[h,i]=(0,c.useState)([]),[j,k]=(0,c.useState)(!0),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),p=(0,c.useCallback)(async()=>{try{let a=new URLSearchParams({limit:"100"});g&&a.set("network_id",g),n&&a.set("action",n);let b=sessionStorage.getItem("anet_v3_auth");if(b)try{let c=JSON.parse(b);c.token&&a.set("token",c.token)}catch{}let c=await fetch(`/api/hub/audit-log?${a.toString()}`);if(401===c.status)return void window.location.assign("/login");let d=await c.json();i(d.logs||[]),m(d.error&&!d.logs?.length?d.error:"")}catch(a){m(a instanceof Error?a.message:"fetch failed")}finally{k(!1)}},[n,g]);return(0,c.useEffect)(()=>{k(!0),p();let a=setInterval(p,1e4);return()=>clearInterval(a)},[p]),(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-6",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white lg:ml-0 ml-10",children:"Logs"}),(0,b.jsx)("span",{className:"text-xs bg-gray-900/30 text-gray-400 px-2 py-0.5 rounded-full border border-gray-800/30",children:"Audit Log"})]}),(0,b.jsx)("div",{className:"flex flex-wrap gap-3 mb-6",children:(0,b.jsxs)("select",{value:n,onChange:a=>o(a.target.value),className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-blue-500/50 focus:outline-none",children:[(0,b.jsx)("option",{value:"",children:"All actions"}),(0,b.jsx)("option",{value:"register",children:"register"}),(0,b.jsx)("option",{value:"login",children:"login"}),(0,b.jsx)("option",{value:"login_failed",children:"login_failed"}),(0,b.jsx)("option",{value:"create_network",children:"create_network"}),(0,b.jsx)("option",{value:"send_task",children:"send_task"})]})}),l&&(a=/unauthor|401|forbidden|403|admin/i.test(l),(0,b.jsxs)("div",{className:"anet-warn-chip bg-yellow-900/20 border border-yellow-800/40 text-yellow-300 px-4 py-3 rounded-lg mb-6 text-sm flex items-start gap-3",role:"alert",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"text-base leading-none",children:"⚠"}),(0,b.jsxs)("div",{className:"flex-1",children:[(0,b.jsx)("div",{className:"font-medium",children:a?"需要登录才能查看审计日志(admin 角色可看全部)":"加载失败 —— 请稍后重试"}),(0,b.jsx)("div",{className:"text-xs opacity-70 mt-1",children:"如果你已经登录但仍看到此提示,请用 admin 账号重新登录后查看。"})]})]})),j?(0,b.jsx)("div",{className:"animate-pulse space-y-2",children:[1,2,3,4,5].map(a=>(0,b.jsx)("div",{className:"h-14 bg-gray-800/20 rounded-lg"},a))}):0===h.length?(0,b.jsxs)("div",{className:"text-center py-16",children:[(0,b.jsx)("div",{className:"text-gray-600 text-4xl mb-4",children:"--"}),(0,b.jsx)("h3",{className:"text-gray-400 text-lg font-medium mb-2",children:"No audit logs"}),(0,b.jsx)("p",{className:"text-gray-600 text-sm",children:"Events will appear here when users register, login, or perform actions."})]}):(0,b.jsx)("div",{className:"space-y-2",children:h.map(a=>(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-4 py-3 hover:border-[#3a3a5a] transition-colors",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2 mb-1",children:[(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded-md border ${f[a.action]||"bg-gray-500/10 text-gray-400 border-gray-500/20"}`,children:a.action}),(0,b.jsx)("span",{className:"text-sm text-blue-400 font-medium",children:a.username||a.user_id}),a.target_type&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("span",{className:"text-xs text-gray-600",children:"→"}),(0,b.jsxs)("span",{className:"text-xs text-gray-400",children:[a.target_type,a.target_id?`:${a.target_id.slice(0,12)}`:""]})]}),(0,b.jsx)("span",{className:"text-xs text-gray-600 ml-auto",children:(0,d.timeAgo)(a.created_at)})]}),a.detail&&(0,b.jsx)("div",{className:"text-xs text-gray-500",children:a.detail}),a.ip&&"unknown"!==a.ip&&(0,b.jsxs)("div",{className:"text-[10px] text-gray-700",children:["IP: ",a.ip]})]},a.id))})]})}])}];
2
-
3
- //# sourceMappingURL=app_0pljk5o._.js.map