@sleep2agi/agent-network-dashboard 0.5.7-preview.11 → 0.5.7-preview.12

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 (184) 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 +18 -18
  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/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +2 -2
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +2 -2
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  36. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +2 -2
  40. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs.html +1 -1
  47. package/.next/server/app/logs.rsc +1 -1
  48. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  53. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  54. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/messages.html +2 -2
  56. package/.next/server/app/messages.rsc +2 -2
  57. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  58. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  61. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  63. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  64. package/.next/server/app/node.html +2 -2
  65. package/.next/server/app/node.rsc +2 -2
  66. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  67. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  70. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  72. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  73. package/.next/server/app/nodes.html +2 -2
  74. package/.next/server/app/nodes.rsc +2 -2
  75. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  77. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  79. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  81. package/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/server-logs.html +1 -1
  83. package/.next/server/app/server-logs.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  86. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  87. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  89. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  90. package/.next/server/app/servers.html +1 -1
  91. package/.next/server/app/servers.rsc +1 -1
  92. package/.next/server/app/servers.segments/_full.segment.rsc +1 -1
  93. package/.next/server/app/servers.segments/_head.segment.rsc +1 -1
  94. package/.next/server/app/servers.segments/_index.segment.rsc +1 -1
  95. package/.next/server/app/servers.segments/_tree.segment.rsc +1 -1
  96. package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
  97. package/.next/server/app/servers.segments/servers.segment.rsc +1 -1
  98. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  99. package/.next/server/app/settings/networks.html +2 -2
  100. package/.next/server/app/settings/networks.rsc +2 -2
  101. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  102. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  103. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  104. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  105. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
  106. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  107. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  108. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  109. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  110. package/.next/server/app/settings/tokens.html +2 -2
  111. package/.next/server/app/settings/tokens.rsc +2 -2
  112. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  113. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  114. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  115. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  116. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +2 -2
  117. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  118. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  119. package/.next/server/app/settings.html +2 -2
  120. package/.next/server/app/settings.rsc +2 -2
  121. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  122. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  123. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  124. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  125. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  126. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  127. package/.next/server/app/tasks.html +1 -1
  128. package/.next/server/app/tasks.rsc +1 -1
  129. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  131. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  132. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  133. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  134. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  135. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +1 -1
  136. package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -1
  137. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +1 -1
  138. package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +1 -1
  139. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  140. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  141. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +1 -1
  142. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  143. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  144. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  145. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  146. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  147. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +1 -1
  148. package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -1
  149. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +1 -1
  150. package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -1
  151. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +1 -1
  152. package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +1 -1
  153. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +1 -1
  154. package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js.map +1 -1
  155. package/.next/server/middleware-build-manifest.js +3 -3
  156. package/.next/server/pages/404.html +1 -1
  157. package/.next/server/pages/500.html +1 -1
  158. package/.next/server/server-reference-manifest.js +1 -1
  159. package/.next/server/server-reference-manifest.json +1 -1
  160. package/.next/static/chunks/{181u38qblp8lz.js → 00b-ysl~m~dr~.js} +1 -1
  161. package/.next/static/chunks/{082m-ou~6nopx.js → 05wpkysi1s2zn.js} +1 -1
  162. package/.next/static/chunks/{0im751o4n61c7.js → 063dy3uum1lns.js} +1 -1
  163. package/.next/static/chunks/{00hpbc4_15cxb.js → 0b15uis0n3276.js} +1 -1
  164. package/.next/static/chunks/{03~5pxwbxxw-b.js → 0fzfrj9t-fbn_.js} +1 -1
  165. package/.next/static/chunks/{0dq~~c79pqq8g.js → 0n9of6.-q65d..js} +1 -1
  166. package/.next/static/chunks/{0cmfkyuf7x3ip.js → 0qvnj6.7m4thb.js} +3 -3
  167. package/.next/static/chunks/{05uk96gc~9mni.js → 0ti3v67ixu43p.js} +1 -1
  168. package/.next/static/chunks/{04koh~08gofyy.js → 122ok8s~wo2i..js} +1 -1
  169. package/.next/static/chunks/{14q8_9i5izcwj.js → 15yjjo1fv.muz.js} +1 -1
  170. package/.next/trace +2 -2
  171. package/.next/trace-build +1 -1
  172. package/app/admin/page.tsx +1 -1
  173. package/app/components/DispatchPanel.tsx +1 -1
  174. package/app/components/UserBar.tsx +3 -3
  175. package/app/messages/page.tsx +1 -1
  176. package/app/node/page.tsx +1 -1
  177. package/app/nodes/page.tsx +1 -1
  178. package/app/settings/networks/page.tsx +3 -3
  179. package/app/settings/page.tsx +2 -2
  180. package/app/settings/tokens/page.tsx +1 -1
  181. package/package.json +1 -1
  182. /package/.next/static/{fBBOqrPbHswdz_woUXk6R → duL2ALbaMCSWKb2hvO93W}/_buildManifest.js +0 -0
  183. /package/.next/static/{fBBOqrPbHswdz_woUXk6R → duL2ALbaMCSWKb2hvO93W}/_clientMiddlewareManifest.js +0 -0
  184. /package/.next/static/{fBBOqrPbHswdz_woUXk6R → duL2ALbaMCSWKb2hvO93W}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../agent-network-dashboard/app/lib/time.ts","../../../../../agent-network-dashboard/app/components/utils.ts","../../../../../agent-network-dashboard/app/components/AliasAvatar.tsx","../../../../../agent-network-dashboard/app/lib/status.ts","../../../../../agent-network-dashboard/app/node/page.tsx"],"sourcesContent":["/** Shared timestamp helpers for hub-sourced data.\n *\n * Background — the CommHub serialises timestamps SQL-style without a\n * zone (\"2026-05-15 06:00:28\"), but some test data uses full ISO\n * (\"…T06:00:28Z\"). `Date.parse` on bare SQL is **local-time** in every\n * browser the dashboard supports, so a UTC+8 operator silently sees\n * every timestamp 8 h older than reality (Round 35 dug this out via\n * the `isGhost` filter mis-fire).\n *\n * Round 38 / Loop consolidates parsing — TopoGraph (R35), ChatPopover\n * (R37) and utils.ts::timeAgo all mirrored the same SQL→UTC rewrite;\n * one source of truth here. */\n\n/** Parse a hub timestamp to ms-since-epoch, treating SQL-style strings\n * as UTC. ISO strings (with `T`) bypass the rewrite and are parsed as-is.\n * Returns null for empty / unparseable input. */\nexport function parseHubTime(dateStr: string | null | undefined): number | null {\n if (!dateStr) return null;\n const iso = dateStr.includes('T') ? dateStr : dateStr.replace(' ', 'T') + 'Z';\n const t = Date.parse(iso);\n return Number.isFinite(t) ? t : null;\n}\n\n/** Format `dateStr` as a short relative-time string (\"6m ago\" / \"2h ago\").\n * Future timestamps (clock skew) collapse to \"just now\". Returns null when\n * the input doesn't parse — callers can decide on a fallback. */\nexport function relativeAgo(dateStr: string | null | undefined): string | null {\n const t = parseHubTime(dateStr);\n if (t === null) return null;\n const s = Math.floor((Date.now() - t) / 1000);\n if (s < 0) return 'just now';\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","/** Round 82: strip the most common markdown markup from agent-to-agent\n * task / message bodies so single-line table previews read cleanly.\n * Full original content stays in the expanded row / drawer / title=. */\nexport function previewContent(raw: string | null | undefined): string {\n if (!raw) return '--';\n return raw\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1') // images: ![alt](src) → alt\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1') // links: [text](href) → text\n .replace(/`([^`]+)`/g, '$1') // inline code: `x` → x\n .replace(/\\s+/g, ' ') // collapse whitespace\n .trim() || '--';\n}\n\n// Round 44 / Loop: timeAgo now delegates to the shared lib/time helper.\n// The old in-line `replace + 'Z'` parse appended a Z to already-ISO\n// inputs (producing \"…ZZ\", browser-fragile) — strict-superset semantics\n// preserved for SQL-style inputs, fixed for ISO. Plus a 'just now' fallback\n// when clock skew puts the timestamp in the future. Five callers benefit:\n// /admin · /logs · /settings/networks · InboxPanel · /messages.\nimport { relativeAgo } from '../lib/time';\nexport function timeAgo(dateStr: string): string {\n return relativeAgo(dateStr) ?? '--';\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","/** Hue-hashed avatar pill for agent aliases. Same alias → same color across\n * every page (Messages, Nodes, TopoGraph). Use the `size` prop for inline\n * pills (16/20) vs card headers (28). Round 21 introduced the palette;\n * round 22 promotes it from app/messages to a shared component. */\n\nconst AVATAR_HUES = [180, 200, 220, 270, 300, 330, 30, 90];\n\nexport function aliasAvatarColors(alias: string): { bg: string; ring: string; text: string } {\n let h = 0;\n for (let i = 0; i < alias.length; i++) h = (h * 31 + alias.charCodeAt(i)) >>> 0;\n const hue = AVATAR_HUES[h % AVATAR_HUES.length];\n return {\n bg: `hsl(${hue} 55% 22%)`,\n ring: `hsl(${hue} 60% 45%)`,\n text: `hsl(${hue} 80% 78%)`,\n };\n}\n\nexport function aliasInitial(alias?: string): string {\n if (!alias) return '·';\n const ch = alias.trim().match(/[\\p{L}\\p{N}]/u)?.[0] || alias.trim()[0] || '·';\n return ch.toUpperCase();\n}\n\nfunction isGrokAlias(alias: string) {\n return /\\bgrok\\b|grok-build|grok测试员|grok-demo/i.test(alias);\n}\n\ninterface AliasAvatarProps {\n alias: string;\n size?: number;\n className?: string;\n}\n\nexport function AliasAvatar({ alias, size = 28, className = '' }: AliasAvatarProps) {\n if (isGrokAlias(alias)) {\n return (\n <span\n className={`anet-alias-avatar inline-flex items-center justify-center rounded-full border border-emerald-500/45 bg-emerald-950/70 shrink-0 ${className}`}\n style={{\n width: size,\n height: size,\n backgroundImage: 'url(/vendors/grok.svg)',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '68% 68%',\n }}\n title={alias}\n aria-hidden\n />\n );\n }\n\n const c = aliasAvatarColors(alias);\n const fs = Math.max(9, Math.round(size * 0.42));\n return (\n <span\n className={`anet-alias-avatar inline-flex items-center justify-center rounded-full border shrink-0 font-semibold ${className}`}\n style={{\n width: size,\n height: size,\n fontSize: fs,\n backgroundColor: c.bg,\n borderColor: c.ring,\n color: c.text,\n }}\n title={alias}\n aria-hidden\n >\n {aliasInitial(alias)}\n </span>\n );\n}\n","/** Single source of truth for task status colors. Both `/tasks` (chip\n * strip, badge, distribution bar) and the Overview Recent Activity row\n * used to ship their own incomplete maps; round 66 consolidates them\n * here so adding a new status updates every consumer at once.\n *\n * Order in `TASK_STATUSES` is chronological-ish: lifecycle progress on\n * the left, terminal-good (`closed`) in the middle, terminal-bad\n * (`failed`/`cancelled`/`expired`) on the right. */\n\nexport const TASK_STATUSES = [\n 'created',\n 'delivered',\n 'acked',\n 'running',\n 'replied',\n 'closed',\n 'failed',\n 'cancelled',\n 'expired',\n] as const;\n\nexport type TaskStatus = typeof TASK_STATUSES[number];\n\n/** Pill / chip background+text+border. Tailwind classes, not inlined hex,\n * because chips are static class names safe from purge. */\nexport const STATUS_CHIP_CLASS: Record<string, string> = {\n created: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n delivered: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n acked: 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20',\n running: 'bg-green-500/10 text-green-300 border-green-500/20',\n replied: 'bg-purple-500/10 text-purple-300 border-purple-500/20',\n closed: 'bg-gray-500/10 text-gray-500 border-gray-500/20',\n failed: 'bg-red-500/10 text-red-300 border-red-500/20',\n cancelled: 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20',\n expired: 'bg-orange-500/10 text-orange-300 border-orange-500/20',\n};\n\n/** Inline hex dots — used wherever Tailwind would purge dynamic class\n * names (`bg-${family}-400`). Style attribute carries the color. */\nexport const STATUS_DOT_HEX: Record<string, string> = {\n created: '#9ca3af',\n delivered: '#60a5fa',\n acked: '#22d3ee',\n running: '#4ade80',\n replied: '#a78bfa',\n closed: '#6b7280',\n failed: '#f87171',\n cancelled: '#facc15',\n expired: '#fb923c',\n};\n\n/** Session lifecycle (distinct from task lifecycle above). Shared by\n * /nodes status pills and /admin Online Sessions row chips so an\n * agent in `blocked` state reads the same color everywhere.\n * Round 91 — extracted from app/nodes/page.tsx. */\nexport const SESSION_STATUS_CHIP_CLASS: Record<string, string> = {\n working: 'bg-green-500/10 text-green-300 border-green-500/20',\n idle: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n blocked: 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20',\n error: 'bg-red-500/10 text-red-300 border-red-500/20',\n offline: 'bg-gray-500/10 text-gray-500 border-gray-500/20',\n};\n\n/** Text-only color for session status. Used where a chip background\n * would be too heavy — e.g. /node detail header status label. */\nexport const SESSION_STATUS_TEXT_CLASS: Record<string, string> = {\n working: 'text-green-400',\n idle: 'text-blue-400',\n blocked: 'text-yellow-400',\n error: 'text-red-400',\n offline: 'text-gray-500',\n};\n\n/** Solid bar segment background for the Tasks distribution bar. */\nexport const STATUS_BAR_CLASS: Record<string, string> = {\n created: 'bg-gray-500',\n delivered: 'bg-blue-500',\n acked: 'bg-cyan-500',\n running: 'bg-green-500',\n replied: 'bg-purple-500',\n closed: 'bg-gray-600',\n failed: 'bg-red-500',\n cancelled: 'bg-yellow-500',\n expired: 'bg-orange-500',\n};\n","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport Link from 'next/link';\nimport { Suspense } from 'react';\nimport { TaskChatPanel } from '../components/TaskChatPanel';\nimport { timeAgo } from '../components/utils';\nimport { AliasAvatar } from '../components/AliasAvatar';\nimport { SESSION_STATUS_TEXT_CLASS } from '../lib/status';\nimport { useChatUnread } from '../lib/chat-unread';\n\ninterface SessionDetail {\n resume_id: string;\n alias: string;\n status: string;\n agent: string;\n server: string;\n hostname: string;\n task: string;\n output: string;\n progress: number;\n score: number;\n registered_at: string;\n updated_at: string;\n project_dir: string;\n tmux_name: string;\n ip: string;\n node_id: string;\n session_id: string;\n config_path: string;\n channels: string[];\n last_seen_at: string;\n model: string;\n version: string;\n}\n\ninterface Message {\n id: string;\n content: string;\n from_session: string;\n priority: string;\n created_at: string;\n type: string;\n}\n\nfunction TmuxViewer({ tmuxName }: { tmuxName: string }) {\n const [output, setOutput] = useState('');\n const [loading, setLoading] = useState(false);\n const [expanded, setExpanded] = useState(false);\n\n const fetchTmux = async () => {\n setLoading(true);\n try {\n const res = await fetch(`/api/hub/tmux?name=${encodeURIComponent(tmuxName)}`);\n const data = await res.json();\n setOutput(data.output || data.error || 'No output');\n } catch { setOutput('Failed to fetch'); }\n setLoading(false);\n };\n\n return (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <h2 className=\"text-sm font-semibold text-gray-300\">Terminal ({tmuxName})</h2>\n <div className=\"flex gap-2\">\n <button onClick={fetchTmux} disabled={loading}\n className=\"text-xs text-cyan-400 hover:text-cyan-300 disabled:text-gray-600\">\n {loading ? 'Loading...' : 'Capture'}\n </button>\n {output && (\n <button onClick={() => setExpanded(!expanded)} className=\"text-xs text-gray-500 hover:text-gray-300\">\n {expanded ? 'Collapse' : 'Expand'}\n </button>\n )}\n </div>\n </div>\n {output && (\n <pre className={`text-[11px] text-green-300 bg-[#050510] rounded-lg px-3 py-2 border border-[#1a1a2a] overflow-x-auto whitespace-pre font-mono ${expanded ? 'max-h-96' : 'max-h-32'} overflow-y-auto`}>\n {output}\n </pre>\n )}\n {!output && <p className=\"text-xs text-gray-600\">Click Capture to view terminal output</p>}\n </div>\n );\n}\n\nfunction NodeDetailContent() {\n const searchParams = useSearchParams();\n const alias = searchParams.get('alias') || '';\n const [session, setSession] = useState<SessionDetail | null>(null);\n const [inbox, setInbox] = useState<Message[]>([]);\n const [sse, setSse] = useState(0);\n const [error, setError] = useState('');\n const [sendMsg, setSendMsg] = useState('');\n const [sending, setSending] = useState(false);\n\n const fetchData = useCallback(async () => {\n if (!alias) return;\n try {\n const res = await fetch(`/api/hub/session?alias=${encodeURIComponent(alias)}`);\n const data = await res.json();\n if (data.session) setSession(data.session);\n if (data.inbox) setInbox(data.inbox);\n setSse(data.sse || 0);\n setError('');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n }\n }, [alias]);\n\n useEffect(() => {\n fetchData();\n const interval = setInterval(fetchData, 5000);\n return () => clearInterval(interval);\n }, [fetchData]);\n\n const [sendError, setSendError] = useState('');\n\n const sendTask = async () => {\n if (!sendMsg.trim() || !alias) return;\n setSending(true);\n setSendError('');\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: sendMsg }),\n });\n const data = await res.json();\n if (data.ok) {\n setSendMsg('');\n setTimeout(fetchData, 2000);\n } else {\n setSendError(data.error || 'Send failed');\n }\n } catch (e: unknown) {\n setSendError(e instanceof Error ? e.message : 'Send failed');\n }\n setSending(false);\n };\n\n if (!alias) {\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono flex items-center justify-center\">\n <p className=\"text-gray-500\">No alias specified. <Link href=\"/\" className=\"text-blue-400 hover:underline\">Back to dashboard</Link></p>\n </div>\n );\n }\n\n /* Round 92: shared 5-state palette (was working / idle / other,\n collapsed blocked + error into gray). */\n const statusColor = SESSION_STATUS_TEXT_CLASS[session?.status || ''] || SESSION_STATUS_TEXT_CLASS.offline;\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n {/* Header — round 40: avatar joins the alias for cross-page hue\n consistency; agent type lives in a subtitle so users know what\n kind of node they're looking at. */}\n <div className=\"flex items-center gap-3 mb-6 lg:ml-0 ml-10\">\n <Link href=\"/nodes\" className=\"text-gray-500 hover:text-gray-300 text-sm shrink-0\">&larr; Nodes</Link>\n <AliasAvatar alias={alias} size={32} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-xl sm:text-2xl font-bold text-white truncate\">{alias}</h1>\n <span className={`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${\n sse > 0 ? (session?.status === 'working' ? 'bg-green-500 animate-pulse' : 'bg-emerald-400') : 'bg-gray-500'\n }`} />\n <span className={`text-[10px] uppercase tracking-wide font-semibold ${statusColor}`}>{session?.status || 'unknown'}</span>\n </div>\n {session?.agent && (\n <div className=\"text-xs text-gray-500 truncate\">{session.agent}{session.server ? <> <span className=\"text-gray-700 mx-1\">·</span> {session.server}</> : null}</div>\n )}\n </div>\n </div>\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 {/* Full-width tabbed layout */}\n <NodeFullPanel alias={alias} session={session} sse={sse} sendMsg={sendMsg} setSendMsg={setSendMsg} sending={sending} sendTask={sendTask} sendError={sendError} />\n </div>\n );\n}\n\nfunction NodeFullPanel({ alias, session, sse, sendMsg, setSendMsg, sending, sendTask, sendError }: {\n alias: string; session: any; sse: number; sendMsg: string; setSendMsg: (v: string) => void; sending: boolean; sendTask: () => void; sendError: string;\n}) {\n const [tab, setTab] = useState<'chat' | 'events' | 'info'>('chat');\n const { hasUnread } = useChatUnread();\n const [events, setEvents] = useState<Array<{ id: number; event_type: string; from_status: string; to_status: string; detail: string; created_at: string }>>([]);\n const [eventsLoaded, setEventsLoaded] = useState(false);\n const chatUnread = hasUnread(alias);\n\n useEffect(() => {\n if (tab === 'events' && !eventsLoaded) {\n fetch('/api/hub/task-events?limit=50').then(r => r.json()).then(d => {\n setEvents(d.events || []);\n setEventsLoaded(true);\n }).catch(() => setEventsLoaded(true));\n }\n }, [tab, eventsLoaded]);\n\n return (\n <div className=\"bg-[#0d0d1a] border border-[#2a2a4a] rounded-xl overflow-hidden h-[calc(100vh-140px)] flex flex-col\">\n {/* Tab bar — round 40: emoji icons (💬 📋 📊) replaced with stroke\n SVG to drop the \"AI generated\" tell. */}\n <div className=\"flex border-b border-[#2a2a4a] bg-[#0a0a15] shrink-0\">\n {([\n { id: 'chat', label: 'Chat', icon: 'M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z' },\n { id: 'events', label: 'Events', icon: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8' },\n { id: 'info', label: 'Info', icon: 'M12 21a9 9 0 100-18 9 9 0 000 18z M12 8h.01 M11 12h1v4h1' },\n ] as const).map(t => (\n <button key={t.id} onClick={() => setTab(t.id)}\n className={`flex items-center gap-2 px-5 py-3 text-sm font-medium border-b-2 transition-colors ${\n tab === t.id ? 'border-cyan-400 text-cyan-300' : 'border-transparent text-gray-500 hover:text-gray-300'\n }`}>\n <svg className=\"w-4 h-4 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={t.icon} />\n </svg>\n <span className=\"relative inline-flex items-center gap-2\">\n {t.label}\n {t.id === 'chat' && chatUnread && tab !== 'chat' && (\n <span className=\"inline-block h-2.5 w-2.5 rounded-full bg-red-500\" aria-label=\"Unread chat messages\" />\n )}\n </span>\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"flex-1 overflow-hidden\">\n {tab === 'chat' && (\n <TaskChatPanel alias={alias} onClose={() => {}} inline />\n )}\n\n {tab === 'events' && (\n <EventsTimeline events={events} loading={!eventsLoaded} />\n )}\n\n {tab === 'info' && (\n <div className=\"p-4 overflow-y-auto h-full space-y-4 max-w-2xl\">\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-3\">Node Info</h2>\n <div className=\"space-y-2 text-xs\">\n {[\n { label: 'Node ID', value: session?.node_id, alwaysShow: true },\n { label: 'Session ID', value: session?.session_id, alwaysShow: true },\n { label: 'Resume ID', value: session?.resume_id, alwaysShow: true },\n { label: 'Alias', value: session?.alias, alwaysShow: true },\n { label: 'Agent', value: session?.agent, alwaysShow: true },\n { label: 'Model', value: session?.model, alwaysShow: true },\n { label: 'Version', value: session?.version },\n { label: 'Server', value: session?.server, alwaysShow: true },\n { label: 'Hostname', value: session?.hostname, alwaysShow: true },\n { label: 'IP', value: session?.ip, alwaysShow: true },\n { label: 'Project', value: session?.project_dir },\n { label: 'Config', value: session?.config_path, alwaysShow: true },\n { label: 'Channels', value: session?.channels?.length ? (Array.isArray(session.channels) ? session.channels.join(', ') : session.channels) : null, alwaysShow: true },\n { label: 'Tmux', value: session?.tmux_name },\n { label: 'SSE', value: sse > 0 ? `Connected (${sse})` : 'Disconnected', alwaysShow: true },\n { label: 'Progress', value: session?.progress ? `${session.progress}%` : null },\n { label: 'Score', value: session?.score },\n { label: 'Last Seen', value: session?.last_seen_at, alwaysShow: true },\n { label: 'Registered', value: session?.registered_at, alwaysShow: true },\n { label: 'Updated', value: session?.updated_at, alwaysShow: true },\n ].map(({ label, value, alwaysShow }) => (value || alwaysShow) ? (\n <div key={label} className=\"flex justify-between gap-3\">\n <span className=\"text-gray-500 shrink-0\">{label}</span>\n <span className=\"text-gray-300 truncate max-w-[200px]\" title={value ? String(value) : '--'}>\n {value ? String(value) : '--'}\n </span>\n </div>\n ) : null)}\n </div>\n </div>\n\n {/* Current Task */}\n {session?.task && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-2\">Current Task</h2>\n <p className=\"text-xs text-gray-400 whitespace-pre-wrap\">{session.task}</p>\n </div>\n )}\n\n {/* Output */}\n {session?.output && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-2\">Last Output</h2>\n <p className=\"text-xs text-gray-400 whitespace-pre-wrap max-h-48 overflow-y-auto\">{session.output}</p>\n </div>\n )}\n\n {/* Send Task */}\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-2\">Send Task</h2>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={sendMsg}\n onChange={e => setSendMsg(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && sendTask()}\n placeholder={`Send task to ${alias}...`}\n className=\"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:border-blue-500 focus:outline-none\"\n />\n <button\n onClick={sendTask}\n disabled={sending || !sendMsg.trim()}\n className=\"px-3 py-2 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-700 text-white text-xs rounded transition-colors\"\n >\n {sending ? '...' : 'Send'}\n </button>\n </div>\n {sendError && <div className=\"mt-2 text-xs text-red-400\">{sendError}</div>}\n </div>\n\n {/* Tmux Terminal */}\n {session?.tmux_name && (\n <TmuxViewer tmuxName={session.tmux_name} />\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/** Round 59: emoji icons replaced with stroke SVG paths to drop the\n * \"AI generated\" tell. Each path is sized to fit inside the 18px\n * colored event dot. */\nconst EVENT_COLORS: Record<string, { dot: string; line: string; path: string }> = {\n delivered: { dot: 'bg-blue-400', line: 'bg-blue-500/30', path: 'M12 5v14 M5 12l7 7 7-7' }, // down arrow\n acked: { dot: 'bg-yellow-400', line: 'bg-yellow-500/30', path: 'M20 6 9 17l-5-5' }, // check\n running: { dot: 'bg-green-400', line: 'bg-green-500/30', path: 'M13 2L4 14h6l-1 8 10-12h-6l1-8z' }, // bolt\n replied: { dot: 'bg-purple-400', line: 'bg-purple-500/30', path: 'M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z' }, // chat bubble\n failed: { dot: 'bg-red-400', line: 'bg-red-500/30', path: 'M18 6 6 18 M6 6l12 12' }, // X\n created: { dot: 'bg-gray-400', line: 'bg-gray-500/30', path: 'M12 5v14 M5 12h14' }, // plus\n};\n\nfunction EventsTimeline({ events, loading }: { events: Array<{ id: number; event_type: string; from_status: string; to_status: string; detail: string; created_at: string; task_id?: string }>; loading: boolean }) {\n if (loading) return <div className=\"flex justify-center py-8\"><div className=\"w-5 h-5 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin\" /></div>;\n if (events.length === 0) return <div className=\"text-center py-12 text-gray-600 text-xs\">No task events yet</div>;\n\n // Group by task_id\n const groups = new Map<string, typeof events>();\n events.forEach(e => {\n const key = (e as { task_id?: string }).task_id || `ungrouped-${e.id}`;\n const group = groups.get(key) || [];\n group.push(e);\n groups.set(key, group);\n });\n\n return (\n <div className=\"p-4 overflow-y-auto h-full space-y-4\">\n {[...groups.entries()].map(([taskId, taskEvents]) => (\n <div key={taskId} className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-[10px] text-gray-600 mb-3 truncate\">Task: {taskId.slice(0, 20)}...</div>\n <div className=\"relative pl-6\">\n {/* Vertical line */}\n <div className=\"absolute left-[9px] top-2 bottom-2 w-0.5 bg-[#1a1a2a]\" />\n\n {taskEvents.map((e, i) => {\n const cfg = EVENT_COLORS[e.to_status] || EVENT_COLORS.created;\n return (\n <div key={e.id} className=\"relative pb-4 last:pb-0\">\n {/* Dot on line — round 59: emoji icons replaced with\n a 10px stroke SVG path matching event type. */}\n <div className={`absolute -left-6 top-0.5 w-[18px] h-[18px] rounded-full ${cfg.dot} flex items-center justify-center z-10 border-2 border-[#111128]`}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0a0a15\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={cfg.path} />\n </svg>\n </div>\n {/* Content */}\n <div className=\"ml-2\">\n <div className=\"flex items-center gap-2\">\n <span className={`text-xs font-medium ${e.to_status === 'failed' ? 'text-red-400' : e.to_status === 'replied' ? 'text-purple-400' : 'text-gray-300'}`}>\n {e.event_type}\n </span>\n {e.from_status && (\n <span className=\"text-[10px] text-gray-600\">{e.from_status} → {e.to_status}</span>\n )}\n <span className=\"text-[10px] text-gray-600 ml-auto\">{timeAgo(e.created_at)}</span>\n </div>\n {e.detail && (\n <div className=\"text-[11px] text-gray-500 mt-0.5 truncate\">{e.detail.slice(0, 50)}{e.detail.length > 50 ? '...' : ''}</div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport default function NodePage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono\">Loading...</div>}>\n <NodeDetailContent />\n </Suspense>\n );\n}\n"],"names":["parseHubTime","dateStr","iso","includes","replace","t","Date","parse","Number","isFinite","relativeAgo","s","Math","floor","now","AVATAR_HUES","aliasAvatarColors","alias","h","i","length","charCodeAt","hue","bg","ring","text","aliasInitial","ch","trim","match","toUpperCase","isGrokAlias","test","AliasAvatar","size","className","style","width","height","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","title","c","fs","max","round","fontSize","backgroundColor","borderColor","color","TASK_STATUSES","STATUS_CHIP_CLASS","created","delivered","acked","running","replied","closed","failed","cancelled","expired","STATUS_DOT_HEX","SESSION_STATUS_CHIP_CLASS","working","idle","blocked","error","offline","SESSION_STATUS_TEXT_CLASS","STATUS_BAR_CLASS","TmuxViewer","tmuxName","output","setOutput","loading","setLoading","expanded","setExpanded","fetchTmux","res","fetch","encodeURIComponent","data","json","onClick","disabled","NodeDetailContent","searchParams","get","session","setSession","inbox","setInbox","sse","setSse","setError","sendMsg","setSendMsg","sending","setSending","fetchData","e","Error","message","interval","setInterval","clearInterval","sendError","setSendError","sendTask","method","headers","body","JSON","stringify","task","ok","setTimeout","href","statusColor","status","agent","server","NodeFullPanel","tab","setTab","hasUnread","events","setEvents","eventsLoaded","setEventsLoaded","chatUnread","then","r","d","catch","id","label","icon","map","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","onClose","inline","EventsTimeline","value","node_id","alwaysShow","session_id","resume_id","model","version","hostname","ip","project_dir","config_path","channels","Array","isArray","join","tmux_name","progress","score","last_seen_at","registered_at","updated_at","String","type","onChange","target","onKeyDown","key","placeholder","EVENT_COLORS","dot","line","path","groups","Map","forEach","task_id","group","push","set","entries","taskId","taskEvents","slice","cfg","to_status","event_type","from_status","created_at","detail","NodePage","fallback"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../agent-network-dashboard/app/lib/time.ts","../../../../../agent-network-dashboard/app/components/utils.ts","../../../../../agent-network-dashboard/app/components/AliasAvatar.tsx","../../../../../agent-network-dashboard/app/lib/status.ts","../../../../../agent-network-dashboard/app/node/page.tsx"],"sourcesContent":["/** Shared timestamp helpers for hub-sourced data.\n *\n * Background — the CommHub serialises timestamps SQL-style without a\n * zone (\"2026-05-15 06:00:28\"), but some test data uses full ISO\n * (\"…T06:00:28Z\"). `Date.parse` on bare SQL is **local-time** in every\n * browser the dashboard supports, so a UTC+8 operator silently sees\n * every timestamp 8 h older than reality (Round 35 dug this out via\n * the `isGhost` filter mis-fire).\n *\n * Round 38 / Loop consolidates parsing — TopoGraph (R35), ChatPopover\n * (R37) and utils.ts::timeAgo all mirrored the same SQL→UTC rewrite;\n * one source of truth here. */\n\n/** Parse a hub timestamp to ms-since-epoch, treating SQL-style strings\n * as UTC. ISO strings (with `T`) bypass the rewrite and are parsed as-is.\n * Returns null for empty / unparseable input. */\nexport function parseHubTime(dateStr: string | null | undefined): number | null {\n if (!dateStr) return null;\n const iso = dateStr.includes('T') ? dateStr : dateStr.replace(' ', 'T') + 'Z';\n const t = Date.parse(iso);\n return Number.isFinite(t) ? t : null;\n}\n\n/** Format `dateStr` as a short relative-time string (\"6m ago\" / \"2h ago\").\n * Future timestamps (clock skew) collapse to \"just now\". Returns null when\n * the input doesn't parse — callers can decide on a fallback. */\nexport function relativeAgo(dateStr: string | null | undefined): string | null {\n const t = parseHubTime(dateStr);\n if (t === null) return null;\n const s = Math.floor((Date.now() - t) / 1000);\n if (s < 0) return 'just now';\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","/** Round 82: strip the most common markdown markup from agent-to-agent\n * task / message bodies so single-line table previews read cleanly.\n * Full original content stays in the expanded row / drawer / title=. */\nexport function previewContent(raw: string | null | undefined): string {\n if (!raw) return '--';\n return raw\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1') // images: ![alt](src) → alt\n .replace(/\\[([^\\]]+)\\]\\([^)]*\\)/g, '$1') // links: [text](href) → text\n .replace(/`([^`]+)`/g, '$1') // inline code: `x` → x\n .replace(/\\s+/g, ' ') // collapse whitespace\n .trim() || '--';\n}\n\n// Round 44 / Loop: timeAgo now delegates to the shared lib/time helper.\n// The old in-line `replace + 'Z'` parse appended a Z to already-ISO\n// inputs (producing \"…ZZ\", browser-fragile) — strict-superset semantics\n// preserved for SQL-style inputs, fixed for ISO. Plus a 'just now' fallback\n// when clock skew puts the timestamp in the future. Five callers benefit:\n// /admin · /logs · /settings/networks · InboxPanel · /messages.\nimport { relativeAgo } from '../lib/time';\nexport function timeAgo(dateStr: string): string {\n return relativeAgo(dateStr) ?? '--';\n}\n\nexport function statusColor(status: string, hasSse: boolean): string {\n if (hasSse && status === 'working') return 'bg-green-500';\n if (hasSse && status === 'idle') return 'bg-emerald-400';\n if (hasSse) return 'bg-blue-400';\n if (status === 'offline') return 'bg-gray-500';\n return 'bg-yellow-400';\n}\n\nexport function formatUptime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n","/** Hue-hashed avatar pill for agent aliases. Same alias → same color across\n * every page (Messages, Nodes, TopoGraph). Use the `size` prop for inline\n * pills (16/20) vs card headers (28). Round 21 introduced the palette;\n * round 22 promotes it from app/messages to a shared component. */\n\nconst AVATAR_HUES = [180, 200, 220, 270, 300, 330, 30, 90];\n\nexport function aliasAvatarColors(alias: string): { bg: string; ring: string; text: string } {\n let h = 0;\n for (let i = 0; i < alias.length; i++) h = (h * 31 + alias.charCodeAt(i)) >>> 0;\n const hue = AVATAR_HUES[h % AVATAR_HUES.length];\n return {\n bg: `hsl(${hue} 55% 22%)`,\n ring: `hsl(${hue} 60% 45%)`,\n text: `hsl(${hue} 80% 78%)`,\n };\n}\n\nexport function aliasInitial(alias?: string): string {\n if (!alias) return '·';\n const ch = alias.trim().match(/[\\p{L}\\p{N}]/u)?.[0] || alias.trim()[0] || '·';\n return ch.toUpperCase();\n}\n\nfunction isGrokAlias(alias: string) {\n return /\\bgrok\\b|grok-build|grok测试员|grok-demo/i.test(alias);\n}\n\ninterface AliasAvatarProps {\n alias: string;\n size?: number;\n className?: string;\n}\n\nexport function AliasAvatar({ alias, size = 28, className = '' }: AliasAvatarProps) {\n if (isGrokAlias(alias)) {\n return (\n <span\n className={`anet-alias-avatar inline-flex items-center justify-center rounded-full border border-emerald-500/45 bg-emerald-950/70 shrink-0 ${className}`}\n style={{\n width: size,\n height: size,\n backgroundImage: 'url(/vendors/grok.svg)',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '68% 68%',\n }}\n title={alias}\n aria-hidden\n />\n );\n }\n\n const c = aliasAvatarColors(alias);\n const fs = Math.max(9, Math.round(size * 0.42));\n return (\n <span\n className={`anet-alias-avatar inline-flex items-center justify-center rounded-full border shrink-0 font-semibold ${className}`}\n style={{\n width: size,\n height: size,\n fontSize: fs,\n backgroundColor: c.bg,\n borderColor: c.ring,\n color: c.text,\n }}\n title={alias}\n aria-hidden\n >\n {aliasInitial(alias)}\n </span>\n );\n}\n","/** Single source of truth for task status colors. Both `/tasks` (chip\n * strip, badge, distribution bar) and the Overview Recent Activity row\n * used to ship their own incomplete maps; round 66 consolidates them\n * here so adding a new status updates every consumer at once.\n *\n * Order in `TASK_STATUSES` is chronological-ish: lifecycle progress on\n * the left, terminal-good (`closed`) in the middle, terminal-bad\n * (`failed`/`cancelled`/`expired`) on the right. */\n\nexport const TASK_STATUSES = [\n 'created',\n 'delivered',\n 'acked',\n 'running',\n 'replied',\n 'closed',\n 'failed',\n 'cancelled',\n 'expired',\n] as const;\n\nexport type TaskStatus = typeof TASK_STATUSES[number];\n\n/** Pill / chip background+text+border. Tailwind classes, not inlined hex,\n * because chips are static class names safe from purge. */\nexport const STATUS_CHIP_CLASS: Record<string, string> = {\n created: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n delivered: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n acked: 'bg-cyan-500/10 text-cyan-300 border-cyan-500/20',\n running: 'bg-green-500/10 text-green-300 border-green-500/20',\n replied: 'bg-purple-500/10 text-purple-300 border-purple-500/20',\n closed: 'bg-gray-500/10 text-gray-500 border-gray-500/20',\n failed: 'bg-red-500/10 text-red-300 border-red-500/20',\n cancelled: 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20',\n expired: 'bg-orange-500/10 text-orange-300 border-orange-500/20',\n};\n\n/** Inline hex dots — used wherever Tailwind would purge dynamic class\n * names (`bg-${family}-400`). Style attribute carries the color. */\nexport const STATUS_DOT_HEX: Record<string, string> = {\n created: '#9ca3af',\n delivered: '#60a5fa',\n acked: '#22d3ee',\n running: '#4ade80',\n replied: '#a78bfa',\n closed: '#6b7280',\n failed: '#f87171',\n cancelled: '#facc15',\n expired: '#fb923c',\n};\n\n/** Session lifecycle (distinct from task lifecycle above). Shared by\n * /nodes status pills and /admin Online Sessions row chips so an\n * agent in `blocked` state reads the same color everywhere.\n * Round 91 — extracted from app/nodes/page.tsx. */\nexport const SESSION_STATUS_CHIP_CLASS: Record<string, string> = {\n working: 'bg-green-500/10 text-green-300 border-green-500/20',\n idle: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n blocked: 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20',\n error: 'bg-red-500/10 text-red-300 border-red-500/20',\n offline: 'bg-gray-500/10 text-gray-500 border-gray-500/20',\n};\n\n/** Text-only color for session status. Used where a chip background\n * would be too heavy — e.g. /node detail header status label. */\nexport const SESSION_STATUS_TEXT_CLASS: Record<string, string> = {\n working: 'text-green-400',\n idle: 'text-blue-400',\n blocked: 'text-yellow-400',\n error: 'text-red-400',\n offline: 'text-gray-500',\n};\n\n/** Solid bar segment background for the Tasks distribution bar. */\nexport const STATUS_BAR_CLASS: Record<string, string> = {\n created: 'bg-gray-500',\n delivered: 'bg-blue-500',\n acked: 'bg-cyan-500',\n running: 'bg-green-500',\n replied: 'bg-purple-500',\n closed: 'bg-gray-600',\n failed: 'bg-red-500',\n cancelled: 'bg-yellow-500',\n expired: 'bg-orange-500',\n};\n","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport Link from 'next/link';\nimport { Suspense } from 'react';\nimport { TaskChatPanel } from '../components/TaskChatPanel';\nimport { timeAgo } from '../components/utils';\nimport { AliasAvatar } from '../components/AliasAvatar';\nimport { SESSION_STATUS_TEXT_CLASS } from '../lib/status';\nimport { useChatUnread } from '../lib/chat-unread';\n\ninterface SessionDetail {\n resume_id: string;\n alias: string;\n status: string;\n agent: string;\n server: string;\n hostname: string;\n task: string;\n output: string;\n progress: number;\n score: number;\n registered_at: string;\n updated_at: string;\n project_dir: string;\n tmux_name: string;\n ip: string;\n node_id: string;\n session_id: string;\n config_path: string;\n channels: string[];\n last_seen_at: string;\n model: string;\n version: string;\n}\n\ninterface Message {\n id: string;\n content: string;\n from_session: string;\n priority: string;\n created_at: string;\n type: string;\n}\n\nfunction TmuxViewer({ tmuxName }: { tmuxName: string }) {\n const [output, setOutput] = useState('');\n const [loading, setLoading] = useState(false);\n const [expanded, setExpanded] = useState(false);\n\n const fetchTmux = async () => {\n setLoading(true);\n try {\n const res = await fetch(`/api/hub/tmux?name=${encodeURIComponent(tmuxName)}`);\n const data = await res.json();\n setOutput(data.output || data.error || 'No output');\n } catch { setOutput('Failed to fetch'); }\n setLoading(false);\n };\n\n return (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <h2 className=\"text-sm font-semibold text-gray-300\">Terminal ({tmuxName})</h2>\n <div className=\"flex gap-2\">\n <button onClick={fetchTmux} disabled={loading}\n className=\"text-xs text-cyan-400 hover:text-cyan-300 disabled:text-gray-600\">\n {loading ? 'Loading...' : 'Capture'}\n </button>\n {output && (\n <button onClick={() => setExpanded(!expanded)} className=\"text-xs text-gray-500 hover:text-gray-300\">\n {expanded ? 'Collapse' : 'Expand'}\n </button>\n )}\n </div>\n </div>\n {output && (\n <pre className={`text-[11px] text-green-300 bg-[#050510] rounded-lg px-3 py-2 border border-[#1a1a2a] overflow-x-auto whitespace-pre font-mono ${expanded ? 'max-h-96' : 'max-h-32'} overflow-y-auto`}>\n {output}\n </pre>\n )}\n {!output && <p className=\"text-xs text-gray-600\">Click Capture to view terminal output</p>}\n </div>\n );\n}\n\nfunction NodeDetailContent() {\n const searchParams = useSearchParams();\n const alias = searchParams.get('alias') || '';\n const [session, setSession] = useState<SessionDetail | null>(null);\n const [inbox, setInbox] = useState<Message[]>([]);\n const [sse, setSse] = useState(0);\n const [error, setError] = useState('');\n const [sendMsg, setSendMsg] = useState('');\n const [sending, setSending] = useState(false);\n\n const fetchData = useCallback(async () => {\n if (!alias) return;\n try {\n const res = await fetch(`/api/hub/session?alias=${encodeURIComponent(alias)}`);\n const data = await res.json();\n if (data.session) setSession(data.session);\n if (data.inbox) setInbox(data.inbox);\n setSse(data.sse || 0);\n setError('');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n }\n }, [alias]);\n\n useEffect(() => {\n fetchData();\n const interval = setInterval(fetchData, 5000);\n return () => clearInterval(interval);\n }, [fetchData]);\n\n const [sendError, setSendError] = useState('');\n\n const sendTask = async () => {\n if (!sendMsg.trim() || !alias) return;\n setSending(true);\n setSendError('');\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: sendMsg }),\n });\n const data = await res.json();\n if (data.ok) {\n setSendMsg('');\n setTimeout(fetchData, 2000);\n } else {\n setSendError(data.error || 'Send failed');\n }\n } catch (e: unknown) {\n setSendError(e instanceof Error ? e.message : 'Send failed');\n }\n setSending(false);\n };\n\n if (!alias) {\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono flex items-center justify-center\">\n <p className=\"text-gray-500\">No alias specified. <Link href=\"/\" className=\"text-blue-400 hover:underline\">Back to dashboard</Link></p>\n </div>\n );\n }\n\n /* Round 92: shared 5-state palette (was working / idle / other,\n collapsed blocked + error into gray). */\n const statusColor = SESSION_STATUS_TEXT_CLASS[session?.status || ''] || SESSION_STATUS_TEXT_CLASS.offline;\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n {/* Header — round 40: avatar joins the alias for cross-page hue\n consistency; agent type lives in a subtitle so users know what\n kind of node they're looking at. */}\n <div className=\"flex items-center gap-3 mb-6 lg:ml-0 ml-10\">\n <Link href=\"/nodes\" className=\"text-gray-500 hover:text-gray-300 text-sm shrink-0\">&larr; Nodes</Link>\n <AliasAvatar alias={alias} size={32} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-xl sm:text-2xl font-bold text-white truncate\">{alias}</h1>\n <span className={`inline-block w-1.5 h-1.5 rounded-full shrink-0 ${\n sse > 0 ? (session?.status === 'working' ? 'bg-green-500 animate-pulse' : 'bg-emerald-400') : 'bg-gray-500'\n }`} />\n <span className={`text-[10px] uppercase tracking-wide font-semibold ${statusColor}`}>{session?.status || 'unknown'}</span>\n </div>\n {session?.agent && (\n <div className=\"text-xs text-gray-500 truncate\">{session.agent}{session.server ? <> <span className=\"text-gray-700 mx-1\">·</span> {session.server}</> : null}</div>\n )}\n </div>\n </div>\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 {/* Full-width tabbed layout */}\n <NodeFullPanel alias={alias} session={session} sse={sse} sendMsg={sendMsg} setSendMsg={setSendMsg} sending={sending} sendTask={sendTask} sendError={sendError} />\n </div>\n );\n}\n\nfunction NodeFullPanel({ alias, session, sse, sendMsg, setSendMsg, sending, sendTask, sendError }: {\n alias: string; session: any; sse: number; sendMsg: string; setSendMsg: (v: string) => void; sending: boolean; sendTask: () => void; sendError: string;\n}) {\n const [tab, setTab] = useState<'chat' | 'events' | 'info'>('chat');\n const { hasUnread } = useChatUnread();\n const [events, setEvents] = useState<Array<{ id: number; event_type: string; from_status: string; to_status: string; detail: string; created_at: string }>>([]);\n const [eventsLoaded, setEventsLoaded] = useState(false);\n const chatUnread = hasUnread(alias);\n\n useEffect(() => {\n if (tab === 'events' && !eventsLoaded) {\n fetch('/api/hub/task-events?limit=50').then(r => r.json()).then(d => {\n setEvents(d.events || []);\n setEventsLoaded(true);\n }).catch(() => setEventsLoaded(true));\n }\n }, [tab, eventsLoaded]);\n\n return (\n <div className=\"bg-[#0d0d1a] border border-[#2a2a4a] rounded-xl overflow-hidden h-[calc(100vh-140px)] flex flex-col\">\n {/* Tab bar — round 40: emoji icons (💬 📋 📊) replaced with stroke\n SVG to drop the \"AI generated\" tell. */}\n <div className=\"flex border-b border-[#2a2a4a] bg-[#0a0a15] shrink-0\">\n {([\n { id: 'chat', label: 'Chat', icon: 'M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z' },\n { id: 'events', label: 'Events', icon: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8' },\n { id: 'info', label: 'Info', icon: 'M12 21a9 9 0 100-18 9 9 0 000 18z M12 8h.01 M11 12h1v4h1' },\n ] as const).map(t => (\n <button key={t.id} onClick={() => setTab(t.id)}\n className={`flex items-center gap-2 px-5 py-3 text-sm font-medium border-b-2 transition-colors ${\n tab === t.id ? 'border-cyan-400 text-cyan-300' : 'border-transparent text-gray-500 hover:text-gray-300'\n }`}>\n <svg className=\"w-4 h-4 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d={t.icon} />\n </svg>\n <span className=\"relative inline-flex items-center gap-2\">\n {t.label}\n {t.id === 'chat' && chatUnread && tab !== 'chat' && (\n <span className=\"inline-block h-2.5 w-2.5 rounded-full bg-red-500\" aria-label=\"Unread chat messages\" />\n )}\n </span>\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"flex-1 overflow-hidden\">\n {tab === 'chat' && (\n <TaskChatPanel alias={alias} onClose={() => {}} inline />\n )}\n\n {tab === 'events' && (\n <EventsTimeline events={events} loading={!eventsLoaded} />\n )}\n\n {tab === 'info' && (\n <div className=\"p-4 overflow-y-auto h-full space-y-4 max-w-2xl\">\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-3\">Node Info</h2>\n <div className=\"space-y-2 text-xs\">\n {[\n { label: 'Node ID', value: session?.node_id, alwaysShow: true },\n { label: 'Session ID', value: session?.session_id, alwaysShow: true },\n { label: 'Resume ID', value: session?.resume_id, alwaysShow: true },\n { label: 'Alias', value: session?.alias, alwaysShow: true },\n { label: 'Agent', value: session?.agent, alwaysShow: true },\n { label: 'Model', value: session?.model, alwaysShow: true },\n { label: 'Version', value: session?.version },\n { label: 'Server', value: session?.server, alwaysShow: true },\n { label: 'Hostname', value: session?.hostname, alwaysShow: true },\n { label: 'IP', value: session?.ip, alwaysShow: true },\n { label: 'Project', value: session?.project_dir },\n { label: 'Config', value: session?.config_path, alwaysShow: true },\n { label: 'Channels', value: session?.channels?.length ? (Array.isArray(session.channels) ? session.channels.join(', ') : session.channels) : null, alwaysShow: true },\n { label: 'Tmux', value: session?.tmux_name },\n { label: 'SSE', value: sse > 0 ? `Connected (${sse})` : 'Disconnected', alwaysShow: true },\n { label: 'Progress', value: session?.progress ? `${session.progress}%` : null },\n { label: 'Score', value: session?.score },\n { label: 'Last Seen', value: session?.last_seen_at, alwaysShow: true },\n { label: 'Registered', value: session?.registered_at, alwaysShow: true },\n { label: 'Updated', value: session?.updated_at, alwaysShow: true },\n ].map(({ label, value, alwaysShow }) => (value || alwaysShow) ? (\n <div key={label} className=\"flex justify-between gap-3\">\n <span className=\"text-gray-500 shrink-0\">{label}</span>\n <span className=\"text-gray-300 truncate max-w-[200px]\" title={value ? String(value) : '--'}>\n {value ? String(value) : '--'}\n </span>\n </div>\n ) : null)}\n </div>\n </div>\n\n {/* Current Task */}\n {session?.task && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-2\">Current Task</h2>\n <p className=\"text-xs text-gray-400 whitespace-pre-wrap\">{session.task}</p>\n </div>\n )}\n\n {/* Output */}\n {session?.output && (\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-2\">Last Output</h2>\n <p className=\"text-xs text-gray-400 whitespace-pre-wrap max-h-48 overflow-y-auto\">{session.output}</p>\n </div>\n )}\n\n {/* Send Task */}\n <div className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-2\">Send Task</h2>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={sendMsg}\n onChange={e => setSendMsg(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && sendTask()}\n placeholder={`Send task to ${alias}...`}\n className=\"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-base sm:text-xs text-white placeholder-gray-600 focus:border-blue-500 focus:outline-none\"\n />\n <button\n onClick={sendTask}\n disabled={sending || !sendMsg.trim()}\n className=\"px-3 py-2 bg-blue-600 hover:bg-blue-500 disabled:bg-gray-700 text-white text-xs rounded transition-colors\"\n >\n {sending ? '...' : 'Send'}\n </button>\n </div>\n {sendError && <div className=\"mt-2 text-xs text-red-400\">{sendError}</div>}\n </div>\n\n {/* Tmux Terminal */}\n {session?.tmux_name && (\n <TmuxViewer tmuxName={session.tmux_name} />\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/** Round 59: emoji icons replaced with stroke SVG paths to drop the\n * \"AI generated\" tell. Each path is sized to fit inside the 18px\n * colored event dot. */\nconst EVENT_COLORS: Record<string, { dot: string; line: string; path: string }> = {\n delivered: { dot: 'bg-blue-400', line: 'bg-blue-500/30', path: 'M12 5v14 M5 12l7 7 7-7' }, // down arrow\n acked: { dot: 'bg-yellow-400', line: 'bg-yellow-500/30', path: 'M20 6 9 17l-5-5' }, // check\n running: { dot: 'bg-green-400', line: 'bg-green-500/30', path: 'M13 2L4 14h6l-1 8 10-12h-6l1-8z' }, // bolt\n replied: { dot: 'bg-purple-400', line: 'bg-purple-500/30', path: 'M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z' }, // chat bubble\n failed: { dot: 'bg-red-400', line: 'bg-red-500/30', path: 'M18 6 6 18 M6 6l12 12' }, // X\n created: { dot: 'bg-gray-400', line: 'bg-gray-500/30', path: 'M12 5v14 M5 12h14' }, // plus\n};\n\nfunction EventsTimeline({ events, loading }: { events: Array<{ id: number; event_type: string; from_status: string; to_status: string; detail: string; created_at: string; task_id?: string }>; loading: boolean }) {\n if (loading) return <div className=\"flex justify-center py-8\"><div className=\"w-5 h-5 border-2 border-cyan-500/30 border-t-cyan-500 rounded-full animate-spin\" /></div>;\n if (events.length === 0) return <div className=\"text-center py-12 text-gray-600 text-xs\">No task events yet</div>;\n\n // Group by task_id\n const groups = new Map<string, typeof events>();\n events.forEach(e => {\n const key = (e as { task_id?: string }).task_id || `ungrouped-${e.id}`;\n const group = groups.get(key) || [];\n group.push(e);\n groups.set(key, group);\n });\n\n return (\n <div className=\"p-4 overflow-y-auto h-full space-y-4\">\n {[...groups.entries()].map(([taskId, taskEvents]) => (\n <div key={taskId} className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-4\">\n <div className=\"text-[10px] text-gray-600 mb-3 truncate\">Task: {taskId.slice(0, 20)}...</div>\n <div className=\"relative pl-6\">\n {/* Vertical line */}\n <div className=\"absolute left-[9px] top-2 bottom-2 w-0.5 bg-[#1a1a2a]\" />\n\n {taskEvents.map((e, i) => {\n const cfg = EVENT_COLORS[e.to_status] || EVENT_COLORS.created;\n return (\n <div key={e.id} className=\"relative pb-4 last:pb-0\">\n {/* Dot on line — round 59: emoji icons replaced with\n a 10px stroke SVG path matching event type. */}\n <div className={`absolute -left-6 top-0.5 w-[18px] h-[18px] rounded-full ${cfg.dot} flex items-center justify-center z-10 border-2 border-[#111128]`}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0a0a15\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={cfg.path} />\n </svg>\n </div>\n {/* Content */}\n <div className=\"ml-2\">\n <div className=\"flex items-center gap-2\">\n <span className={`text-xs font-medium ${e.to_status === 'failed' ? 'text-red-400' : e.to_status === 'replied' ? 'text-purple-400' : 'text-gray-300'}`}>\n {e.event_type}\n </span>\n {e.from_status && (\n <span className=\"text-[10px] text-gray-600\">{e.from_status} → {e.to_status}</span>\n )}\n <span className=\"text-[10px] text-gray-600 ml-auto\">{timeAgo(e.created_at)}</span>\n </div>\n {e.detail && (\n <div className=\"text-[11px] text-gray-500 mt-0.5 truncate\">{e.detail.slice(0, 50)}{e.detail.length > 50 ? '...' : ''}</div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport default function NodePage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-6 font-mono\">Loading...</div>}>\n <NodeDetailContent />\n </Suspense>\n );\n}\n"],"names":["parseHubTime","dateStr","iso","includes","replace","t","Date","parse","Number","isFinite","relativeAgo","s","Math","floor","now","AVATAR_HUES","aliasAvatarColors","alias","h","i","length","charCodeAt","hue","bg","ring","text","aliasInitial","ch","trim","match","toUpperCase","isGrokAlias","test","AliasAvatar","size","className","style","width","height","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","title","c","fs","max","round","fontSize","backgroundColor","borderColor","color","TASK_STATUSES","STATUS_CHIP_CLASS","created","delivered","acked","running","replied","closed","failed","cancelled","expired","STATUS_DOT_HEX","SESSION_STATUS_CHIP_CLASS","working","idle","blocked","error","offline","SESSION_STATUS_TEXT_CLASS","STATUS_BAR_CLASS","TmuxViewer","tmuxName","output","setOutput","loading","setLoading","expanded","setExpanded","fetchTmux","res","fetch","encodeURIComponent","data","json","onClick","disabled","NodeDetailContent","searchParams","get","session","setSession","inbox","setInbox","sse","setSse","setError","sendMsg","setSendMsg","sending","setSending","fetchData","e","Error","message","interval","setInterval","clearInterval","sendError","setSendError","sendTask","method","headers","body","JSON","stringify","task","ok","setTimeout","href","statusColor","status","agent","server","NodeFullPanel","tab","setTab","hasUnread","events","setEvents","eventsLoaded","setEventsLoaded","chatUnread","then","r","d","catch","id","label","icon","map","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","onClose","inline","EventsTimeline","value","node_id","alwaysShow","session_id","resume_id","model","version","hostname","ip","project_dir","config_path","channels","Array","isArray","join","tmux_name","progress","score","last_seen_at","registered_at","updated_at","String","type","onChange","target","onKeyDown","key","placeholder","EVENT_COLORS","dot","line","path","groups","Map","forEach","task_id","group","push","set","entries","taskId","taskEvents","slice","cfg","to_status","event_type","from_status","created_at","detail","NodePage","fallback"],"mappings":"kHAgBO,SAASA,EAAaC,CAAkC,EAC7D,GAAI,CAACA,EAAS,OAAO,KAErB,IAAMI,EAAIC,KAAKC,KAAK,CAACL,AADTD,EAAQE,QAAQ,CAAC,KAAOF,EAAUA,EAAQG,OAAO,CAAC,IAAK,KAAO,KAE1E,OAAOI,OAAOC,QAAQ,CAACJ,GAAKA,EAAI,IAClC,CAKO,SAASK,EAAYT,CAAkC,EAC5D,IAAMI,EAAIL,EAAaC,GACvB,GAAII,AAAM,SAAM,OAAO,KACvB,IAAMM,EAAIC,KAAKC,KAAK,CAAC,CAACP,KAAKQ,GAAG,IAAKT,CAAC,CAAI,YACxC,AAAIM,EAAI,EAAU,CAAP,UACPA,EAAI,GAAW,CAAP,AAAO,EAAGA,EAAE,KAAK,CAAC,CAC1BA,EAAI,KAAa,CAAA,AAAP,EAAUC,KAAKC,KAAK,CAACF,EAAI,IAAI,KAAK,CAAC,CAC7CA,EAAI,MAAc,CAAP,AAAO,EAAGC,KAAKC,KAAK,CAACF,EAAI,MAAM,KAAK,CAAC,CAC7C,CAAA,EAAGC,KAAKC,KAAK,CAACF,EAAI,OAAO,KAAK,CAAC,AACxC,yECHO,SAAS,AAAa,CAAe,EAC1C,IAAM,EAAIE,KAAK,KAAK,CAAC,EAAU,MACzB,EAAI,KAAK,KAAK,CAAE,EAAU,KAAQ,WACxC,AAAI,EAAI,EAAUA,CAAP,AAAOA,EAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CACxB,CAAA,EAAG,EAAE,CAAC,CAAC,AAChB,qBAlCO,SAAS,AAAe,CAA8B,SAC3D,AAAK,GACE,CADH,CAAM,AAEP,OAFc,AAEP,CAAC,0BAA2B,MAAQ,AAC3C,OAAO,CAAC,oBAD+D,KACrC,MAClC,AAD2C,OACpC,CAAC,aAAc,MACtB,AAD2C,GAD8B,IAElE,CAAC,OAAQ,KAA2B,AAC3C,GAFkE,CAE9D,IAAM,IACf,UAFsE,IAW/D,SAAS,AAAQ,CAAe,EACrC,OAAO,EAAY,IAAY,IACjC,kDCjBA,IAAME,EAAc,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAG,CAEnD,SAASC,EAAkBC,CAAa,EAC7C,IAAIC,EAAI,EACR,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAMG,MAAM,CAAED,IAAKD,EAAS,GAAJA,EAASD,EAAMI,UAAU,CAACF,KAAQ,EAC9E,IAAMG,EAAMP,CAAW,CAACG,EAAIH,EAAYK,MAAM,CAAC,CAC/C,MAAO,CACLG,GAAI,CAAC,IAAI,EAAED,EAAI,SAAS,CAAC,CACzBE,KAAM,CAAC,IAAI,EAAEF,EAAI,SAAS,CAAC,CAC3BG,KAAM,CAAC,IAAI,EAAEH,EAAI,SAAS,CAAC,AAC7B,CACF,CAEO,SAASI,EAAaT,CAAc,SACzC,AAAKA,EAEEU,CADIV,CADP,CACaW,EADL,EACS,GAAGC,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAIZ,EAAMW,IAAI,EAAE,CAAC,EAAE,EAAI,GAAA,EAChEE,WAAW,GAFF,GAGrB,sBAYO,SAASG,AAAY,OAAEhB,CAAK,MAAEiB,EAAO,EAAE,WAAEC,EAAY,EAAE,CAAoB,EAChF,GAVO,CAUHJ,wCAV4CC,IAAI,CAACf,AAUrCA,GACd,KADsB,CAEpB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACCkB,UAAW,CAAC,+HAA+H,EAAEA,EAAAA,CAAW,CACxJC,MAAO,CACLC,MAAOH,EACPI,OAAQJ,EACRK,gBAAiB,yBACjBC,mBAAoB,SACpBC,iBAAkB,YAClBC,eAAgB,SAClB,EACAC,MAAO1B,EACP,aAAW,CAAA,CAAA,IAKjB,IAAM2B,EAAI5B,EAAkBC,GACtB4B,EAAKjC,KAAKkC,GAAG,CAAC,EAAGlC,KAAKmC,KAAK,CAAQ,IAAPb,IAClC,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CACCC,UAAW,CAAC,qGAAqG,EAAEA,EAAAA,CAAW,CAC9HC,MAAO,CACLC,MAAOH,EACPI,OAAQJ,EACRc,SAAUH,EACVI,gBAAiBL,EAAErB,EAAE,CACrB2B,YAAaN,EAAEpB,IAAI,CACnB2B,MAAOP,EAAEnB,IACX,AADe,EAEfkB,MAAO1B,EACP,aAAW,CAAA,CAAA,WAEVS,EAAaT,IAGpB,0GCjBiE,CAC/DgD,QAAS,qDACTC,KAAS,kDACTC,QAAS,wDACTC,MAAS,+CACTC,QAAS,iDACX,gCAIiE,CAC/DJ,QAAS,iBACTC,KAAS,gBACTC,QAAS,kBACTC,MAAS,eACTC,QAAS,eACX,uBAGwD,CACtDf,QAAW,cACXC,UAAW,cACXC,MAAW,cACXC,QAAW,eACXC,QAAW,gBACXC,OAAW,cACXC,OAAW,aACXC,UAAW,gBACXC,QAAW,eACb,wBA3DyD,CACvDR,QAAW,kDACXC,UAAW,kDACXC,MAAW,kDACXC,QAAW,qDACXC,QAAW,wDACXC,OAAW,kDACXC,OAAW,+CACXC,UAAW,wDACXC,QAAW,uDACb,qBAIsD,CACpDR,QAAW,UACXC,UAAW,UACXC,MAAW,UACXC,QAAW,UACXC,QAAW,UACXC,OAAW,UACXC,OAAW,UACXC,UAAW,UACXC,QAAW,SACb,oBAxC6B,CAC3B,UACA,YACA,QACA,UACA,UACA,SACA,SACA,YACA,UACD,4CCjBD,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MAoCA,SAASU,EAAW,CAAEC,UAAQ,CAAwB,EACpD,GAAM,CAACC,EAAQC,EAAU,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IAC/B,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAACC,EAAUC,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEnCC,EAAY,UAChBH,GAAW,GACX,GAAI,CACF,IAAMI,EAAM,MAAMC,MAAM,CAAC,mBAAmB,EAAEC,mBAAmBV,GAAAA,CAAW,EACtEW,EAAO,MAAMH,EAAII,IAAI,GAC3BV,EAAUS,EAAKV,MAAM,EAAIU,EAAKhB,KAAK,EAAI,YACzC,CAAE,KAAM,CAAEO,EAAU,kBAAoB,CACxCE,GAAW,EACb,EAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI1C,UAAU,gEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,mDACb,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAGA,UAAU,gDAAsC,aAAWsC,EAAS,OACxE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAItC,UAAU,uBACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOmD,QAASN,EAAWO,SAAUX,EACpCzC,UAAU,4EACTyC,EAAU,aAAe,YAE3BF,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOY,QAAS,IAAMP,EAAY,CAACD,GAAW3C,UAAU,qDACtD2C,EAAW,WAAa,iBAKhCJ,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIvC,UAAW,CAAC,8HAA8H,EAAE2C,EAAW,WAAa,WAAW,gBAAgB,CAAC,UAClMJ,IAGJ,CAACA,GAAU,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEvC,UAAU,iCAAwB,4CAGvD,CAEA,SAASqD,IAEP,IAAMvE,EADe,AACPwE,CADO,EAAA,EAAA,eAAA,AAAe,IACTC,GAAG,CAAC,UAAY,GACrC,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuB,MACvD,CAACC,EAAOC,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAY,EAAE,EAC1C,CAACC,EAAKC,EAAO,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GACzB,CAAC5B,EAAO6B,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC7B,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACjC,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAEjCC,EAAY,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UAC5B,GAAKrF,CAAD,CACJ,GAAI,CACF,CAFU,GAEJgE,EAAM,MAAMC,MAAM,CAAC,uBAAuB,EAAEC,mBAAmBlE,GAAAA,CAAQ,EACvEmE,EAAO,MAAMH,EAAII,IAAI,GACvBD,EAAKO,OAAO,EAAEC,EAAWR,EAAKO,OAAO,EACrCP,EAAKS,KAAK,EAAEC,EAASV,EAAKS,KAAK,EACnCG,EAAOZ,EAAKW,GAAG,EAAI,GACnBE,EAAS,GACX,CAAE,MAAOM,EAAY,CACnBN,EAASM,aAAaC,MAAQD,EAAEE,OAAO,CAAG,eAC5C,CACF,EAAG,CAACxF,EAAM,EAEV,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACRqF,IACA,IAAMI,EAAWC,YAAYL,EAAW,KACxC,MAAO,IAAMM,cAAcF,EAC7B,EAAG,CAACJ,EAAU,EAEd,GAAM,CAACO,EAAWC,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAErCC,EAAW,UACf,GAAI,AAACb,EAAQtE,IAAI,IAAOX,EAAD,CACvBoF,GAAW,CADoB,EAE/BS,EAAa,IACb,GAAI,CACF,IAAM7B,EAAM,MAAMC,MAAM,gBAAiB,CACvC8B,OAAQ,OACRC,QAAS,CAAE,eAAgB,kBAAmB,EAC9CC,KAAMC,KAAKC,SAAS,CAAC,OAAEnG,EAAOoG,KAAMnB,CAAQ,EAC9C,GACMd,EAAO,MAAMH,EAAII,IAAI,GACvBD,EAAKkC,EAAE,EAAE,AACXnB,EAAW,IACXoB,WAAWjB,EAAW,MAEtBQ,EAAa1B,EAAKhB,KAAK,EAAI,cAE/B,CAAE,MAAOmC,EAAY,CACnBO,EAAaP,aAAaC,MAAQD,EAAEE,OAAO,CAAG,cAChD,CACAJ,GAAW,GACb,EAEA,GAAI,CAACpF,EACH,KADU,CAER,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIkB,UAAU,kGACb,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAEA,UAAU,0BAAgB,uBAAoB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAACqF,KAAK,IAAIrF,UAAU,yCAAgC,2BAOhH,IAAMsF,EAAc,EAAA,yBAAyB,CAAC9B,GAAS+B,QAAU,GAAG,EAAI,EAAA,yBAAyB,CAACrD,OAAO,CAEzG,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIlC,UAAU,yEAIb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,uDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAACqF,KAAK,SAASrF,UAAU,8DAAqD,YACnF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,WAAW,CAAA,CAAClB,MAAOA,EAAOiB,KAAM,KACjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIC,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGA,UAAU,6DAAqDlB,IACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKkB,UAAW,CAAC,+CAA+C,EAC/D4D,EAAM,EAAKJ,GAAS+B,SAAW,UAAY,6BAA+B,iBAAoB,cAAA,CAC9F,GACF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKvF,UAAW,CAAC,kDAAkD,EAAEsF,EAAAA,CAAa,UAAG9B,GAAS+B,QAAU,eAE1G/B,GAASgC,OACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIxF,UAAU,2CAAkCwD,EAAQgC,KAAK,CAAEhC,EAAQiC,MAAM,CAAG,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAAE,IAAC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKzF,UAAU,8BAAqB,MAAQ,IAAEwD,EAAQiC,MAAM,IAAO,cAK7JxD,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIjC,UAAU,iGAAyFiC,IAI1G,CAAA,EAAA,EAAA,GAAA,EAACyD,EAAAA,CAAc5G,MAAOA,EAAO0E,QAASA,EAASI,IAAKA,EAAKG,QAASA,EAASC,WAAYA,EAAYC,QAASA,EAASW,SAAUA,EAAUF,UAAWA,MAG1J,CAEA,SAASgB,EAAc,CAAE5G,OAAK,SAAE0E,CAAO,KAAEI,CAAG,SAAEG,CAAO,YAAEC,CAAU,SAAEC,CAAO,UAAEW,CAAQ,WAAEF,CAAS,CAE9F,EACC,GAAM,CAACiB,EAAKC,EAAO,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA6B,QACrD,WAAEC,CAAS,CAAE,CAAG,CAAA,EAAA,EAAA,aAAA,AAAa,IAC7B,CAACC,EAAQC,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAwH,EAAE,EACxJ,CAACC,EAAcC,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IAC3CC,EAAaL,EAAU/G,GAW7B,MATA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACI,WAAR6G,CAAoB,EAACK,GACvBjD,MAAM,KAD+B,4BACEoD,IAAI,CAACC,GAAKA,EAAElD,IAAI,IAAIiD,IAAI,CAACE,IAC9DN,EAAUM,EAAEP,MAAM,EAAI,EAAE,EACxBG,GAAgB,EAClB,GAAGK,KAAK,CAAC,IAAML,EAAgB,IAEnC,EAAG,CAACN,EAAKK,EAAa,EAGpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIhG,UAAU,gHAGb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,gEACX,CACA,CAAEuG,GAAI,OAAUC,MAAO,OAAUC,KAAM,0LAA2L,EAClO,CAAEF,GAAI,SAAUC,MAAO,SAAUC,KAAM,gGAAiG,EACxI,CAAEF,GAAI,OAAUC,MAAO,OAAUC,KAAM,0DAA2D,EACnG,CAAWC,GAAG,CAACxI,GACd,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAkBiF,QAAS,IAAMyC,EAAO1H,EAAEqI,EAAE,EAC3CvG,UAAW,CAAC,mFAAmF,EAC7F2F,IAAQzH,EAAEqI,EAAE,CAAG,gCAAkC,uDAAA,CACjD,WACF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIvG,UAAU,mBAAmB2G,KAAK,OAAOC,QAAQ,YAAYC,OAAO,eAAeC,YAAY,MAAMC,cAAc,QAAQC,eAAe,iBAC7I,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKX,EAAGnI,EAAEuI,IAAI,KAEjB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKzG,UAAU,oDACb9B,EAAEsI,KAAK,CACE,SAATtI,EAAEqI,EAAE,EAAeL,GAAsB,SAARP,GAChC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK3F,UAAU,mDAAmD,aAAW,8BAVvE9B,EAAEqI,EAAE,KAkBrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIvG,UAAU,mCACJ,SAAR2F,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,aAAa,CAAA,CAAC7G,MAAOA,EAAOmI,QAAS,KAAO,EAAGC,MAAM,CAAA,CAAA,IAG/C,WAARvB,GACC,CAAA,EAAA,EAAA,GAAA,EAACwB,EAAAA,CAAerB,OAAQA,EAAQrD,QAAS,CAACuD,IAGnC,SAARL,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI3F,UAAU,2DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,gEACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGA,UAAU,oDAA2C,cAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,6BACZ,CACC,CAAEwG,MAAO,UAAWY,MAAO5D,GAAS6D,QAASC,YAAY,CAAK,EAC9D,CAAEd,MAAO,aAAcY,MAAO5D,GAAS+D,WAAYD,YAAY,CAAK,EACpE,CAAEd,MAAO,YAAaY,MAAO5D,GAASgE,UAAWF,YAAY,CAAK,EAClE,CAAEd,MAAO,QAASY,MAAO5D,GAAS1E,MAAOwI,WAAY,EAAK,EAC1D,CAAEd,MAAO,QAASY,MAAO5D,GAASgC,MAAO8B,YAAY,CAAK,EAC1D,CAAEd,MAAO,QAASY,MAAO5D,GAASiE,MAAOH,YAAY,CAAK,EAC1D,CAAEd,MAAO,UAAWY,MAAO5D,GAASkE,OAAQ,EAC5C,CAAElB,MAAO,SAAUY,MAAO5D,GAASiC,OAAQ6B,YAAY,CAAK,EAC5D,CAAEd,MAAO,WAAYY,MAAO5D,GAASmE,SAAUL,YAAY,CAAK,EAChE,CAAEd,MAAO,KAAMY,MAAO5D,GAASoE,GAAIN,WAAY,EAAK,EACpD,CAAEd,MAAO,UAAWY,MAAO5D,GAASqE,WAAY,EAChD,CAAErB,MAAO,SAAUY,MAAO5D,GAASsE,YAAaR,YAAY,CAAK,EACjE,CAAEd,MAAO,WAAYY,MAAO5D,GAASuE,UAAU9I,OAAU+I,MAAMC,OAAO,CAACzE,EAAQuE,QAAQ,EAAIvE,EAAQuE,QAAQ,CAACG,IAAI,CAAC,MAAQ1E,EAAQuE,QAAQ,CAAI,KAAMT,WAAY,EAAK,EACpK,CAAEd,MAAO,OAAQY,MAAO5D,GAAS2E,SAAU,EAC3C,CAAE3B,MAAO,MAAOY,MAAOxD,EAAM,EAAI,CAAC,WAAW,EAAEA,EAAI,CAAC,CAAC,CAAG,eAAgB0D,YAAY,CAAK,EACzF,CAAEd,MAAO,WAAYY,MAAO5D,GAAS4E,SAAW,CAAA,EAAG5E,EAAQ4E,QAAQ,CAAC,CAAC,CAAC,CAAG,IAAK,EAC9E,CAAE5B,MAAO,QAASY,MAAO5D,GAAS6E,KAAM,EACxC,CAAE7B,MAAO,YAAaY,MAAO5D,GAAS8E,aAAchB,YAAY,CAAK,EACrE,CAAEd,MAAO,aAAcY,MAAO5D,GAAS+E,cAAejB,YAAY,CAAK,EACvE,CAAEd,MAAO,UAAWY,MAAO5D,GAASgF,WAAYlB,WAAY,EAAK,EAClE,CAACZ,GAAG,CAAC,CAAC,OAAEF,CAAK,OAAEY,CAAK,YAAEE,CAAU,CAAE,GAAMF,GAASE,EAChD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAgBtH,UAAU,uCACzB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,kCAA0BwG,IAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKxG,UAAU,uCAAuCQ,MAAO4G,EAAQqB,OAAOrB,GAAS,cACnFA,EAAQqB,OAAOrB,GAAS,SAHnBZ,GAMR,WAKPhD,GAAS0B,MACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIlF,UAAU,gEACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGA,UAAU,oDAA2C,iBACzD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEA,UAAU,qDAA6CwD,EAAQ0B,IAAI,MAKzE1B,GAASjB,QACR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIvC,UAAU,gEACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGA,UAAU,oDAA2C,gBACzD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEA,UAAU,8EAAsEwD,EAAQjB,MAAM,MAKrG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIvC,UAAU,gEACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGA,UAAU,oDAA2C,cACzD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,uBACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC0I,KAAK,OACLtB,MAAOrD,EACP4E,SAAUvE,GAAKJ,EAAWI,EAAEwE,MAAM,CAACxB,KAAK,EACxCyB,UAAWzE,GAAe,UAAVA,EAAE0E,GAAG,EAAgBlE,IACrCmE,YAAa,CAAC,aAAa,EAAEjK,EAAM,GAAG,CAAC,CACvCkB,UAAU,gKAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCmD,QAASyB,EACTxB,SAAUa,GAAW,CAACF,EAAQtE,IAAI,GAClCO,UAAU,qHAETiE,EAAU,MAAQ,YAGtBS,GAAa,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI1E,UAAU,qCAA6B0E,OAI3DlB,GAAS2E,WACR,CAAA,EAAA,EAAA,GAAA,EAAC9F,EAAAA,CAAWC,SAAUkB,EAAQ2E,SAAS,WAOnD,CAKA,IAAMa,EAA4E,CAChF5H,UAAW,CAAE6H,IAAK,cAAiBC,KAAM,iBAAoBC,KAAM,wBAAyB,EAC5F9H,MAAW,CAAE4H,IAAK,gBAAiBC,KAAM,mBAAoBC,KAAM,iBAAkB,EACrF7H,QAAW,CAAE2H,IAAK,eAAiBC,KAAM,kBAAoBC,KAAM,iCAAkC,EACrG5H,QAAW,CAAE0H,IAAK,gBAAiBC,KAAM,mBAAoBC,KAAM,0LAA2L,EAC9P1H,OAAW,CAAEwH,IAAK,aAAiBC,KAAM,gBAAoBC,KAAM,uBAAwB,EAC3FhI,QAAW,CAAE8H,IAAK,cAAiBC,KAAM,iBAAoBC,KAAM,mBAAoB,CACzF,EAEA,SAAShC,EAAe,QAAErB,CAAM,SAAErD,CAAO,CAAyK,EAChN,GAAIA,EAAS,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIzC,UAAU,oCAA2B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,sFAC7E,GAAsB,IAAlB8F,EAAO7G,MAAM,CAAQ,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIe,UAAU,mDAA0C,uBAGzF,IAAMoJ,EAAS,IAAIC,IAQnB,OAPAvD,EAAOwD,OAAO,CAAClF,IACb,IAAM0E,EAAO1E,EAA2BmF,OAAO,EAAI,CAAC,UAAU,EAAEnF,EAAEmC,EAAE,CAAA,CAAE,CAChEiD,EAAQJ,EAAO7F,GAAG,CAACuF,IAAQ,EAAE,CACnCU,EAAMC,IAAI,CAACrF,GACXgF,EAAOM,GAAG,CAACZ,EAAKU,EAClB,GAGE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIxJ,UAAU,gDACZ,IAAIoJ,EAAOO,OAAO,GAAG,CAACjD,GAAG,CAAC,CAAC,CAACkD,EAAQC,EAAW,GAC9C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAiB7J,UAAU,gEAC1B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,oDAA0C,SAAO4J,EAAOE,KAAK,CAAC,EAAG,IAAI,SACpF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI9J,UAAU,0BAEb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,0DAEd6J,EAAWnD,GAAG,CAAC,CAACtC,EAAGpF,KAClB,IAAM+K,EAAMf,CAAY,CAAC5E,EAAE4F,SAAS,CAAC,EAAIhB,EAAa7H,OAAO,CAC7D,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAenB,UAAU,oCAGxB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAW,CAAC,wDAAwD,EAAE+J,EAAId,GAAG,CAAC,gEAAgE,CAAC,UAClJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI/I,MAAM,KAAKC,OAAO,KAAKyG,QAAQ,YAAYD,KAAK,OAAOE,OAAO,UAAUC,YAAY,MAAMC,cAAc,QAAQC,eAAe,QAAQ,aAAW,CAAA,CAAA,WACrJ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKX,EAAG0D,EAAIZ,IAAI,OAIrB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAInJ,UAAU,iBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAW,CAAC,oBAAoB,EAAEoE,AAAgB,aAAd4F,SAAS,CAAgB,eAAiC,YAAhB5F,EAAE4F,SAAS,CAAiB,kBAAoB,gBAAA,CAAiB,UAClJ5F,EAAE6F,UAAU,GAEd7F,EAAE8F,WAAW,EACZ,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKlK,UAAU,sCAA6BoE,EAAE8F,WAAW,CAAC,MAAI9F,EAAE4F,SAAS,IAE5E,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKhK,UAAU,6CAAqC,CAAA,EAAA,EAAA,OAAA,AAAO,EAACoE,EAAE+F,UAAU,OAE1E/F,EAAEgG,MAAM,EACP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIpK,UAAU,sDAA6CoE,EAAEgG,MAAM,CAACN,KAAK,CAAC,EAAG,IAAK1F,EAAEgG,MAAM,CAACnL,MAAM,CAAG,GAAK,MAAQ,WApB9GmF,EAAEmC,EAAE,CAyBlB,QAlCMqD,KAwClB,kBAEe,SAASS,EACtB,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAACC,SAAU,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAItK,UAAU,iEAAwD,wBACzF,CAAA,EAAA,EAAA,GAAA,EAACqD,EAAAA,CAAAA,IAGP"}
@@ -1,3 +1,3 @@
1
- module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},49597,a=>{"use strict";a.s(["SESSION_STATUS_CHIP_CLASS",0,{working:"bg-green-500/10 text-green-300 border-green-500/20",idle:"bg-blue-500/10 text-blue-300 border-blue-500/20",blocked:"bg-yellow-500/10 text-yellow-300 border-yellow-500/20",error:"bg-red-500/10 text-red-300 border-red-500/20",offline:"bg-gray-500/10 text-gray-500 border-gray-500/20"},"SESSION_STATUS_TEXT_CLASS",0,{working:"text-green-400",idle:"text-blue-400",blocked:"text-yellow-400",error:"text-red-400",offline:"text-gray-500"},"STATUS_BAR_CLASS",0,{created:"bg-gray-500",delivered:"bg-blue-500",acked:"bg-cyan-500",running:"bg-green-500",replied:"bg-purple-500",closed:"bg-gray-600",failed:"bg-red-500",cancelled:"bg-yellow-500",expired:"bg-orange-500"},"STATUS_CHIP_CLASS",0,{created:"bg-gray-500/10 text-gray-400 border-gray-500/20",delivered:"bg-blue-500/10 text-blue-300 border-blue-500/20",acked:"bg-cyan-500/10 text-cyan-300 border-cyan-500/20",running:"bg-green-500/10 text-green-300 border-green-500/20",replied:"bg-purple-500/10 text-purple-300 border-purple-500/20",closed:"bg-gray-500/10 text-gray-500 border-gray-500/20",failed:"bg-red-500/10 text-red-300 border-red-500/20",cancelled:"bg-yellow-500/10 text-yellow-300 border-yellow-500/20",expired:"bg-orange-500/10 text-orange-300 border-orange-500/20"},"STATUS_DOT_HEX",0,{created:"#9ca3af",delivered:"#60a5fa",acked:"#22d3ee",running:"#4ade80",replied:"#a78bfa",closed:"#6b7280",failed:"#f87171",cancelled:"#facc15",expired:"#fb923c"},"TASK_STATUSES",0,["created","delivered","acked","running","replied","closed","failed","cancelled","expired"]])},92088,92945,a=>{"use strict";function b(a){if(!a)return null;let b=Date.parse(a.includes("T")?a:a.replace(" ","T")+"Z");return Number.isFinite(b)?b:null}function c(a){let c=b(a);if(null===c)return null;let d=Math.floor((Date.now()-c)/1e3);return d<0?"just now":d<60?`${d}s ago`:d<3600?`${Math.floor(d/60)}m ago`:d<86400?`${Math.floor(d/3600)}h ago`:`${Math.floor(d/86400)}d ago`}a.s(["parseHubTime",0,b,"relativeAgo",0,c],92945),a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"previewContent",0,function(a){return a&&a.replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\s+/g," ").trim()||"--"},"timeAgo",0,function(a){return c(a)??"--"}],92088)},8893,a=>{"use strict";var b=a.i(64247);let c=[180,200,220,270,300,330,30,90];function d(a){let b=0;for(let c=0;c<a.length;c++)b=31*b+a.charCodeAt(c)>>>0;let d=c[b%c.length];return{bg:`hsl(${d} 55% 22%)`,ring:`hsl(${d} 60% 45%)`,text:`hsl(${d} 80% 78%)`}}function e(a){return a?(a.trim().match(/[\p{L}\p{N}]/u)?.[0]||a.trim()[0]||"·").toUpperCase():"·"}a.s(["AliasAvatar",0,function({alias:a,size:c=28,className:f=""}){if(/\bgrok\b|grok-build|grok测试员|grok-demo/i.test(a))return(0,b.jsx)("span",{className:`anet-alias-avatar inline-flex items-center justify-center rounded-full border border-emerald-500/45 bg-emerald-950/70 shrink-0 ${f}`,style:{width:c,height:c,backgroundImage:"url(/vendors/grok.svg)",backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"68% 68%"},title:a,"aria-hidden":!0});let g=d(a),h=Math.max(9,Math.round(.42*c));return(0,b.jsx)("span",{className:`anet-alias-avatar inline-flex items-center justify-center rounded-full border shrink-0 font-semibold ${f}`,style:{width:c,height:c,fontSize:h,backgroundColor:g.bg,borderColor:g.ring,color:g.text},title:a,"aria-hidden":!0,children:e(a)})},"aliasAvatarColors",0,d,"aliasInitial",0,e])},19595,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(88534);let e={nodes:{title:"No agents in this network",sub:"Agent sessions will appear here once they connect to the CommHub."},tasks:{title:"No tasks yet",sub:"Tasks will appear here when agents send them via CommHub."},messages:{title:"No messages",sub:"Messages between agents will appear here."},logs:{title:"No audit logs",sub:"Events will appear here when users register, login, or perform actions."},tokens:{title:"No API tokens",sub:"Create one to authenticate CLI tools and external integrations."},networks:{title:"No networks found",sub:"Create one or sign in with V3 auth to see your networks."},generic:{title:"Nothing here yet",sub:"Data will appear here once available."}};function f({variant:a,size:c}){let d={width:c,height:c},e={fill:"none",stroke:"currentColor",strokeWidth:1.25,strokeLinecap:"round",strokeLinejoin:"round"};switch(a){case"nodes":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"14",r:"4"}),(0,b.jsx)("circle",{cx:"14",cy:"44",r:"4"}),(0,b.jsx)("circle",{cx:"50",cy:"44",r:"4"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"14",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"50",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"18",y1:"44",x2:"46",y2:"44",strokeDasharray:"3 3",opacity:"0.6"})]})});case"tasks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("rect",{x:"14",y:"14",width:"36",height:"6",rx:"1.5"}),(0,b.jsx)("rect",{x:"14",y:"26",width:"36",height:"6",rx:"1.5",opacity:"0.6"}),(0,b.jsx)("rect",{x:"14",y:"38",width:"36",height:"6",rx:"1.5",opacity:"0.35"})]})});case"messages":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z"}),(0,b.jsx)("line",{x1:"22",y1:"28",x2:"42",y2:"28",opacity:"0.5"}),(0,b.jsx)("line",{x1:"22",y1:"34",x2:"36",y2:"34",opacity:"0.5"})]})});case"logs":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z"}),(0,b.jsx)("path",{d:"M40 12 v8 h8",opacity:"0.6"}),(0,b.jsx)("line",{x1:"24",y1:"32",x2:"40",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"24",y1:"38",x2:"40",y2:"38",opacity:"0.4"}),(0,b.jsx)("line",{x1:"24",y1:"44",x2:"34",y2:"44",opacity:"0.25"})]})});case"tokens":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"22",cy:"32",r:"8"}),(0,b.jsx)("line",{x1:"30",y1:"32",x2:"54",y2:"32"}),(0,b.jsx)("line",{x1:"44",y1:"32",x2:"44",y2:"38"}),(0,b.jsx)("line",{x1:"50",y1:"32",x2:"50",y2:"40"})]})});case"networks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"18"}),(0,b.jsx)("ellipse",{cx:"32",cy:"32",rx:"18",ry:"9",opacity:"0.55"}),(0,b.jsx)("line",{x1:"14",y1:"32",x2:"50",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"32",y1:"14",x2:"32",y2:"50",opacity:"0.55"})]})});default:return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"14",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("circle",{cx:"32",cy:"32",r:"3"})]})})}}function g({variant:a="generic",title:c,sub:h,cta:i,compact:j=!1}){let k=e[a],l=c??k.title,m=h??k.sub;return(0,b.jsxs)("div",{className:`text-center ${j?"py-8":"py-16"} px-4`,role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)(f,{variant:a,size:j?40:56})}),(0,b.jsx)("h3",{className:`font-medium text-gray-300 ${j?"text-sm":"text-base"}`,children:l}),m&&(0,b.jsx)("p",{className:`text-gray-500 ${j?"text-xs mt-1.5":"text-sm mt-2"} max-w-md mx-auto leading-relaxed`,children:m}),i&&(0,b.jsx)("div",{className:"mt-4",children:i.href?(0,b.jsxs)(d.default,{href:i.href,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]}):(0,b.jsxs)("button",{onClick:i.onClick,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}function h({children:a}){return(0,b.jsx)("div",{className:"max-w-2xl mx-auto rounded-xl border border-[#2a2a4a] bg-[#111128] shadow-lg shadow-black/20",children:a})}function i({cmd:a}){let[d,e]=(0,c.useState)(!1),f=async()=>{try{await navigator.clipboard.writeText(a),e(!0),setTimeout(()=>e(!1),1800)}catch{}};return(0,b.jsxs)("div",{className:"anet-empty-cmd flex items-center gap-2 bg-[#0a0a15] border border-[#2a2a4a] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm",children:[(0,b.jsx)("code",{className:"text-cyan-300 font-mono select-all",children:a}),(0,b.jsx)("button",{type:"button",onClick:f,"aria-label":d?"Copied":"Copy command",className:"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1a1a2a] transition-colors",children:d?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-green-400",children:[(0,b.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,b.jsx)("path",{d:"M20 6 9 17l-5-5"})}),"Copied"]}):(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,b.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Copy"]})})]})}a.s(["EmptyState",0,g,"NodesEmptyState",0,function({hint:a,taskHistoryCount:c=0}){return a?.global_count?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents in this network",sub:`Server has ${a.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`})}):c>0?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents online",sub:`Every agent in this network is currently offline. ${c.toLocaleString()} task${1===c?"":"s"} in history — they may have finished their work or disconnected.`,cta:{label:"View task history",href:"/tasks"}})}):(0,b.jsx)(h,{children:(0,b.jsxs)("div",{className:"text-center py-16 px-4",role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)("svg",{viewBox:"0 0 64 64",width:56,height:56,children:(0,b.jsxs)("g",{stroke:"currentColor",strokeWidth:"1.5",fill:"none",children:[(0,b.jsx)("rect",{x:"10",y:"20",width:"44",height:"28",rx:"2"}),(0,b.jsx)("rect",{x:"20",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"32",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"44",y:"32",width:"4",height:"8",opacity:"0.5"}),(0,b.jsx)("line",{x1:"10",y1:"26",x2:"54",y2:"26",opacity:"0.4"}),(0,b.jsx)("circle",{cx:"14",cy:"23",r:"0.8",fill:"currentColor"})]})})}),(0,b.jsx)("h3",{className:"font-medium text-gray-300 text-base",children:"Spin up your first agent"}),(0,b.jsx)("p",{className:"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed",children:"Run this in a fresh terminal to register an agent with this CommHub:"}),(0,b.jsx)("div",{className:"mt-4 inline-block",children:(0,b.jsx)(i,{cmd:"npx --yes @sleep2agi/agent-network init"})}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsxs)("a",{href:"https://anet.sh",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300",children:["Full quickstart guide",(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})})}])},9943,a=>{"use strict";var b=a.i(57389),c=a.i(59202);let d=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()},e={refreshInterval:5e3,dedupingInterval:3e3};function f(a,b){if(!b)return a;let c=a.includes("?")?"&":"?";return`${a}${c}network_id=${encodeURIComponent(b)}`}a.s(["useAnetConfig",0,function(){let{data:a}=(0,b.default)("/api/anet/config",d,{refreshInterval:3e4});return{config:a||null}},"useHealth",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/health",d,e);return{health:a||null,error:c}},"useLicense",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/license",d,{refreshInterval:6e4});return{license:a?.ok?a:null,error:c}},"useMessages",0,function(a=100){let{networkId:g}=(0,c.useNetworkId)(),{data:h,error:i,isLoading:j}=(0,b.default)(f(`/api/hub/messages?limit=${a}`,g),d,e);return{messages:h?.messages||[],error:i,isLoading:j}},"useSessions",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h,isLoading:i}=(0,b.default)(f("/api/hub/status",a),d,e);return{sessions:g?.sessions||[],hint:g?._hint,error:h,isLoading:i}},"useStats",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h}=(0,b.default)(f("/api/hub/stats",a),d,e);return{stats:g?.ok?g:null,error:h}},"useTasks",0,function(a){let{networkId:g}=(0,c.useNetworkId)(),h=new URLSearchParams({limit:"100",...a}).toString(),{data:i,error:j,isLoading:k}=(0,b.default)(f(`/api/hub/tasks?${h}`,g),d,e);return{tasks:i?.tasks||[],count:i?.count??0,source:i?.source,error:j,isLoading:k}}])},75965,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(92088),e=a.i(9943),f=a.i(91328),g=a.i(19595),h=a.i(8893),i=a.i(49597),j=a.i(45e3);function k(a){return a?a.length>12?`${a.slice(0,8)}…`:a:"—"}a.s(["default",0,function(){let a,l,m,n,{sessions:o,isLoading:p}=(0,e.useSessions)(),{health:q}=(0,e.useHealth)(),{hasUnread:r}=(0,j.useChatUnread)(),s=q?.sse_sessions||{},t=a=>(a.network_id?s[`${a.network_id}:${a.alias}`]:void 0)??s[a.alias],[u,v]=(0,c.useState)(""),[w,x]=(0,c.useState)(""),[y,z]=(0,c.useState)("list"),[A,B]=(0,c.useState)(null),C=o.map(a=>({...a,online:!!t(a)})).filter(a=>"online"===u?a.online:"offline"===u?!a.online:!u||u===a.status).filter(a=>!w||a.alias.toLowerCase().includes(w.toLowerCase())||(a.agent||"").toLowerCase().includes(w.toLowerCase())).sort((a,b)=>!!b.online-!!a.online||("working"===b.status)-("working"===a.status)),D=o.filter(a=>t(a)).length;return(0,b.jsxs)("div",{className:"min-h-screen max-w-full overflow-x-hidden 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:"Nodes"}),(0,b.jsxs)("span",{className:"text-xs bg-green-900/30 text-green-400 px-2 py-0.5 rounded-full border border-green-800/30",children:[D," online"]}),(0,b.jsxs)("span",{className:"text-xs bg-gray-900/30 text-gray-400 px-2 py-0.5 rounded-full border border-gray-800/30",children:[o.length," total"]})]}),o.length>0&&(a=C.filter(a=>a.online&&"working"===a.status).length,l=C.filter(a=>a.online&&"idle"===a.status).length,m=C.filter(a=>!a.online).length,n=C.length||1,(0,b.jsxs)("div",{className:"mb-6",children:[(0,b.jsxs)("div",{className:"flex h-2 rounded-full overflow-hidden bg-gray-800",children:[a>0&&(0,b.jsx)("div",{className:"bg-green-500",style:{width:`${a/n*100}%`}}),l>0&&(0,b.jsx)("div",{className:"bg-cyan-500",style:{width:`${l/n*100}%`}}),m>0&&(0,b.jsx)("div",{className:"bg-gray-600",style:{width:`${m/n*100}%`}})]}),(0,b.jsxs)("div",{className:"flex gap-4 mt-1.5 text-[10px] text-gray-500",children:[a>0&&(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-green-500 mr-1"}),a," working"]}),l>0&&(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-cyan-500 mr-1"}),l," idle"]}),m>0&&(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-gray-600 mr-1"}),m," offline"]})]})]})),o.length>0&&(0,b.jsxs)("div",{className:"flex flex-wrap gap-3 mb-6",children:[(0,b.jsx)("input",{type:"text",value:w,onChange:a=>x(a.target.value),placeholder:"Search nodes...",className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:outline-none w-full sm:w-48"}),(0,b.jsxs)("select",{value:u,onChange:a=>v(a.target.value),className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white focus:border-blue-500/50 focus:outline-none",children:[(0,b.jsx)("option",{value:"",children:"All"}),(0,b.jsx)("option",{value:"online",children:"Online"}),(0,b.jsx)("option",{value:"offline",children:"Offline"}),(0,b.jsx)("option",{value:"working",children:"Working"}),(0,b.jsx)("option",{value:"idle",children:"Idle"}),(0,b.jsx)("option",{value:"blocked",children:"Blocked"}),(0,b.jsx)("option",{value:"error",children:"Error"})]}),(0,b.jsx)("div",{className:"hidden sm:flex ml-auto rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 text-sm",children:["list","grid"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>z(a),className:`rounded-md px-3 py-1.5 transition-colors ${y===a?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"list"===a?"List":"Grid"},a))})]}),p?(0,b.jsx)("div",{className:"animate-pulse space-y-2",children:[1,2,3,4].map(a=>(0,b.jsx)("div",{className:"h-16 bg-gray-800/20 rounded-lg"},a))}):0===C.length?0===o.length?(0,b.jsx)(g.NodesEmptyState,{}):(0,b.jsx)(g.EmptyState,{variant:"nodes",title:"No nodes match your filters",sub:"Try clearing search or status filters, or wait for an agent to register."}):"grid"===y?(0,b.jsx)("div",{className:"grid min-w-0 grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4",children:C.map(a=>{let c=a.online?a.status:"offline",e="number"==typeof a.progress?a.progress:0,f=r(a.alias);return(0,b.jsxs)("div",{role:"button",tabIndex:0,onClick:()=>B(a.alias),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),B(a.alias))},className:`relative min-w-0 max-w-full overflow-hidden rounded-xl border border-[#2a2a4a] bg-[#111128] p-4 transition-colors hover:border-cyan-500/40 cursor-pointer ${!a.online?"opacity-60":""}`,children:[!a.online&&(0,b.jsx)("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:(0,b.jsx)("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",children:"Offline"})}),(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsxs)("div",{className:"relative shrink-0",children:[(0,b.jsx)(h.AliasAvatar,{alias:a.alias,size:36}),f&&(0,b.jsx)("span",{className:"absolute -right-1 -top-1 h-3 w-3 rounded-full border-2 border-[#111128] bg-red-500"})]}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"truncate text-base font-semibold text-white",children:a.alias}),f&&(0,b.jsx)("span",{className:"shrink-0 rounded-full bg-red-500/15 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-red-300",children:"New"}),(0,b.jsx)("span",{className:`shrink-0 rounded-md border px-2 py-0.5 text-[10px] uppercase tracking-wide ${i.SESSION_STATUS_CHIP_CLASS[c]||i.SESSION_STATUS_CHIP_CLASS.offline}`,children:c})]}),(0,b.jsxs)("div",{className:"mt-0.5 truncate text-xs text-gray-500",children:[a.agent||"—",(0,b.jsx)("span",{className:"text-gray-700 mx-1.5",children:"·"}),(0,b.jsx)("span",{title:a.server||"",children:k(a.server)})]})]}),(0,b.jsx)("span",{className:"hidden shrink-0 rounded-lg border border-cyan-500/15 bg-cyan-500/5 px-2 py-1 text-[10px] text-cyan-300/70 sm:inline",children:"Tap to chat"})]}),(0,b.jsxs)("div",{className:"mt-3 rounded-lg border border-[#1a1a2a] bg-[#0a0a15] px-3 py-2 text-xs",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"Current task"}),(0,b.jsx)("span",{className:"text-[10px] text-gray-600",children:(0,d.timeAgo)(a.last_seen_at||a.updated_at)})]}),(0,b.jsx)("div",{className:`mt-1 line-clamp-2 ${a.task?"text-gray-300":"text-gray-600 italic"}`,children:a.task||"No current task"})]}),e>0&&e<100&&(0,b.jsx)("div",{className:"mt-3 h-1.5 overflow-hidden rounded-full bg-gray-800",children:(0,b.jsx)("div",{className:"h-1.5 rounded-full bg-cyan-400 transition-all",style:{width:`${e}%`}})})]},a.alias)})}):(0,b.jsxs)("div",{className:"space-y-1 sm:space-y-2",children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-10 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:"Alias"}),(0,b.jsx)("div",{className:"col-span-2",children:"Agent · Server"}),(0,b.jsx)("div",{className:"col-span-4",children:"Current Task"}),(0,b.jsx)("div",{className:"col-span-1",children:"Updated"})]}),C.map(a=>{let c=a.online?a.status:"offline",e=r(a.alias);return(0,b.jsxs)("div",{role:"button",tabIndex:0,onClick:()=>B(a.alias),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),B(a.alias))},className:`rounded-lg border border-[#2a2a4a] bg-[#111128] px-3 py-2 sm:px-4 sm:py-3 transition-colors hover:border-cyan-500/40 cursor-pointer ${!a.online?"opacity-50":""}`,children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-10 gap-2 items-center",children:[(0,b.jsx)("div",{className:"col-span-1",children:(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded-md border ${i.SESSION_STATUS_CHIP_CLASS[c]||i.SESSION_STATUS_CHIP_CLASS.offline}`,children:c})}),(0,b.jsx)("div",{className:"col-span-2 min-w-0",children:(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,b.jsxs)("div",{className:"relative shrink-0",children:[(0,b.jsx)(h.AliasAvatar,{alias:a.alias,size:20}),e&&(0,b.jsx)("span",{className:"absolute -right-1 -top-1 h-2.5 w-2.5 rounded-full border border-[#111128] bg-red-500"})]}),(0,b.jsx)("span",{className:"truncate text-sm font-medium text-white",children:a.alias}),e&&(0,b.jsx)("span",{className:"shrink-0 rounded-full bg-red-500/15 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-red-300",children:"New"})]})}),(0,b.jsx)("div",{className:"col-span-2 truncate text-xs text-gray-400",title:a.server||"",children:(0,b.jsxs)("span",{className:"truncate",children:[a.agent||"--",(0,b.jsx)("span",{className:"text-gray-700 mx-1.5",children:"·"}),k(a.server)]})}),(0,b.jsx)("div",{className:"col-span-4 truncate text-xs text-gray-500",title:a.task||"",children:a.task||"--"}),(0,b.jsx)("div",{className:"col-span-1 text-xs text-gray-500",children:(0,d.timeAgo)(a.last_seen_at||a.updated_at)})]}),(0,b.jsxs)("div",{className:"sm:hidden space-y-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,b.jsxs)("div",{className:"relative shrink-0",children:[(0,b.jsx)(h.AliasAvatar,{alias:a.alias,size:28}),e&&(0,b.jsx)("span",{className:"absolute -right-1 -top-1 h-3 w-3 rounded-full border-2 border-[#111128] bg-red-500"})]}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-medium text-white",children:a.alias}),e&&(0,b.jsx)("span",{className:"shrink-0 rounded-full bg-red-500/15 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-red-300",children:"New"})]}),(0,b.jsxs)("div",{className:"truncate text-[10px] text-gray-500",children:[a.agent||"—"," · ",(0,d.timeAgo)(a.last_seen_at||a.updated_at)]})]}),(0,b.jsx)("span",{className:`shrink-0 text-xs px-2 py-0.5 rounded-md border ${i.SESSION_STATUS_CHIP_CLASS[c]||i.SESSION_STATUS_CHIP_CLASS.offline}`,children:c})]}),a.task&&(0,b.jsx)("div",{className:"truncate text-xs text-gray-500",children:a.task})]})]},a.alias)})]}),A&&(0,b.jsx)(f.TaskChatPanel,{alias:A,onClose:()=>B(null)})]})}])}];
1
+ module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},49597,a=>{"use strict";a.s(["SESSION_STATUS_CHIP_CLASS",0,{working:"bg-green-500/10 text-green-300 border-green-500/20",idle:"bg-blue-500/10 text-blue-300 border-blue-500/20",blocked:"bg-yellow-500/10 text-yellow-300 border-yellow-500/20",error:"bg-red-500/10 text-red-300 border-red-500/20",offline:"bg-gray-500/10 text-gray-500 border-gray-500/20"},"SESSION_STATUS_TEXT_CLASS",0,{working:"text-green-400",idle:"text-blue-400",blocked:"text-yellow-400",error:"text-red-400",offline:"text-gray-500"},"STATUS_BAR_CLASS",0,{created:"bg-gray-500",delivered:"bg-blue-500",acked:"bg-cyan-500",running:"bg-green-500",replied:"bg-purple-500",closed:"bg-gray-600",failed:"bg-red-500",cancelled:"bg-yellow-500",expired:"bg-orange-500"},"STATUS_CHIP_CLASS",0,{created:"bg-gray-500/10 text-gray-400 border-gray-500/20",delivered:"bg-blue-500/10 text-blue-300 border-blue-500/20",acked:"bg-cyan-500/10 text-cyan-300 border-cyan-500/20",running:"bg-green-500/10 text-green-300 border-green-500/20",replied:"bg-purple-500/10 text-purple-300 border-purple-500/20",closed:"bg-gray-500/10 text-gray-500 border-gray-500/20",failed:"bg-red-500/10 text-red-300 border-red-500/20",cancelled:"bg-yellow-500/10 text-yellow-300 border-yellow-500/20",expired:"bg-orange-500/10 text-orange-300 border-orange-500/20"},"STATUS_DOT_HEX",0,{created:"#9ca3af",delivered:"#60a5fa",acked:"#22d3ee",running:"#4ade80",replied:"#a78bfa",closed:"#6b7280",failed:"#f87171",cancelled:"#facc15",expired:"#fb923c"},"TASK_STATUSES",0,["created","delivered","acked","running","replied","closed","failed","cancelled","expired"]])},92088,92945,a=>{"use strict";function b(a){if(!a)return null;let b=Date.parse(a.includes("T")?a:a.replace(" ","T")+"Z");return Number.isFinite(b)?b:null}function c(a){let c=b(a);if(null===c)return null;let d=Math.floor((Date.now()-c)/1e3);return d<0?"just now":d<60?`${d}s ago`:d<3600?`${Math.floor(d/60)}m ago`:d<86400?`${Math.floor(d/3600)}h ago`:`${Math.floor(d/86400)}d ago`}a.s(["parseHubTime",0,b,"relativeAgo",0,c],92945),a.s(["formatUptime",0,function(a){let b=Math.floor(a/3600),c=Math.floor(a%3600/60);return b>0?`${b}h ${c}m`:`${c}m`},"previewContent",0,function(a){return a&&a.replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/\s+/g," ").trim()||"--"},"timeAgo",0,function(a){return c(a)??"--"}],92088)},8893,a=>{"use strict";var b=a.i(64247);let c=[180,200,220,270,300,330,30,90];function d(a){let b=0;for(let c=0;c<a.length;c++)b=31*b+a.charCodeAt(c)>>>0;let d=c[b%c.length];return{bg:`hsl(${d} 55% 22%)`,ring:`hsl(${d} 60% 45%)`,text:`hsl(${d} 80% 78%)`}}function e(a){return a?(a.trim().match(/[\p{L}\p{N}]/u)?.[0]||a.trim()[0]||"·").toUpperCase():"·"}a.s(["AliasAvatar",0,function({alias:a,size:c=28,className:f=""}){if(/\bgrok\b|grok-build|grok测试员|grok-demo/i.test(a))return(0,b.jsx)("span",{className:`anet-alias-avatar inline-flex items-center justify-center rounded-full border border-emerald-500/45 bg-emerald-950/70 shrink-0 ${f}`,style:{width:c,height:c,backgroundImage:"url(/vendors/grok.svg)",backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"68% 68%"},title:a,"aria-hidden":!0});let g=d(a),h=Math.max(9,Math.round(.42*c));return(0,b.jsx)("span",{className:`anet-alias-avatar inline-flex items-center justify-center rounded-full border shrink-0 font-semibold ${f}`,style:{width:c,height:c,fontSize:h,backgroundColor:g.bg,borderColor:g.ring,color:g.text},title:a,"aria-hidden":!0,children:e(a)})},"aliasAvatarColors",0,d,"aliasInitial",0,e])},19595,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(88534);let e={nodes:{title:"No agents in this network",sub:"Agent sessions will appear here once they connect to the CommHub."},tasks:{title:"No tasks yet",sub:"Tasks will appear here when agents send them via CommHub."},messages:{title:"No messages",sub:"Messages between agents will appear here."},logs:{title:"No audit logs",sub:"Events will appear here when users register, login, or perform actions."},tokens:{title:"No API tokens",sub:"Create one to authenticate CLI tools and external integrations."},networks:{title:"No networks found",sub:"Create one or sign in with V3 auth to see your networks."},generic:{title:"Nothing here yet",sub:"Data will appear here once available."}};function f({variant:a,size:c}){let d={width:c,height:c},e={fill:"none",stroke:"currentColor",strokeWidth:1.25,strokeLinecap:"round",strokeLinejoin:"round"};switch(a){case"nodes":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"14",r:"4"}),(0,b.jsx)("circle",{cx:"14",cy:"44",r:"4"}),(0,b.jsx)("circle",{cx:"50",cy:"44",r:"4"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"14",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"50",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"18",y1:"44",x2:"46",y2:"44",strokeDasharray:"3 3",opacity:"0.6"})]})});case"tasks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("rect",{x:"14",y:"14",width:"36",height:"6",rx:"1.5"}),(0,b.jsx)("rect",{x:"14",y:"26",width:"36",height:"6",rx:"1.5",opacity:"0.6"}),(0,b.jsx)("rect",{x:"14",y:"38",width:"36",height:"6",rx:"1.5",opacity:"0.35"})]})});case"messages":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z"}),(0,b.jsx)("line",{x1:"22",y1:"28",x2:"42",y2:"28",opacity:"0.5"}),(0,b.jsx)("line",{x1:"22",y1:"34",x2:"36",y2:"34",opacity:"0.5"})]})});case"logs":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z"}),(0,b.jsx)("path",{d:"M40 12 v8 h8",opacity:"0.6"}),(0,b.jsx)("line",{x1:"24",y1:"32",x2:"40",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"24",y1:"38",x2:"40",y2:"38",opacity:"0.4"}),(0,b.jsx)("line",{x1:"24",y1:"44",x2:"34",y2:"44",opacity:"0.25"})]})});case"tokens":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"22",cy:"32",r:"8"}),(0,b.jsx)("line",{x1:"30",y1:"32",x2:"54",y2:"32"}),(0,b.jsx)("line",{x1:"44",y1:"32",x2:"44",y2:"38"}),(0,b.jsx)("line",{x1:"50",y1:"32",x2:"50",y2:"40"})]})});case"networks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"18"}),(0,b.jsx)("ellipse",{cx:"32",cy:"32",rx:"18",ry:"9",opacity:"0.55"}),(0,b.jsx)("line",{x1:"14",y1:"32",x2:"50",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"32",y1:"14",x2:"32",y2:"50",opacity:"0.55"})]})});default:return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"14",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("circle",{cx:"32",cy:"32",r:"3"})]})})}}function g({variant:a="generic",title:c,sub:h,cta:i,compact:j=!1}){let k=e[a],l=c??k.title,m=h??k.sub;return(0,b.jsxs)("div",{className:`text-center ${j?"py-8":"py-16"} px-4`,role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)(f,{variant:a,size:j?40:56})}),(0,b.jsx)("h3",{className:`font-medium text-gray-300 ${j?"text-sm":"text-base"}`,children:l}),m&&(0,b.jsx)("p",{className:`text-gray-500 ${j?"text-xs mt-1.5":"text-sm mt-2"} max-w-md mx-auto leading-relaxed`,children:m}),i&&(0,b.jsx)("div",{className:"mt-4",children:i.href?(0,b.jsxs)(d.default,{href:i.href,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]}):(0,b.jsxs)("button",{onClick:i.onClick,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}function h({children:a}){return(0,b.jsx)("div",{className:"max-w-2xl mx-auto rounded-xl border border-[#2a2a4a] bg-[#111128] shadow-lg shadow-black/20",children:a})}function i({cmd:a}){let[d,e]=(0,c.useState)(!1),f=async()=>{try{await navigator.clipboard.writeText(a),e(!0),setTimeout(()=>e(!1),1800)}catch{}};return(0,b.jsxs)("div",{className:"anet-empty-cmd flex items-center gap-2 bg-[#0a0a15] border border-[#2a2a4a] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm",children:[(0,b.jsx)("code",{className:"text-cyan-300 font-mono select-all",children:a}),(0,b.jsx)("button",{type:"button",onClick:f,"aria-label":d?"Copied":"Copy command",className:"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1a1a2a] transition-colors",children:d?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-green-400",children:[(0,b.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,b.jsx)("path",{d:"M20 6 9 17l-5-5"})}),"Copied"]}):(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,b.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Copy"]})})]})}a.s(["EmptyState",0,g,"NodesEmptyState",0,function({hint:a,taskHistoryCount:c=0}){return a?.global_count?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents in this network",sub:`Server has ${a.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`})}):c>0?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents online",sub:`Every agent in this network is currently offline. ${c.toLocaleString()} task${1===c?"":"s"} in history — they may have finished their work or disconnected.`,cta:{label:"View task history",href:"/tasks"}})}):(0,b.jsx)(h,{children:(0,b.jsxs)("div",{className:"text-center py-16 px-4",role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)("svg",{viewBox:"0 0 64 64",width:56,height:56,children:(0,b.jsxs)("g",{stroke:"currentColor",strokeWidth:"1.5",fill:"none",children:[(0,b.jsx)("rect",{x:"10",y:"20",width:"44",height:"28",rx:"2"}),(0,b.jsx)("rect",{x:"20",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"32",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"44",y:"32",width:"4",height:"8",opacity:"0.5"}),(0,b.jsx)("line",{x1:"10",y1:"26",x2:"54",y2:"26",opacity:"0.4"}),(0,b.jsx)("circle",{cx:"14",cy:"23",r:"0.8",fill:"currentColor"})]})})}),(0,b.jsx)("h3",{className:"font-medium text-gray-300 text-base",children:"Spin up your first agent"}),(0,b.jsx)("p",{className:"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed",children:"Run this in a fresh terminal to register an agent with this CommHub:"}),(0,b.jsx)("div",{className:"mt-4 inline-block",children:(0,b.jsx)(i,{cmd:"npx --yes @sleep2agi/agent-network init"})}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsxs)("a",{href:"https://anet.sh",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300",children:["Full quickstart guide",(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})})}])},9943,a=>{"use strict";var b=a.i(57389),c=a.i(59202);let d=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()},e={refreshInterval:5e3,dedupingInterval:3e3};function f(a,b){if(!b)return a;let c=a.includes("?")?"&":"?";return`${a}${c}network_id=${encodeURIComponent(b)}`}a.s(["useAnetConfig",0,function(){let{data:a}=(0,b.default)("/api/anet/config",d,{refreshInterval:3e4});return{config:a||null}},"useHealth",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/health",d,e);return{health:a||null,error:c}},"useLicense",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/license",d,{refreshInterval:6e4});return{license:a?.ok?a:null,error:c}},"useMessages",0,function(a=100){let{networkId:g}=(0,c.useNetworkId)(),{data:h,error:i,isLoading:j}=(0,b.default)(f(`/api/hub/messages?limit=${a}`,g),d,e);return{messages:h?.messages||[],error:i,isLoading:j}},"useSessions",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h,isLoading:i}=(0,b.default)(f("/api/hub/status",a),d,e);return{sessions:g?.sessions||[],hint:g?._hint,error:h,isLoading:i}},"useStats",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h}=(0,b.default)(f("/api/hub/stats",a),d,e);return{stats:g?.ok?g:null,error:h}},"useTasks",0,function(a){let{networkId:g}=(0,c.useNetworkId)(),h=new URLSearchParams({limit:"100",...a}).toString(),{data:i,error:j,isLoading:k}=(0,b.default)(f(`/api/hub/tasks?${h}`,g),d,e);return{tasks:i?.tasks||[],count:i?.count??0,source:i?.source,error:j,isLoading:k}}])},75965,a=>{"use strict";var b=a.i(64247),c=a.i(54413),d=a.i(92088),e=a.i(9943),f=a.i(91328),g=a.i(19595),h=a.i(8893),i=a.i(49597),j=a.i(45e3);function k(a){return a?a.length>12?`${a.slice(0,8)}…`:a:"—"}a.s(["default",0,function(){let a,l,m,n,{sessions:o,isLoading:p}=(0,e.useSessions)(),{health:q}=(0,e.useHealth)(),{hasUnread:r}=(0,j.useChatUnread)(),s=q?.sse_sessions||{},t=a=>(a.network_id?s[`${a.network_id}:${a.alias}`]:void 0)??s[a.alias],[u,v]=(0,c.useState)(""),[w,x]=(0,c.useState)(""),[y,z]=(0,c.useState)("list"),[A,B]=(0,c.useState)(null),C=o.map(a=>({...a,online:!!t(a)})).filter(a=>"online"===u?a.online:"offline"===u?!a.online:!u||u===a.status).filter(a=>!w||a.alias.toLowerCase().includes(w.toLowerCase())||(a.agent||"").toLowerCase().includes(w.toLowerCase())).sort((a,b)=>!!b.online-!!a.online||("working"===b.status)-("working"===a.status)),D=o.filter(a=>t(a)).length;return(0,b.jsxs)("div",{className:"min-h-screen max-w-full overflow-x-hidden 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:"Nodes"}),(0,b.jsxs)("span",{className:"text-xs bg-green-900/30 text-green-400 px-2 py-0.5 rounded-full border border-green-800/30",children:[D," online"]}),(0,b.jsxs)("span",{className:"text-xs bg-gray-900/30 text-gray-400 px-2 py-0.5 rounded-full border border-gray-800/30",children:[o.length," total"]})]}),o.length>0&&(a=C.filter(a=>a.online&&"working"===a.status).length,l=C.filter(a=>a.online&&"idle"===a.status).length,m=C.filter(a=>!a.online).length,n=C.length||1,(0,b.jsxs)("div",{className:"mb-6",children:[(0,b.jsxs)("div",{className:"flex h-2 rounded-full overflow-hidden bg-gray-800",children:[a>0&&(0,b.jsx)("div",{className:"bg-green-500",style:{width:`${a/n*100}%`}}),l>0&&(0,b.jsx)("div",{className:"bg-cyan-500",style:{width:`${l/n*100}%`}}),m>0&&(0,b.jsx)("div",{className:"bg-gray-600",style:{width:`${m/n*100}%`}})]}),(0,b.jsxs)("div",{className:"flex gap-4 mt-1.5 text-[10px] text-gray-500",children:[a>0&&(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-green-500 mr-1"}),a," working"]}),l>0&&(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-cyan-500 mr-1"}),l," idle"]}),m>0&&(0,b.jsxs)("span",{children:[(0,b.jsx)("span",{className:"inline-block w-2 h-2 rounded-full bg-gray-600 mr-1"}),m," offline"]})]})]})),o.length>0&&(0,b.jsxs)("div",{className:"flex flex-wrap gap-3 mb-6",children:[(0,b.jsx)("input",{type:"text",value:w,onChange:a=>x(a.target.value),placeholder:"Search nodes...",className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-blue-500/50 focus:outline-none w-full sm:w-48"}),(0,b.jsxs)("select",{value:u,onChange:a=>v(a.target.value),className:"bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-2 text-base sm:text-sm text-white focus:border-blue-500/50 focus:outline-none",children:[(0,b.jsx)("option",{value:"",children:"All"}),(0,b.jsx)("option",{value:"online",children:"Online"}),(0,b.jsx)("option",{value:"offline",children:"Offline"}),(0,b.jsx)("option",{value:"working",children:"Working"}),(0,b.jsx)("option",{value:"idle",children:"Idle"}),(0,b.jsx)("option",{value:"blocked",children:"Blocked"}),(0,b.jsx)("option",{value:"error",children:"Error"})]}),(0,b.jsx)("div",{className:"hidden sm:flex ml-auto rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 text-sm",children:["list","grid"].map(a=>(0,b.jsx)("button",{type:"button",onClick:()=>z(a),className:`rounded-md px-3 py-1.5 transition-colors ${y===a?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"list"===a?"List":"Grid"},a))})]}),p?(0,b.jsx)("div",{className:"animate-pulse space-y-2",children:[1,2,3,4].map(a=>(0,b.jsx)("div",{className:"h-16 bg-gray-800/20 rounded-lg"},a))}):0===C.length?0===o.length?(0,b.jsx)(g.NodesEmptyState,{}):(0,b.jsx)(g.EmptyState,{variant:"nodes",title:"No nodes match your filters",sub:"Try clearing search or status filters, or wait for an agent to register."}):"grid"===y?(0,b.jsx)("div",{className:"grid min-w-0 grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4",children:C.map(a=>{let c=a.online?a.status:"offline",e="number"==typeof a.progress?a.progress:0,f=r(a.alias);return(0,b.jsxs)("div",{role:"button",tabIndex:0,onClick:()=>B(a.alias),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),B(a.alias))},className:`relative min-w-0 max-w-full overflow-hidden rounded-xl border border-[#2a2a4a] bg-[#111128] p-4 transition-colors hover:border-cyan-500/40 cursor-pointer ${!a.online?"opacity-60":""}`,children:[!a.online&&(0,b.jsx)("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:(0,b.jsx)("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",children:"Offline"})}),(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsxs)("div",{className:"relative shrink-0",children:[(0,b.jsx)(h.AliasAvatar,{alias:a.alias,size:36}),f&&(0,b.jsx)("span",{className:"absolute -right-1 -top-1 h-3 w-3 rounded-full border-2 border-[#111128] bg-red-500"})]}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"truncate text-base font-semibold text-white",children:a.alias}),f&&(0,b.jsx)("span",{className:"shrink-0 rounded-full bg-red-500/15 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-red-300",children:"New"}),(0,b.jsx)("span",{className:`shrink-0 rounded-md border px-2 py-0.5 text-[10px] uppercase tracking-wide ${i.SESSION_STATUS_CHIP_CLASS[c]||i.SESSION_STATUS_CHIP_CLASS.offline}`,children:c})]}),(0,b.jsxs)("div",{className:"mt-0.5 truncate text-xs text-gray-500",children:[a.agent||"—",(0,b.jsx)("span",{className:"text-gray-700 mx-1.5",children:"·"}),(0,b.jsx)("span",{title:a.server||"",children:k(a.server)})]})]}),(0,b.jsx)("span",{className:"hidden shrink-0 rounded-lg border border-cyan-500/15 bg-cyan-500/5 px-2 py-1 text-[10px] text-cyan-300/70 sm:inline",children:"Tap to chat"})]}),(0,b.jsxs)("div",{className:"mt-3 rounded-lg border border-[#1a1a2a] bg-[#0a0a15] px-3 py-2 text-xs",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"Current task"}),(0,b.jsx)("span",{className:"text-[10px] text-gray-600",children:(0,d.timeAgo)(a.last_seen_at||a.updated_at)})]}),(0,b.jsx)("div",{className:`mt-1 line-clamp-2 ${a.task?"text-gray-300":"text-gray-600 italic"}`,children:a.task||"No current task"})]}),e>0&&e<100&&(0,b.jsx)("div",{className:"mt-3 h-1.5 overflow-hidden rounded-full bg-gray-800",children:(0,b.jsx)("div",{className:"h-1.5 rounded-full bg-cyan-400 transition-all",style:{width:`${e}%`}})})]},a.alias)})}):(0,b.jsxs)("div",{className:"space-y-1 sm:space-y-2",children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-10 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:"Alias"}),(0,b.jsx)("div",{className:"col-span-2",children:"Agent · Server"}),(0,b.jsx)("div",{className:"col-span-4",children:"Current Task"}),(0,b.jsx)("div",{className:"col-span-1",children:"Updated"})]}),C.map(a=>{let c=a.online?a.status:"offline",e=r(a.alias);return(0,b.jsxs)("div",{role:"button",tabIndex:0,onClick:()=>B(a.alias),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),B(a.alias))},className:`rounded-lg border border-[#2a2a4a] bg-[#111128] px-3 py-2 sm:px-4 sm:py-3 transition-colors hover:border-cyan-500/40 cursor-pointer ${!a.online?"opacity-50":""}`,children:[(0,b.jsxs)("div",{className:"hidden sm:grid sm:grid-cols-10 gap-2 items-center",children:[(0,b.jsx)("div",{className:"col-span-1",children:(0,b.jsx)("span",{className:`text-xs px-2 py-0.5 rounded-md border ${i.SESSION_STATUS_CHIP_CLASS[c]||i.SESSION_STATUS_CHIP_CLASS.offline}`,children:c})}),(0,b.jsx)("div",{className:"col-span-2 min-w-0",children:(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,b.jsxs)("div",{className:"relative shrink-0",children:[(0,b.jsx)(h.AliasAvatar,{alias:a.alias,size:20}),e&&(0,b.jsx)("span",{className:"absolute -right-1 -top-1 h-2.5 w-2.5 rounded-full border border-[#111128] bg-red-500"})]}),(0,b.jsx)("span",{className:"truncate text-sm font-medium text-white",children:a.alias}),e&&(0,b.jsx)("span",{className:"shrink-0 rounded-full bg-red-500/15 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-red-300",children:"New"})]})}),(0,b.jsx)("div",{className:"col-span-2 truncate text-xs text-gray-400",title:a.server||"",children:(0,b.jsxs)("span",{className:"truncate",children:[a.agent||"--",(0,b.jsx)("span",{className:"text-gray-700 mx-1.5",children:"·"}),k(a.server)]})}),(0,b.jsx)("div",{className:"col-span-4 truncate text-xs text-gray-500",title:a.task||"",children:a.task||"--"}),(0,b.jsx)("div",{className:"col-span-1 text-xs text-gray-500",children:(0,d.timeAgo)(a.last_seen_at||a.updated_at)})]}),(0,b.jsxs)("div",{className:"sm:hidden space-y-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,b.jsxs)("div",{className:"relative shrink-0",children:[(0,b.jsx)(h.AliasAvatar,{alias:a.alias,size:28}),e&&(0,b.jsx)("span",{className:"absolute -right-1 -top-1 h-3 w-3 rounded-full border-2 border-[#111128] bg-red-500"})]}),(0,b.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-medium text-white",children:a.alias}),e&&(0,b.jsx)("span",{className:"shrink-0 rounded-full bg-red-500/15 px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wide text-red-300",children:"New"})]}),(0,b.jsxs)("div",{className:"truncate text-[10px] text-gray-500",children:[a.agent||"—"," · ",(0,d.timeAgo)(a.last_seen_at||a.updated_at)]})]}),(0,b.jsx)("span",{className:`shrink-0 text-xs px-2 py-0.5 rounded-md border ${i.SESSION_STATUS_CHIP_CLASS[c]||i.SESSION_STATUS_CHIP_CLASS.offline}`,children:c})]}),a.task&&(0,b.jsx)("div",{className:"truncate text-xs text-gray-500",children:a.task})]})]},a.alias)})]}),A&&(0,b.jsx)(f.TaskChatPanel,{alias:A,onClose:()=>B(null)})]})}])}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__0nw~zhp._.js.map