@sleep2agi/agent-network-dashboard 0.4.5-preview.75 → 0.4.5-preview.77

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 (149) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +6 -6
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/index.html +1 -1
  30. package/.next/server/app/index.rsc +1 -1
  31. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  32. package/.next/server/app/index.segments/_full.segment.rsc +1 -1
  33. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  36. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/login.html +2 -2
  38. package/.next/server/app/login.rsc +2 -2
  39. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  40. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  45. package/.next/server/app/logs.html +1 -1
  46. package/.next/server/app/logs.rsc +1 -1
  47. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  48. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  53. package/.next/server/app/messages.html +1 -1
  54. package/.next/server/app/messages.rsc +1 -1
  55. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  56. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  61. package/.next/server/app/node.html +1 -1
  62. package/.next/server/app/node.rsc +1 -1
  63. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  64. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  69. package/.next/server/app/nodes/page.js.nft.json +1 -1
  70. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/nodes.html +2 -2
  72. package/.next/server/app/nodes.rsc +2 -2
  73. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  74. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  77. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
  78. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  79. package/.next/server/app/server-logs.html +1 -1
  80. package/.next/server/app/server-logs.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  86. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  87. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  88. package/.next/server/app/settings/networks.html +2 -2
  89. package/.next/server/app/settings/networks.rsc +2 -2
  90. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  91. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  96. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  97. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  98. package/.next/server/app/settings/tokens.html +1 -1
  99. package/.next/server/app/settings/tokens.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  105. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  106. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  107. package/.next/server/app/settings.html +2 -2
  108. package/.next/server/app/settings.rsc +2 -2
  109. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  110. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  112. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  113. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  114. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  115. package/.next/server/app/tasks.html +1 -1
  116. package/.next/server/app/tasks.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  121. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  122. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  123. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js +3 -0
  124. package/.next/server/chunks/ssr/[root-of-the-server]__0jl4ukn._.js.map +1 -0
  125. package/.next/server/chunks/ssr/app_04n78pr._.js +1 -1
  126. package/.next/server/chunks/ssr/app_04n78pr._.js.map +1 -1
  127. package/.next/server/chunks/ssr/app_0aum_g5._.js +1 -1
  128. package/.next/server/chunks/ssr/app_0aum_g5._.js.map +1 -1
  129. package/.next/server/chunks/ssr/app_0esuljp._.js +1 -1
  130. package/.next/server/chunks/ssr/app_0esuljp._.js.map +1 -1
  131. package/.next/server/middleware-build-manifest.js +3 -3
  132. package/.next/server/pages/404.html +1 -1
  133. package/.next/server/pages/500.html +1 -1
  134. package/.next/server/server-reference-manifest.js +1 -1
  135. package/.next/server/server-reference-manifest.json +1 -1
  136. package/.next/static/chunks/{0vn.u7tcybvik.js → 0geyh7e8y2s5f.js} +1 -1
  137. package/.next/static/chunks/{0fbxtixx.fzsl.js → 0ir50f-dedv4s.js} +1 -1
  138. package/.next/static/chunks/{0i2kq9ogpy1wv.js → 0wd.9d9bnbdp5.js} +1 -1
  139. package/.next/static/chunks/{16sfns1kuyerz.js → 0xvy5xvlv9zdk.js} +1 -1
  140. package/.next/trace +2 -2
  141. package/.next/trace-build +1 -1
  142. package/app/nodes/page.tsx +9 -6
  143. package/app/settings/networks/page.tsx +3 -3
  144. package/package.json +1 -1
  145. package/.next/server/chunks/ssr/app_nodes_page_tsx_0f6toau._.js +0 -3
  146. package/.next/server/chunks/ssr/app_nodes_page_tsx_0f6toau._.js.map +0 -1
  147. /package/.next/static/{a_lL3890Ofcifu0FpV0zS → rQWa5-WjmzvefLI-_ocT9}/_buildManifest.js +0 -0
  148. /package/.next/static/{a_lL3890Ofcifu0FpV0zS → rQWa5-WjmzvefLI-_ocT9}/_clientMiddlewareManifest.js +0 -0
  149. /package/.next/static/{a_lL3890Ofcifu0FpV0zS → rQWa5-WjmzvefLI-_ocT9}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../app/nodes/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { timeAgo } from '../components/utils';\nimport { useSessions, useHealth } from '../lib/hooks';\nimport { TaskChatPanel } from '../components/TaskChatPanel';\nimport { EmptyState, NodesEmptyState } from '../components/EmptyState';\nimport { AliasAvatar } from '../components/AliasAvatar';\nimport type { Session } from '../components/types';\nimport { SESSION_STATUS_CHIP_CLASS as STATUS_COLORS } from '../lib/status';\n\n/** Round 81: shorten long server hostnames (Alibaba `iZ…oyZ` style)\n * for table display. Returns the original string unchanged when ≤12\n * chars. Full value should stay in `title=` for hover + screen-readers. */\nfunction shortServer(server: string | null | undefined): string {\n if (!server) return '—';\n return server.length > 12 ? `${server.slice(0, 8)}…` : server;\n}\n\ntype ViewMode = 'list' | 'grid';\ntype SessionRow = Session & { online: boolean };\n\nexport default function NodesPage() {\n const { sessions, isLoading: loading } = useSessions();\n const { health } = useHealth();\n const sseMap = health?.sse_sessions || {};\n // SSE keys are `network_id:alias` since server v0.7+. Look up with the\n // composite key first, fall back to alias-only for legacy hubs.\n const sseFor = (s: { alias: string; network_id?: string }) =>\n (s.network_id ? sseMap[`${s.network_id}:${s.alias}`] : undefined) ?? sseMap[s.alias];\n const [filterStatus, setFilterStatus] = useState('');\n const [search, setSearch] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [taskDrafts, setTaskDrafts] = useState<Record<string, string>>({});\n const [taskOpenFor, setTaskOpenFor] = useState<string | null>(null);\n const [sendState, setSendState] = useState<Record<string, { sending?: boolean; error?: string; success?: string }>>({});\n const [chatAlias, setChatAlias] = useState<string | null>(null);\n\n const filtered: SessionRow[] = sessions\n .map(s => ({ ...s, online: !!sseFor(s) }))\n .filter(s => {\n if (filterStatus === 'online') return s.online;\n if (filterStatus === 'offline') return !s.online;\n if (filterStatus && filterStatus !== s.status) return false;\n return true;\n })\n .filter(s => !search || s.alias.toLowerCase().includes(search.toLowerCase()) || (s.agent || '').toLowerCase().includes(search.toLowerCase()))\n .sort((a, b) => (b.online ? 1 : 0) - (a.online ? 1 : 0) || (b.status === 'working' ? 1 : 0) - (a.status === 'working' ? 1 : 0));\n\n const onlineCount = sessions.filter(s => sseFor(s)).length;\n\n const openSendTask = (alias: string) => {\n setTaskOpenFor(current => current === alias ? null : alias);\n setSendState(prev => ({ ...prev, [alias]: {} }));\n };\n\n const updateTaskDraft = (alias: string, value: string) => {\n setTaskDrafts(prev => ({ ...prev, [alias]: value }));\n };\n\n const sendTask = async (alias: string) => {\n const task = taskDrafts[alias]?.trim() || '';\n if (!task) return;\n\n setSendState(prev => ({ ...prev, [alias]: { sending: true } }));\n\n try {\n const res = await fetch('/api/hub/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ alias, task }),\n });\n const data = await res.json();\n\n if (!res.ok || data?.ok === false) {\n throw new Error(data?.error || 'Send failed');\n }\n\n setTaskDrafts(prev => ({ ...prev, [alias]: '' }));\n setSendState(prev => ({ ...prev, [alias]: { success: 'Task sent' } }));\n setTaskOpenFor(null);\n } catch (error: unknown) {\n setSendState(prev => ({\n ...prev,\n [alias]: { error: error instanceof Error ? error.message : 'Send failed' },\n }));\n }\n };\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <div className=\"flex items-center gap-4 mb-6\">\n <h1 className=\"text-2xl font-bold text-white lg:ml-0 ml-10\">Nodes</h1>\n <span className=\"text-xs bg-green-900/30 text-green-400 px-2 py-0.5 rounded-full border border-green-800/30\">\n {onlineCount} online\n </span>\n <span className=\"text-xs bg-gray-900/30 text-gray-400 px-2 py-0.5 rounded-full border border-gray-800/30\">\n {sessions.length} total\n </span>\n </div>\n\n {/* Status bar */}\n {sessions.length > 0 && (() => {\n const working = filtered.filter(s => s.online && s.status === 'working').length;\n const idle = filtered.filter(s => s.online && s.status === 'idle').length;\n const offline = filtered.filter(s => !s.online).length;\n const total = filtered.length || 1;\n return (\n <div className=\"mb-6\">\n <div className=\"flex h-2 rounded-full overflow-hidden bg-gray-800\">\n {working > 0 && <div className=\"bg-green-500\" style={{ width: `${(working/total)*100}%` }} />}\n {idle > 0 && <div className=\"bg-cyan-500\" style={{ width: `${(idle/total)*100}%` }} />}\n {offline > 0 && <div className=\"bg-gray-600\" style={{ width: `${(offline/total)*100}%` }} />}\n </div>\n <div className=\"flex gap-4 mt-1.5 text-[10px] text-gray-500\">\n {working > 0 && <span><span className=\"inline-block w-2 h-2 rounded-full bg-green-500 mr-1\" />{working} working</span>}\n {idle > 0 && <span><span className=\"inline-block w-2 h-2 rounded-full bg-cyan-500 mr-1\" />{idle} idle</span>}\n {offline > 0 && <span><span className=\"inline-block w-2 h-2 rounded-full bg-gray-600 mr-1\" />{offline} offline</span>}\n </div>\n </div>\n );\n })()}\n\n {/* Round 74: hide the filter+view chrome when there are no nodes\n anywhere — these controls have nothing to act on, and they only\n push the onboarding CTA further down. When at least one session\n exists, the chrome is back even if the current filter happens\n to hide everything (so users can clear filters). */}\n {sessions.length > 0 && (\n <div className=\"flex flex-wrap gap-3 mb-6\">\n <input\n type=\"text\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search nodes...\"\n className=\"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:outline-none w-48\"\n />\n <select\n value={filterStatus}\n onChange={e => setFilterStatus(e.target.value)}\n className=\"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-blue-500/50 focus:outline-none\"\n >\n <option value=\"\">All</option>\n <option value=\"online\">Online</option>\n <option value=\"offline\">Offline</option>\n <option value=\"working\">Working</option>\n <option value=\"idle\">Idle</option>\n <option value=\"blocked\">Blocked</option>\n <option value=\"error\">Error</option>\n </select>\n {/* Round 80: List/Grid toggle hidden on mobile — Grid uses\n grid-cols-1 below `md` and List degrades to the same single\n column, so the toggle has no visual effect under sm and only\n steals a row of vertical space. */}\n <div className=\"hidden sm:flex ml-auto rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 text-sm\">\n {(['list', 'grid'] as const).map(mode => (\n <button\n key={mode}\n type=\"button\"\n onClick={() => setViewMode(mode)}\n className={`rounded-md px-3 py-1.5 transition-colors ${\n viewMode === mode\n ? 'bg-cyan-500/10 text-cyan-300'\n : 'text-gray-500 hover:text-gray-200'\n }`}\n >\n {mode === 'list' ? 'List' : 'Grid'}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {loading ? (\n <div className=\"animate-pulse space-y-2\">\n {[1,2,3,4].map(i => <div key={i} className=\"h-16 bg-gray-800/20 rounded-lg\" />)}\n </div>\n ) : filtered.length === 0 ? (\n sessions.length === 0 ? (\n /* Round 73: first-run case — no agents anywhere. Use the same\n onboarding empty state as the Overview (NodesEmptyState\n includes the `npx … init` quickstart command). Previously this\n was the \"No nodes match your filters\" copy, which was wrong\n for new users who have no filters applied. */\n <NodesEmptyState />\n ) : (\n <EmptyState\n variant=\"nodes\"\n title=\"No nodes match your filters\"\n sub=\"Try clearing search or status filters, or wait for an agent to register.\"\n />\n )\n ) : viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {filtered.map(s => {\n const statusKey = s.online ? s.status : 'offline';\n const state = sendState[s.alias] || {};\n const progress = typeof s.progress === 'number' ? s.progress : 0;\n\n return (\n <div\n key={s.alias}\n className={`relative overflow-hidden rounded-xl border border-[#2a2a4a] bg-[#111128] p-4 transition-colors ${!s.online ? 'opacity-60' : ''}`}\n >\n {!s.online && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span className=\"rotate-[-20deg] rounded-xl border border-white/10 bg-black/20 px-5 py-2 text-xl font-bold uppercase tracking-[0.35em] text-white/10\">\n Offline\n </span>\n </div>\n )}\n <div className=\"flex items-start gap-3\">\n <AliasAvatar alias={s.alias} size={36} />\n <Link href={`/node?alias=${encodeURIComponent(s.alias)}`} className=\"min-w-0 flex-1 hover:text-cyan-300\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-base font-semibold text-white\">{s.alias}</span>\n <span className={`shrink-0 rounded-md border px-2 py-0.5 text-[10px] uppercase tracking-wide ${STATUS_COLORS[statusKey] || STATUS_COLORS.offline}`}>\n {statusKey}\n </span>\n </div>\n <div className=\"mt-0.5 truncate text-xs text-gray-500\">\n {(s.agent || '—')}<span className=\"text-gray-700 mx-1.5\">·</span><span title={s.server || ''}>{shortServer(s.server)}</span>\n </div>\n </Link>\n <div className=\"flex gap-1.5 shrink-0\">\n <button type=\"button\" onClick={() => setChatAlias(s.alias)}\n className=\"rounded-lg border border-green-500/20 bg-green-500/10 px-3 py-1.5 text-xs text-green-300 transition-colors hover:bg-green-500/20\">\n Chat\n </button>\n <button type=\"button\" onClick={() => openSendTask(s.alias)}\n className=\"rounded-lg border border-cyan-500/20 bg-cyan-500/10 px-3 py-1.5 text-xs text-cyan-300 transition-colors hover:bg-cyan-500/20\">\n Task\n </button>\n </div>\n </div>\n\n <div className=\"mt-3 rounded-lg border border-[#1a1a2a] bg-[#0a0a15] px-3 py-2 text-xs\">\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Current task</span>\n <span className=\"text-[10px] text-gray-600\">{timeAgo(s.last_seen_at || s.updated_at)}</span>\n </div>\n <div className={`mt-1 line-clamp-2 ${s.task ? 'text-gray-300' : 'text-gray-600 italic'}`}>\n {s.task || 'No current task'}\n </div>\n </div>\n\n {progress > 0 && progress < 100 && (\n <div className=\"mt-3 h-1.5 overflow-hidden rounded-full bg-gray-800\">\n <div className=\"h-1.5 rounded-full bg-cyan-400 transition-all\" style={{ width: `${progress}%` }} />\n </div>\n )}\n\n {taskOpenFor === s.alias && (\n <div className=\"mt-4 space-y-2 rounded-lg border border-[#2a2a4a] bg-[#0a0a15] p-3\">\n <input\n type=\"text\"\n value={taskDrafts[s.alias] || ''}\n onChange={e => updateTaskDraft(s.alias, e.target.value)}\n onKeyDown={e => e.key === 'Enter' && sendTask(s.alias)}\n placeholder={`Send task to ${s.alias}...`}\n className=\"w-full rounded-lg border border-[#2a2a4a] bg-[#050510] px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-cyan-500 focus:outline-none\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setTaskOpenFor(null)}\n className=\"rounded-lg border border-gray-700 px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => sendTask(s.alias)}\n disabled={state.sending || !(taskDrafts[s.alias] || '').trim()}\n className=\"rounded-lg bg-cyan-600 px-3 py-1.5 text-xs text-white hover:bg-cyan-500 disabled:cursor-not-allowed disabled:bg-gray-700\"\n >\n {state.sending ? 'Sending...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n\n {state.error && <div className=\"mt-2 text-xs text-red-400\">{state.error}</div>}\n {state.success && taskOpenFor !== s.alias && <div className=\"mt-2 text-xs text-green-400\">{state.success}</div>}\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 px-4 py-2 text-xs text-gray-600 uppercase\">\n <div className=\"col-span-1\">Status</div>\n <div className=\"col-span-2\">Alias</div>\n <div className=\"col-span-2\">Agent</div>\n <div className=\"col-span-2\">Server</div>\n <div className=\"col-span-2\">Current Task</div>\n <div className=\"col-span-1\">Updated</div>\n <div className=\"col-span-2 text-right\">Actions</div>\n </div>\n {filtered.map(s => {\n const statusKey = s.online ? s.status : 'offline';\n const state = sendState[s.alias] || {};\n\n return (\n <div\n key={s.alias}\n className={`rounded-lg border border-[#2a2a4a] bg-[#111128] px-4 py-3 transition-colors hover:border-[#3a3a5a] ${!s.online ? 'opacity-50' : ''}`}\n >\n <div className=\"hidden sm:grid sm:grid-cols-12 gap-2 items-center\">\n <div className=\"col-span-1\">\n <span className={`text-xs px-2 py-0.5 rounded-md border ${STATUS_COLORS[statusKey] || STATUS_COLORS.offline}`}>\n {statusKey}\n </span>\n </div>\n <div className=\"col-span-2 min-w-0\">\n <Link href={`/node?alias=${encodeURIComponent(s.alias)}`} className=\"flex items-center gap-2 min-w-0 hover:text-cyan-300\">\n <AliasAvatar alias={s.alias} size={20} />\n <span className=\"truncate text-sm font-medium text-white\">{s.alias}</span>\n </Link>\n </div>\n <div className=\"col-span-2 truncate text-xs text-gray-400\">{s.agent || '--'}</div>\n <div className=\"col-span-2 truncate text-xs text-gray-400\" title={s.server || ''}>{shortServer(s.server)}</div>\n <div className=\"col-span-2 truncate text-xs text-gray-500\">{s.task || '--'}</div>\n <div className=\"col-span-1 text-xs text-gray-500\">{timeAgo(s.last_seen_at || s.updated_at)}</div>\n <div className=\"col-span-2 flex justify-end gap-1.5\">\n <button type=\"button\" onClick={() => setChatAlias(s.alias)}\n className=\"rounded-lg border border-green-500/20 bg-green-500/10 px-2 py-1 text-xs text-green-300 hover:bg-green-500/20\">\n Chat\n </button>\n <button type=\"button\" onClick={() => openSendTask(s.alias)}\n className=\"rounded-lg border border-cyan-500/20 bg-cyan-500/10 px-2 py-1 text-xs text-cyan-300 hover:bg-cyan-500/20\">\n Task\n </button>\n </div>\n </div>\n <div className=\"sm:hidden space-y-2\">\n <div className=\"flex items-center gap-2.5\">\n <AliasAvatar alias={s.alias} size={28} />\n <Link href={`/node?alias=${encodeURIComponent(s.alias)}`} className=\"min-w-0 flex-1 hover:text-cyan-300\">\n <div className=\"truncate text-sm font-medium text-white\">{s.alias}</div>\n <div className=\"truncate text-[10px] text-gray-500\">{s.agent || '—'} · {timeAgo(s.last_seen_at || s.updated_at)}</div>\n </Link>\n <span className={`shrink-0 text-xs px-2 py-0.5 rounded-md border ${STATUS_COLORS[statusKey] || STATUS_COLORS.offline}`}>\n {statusKey}\n </span>\n </div>\n {s.task && <div className=\"truncate text-xs text-gray-500\">{s.task}</div>}\n <div className=\"flex gap-2\">\n <button type=\"button\" onClick={() => setChatAlias(s.alias)}\n className=\"flex-1 rounded-lg border border-green-500/20 bg-green-500/10 px-3 py-2 text-xs text-green-300 hover:bg-green-500/20\">\n Chat\n </button>\n <button type=\"button\" onClick={() => openSendTask(s.alias)}\n className=\"flex-1 rounded-lg border border-cyan-500/20 bg-cyan-500/10 px-3 py-2 text-xs text-cyan-300 hover:bg-cyan-500/20\">\n Send Task\n </button>\n </div>\n </div>\n\n {taskOpenFor === s.alias && (\n <div className=\"mt-3 space-y-2 border-t border-[#2a2a4a] pt-3\">\n <input\n type=\"text\"\n value={taskDrafts[s.alias] || ''}\n onChange={e => updateTaskDraft(s.alias, e.target.value)}\n onKeyDown={e => e.key === 'Enter' && sendTask(s.alias)}\n placeholder={`Send task to ${s.alias}...`}\n className=\"w-full rounded-lg border border-[#2a2a4a] bg-[#0a0a15] px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-cyan-500 focus:outline-none\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setTaskOpenFor(null)}\n className=\"rounded-lg border border-gray-700 px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => sendTask(s.alias)}\n disabled={state.sending || !(taskDrafts[s.alias] || '').trim()}\n className=\"rounded-lg bg-cyan-600 px-3 py-1.5 text-xs text-white hover:bg-cyan-500 disabled:cursor-not-allowed disabled:bg-gray-700\"\n >\n {state.sending ? 'Sending...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n\n {state.error && <div className=\"mt-2 text-xs text-red-400\">{state.error}</div>}\n {state.success && taskOpenFor !== s.alias && <div className=\"mt-2 text-xs text-green-400\">{state.success}</div>}\n </div>\n );\n })}\n </div>\n )}\n\n {chatAlias && <TaskChatPanel alias={chatAlias} onClose={() => setChatAlias(null)} />}\n </div>\n );\n}\n"],"names":["shortServer","server","length","slice","NodesPage","sessions","isLoading","loading","health","sseMap","sse_sessions","sseFor","s","network_id","alias","undefined","filterStatus","setFilterStatus","search","setSearch","viewMode","setViewMode","taskDrafts","setTaskDrafts","taskOpenFor","setTaskOpenFor","sendState","setSendState","chatAlias","setChatAlias","filtered","map","online","filter","status","toLowerCase","includes","agent","sort","a","b","onlineCount","openSendTask","current","prev","updateTaskDraft","value","sendTask","task","trim","sending","res","fetch","method","headers","body","JSON","stringify","data","json","ok","Error","error","success","message","className","working","idle","offline","total","style","width","type","onChange","e","target","placeholder","mode","onClick","i","variant","title","sub","statusKey","state","progress","size","href","encodeURIComponent","last_seen_at","updated_at","onKeyDown","key","disabled","onClose"],"mappings":"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"}