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

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 (168) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +6 -6
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/_not-found.html +2 -2
  15. package/.next/server/app/_not-found.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/admin.html +2 -2
  24. package/.next/server/app/admin.rsc +2 -2
  25. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  26. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  29. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  30. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  31. package/.next/server/app/index.html +2 -2
  32. package/.next/server/app/index.rsc +3 -3
  33. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  34. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  35. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  36. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  37. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  38. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  39. package/.next/server/app/login.html +2 -2
  40. package/.next/server/app/login.rsc +3 -3
  41. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  42. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  46. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  47. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/logs.html +2 -2
  49. package/.next/server/app/logs.rsc +2 -2
  50. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  51. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  54. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  55. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  56. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/messages.html +2 -2
  58. package/.next/server/app/messages.rsc +2 -2
  59. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  60. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  61. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  63. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  64. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  65. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/node.html +2 -2
  67. package/.next/server/app/node.rsc +2 -2
  68. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  69. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  70. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  72. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  73. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  74. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/nodes.html +2 -2
  76. package/.next/server/app/nodes.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  78. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  79. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  81. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  82. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  83. package/.next/server/app/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  85. package/.next/server/app/server-logs.html +2 -2
  86. package/.next/server/app/server-logs.rsc +3 -3
  87. package/.next/server/app/server-logs.segments/_full.segment.rsc +3 -3
  88. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  91. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +2 -2
  92. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  93. package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
  94. package/.next/server/app/servers.html +2 -2
  95. package/.next/server/app/servers.rsc +2 -2
  96. package/.next/server/app/servers.segments/_full.segment.rsc +2 -2
  97. package/.next/server/app/servers.segments/_head.segment.rsc +1 -1
  98. package/.next/server/app/servers.segments/_index.segment.rsc +2 -2
  99. package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
  100. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  101. package/.next/server/app/servers.segments/servers.segment.rsc +1 -1
  102. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/networks.html +2 -2
  104. package/.next/server/app/settings/networks.rsc +2 -2
  105. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  106. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  107. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  108. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  109. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  110. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  111. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  113. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  114. package/.next/server/app/settings/tokens.html +2 -2
  115. package/.next/server/app/settings/tokens.rsc +2 -2
  116. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  117. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  118. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  119. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  120. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  121. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  122. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  123. package/.next/server/app/settings.html +2 -2
  124. package/.next/server/app/settings.rsc +3 -3
  125. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  126. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  130. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  131. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  132. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  133. package/.next/server/app/tasks.html +2 -2
  134. package/.next/server/app/tasks.rsc +2 -2
  135. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  136. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  137. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  138. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  139. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  140. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  141. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  142. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  143. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  144. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  145. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  146. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  147. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js +1 -1
  148. package/.next/server/chunks/ssr/agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map +1 -1
  149. package/.next/server/middleware-build-manifest.js +3 -3
  150. package/.next/server/pages/404.html +2 -2
  151. package/.next/server/pages/500.html +1 -1
  152. package/.next/server/server-reference-manifest.js +1 -1
  153. package/.next/server/server-reference-manifest.json +1 -1
  154. package/.next/static/chunks/{0xqeurx5nvu76.js → 0.t1evm65itbw.js} +1 -1
  155. package/.next/static/chunks/{0.66f3.rtcybb.js → 04~fkia6-79k3.js} +1 -1
  156. package/.next/static/chunks/{0xze0l75jjpwr.js → 0az0wa3gxme68.js} +1 -1
  157. package/.next/static/chunks/0dq6wv-e0vk_o.css +1 -0
  158. package/.next/static/chunks/0gi_03g-uxj0r.js +1 -0
  159. package/.next/trace +2 -2
  160. package/.next/trace-build +1 -1
  161. package/app/server-logs/page.tsx +9 -2
  162. package/app/settings/page.tsx +6 -3
  163. package/package.json +1 -1
  164. package/.next/static/chunks/0eggl7f36vd8m.js +0 -1
  165. package/.next/static/chunks/0h_gdeiy~s92j.css +0 -1
  166. /package/.next/static/{cssa52keEzN4TEvVJY7V3 → e-lUTefNl8edrYCV4yWtG}/_buildManifest.js +0 -0
  167. /package/.next/static/{cssa52keEzN4TEvVJY7V3 → e-lUTefNl8edrYCV4yWtG}/_clientMiddlewareManifest.js +0 -0
  168. /package/.next/static/{cssa52keEzN4TEvVJY7V3 → e-lUTefNl8edrYCV4yWtG}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../agent-network-dashboard/app/lib/hooks.ts","../../../../../agent-network-dashboard/package.json.%5Bjson%5D.mjs","../../../../../agent-network-dashboard/app/lib/version.ts","../../../../../agent-network-dashboard/app/settings/page.tsx"],"sourcesContent":["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 turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"version\":\"0.5.7-preview.3\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"start\":\"next start\",\"lint\":\"eslint\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.2.3\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"eslint\":\"^9\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint-config-next\":\"16.2.3\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwidmVyc2lvblwiOlwiMC41LjctcHJldmlldy4zXCIsXCJkZXNjcmlwdGlvblwiOlwiQWdlbnQgTmV0d29yayBEYXNoYm9hcmQg4oCUIFdlYiBVSSBmb3IgbWFuYWdpbmcgQUkgQWdlbnQgbmV0d29ya3NcIixcIm1haW5cIjpcImFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwic2NyaXB0c1wiOntcImRldlwiOlwibmV4dCBkZXZcIixcImJ1aWxkXCI6XCJuZXh0IGJ1aWxkXCIsXCJzdGFydFwiOlwibmV4dCBzdGFydFwiLFwibGludFwiOlwiZXNsaW50XCIsXCJhcHA6YW5kcm9pZDppbml0XCI6XCJucHggY2FwIGFkZCBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpzeW5jXCI6XCJucHggY2FwIHN5bmMgYW5kcm9pZFwiLFwiYXBwOmFuZHJvaWQ6b3BlblwiOlwibnB4IGNhcCBvcGVuIGFuZHJvaWRcIixcImFwcDppb3M6aW5pdFwiOlwibnB4IGNhcCBhZGQgaW9zXCIsXCJhcHA6aW9zOnN5bmNcIjpcIm5weCBjYXAgc3luYyBpb3NcIixcImFwcDppb3M6b3BlblwiOlwibnB4IGNhcCBvcGVuIGlvc1wiLFwiYXBwOmRlc2t0b3BcIjpcImVsZWN0cm9uIGFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwiYXBwOmRlc2t0b3A6cGFja1wiOlwiZWxlY3Ryb24tYnVpbGRlciAtLWNvbmZpZyBlbGVjdHJvbi1idWlsZGVyLmpzb25cIixcInByZXB1Ymxpc2hPbmx5XCI6XCJbIC1mIC5uZXh0L0JVSUxEX0lEIF0gfHwgKGVjaG8gJ3ByZXB1Ymxpc2hPbmx5OiAubmV4dC9CVUlMRF9JRCBtaXNzaW5nIOKAlCBydW4gbnBtIHJ1biBidWlsZCBmaXJzdCAoc2VlIGNvbW1pdCAwNWMxZWJmIGJvZHkgZm9yIFIyMjQgY2h1bmstNTAwIHJvb3QgY2F1c2UpJyA+JjIgJiYgZXhpdCAxKVwifSxcImJpblwiOntcImFnZW50LW5ldHdvcmstZGFzaGJvYXJkXCI6XCIuL2Jpbi9zdGFydC5qc1wifSxcImhvbWVwYWdlXCI6XCJodHRwczovL2FuZXQuc2hcIixcInJlcG9zaXRvcnlcIjp7XCJ0eXBlXCI6XCJnaXRcIixcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwifSxcImJ1Z3NcIjp7XCJ1cmxcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGVlcDJhZ2kvYWdlbnQtbmV0d29yay1kYXNoYm9hcmQvaXNzdWVzXCJ9LFwiYXV0aG9yXCI6XCJzbGVlcDJhZ2lcIixcImxpY2Vuc2VcIjpcIkFwYWNoZS0yLjBcIixcInB1Ymxpc2hDb25maWdcIjp7XCJhY2Nlc3NcIjpcInB1YmxpY1wifSxcImRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvY29yZVwiOlwiXjcuNC40XCIsXCJuZXh0XCI6XCIxNi4yLjNcIixcInJlYWN0XCI6XCIxOS4yLjRcIixcInJlYWN0LWRvbVwiOlwiMTkuMi40XCIsXCJyZWFjdC1tYXJrZG93blwiOlwiXjEwLjEuMFwiLFwicmVtYXJrLWdmbVwiOlwiXjQuMC4xXCIsXCJzd3JcIjpcIl4yLjQuMVwifSxcImRldkRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvYW5kcm9pZFwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2NsaVwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2lvc1wiOlwiXjcuNC40XCIsXCJAcGxheXdyaWdodC90ZXN0XCI6XCJeMS41OS4xXCIsXCJAdGFpbHdpbmRjc3MvcG9zdGNzc1wiOlwiXjRcIixcIkB0eXBlcy9ub2RlXCI6XCJeMjBcIixcIkB0eXBlcy9yZWFjdFwiOlwiXjE5XCIsXCJAdHlwZXMvcmVhY3QtZG9tXCI6XCJeMTlcIixcImVzbGludFwiOlwiXjlcIixcImVsZWN0cm9uXCI6XCJeMzkuMi42XCIsXCJlbGVjdHJvbi1idWlsZGVyXCI6XCJeMjYuMC4xMlwiLFwiZXNsaW50LWNvbmZpZy1uZXh0XCI6XCIxNi4yLjNcIixcInRhaWx3aW5kY3NzXCI6XCJeNFwiLFwidHlwZXNjcmlwdFwiOlwiXjVcIn19Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n","'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { useAnetConfig, useHealth, useLicense } from '../lib/hooks';\nimport { DASHBOARD_VERSION } from '../lib/version';\n\nexport default function SettingsPage() {\n const { config } = useAnetConfig();\n const { health } = useHealth();\n const { license: licData } = useLicense();\n const [licKey, setLicKey] = useState('');\n const [licResult, setLicResult] = useState('');\n const [oldPwd, setOldPwd] = useState('');\n const [newPwd, setNewPwd] = useState('');\n const [pwdResult, setPwdResult] = useState('');\n const rowClass = 'flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between';\n const valueClass = 'break-all sm:max-w-[320px] sm:text-right';\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <h1 className=\"text-2xl font-bold text-white mb-3 lg:ml-0 ml-10\">Settings</h1>\n\n {/* Section anchor nav (round 28) — jump to a group instead of scrolling\n through the whole page. Mirrors the section headers below; pages\n with 7+ cards benefit from a visible table-of-contents. */}\n <nav className=\"mb-8 flex flex-wrap gap-1 text-xs\">\n {[\n { href: '#connection', label: 'Connection' },\n { href: '#account', label: 'Account' },\n { href: '#resources', label: 'Resources' },\n ].map(a => (\n <a key={a.href} href={a.href}\n className=\"rounded-md px-2.5 py-1 text-gray-500 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors\">\n {a.label}\n </a>\n ))}\n </nav>\n\n <div className=\"max-w-2xl space-y-10\">\n {/* ── Group: Connection ─────────────────────────────────── */}\n <div id=\"connection\" className=\"space-y-4 scroll-mt-6\">\n <div className=\"flex items-center gap-2 px-1\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold\">Connection</div>\n <div className=\"flex-1 h-px bg-[#2a2a4a]\" />\n </div>\n\n {/* CommHub Connection */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">CommHub Connection</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500 shrink-0\">Hub URL</span>\n <span className={`text-cyan-300 ${valueClass}`}>{config?.hub || 'not configured'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Config Source</span>\n <span className={`text-gray-300 ${valueClass}`}>\n {config?.source === 'file' ? 'Local file (~/.anet/config.json)' : config?.source === 'runtime-env' ? 'Vercel env vars' : 'Missing'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Auth Token</span>\n <span className={`${config?.tokenConfigured ? 'text-green-400' : 'text-red-400'} ${valueClass}`}>\n {config?.tokenConfigured ? `Configured (${config.tokenPreview})` : 'Not configured'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Server Auth</span>\n <span className={`${health?.auth === 'enabled' ? 'text-green-400' : 'text-yellow-400'} sm:text-right`}>\n {health?.auth || '--'}\n </span>\n </div>\n {config?.error && (\n <div className=\"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600\">\n {config.error}\n </div>\n )}\n </div>\n </section>\n\n {/* Server Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Server Info</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.version || '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Sessions</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sessions ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">SSE streams <span className=\"text-gray-600\">· server</span></span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sse_connections ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Uptime</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.uptime ? `${Math.floor(health.uptime / 3600)}h ${Math.floor((health.uptime % 3600) / 60)}m` : '--'}</span>\n </div>\n </div>\n </section>\n\n {/* Dashboard Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Dashboard</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 font-mono ${valueClass}`} title=\"From package.json @sleep2agi/agent-network-dashboard\">\n {DASHBOARD_VERSION}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Data Layer</span>\n <span className={`text-gray-300 ${valueClass}`}>SWR (5s refresh, 3s dedup)</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Pages</span>\n <span className={`text-gray-300 ${valueClass}`}>Overview, Tasks, Nodes, Messages, Networks, Audit, Server Logs, Admin, Settings</span>\n </div>\n </div>\n </section>\n </div>\n\n {/* ── Group: Account ────────────────────────────────────── */}\n <div id=\"account\" className=\"space-y-4 scroll-mt-6\">\n <div className=\"flex items-center gap-2 px-1\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold\">Account</div>\n <div className=\"flex-1 h-px bg-[#2a2a4a]\" />\n </div>\n\n {/* License */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4 flex items-center gap-2\">\n License\n {licData?.license && (\n <span\n className={`inline-flex items-center gap-1.5 text-[10px] font-medium px-2 py-0.5 rounded-full border ${\n licData.license.type === 'pro'\n ? 'text-green-300 bg-green-500/10 border-green-500/30'\n : licData.license.days_left <= 7\n ? 'text-red-300 bg-red-500/10 border-red-500/30'\n : 'text-amber-300 bg-amber-500/10 border-amber-500/30'\n }`}\n >\n <span aria-hidden className=\"w-1.5 h-1.5 rounded-full bg-current\" />\n {licData.license.type}{licData.license.days_left ? ` · ${licData.license.days_left}d left` : ''}\n </span>\n )}\n </h2>\n {licData?.license ? (\n <div className=\"space-y-3 text-sm\">\n {/* Type + Days Left are summarized in the inline chip in the\n header. Surface \"expiring soon\" only when relevant. */}\n {licData.license.days_left <= 7 && (\n <div className={rowClass}>\n <span className=\"text-red-400 font-medium\">⚠ Expiring soon</span>\n <span className=\"text-red-400\">{licData.license.days_left} days left</span>\n </div>\n )}\n <div className={rowClass}>\n <span className=\"text-gray-500\">Expires</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.license.expires_at}</span>\n </div>\n {licData.limits && (\n <>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Agents</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_agents}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Networks</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_networks}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Tasks/Day</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_tasks_day}</span>\n </div>\n </>\n )}\n <div className=\"pt-3 border-t border-[#2a2a4a]\">\n <div className=\"flex gap-2\">\n <input type=\"text\" value={licKey} onChange={e => setLicKey(e.target.value)}\n placeholder=\"anet-XXXX-XXXX-XXXX-XXXX\"\n className=\"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none\" />\n <button onClick={async () => {\n if (!licKey.trim()) return;\n const res = await fetch('/api/hub/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: licKey }) });\n const data = await res.json();\n setLicResult(data.ok ? `Activated: ${data.type}` : `Failed: ${data.error}`);\n if (data.ok) setLicKey('');\n setTimeout(() => setLicResult(''), 5000);\n }} className=\"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors\">\n Activate\n </button>\n </div>\n {licResult && <div className={`mt-2 text-xs ${licResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{licResult}</div>}\n </div>\n </div>\n ) : (\n <div className=\"text-xs text-gray-600\">License info not available</div>\n )}\n </section>\n\n {/* Change Password */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Change Password</h2>\n <div className=\"space-y-3\">\n <input type=\"password\" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder=\"Current password\"\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=\"password\" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder=\"New password\"\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={async () => {\n if (!oldPwd || !newPwd) return;\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (!saved) { setPwdResult('Not logged in with V3 auth'); return; }\n const { token } = JSON.parse(saved);\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'change_password', token, current_password: oldPwd, new_password: newPwd }),\n });\n const data = await res.json();\n setPwdResult(data.ok ? 'Password changed' : `Failed: ${data.error}`);\n if (data.ok) {\n if (data.token) {\n const auth = JSON.parse(saved);\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({ ...auth, token: data.token }));\n }\n setOldPwd('');\n setNewPwd('');\n }\n setTimeout(() => setPwdResult(''), 5000);\n }} disabled={!oldPwd || !newPwd}\n className=\"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\">\n Change Password\n </button>\n </div>\n {pwdResult && <div className={`mt-2 text-xs ${pwdResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{pwdResult}</div>}\n </section>\n\n {/* Session — tone-neutral, no longer \"danger zone\" red */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Sign out</h2>\n <p className=\"text-xs text-gray-500 mb-3\">Signing out clears your dashboard session cookie. You'll return to the login page.</p>\n <button\n onClick={async () => {\n await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});\n window.location.assign('/login');\n }}\n className=\"px-4 py-2 bg-transparent hover:bg-[#1a1a2a] text-gray-300 text-sm rounded-lg border border-[#2a2a4a] hover:border-[#3a3a5a] transition-colors\"\n >\n Sign out\n </button>\n </section>\n </div>\n\n {/* ── Group: Resources ──────────────────────────────────── */}\n <div id=\"resources\" className=\"space-y-4 scroll-mt-6\">\n <div className=\"flex items-center gap-2 px-1\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold\">Resources</div>\n <div className=\"flex-1 h-px bg-[#2a2a4a]\" />\n </div>\n\n {/* API Tokens + Networks */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <Link href=\"/settings/tokens\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">API Tokens</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create and manage tokens for CLI access.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n <Link href=\"/settings/networks\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">Networks</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create, manage, and delete agent networks.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n"],"names":["fetcher","url","res","fetch","status","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","SettingsPage","licData","licKey","setLicKey","licResult","setLicResult","oldPwd","setOldPwd","newPwd","setNewPwd","pwdResult","setPwdResult","rowClass","valueClass","className","href","label","map","a","id","hub","tokenConfigured","tokenPreview","auth","version","sse_connections","uptime","Math","floor","title","type","days_left","expires_at","limits","max_agents","max_networks","max_tasks_day","value","onChange","e","target","placeholder","onClick","trim","method","headers","body","JSON","stringify","key","setTimeout","startsWith","saved","sessionStorage","getItem","token","parse","action","current_password","new_password","setItem","disabled","catch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../agent-network-dashboard/app/lib/hooks.ts","../../../../../agent-network-dashboard/package.json.%5Bjson%5D.mjs","../../../../../agent-network-dashboard/app/lib/version.ts","../../../../../agent-network-dashboard/app/settings/page.tsx"],"sourcesContent":["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 turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"version\":\"0.5.7-preview.5\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"start\":\"next start\",\"lint\":\"eslint\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.2.3\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"eslint\":\"^9\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint-config-next\":\"16.2.3\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwidmVyc2lvblwiOlwiMC41LjctcHJldmlldy41XCIsXCJkZXNjcmlwdGlvblwiOlwiQWdlbnQgTmV0d29yayBEYXNoYm9hcmQg4oCUIFdlYiBVSSBmb3IgbWFuYWdpbmcgQUkgQWdlbnQgbmV0d29ya3NcIixcIm1haW5cIjpcImFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwic2NyaXB0c1wiOntcImRldlwiOlwibmV4dCBkZXZcIixcImJ1aWxkXCI6XCJuZXh0IGJ1aWxkXCIsXCJzdGFydFwiOlwibmV4dCBzdGFydFwiLFwibGludFwiOlwiZXNsaW50XCIsXCJhcHA6YW5kcm9pZDppbml0XCI6XCJucHggY2FwIGFkZCBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpzeW5jXCI6XCJucHggY2FwIHN5bmMgYW5kcm9pZFwiLFwiYXBwOmFuZHJvaWQ6b3BlblwiOlwibnB4IGNhcCBvcGVuIGFuZHJvaWRcIixcImFwcDppb3M6aW5pdFwiOlwibnB4IGNhcCBhZGQgaW9zXCIsXCJhcHA6aW9zOnN5bmNcIjpcIm5weCBjYXAgc3luYyBpb3NcIixcImFwcDppb3M6b3BlblwiOlwibnB4IGNhcCBvcGVuIGlvc1wiLFwiYXBwOmRlc2t0b3BcIjpcImVsZWN0cm9uIGFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwiYXBwOmRlc2t0b3A6cGFja1wiOlwiZWxlY3Ryb24tYnVpbGRlciAtLWNvbmZpZyBlbGVjdHJvbi1idWlsZGVyLmpzb25cIixcInByZXB1Ymxpc2hPbmx5XCI6XCJbIC1mIC5uZXh0L0JVSUxEX0lEIF0gfHwgKGVjaG8gJ3ByZXB1Ymxpc2hPbmx5OiAubmV4dC9CVUlMRF9JRCBtaXNzaW5nIOKAlCBydW4gbnBtIHJ1biBidWlsZCBmaXJzdCAoc2VlIGNvbW1pdCAwNWMxZWJmIGJvZHkgZm9yIFIyMjQgY2h1bmstNTAwIHJvb3QgY2F1c2UpJyA+JjIgJiYgZXhpdCAxKVwifSxcImJpblwiOntcImFnZW50LW5ldHdvcmstZGFzaGJvYXJkXCI6XCIuL2Jpbi9zdGFydC5qc1wifSxcImhvbWVwYWdlXCI6XCJodHRwczovL2FuZXQuc2hcIixcInJlcG9zaXRvcnlcIjp7XCJ0eXBlXCI6XCJnaXRcIixcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwifSxcImJ1Z3NcIjp7XCJ1cmxcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGVlcDJhZ2kvYWdlbnQtbmV0d29yay1kYXNoYm9hcmQvaXNzdWVzXCJ9LFwiYXV0aG9yXCI6XCJzbGVlcDJhZ2lcIixcImxpY2Vuc2VcIjpcIkFwYWNoZS0yLjBcIixcInB1Ymxpc2hDb25maWdcIjp7XCJhY2Nlc3NcIjpcInB1YmxpY1wifSxcImRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvY29yZVwiOlwiXjcuNC40XCIsXCJuZXh0XCI6XCIxNi4yLjNcIixcInJlYWN0XCI6XCIxOS4yLjRcIixcInJlYWN0LWRvbVwiOlwiMTkuMi40XCIsXCJyZWFjdC1tYXJrZG93blwiOlwiXjEwLjEuMFwiLFwicmVtYXJrLWdmbVwiOlwiXjQuMC4xXCIsXCJzd3JcIjpcIl4yLjQuMVwifSxcImRldkRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvYW5kcm9pZFwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2NsaVwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2lvc1wiOlwiXjcuNC40XCIsXCJAcGxheXdyaWdodC90ZXN0XCI6XCJeMS41OS4xXCIsXCJAdGFpbHdpbmRjc3MvcG9zdGNzc1wiOlwiXjRcIixcIkB0eXBlcy9ub2RlXCI6XCJeMjBcIixcIkB0eXBlcy9yZWFjdFwiOlwiXjE5XCIsXCJAdHlwZXMvcmVhY3QtZG9tXCI6XCJeMTlcIixcImVzbGludFwiOlwiXjlcIixcImVsZWN0cm9uXCI6XCJeMzkuMi42XCIsXCJlbGVjdHJvbi1idWlsZGVyXCI6XCJeMjYuMC4xMlwiLFwiZXNsaW50LWNvbmZpZy1uZXh0XCI6XCIxNi4yLjNcIixcInRhaWx3aW5kY3NzXCI6XCJeNFwiLFwidHlwZXNjcmlwdFwiOlwiXjVcIn19Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n","'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { useAnetConfig, useHealth, useLicense } from '../lib/hooks';\nimport { DASHBOARD_VERSION } from '../lib/version';\n\nexport default function SettingsPage() {\n const { config } = useAnetConfig();\n const { health } = useHealth();\n const { license: licData } = useLicense();\n const [licKey, setLicKey] = useState('');\n const [licResult, setLicResult] = useState('');\n const [oldPwd, setOldPwd] = useState('');\n const [newPwd, setNewPwd] = useState('');\n const [pwdResult, setPwdResult] = useState('');\n const rowClass = 'flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between';\n const valueClass = 'break-all sm:max-w-[320px] sm:text-right';\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <h1 className=\"text-2xl font-bold text-white mb-3 lg:ml-0 ml-10\">Settings</h1>\n\n {/* Section anchor nav (round 28) — jump to a group instead of scrolling\n through the whole page. Mirrors the section headers below; pages\n with 7+ cards benefit from a visible table-of-contents.\n R3 of #190 mobile polish: matches the /admin chip treatment\n (preview.3) — 44px tap-target + visible border so the chips read\n as tappable rather than as inert headings on 375–390px. */}\n <nav className=\"mb-8 flex flex-wrap gap-2 text-xs\">\n {[\n { href: '#connection', label: 'Connection' },\n { href: '#account', label: 'Account' },\n { href: '#resources', label: 'Resources' },\n ].map(a => (\n <a key={a.href} href={a.href}\n className=\"inline-flex min-h-[44px] items-center rounded-md border border-[#2a2a4a] bg-[#0a0a15]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors\">\n {a.label}\n </a>\n ))}\n </nav>\n\n <div className=\"max-w-2xl space-y-10\">\n {/* ── Group: Connection ─────────────────────────────────── */}\n <div id=\"connection\" className=\"space-y-4 scroll-mt-6\">\n <div className=\"flex items-center gap-2 px-1\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold\">Connection</div>\n <div className=\"flex-1 h-px bg-[#2a2a4a]\" />\n </div>\n\n {/* CommHub Connection */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">CommHub Connection</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500 shrink-0\">Hub URL</span>\n <span className={`text-cyan-300 ${valueClass}`}>{config?.hub || 'not configured'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Config Source</span>\n <span className={`text-gray-300 ${valueClass}`}>\n {config?.source === 'file' ? 'Local file (~/.anet/config.json)' : config?.source === 'runtime-env' ? 'Vercel env vars' : 'Missing'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Auth Token</span>\n <span className={`${config?.tokenConfigured ? 'text-green-400' : 'text-red-400'} ${valueClass}`}>\n {config?.tokenConfigured ? `Configured (${config.tokenPreview})` : 'Not configured'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Server Auth</span>\n <span className={`${health?.auth === 'enabled' ? 'text-green-400' : 'text-yellow-400'} sm:text-right`}>\n {health?.auth || '--'}\n </span>\n </div>\n {config?.error && (\n <div className=\"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600\">\n {config.error}\n </div>\n )}\n </div>\n </section>\n\n {/* Server Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Server Info</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.version || '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Sessions</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sessions ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">SSE streams <span className=\"text-gray-600\">· server</span></span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sse_connections ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Uptime</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.uptime ? `${Math.floor(health.uptime / 3600)}h ${Math.floor((health.uptime % 3600) / 60)}m` : '--'}</span>\n </div>\n </div>\n </section>\n\n {/* Dashboard Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Dashboard</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 font-mono ${valueClass}`} title=\"From package.json @sleep2agi/agent-network-dashboard\">\n {DASHBOARD_VERSION}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Data Layer</span>\n <span className={`text-gray-300 ${valueClass}`}>SWR (5s refresh, 3s dedup)</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Pages</span>\n <span className={`text-gray-300 ${valueClass}`}>Overview, Tasks, Nodes, Messages, Networks, Audit, Server Logs, Admin, Settings</span>\n </div>\n </div>\n </section>\n </div>\n\n {/* ── Group: Account ────────────────────────────────────── */}\n <div id=\"account\" className=\"space-y-4 scroll-mt-6\">\n <div className=\"flex items-center gap-2 px-1\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold\">Account</div>\n <div className=\"flex-1 h-px bg-[#2a2a4a]\" />\n </div>\n\n {/* License */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4 flex items-center gap-2\">\n License\n {licData?.license && (\n <span\n className={`inline-flex items-center gap-1.5 text-[10px] font-medium px-2 py-0.5 rounded-full border ${\n licData.license.type === 'pro'\n ? 'text-green-300 bg-green-500/10 border-green-500/30'\n : licData.license.days_left <= 7\n ? 'text-red-300 bg-red-500/10 border-red-500/30'\n : 'text-amber-300 bg-amber-500/10 border-amber-500/30'\n }`}\n >\n <span aria-hidden className=\"w-1.5 h-1.5 rounded-full bg-current\" />\n {licData.license.type}{licData.license.days_left ? ` · ${licData.license.days_left}d left` : ''}\n </span>\n )}\n </h2>\n {licData?.license ? (\n <div className=\"space-y-3 text-sm\">\n {/* Type + Days Left are summarized in the inline chip in the\n header. Surface \"expiring soon\" only when relevant. */}\n {licData.license.days_left <= 7 && (\n <div className={rowClass}>\n <span className=\"text-red-400 font-medium\">⚠ Expiring soon</span>\n <span className=\"text-red-400\">{licData.license.days_left} days left</span>\n </div>\n )}\n <div className={rowClass}>\n <span className=\"text-gray-500\">Expires</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.license.expires_at}</span>\n </div>\n {licData.limits && (\n <>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Agents</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_agents}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Networks</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_networks}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Tasks/Day</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_tasks_day}</span>\n </div>\n </>\n )}\n <div className=\"pt-3 border-t border-[#2a2a4a]\">\n <div className=\"flex gap-2\">\n <input type=\"text\" value={licKey} onChange={e => setLicKey(e.target.value)}\n placeholder=\"anet-XXXX-XXXX-XXXX-XXXX\"\n className=\"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none\" />\n <button onClick={async () => {\n if (!licKey.trim()) return;\n const res = await fetch('/api/hub/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: licKey }) });\n const data = await res.json();\n setLicResult(data.ok ? `Activated: ${data.type}` : `Failed: ${data.error}`);\n if (data.ok) setLicKey('');\n setTimeout(() => setLicResult(''), 5000);\n }} className=\"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors\">\n Activate\n </button>\n </div>\n {licResult && <div className={`mt-2 text-xs ${licResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{licResult}</div>}\n </div>\n </div>\n ) : (\n <div className=\"text-xs text-gray-600\">License info not available</div>\n )}\n </section>\n\n {/* Change Password */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Change Password</h2>\n <div className=\"space-y-3\">\n <input type=\"password\" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder=\"Current password\"\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=\"password\" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder=\"New password\"\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={async () => {\n if (!oldPwd || !newPwd) return;\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (!saved) { setPwdResult('Not logged in with V3 auth'); return; }\n const { token } = JSON.parse(saved);\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'change_password', token, current_password: oldPwd, new_password: newPwd }),\n });\n const data = await res.json();\n setPwdResult(data.ok ? 'Password changed' : `Failed: ${data.error}`);\n if (data.ok) {\n if (data.token) {\n const auth = JSON.parse(saved);\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({ ...auth, token: data.token }));\n }\n setOldPwd('');\n setNewPwd('');\n }\n setTimeout(() => setPwdResult(''), 5000);\n }} disabled={!oldPwd || !newPwd}\n className=\"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\">\n Change Password\n </button>\n </div>\n {pwdResult && <div className={`mt-2 text-xs ${pwdResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{pwdResult}</div>}\n </section>\n\n {/* Session — tone-neutral, no longer \"danger zone\" red */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Sign out</h2>\n <p className=\"text-xs text-gray-500 mb-3\">Signing out clears your dashboard session cookie. You'll return to the login page.</p>\n <button\n onClick={async () => {\n await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});\n window.location.assign('/login');\n }}\n className=\"px-4 py-2 bg-transparent hover:bg-[#1a1a2a] text-gray-300 text-sm rounded-lg border border-[#2a2a4a] hover:border-[#3a3a5a] transition-colors\"\n >\n Sign out\n </button>\n </section>\n </div>\n\n {/* ── Group: Resources ──────────────────────────────────── */}\n <div id=\"resources\" className=\"space-y-4 scroll-mt-6\">\n <div className=\"flex items-center gap-2 px-1\">\n <div className=\"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold\">Resources</div>\n <div className=\"flex-1 h-px bg-[#2a2a4a]\" />\n </div>\n\n {/* API Tokens + Networks */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <Link href=\"/settings/tokens\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">API Tokens</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create and manage tokens for CLI access.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n <Link href=\"/settings/networks\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">Networks</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create, manage, and delete agent networks.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n"],"names":["fetcher","url","res","fetch","status","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","SettingsPage","licData","licKey","setLicKey","licResult","setLicResult","oldPwd","setOldPwd","newPwd","setNewPwd","pwdResult","setPwdResult","rowClass","valueClass","className","href","label","map","a","id","hub","tokenConfigured","tokenPreview","auth","version","sse_connections","uptime","Math","floor","title","type","days_left","expires_at","limits","max_agents","max_networks","max_tasks_day","value","onChange","e","target","placeholder","onClick","trim","method","headers","body","JSON","stringify","key","setTimeout","startsWith","saved","sessionStorage","getItem","token","parse","action","current_password","new_password","setItem","disabled","catch"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[88531,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.5.7-preview.3"],88531)},72751,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(88531);a.s(["default",0,function(){let[a,e]=(0,c.useState)("login"),[f,g]=(0,c.useState)(""),[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(!1),p=async b=>{b.preventDefault(),o(!0),m("");try{let b=await fetch("/api/auth/v3",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,username:f,password:h})}),c=await b.json();if(c.ok){c.token&&sessionStorage.setItem("anet_v3_auth",JSON.stringify({user:c.user,token:c.token,networks:c.networks||[],currentNetwork:c.network_id||c.networks?.[0]?.network_id||""})),window.location.assign("/");return}m(c.error||"Login failed")}catch{m("Connection failed")}o(!1)};return(0,b.jsxs)("main",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16",children:[(0,b.jsx)("div",{className:"absolute inset-0 pointer-events-none anet-login-bg","aria-hidden":!0}),(0,b.jsxs)("div",{className:"relative w-full max-w-sm",children:[(0,b.jsxs)("div",{className:"text-center mb-7",children:[(0,b.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#111128] border border-[#2a2a4a] anet-login-mark",children:(0,b.jsxs)("svg",{className:"w-9 h-9",viewBox:"0 0 32 32","aria-hidden":!0,children:[(0,b.jsx)("circle",{cx:"16",cy:"16",r:"10",fill:"none",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.25",className:"text-cyan-400 anet-login-mark-ring"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"10",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"10",y1:"20",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("circle",{cx:"16",cy:"10",r:"3",fill:"currentColor",className:"text-cyan-400 anet-login-mark-node-a"}),(0,b.jsx)("circle",{cx:"10",cy:"20",r:"3",fill:"currentColor",className:"text-green-400 anet-login-mark-node-b"}),(0,b.jsx)("circle",{cx:"22",cy:"20",r:"3",fill:"currentColor",className:"text-violet-400 anet-login-mark-node-c"})]})}),(0,b.jsx)("h1",{className:"text-[22px] sm:text-2xl font-semibold text-white tracking-tight",children:"Agent Network"}),(0,b.jsx)("p",{className:"text-[13px] text-gray-500 mt-1.5 leading-snug",children:"login"===a?(0,b.jsxs)(b.Fragment,{children:["Welcome back · ",(0,b.jsx)("span",{className:"text-gray-600",children:"Tasks · Mesh · Messages"})]}):(0,b.jsxs)(b.Fragment,{children:["Create your account · ",(0,b.jsx)("span",{className:"text-gray-600",children:"Free preview · no credit card"})]})})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4",children:["login","register"].map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>{e(c),m("")},className:`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${a===c?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"login"===c?"Sign in":"Register"},c))}),(0,b.jsxs)("form",{onSubmit:p,className:"border border-[#2a2a4a] bg-[#111128]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30",children:[(0,b.jsx)("label",{htmlFor:"username",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Username"}),(0,b.jsx)("input",{id:"username",type:"text",value:f,onChange:a=>g(a.target.value),autoFocus:!0,placeholder:"Enter username",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4"}),(0,b.jsx)("label",{htmlFor:"password",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Password"}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("input",{id:"password",type:j?"text":"password",value:h,onChange:a=>i(a.target.value),placeholder:"Enter password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 pr-11 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all"}),(0,b.jsx)("button",{type:"button",onClick:()=>k(a=>!a),tabIndex:-1,"aria-label":j?"Hide password":"Show password",className:"absolute inset-y-0 right-0 flex items-center px-3 text-gray-600 hover:text-gray-300 transition-colors",children:j?(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"}),(0,b.jsx)("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]}):(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),(0,b.jsx)("circle",{cx:"12",cy:"12",r:"3"})]})})]}),l&&(0,b.jsx)("div",{className:"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2",children:l}),(0,b.jsxs)("button",{type:"submit",disabled:n||!h||!f.trim(),className:"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none",children:[n&&(0,b.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4 animate-spin",viewBox:"0 0 24 24",fill:"none",children:[(0,b.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),(0,b.jsx)("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),(0,b.jsx)("span",{children:n?"login"===a?"Signing in…":"Registering…":"login"===a?"Sign in":"Create account"})]})]}),(0,b.jsxs)("p",{className:"text-center text-[11px] text-gray-700 mt-6",children:["Sleep2AGI · Apache-2.0 · ",(0,b.jsx)("a",{href:"https://anet.sh",className:"hover:text-gray-500 transition-colors",children:"anet.sh"}),(0,b.jsx)("span",{className:"mx-1 text-gray-800",children:"·"}),(0,b.jsxs)("span",{className:"font-mono",title:"@sleep2agi/agent-network-dashboard",children:["v",d.DASHBOARD_VERSION]})]})]})]})}])}];
1
+ module.exports=[88531,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.5.7-preview.5"],88531)},72751,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(88531);a.s(["default",0,function(){let[a,e]=(0,c.useState)("login"),[f,g]=(0,c.useState)(""),[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(!1),p=async b=>{b.preventDefault(),o(!0),m("");try{let b=await fetch("/api/auth/v3",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,username:f,password:h})}),c=await b.json();if(c.ok){c.token&&sessionStorage.setItem("anet_v3_auth",JSON.stringify({user:c.user,token:c.token,networks:c.networks||[],currentNetwork:c.network_id||c.networks?.[0]?.network_id||""})),window.location.assign("/");return}m(c.error||"Login failed")}catch{m("Connection failed")}o(!1)};return(0,b.jsxs)("main",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16",children:[(0,b.jsx)("div",{className:"absolute inset-0 pointer-events-none anet-login-bg","aria-hidden":!0}),(0,b.jsxs)("div",{className:"relative w-full max-w-sm",children:[(0,b.jsxs)("div",{className:"text-center mb-7",children:[(0,b.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#111128] border border-[#2a2a4a] anet-login-mark",children:(0,b.jsxs)("svg",{className:"w-9 h-9",viewBox:"0 0 32 32","aria-hidden":!0,children:[(0,b.jsx)("circle",{cx:"16",cy:"16",r:"10",fill:"none",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.25",className:"text-cyan-400 anet-login-mark-ring"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"10",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"10",y1:"20",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("circle",{cx:"16",cy:"10",r:"3",fill:"currentColor",className:"text-cyan-400 anet-login-mark-node-a"}),(0,b.jsx)("circle",{cx:"10",cy:"20",r:"3",fill:"currentColor",className:"text-green-400 anet-login-mark-node-b"}),(0,b.jsx)("circle",{cx:"22",cy:"20",r:"3",fill:"currentColor",className:"text-violet-400 anet-login-mark-node-c"})]})}),(0,b.jsx)("h1",{className:"text-[22px] sm:text-2xl font-semibold text-white tracking-tight",children:"Agent Network"}),(0,b.jsx)("p",{className:"text-[13px] text-gray-500 mt-1.5 leading-snug",children:"login"===a?(0,b.jsxs)(b.Fragment,{children:["Welcome back · ",(0,b.jsx)("span",{className:"text-gray-600",children:"Tasks · Mesh · Messages"})]}):(0,b.jsxs)(b.Fragment,{children:["Create your account · ",(0,b.jsx)("span",{className:"text-gray-600",children:"Free preview · no credit card"})]})})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4",children:["login","register"].map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>{e(c),m("")},className:`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${a===c?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"login"===c?"Sign in":"Register"},c))}),(0,b.jsxs)("form",{onSubmit:p,className:"border border-[#2a2a4a] bg-[#111128]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30",children:[(0,b.jsx)("label",{htmlFor:"username",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Username"}),(0,b.jsx)("input",{id:"username",type:"text",value:f,onChange:a=>g(a.target.value),autoFocus:!0,placeholder:"Enter username",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4"}),(0,b.jsx)("label",{htmlFor:"password",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Password"}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("input",{id:"password",type:j?"text":"password",value:h,onChange:a=>i(a.target.value),placeholder:"Enter password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 pr-11 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all"}),(0,b.jsx)("button",{type:"button",onClick:()=>k(a=>!a),tabIndex:-1,"aria-label":j?"Hide password":"Show password",className:"absolute inset-y-0 right-0 flex items-center px-3 text-gray-600 hover:text-gray-300 transition-colors",children:j?(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"}),(0,b.jsx)("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]}):(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),(0,b.jsx)("circle",{cx:"12",cy:"12",r:"3"})]})})]}),l&&(0,b.jsx)("div",{className:"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2",children:l}),(0,b.jsxs)("button",{type:"submit",disabled:n||!h||!f.trim(),className:"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none",children:[n&&(0,b.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4 animate-spin",viewBox:"0 0 24 24",fill:"none",children:[(0,b.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),(0,b.jsx)("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),(0,b.jsx)("span",{children:n?"login"===a?"Signing in…":"Registering…":"login"===a?"Sign in":"Create account"})]})]}),(0,b.jsxs)("p",{className:"text-center text-[11px] text-gray-700 mt-6",children:["Sleep2AGI · Apache-2.0 · ",(0,b.jsx)("a",{href:"https://anet.sh",className:"hover:text-gray-500 transition-colors",children:"anet.sh"}),(0,b.jsx)("span",{className:"mx-1 text-gray-800",children:"·"}),(0,b.jsxs)("span",{className:"font-mono",title:"@sleep2agi/agent-network-dashboard",children:["v",d.DASHBOARD_VERSION]})]})]})]})}])}];
2
2
 
3
3
  //# sourceMappingURL=agent-network-dashboard_app_09d29my._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../agent-network-dashboard/package.json.%5Bjson%5D.mjs","../../../../../agent-network-dashboard/app/lib/version.ts","../../../../../agent-network-dashboard/app/login/page.tsx"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"version\":\"0.5.7-preview.3\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"start\":\"next start\",\"lint\":\"eslint\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.2.3\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"eslint\":\"^9\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint-config-next\":\"16.2.3\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwidmVyc2lvblwiOlwiMC41LjctcHJldmlldy4zXCIsXCJkZXNjcmlwdGlvblwiOlwiQWdlbnQgTmV0d29yayBEYXNoYm9hcmQg4oCUIFdlYiBVSSBmb3IgbWFuYWdpbmcgQUkgQWdlbnQgbmV0d29ya3NcIixcIm1haW5cIjpcImFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwic2NyaXB0c1wiOntcImRldlwiOlwibmV4dCBkZXZcIixcImJ1aWxkXCI6XCJuZXh0IGJ1aWxkXCIsXCJzdGFydFwiOlwibmV4dCBzdGFydFwiLFwibGludFwiOlwiZXNsaW50XCIsXCJhcHA6YW5kcm9pZDppbml0XCI6XCJucHggY2FwIGFkZCBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpzeW5jXCI6XCJucHggY2FwIHN5bmMgYW5kcm9pZFwiLFwiYXBwOmFuZHJvaWQ6b3BlblwiOlwibnB4IGNhcCBvcGVuIGFuZHJvaWRcIixcImFwcDppb3M6aW5pdFwiOlwibnB4IGNhcCBhZGQgaW9zXCIsXCJhcHA6aW9zOnN5bmNcIjpcIm5weCBjYXAgc3luYyBpb3NcIixcImFwcDppb3M6b3BlblwiOlwibnB4IGNhcCBvcGVuIGlvc1wiLFwiYXBwOmRlc2t0b3BcIjpcImVsZWN0cm9uIGFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwiYXBwOmRlc2t0b3A6cGFja1wiOlwiZWxlY3Ryb24tYnVpbGRlciAtLWNvbmZpZyBlbGVjdHJvbi1idWlsZGVyLmpzb25cIixcInByZXB1Ymxpc2hPbmx5XCI6XCJbIC1mIC5uZXh0L0JVSUxEX0lEIF0gfHwgKGVjaG8gJ3ByZXB1Ymxpc2hPbmx5OiAubmV4dC9CVUlMRF9JRCBtaXNzaW5nIOKAlCBydW4gbnBtIHJ1biBidWlsZCBmaXJzdCAoc2VlIGNvbW1pdCAwNWMxZWJmIGJvZHkgZm9yIFIyMjQgY2h1bmstNTAwIHJvb3QgY2F1c2UpJyA+JjIgJiYgZXhpdCAxKVwifSxcImJpblwiOntcImFnZW50LW5ldHdvcmstZGFzaGJvYXJkXCI6XCIuL2Jpbi9zdGFydC5qc1wifSxcImhvbWVwYWdlXCI6XCJodHRwczovL2FuZXQuc2hcIixcInJlcG9zaXRvcnlcIjp7XCJ0eXBlXCI6XCJnaXRcIixcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwifSxcImJ1Z3NcIjp7XCJ1cmxcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGVlcDJhZ2kvYWdlbnQtbmV0d29yay1kYXNoYm9hcmQvaXNzdWVzXCJ9LFwiYXV0aG9yXCI6XCJzbGVlcDJhZ2lcIixcImxpY2Vuc2VcIjpcIkFwYWNoZS0yLjBcIixcInB1Ymxpc2hDb25maWdcIjp7XCJhY2Nlc3NcIjpcInB1YmxpY1wifSxcImRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvY29yZVwiOlwiXjcuNC40XCIsXCJuZXh0XCI6XCIxNi4yLjNcIixcInJlYWN0XCI6XCIxOS4yLjRcIixcInJlYWN0LWRvbVwiOlwiMTkuMi40XCIsXCJyZWFjdC1tYXJrZG93blwiOlwiXjEwLjEuMFwiLFwicmVtYXJrLWdmbVwiOlwiXjQuMC4xXCIsXCJzd3JcIjpcIl4yLjQuMVwifSxcImRldkRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvYW5kcm9pZFwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2NsaVwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2lvc1wiOlwiXjcuNC40XCIsXCJAcGxheXdyaWdodC90ZXN0XCI6XCJeMS41OS4xXCIsXCJAdGFpbHdpbmRjc3MvcG9zdGNzc1wiOlwiXjRcIixcIkB0eXBlcy9ub2RlXCI6XCJeMjBcIixcIkB0eXBlcy9yZWFjdFwiOlwiXjE5XCIsXCJAdHlwZXMvcmVhY3QtZG9tXCI6XCJeMTlcIixcImVzbGludFwiOlwiXjlcIixcImVsZWN0cm9uXCI6XCJeMzkuMi42XCIsXCJlbGVjdHJvbi1idWlsZGVyXCI6XCJeMjYuMC4xMlwiLFwiZXNsaW50LWNvbmZpZy1uZXh0XCI6XCIxNi4yLjNcIixcInRhaWx3aW5kY3NzXCI6XCJeNFwiLFwidHlwZXNjcmlwdFwiOlwiXjVcIn19Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n","'use client';\n\nimport { FormEvent, useState } from 'react';\nimport { DASHBOARD_VERSION } from '../lib/version';\n\nexport default function LoginPage() {\n const [mode, setMode] = useState<'login' | 'register'>('login');\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState('');\n const [pending, setPending] = useState(false);\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setPending(true);\n setError('');\n\n try {\n const res = await fetch('/api/auth/v3', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: mode, username, password }),\n });\n const data = await res.json();\n\n if (data.ok) {\n // Store V3 auth data for client-side features\n if (data.token) {\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({\n user: data.user,\n token: data.token,\n networks: data.networks || [],\n currentNetwork: data.network_id || data.networks?.[0]?.network_id || '',\n }));\n }\n window.location.assign('/');\n return;\n }\n\n setError(data.error || 'Login failed');\n } catch {\n setError('Connection failed');\n }\n setPending(false);\n };\n\n return (\n <main className=\"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16\">\n {/* Subtle off-grid background — restraint over AI-glow.\n Dark themes get a faint radial wash; light themes show a low-contrast\n dotted grid for surface texture without noise. */}\n <div className=\"absolute inset-0 pointer-events-none anet-login-bg\" aria-hidden />\n\n <div className=\"relative w-full max-w-sm\">\n <div className=\"text-center mb-7\">\n {/* Brand mark — uses the favicon 3-node mesh SVG which IS the\n agent-network concept (nodes + edges). Replaces the previous\n flat emerald square placeholder. */}\n <div className=\"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#111128] border border-[#2a2a4a] anet-login-mark\">\n <svg className=\"w-9 h-9\" viewBox=\"0 0 32 32\" aria-hidden>\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" className=\"text-cyan-400 anet-login-mark-ring\" />\n <line x1=\"16\" y1=\"10\" x2=\"10\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"16\" y1=\"10\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"10\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <circle cx=\"16\" cy=\"10\" r=\"3\" fill=\"currentColor\" className=\"text-cyan-400 anet-login-mark-node-a\" />\n <circle cx=\"10\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-green-400 anet-login-mark-node-b\" />\n <circle cx=\"22\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-violet-400 anet-login-mark-node-c\" />\n </svg>\n </div>\n <h1 className=\"text-[22px] sm:text-2xl font-semibold text-white tracking-tight\">Agent Network</h1>\n <p className=\"text-[13px] text-gray-500 mt-1.5 leading-snug\">\n {mode === 'login'\n ? <>Welcome back · <span className=\"text-gray-600\">Tasks · Mesh · Messages</span></>\n : <>Create your account · <span className=\"text-gray-600\">Free preview · no credit card</span></>}\n </p>\n </div>\n\n {/* Mode toggle */}\n <div className=\"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4\">\n {(['login', 'register'] as const).map(m => (\n <button key={m} type=\"button\" onClick={() => { setMode(m); setError(''); }}\n className={`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${mode === m ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {m === 'login' ? 'Sign in' : 'Register'}\n </button>\n ))}\n </div>\n\n <form onSubmit={submit} className=\"border border-[#2a2a4a] bg-[#111128]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30\">\n <label htmlFor=\"username\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Username\n </label>\n <input id=\"username\" type=\"text\" value={username} onChange={e => setUsername(e.target.value)} autoFocus\n placeholder=\"Enter username\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4\" />\n\n <label htmlFor=\"password\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Password\n </label>\n <div className=\"relative\">\n <input id=\"password\" type={showPassword ? 'text' : 'password'} value={password} onChange={e => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 pr-11 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all\" />\n <button\n type=\"button\"\n onClick={() => setShowPassword(s => !s)}\n tabIndex={-1}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-gray-600 hover:text-gray-300 transition-colors\"\n >\n {showPassword ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n\n {error && (\n <div className=\"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2\">{error}</div>\n )}\n\n <button type=\"submit\" disabled={pending || !password || !username.trim()}\n className=\"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none\">\n {pending && (\n <svg aria-hidden className=\"w-4 h-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" opacity=\"0.25\" />\n <path d=\"M4 12a8 8 0 018-8\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n )}\n <span>{pending ? (mode === 'login' ? 'Signing in…' : 'Registering…') : (mode === 'login' ? 'Sign in' : 'Create account')}</span>\n </button>\n </form>\n\n <p className=\"text-center text-[11px] text-gray-700 mt-6\">\n Sleep2AGI · Apache-2.0 · <a href=\"https://anet.sh\" className=\"hover:text-gray-500 transition-colors\">anet.sh</a>\n <span className=\"mx-1 text-gray-800\">·</span>\n <span className=\"font-mono\" title=\"@sleep2agi/agent-network-dashboard\">v{DASHBOARD_VERSION}</span>\n </p>\n </div>\n </main>\n );\n}\n"],"names":["LoginPage","mode","setMode","username","setUsername","password","setPassword","showPassword","setShowPassword","error","setError","pending","setPending","submit","event","preventDefault","res","fetch","method","headers","body","JSON","stringify","action","data","json","ok","token","sessionStorage","setItem","user","networks","currentNetwork","network_id","window","location","assign","className","viewBox","cx","cy","r","fill","stroke","strokeWidth","opacity","x1","y1","x2","y2","map","m","type","onClick","onSubmit","htmlFor","id","value","onChange","e","target","autoFocus","placeholder","s","tabIndex","width","height","strokeLinecap","strokeLinejoin","d","disabled","trim","href","title"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../agent-network-dashboard/package.json.%5Bjson%5D.mjs","../../../../../agent-network-dashboard/app/lib/version.ts","../../../../../agent-network-dashboard/app/login/page.tsx"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"version\":\"0.5.7-preview.5\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"start\":\"next start\",\"lint\":\"eslint\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.2.3\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"eslint\":\"^9\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint-config-next\":\"16.2.3\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwidmVyc2lvblwiOlwiMC41LjctcHJldmlldy41XCIsXCJkZXNjcmlwdGlvblwiOlwiQWdlbnQgTmV0d29yayBEYXNoYm9hcmQg4oCUIFdlYiBVSSBmb3IgbWFuYWdpbmcgQUkgQWdlbnQgbmV0d29ya3NcIixcIm1haW5cIjpcImFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwic2NyaXB0c1wiOntcImRldlwiOlwibmV4dCBkZXZcIixcImJ1aWxkXCI6XCJuZXh0IGJ1aWxkXCIsXCJzdGFydFwiOlwibmV4dCBzdGFydFwiLFwibGludFwiOlwiZXNsaW50XCIsXCJhcHA6YW5kcm9pZDppbml0XCI6XCJucHggY2FwIGFkZCBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpzeW5jXCI6XCJucHggY2FwIHN5bmMgYW5kcm9pZFwiLFwiYXBwOmFuZHJvaWQ6b3BlblwiOlwibnB4IGNhcCBvcGVuIGFuZHJvaWRcIixcImFwcDppb3M6aW5pdFwiOlwibnB4IGNhcCBhZGQgaW9zXCIsXCJhcHA6aW9zOnN5bmNcIjpcIm5weCBjYXAgc3luYyBpb3NcIixcImFwcDppb3M6b3BlblwiOlwibnB4IGNhcCBvcGVuIGlvc1wiLFwiYXBwOmRlc2t0b3BcIjpcImVsZWN0cm9uIGFwcHMvZGVza3RvcC9lbGVjdHJvbi9tYWluLmNqc1wiLFwiYXBwOmRlc2t0b3A6cGFja1wiOlwiZWxlY3Ryb24tYnVpbGRlciAtLWNvbmZpZyBlbGVjdHJvbi1idWlsZGVyLmpzb25cIixcInByZXB1Ymxpc2hPbmx5XCI6XCJbIC1mIC5uZXh0L0JVSUxEX0lEIF0gfHwgKGVjaG8gJ3ByZXB1Ymxpc2hPbmx5OiAubmV4dC9CVUlMRF9JRCBtaXNzaW5nIOKAlCBydW4gbnBtIHJ1biBidWlsZCBmaXJzdCAoc2VlIGNvbW1pdCAwNWMxZWJmIGJvZHkgZm9yIFIyMjQgY2h1bmstNTAwIHJvb3QgY2F1c2UpJyA+JjIgJiYgZXhpdCAxKVwifSxcImJpblwiOntcImFnZW50LW5ldHdvcmstZGFzaGJvYXJkXCI6XCIuL2Jpbi9zdGFydC5qc1wifSxcImhvbWVwYWdlXCI6XCJodHRwczovL2FuZXQuc2hcIixcInJlcG9zaXRvcnlcIjp7XCJ0eXBlXCI6XCJnaXRcIixcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwifSxcImJ1Z3NcIjp7XCJ1cmxcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGVlcDJhZ2kvYWdlbnQtbmV0d29yay1kYXNoYm9hcmQvaXNzdWVzXCJ9LFwiYXV0aG9yXCI6XCJzbGVlcDJhZ2lcIixcImxpY2Vuc2VcIjpcIkFwYWNoZS0yLjBcIixcInB1Ymxpc2hDb25maWdcIjp7XCJhY2Nlc3NcIjpcInB1YmxpY1wifSxcImRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvY29yZVwiOlwiXjcuNC40XCIsXCJuZXh0XCI6XCIxNi4yLjNcIixcInJlYWN0XCI6XCIxOS4yLjRcIixcInJlYWN0LWRvbVwiOlwiMTkuMi40XCIsXCJyZWFjdC1tYXJrZG93blwiOlwiXjEwLjEuMFwiLFwicmVtYXJrLWdmbVwiOlwiXjQuMC4xXCIsXCJzd3JcIjpcIl4yLjQuMVwifSxcImRldkRlcGVuZGVuY2llc1wiOntcIkBjYXBhY2l0b3IvYW5kcm9pZFwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2NsaVwiOlwiXjcuNC40XCIsXCJAY2FwYWNpdG9yL2lvc1wiOlwiXjcuNC40XCIsXCJAcGxheXdyaWdodC90ZXN0XCI6XCJeMS41OS4xXCIsXCJAdGFpbHdpbmRjc3MvcG9zdGNzc1wiOlwiXjRcIixcIkB0eXBlcy9ub2RlXCI6XCJeMjBcIixcIkB0eXBlcy9yZWFjdFwiOlwiXjE5XCIsXCJAdHlwZXMvcmVhY3QtZG9tXCI6XCJeMTlcIixcImVzbGludFwiOlwiXjlcIixcImVsZWN0cm9uXCI6XCJeMzkuMi42XCIsXCJlbGVjdHJvbi1idWlsZGVyXCI6XCJeMjYuMC4xMlwiLFwiZXNsaW50LWNvbmZpZy1uZXh0XCI6XCIxNi4yLjNcIixcInRhaWx3aW5kY3NzXCI6XCJeNFwiLFwidHlwZXNjcmlwdFwiOlwiXjVcIn19Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n","'use client';\n\nimport { FormEvent, useState } from 'react';\nimport { DASHBOARD_VERSION } from '../lib/version';\n\nexport default function LoginPage() {\n const [mode, setMode] = useState<'login' | 'register'>('login');\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState('');\n const [pending, setPending] = useState(false);\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setPending(true);\n setError('');\n\n try {\n const res = await fetch('/api/auth/v3', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: mode, username, password }),\n });\n const data = await res.json();\n\n if (data.ok) {\n // Store V3 auth data for client-side features\n if (data.token) {\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({\n user: data.user,\n token: data.token,\n networks: data.networks || [],\n currentNetwork: data.network_id || data.networks?.[0]?.network_id || '',\n }));\n }\n window.location.assign('/');\n return;\n }\n\n setError(data.error || 'Login failed');\n } catch {\n setError('Connection failed');\n }\n setPending(false);\n };\n\n return (\n <main className=\"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16\">\n {/* Subtle off-grid background — restraint over AI-glow.\n Dark themes get a faint radial wash; light themes show a low-contrast\n dotted grid for surface texture without noise. */}\n <div className=\"absolute inset-0 pointer-events-none anet-login-bg\" aria-hidden />\n\n <div className=\"relative w-full max-w-sm\">\n <div className=\"text-center mb-7\">\n {/* Brand mark — uses the favicon 3-node mesh SVG which IS the\n agent-network concept (nodes + edges). Replaces the previous\n flat emerald square placeholder. */}\n <div className=\"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#111128] border border-[#2a2a4a] anet-login-mark\">\n <svg className=\"w-9 h-9\" viewBox=\"0 0 32 32\" aria-hidden>\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" className=\"text-cyan-400 anet-login-mark-ring\" />\n <line x1=\"16\" y1=\"10\" x2=\"10\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"16\" y1=\"10\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"10\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <circle cx=\"16\" cy=\"10\" r=\"3\" fill=\"currentColor\" className=\"text-cyan-400 anet-login-mark-node-a\" />\n <circle cx=\"10\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-green-400 anet-login-mark-node-b\" />\n <circle cx=\"22\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-violet-400 anet-login-mark-node-c\" />\n </svg>\n </div>\n <h1 className=\"text-[22px] sm:text-2xl font-semibold text-white tracking-tight\">Agent Network</h1>\n <p className=\"text-[13px] text-gray-500 mt-1.5 leading-snug\">\n {mode === 'login'\n ? <>Welcome back · <span className=\"text-gray-600\">Tasks · Mesh · Messages</span></>\n : <>Create your account · <span className=\"text-gray-600\">Free preview · no credit card</span></>}\n </p>\n </div>\n\n {/* Mode toggle */}\n <div className=\"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4\">\n {(['login', 'register'] as const).map(m => (\n <button key={m} type=\"button\" onClick={() => { setMode(m); setError(''); }}\n className={`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${mode === m ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {m === 'login' ? 'Sign in' : 'Register'}\n </button>\n ))}\n </div>\n\n <form onSubmit={submit} className=\"border border-[#2a2a4a] bg-[#111128]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30\">\n <label htmlFor=\"username\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Username\n </label>\n <input id=\"username\" type=\"text\" value={username} onChange={e => setUsername(e.target.value)} autoFocus\n placeholder=\"Enter username\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4\" />\n\n <label htmlFor=\"password\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Password\n </label>\n <div className=\"relative\">\n <input id=\"password\" type={showPassword ? 'text' : 'password'} value={password} onChange={e => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 pr-11 py-3 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all\" />\n <button\n type=\"button\"\n onClick={() => setShowPassword(s => !s)}\n tabIndex={-1}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-gray-600 hover:text-gray-300 transition-colors\"\n >\n {showPassword ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n\n {error && (\n <div className=\"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2\">{error}</div>\n )}\n\n <button type=\"submit\" disabled={pending || !password || !username.trim()}\n className=\"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none\">\n {pending && (\n <svg aria-hidden className=\"w-4 h-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" opacity=\"0.25\" />\n <path d=\"M4 12a8 8 0 018-8\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n )}\n <span>{pending ? (mode === 'login' ? 'Signing in…' : 'Registering…') : (mode === 'login' ? 'Sign in' : 'Create account')}</span>\n </button>\n </form>\n\n <p className=\"text-center text-[11px] text-gray-700 mt-6\">\n Sleep2AGI · Apache-2.0 · <a href=\"https://anet.sh\" className=\"hover:text-gray-500 transition-colors\">anet.sh</a>\n <span className=\"mx-1 text-gray-800\">·</span>\n <span className=\"font-mono\" title=\"@sleep2agi/agent-network-dashboard\">v{DASHBOARD_VERSION}</span>\n </p>\n </div>\n </main>\n );\n}\n"],"names":["LoginPage","mode","setMode","username","setUsername","password","setPassword","showPassword","setShowPassword","error","setError","pending","setPending","submit","event","preventDefault","res","fetch","method","headers","body","JSON","stringify","action","data","json","ok","token","sessionStorage","setItem","user","networks","currentNetwork","network_id","window","location","assign","className","viewBox","cx","cy","r","fill","stroke","strokeWidth","opacity","x1","y1","x2","y2","map","m","type","onClick","onSubmit","htmlFor","id","value","onChange","e","target","autoFocus","placeholder","s","tabIndex","width","height","strokeLinecap","strokeLinejoin","d","disabled","trim","href","title"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- module.exports=[52140,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(88534);let e={log:"text-gray-300",info:"text-cyan-300",warn:"text-amber-400",error:"text-red-400"},f={log:"bg-gray-500/10 text-gray-400 border-gray-500/20",info:"bg-cyan-500/10 text-cyan-300 border-cyan-500/30",warn:"bg-amber-500/10 text-amber-300 border-amber-500/30",error:"bg-red-500/10 text-red-300 border-red-500/30"},g={log:"transparent",info:"#22d3ee",warn:"#f59e0b",error:"#ef4444"};a.s(["default",0,function(){let a,[h,i]=(0,c.useState)([]),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(!1),[n,o]=(0,c.useState)("all"),[p,q]=(0,c.useState)(""),[r,s]=(0,c.useState)(!0),t=(0,c.useRef)(""),u=(0,c.useCallback)(async(a=!1)=>{try{let b=new URLSearchParams({limit:"500"});!a&&t.current&&b.set("since",t.current);let c=await fetch(`/api/hub/server-logs?${b.toString()}`),d=await c.json();if(!c.ok||!d.ok)return void k(d.error||`HTTP ${c.status}`);k(null);let e=d.logs||[];if(0===e.length)return;t.current=e[0].ts,a?i(e):i(a=>{let b=new Set(a.map(a=>a.ts+a.line));return[...e.filter(a=>!b.has(a.ts+a.line)),...a].slice(0,1e3)})}catch(a){k(a instanceof Error?a.message:"fetch failed")}},[]);(0,c.useEffect)(()=>{u(!0)},[u]),(0,c.useEffect)(()=>{if(!r||l)return;let a=setInterval(()=>u(!1),2e3);return()=>clearInterval(a)},[r,l,u]);let v=h.filter(a=>("all"===n||a.level===n)&&(!p||!!a.line.toLowerCase().includes(p.toLowerCase()))),w={log:0,info:0,warn:0,error:0};for(let a of h)w[a.level]++;return(0,b.jsxs)("div",{className:"p-6 max-w-[1600px] mx-auto",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-4 gap-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white",children:"Server Logs"}),(0,b.jsx)("span",{className:"text-xs text-gray-500 hidden sm:inline",children:"CommHub stdout/stderr"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs shrink-0",children:[(0,b.jsx)("button",{onClick:()=>m(a=>!a),className:`flex items-center gap-1.5 px-3 py-1 rounded border ${l?"bg-amber-500/10 text-amber-300 border-amber-500/30":"bg-cyan-500/10 text-cyan-300 border-cyan-500/30"}`,children:l?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:(0,b.jsx)("path",{d:"M8 5v14l11-7z"})}),"Resume"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[(0,b.jsx)("rect",{x:"6",y:"5",width:"4",height:"14",rx:"0.5"}),(0,b.jsx)("rect",{x:"14",y:"5",width:"4",height:"14",rx:"0.5"})]}),"Pause"]})}),(0,b.jsxs)("label",{className:"flex items-center gap-1 text-gray-400 select-none",children:[(0,b.jsx)("input",{type:"checkbox",checked:r,onChange:a=>s(a.target.checked),className:"accent-cyan-500"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"auto-refresh"})]}),(0,b.jsxs)("button",{onClick:()=>u(!0),className:"flex items-center gap-1.5 px-3 py-1 rounded border bg-gray-500/10 text-gray-300 border-gray-500/20 hover:bg-gray-500/20",children:[(0,b.jsxs)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[(0,b.jsx)("path",{d:"M3 12a9 9 0 0 1 15.5-6.4L21 8"}),(0,b.jsx)("path",{d:"M21 3v5h-5"}),(0,b.jsx)("path",{d:"M21 12a9 9 0 0 1-15.5 6.4L3 16"}),(0,b.jsx)("path",{d:"M3 21v-5h5"})]}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Reload"})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3 mb-3",children:[(0,b.jsx)("div",{className:"flex items-center gap-1 text-xs flex-wrap",children:["all","log","info","warn","error"].map(a=>{let c="all"===a?h.length:w[a],d=n===a,e="all"!==a&&0===c&&!d;return(0,b.jsxs)("button",{onClick:()=>o(a),disabled:e,className:`px-2.5 py-1 rounded border flex items-center gap-1 disabled:opacity-30 disabled:cursor-not-allowed ${d?"bg-cyan-500/15 text-cyan-200 border-cyan-500/40":"bg-[#11111c] text-gray-400 border-[#2a2a4a] hover:bg-[#1a1a2a]"}`,children:[(0,b.jsx)("span",{children:a}),(0,b.jsx)("span",{className:`text-[10px] tabular-nums ${d?"opacity-80":"text-gray-600"}`,children:c})]},a)})}),(0,b.jsx)("input",{value:p,onChange:a=>q(a.target.value),placeholder:"搜索关键字 (alias / task_id / error message)",className:"flex-1 min-w-[140px] basis-full sm:basis-0 px-3 py-1.5 text-xs bg-[#11111c] border border-[#2a2a4a] rounded text-gray-200 focus:outline-none focus:border-cyan-500/40"}),(0,b.jsxs)("span",{className:"text-[10px] text-gray-600",children:[v.length," / ",h.length]})]}),j&&(a=/401|unauthor|forbidden|403|admin/i.test(j),(0,b.jsxs)("div",{className:"anet-error-chip mb-3 p-3 rounded border border-red-500/30 bg-red-500/10 text-red-300 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.jsx)("div",{className:"flex-1",children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"font-medium",children:"需要 admin 角色才能查看服务器日志"}),(0,b.jsx)("div",{className:"text-xs opacity-80 mt-0.5",title:j,children:"服务器日志包含运行时 stdout/stderr,仅 admin 角色可读。"}),(0,b.jsx)(d.default,{href:"/login",className:"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80",children:"切到 admin 账号 →"})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"font-medium",children:"服务器日志暂时无法加载"}),(0,b.jsx)("div",{className:"text-xs opacity-80 mt-0.5",title:j,children:"请检查 CommHub 是否在线,或稍后重试。"}),(0,b.jsx)("button",{onClick:()=>window.location.reload(),className:"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80",children:"重新加载 →"})]})})]})),(0,b.jsx)("div",{className:"rounded border border-[#1a1a2a] bg-[#050510] font-mono text-[11px] leading-relaxed overflow-hidden",children:0===v.length?(0,b.jsx)("div",{className:"p-8 text-center text-gray-600",children:j?"加载失败":0===h.length?"加载中...":"没有匹配的日志"}):(0,b.jsx)("div",{className:"divide-y divide-[#0d0d18] max-h-[calc(100vh-260px)] overflow-y-auto",children:v.map((a,c)=>(0,b.jsxs)("div",{className:"relative pl-3 pr-3 py-1 hover:bg-[#0a0a14] flex gap-3",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute left-0 top-0 bottom-0 w-0.5",style:{backgroundColor:g[a.level]}}),(0,b.jsx)("span",{className:"text-gray-600 shrink-0 w-[100px] text-[10px] tabular-nums",children:function(a){try{let b=new Date(a);return b.toTimeString().slice(0,8)+"."+String(b.getMilliseconds()).padStart(3,"0")}catch{return a}}(a.ts)}),(0,b.jsx)("span",{className:`shrink-0 px-1.5 rounded border text-[9px] uppercase ${f[a.level]}`,children:a.level}),(0,b.jsx)("span",{className:`break-all whitespace-pre-wrap ${e[a.level]}`,children:function(a,c){if(!c)return a;let d=a.toLowerCase().indexOf(c.toLowerCase());return d<0?a:(0,b.jsxs)(b.Fragment,{children:[a.slice(0,d),(0,b.jsx)("mark",{className:"bg-yellow-500/30 text-yellow-100 rounded-sm px-0.5",children:a.slice(d,d+c.length)}),a.slice(d+c.length)]})}(a.line.replace(/^\[\d{2}:\d{2}:\d{2}\]\s*/,""),p)})]},`${a.ts}-${c}`))})})]})}])}];
1
+ module.exports=[52140,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(88534);let e={log:"text-gray-300",info:"text-cyan-300",warn:"text-amber-400",error:"text-red-400"},f={log:"bg-gray-500/10 text-gray-400 border-gray-500/20",info:"bg-cyan-500/10 text-cyan-300 border-cyan-500/30",warn:"bg-amber-500/10 text-amber-300 border-amber-500/30",error:"bg-red-500/10 text-red-300 border-red-500/30"},g={log:"transparent",info:"#22d3ee",warn:"#f59e0b",error:"#ef4444"};a.s(["default",0,function(){let a,[h,i]=(0,c.useState)([]),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(!1),[n,o]=(0,c.useState)("all"),[p,q]=(0,c.useState)(""),[r,s]=(0,c.useState)(!0),t=(0,c.useRef)(""),u=(0,c.useCallback)(async(a=!1)=>{try{let b=new URLSearchParams({limit:"500"});!a&&t.current&&b.set("since",t.current);let c=await fetch(`/api/hub/server-logs?${b.toString()}`),d=await c.json();if(!c.ok||!d.ok)return void k(d.error||`HTTP ${c.status}`);k(null);let e=d.logs||[];if(0===e.length)return;t.current=e[0].ts,a?i(e):i(a=>{let b=new Set(a.map(a=>a.ts+a.line));return[...e.filter(a=>!b.has(a.ts+a.line)),...a].slice(0,1e3)})}catch(a){k(a instanceof Error?a.message:"fetch failed")}},[]);(0,c.useEffect)(()=>{u(!0)},[u]),(0,c.useEffect)(()=>{if(!r||l)return;let a=setInterval(()=>u(!1),2e3);return()=>clearInterval(a)},[r,l,u]);let v=h.filter(a=>("all"===n||a.level===n)&&(!p||!!a.line.toLowerCase().includes(p.toLowerCase()))),w={log:0,info:0,warn:0,error:0};for(let a of h)w[a.level]++;return(0,b.jsxs)("div",{className:"p-6 max-w-[1600px] mx-auto",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-4 gap-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white",children:"Server Logs"}),(0,b.jsx)("span",{className:"text-xs text-gray-500 hidden sm:inline",children:"CommHub stdout/stderr"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 text-xs shrink-0",children:[(0,b.jsx)("button",{onClick:()=>m(a=>!a),className:`flex items-center gap-1.5 px-3 py-1 rounded border ${l?"bg-amber-500/10 text-amber-300 border-amber-500/30":"bg-cyan-500/10 text-cyan-300 border-cyan-500/30"}`,children:l?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:(0,b.jsx)("path",{d:"M8 5v14l11-7z"})}),"Resume"]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":!0,children:[(0,b.jsx)("rect",{x:"6",y:"5",width:"4",height:"14",rx:"0.5"}),(0,b.jsx)("rect",{x:"14",y:"5",width:"4",height:"14",rx:"0.5"})]}),"Pause"]})}),(0,b.jsxs)("label",{className:"flex items-center gap-1 text-gray-400 select-none",children:[(0,b.jsx)("input",{type:"checkbox",checked:r,onChange:a=>s(a.target.checked),className:"accent-cyan-500"}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"auto-refresh"})]}),(0,b.jsxs)("button",{onClick:()=>u(!0),className:"flex items-center gap-1.5 px-3 py-1 rounded border bg-gray-500/10 text-gray-300 border-gray-500/20 hover:bg-gray-500/20",children:[(0,b.jsxs)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:[(0,b.jsx)("path",{d:"M3 12a9 9 0 0 1 15.5-6.4L21 8"}),(0,b.jsx)("path",{d:"M21 3v5h-5"}),(0,b.jsx)("path",{d:"M21 12a9 9 0 0 1-15.5 6.4L3 16"}),(0,b.jsx)("path",{d:"M3 21v-5h5"})]}),(0,b.jsx)("span",{className:"hidden sm:inline",children:"Reload"})]})]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3 mb-3",children:[(0,b.jsx)("div",{className:"flex items-center gap-1 text-xs flex-wrap",children:["all","log","info","warn","error"].map(a=>{let c="all"===a?h.length:w[a],d=n===a,e="all"!==a&&0===c&&!d;return(0,b.jsxs)("button",{onClick:()=>o(a),disabled:e,className:`px-2.5 py-1 rounded border flex items-center gap-1 disabled:opacity-30 disabled:cursor-not-allowed ${d?"bg-cyan-500/15 text-cyan-200 border-cyan-500/40":"bg-[#11111c] text-gray-400 border-[#2a2a4a] hover:bg-[#1a1a2a]"}`,children:[(0,b.jsx)("span",{children:a}),(0,b.jsx)("span",{className:`text-[10px] tabular-nums ${d?"opacity-80":"text-gray-600"}`,children:c})]},a)})}),(0,b.jsx)("input",{value:p,onChange:a=>q(a.target.value),placeholder:"搜索关键字 (alias / task_id / error message)",className:"flex-1 min-w-[140px] basis-full sm:basis-0 px-3 py-1.5 text-xs bg-[#11111c] border border-[#2a2a4a] rounded text-gray-200 focus:outline-none focus:border-cyan-500/40"}),(0,b.jsxs)("span",{className:"text-[10px] text-gray-600",children:[v.length," / ",h.length]})]}),j&&(a=/401|unauthor|forbidden|403|admin/i.test(j),(0,b.jsxs)("div",{className:"anet-error-chip mb-3 p-3 rounded border border-red-500/30 bg-red-500/10 text-red-300 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.jsx)("div",{className:"flex-1",children:a?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"font-medium",children:"需要 admin 角色才能查看服务器日志"}),(0,b.jsx)("div",{className:"text-xs opacity-80 mt-0.5",title:j,children:"服务器日志包含运行时 stdout/stderr,仅 admin 角色可读。"}),(0,b.jsx)(d.default,{href:"/login",className:"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80",children:"切到 admin 账号 →"})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"font-medium",children:"服务器日志暂时无法加载"}),(0,b.jsx)("div",{className:"text-xs opacity-80 mt-0.5",title:j,children:"请检查 CommHub 是否在线,或稍后重试。"}),(0,b.jsx)("button",{onClick:()=>window.location.reload(),className:"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80",children:"重新加载 →"})]})})]})),(0,b.jsx)("div",{className:"rounded border border-[#1a1a2a] bg-[#050510] font-mono text-[11px] leading-relaxed overflow-hidden",children:0===v.length?(0,b.jsx)("div",{className:"p-8 text-center text-gray-600",children:j?"加载失败":0===h.length?"加载中...":"没有匹配的日志"}):(0,b.jsx)("div",{className:"divide-y divide-[#0d0d18] max-h-[calc(100vh-260px)] overflow-y-auto",children:v.map((a,c)=>(0,b.jsxs)("div",{className:"relative pl-3 pr-3 py-1 hover:bg-[#0a0a14] flex gap-3",children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute left-0 top-0 bottom-0 w-0.5",style:{backgroundColor:g[a.level]}}),(0,b.jsx)("span",{className:"text-gray-600 shrink-0 w-[60px] sm:w-[100px] text-[9px] sm:text-[10px] tabular-nums",children:function(a){try{let b=new Date(a);return b.toTimeString().slice(0,8)+"."+String(b.getMilliseconds()).padStart(3,"0")}catch{return a}}(a.ts)}),(0,b.jsx)("span",{className:`hidden sm:inline shrink-0 px-1.5 rounded border text-[9px] uppercase ${f[a.level]}`,children:a.level}),(0,b.jsx)("span",{className:`break-all whitespace-pre-wrap ${e[a.level]}`,children:function(a,c){if(!c)return a;let d=a.toLowerCase().indexOf(c.toLowerCase());return d<0?a:(0,b.jsxs)(b.Fragment,{children:[a.slice(0,d),(0,b.jsx)("mark",{className:"bg-yellow-500/30 text-yellow-100 rounded-sm px-0.5",children:a.slice(d,d+c.length)}),a.slice(d+c.length)]})}(a.line.replace(/^\[\d{2}:\d{2}:\d{2}\]\s*/,""),p)})]},`${a.ts}-${c}`))})})]})}])}];
2
2
 
3
3
  //# sourceMappingURL=agent-network-dashboard_app_server-logs_page_tsx_0dg.l_8._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../agent-network-dashboard/app/server-logs/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport Link from 'next/link';\n\ninterface LogLine {\n ts: string;\n level: 'log' | 'info' | 'warn' | 'error';\n line: string;\n}\n\nconst LEVEL_COLOR: Record<LogLine['level'], string> = {\n log: 'text-gray-300',\n info: 'text-cyan-300',\n warn: 'text-amber-400',\n error: 'text-red-400',\n};\n\nconst LEVEL_BADGE: Record<LogLine['level'], string> = {\n log: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n info: 'bg-cyan-500/10 text-cyan-300 border-cyan-500/30',\n warn: 'bg-amber-500/10 text-amber-300 border-amber-500/30',\n error: 'bg-red-500/10 text-red-300 border-red-500/30',\n};\n\n/** Left-rail strip color per log level — gives the eye a vertical guide\n * when scanning long log walls. Plain hex so Tailwind purge can't drop it. */\nconst LEVEL_STRIPE: Record<LogLine['level'], string> = {\n log: 'transparent',\n info: '#22d3ee',\n warn: '#f59e0b',\n error: '#ef4444',\n};\n\n/** Highlight search-matched substring inside a log line. Case-insensitive\n * first-match wrap; mark inherits color so log-level coloring stays. */\nfunction highlightSearch(line: string, q: string) {\n if (!q) return line;\n const idx = line.toLowerCase().indexOf(q.toLowerCase());\n if (idx < 0) return line;\n return (\n <>\n {line.slice(0, idx)}\n <mark className=\"bg-yellow-500/30 text-yellow-100 rounded-sm px-0.5\">{line.slice(idx, idx + q.length)}</mark>\n {line.slice(idx + q.length)}\n </>\n );\n}\n\nfunction shortTime(iso: string) {\n try {\n const d = new Date(iso);\n return d.toTimeString().slice(0, 8) + '.' + String(d.getMilliseconds()).padStart(3, '0');\n } catch {\n return iso;\n }\n}\n\nexport default function ServerLogsPage() {\n const [logs, setLogs] = useState<LogLine[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [paused, setPaused] = useState(false);\n const [filterLevel, setFilterLevel] = useState<'all' | LogLine['level']>('all');\n const [search, setSearch] = useState('');\n const [autoRefresh, setAutoRefresh] = useState(true);\n const lastTsRef = useRef<string>('');\n\n const fetchLogs = useCallback(async (initial = false) => {\n try {\n const params = new URLSearchParams({ limit: '500' });\n if (!initial && lastTsRef.current) params.set('since', lastTsRef.current);\n const res = await fetch(`/api/hub/server-logs?${params.toString()}`);\n const data = await res.json();\n if (!res.ok || !data.ok) {\n setError(data.error || `HTTP ${res.status}`);\n return;\n }\n setError(null);\n const newLogs: LogLine[] = data.logs || [];\n if (newLogs.length === 0) return;\n // server returns newest-first; track most recent ts for incremental fetches\n lastTsRef.current = newLogs[0].ts;\n if (initial) {\n setLogs(newLogs);\n } else {\n // merge: prepend new entries (which are newer than lastTs)\n setLogs(prev => {\n // de-dup by ts+line\n const seen = new Set(prev.map(l => l.ts + l.line));\n const fresh = newLogs.filter(l => !seen.has(l.ts + l.line));\n return [...fresh, ...prev].slice(0, 1000);\n });\n }\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n }\n }, []);\n\n useEffect(() => {\n fetchLogs(true);\n }, [fetchLogs]);\n\n useEffect(() => {\n if (!autoRefresh || paused) return;\n const interval = setInterval(() => fetchLogs(false), 2000);\n return () => clearInterval(interval);\n }, [autoRefresh, paused, fetchLogs]);\n\n const filtered = logs.filter(l => {\n if (filterLevel !== 'all' && l.level !== filterLevel) return false;\n if (search && !l.line.toLowerCase().includes(search.toLowerCase())) return false;\n return true;\n });\n\n const counts = { log: 0, info: 0, warn: 0, error: 0 };\n for (const l of logs) counts[l.level]++;\n\n return (\n <div className=\"p-6 max-w-[1600px] mx-auto\">\n <div className=\"flex items-center justify-between mb-4 gap-3\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <h1 className=\"text-2xl font-bold text-white\">Server Logs</h1>\n {/* Round 86: dropped the {logs.length} header chip — r84 added\n `all <count>` to the filter strip just below, so this duplicated\n the value within 40px of itself. */}\n <span className=\"text-xs text-gray-500 hidden sm:inline\">CommHub stdout/stderr</span>\n </div>\n <div className=\"flex items-center gap-2 text-xs shrink-0\">\n <button\n onClick={() => setPaused(p => !p)}\n className={`flex items-center gap-1.5 px-3 py-1 rounded border ${paused ? 'bg-amber-500/10 text-amber-300 border-amber-500/30' : 'bg-cyan-500/10 text-cyan-300 border-cyan-500/30'}`}\n >\n {paused ? (\n <>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden><path d=\"M8 5v14l11-7z\" /></svg>\n Resume\n </>\n ) : (\n <>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"0.5\" />\n <rect x=\"14\" y=\"5\" width=\"4\" height=\"14\" rx=\"0.5\" />\n </svg>\n Pause\n </>\n )}\n </button>\n <label className=\"flex items-center gap-1 text-gray-400 select-none\">\n <input type=\"checkbox\" checked={autoRefresh} onChange={e => setAutoRefresh(e.target.checked)} className=\"accent-cyan-500\" />\n <span className=\"hidden sm:inline\">auto-refresh</span>\n </label>\n <button onClick={() => fetchLogs(true)} className=\"flex items-center gap-1.5 px-3 py-1 rounded border bg-gray-500/10 text-gray-300 border-gray-500/20 hover:bg-gray-500/20\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M3 12a9 9 0 0 1 15.5-6.4L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-15.5 6.4L3 16\" />\n <path d=\"M3 21v-5h5\" />\n </svg>\n <span className=\"hidden sm:inline\">Reload</span>\n </button>\n </div>\n </div>\n\n {/* Round 95: flex-wrap + min-w-0 on the search wrapper so the\n search input drops below the chip strip on mobile instead of\n overflowing past the viewport. Desktop layout (single row)\n unchanged because the row has room. */}\n <div className=\"flex flex-wrap items-center gap-3 mb-3\">\n <div className=\"flex items-center gap-1 text-xs flex-wrap\">\n {/* Round 84: every chip shows its count (matches Tasks r56 +\n Audit Log r43); zero-count non-active chips are disabled\n + muted so the eye lands on the levels that actually have\n entries. */}\n {(['all', 'log', 'info', 'warn', 'error'] as const).map(lv => {\n const count = lv === 'all' ? logs.length : counts[lv as LogLine['level']];\n const isActive = filterLevel === lv;\n const isEmpty = lv !== 'all' && count === 0 && !isActive;\n return (\n <button\n key={lv}\n onClick={() => setFilterLevel(lv)}\n disabled={isEmpty}\n className={`px-2.5 py-1 rounded border flex items-center gap-1 disabled:opacity-30 disabled:cursor-not-allowed ${\n isActive\n ? 'bg-cyan-500/15 text-cyan-200 border-cyan-500/40'\n : 'bg-[#11111c] text-gray-400 border-[#2a2a4a] hover:bg-[#1a1a2a]'\n }`}\n >\n <span>{lv}</span>\n <span className={`text-[10px] tabular-nums ${isActive ? 'opacity-80' : 'text-gray-600'}`}>{count}</span>\n </button>\n );\n })}\n </div>\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"搜索关键字 (alias / task_id / error message)\"\n className=\"flex-1 min-w-[140px] basis-full sm:basis-0 px-3 py-1.5 text-xs bg-[#11111c] border border-[#2a2a4a] rounded text-gray-200 focus:outline-none focus:border-cyan-500/40\"\n />\n <span className=\"text-[10px] text-gray-600\">\n {filtered.length} / {logs.length}\n </span>\n </div>\n\n {error && (() => {\n // Translate server error to user-friendly copy + actionable recovery.\n // Raw error stays in title tooltip for debugging.\n const isAuth = /401|unauthor|forbidden|403|admin/i.test(error);\n return (\n <div className=\"anet-error-chip mb-3 p-3 rounded border border-red-500/30 bg-red-500/10 text-red-300 text-sm flex items-start gap-3\" role=\"alert\">\n <span aria-hidden className=\"text-base leading-none\">⛔</span>\n <div className=\"flex-1\">\n {isAuth ? (\n <>\n <div className=\"font-medium\">需要 admin 角色才能查看服务器日志</div>\n <div className=\"text-xs opacity-80 mt-0.5\" title={error}>\n 服务器日志包含运行时 stdout/stderr,仅 admin 角色可读。\n </div>\n <Link href=\"/login\" className=\"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80\">\n 切到 admin 账号 →\n </Link>\n </>\n ) : (\n <>\n <div className=\"font-medium\">服务器日志暂时无法加载</div>\n <div className=\"text-xs opacity-80 mt-0.5\" title={error}>请检查 CommHub 是否在线,或稍后重试。</div>\n <button onClick={() => window.location.reload()} className=\"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80\">\n 重新加载 →\n </button>\n </>\n )}\n </div>\n </div>\n );\n })()}\n\n <div className=\"rounded border border-[#1a1a2a] bg-[#050510] font-mono text-[11px] leading-relaxed overflow-hidden\">\n {filtered.length === 0 ? (\n <div className=\"p-8 text-center text-gray-600\">\n {error ? '加载失败' : logs.length === 0 ? '加载中...' : '没有匹配的日志'}\n </div>\n ) : (\n <div className=\"divide-y divide-[#0d0d18] max-h-[calc(100vh-260px)] overflow-y-auto\">\n {filtered.map((l, i) => (\n <div key={`${l.ts}-${i}`} className=\"relative pl-3 pr-3 py-1 hover:bg-[#0a0a14] flex gap-3\">\n {/* Round 32: 2px left rail keyed to level. Makes warn/error\n spike visible in a wall of `log` lines without users having\n to read the level chip on every row. */}\n <span\n aria-hidden\n className=\"absolute left-0 top-0 bottom-0 w-0.5\"\n style={{ backgroundColor: LEVEL_STRIPE[l.level] }}\n />\n <span className=\"text-gray-600 shrink-0 w-[100px] text-[10px] tabular-nums\">{shortTime(l.ts)}</span>\n <span className={`shrink-0 px-1.5 rounded border text-[9px] uppercase ${LEVEL_BADGE[l.level]}`}>\n {l.level}\n </span>\n {/* Round 85: CommHub stamps each log line with a `[HH:MM:SS]`\n prefix, but the row already shows shortTime(l.ts) in its\n own 100px column on the left. Strip the duplicate\n prefix at display time so the message starts directly\n with the alias / agent / action. */}\n <span className={`break-all whitespace-pre-wrap ${LEVEL_COLOR[l.level]}`}>\n {highlightSearch(l.line.replace(/^\\[\\d{2}:\\d{2}:\\d{2}\\]\\s*/, ''), search)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["LEVEL_COLOR","log","info","warn","error","LEVEL_BADGE","LEVEL_STRIPE","highlightSearch","line","q","idx","toLowerCase","indexOf","slice","className","length","shortTime","iso","d","Date","toTimeString","String","getMilliseconds","padStart","ServerLogsPage","logs","setLogs","setError","paused","setPaused","filterLevel","setFilterLevel","search","setSearch","autoRefresh","setAutoRefresh","lastTsRef","fetchLogs","initial","params","URLSearchParams","limit","current","set","res","fetch","toString","data","json","ok","status","newLogs","ts","prev","seen","Set","map","l","fresh","filter","has","e","Error","message","interval","setInterval","clearInterval","filtered","level","includes","counts","onClick","p","width","height","viewBox","fill","x","y","rx","type","checked","onChange","target","stroke","strokeWidth","strokeLinecap","strokeLinejoin","lv","count","isActive","isEmpty","disabled","value","placeholder","isAuth","test","role","title","href","window","location","reload","i","style","backgroundColor","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../agent-network-dashboard/app/server-logs/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport Link from 'next/link';\n\ninterface LogLine {\n ts: string;\n level: 'log' | 'info' | 'warn' | 'error';\n line: string;\n}\n\nconst LEVEL_COLOR: Record<LogLine['level'], string> = {\n log: 'text-gray-300',\n info: 'text-cyan-300',\n warn: 'text-amber-400',\n error: 'text-red-400',\n};\n\nconst LEVEL_BADGE: Record<LogLine['level'], string> = {\n log: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n info: 'bg-cyan-500/10 text-cyan-300 border-cyan-500/30',\n warn: 'bg-amber-500/10 text-amber-300 border-amber-500/30',\n error: 'bg-red-500/10 text-red-300 border-red-500/30',\n};\n\n/** Left-rail strip color per log level — gives the eye a vertical guide\n * when scanning long log walls. Plain hex so Tailwind purge can't drop it. */\nconst LEVEL_STRIPE: Record<LogLine['level'], string> = {\n log: 'transparent',\n info: '#22d3ee',\n warn: '#f59e0b',\n error: '#ef4444',\n};\n\n/** Highlight search-matched substring inside a log line. Case-insensitive\n * first-match wrap; mark inherits color so log-level coloring stays. */\nfunction highlightSearch(line: string, q: string) {\n if (!q) return line;\n const idx = line.toLowerCase().indexOf(q.toLowerCase());\n if (idx < 0) return line;\n return (\n <>\n {line.slice(0, idx)}\n <mark className=\"bg-yellow-500/30 text-yellow-100 rounded-sm px-0.5\">{line.slice(idx, idx + q.length)}</mark>\n {line.slice(idx + q.length)}\n </>\n );\n}\n\nfunction shortTime(iso: string) {\n try {\n const d = new Date(iso);\n return d.toTimeString().slice(0, 8) + '.' + String(d.getMilliseconds()).padStart(3, '0');\n } catch {\n return iso;\n }\n}\n\nexport default function ServerLogsPage() {\n const [logs, setLogs] = useState<LogLine[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [paused, setPaused] = useState(false);\n const [filterLevel, setFilterLevel] = useState<'all' | LogLine['level']>('all');\n const [search, setSearch] = useState('');\n const [autoRefresh, setAutoRefresh] = useState(true);\n const lastTsRef = useRef<string>('');\n\n const fetchLogs = useCallback(async (initial = false) => {\n try {\n const params = new URLSearchParams({ limit: '500' });\n if (!initial && lastTsRef.current) params.set('since', lastTsRef.current);\n const res = await fetch(`/api/hub/server-logs?${params.toString()}`);\n const data = await res.json();\n if (!res.ok || !data.ok) {\n setError(data.error || `HTTP ${res.status}`);\n return;\n }\n setError(null);\n const newLogs: LogLine[] = data.logs || [];\n if (newLogs.length === 0) return;\n // server returns newest-first; track most recent ts for incremental fetches\n lastTsRef.current = newLogs[0].ts;\n if (initial) {\n setLogs(newLogs);\n } else {\n // merge: prepend new entries (which are newer than lastTs)\n setLogs(prev => {\n // de-dup by ts+line\n const seen = new Set(prev.map(l => l.ts + l.line));\n const fresh = newLogs.filter(l => !seen.has(l.ts + l.line));\n return [...fresh, ...prev].slice(0, 1000);\n });\n }\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n }\n }, []);\n\n useEffect(() => {\n fetchLogs(true);\n }, [fetchLogs]);\n\n useEffect(() => {\n if (!autoRefresh || paused) return;\n const interval = setInterval(() => fetchLogs(false), 2000);\n return () => clearInterval(interval);\n }, [autoRefresh, paused, fetchLogs]);\n\n const filtered = logs.filter(l => {\n if (filterLevel !== 'all' && l.level !== filterLevel) return false;\n if (search && !l.line.toLowerCase().includes(search.toLowerCase())) return false;\n return true;\n });\n\n const counts = { log: 0, info: 0, warn: 0, error: 0 };\n for (const l of logs) counts[l.level]++;\n\n return (\n <div className=\"p-6 max-w-[1600px] mx-auto\">\n <div className=\"flex items-center justify-between mb-4 gap-3\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <h1 className=\"text-2xl font-bold text-white\">Server Logs</h1>\n {/* Round 86: dropped the {logs.length} header chip — r84 added\n `all <count>` to the filter strip just below, so this duplicated\n the value within 40px of itself. */}\n <span className=\"text-xs text-gray-500 hidden sm:inline\">CommHub stdout/stderr</span>\n </div>\n <div className=\"flex items-center gap-2 text-xs shrink-0\">\n <button\n onClick={() => setPaused(p => !p)}\n className={`flex items-center gap-1.5 px-3 py-1 rounded border ${paused ? 'bg-amber-500/10 text-amber-300 border-amber-500/30' : 'bg-cyan-500/10 text-cyan-300 border-cyan-500/30'}`}\n >\n {paused ? (\n <>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden><path d=\"M8 5v14l11-7z\" /></svg>\n Resume\n </>\n ) : (\n <>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"0.5\" />\n <rect x=\"14\" y=\"5\" width=\"4\" height=\"14\" rx=\"0.5\" />\n </svg>\n Pause\n </>\n )}\n </button>\n <label className=\"flex items-center gap-1 text-gray-400 select-none\">\n <input type=\"checkbox\" checked={autoRefresh} onChange={e => setAutoRefresh(e.target.checked)} className=\"accent-cyan-500\" />\n <span className=\"hidden sm:inline\">auto-refresh</span>\n </label>\n <button onClick={() => fetchLogs(true)} className=\"flex items-center gap-1.5 px-3 py-1 rounded border bg-gray-500/10 text-gray-300 border-gray-500/20 hover:bg-gray-500/20\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M3 12a9 9 0 0 1 15.5-6.4L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-15.5 6.4L3 16\" />\n <path d=\"M3 21v-5h5\" />\n </svg>\n <span className=\"hidden sm:inline\">Reload</span>\n </button>\n </div>\n </div>\n\n {/* Round 95: flex-wrap + min-w-0 on the search wrapper so the\n search input drops below the chip strip on mobile instead of\n overflowing past the viewport. Desktop layout (single row)\n unchanged because the row has room. */}\n <div className=\"flex flex-wrap items-center gap-3 mb-3\">\n <div className=\"flex items-center gap-1 text-xs flex-wrap\">\n {/* Round 84: every chip shows its count (matches Tasks r56 +\n Audit Log r43); zero-count non-active chips are disabled\n + muted so the eye lands on the levels that actually have\n entries. */}\n {(['all', 'log', 'info', 'warn', 'error'] as const).map(lv => {\n const count = lv === 'all' ? logs.length : counts[lv as LogLine['level']];\n const isActive = filterLevel === lv;\n const isEmpty = lv !== 'all' && count === 0 && !isActive;\n return (\n <button\n key={lv}\n onClick={() => setFilterLevel(lv)}\n disabled={isEmpty}\n className={`px-2.5 py-1 rounded border flex items-center gap-1 disabled:opacity-30 disabled:cursor-not-allowed ${\n isActive\n ? 'bg-cyan-500/15 text-cyan-200 border-cyan-500/40'\n : 'bg-[#11111c] text-gray-400 border-[#2a2a4a] hover:bg-[#1a1a2a]'\n }`}\n >\n <span>{lv}</span>\n <span className={`text-[10px] tabular-nums ${isActive ? 'opacity-80' : 'text-gray-600'}`}>{count}</span>\n </button>\n );\n })}\n </div>\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"搜索关键字 (alias / task_id / error message)\"\n className=\"flex-1 min-w-[140px] basis-full sm:basis-0 px-3 py-1.5 text-xs bg-[#11111c] border border-[#2a2a4a] rounded text-gray-200 focus:outline-none focus:border-cyan-500/40\"\n />\n <span className=\"text-[10px] text-gray-600\">\n {filtered.length} / {logs.length}\n </span>\n </div>\n\n {error && (() => {\n // Translate server error to user-friendly copy + actionable recovery.\n // Raw error stays in title tooltip for debugging.\n const isAuth = /401|unauthor|forbidden|403|admin/i.test(error);\n return (\n <div className=\"anet-error-chip mb-3 p-3 rounded border border-red-500/30 bg-red-500/10 text-red-300 text-sm flex items-start gap-3\" role=\"alert\">\n <span aria-hidden className=\"text-base leading-none\">⛔</span>\n <div className=\"flex-1\">\n {isAuth ? (\n <>\n <div className=\"font-medium\">需要 admin 角色才能查看服务器日志</div>\n <div className=\"text-xs opacity-80 mt-0.5\" title={error}>\n 服务器日志包含运行时 stdout/stderr,仅 admin 角色可读。\n </div>\n <Link href=\"/login\" className=\"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80\">\n 切到 admin 账号 →\n </Link>\n </>\n ) : (\n <>\n <div className=\"font-medium\">服务器日志暂时无法加载</div>\n <div className=\"text-xs opacity-80 mt-0.5\" title={error}>请检查 CommHub 是否在线,或稍后重试。</div>\n <button onClick={() => window.location.reload()} className=\"inline-block mt-2 text-xs font-medium underline underline-offset-4 hover:opacity-80\">\n 重新加载 →\n </button>\n </>\n )}\n </div>\n </div>\n );\n })()}\n\n <div className=\"rounded border border-[#1a1a2a] bg-[#050510] font-mono text-[11px] leading-relaxed overflow-hidden\">\n {filtered.length === 0 ? (\n <div className=\"p-8 text-center text-gray-600\">\n {error ? '加载失败' : logs.length === 0 ? '加载中...' : '没有匹配的日志'}\n </div>\n ) : (\n <div className=\"divide-y divide-[#0d0d18] max-h-[calc(100vh-260px)] overflow-y-auto\">\n {filtered.map((l, i) => (\n <div key={`${l.ts}-${i}`} className=\"relative pl-3 pr-3 py-1 hover:bg-[#0a0a14] flex gap-3\">\n {/* Round 32: 2px left rail keyed to level. Makes warn/error\n spike visible in a wall of `log` lines without users having\n to read the level chip on every row. */}\n <span\n aria-hidden\n className=\"absolute left-0 top-0 bottom-0 w-0.5\"\n style={{ backgroundColor: LEVEL_STRIPE[l.level] }}\n />\n {/* R4 of #190 mobile polish: the 100px timestamp column +\n 32px LEVEL badge ate ~45% of a 375px row, squeezing log\n content into a 3-line wrap. Drop the ts column to 60px\n on mobile (HH:MM:SS still fits at 9px), restore 100px\n at sm. The 2px left rail (LEVEL_STRIPE) already\n encodes level visually for warn/error, so the LOG badge\n is redundant on mobile — hide it below sm. */}\n <span className=\"text-gray-600 shrink-0 w-[60px] sm:w-[100px] text-[9px] sm:text-[10px] tabular-nums\">{shortTime(l.ts)}</span>\n <span className={`hidden sm:inline shrink-0 px-1.5 rounded border text-[9px] uppercase ${LEVEL_BADGE[l.level]}`}>\n {l.level}\n </span>\n {/* Round 85: CommHub stamps each log line with a `[HH:MM:SS]`\n prefix, but the row already shows shortTime(l.ts) in its\n own 100px column on the left. Strip the duplicate\n prefix at display time so the message starts directly\n with the alias / agent / action. */}\n <span className={`break-all whitespace-pre-wrap ${LEVEL_COLOR[l.level]}`}>\n {highlightSearch(l.line.replace(/^\\[\\d{2}:\\d{2}:\\d{2}\\]\\s*/, ''), search)}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["LEVEL_COLOR","log","info","warn","error","LEVEL_BADGE","LEVEL_STRIPE","highlightSearch","line","q","idx","toLowerCase","indexOf","slice","className","length","shortTime","iso","d","Date","toTimeString","String","getMilliseconds","padStart","ServerLogsPage","logs","setLogs","setError","paused","setPaused","filterLevel","setFilterLevel","search","setSearch","autoRefresh","setAutoRefresh","lastTsRef","fetchLogs","initial","params","URLSearchParams","limit","current","set","res","fetch","toString","data","json","ok","status","newLogs","ts","prev","seen","Set","map","l","fresh","filter","has","e","Error","message","interval","setInterval","clearInterval","filtered","level","includes","counts","onClick","p","width","height","viewBox","fill","x","y","rx","type","checked","onChange","target","stroke","strokeWidth","strokeLinecap","strokeLinejoin","lv","count","isActive","isEmpty","disabled","value","placeholder","isAuth","test","role","title","href","window","location","reload","i","style","backgroundColor","replace"],"mappings":"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"}
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/cssa52keEzN4TEvVJY7V3/_buildManifest.js",
11
- "static/cssa52keEzN4TEvVJY7V3/_ssgManifest.js",
12
- "static/cssa52keEzN4TEvVJY7V3/_clientMiddlewareManifest.js"
10
+ "static/e-lUTefNl8edrYCV4yWtG/_buildManifest.js",
11
+ "static/e-lUTefNl8edrYCV4yWtG/_ssgManifest.js",
12
+ "static/e-lUTefNl8edrYCV4yWtG/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/05oi25hh7b81r.js",