@sleep2agi/agent-network-dashboard 0.5.7-preview.34 → 0.5.7-preview.35

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 (150) 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 +5 -5
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  20. package/.next/server/app/admin.html +1 -1
  21. package/.next/server/app/admin.rsc +1 -1
  22. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  28. package/.next/server/app/index.html +2 -2
  29. package/.next/server/app/index.rsc +2 -2
  30. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  32. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  35. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/login.html +2 -2
  37. package/.next/server/app/login.rsc +2 -2
  38. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  44. package/.next/server/app/logs.html +1 -1
  45. package/.next/server/app/logs.rsc +1 -1
  46. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  47. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  52. package/.next/server/app/messages.html +1 -1
  53. package/.next/server/app/messages.rsc +1 -1
  54. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  55. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  60. package/.next/server/app/node.html +1 -1
  61. package/.next/server/app/node.rsc +1 -1
  62. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  63. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  68. package/.next/server/app/nodes.html +1 -1
  69. package/.next/server/app/nodes.rsc +1 -1
  70. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  71. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  76. package/.next/server/app/page_client-reference-manifest.js +1 -1
  77. package/.next/server/app/server-logs.html +1 -1
  78. package/.next/server/app/server-logs.rsc +1 -1
  79. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  85. package/.next/server/app/servers.html +1 -1
  86. package/.next/server/app/servers.rsc +1 -1
  87. package/.next/server/app/servers.segments/_full.segment.rsc +1 -1
  88. package/.next/server/app/servers.segments/_head.segment.rsc +1 -1
  89. package/.next/server/app/servers.segments/_index.segment.rsc +1 -1
  90. package/.next/server/app/servers.segments/_tree.segment.rsc +1 -1
  91. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  92. package/.next/server/app/servers.segments/servers.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.html +1 -1
  94. package/.next/server/app/settings/networks.rsc +1 -1
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens.html +1 -1
  104. package/.next/server/app/settings/tokens.rsc +1 -1
  105. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  106. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  107. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  109. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  110. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  112. package/.next/server/app/settings.html +2 -2
  113. package/.next/server/app/settings.rsc +2 -2
  114. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  115. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  116. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  118. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  120. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  121. package/.next/server/app/tasks.html +2 -2
  122. package/.next/server/app/tasks.rsc +2 -2
  123. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  124. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  125. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  126. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  129. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  130. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  131. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  132. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  134. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map +1 -1
  137. package/.next/server/middleware-build-manifest.js +3 -3
  138. package/.next/server/pages/404.html +1 -1
  139. package/.next/server/pages/500.html +1 -1
  140. package/.next/static/chunks/{0.054rbp43q.y.js → 00d~isei247an.js} +1 -1
  141. package/.next/static/chunks/{056rsfg~r8v.4.js → 0z2qudg4wos6v.js} +1 -1
  142. package/.next/static/chunks/{0qvd1v169sclt.js → 11k8skl9913kl.js} +1 -1
  143. package/.next/static/chunks/{01gwxcz0s4ic_.js → 18bs3mf8ufkgv.js} +1 -1
  144. package/.next/trace +2 -2
  145. package/.next/trace-build +1 -1
  146. package/app/tasks/page.tsx +23 -5
  147. package/package.json +1 -1
  148. /package/.next/static/{gQUBslHrnEi2wSMEuinXH → VQuWjJDHv069cw03Mna-s}/_buildManifest.js +0 -0
  149. /package/.next/static/{gQUBslHrnEi2wSMEuinXH → VQuWjJDHv069cw03Mna-s}/_clientMiddlewareManifest.js +0 -0
  150. /package/.next/static/{gQUBslHrnEi2wSMEuinXH → VQuWjJDHv069cw03Mna-s}/_ssgManifest.js +0 -0
@@ -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.34\",\"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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwidmVyc2lvblwiOlwiMC41LjctcHJldmlldy4zNFwiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwiYXBwOmFuZHJvaWQ6aW5pdFwiOlwibnB4IGNhcCBhZGQgYW5kcm9pZFwiLFwiYXBwOmFuZHJvaWQ6c3luY1wiOlwibnB4IGNhcCBzeW5jIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOm9wZW5cIjpcIm5weCBjYXAgb3BlbiBhbmRyb2lkXCIsXCJhcHA6aW9zOmluaXRcIjpcIm5weCBjYXAgYWRkIGlvc1wiLFwiYXBwOmlvczpzeW5jXCI6XCJucHggY2FwIHN5bmMgaW9zXCIsXCJhcHA6aW9zOm9wZW5cIjpcIm5weCBjYXAgb3BlbiBpb3NcIixcImFwcDpkZXNrdG9wXCI6XCJlbGVjdHJvbiBhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcImFwcDpkZXNrdG9wOnBhY2tcIjpcImVsZWN0cm9uLWJ1aWxkZXIgLS1jb25maWcgZWxlY3Ryb24tYnVpbGRlci5qc29uXCIsXCJwcmVwdWJsaXNoT25seVwiOlwiWyAtZiAubmV4dC9CVUlMRF9JRCBdIHx8IChlY2hvICdwcmVwdWJsaXNoT25seTogLm5leHQvQlVJTERfSUQgbWlzc2luZyDigJQgcnVuIG5wbSBydW4gYnVpbGQgZmlyc3QgKHNlZSBjb21taXQgMDVjMWViZiBib2R5IGZvciBSMjI0IGNodW5rLTUwMCByb290IGNhdXNlKScgPiYyICYmIGV4aXQgMSlcIn0sXCJiaW5cIjp7XCJhZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiOlwiLi9iaW4vc3RhcnQuanNcIn0sXCJob21lcGFnZVwiOlwiaHR0cHM6Ly9hbmV0LnNoXCIsXCJyZXBvc2l0b3J5XCI6e1widHlwZVwiOlwiZ2l0XCIsXCJ1cmxcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGVlcDJhZ2kvYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIn0sXCJidWdzXCI6e1widXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkL2lzc3Vlc1wifSxcImF1dGhvclwiOlwic2xlZXAyYWdpXCIsXCJsaWNlbnNlXCI6XCJBcGFjaGUtMi4wXCIsXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMi4zXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlc2xpbnRcIjpcIl45XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMi4zXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** 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-base sm: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-base sm: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 justify-center min-w-[44px] 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.35\",\"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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwidmVyc2lvblwiOlwiMC41LjctcHJldmlldy4zNVwiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwiYXBwOmFuZHJvaWQ6aW5pdFwiOlwibnB4IGNhcCBhZGQgYW5kcm9pZFwiLFwiYXBwOmFuZHJvaWQ6c3luY1wiOlwibnB4IGNhcCBzeW5jIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOm9wZW5cIjpcIm5weCBjYXAgb3BlbiBhbmRyb2lkXCIsXCJhcHA6aW9zOmluaXRcIjpcIm5weCBjYXAgYWRkIGlvc1wiLFwiYXBwOmlvczpzeW5jXCI6XCJucHggY2FwIHN5bmMgaW9zXCIsXCJhcHA6aW9zOm9wZW5cIjpcIm5weCBjYXAgb3BlbiBpb3NcIixcImFwcDpkZXNrdG9wXCI6XCJlbGVjdHJvbiBhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcImFwcDpkZXNrdG9wOnBhY2tcIjpcImVsZWN0cm9uLWJ1aWxkZXIgLS1jb25maWcgZWxlY3Ryb24tYnVpbGRlci5qc29uXCIsXCJwcmVwdWJsaXNoT25seVwiOlwiWyAtZiAubmV4dC9CVUlMRF9JRCBdIHx8IChlY2hvICdwcmVwdWJsaXNoT25seTogLm5leHQvQlVJTERfSUQgbWlzc2luZyDigJQgcnVuIG5wbSBydW4gYnVpbGQgZmlyc3QgKHNlZSBjb21taXQgMDVjMWViZiBib2R5IGZvciBSMjI0IGNodW5rLTUwMCByb290IGNhdXNlKScgPiYyICYmIGV4aXQgMSlcIn0sXCJiaW5cIjp7XCJhZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiOlwiLi9iaW4vc3RhcnQuanNcIn0sXCJob21lcGFnZVwiOlwiaHR0cHM6Ly9hbmV0LnNoXCIsXCJyZXBvc2l0b3J5XCI6e1widHlwZVwiOlwiZ2l0XCIsXCJ1cmxcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9zbGVlcDJhZ2kvYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIn0sXCJidWdzXCI6e1widXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkL2lzc3Vlc1wifSxcImF1dGhvclwiOlwic2xlZXAyYWdpXCIsXCJsaWNlbnNlXCI6XCJBcGFjaGUtMi4wXCIsXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMi4zXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlc2xpbnRcIjpcIl45XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMi4zXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** 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-base sm: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-base sm: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 justify-center min-w-[44px] 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=[60764,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(99309),e=a.i(59202),f=a.i(92088),g=a.i(8893);let h={created:"text-gray-400",delivered:"text-blue-400",running:"text-green-400",replied:"text-purple-400",failed:"text-red-400",closed:"text-gray-500"};function i({taskId:a,onClose:d}){let[e,j]=(0,c.useState)(null),[k,l]=(0,c.useState)([]),[m,n]=(0,c.useState)(!0);(0,c.useEffect)(()=>{(async()=>{try{let[b,c]=await Promise.all([fetch(`/api/hub/tasks?task_id=${encodeURIComponent(a)}`),fetch(`/api/hub/task-events?task_id=${encodeURIComponent(a)}&limit=50`)]),d=await b.json(),e=await c.json();d.tasks?.[0]&&j(d.tasks[0]),l(e.events||[])}catch{}finally{n(!1)}})()},[a]);let o=e?[{key:"created",label:"Created",time:e.created_at,color:"bg-gray-400"},{key:"delivered",label:"Delivered",time:e.delivered_at,color:"bg-blue-400"},{key:"started",label:"Started",time:e.started_at,color:"bg-green-400"},{key:"completed",label:"Completed",time:e.completed_at,color:"bg-purple-400"}].map(a=>({...a,done:!!a.time})):[],p=o.findIndex(a=>!a.done),q=e&&"completed"!==e.status&&"failed"!==e.status&&"expired"!==e.status&&"cancelled"!==e.status,r=e?.started_at&&e?.completed_at?Math.round((new Date(e.completed_at).getTime()-new Date(e.started_at).getTime())/1e3):null;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/30 z-40 anet-fade-in",onClick:d}),(0,b.jsxs)("div",{className:"fixed top-0 right-0 h-[100dvh] w-full lg:w-[500px] bg-[#0a0a1a] border-l border-[#2a2a4a] z-50 flex flex-col shadow-2xl shadow-black/60 overflow-y-auto animate-slide-in",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-5 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a] sticky top-0",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-semibold text-white",children:"Task Detail"}),(0,b.jsxs)("div",{className:"text-[10px] text-gray-500 mt-0.5",children:[a.slice(0,16),"..."]})]}),(0,b.jsx)("button",{onClick:d,"aria-label":"Close task drawer",className:"inline-flex min-h-[44px] min-w-[44px] items-center justify-center text-gray-500 hover:text-white rounded-lg hover:bg-[#1a1a2a]",children:(0,b.jsx)("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),m?(0,b.jsx)("div",{className:"flex justify-center py-16",children:(0,b.jsx)("div",{className:"w-6 h-6 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin"})}):e?(0,b.jsxs)("div",{className:"px-5 py-5 space-y-5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("span",{className:`text-lg font-bold ${h[e.status]||"text-gray-400"}`,children:e.status}),"normal"!==e.priority&&(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded border ${"high"===e.priority?"text-red-300 border-red-500/20":"text-gray-400 border-gray-600/20"}`,children:e.priority}),null!==r&&(0,b.jsxs)("span",{className:"text-xs text-gray-500",children:["⏱ ",r<60?`${r}s`:`${Math.floor(r/60)}m ${r%60}s`]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 text-sm flex-wrap",children:[e.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:e.from_name,size:18}),(0,b.jsx)("span",{className:"text-gray-200 font-medium",children:e.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600",children:"→"}),e.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:e.to_name,size:18}),(0,b.jsx)("span",{className:"text-gray-200 font-medium",children:e.to_name||"--"})]}),(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 uppercase tracking-wide",children:"Timeline"}),null!==r&&(0,b.jsxs)("div",{className:"text-[10px] text-gray-600",children:[r<60?`${r}s`:`${Math.floor(r/60)}m ${r%60}s`," runtime"]})]}),(0,b.jsx)("div",{className:"space-y-3",children:o.map((a,c)=>{let d=q&&c===p,e=!!o[c+1]?.done;return(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col items-center pt-0.5",children:[(0,b.jsx)("span",{className:`relative w-3 h-3 rounded-full shrink-0 ${a.done?a.color:"bg-gray-700"}`,children:d&&(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute -inset-1 rounded-full border border-current opacity-60 anet-current-step-pulse",style:{borderColor:"currentColor"}})}),c<o.length-1&&(0,b.jsx)("div",{className:`w-0.5 h-5 mt-1 ${a.done&&e?"bg-gray-500":a.done?"bg-gradient-to-b from-gray-500 to-gray-800":"bg-gray-800"}`})]}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:`text-xs font-medium flex items-center gap-2 ${a.done?"text-gray-200":d?"text-cyan-300":"text-gray-600"}`,children:[(0,b.jsx)("span",{children:a.label}),d&&(0,b.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-cyan-400",children:"in progress"})]}),(0,b.jsx)("div",{className:"text-[10px] text-gray-500",title:a.time||void 0,children:a.time?(0,f.timeAgo)(a.time):d?"—":"Pending"})]})]},a.key)})})]}),(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 uppercase mb-2",children:"Input"}),(0,b.jsx)("div",{className:"text-sm text-gray-300 whitespace-pre-wrap",children:e.content||"--"})]}),e.result&&(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 uppercase mb-2",children:"Output"}),(0,b.jsx)("div",{className:"text-sm text-gray-300 whitespace-pre-wrap max-h-64 overflow-y-auto",children:e.result})]}),k.length>0&&(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-500 uppercase mb-2",children:["Events (",k.length,")"]}),(0,b.jsx)("div",{className:"space-y-1.5 max-h-40 overflow-y-auto",children:k.map(a=>(0,b.jsxs)("div",{className:"flex items-center gap-2 text-[11px]",children:[(0,b.jsx)("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${"running"===a.to_status?"bg-green-400":"replied"===a.to_status?"bg-purple-400":"failed"===a.to_status?"bg-red-400":"bg-blue-400"}`}),(0,b.jsx)("span",{className:"text-gray-400",children:a.event_type}),a.from_status&&(0,b.jsxs)("span",{className:"text-gray-600",children:[a.from_status,"→",a.to_status]}),(0,b.jsx)("span",{className:"text-gray-600 ml-auto",children:(0,f.timeAgo)(a.created_at)})]},a.id))})]}),(0,b.jsxs)("div",{className:"text-[10px] text-gray-600 space-y-1",children:[(0,b.jsxs)("div",{children:["Task ID: ",e.task_id]}),e.expires_at&&(0,b.jsxs)("div",{children:["Expires: ",e.expires_at]})]})]}):(0,b.jsx)("div",{className:"text-center py-16 text-gray-500",children:"Task not found"})]})]})}var j=a.i(19595),k=a.i(49597);function l(a){let b=k.STATUS_CHIP_CLASS[a]||"bg-gray-500/10 text-gray-400 border-gray-500/20";return`text-xs px-2 py-0.5 rounded-md border ${b}`}function m(a){return"high"===a?"text-red-400":"low"===a?"text-gray-600":"text-gray-400"}function n(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}function o(){let a,h,o,p,q=(0,d.useSearchParams)(),{networkId:r}=(0,e.useNetworkId)(),[s,t]=(0,c.useState)([]),[u,v]=(0,c.useState)(0),[w,x]=(0,c.useState)(!0),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(new Set),[C,D]=(0,c.useState)(q.get("status")||""),[E,F]=(0,c.useState)(""),[G,H]=(0,c.useState)(""),[I,J]=(0,c.useState)(null),K=a=>{B(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},L=(0,c.useCallback)(async()=>{try{let a=new URLSearchParams;r&&a.set("network_id",r),C&&a.set("status",C),E&&a.set("from_name",E),G&&a.set("to_name",G),a.set("limit","100");let b=await fetch(`/api/hub/tasks?${a.toString()}`);if(401===b.status)return void window.location.assign("/login");let c=await b.json();t(c.tasks||[]),v(c.count??(c.tasks?.length||0)),z("")}catch(a){z(a instanceof Error?a.message:"fetch failed")}finally{x(!1)}},[C,E,G,r]);return(0,c.useEffect)(()=>{x(!0),L();let a=setInterval(L,5e3);return()=>clearInterval(a)},[L]),(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-6",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white lg:ml-0 ml-10",children:"Tasks"}),(0,b.jsx)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30 tabular-nums",title:s.length<u?`Showing ${s.length} of ${u} tasks`:void 0,children:s.length<u?`${s.length} / ${u}`:u})]}),s.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"anet-tabstrip-wrap mb-4",children:(0,b.jsx)("div",{className:"anet-tabstrip flex sm:flex-wrap gap-1 bg-[#111128] rounded-lg border border-[#2a2a4a] p-1 overflow-x-auto sm:overflow-x-visible scrollbar-thin",children:(a={},s.forEach(b=>{a[b.status]=(a[b.status]||0)+1}),["",...k.TASK_STATUSES].map(c=>{let d=""===c?s.length:a[c]||0,e=C===c;return(0,b.jsxs)("button",{onClick:()=>D(c),disabled:0===d&&""!==c&&!e,className:`px-3 py-1.5 rounded-md text-xs transition-colors flex items-center gap-1.5 shrink-0 whitespace-nowrap disabled:opacity-30 disabled:cursor-not-allowed ${e?`${k.STATUS_CHIP_CLASS[c]||"bg-cyan-500/10 text-cyan-300 border-cyan-500/20"} border`:"text-gray-500 hover:text-gray-300 hover:bg-[#1a1a2a]/40"}`,children:[c&&(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:k.STATUS_DOT_HEX[c]||"#6b7280"}}),(0,b.jsx)("span",{children:c||"All"}),(0,b.jsx)("span",{className:`text-[10px] tabular-nums ${e?"opacity-80":"text-gray-600"}`,children:d})]},c)}))})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2 mb-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"From"}),(0,b.jsx)("input",{type:"text",value:E,onChange:a=>F(a.target.value),placeholder:"any node",className:"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"To"}),(0,b.jsx)("input",{type:"text",value:G,onChange:a=>H(a.target.value),placeholder:"any node",className:"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none"})]}),(C||E||G)&&(0,b.jsx)("button",{type:"button",onClick:()=>{D(""),F(""),H("")},className:"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:border-gray-600",children:"Clear filters"})]})]}),s.length>0&&!C&&(h={},s.forEach(a=>{h[a.status]=(h[a.status]||0)+1}),o=s.length||1,(p=k.TASK_STATUSES.map(a=>({key:a,color:k.STATUS_BAR_CLASS[a]})).filter(a=>h[a.key])).length?(0,b.jsx)("div",{className:"mb-6",children:(0,b.jsx)("div",{className:"flex h-2 rounded-full overflow-hidden bg-gray-800",children:p.map(a=>(0,b.jsx)("div",{className:a.color,style:{width:`${h[a.key]/o*100}%`},title:`${a.key}: ${h[a.key]}`},a.key))})}):null),y&&(0,b.jsx)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-4 py-2 rounded-lg mb-6 text-sm",children:y}),w?(0,b.jsx)("div",{className:"animate-pulse space-y-3",children:[1,2,3,4,5].map(a=>(0,b.jsx)("div",{className:"h-20 bg-gray-800/20 rounded-lg border border-gray-800/40"},a))}):0===s.length?(0,b.jsx)(j.EmptyState,{variant:"tasks",sub:C||E||G?"No tasks match the current filters. Try clearing them.":"Tasks will appear here when agents send them via CommHub."}):(0,b.jsxs)("div",{className:"space-y-1 sm:space-y-2",children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase",children:[(0,b.jsx)("div",{className:"col-span-1",children:"Status"}),(0,b.jsx)("div",{className:"col-span-2",children:"From"}),(0,b.jsx)("div",{className:"col-span-2",children:"To"}),(0,b.jsx)("div",{className:"col-span-4",children:"Content"}),(0,b.jsx)("div",{className:"col-span-1",children:"Priority"}),(0,b.jsx)("div",{className:"col-span-2",children:"Time"})]}),s.map(a=>{let c=A.has(a.task_id);return(0,b.jsxs)("div",{className:`anet-task-row group bg-[#111128] border rounded-lg px-3 py-2 sm:px-4 sm:py-3 transition-all duration-200 cursor-pointer ${c?"border-[#3a3a5a] shadow-lg shadow-black/20":"border-[#2a2a4a] hover:border-[#3a3a5a] hover:bg-[#15152e]"}`,onClick:()=>K(a.task_id),role:"button",tabIndex:0,"aria-expanded":c,onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),K(a.task_id))},children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-12 gap-2 items-center",children:[(0,b.jsx)("div",{className:"col-span-1",children:(0,b.jsx)("span",{className:l(a.status),children:a.status})}),(0,b.jsxs)("div",{className:"col-span-2 flex items-center gap-1.5 min-w-0",title:a.from_name,children:[a.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.from_name,size:18}),(0,b.jsx)("span",{className:"truncate text-sm text-gray-200",children:a.from_name||"--"})]}),(0,b.jsxs)("div",{className:"col-span-2 flex items-center gap-1.5 min-w-0",title:a.to_name,children:[a.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.to_name,size:18}),(0,b.jsx)("span",{className:"truncate text-sm text-gray-200",children:a.to_name||"--"})]}),(0,b.jsx)("div",{className:"col-span-4 text-xs text-gray-400 truncate",title:a.content,children:(0,f.previewContent)(a.content)}),(0,b.jsx)("div",{className:"col-span-1",children:(0,b.jsx)("span",{className:`text-xs ${m(a.priority)}`,children:a.priority||"normal"})}),(0,b.jsxs)("div",{className:"col-span-2 text-xs text-gray-500 flex items-center justify-between gap-2",title:a.created_at,children:[(0,b.jsx)("span",{className:"truncate",children:n(a.created_at)}),(0,b.jsx)("svg",{"aria-hidden":!0,className:`shrink-0 text-gray-600 group-hover:text-gray-400 transition-transform duration-200 ${c?"rotate-180":""}`,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 9l6 6 6-6"})})]})]}),(0,b.jsxs)("div",{className:"sm:hidden space-y-1",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:l(a.status),children:a.status}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:`text-xs ${m(a.priority)}`,children:a.priority||"normal"}),(0,b.jsx)("svg",{"aria-hidden":!0,className:`text-gray-600 transition-transform duration-200 ${c?"rotate-180":""}`,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 9l6 6 6-6"})})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-xs text-gray-300 min-w-0",children:[a.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.from_name,size:16}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600",children:"→"}),a.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.to_name,size:16}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.to_name||"--"}),(0,b.jsx)("span",{className:"ml-auto shrink-0 text-[10px] text-gray-600",children:n(a.created_at)})]}),(0,b.jsx)("div",{className:"text-xs text-gray-400 line-clamp-1",title:a.content,children:(0,f.previewContent)(a.content)})]}),(0,b.jsx)("div",{className:`grid transition-all duration-300 ease-out ${c?"grid-rows-[1fr] opacity-100 mt-3":"grid-rows-[0fr] opacity-0"}`,"aria-hidden":!c,children:(0,b.jsx)("div",{className:"overflow-hidden",children:(0,b.jsxs)("div",{className:"pt-3 border-t border-[#2a2a4a] space-y-3",children:[a.content&&(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-xs text-gray-600 mb-1",children:"Content"}),(0,b.jsx)("div",{className:"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]",children:a.content})]}),a.result&&(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-xs text-gray-600 mb-1",children:"Result"}),(0,b.jsx)("div",{className:"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a] max-h-48 overflow-y-auto",children:a.result})]}),(0,b.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs",children:[["Created",a.created_at],["Delivered",a.delivered_at],["Started",a.started_at],["Completed",a.completed_at]].map(([a,c])=>(0,b.jsxs)("div",{children:[(0,b.jsxs)("span",{className:"text-gray-600",children:[a,": "]}),(0,b.jsx)("span",{className:"text-gray-400",children:c?n(c):"--"})]},a))}),a.expires_at&&(0,b.jsxs)("div",{className:"text-xs",children:[(0,b.jsx)("span",{className:"text-gray-600",children:"Expires: "}),(0,b.jsx)("span",{className:"text-orange-400",children:a.expires_at})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-600 truncate",title:a.task_id,children:["ID: ",a.task_id]}),(0,b.jsxs)("div",{className:"flex gap-2 shrink-0",children:[("failed"===a.status||"expired"===a.status)&&(0,b.jsx)("button",{onClick:async b=>{b.stopPropagation(),await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:a.to_name,task:a.content,priority:a.priority})}),L()},className:"text-xs text-orange-400 hover:text-orange-300 px-2 py-0.5 rounded border border-orange-500/20 hover:bg-orange-500/10",children:"Retry"}),(0,b.jsx)("button",{onClick:b=>{b.stopPropagation(),J(a.task_id)},className:"text-xs text-cyan-400 hover:text-cyan-300",children:"Detail →"})]})]})]})})})]},a.task_id)})]}),I&&(0,b.jsx)(i,{taskId:I,onClose:()=>J(null)})]})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono",children:"Loading tasks..."}),children:(0,b.jsx)(o,{})})}],60764)}];
1
+ module.exports=[60764,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(99309),e=a.i(59202),f=a.i(92088),g=a.i(8893);let h={created:"text-gray-400",delivered:"text-blue-400",running:"text-green-400",replied:"text-purple-400",failed:"text-red-400",closed:"text-gray-500"};function i({taskId:a,onClose:d}){let[e,j]=(0,c.useState)(null),[k,l]=(0,c.useState)([]),[m,n]=(0,c.useState)(!0);(0,c.useEffect)(()=>{(async()=>{try{let[b,c]=await Promise.all([fetch(`/api/hub/tasks?task_id=${encodeURIComponent(a)}`),fetch(`/api/hub/task-events?task_id=${encodeURIComponent(a)}&limit=50`)]),d=await b.json(),e=await c.json();d.tasks?.[0]&&j(d.tasks[0]),l(e.events||[])}catch{}finally{n(!1)}})()},[a]);let o=e?[{key:"created",label:"Created",time:e.created_at,color:"bg-gray-400"},{key:"delivered",label:"Delivered",time:e.delivered_at,color:"bg-blue-400"},{key:"started",label:"Started",time:e.started_at,color:"bg-green-400"},{key:"completed",label:"Completed",time:e.completed_at,color:"bg-purple-400"}].map(a=>({...a,done:!!a.time})):[],p=o.findIndex(a=>!a.done),q=e&&"completed"!==e.status&&"failed"!==e.status&&"expired"!==e.status&&"cancelled"!==e.status,r=e?.started_at&&e?.completed_at?Math.round((new Date(e.completed_at).getTime()-new Date(e.started_at).getTime())/1e3):null;return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/30 z-40 anet-fade-in",onClick:d}),(0,b.jsxs)("div",{className:"fixed top-0 right-0 h-[100dvh] w-full lg:w-[500px] bg-[#0a0a1a] border-l border-[#2a2a4a] z-50 flex flex-col shadow-2xl shadow-black/60 overflow-y-auto animate-slide-in",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between px-5 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a] sticky top-0",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-semibold text-white",children:"Task Detail"}),(0,b.jsxs)("div",{className:"text-[10px] text-gray-500 mt-0.5",children:[a.slice(0,16),"..."]})]}),(0,b.jsx)("button",{onClick:d,"aria-label":"Close task drawer",className:"inline-flex min-h-[44px] min-w-[44px] items-center justify-center text-gray-500 hover:text-white rounded-lg hover:bg-[#1a1a2a]",children:(0,b.jsx)("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})})]}),m?(0,b.jsx)("div",{className:"flex justify-center py-16",children:(0,b.jsx)("div",{className:"w-6 h-6 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin"})}):e?(0,b.jsxs)("div",{className:"px-5 py-5 space-y-5",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("span",{className:`text-lg font-bold ${h[e.status]||"text-gray-400"}`,children:e.status}),"normal"!==e.priority&&(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded border ${"high"===e.priority?"text-red-300 border-red-500/20":"text-gray-400 border-gray-600/20"}`,children:e.priority}),null!==r&&(0,b.jsxs)("span",{className:"text-xs text-gray-500",children:["⏱ ",r<60?`${r}s`:`${Math.floor(r/60)}m ${r%60}s`]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2 text-sm flex-wrap",children:[e.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:e.from_name,size:18}),(0,b.jsx)("span",{className:"text-gray-200 font-medium",children:e.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600",children:"→"}),e.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:e.to_name,size:18}),(0,b.jsx)("span",{className:"text-gray-200 font-medium",children:e.to_name||"--"})]}),(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between mb-3",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 uppercase tracking-wide",children:"Timeline"}),null!==r&&(0,b.jsxs)("div",{className:"text-[10px] text-gray-600",children:[r<60?`${r}s`:`${Math.floor(r/60)}m ${r%60}s`," runtime"]})]}),(0,b.jsx)("div",{className:"space-y-3",children:o.map((a,c)=>{let d=q&&c===p,e=!!o[c+1]?.done;return(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsxs)("div",{className:"flex flex-col items-center pt-0.5",children:[(0,b.jsx)("span",{className:`relative w-3 h-3 rounded-full shrink-0 ${a.done?a.color:"bg-gray-700"}`,children:d&&(0,b.jsx)("span",{"aria-hidden":!0,className:"absolute -inset-1 rounded-full border border-current opacity-60 anet-current-step-pulse",style:{borderColor:"currentColor"}})}),c<o.length-1&&(0,b.jsx)("div",{className:`w-0.5 h-5 mt-1 ${a.done&&e?"bg-gray-500":a.done?"bg-gradient-to-b from-gray-500 to-gray-800":"bg-gray-800"}`})]}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:`text-xs font-medium flex items-center gap-2 ${a.done?"text-gray-200":d?"text-cyan-300":"text-gray-600"}`,children:[(0,b.jsx)("span",{children:a.label}),d&&(0,b.jsx)("span",{className:"text-[9px] uppercase tracking-wide text-cyan-400",children:"in progress"})]}),(0,b.jsx)("div",{className:"text-[10px] text-gray-500",title:a.time||void 0,children:a.time?(0,f.timeAgo)(a.time):d?"—":"Pending"})]})]},a.key)})})]}),(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 uppercase mb-2",children:"Input"}),(0,b.jsx)("div",{className:"text-sm text-gray-300 whitespace-pre-wrap",children:e.content||"--"})]}),e.result&&(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsx)("div",{className:"text-xs text-gray-500 uppercase mb-2",children:"Output"}),(0,b.jsx)("div",{className:"text-sm text-gray-300 whitespace-pre-wrap max-h-64 overflow-y-auto",children:e.result})]}),k.length>0&&(0,b.jsxs)("div",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-500 uppercase mb-2",children:["Events (",k.length,")"]}),(0,b.jsx)("div",{className:"space-y-1.5 max-h-40 overflow-y-auto",children:k.map(a=>(0,b.jsxs)("div",{className:"flex items-center gap-2 text-[11px]",children:[(0,b.jsx)("span",{className:`w-1.5 h-1.5 rounded-full shrink-0 ${"running"===a.to_status?"bg-green-400":"replied"===a.to_status?"bg-purple-400":"failed"===a.to_status?"bg-red-400":"bg-blue-400"}`}),(0,b.jsx)("span",{className:"text-gray-400",children:a.event_type}),a.from_status&&(0,b.jsxs)("span",{className:"text-gray-600",children:[a.from_status,"→",a.to_status]}),(0,b.jsx)("span",{className:"text-gray-600 ml-auto",children:(0,f.timeAgo)(a.created_at)})]},a.id))})]}),(0,b.jsxs)("div",{className:"text-[10px] text-gray-600 space-y-1",children:[(0,b.jsxs)("div",{children:["Task ID: ",e.task_id]}),e.expires_at&&(0,b.jsxs)("div",{children:["Expires: ",e.expires_at]})]})]}):(0,b.jsx)("div",{className:"text-center py-16 text-gray-500",children:"Task not found"})]})]})}var j=a.i(19595),k=a.i(49597);function l(a){let b=k.STATUS_CHIP_CLASS[a]||"bg-gray-500/10 text-gray-400 border-gray-500/20";return`text-xs px-2 py-0.5 rounded-md border ${b}`}function m(a){return"high"===a?"text-red-400":"low"===a?"text-gray-600":"text-gray-400"}function n(a){if(!a)return"--";let b=Math.floor((Date.now()-new Date(a.replace(" ","T")+"Z").getTime())/1e3);return b<60?`${b}s ago`:b<3600?`${Math.floor(b/60)}m ago`:b<86400?`${Math.floor(b/3600)}h ago`:`${Math.floor(b/86400)}d ago`}function o(){let a,h,o,p,q=(0,d.useSearchParams)(),{networkId:r}=(0,e.useNetworkId)(),[s,t]=(0,c.useState)([]),[u,v]=(0,c.useState)(0),[w,x]=(0,c.useState)(!0),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(new Set),[C,D]=(0,c.useState)(q.get("status")||""),[E,F]=(0,c.useState)(""),[G,H]=(0,c.useState)(""),[I,J]=(0,c.useState)(null),K=a=>{B(b=>{let c=new Set(b);return c.has(a)?c.delete(a):c.add(a),c})},L=(0,c.useCallback)(async()=>{try{let a=new URLSearchParams;r&&a.set("network_id",r),C&&a.set("status",C),E&&a.set("from_name",E),G&&a.set("to_name",G),a.set("limit","100");let b=await fetch(`/api/hub/tasks?${a.toString()}`);if(401===b.status)return void window.location.assign("/login");let c=await b.json();t(c.tasks||[]),v(c.count??(c.tasks?.length||0)),z("")}catch(a){z(a instanceof Error?a.message:"fetch failed")}finally{x(!1)}},[C,E,G,r]);return(0,c.useEffect)(()=>{x(!0),L();let a=setInterval(L,5e3);return()=>clearInterval(a)},[L]),(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsxs)("div",{className:"flex items-center gap-4 mb-4 sm:mb-6",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white lg:ml-0 ml-10",children:"Tasks"}),(0,b.jsx)("span",{className:"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30 tabular-nums",title:s.length<u?`Showing ${s.length} of ${u} tasks`:void 0,children:s.length<u?`${s.length} / ${u}`:u})]}),s.length>0&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("div",{className:"anet-tabstrip-wrap mb-4",children:(0,b.jsx)("div",{className:"anet-tabstrip flex sm:flex-wrap gap-1 bg-[#111128] rounded-lg border border-[#2a2a4a] p-1 overflow-x-auto sm:overflow-x-visible scrollbar-thin",children:(a={},s.forEach(b=>{a[b.status]=(a[b.status]||0)+1}),["",...k.TASK_STATUSES].map(c=>{let d=""===c?s.length:a[c]||0,e=C===c;return(0,b.jsxs)("button",{onClick:()=>D(c),disabled:0===d&&""!==c&&!e,className:`px-3 py-1.5 rounded-md text-xs transition-colors flex items-center gap-1.5 shrink-0 whitespace-nowrap disabled:opacity-30 disabled:cursor-not-allowed ${e?`${k.STATUS_CHIP_CLASS[c]||"bg-cyan-500/10 text-cyan-300 border-cyan-500/20"} border`:"text-gray-500 hover:text-gray-300 hover:bg-[#1a1a2a]/40"}`,children:[c&&(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{backgroundColor:k.STATUS_DOT_HEX[c]||"#6b7280"}}),(0,b.jsx)("span",{children:c||"All"}),(0,b.jsx)("span",{className:`text-[10px] tabular-nums ${e?"opacity-80":"text-gray-600"}`,children:d})]},c)}))})}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2 mb-4 sm:mb-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"From"}),(0,b.jsx)("input",{type:"text",value:E,onChange:a=>F(a.target.value),placeholder:"any node",className:"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"To"}),(0,b.jsx)("input",{type:"text",value:G,onChange:a=>H(a.target.value),placeholder:"any node",className:"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none"})]}),(C||E||G)&&(0,b.jsx)("button",{type:"button",onClick:()=>{D(""),F(""),H("")},className:"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:border-gray-600",children:"Clear filters"})]})]}),s.length>0&&!C&&(h={},s.forEach(a=>{h[a.status]=(h[a.status]||0)+1}),o=s.length||1,(p=k.TASK_STATUSES.map(a=>({key:a,color:k.STATUS_BAR_CLASS[a]})).filter(a=>h[a.key])).length?(0,b.jsx)("div",{className:"mb-6",children:(0,b.jsx)("div",{className:"flex h-2 rounded-full overflow-hidden bg-gray-800",children:p.map(a=>(0,b.jsx)("div",{className:a.color,style:{width:`${h[a.key]/o*100}%`},title:`${a.key}: ${h[a.key]}`},a.key))})}):null),y&&(0,b.jsx)("div",{className:"bg-red-900/20 border border-red-800/40 text-red-300 px-4 py-2 rounded-lg mb-6 text-sm",children:y}),w?(0,b.jsx)("div",{className:"animate-pulse space-y-3",children:[1,2,3,4,5].map(a=>(0,b.jsx)("div",{className:"h-20 bg-gray-800/20 rounded-lg border border-gray-800/40"},a))}):0===s.length?(0,b.jsx)(j.EmptyState,{variant:"tasks",sub:C||E||G?"No tasks match the current filters. Try clearing them.":"Tasks will appear here when agents send them via CommHub."}):(0,b.jsxs)("div",{className:"space-y-1 sm:space-y-2",children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase",children:[(0,b.jsx)("div",{className:"col-span-1",children:"Status"}),(0,b.jsx)("div",{className:"col-span-2",children:"From"}),(0,b.jsx)("div",{className:"col-span-2",children:"To"}),(0,b.jsx)("div",{className:"col-span-4",children:"Content"}),(0,b.jsx)("div",{className:"col-span-1",children:"Priority"}),(0,b.jsx)("div",{className:"col-span-2",children:"Time"})]}),s.map(a=>{let c=A.has(a.task_id);return(0,b.jsxs)("div",{className:`anet-task-row group bg-[#111128] border rounded-lg px-3 py-2 sm:px-4 sm:py-3 transition-all duration-200 cursor-pointer ${c?"border-[#3a3a5a] shadow-lg shadow-black/20":"border-[#2a2a4a] hover:border-[#3a3a5a] hover:bg-[#15152e]"}`,onClick:()=>K(a.task_id),role:"button",tabIndex:0,"aria-expanded":c,onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),K(a.task_id))},children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-12 gap-2 items-center",children:[(0,b.jsx)("div",{className:"col-span-1",children:(0,b.jsx)("span",{className:l(a.status),children:a.status})}),(0,b.jsxs)("div",{className:"col-span-2 flex items-center gap-1.5 min-w-0",title:a.from_name,children:[a.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.from_name,size:18}),(0,b.jsx)("span",{className:"truncate text-sm text-gray-200",children:a.from_name||"--"})]}),(0,b.jsxs)("div",{className:"col-span-2 flex items-center gap-1.5 min-w-0",title:a.to_name,children:[a.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.to_name,size:18}),(0,b.jsx)("span",{className:"truncate text-sm text-gray-200",children:a.to_name||"--"})]}),(0,b.jsx)("div",{className:"col-span-4 text-xs text-gray-400 truncate",title:a.content,children:(0,f.previewContent)(a.content)}),(0,b.jsx)("div",{className:"col-span-1",children:(0,b.jsx)("span",{className:`text-xs ${m(a.priority)}`,children:a.priority||"normal"})}),(0,b.jsxs)("div",{className:"col-span-2 text-xs text-gray-500 flex items-center justify-between gap-2",title:a.created_at,children:[(0,b.jsx)("span",{className:"truncate",children:n(a.created_at)}),(0,b.jsx)("svg",{"aria-hidden":!0,className:`shrink-0 text-gray-600 group-hover:text-gray-400 transition-transform duration-200 ${c?"rotate-180":""}`,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 9l6 6 6-6"})})]})]}),(0,b.jsxs)("div",{className:"sm:hidden space-y-1",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("span",{className:l(a.status),children:a.status}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:`text-xs ${m(a.priority)}`,children:a.priority||"normal"}),(0,b.jsx)("svg",{"aria-hidden":!0,className:`text-gray-600 transition-transform duration-200 ${c?"rotate-180":""}`,width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 9l6 6 6-6"})})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 text-xs text-gray-300 min-w-0",children:[a.from_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.from_name,size:16}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.from_name||"--"}),(0,b.jsx)("span",{className:"text-gray-600",children:"→"}),a.to_name&&(0,b.jsx)(g.AliasAvatar,{alias:a.to_name,size:16}),(0,b.jsx)("span",{className:"truncate max-w-[35%]",children:a.to_name||"--"}),(0,b.jsx)("span",{className:"ml-auto shrink-0 text-[10px] text-gray-600",children:n(a.created_at)})]}),(0,b.jsx)("div",{className:"text-xs text-gray-400 line-clamp-1",title:a.content,children:(0,f.previewContent)(a.content)})]}),(0,b.jsx)("div",{className:`grid transition-all duration-300 ease-out ${c?"grid-rows-[1fr] opacity-100 mt-3":"grid-rows-[0fr] opacity-0"}`,"aria-hidden":!c,children:(0,b.jsx)("div",{className:"overflow-hidden",children:(0,b.jsxs)("div",{className:"pt-3 border-t border-[#2a2a4a] space-y-3",children:[a.content&&(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-xs text-gray-600 mb-1",children:"Content"}),(0,b.jsx)("div",{className:"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]",children:a.content})]}),a.result&&(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-xs text-gray-600 mb-1",children:"Result"}),(0,b.jsx)("div",{className:"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a] max-h-48 overflow-y-auto",children:a.result})]}),(0,b.jsx)("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs",children:[["Created",a.created_at],["Delivered",a.delivered_at],["Started",a.started_at],["Completed",a.completed_at]].map(([a,c])=>(0,b.jsxs)("div",{children:[(0,b.jsxs)("span",{className:"text-gray-600",children:[a,": "]}),(0,b.jsx)("span",{className:"text-gray-400",children:c?n(c):"--"})]},a))}),a.expires_at&&(0,b.jsxs)("div",{className:"text-xs",children:[(0,b.jsx)("span",{className:"text-gray-600",children:"Expires: "}),(0,b.jsx)("span",{className:"text-orange-400",children:a.expires_at})]}),(0,b.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,b.jsxs)("div",{className:"text-xs text-gray-600 truncate",title:a.task_id,children:["ID: ",a.task_id]}),(0,b.jsxs)("div",{className:"flex gap-2 shrink-0",children:[("failed"===a.status||"expired"===a.status)&&(0,b.jsx)("button",{onClick:async b=>{b.stopPropagation(),await fetch("/api/hub/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({alias:a.to_name,task:a.content,priority:a.priority})}),L()},className:"text-xs text-orange-400 hover:text-orange-300 px-2 py-0.5 rounded border border-orange-500/20 hover:bg-orange-500/10",children:"Retry"}),(0,b.jsx)("button",{onClick:b=>{b.stopPropagation(),J(a.task_id)},className:"text-xs text-cyan-400 hover:text-cyan-300",children:"Detail →"})]})]})]})})})]},a.task_id)})]}),I&&(0,b.jsx)(i,{taskId:I,onClose:()=>J(null)})]})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:(0,b.jsx)("div",{className:"lg:ml-0 ml-10 text-gray-500 text-sm",children:"Loading tasks…"})}),children:(0,b.jsx)(o,{})})}],60764)}];
2
2
 
3
3
  //# sourceMappingURL=agent-network-dashboard_app_tasks_page_tsx_0mwxy4z._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../agent-network-dashboard/app/tasks/page.tsx","../../../../../agent-network-dashboard/app/components/TaskDrawer.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState, useCallback, Suspense } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport Link from 'next/link';\nimport { useNetworkId } from '../lib/network-context';\nimport { TaskDrawer } from '../components/TaskDrawer';\nimport { EmptyState } from '../components/EmptyState';\nimport { AliasAvatar } from '../components/AliasAvatar';\nimport { previewContent } from '../components/utils';\nimport { TASK_STATUSES, STATUS_CHIP_CLASS, STATUS_DOT_HEX, STATUS_BAR_CLASS } from '../lib/status';\n\ninterface Task {\n task_id: string;\n from_name: string;\n to_name: string;\n status: string;\n priority: string;\n content: string;\n result: string;\n created_at: string;\n updated_at: string;\n delivered_at: string;\n started_at: string;\n completed_at: string;\n expires_at: string;\n}\n\nfunction statusBadge(status: string) {\n const color = STATUS_CHIP_CLASS[status] || 'bg-gray-500/10 text-gray-400 border-gray-500/20';\n return `text-xs px-2 py-0.5 rounded-md border ${color}`;\n}\n\nfunction priorityBadge(priority: string) {\n if (priority === 'high') return 'text-red-400';\n if (priority === 'low') return 'text-gray-600';\n return 'text-gray-400';\n}\n\nfunction timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nfunction TasksContent() {\n const searchParams = useSearchParams();\n const { networkId } = useNetworkId();\n const [tasks, setTasks] = useState<Task[]>([]);\n const [count, setCount] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n\n const [filterStatus, setFilterStatus] = useState(searchParams.get('status') || '');\n const [filterFrom, setFilterFrom] = useState('');\n const [filterTo, setFilterTo] = useState('');\n const [drawerTaskId, setDrawerTaskId] = useState<string | null>(null);\n\n const toggleExpand = (taskId: string) => {\n setExpanded(prev => {\n const next = new Set(prev);\n if (next.has(taskId)) next.delete(taskId);\n else next.add(taskId);\n return next;\n });\n };\n\n const fetchTasks = useCallback(async () => {\n try {\n const params = new URLSearchParams();\n if (networkId) params.set('network_id', networkId);\n if (filterStatus) params.set('status', filterStatus);\n if (filterFrom) params.set('from_name', filterFrom);\n if (filterTo) params.set('to_name', filterTo);\n params.set('limit', '100');\n\n const res = await fetch(`/api/hub/tasks?${params.toString()}`);\n if (res.status === 401) {\n window.location.assign('/login');\n return;\n }\n const data = await res.json();\n setTasks(data.tasks || []);\n setCount(data.count ?? (data.tasks?.length || 0));\n setError('');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n } finally {\n setLoading(false);\n }\n }, [filterStatus, filterFrom, filterTo, networkId]);\n\n useEffect(() => {\n setLoading(true);\n fetchTasks();\n const interval = setInterval(fetchTasks, 5000);\n return () => clearInterval(interval);\n }, [fetchTasks]);\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n {/* Header */}\n <div className=\"flex items-center gap-4 mb-6\">\n <h1 className=\"text-2xl font-bold text-white lg:ml-0 ml-10\">Tasks</h1>\n {/* Round 88: pagination-aware chip. When tasks.length < count\n the API has more rows than the current limit=100 slice;\n show `loaded / total` so users notice. Otherwise just the\n single total — matches r87 /logs pattern. */}\n <span\n className=\"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30 tabular-nums\"\n title={tasks.length < count ? `Showing ${tasks.length} of ${count} tasks` : undefined}\n >\n {tasks.length < count ? `${tasks.length} / ${count}` : count}\n </span>\n </div>\n\n {/* Round 75: hide the status tab strip + From/To filter row when\n there are no tasks at all. Each tab would show \"0\" and the\n filter inputs would have nothing to act on — pure noise above\n the empty-state CTA. When at least one task exists, the chrome\n comes back even if the current filter happens to hide\n everything (so users can clear filters). */}\n {tasks.length > 0 && <>\n {/* Status Tabs — color-coded dots per status family so users can\n scan the row at a glance. Active tab gets full chip styling\n (bg + border + text color), inactive tabs only carry the dot\n + neutral label so the active state remains the strong cue.\n On narrow viewports (<sm) the row scrolls horizontally with\n subtle gradient fade-edges (via .anet-tabstrip-wrap pseudo\n elements) hinting more content. */}\n <div className=\"anet-tabstrip-wrap mb-4\">\n <div className=\"anet-tabstrip flex sm:flex-wrap gap-1 bg-[#111128] rounded-lg border border-[#2a2a4a] p-1 overflow-x-auto sm:overflow-x-visible scrollbar-thin\">\n {(() => {\n // Round 56: compute per-status counts so the tab strip doubles as a\n // status distribution dashboard. Matches Audit Log (r43) + Overview\n // agent filter (r34) chip-with-count pattern.\n const counts: Record<string, number> = {};\n tasks.forEach(t => { counts[t.status] = (counts[t.status] || 0) + 1; });\n return ['', ...TASK_STATUSES].map(s => {\n const count = s === '' ? tasks.length : counts[s] || 0;\n const isActive = filterStatus === s;\n return (\n <button\n key={s}\n onClick={() => setFilterStatus(s)}\n disabled={count === 0 && s !== '' && !isActive}\n className={`px-3 py-1.5 rounded-md text-xs transition-colors flex items-center gap-1.5 shrink-0 whitespace-nowrap disabled:opacity-30 disabled:cursor-not-allowed ${\n isActive\n ? `${STATUS_CHIP_CLASS[s] || 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20'} border`\n : 'text-gray-500 hover:text-gray-300 hover:bg-[#1a1a2a]/40'\n }`}\n >\n {s && (\n <span\n aria-hidden\n className=\"inline-block w-1.5 h-1.5 rounded-full shrink-0\"\n style={{ backgroundColor: STATUS_DOT_HEX[s] || '#6b7280' }}\n />\n )}\n <span>{s || 'All'}</span>\n <span className={`text-[10px] tabular-nums ${isActive ? 'opacity-80' : 'text-gray-600'}`}>{count}</span>\n </button>\n );\n });\n })()}\n </div>\n </div>\n\n {/* From/To Filters — same visual block as the status tabs above. */}\n <div className=\"flex flex-wrap items-center gap-2 mb-6\">\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">From</span>\n <input\n type=\"text\"\n value={filterFrom}\n onChange={e => setFilterFrom(e.target.value)}\n placeholder=\"any node\"\n className=\"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">To</span>\n <input\n type=\"text\"\n value={filterTo}\n onChange={e => setFilterTo(e.target.value)}\n placeholder=\"any node\"\n className=\"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n {(filterStatus || filterFrom || filterTo) && (\n <button\n type=\"button\"\n onClick={() => { setFilterStatus(''); setFilterFrom(''); setFilterTo(''); }}\n className=\"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:border-gray-600\"\n >\n Clear filters\n </button>\n )}\n </div>\n </>}\n\n {/* Status distribution */}\n {tasks.length > 0 && !filterStatus && (() => {\n const stats: Record<string, number> = {};\n tasks.forEach(t => { stats[t.status] = (stats[t.status] || 0) + 1; });\n const total = tasks.length || 1;\n // Round 67: derive from shared TASK_STATUSES + STATUS_BAR_CLASS in\n // app/lib/status.ts. Adding a new lifecycle status updates badge,\n // tab dots, and bar in one edit.\n const bars = TASK_STATUSES\n .map(key => ({ key, color: STATUS_BAR_CLASS[key] }))\n .filter(b => stats[b.key]);\n if (!bars.length) return null;\n // Round 63: removed the per-status legend row beneath the bar —\n // it duplicated the counts already shown in the tab chip strip\n // since r56. The proportional bar stays because it adds a visual\n // \"shape of workload\" that the chip numbers don't convey.\n return (\n <div className=\"mb-6\">\n <div className=\"flex h-2 rounded-full overflow-hidden bg-gray-800\">\n {bars.map(b => <div key={b.key} className={b.color} style={{ width: `${(stats[b.key]/total)*100}%` }} title={`${b.key}: ${stats[b.key]}`} />)}\n </div>\n </div>\n );\n })()}\n\n {error && (\n <div className=\"bg-red-900/20 border border-red-800/40 text-red-300 px-4 py-2 rounded-lg mb-6 text-sm\">{error}</div>\n )}\n\n {loading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-20 bg-gray-800/20 rounded-lg border border-gray-800/40\" />\n ))}\n </div>\n ) : tasks.length === 0 ? (\n <EmptyState\n variant=\"tasks\"\n sub={(filterStatus || filterFrom || filterTo)\n ? 'No tasks match the current filters. Try clearing them.'\n : 'Tasks will appear here when agents send them via CommHub.'}\n />\n ) : (\n <div className=\"space-y-1 sm:space-y-2\">\n {/* Table header */}\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase\">\n <div className=\"col-span-1\">Status</div>\n <div className=\"col-span-2\">From</div>\n <div className=\"col-span-2\">To</div>\n <div className=\"col-span-4\">Content</div>\n <div className=\"col-span-1\">Priority</div>\n <div className=\"col-span-2\">Time</div>\n </div>\n\n {tasks.map(t => {\n const isOpen = expanded.has(t.task_id);\n return (\n <div\n key={t.task_id}\n className={`anet-task-row group bg-[#111128] border rounded-lg px-3 py-2 sm:px-4 sm:py-3 transition-all duration-200 cursor-pointer ${\n isOpen\n ? 'border-[#3a3a5a] shadow-lg shadow-black/20'\n : 'border-[#2a2a4a] hover:border-[#3a3a5a] hover:bg-[#15152e]'\n }`}\n onClick={() => toggleExpand(t.task_id)}\n role=\"button\"\n tabIndex={0}\n aria-expanded={isOpen}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleExpand(t.task_id);\n }\n }}\n >\n {/* Desktop row */}\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 items-center\">\n <div className=\"col-span-1\">\n <span className={statusBadge(t.status)}>{t.status}</span>\n </div>\n <div className=\"col-span-2 flex items-center gap-1.5 min-w-0\" title={t.from_name}>\n {t.from_name && <AliasAvatar alias={t.from_name} size={18} />}\n <span className=\"truncate text-sm text-gray-200\">{t.from_name || '--'}</span>\n </div>\n <div className=\"col-span-2 flex items-center gap-1.5 min-w-0\" title={t.to_name}>\n {t.to_name && <AliasAvatar alias={t.to_name} size={18} />}\n <span className=\"truncate text-sm text-gray-200\">{t.to_name || '--'}</span>\n </div>\n <div className=\"col-span-4 text-xs text-gray-400 truncate\" title={t.content}>\n {previewContent(t.content)}\n </div>\n <div className=\"col-span-1\">\n <span className={`text-xs ${priorityBadge(t.priority)}`}>{t.priority || 'normal'}</span>\n </div>\n <div className=\"col-span-2 text-xs text-gray-500 flex items-center justify-between gap-2\" title={t.created_at}>\n <span className=\"truncate\">{timeAgo(t.created_at)}</span>\n <svg\n aria-hidden\n className={`shrink-0 text-gray-600 group-hover:text-gray-400 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n </div>\n\n {/* Mobile layout — R8 of #190 mobile polish: 4-row stack\n → 3-row by inlining timeAgo onto the same row as the\n from→to alias header (it's already 4 small atoms, has\n room), plus space-y-2 → space-y-1 to trim ~4px per\n row × 200 tasks. */}\n <div className=\"sm:hidden space-y-1\">\n <div className=\"flex items-center justify-between\">\n <span className={statusBadge(t.status)}>{t.status}</span>\n <div className=\"flex items-center gap-2\">\n <span className={`text-xs ${priorityBadge(t.priority)}`}>{t.priority || 'normal'}</span>\n <svg\n aria-hidden\n className={`text-gray-600 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n </div>\n <div className=\"flex items-center gap-1.5 text-xs text-gray-300 min-w-0\">\n {t.from_name && <AliasAvatar alias={t.from_name} size={16} />}\n <span className=\"truncate max-w-[35%]\">{t.from_name || '--'}</span>\n <span className=\"text-gray-600\">&rarr;</span>\n {t.to_name && <AliasAvatar alias={t.to_name} size={16} />}\n <span className=\"truncate max-w-[35%]\">{t.to_name || '--'}</span>\n <span className=\"ml-auto shrink-0 text-[10px] text-gray-600\">{timeAgo(t.created_at)}</span>\n </div>\n <div className=\"text-xs text-gray-400 line-clamp-1\" title={t.content}>{previewContent(t.content)}</div>\n </div>\n\n {/* Expanded detail — always mounted; grid-rows 0fr↔1fr trick gives\n content-aware smooth max-height animation without measuring DOM. */}\n <div\n className={`grid transition-all duration-300 ease-out ${\n isOpen ? 'grid-rows-[1fr] opacity-100 mt-3' : 'grid-rows-[0fr] opacity-0'\n }`}\n aria-hidden={!isOpen}\n >\n <div className=\"overflow-hidden\">\n <div className=\"pt-3 border-t border-[#2a2a4a] space-y-3\">\n {t.content && (\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Content</div>\n <div className=\"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]\">{t.content}</div>\n </div>\n )}\n {t.result && (\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Result</div>\n <div className=\"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a] max-h-48 overflow-y-auto\">{t.result}</div>\n </div>\n )}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs\">\n {[\n ['Created', t.created_at],\n ['Delivered', t.delivered_at],\n ['Started', t.started_at],\n ['Completed', t.completed_at],\n ].map(([label, val]) => (\n <div key={label as string}>\n <span className=\"text-gray-600\">{label}: </span>\n <span className=\"text-gray-400\">{val ? timeAgo(val as string) : '--'}</span>\n </div>\n ))}\n </div>\n {t.expires_at && (\n <div className=\"text-xs\">\n <span className=\"text-gray-600\">Expires: </span>\n <span className=\"text-orange-400\">{t.expires_at}</span>\n </div>\n )}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-gray-600 truncate\" title={t.task_id}>\n ID: {t.task_id}\n </div>\n <div className=\"flex gap-2 shrink-0\">\n {(t.status === 'failed' || t.status === 'expired') && (\n <button\n onClick={async (e) => {\n e.stopPropagation();\n await fetch('/api/hub/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alias: t.to_name, task: t.content, priority: t.priority }),\n });\n fetchTasks();\n }}\n className=\"text-xs text-orange-400 hover:text-orange-300 px-2 py-0.5 rounded border border-orange-500/20 hover:bg-orange-500/10\"\n >\n Retry\n </button>\n )}\n <button\n onClick={e => { e.stopPropagation(); setDrawerTaskId(t.task_id); }}\n className=\"text-xs text-cyan-400 hover:text-cyan-300\"\n >\n Detail &rarr;\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {drawerTaskId && <TaskDrawer taskId={drawerTaskId} onClose={() => setDrawerTaskId(null)} />}\n </div>\n );\n}\n\nexport default function TasksPage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono\">Loading tasks...</div>}>\n <TasksContent />\n </Suspense>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { timeAgo } from './utils';\nimport Link from 'next/link';\nimport { AliasAvatar } from './AliasAvatar';\n\ninterface TaskDetail {\n task_id: string;\n from_name: string;\n to_name: string;\n status: string;\n priority: string;\n content: string;\n result: string;\n created_at: string;\n delivered_at: string;\n started_at: string;\n completed_at: string;\n expires_at: string;\n}\n\ninterface TaskEvent {\n id: number;\n event_type: string;\n from_status: string;\n to_status: string;\n detail: string;\n created_at: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n created: 'text-gray-400', delivered: 'text-blue-400', running: 'text-green-400',\n replied: 'text-purple-400', failed: 'text-red-400', closed: 'text-gray-500',\n};\n\ninterface TaskDrawerProps {\n taskId: string;\n onClose: () => void;\n}\n\nexport function TaskDrawer({ taskId, onClose }: TaskDrawerProps) {\n const [task, setTask] = useState<TaskDetail | null>(null);\n const [events, setEvents] = useState<TaskEvent[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n (async () => {\n try {\n const [taskRes, eventsRes] = await Promise.all([\n fetch(`/api/hub/tasks?task_id=${encodeURIComponent(taskId)}`),\n fetch(`/api/hub/task-events?task_id=${encodeURIComponent(taskId)}&limit=50`),\n ]);\n const taskData = await taskRes.json();\n const eventsData = await eventsRes.json();\n if (taskData.tasks?.[0]) setTask(taskData.tasks[0]);\n setEvents(eventsData.events || []);\n } catch {} finally { setLoading(false); }\n })();\n }, [taskId]);\n\n /** Timeline steps — same 4 hops every task goes through. `time` is set\n * when the hop has happened; missing time means pending. Round 36 adds\n * `key` for the \"current step\" highlight + the `done` flag for layout. */\n const timeline = task ? [\n { key: 'created', label: 'Created', time: task.created_at, color: 'bg-gray-400' },\n { key: 'delivered', label: 'Delivered', time: task.delivered_at, color: 'bg-blue-400' },\n { key: 'started', label: 'Started', time: task.started_at, color: 'bg-green-400' },\n { key: 'completed', label: 'Completed', time: task.completed_at, color: 'bg-purple-400'},\n ].map(s => ({ ...s, done: !!s.time })) : [];\n\n /** Index of the highest-completed step. The step *after* this index is\n * the \"current\" one (in-progress). When all are done, currentIdx = -1. */\n const currentStepIdx = timeline.findIndex(s => !s.done);\n const isActive = task && task.status !== 'completed' && task.status !== 'failed' && task.status !== 'expired' && task.status !== 'cancelled';\n\n const duration = task?.started_at && task?.completed_at\n ? Math.round((new Date(task.completed_at).getTime() - new Date(task.started_at).getTime()) / 1000)\n : null;\n\n return (\n <>\n <div className=\"fixed inset-0 bg-black/30 z-40 anet-fade-in\" onClick={onClose} />\n <div className=\"fixed top-0 right-0 h-[100dvh] w-full lg:w-[500px] bg-[#0a0a1a] border-l border-[#2a2a4a] z-50 flex flex-col shadow-2xl shadow-black/60 overflow-y-auto animate-slide-in\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a] sticky top-0\">\n <div>\n <div className=\"text-sm font-semibold text-white\">Task Detail</div>\n <div className=\"text-[10px] text-gray-500 mt-0.5\">{taskId.slice(0, 16)}...</div>\n </div>\n {/* R16 of #190: same chat-panel close pattern — was ~32 px\n tap target; lift to a uniform 44 x 44 hit zone. */}\n <button onClick={onClose} aria-label=\"Close task drawer\" className=\"inline-flex min-h-[44px] min-w-[44px] items-center justify-center text-gray-500 hover:text-white rounded-lg hover:bg-[#1a1a2a]\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {loading ? (\n <div className=\"flex justify-center py-16\">\n <div className=\"w-6 h-6 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin\" />\n </div>\n ) : !task ? (\n <div className=\"text-center py-16 text-gray-500\">Task not found</div>\n ) : (\n <div className=\"px-5 py-5 space-y-5\">\n {/* Status + Priority */}\n <div className=\"flex items-center gap-3\">\n <span className={`text-lg font-bold ${STATUS_COLORS[task.status] || 'text-gray-400'}`}>{task.status}</span>\n {task.priority !== 'normal' && (\n <span className={`text-xs px-2 py-0.5 rounded border ${task.priority === 'high' ? 'text-red-300 border-red-500/20' : 'text-gray-400 border-gray-600/20'}`}>{task.priority}</span>\n )}\n {duration !== null && (\n <span className=\"text-xs text-gray-500\">⏱ {duration < 60 ? `${duration}s` : `${Math.floor(duration/60)}m ${duration%60}s`}</span>\n )}\n </div>\n\n {/* From → To — round 41: use AliasAvatar so from/to colours\n match the rest of the app instead of the legacy blue/cyan\n hardcode. */}\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\n {task.from_name && <AliasAvatar alias={task.from_name} size={18} />}\n <span className=\"text-gray-200 font-medium\">{task.from_name || '--'}</span>\n <span className=\"text-gray-600\">&rarr;</span>\n {task.to_name && <AliasAvatar alias={task.to_name} size={18} />}\n <span className=\"text-gray-200 font-medium\">{task.to_name || '--'}</span>\n </div>\n\n {/* Timeline — round 36 polish: relative timestamps, current-step\n pulse if task is still in flight, full ISO in title=. */}\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"text-xs text-gray-500 uppercase tracking-wide\">Timeline</div>\n {duration !== null && (\n <div className=\"text-[10px] text-gray-600\">\n {duration < 60 ? `${duration}s` : `${Math.floor(duration/60)}m ${duration%60}s`} runtime\n </div>\n )}\n </div>\n <div className=\"space-y-3\">\n {timeline.map((step, i) => {\n const isCurrent = isActive && i === currentStepIdx;\n const isNextDone = !!timeline[i+1]?.done;\n return (\n <div key={step.key} className=\"flex items-start gap-3\">\n <div className=\"flex flex-col items-center pt-0.5\">\n <span\n className={`relative w-3 h-3 rounded-full shrink-0 ${\n step.done ? step.color : 'bg-gray-700'\n }`}\n >\n {isCurrent && (\n <span\n aria-hidden\n className=\"absolute -inset-1 rounded-full border border-current opacity-60 anet-current-step-pulse\"\n style={{ borderColor: 'currentColor' }}\n />\n )}\n </span>\n {i < timeline.length - 1 && (\n <div className={`w-0.5 h-5 mt-1 ${\n step.done && isNextDone ? 'bg-gray-500' : step.done ? 'bg-gradient-to-b from-gray-500 to-gray-800' : 'bg-gray-800'\n }`} />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className={`text-xs font-medium flex items-center gap-2 ${\n step.done ? 'text-gray-200' : isCurrent ? 'text-cyan-300' : 'text-gray-600'\n }`}>\n <span>{step.label}</span>\n {isCurrent && <span className=\"text-[9px] uppercase tracking-wide text-cyan-400\">in&nbsp;progress</span>}\n </div>\n <div className=\"text-[10px] text-gray-500\" title={step.time || undefined}>\n {step.time ? timeAgo(step.time) : isCurrent ? '—' : 'Pending'}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-xs text-gray-500 uppercase mb-2\">Input</div>\n <div className=\"text-sm text-gray-300 whitespace-pre-wrap\">{task.content || '--'}</div>\n </div>\n\n {/* Result */}\n {task.result && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-xs text-gray-500 uppercase mb-2\">Output</div>\n <div className=\"text-sm text-gray-300 whitespace-pre-wrap max-h-64 overflow-y-auto\">{task.result}</div>\n </div>\n )}\n\n {/* Events */}\n {events.length > 0 && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-xs text-gray-500 uppercase mb-2\">Events ({events.length})</div>\n <div className=\"space-y-1.5 max-h-40 overflow-y-auto\">\n {events.map(e => (\n <div key={e.id} className=\"flex items-center gap-2 text-[11px]\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${\n e.to_status === 'running' ? 'bg-green-400' : e.to_status === 'replied' ? 'bg-purple-400' : e.to_status === 'failed' ? 'bg-red-400' : 'bg-blue-400'\n }`} />\n <span className=\"text-gray-400\">{e.event_type}</span>\n {e.from_status && <span className=\"text-gray-600\">{e.from_status}→{e.to_status}</span>}\n <span className=\"text-gray-600 ml-auto\">{timeAgo(e.created_at)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Metadata */}\n <div className=\"text-[10px] text-gray-600 space-y-1\">\n <div>Task ID: {task.task_id}</div>\n {task.expires_at && <div>Expires: {task.expires_at}</div>}\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n"],"names":["STATUS_COLORS","created","delivered","running","replied","failed","closed","TaskDrawer","taskId","onClose","task","setTask","events","setEvents","loading","setLoading","taskRes","eventsRes","Promise","all","fetch","encodeURIComponent","taskData","json","eventsData","tasks","timeline","key","label","time","created_at","color","delivered_at","started_at","completed_at","map","s","done","currentStepIdx","findIndex","isActive","status","duration","Math","round","Date","getTime","className","onClick","slice","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","d","priority","floor","from_name","alias","size","to_name","step","i","isCurrent","isNextDone","style","borderColor","length","title","undefined","content","result","e","to_status","event_type","from_status","id","task_id","expires_at"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../agent-network-dashboard/app/tasks/page.tsx","../../../../../agent-network-dashboard/app/components/TaskDrawer.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState, useCallback, Suspense } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport Link from 'next/link';\nimport { useNetworkId } from '../lib/network-context';\nimport { TaskDrawer } from '../components/TaskDrawer';\nimport { EmptyState } from '../components/EmptyState';\nimport { AliasAvatar } from '../components/AliasAvatar';\nimport { previewContent } from '../components/utils';\nimport { TASK_STATUSES, STATUS_CHIP_CLASS, STATUS_DOT_HEX, STATUS_BAR_CLASS } from '../lib/status';\n\ninterface Task {\n task_id: string;\n from_name: string;\n to_name: string;\n status: string;\n priority: string;\n content: string;\n result: string;\n created_at: string;\n updated_at: string;\n delivered_at: string;\n started_at: string;\n completed_at: string;\n expires_at: string;\n}\n\nfunction statusBadge(status: string) {\n const color = STATUS_CHIP_CLASS[status] || 'bg-gray-500/10 text-gray-400 border-gray-500/20';\n return `text-xs px-2 py-0.5 rounded-md border ${color}`;\n}\n\nfunction priorityBadge(priority: string) {\n if (priority === 'high') return 'text-red-400';\n if (priority === 'low') return 'text-gray-600';\n return 'text-gray-400';\n}\n\nfunction timeAgo(dateStr: string): string {\n if (!dateStr) return '--';\n const diff = Date.now() - new Date(dateStr.replace(' ', 'T') + 'Z').getTime();\n const s = Math.floor(diff / 1000);\n if (s < 60) return `${s}s ago`;\n if (s < 3600) return `${Math.floor(s / 60)}m ago`;\n if (s < 86400) return `${Math.floor(s / 3600)}h ago`;\n return `${Math.floor(s / 86400)}d ago`;\n}\n\nfunction TasksContent() {\n const searchParams = useSearchParams();\n const { networkId } = useNetworkId();\n const [tasks, setTasks] = useState<Task[]>([]);\n const [count, setCount] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n\n const [filterStatus, setFilterStatus] = useState(searchParams.get('status') || '');\n const [filterFrom, setFilterFrom] = useState('');\n const [filterTo, setFilterTo] = useState('');\n const [drawerTaskId, setDrawerTaskId] = useState<string | null>(null);\n\n const toggleExpand = (taskId: string) => {\n setExpanded(prev => {\n const next = new Set(prev);\n if (next.has(taskId)) next.delete(taskId);\n else next.add(taskId);\n return next;\n });\n };\n\n const fetchTasks = useCallback(async () => {\n try {\n const params = new URLSearchParams();\n if (networkId) params.set('network_id', networkId);\n if (filterStatus) params.set('status', filterStatus);\n if (filterFrom) params.set('from_name', filterFrom);\n if (filterTo) params.set('to_name', filterTo);\n params.set('limit', '100');\n\n const res = await fetch(`/api/hub/tasks?${params.toString()}`);\n if (res.status === 401) {\n window.location.assign('/login');\n return;\n }\n const data = await res.json();\n setTasks(data.tasks || []);\n setCount(data.count ?? (data.tasks?.length || 0));\n setError('');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n } finally {\n setLoading(false);\n }\n }, [filterStatus, filterFrom, filterTo, networkId]);\n\n useEffect(() => {\n setLoading(true);\n fetchTasks();\n const interval = setInterval(fetchTasks, 5000);\n return () => clearInterval(interval);\n }, [fetchTasks]);\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n {/* Header.\n #209 R30 (mobile vertical rhythm — goal \"大幅提升移动端体验\",\n extending R28's Overview pattern to /tasks): this mb-6 + the\n From/To filter row mb-6 below both drop to mb-4 on phones,\n restoring mb-6 from sm: up. Saves ~16 px per spot = ~32 px of\n scroll reclaim on /tasks before the actual task rows. /tasks\n is the second-most-trafficked page after Overview. */}\n <div className=\"flex items-center gap-4 mb-4 sm:mb-6\">\n <h1 className=\"text-2xl font-bold text-white lg:ml-0 ml-10\">Tasks</h1>\n {/* Round 88: pagination-aware chip. When tasks.length < count\n the API has more rows than the current limit=100 slice;\n show `loaded / total` so users notice. Otherwise just the\n single total — matches r87 /logs pattern. */}\n <span\n className=\"text-xs bg-blue-900/30 text-blue-400 px-2 py-0.5 rounded-full border border-blue-800/30 tabular-nums\"\n title={tasks.length < count ? `Showing ${tasks.length} of ${count} tasks` : undefined}\n >\n {tasks.length < count ? `${tasks.length} / ${count}` : count}\n </span>\n </div>\n\n {/* Round 75: hide the status tab strip + From/To filter row when\n there are no tasks at all. Each tab would show \"0\" and the\n filter inputs would have nothing to act on — pure noise above\n the empty-state CTA. When at least one task exists, the chrome\n comes back even if the current filter happens to hide\n everything (so users can clear filters). */}\n {tasks.length > 0 && <>\n {/* Status Tabs — color-coded dots per status family so users can\n scan the row at a glance. Active tab gets full chip styling\n (bg + border + text color), inactive tabs only carry the dot\n + neutral label so the active state remains the strong cue.\n On narrow viewports (<sm) the row scrolls horizontally with\n subtle gradient fade-edges (via .anet-tabstrip-wrap pseudo\n elements) hinting more content. */}\n <div className=\"anet-tabstrip-wrap mb-4\">\n <div className=\"anet-tabstrip flex sm:flex-wrap gap-1 bg-[#111128] rounded-lg border border-[#2a2a4a] p-1 overflow-x-auto sm:overflow-x-visible scrollbar-thin\">\n {(() => {\n // Round 56: compute per-status counts so the tab strip doubles as a\n // status distribution dashboard. Matches Audit Log (r43) + Overview\n // agent filter (r34) chip-with-count pattern.\n const counts: Record<string, number> = {};\n tasks.forEach(t => { counts[t.status] = (counts[t.status] || 0) + 1; });\n return ['', ...TASK_STATUSES].map(s => {\n const count = s === '' ? tasks.length : counts[s] || 0;\n const isActive = filterStatus === s;\n return (\n <button\n key={s}\n onClick={() => setFilterStatus(s)}\n disabled={count === 0 && s !== '' && !isActive}\n className={`px-3 py-1.5 rounded-md text-xs transition-colors flex items-center gap-1.5 shrink-0 whitespace-nowrap disabled:opacity-30 disabled:cursor-not-allowed ${\n isActive\n ? `${STATUS_CHIP_CLASS[s] || 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20'} border`\n : 'text-gray-500 hover:text-gray-300 hover:bg-[#1a1a2a]/40'\n }`}\n >\n {s && (\n <span\n aria-hidden\n className=\"inline-block w-1.5 h-1.5 rounded-full shrink-0\"\n style={{ backgroundColor: STATUS_DOT_HEX[s] || '#6b7280' }}\n />\n )}\n <span>{s || 'All'}</span>\n <span className={`text-[10px] tabular-nums ${isActive ? 'opacity-80' : 'text-gray-600'}`}>{count}</span>\n </button>\n );\n });\n })()}\n </div>\n </div>\n\n {/* From/To Filters — same visual block as the status tabs above.\n R30 (see header above): mb-6 → mb-4 sm:mb-6 mobile-tighten. */}\n <div className=\"flex flex-wrap items-center gap-2 mb-4 sm:mb-6\">\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">From</span>\n <input\n type=\"text\"\n value={filterFrom}\n onChange={e => setFilterFrom(e.target.value)}\n placeholder=\"any node\"\n className=\"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[#2a2a4a] bg-[#111128] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">To</span>\n <input\n type=\"text\"\n value={filterTo}\n onChange={e => setFilterTo(e.target.value)}\n placeholder=\"any node\"\n className=\"w-28 bg-transparent text-base sm:text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n {(filterStatus || filterFrom || filterTo) && (\n <button\n type=\"button\"\n onClick={() => { setFilterStatus(''); setFilterFrom(''); setFilterTo(''); }}\n className=\"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:border-gray-600\"\n >\n Clear filters\n </button>\n )}\n </div>\n </>}\n\n {/* Status distribution */}\n {tasks.length > 0 && !filterStatus && (() => {\n const stats: Record<string, number> = {};\n tasks.forEach(t => { stats[t.status] = (stats[t.status] || 0) + 1; });\n const total = tasks.length || 1;\n // Round 67: derive from shared TASK_STATUSES + STATUS_BAR_CLASS in\n // app/lib/status.ts. Adding a new lifecycle status updates badge,\n // tab dots, and bar in one edit.\n const bars = TASK_STATUSES\n .map(key => ({ key, color: STATUS_BAR_CLASS[key] }))\n .filter(b => stats[b.key]);\n if (!bars.length) return null;\n // Round 63: removed the per-status legend row beneath the bar —\n // it duplicated the counts already shown in the tab chip strip\n // since r56. The proportional bar stays because it adds a visual\n // \"shape of workload\" that the chip numbers don't convey.\n return (\n <div className=\"mb-6\">\n <div className=\"flex h-2 rounded-full overflow-hidden bg-gray-800\">\n {bars.map(b => <div key={b.key} className={b.color} style={{ width: `${(stats[b.key]/total)*100}%` }} title={`${b.key}: ${stats[b.key]}`} />)}\n </div>\n </div>\n );\n })()}\n\n {error && (\n <div className=\"bg-red-900/20 border border-red-800/40 text-red-300 px-4 py-2 rounded-lg mb-6 text-sm\">{error}</div>\n )}\n\n {loading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-20 bg-gray-800/20 rounded-lg border border-gray-800/40\" />\n ))}\n </div>\n ) : tasks.length === 0 ? (\n <EmptyState\n variant=\"tasks\"\n sub={(filterStatus || filterFrom || filterTo)\n ? 'No tasks match the current filters. Try clearing them.'\n : 'Tasks will appear here when agents send them via CommHub.'}\n />\n ) : (\n <div className=\"space-y-1 sm:space-y-2\">\n {/* Table header */}\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase\">\n <div className=\"col-span-1\">Status</div>\n <div className=\"col-span-2\">From</div>\n <div className=\"col-span-2\">To</div>\n <div className=\"col-span-4\">Content</div>\n <div className=\"col-span-1\">Priority</div>\n <div className=\"col-span-2\">Time</div>\n </div>\n\n {tasks.map(t => {\n const isOpen = expanded.has(t.task_id);\n return (\n <div\n key={t.task_id}\n className={`anet-task-row group bg-[#111128] border rounded-lg px-3 py-2 sm:px-4 sm:py-3 transition-all duration-200 cursor-pointer ${\n isOpen\n ? 'border-[#3a3a5a] shadow-lg shadow-black/20'\n : 'border-[#2a2a4a] hover:border-[#3a3a5a] hover:bg-[#15152e]'\n }`}\n onClick={() => toggleExpand(t.task_id)}\n role=\"button\"\n tabIndex={0}\n aria-expanded={isOpen}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleExpand(t.task_id);\n }\n }}\n >\n {/* Desktop row */}\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 items-center\">\n <div className=\"col-span-1\">\n <span className={statusBadge(t.status)}>{t.status}</span>\n </div>\n <div className=\"col-span-2 flex items-center gap-1.5 min-w-0\" title={t.from_name}>\n {t.from_name && <AliasAvatar alias={t.from_name} size={18} />}\n <span className=\"truncate text-sm text-gray-200\">{t.from_name || '--'}</span>\n </div>\n <div className=\"col-span-2 flex items-center gap-1.5 min-w-0\" title={t.to_name}>\n {t.to_name && <AliasAvatar alias={t.to_name} size={18} />}\n <span className=\"truncate text-sm text-gray-200\">{t.to_name || '--'}</span>\n </div>\n <div className=\"col-span-4 text-xs text-gray-400 truncate\" title={t.content}>\n {previewContent(t.content)}\n </div>\n <div className=\"col-span-1\">\n <span className={`text-xs ${priorityBadge(t.priority)}`}>{t.priority || 'normal'}</span>\n </div>\n <div className=\"col-span-2 text-xs text-gray-500 flex items-center justify-between gap-2\" title={t.created_at}>\n <span className=\"truncate\">{timeAgo(t.created_at)}</span>\n <svg\n aria-hidden\n className={`shrink-0 text-gray-600 group-hover:text-gray-400 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n </div>\n\n {/* Mobile layout — R8 of #190 mobile polish: 4-row stack\n → 3-row by inlining timeAgo onto the same row as the\n from→to alias header (it's already 4 small atoms, has\n room), plus space-y-2 → space-y-1 to trim ~4px per\n row × 200 tasks. */}\n <div className=\"sm:hidden space-y-1\">\n <div className=\"flex items-center justify-between\">\n <span className={statusBadge(t.status)}>{t.status}</span>\n <div className=\"flex items-center gap-2\">\n <span className={`text-xs ${priorityBadge(t.priority)}`}>{t.priority || 'normal'}</span>\n <svg\n aria-hidden\n className={`text-gray-600 transition-transform duration-200 ${isOpen ? 'rotate-180' : ''}`}\n width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n </div>\n <div className=\"flex items-center gap-1.5 text-xs text-gray-300 min-w-0\">\n {t.from_name && <AliasAvatar alias={t.from_name} size={16} />}\n <span className=\"truncate max-w-[35%]\">{t.from_name || '--'}</span>\n <span className=\"text-gray-600\">&rarr;</span>\n {t.to_name && <AliasAvatar alias={t.to_name} size={16} />}\n <span className=\"truncate max-w-[35%]\">{t.to_name || '--'}</span>\n <span className=\"ml-auto shrink-0 text-[10px] text-gray-600\">{timeAgo(t.created_at)}</span>\n </div>\n <div className=\"text-xs text-gray-400 line-clamp-1\" title={t.content}>{previewContent(t.content)}</div>\n </div>\n\n {/* Expanded detail — always mounted; grid-rows 0fr↔1fr trick gives\n content-aware smooth max-height animation without measuring DOM. */}\n <div\n className={`grid transition-all duration-300 ease-out ${\n isOpen ? 'grid-rows-[1fr] opacity-100 mt-3' : 'grid-rows-[0fr] opacity-0'\n }`}\n aria-hidden={!isOpen}\n >\n <div className=\"overflow-hidden\">\n <div className=\"pt-3 border-t border-[#2a2a4a] space-y-3\">\n {t.content && (\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Content</div>\n <div className=\"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a]\">{t.content}</div>\n </div>\n )}\n {t.result && (\n <div>\n <div className=\"text-xs text-gray-600 mb-1\">Result</div>\n <div className=\"text-xs text-gray-300 whitespace-pre-wrap bg-[#0a0a15] rounded-lg px-3 py-2 border border-[#1a1a2a] max-h-48 overflow-y-auto\">{t.result}</div>\n </div>\n )}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs\">\n {[\n ['Created', t.created_at],\n ['Delivered', t.delivered_at],\n ['Started', t.started_at],\n ['Completed', t.completed_at],\n ].map(([label, val]) => (\n <div key={label as string}>\n <span className=\"text-gray-600\">{label}: </span>\n <span className=\"text-gray-400\">{val ? timeAgo(val as string) : '--'}</span>\n </div>\n ))}\n </div>\n {t.expires_at && (\n <div className=\"text-xs\">\n <span className=\"text-gray-600\">Expires: </span>\n <span className=\"text-orange-400\">{t.expires_at}</span>\n </div>\n )}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-gray-600 truncate\" title={t.task_id}>\n ID: {t.task_id}\n </div>\n <div className=\"flex gap-2 shrink-0\">\n {(t.status === 'failed' || t.status === 'expired') && (\n <button\n onClick={async (e) => {\n e.stopPropagation();\n await fetch('/api/hub/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alias: t.to_name, task: t.content, priority: t.priority }),\n });\n fetchTasks();\n }}\n className=\"text-xs text-orange-400 hover:text-orange-300 px-2 py-0.5 rounded border border-orange-500/20 hover:bg-orange-500/10\"\n >\n Retry\n </button>\n )}\n <button\n onClick={e => { e.stopPropagation(); setDrawerTaskId(t.task_id); }}\n className=\"text-xs text-cyan-400 hover:text-cyan-300\"\n >\n Detail &rarr;\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {drawerTaskId && <TaskDrawer taskId={drawerTaskId} onClose={() => setDrawerTaskId(null)} />}\n </div>\n );\n}\n\nexport default function TasksPage() {\n return (\n <Suspense fallback={\n // #209 R30 (playwright mobile-shot caught it): the bare Suspense\n // fallback rendered \"Loading tasks...\" at p-6 with no left-indent,\n // so the fixed top-3 left-3 mobile burger (56 px right-edge) sat\n // right on top of \"Loa\" — the screenshot read as a broken page.\n // Match the loaded layout: p-4 sm:p-6 page padding + ml-10 mobile\n // indent on the text, so the burger clears and the loading state\n // visually maps to the populated page.\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <div className=\"lg:ml-0 ml-10 text-gray-500 text-sm\">Loading tasks…</div>\n </div>\n }>\n <TasksContent />\n </Suspense>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { timeAgo } from './utils';\nimport Link from 'next/link';\nimport { AliasAvatar } from './AliasAvatar';\n\ninterface TaskDetail {\n task_id: string;\n from_name: string;\n to_name: string;\n status: string;\n priority: string;\n content: string;\n result: string;\n created_at: string;\n delivered_at: string;\n started_at: string;\n completed_at: string;\n expires_at: string;\n}\n\ninterface TaskEvent {\n id: number;\n event_type: string;\n from_status: string;\n to_status: string;\n detail: string;\n created_at: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n created: 'text-gray-400', delivered: 'text-blue-400', running: 'text-green-400',\n replied: 'text-purple-400', failed: 'text-red-400', closed: 'text-gray-500',\n};\n\ninterface TaskDrawerProps {\n taskId: string;\n onClose: () => void;\n}\n\nexport function TaskDrawer({ taskId, onClose }: TaskDrawerProps) {\n const [task, setTask] = useState<TaskDetail | null>(null);\n const [events, setEvents] = useState<TaskEvent[]>([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n (async () => {\n try {\n const [taskRes, eventsRes] = await Promise.all([\n fetch(`/api/hub/tasks?task_id=${encodeURIComponent(taskId)}`),\n fetch(`/api/hub/task-events?task_id=${encodeURIComponent(taskId)}&limit=50`),\n ]);\n const taskData = await taskRes.json();\n const eventsData = await eventsRes.json();\n if (taskData.tasks?.[0]) setTask(taskData.tasks[0]);\n setEvents(eventsData.events || []);\n } catch {} finally { setLoading(false); }\n })();\n }, [taskId]);\n\n /** Timeline steps — same 4 hops every task goes through. `time` is set\n * when the hop has happened; missing time means pending. Round 36 adds\n * `key` for the \"current step\" highlight + the `done` flag for layout. */\n const timeline = task ? [\n { key: 'created', label: 'Created', time: task.created_at, color: 'bg-gray-400' },\n { key: 'delivered', label: 'Delivered', time: task.delivered_at, color: 'bg-blue-400' },\n { key: 'started', label: 'Started', time: task.started_at, color: 'bg-green-400' },\n { key: 'completed', label: 'Completed', time: task.completed_at, color: 'bg-purple-400'},\n ].map(s => ({ ...s, done: !!s.time })) : [];\n\n /** Index of the highest-completed step. The step *after* this index is\n * the \"current\" one (in-progress). When all are done, currentIdx = -1. */\n const currentStepIdx = timeline.findIndex(s => !s.done);\n const isActive = task && task.status !== 'completed' && task.status !== 'failed' && task.status !== 'expired' && task.status !== 'cancelled';\n\n const duration = task?.started_at && task?.completed_at\n ? Math.round((new Date(task.completed_at).getTime() - new Date(task.started_at).getTime()) / 1000)\n : null;\n\n return (\n <>\n <div className=\"fixed inset-0 bg-black/30 z-40 anet-fade-in\" onClick={onClose} />\n <div className=\"fixed top-0 right-0 h-[100dvh] w-full lg:w-[500px] bg-[#0a0a1a] border-l border-[#2a2a4a] z-50 flex flex-col shadow-2xl shadow-black/60 overflow-y-auto animate-slide-in\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-[#2a2a4a] bg-[#0d0d1a] sticky top-0\">\n <div>\n <div className=\"text-sm font-semibold text-white\">Task Detail</div>\n <div className=\"text-[10px] text-gray-500 mt-0.5\">{taskId.slice(0, 16)}...</div>\n </div>\n {/* R16 of #190: same chat-panel close pattern — was ~32 px\n tap target; lift to a uniform 44 x 44 hit zone. */}\n <button onClick={onClose} aria-label=\"Close task drawer\" className=\"inline-flex min-h-[44px] min-w-[44px] items-center justify-center text-gray-500 hover:text-white rounded-lg hover:bg-[#1a1a2a]\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {loading ? (\n <div className=\"flex justify-center py-16\">\n <div className=\"w-6 h-6 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin\" />\n </div>\n ) : !task ? (\n <div className=\"text-center py-16 text-gray-500\">Task not found</div>\n ) : (\n <div className=\"px-5 py-5 space-y-5\">\n {/* Status + Priority */}\n <div className=\"flex items-center gap-3\">\n <span className={`text-lg font-bold ${STATUS_COLORS[task.status] || 'text-gray-400'}`}>{task.status}</span>\n {task.priority !== 'normal' && (\n <span className={`text-xs px-2 py-0.5 rounded border ${task.priority === 'high' ? 'text-red-300 border-red-500/20' : 'text-gray-400 border-gray-600/20'}`}>{task.priority}</span>\n )}\n {duration !== null && (\n <span className=\"text-xs text-gray-500\">⏱ {duration < 60 ? `${duration}s` : `${Math.floor(duration/60)}m ${duration%60}s`}</span>\n )}\n </div>\n\n {/* From → To — round 41: use AliasAvatar so from/to colours\n match the rest of the app instead of the legacy blue/cyan\n hardcode. */}\n <div className=\"flex items-center gap-2 text-sm flex-wrap\">\n {task.from_name && <AliasAvatar alias={task.from_name} size={18} />}\n <span className=\"text-gray-200 font-medium\">{task.from_name || '--'}</span>\n <span className=\"text-gray-600\">&rarr;</span>\n {task.to_name && <AliasAvatar alias={task.to_name} size={18} />}\n <span className=\"text-gray-200 font-medium\">{task.to_name || '--'}</span>\n </div>\n\n {/* Timeline — round 36 polish: relative timestamps, current-step\n pulse if task is still in flight, full ISO in title=. */}\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"text-xs text-gray-500 uppercase tracking-wide\">Timeline</div>\n {duration !== null && (\n <div className=\"text-[10px] text-gray-600\">\n {duration < 60 ? `${duration}s` : `${Math.floor(duration/60)}m ${duration%60}s`} runtime\n </div>\n )}\n </div>\n <div className=\"space-y-3\">\n {timeline.map((step, i) => {\n const isCurrent = isActive && i === currentStepIdx;\n const isNextDone = !!timeline[i+1]?.done;\n return (\n <div key={step.key} className=\"flex items-start gap-3\">\n <div className=\"flex flex-col items-center pt-0.5\">\n <span\n className={`relative w-3 h-3 rounded-full shrink-0 ${\n step.done ? step.color : 'bg-gray-700'\n }`}\n >\n {isCurrent && (\n <span\n aria-hidden\n className=\"absolute -inset-1 rounded-full border border-current opacity-60 anet-current-step-pulse\"\n style={{ borderColor: 'currentColor' }}\n />\n )}\n </span>\n {i < timeline.length - 1 && (\n <div className={`w-0.5 h-5 mt-1 ${\n step.done && isNextDone ? 'bg-gray-500' : step.done ? 'bg-gradient-to-b from-gray-500 to-gray-800' : 'bg-gray-800'\n }`} />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className={`text-xs font-medium flex items-center gap-2 ${\n step.done ? 'text-gray-200' : isCurrent ? 'text-cyan-300' : 'text-gray-600'\n }`}>\n <span>{step.label}</span>\n {isCurrent && <span className=\"text-[9px] uppercase tracking-wide text-cyan-400\">in&nbsp;progress</span>}\n </div>\n <div className=\"text-[10px] text-gray-500\" title={step.time || undefined}>\n {step.time ? timeAgo(step.time) : isCurrent ? '—' : 'Pending'}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Content */}\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-xs text-gray-500 uppercase mb-2\">Input</div>\n <div className=\"text-sm text-gray-300 whitespace-pre-wrap\">{task.content || '--'}</div>\n </div>\n\n {/* Result */}\n {task.result && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-xs text-gray-500 uppercase mb-2\">Output</div>\n <div className=\"text-sm text-gray-300 whitespace-pre-wrap max-h-64 overflow-y-auto\">{task.result}</div>\n </div>\n )}\n\n {/* Events */}\n {events.length > 0 && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-xs text-gray-500 uppercase mb-2\">Events ({events.length})</div>\n <div className=\"space-y-1.5 max-h-40 overflow-y-auto\">\n {events.map(e => (\n <div key={e.id} className=\"flex items-center gap-2 text-[11px]\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${\n e.to_status === 'running' ? 'bg-green-400' : e.to_status === 'replied' ? 'bg-purple-400' : e.to_status === 'failed' ? 'bg-red-400' : 'bg-blue-400'\n }`} />\n <span className=\"text-gray-400\">{e.event_type}</span>\n {e.from_status && <span className=\"text-gray-600\">{e.from_status}→{e.to_status}</span>}\n <span className=\"text-gray-600 ml-auto\">{timeAgo(e.created_at)}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Metadata */}\n <div className=\"text-[10px] text-gray-600 space-y-1\">\n <div>Task ID: {task.task_id}</div>\n {task.expires_at && <div>Expires: {task.expires_at}</div>}\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n"],"names":["STATUS_COLORS","created","delivered","running","replied","failed","closed","TaskDrawer","taskId","onClose","task","setTask","events","setEvents","loading","setLoading","taskRes","eventsRes","Promise","all","fetch","encodeURIComponent","taskData","json","eventsData","tasks","timeline","key","label","time","created_at","color","delivered_at","started_at","completed_at","map","s","done","currentStepIdx","findIndex","isActive","status","duration","Math","round","Date","getTime","className","onClick","slice","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","d","priority","floor","from_name","alias","size","to_name","step","i","isCurrent","isNextDone","style","borderColor","length","title","undefined","content","result","e","to_status","event_type","from_status","id","task_id","expires_at"],"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/gQUBslHrnEi2wSMEuinXH/_buildManifest.js",
11
- "static/gQUBslHrnEi2wSMEuinXH/_ssgManifest.js",
12
- "static/gQUBslHrnEi2wSMEuinXH/_clientMiddlewareManifest.js"
10
+ "static/VQuWjJDHv069cw03Mna-s/_buildManifest.js",
11
+ "static/VQuWjJDHv069cw03Mna-s/_ssgManifest.js",
12
+ "static/VQuWjJDHv069cw03Mna-s/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/05oi25hh7b81r.js",