@sleep2agi/agent-network-dashboard 0.6.3-preview.57 → 0.6.3-preview.59
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.
- package/.next/BUILD_COMMIT +1 -1
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +11 -11
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin/page.js.nft.json +1 -1
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +2 -2
- package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/logs/page.js.nft.json +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +2 -2
- package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/messages/page.js.nft.json +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +2 -2
- package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/node/page.js.nft.json +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +2 -2
- package/.next/server/app/node.segments/_full.segment.rsc +2 -2
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/nodes/[alias]/page.js.nft.json +1 -1
- package/.next/server/app/nodes/[alias]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes/page.js.nft.json +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +2 -2
- package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/org/page.js.nft.json +1 -1
- package/.next/server/app/org/page_client-reference-manifest.js +1 -1
- package/.next/server/app/org.html +2 -2
- package/.next/server/app/org.rsc +2 -2
- package/.next/server/app/org.segments/_full.segment.rsc +2 -2
- package/.next/server/app/org.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/org.segments/org/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers/page.js.nft.json +1 -1
- package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers.html +2 -2
- package/.next/server/app/providers.rsc +2 -2
- package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
- package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/requirements/[id]/page.js.nft.json +1 -1
- package/.next/server/app/requirements/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/requirements/page.js.nft.json +1 -1
- package/.next/server/app/requirements/page_client-reference-manifest.js +1 -1
- package/.next/server/app/requirements.html +2 -2
- package/.next/server/app/requirements.rsc +3 -3
- package/.next/server/app/requirements.segments/_full.segment.rsc +3 -3
- package/.next/server/app/requirements.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/requirements.segments/requirements/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/scheduled-tasks/page.js.nft.json +1 -1
- package/.next/server/app/scheduled-tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/scheduled-tasks.html +2 -2
- package/.next/server/app/scheduled-tasks.rsc +2 -2
- package/.next/server/app/scheduled-tasks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/scheduled-tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/scheduled-tasks.segments/scheduled-tasks/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/server-logs/page.js.nft.json +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +2 -2
- package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/servers/page.js.nft.json +1 -1
- package/.next/server/app/servers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/servers.html +2 -2
- package/.next/server/app/servers.rsc +2 -2
- package/.next/server/app/servers.segments/_full.segment.rsc +2 -2
- package/.next/server/app/servers.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/networks/page.js.nft.json +1 -1
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page.js.nft.json +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/skillhub/page.js.nft.json +1 -1
- package/.next/server/app/skillhub/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skillhub.html +2 -2
- package/.next/server/app/skillhub.rsc +2 -2
- package/.next/server/app/skillhub.segments/_full.segment.rsc +2 -2
- package/.next/server/app/skillhub.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/skillhub.segments/skillhub/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/tasks/[id]/page.js.nft.json +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page.js.nft.json +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +2 -2
- package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0-94ipy._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0-94ipy._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js.map +1 -1
- package/.next/server/chunks/ssr/app_099f0wg._.js +1 -1
- package/.next/server/chunks/ssr/app_099f0wg._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2juzvtg9ne4yt.js → 0bdi2zpxri7v7.js} +1 -1
- package/.next/static/chunks/15_vs82xxi3ms.js +1 -0
- package/.next/static/chunks/{21djd6ixldlx0.js → 18j3xrz53qmqz.js} +1 -1
- package/.next/static/chunks/{0k-4980o5t7_r.css → 1uj0l14szn69i.css} +1 -1
- package/.next/static/chunks/{0cuzbmf4k1kgl.js → 3bhrv--4hfk_s.js} +1 -1
- package/.next/static/chunks/3vv0y_64bnnsf.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/CommentMarkdown.tsx +36 -0
- package/app/requirements/[id]/page.tsx +4 -1
- package/app/requirements/page.tsx +25 -5
- package/package.json +1 -1
- package/.next/static/chunks/0jt-1caejz1jv.js +0 -1
- package/.next/static/chunks/3shtxab8cmux9.js +0 -1
- /package/.next/static/{_HZB6K84VKNaxf1K7dqqj → P7kvvskkiKN8sB8Fz6DfZ}/_buildManifest.js +0 -0
- /package/.next/static/{_HZB6K84VKNaxf1K7dqqj → P7kvvskkiKN8sB8Fz6DfZ}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{_HZB6K84VKNaxf1K7dqqj → P7kvvskkiKN8sB8Fz6DfZ}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../app/components/EmptyState.tsx","../../../../app/requirements/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\n\nexport type EmptyVariant = 'nodes' | 'tasks' | 'messages' | 'logs' | 'tokens' | 'networks' | 'generic';\n\ninterface EmptyStateProps {\n /** Picks the icon glyph and default copy if title/sub omitted. */\n variant?: EmptyVariant;\n /** Optional override headline. */\n title?: string;\n /** Optional override sub-copy. */\n sub?: string;\n /** Optional CTA: text + href (internal) or onClick. */\n cta?: { label: string; href?: string; onClick?: () => void };\n /** Compact mode for in-card empty states (smaller padding). */\n compact?: boolean;\n}\n\nconst DEFAULTS: Record<EmptyVariant, { title: string; sub: string }> = {\n nodes: { title: 'No agents in this network', sub: 'Agent sessions will appear here once they connect to the CommHub.' },\n tasks: { title: 'No tasks yet', sub: 'Tasks will appear here when agents send them via CommHub.' },\n messages: { title: 'No messages', sub: 'Messages between agents will appear here.' },\n logs: { title: 'No audit logs', sub: 'Events will appear here when users register, login, or perform actions.' },\n tokens: { title: 'No API tokens', sub: 'Create one to authenticate CLI tools and external integrations.' },\n networks: { title: 'No networks found', sub: 'Create one or sign in with V3 auth to see your networks.' },\n generic: { title: 'Nothing here yet', sub: 'Data will appear here once available.' },\n};\n\n/**\n * Minimal monochrome SVG glyphs per variant. No filled shapes, no gradients,\n * no AI-decoration — just thin-stroke line art that fades into the page.\n * 64×64 viewBox; rendered at 56×56 (compact 40×40).\n */\nfunction Glyph({ variant, size }: { variant: EmptyVariant; size: number }) {\n const s = { width: size, height: size };\n const baseProps = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.25,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n\n switch (variant) {\n case 'nodes':\n // Mesh with dashed edges = \"nodes will land here\"\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"14\" r=\"4\" />\n <circle cx=\"14\" cy=\"44\" r=\"4\" />\n <circle cx=\"50\" cy=\"44\" r=\"4\" />\n <line x1=\"32\" y1=\"18\" x2=\"14\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"32\" y1=\"18\" x2=\"50\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"18\" y1=\"44\" x2=\"46\" y2=\"44\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n </g>\n </svg>\n );\n case 'tasks':\n // Empty checkbox list\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <rect x=\"14\" y=\"14\" width=\"36\" height=\"6\" rx=\"1.5\" />\n <rect x=\"14\" y=\"26\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.6\" />\n <rect x=\"14\" y=\"38\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.35\" />\n </g>\n </svg>\n );\n case 'messages':\n // Speech bubble outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <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\" />\n <line x1=\"22\" y1=\"28\" x2=\"42\" y2=\"28\" opacity=\"0.5\" />\n <line x1=\"22\" y1=\"34\" x2=\"36\" y2=\"34\" opacity=\"0.5\" />\n </g>\n </svg>\n );\n case 'logs':\n // Document with lines\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <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\" />\n <path d=\"M40 12 v8 h8\" opacity=\"0.6\" />\n <line x1=\"24\" y1=\"32\" x2=\"40\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"24\" y1=\"38\" x2=\"40\" y2=\"38\" opacity=\"0.4\" />\n <line x1=\"24\" y1=\"44\" x2=\"34\" y2=\"44\" opacity=\"0.25\" />\n </g>\n </svg>\n );\n case 'tokens':\n // Key outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"22\" cy=\"32\" r=\"8\" />\n <line x1=\"30\" y1=\"32\" x2=\"54\" y2=\"32\" />\n <line x1=\"44\" y1=\"32\" x2=\"44\" y2=\"38\" />\n <line x1=\"50\" y1=\"32\" x2=\"50\" y2=\"40\" />\n </g>\n </svg>\n );\n case 'networks':\n // Globe-ish concentric ovals\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"18\" />\n <ellipse cx=\"32\" cy=\"32\" rx=\"18\" ry=\"9\" opacity=\"0.55\" />\n <line x1=\"14\" y1=\"32\" x2=\"50\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"32\" y1=\"14\" x2=\"32\" y2=\"50\" opacity=\"0.55\" />\n </g>\n </svg>\n );\n case 'generic':\n default:\n // Soft sparkle outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"14\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <circle cx=\"32\" cy=\"32\" r=\"3\" />\n </g>\n </svg>\n );\n }\n}\n\nexport function EmptyState({ variant = 'generic', title, sub, cta, compact = false }: EmptyStateProps) {\n const d = DEFAULTS[variant];\n const headline = title ?? d.title;\n const subcopy = sub ?? d.sub;\n const iconSize = compact ? 40 : 56;\n\n return (\n <div className={`text-center ${compact ? 'py-8' : 'py-16'} px-4`} role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <Glyph variant={variant} size={iconSize} />\n </div>\n <h3 className={`font-medium text-gray-300 ${compact ? 'text-sm' : 'text-base'}`}>{headline}</h3>\n {subcopy && (\n <p className={`text-gray-500 ${compact ? 'text-xs mt-1.5' : 'text-sm mt-2'} max-w-md mx-auto leading-relaxed`}>\n {subcopy}\n </p>\n )}\n {cta && (\n <div className=\"mt-4\">\n {cta.href ? (\n <Link href={cta.href} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </Link>\n ) : (\n <button onClick={cta.onClick} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Round 105 (issue #90): centered card shell so the Overview empty state\n * reads as an intentional, layout-aligned card instead of bare text\n * floating in the content column. */\nfunction EmptyCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"max-w-2xl mx-auto rounded-xl border border-[#26262b] bg-[#161618] shadow-lg shadow-black/20\">\n {children}\n </div>\n );\n}\n\n/**\n * Overview-specific variant. Three cases:\n * 1. network-mismatch — agents exist globally, none in this network\n * 2. agents-offline — 0 registered now BUT task history exists, so this\n * is NOT a first run (round 105 / issue #90: showing \"Spin up your\n * first agent\" next to \"acked: 499\" was misleading)\n * 3. true first-run — 0 agents, 0 history → quickstart command\n */\nexport function NodesEmptyState({\n hint,\n taskHistoryCount = 0,\n}: {\n hint?: { global_count?: number; filtered_network?: string };\n taskHistoryCount?: number;\n}) {\n if (hint?.global_count) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents in this network\"\n sub={`Server has ${hint.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}\n />\n </EmptyCard>\n );\n }\n\n // Round 105 (issue #90): there's task history but no agents online right\n // now — they finished or disconnected. Don't pitch a first-run setup;\n // point at the history instead.\n if (taskHistoryCount > 0) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents online\"\n sub={`Every agent in this network is currently offline. ${taskHistoryCount.toLocaleString()} task${taskHistoryCount === 1 ? '' : 's'} in history — they may have finished their work or disconnected.`}\n cta={{ label: 'View task history', href: '/tasks' }}\n />\n </EmptyCard>\n );\n }\n\n // Round 52: true empty state (zero agents anywhere) — show the\n // quickstart command inline so users don't have to leave the dashboard\n // to figure out how to spin up their first agent.\n return (\n <EmptyCard>\n <div className=\"text-center py-16 px-4\" role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <svg viewBox=\"0 0 64 64\" width={56} height={56}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\">\n <rect x=\"10\" y=\"20\" width=\"44\" height=\"28\" rx=\"2\" />\n <rect x=\"20\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"32\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"44\" y=\"32\" width=\"4\" height=\"8\" opacity=\"0.5\" />\n <line x1=\"10\" y1=\"26\" x2=\"54\" y2=\"26\" opacity=\"0.4\" />\n <circle cx=\"14\" cy=\"23\" r=\"0.8\" fill=\"currentColor\" />\n </g>\n </svg>\n </div>\n <h3 className=\"font-medium text-gray-300 text-base\">Spin up your first agent</h3>\n <p className=\"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed\">\n Run this in a fresh terminal to register an agent with this CommHub:\n </p>\n <div className=\"mt-4 inline-block\">\n <QuickstartCommand cmd=\"npx --yes @sleep2agi/agent-network init\" />\n </div>\n {/* #214 F6: expectation management — without this line, users\n copy the command and stare at an empty screen not knowing\n what to wait for. The page polls every 5s, so the node\n really does appear by itself. */}\n <p className=\"text-gray-600 text-xs mt-3 max-w-md mx-auto\">\n Once the agent connects, it appears here automatically within a\n few seconds — no refresh needed.\n </p>\n <div className=\"mt-3\">\n <a\n href=\"https://anet.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300\"\n >\n Full quickstart guide\n <span aria-hidden>→</span>\n </a>\n </div>\n </div>\n </EmptyCard>\n );\n}\n\n/** Code block + inline copy button used by the empty-Overview first-run\n * CTA. State lives here so the parent stays stateless. */\nfunction QuickstartCommand({ cmd }: { cmd: string }) {\n const [copied, setCopied] = useState(false);\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(cmd);\n setCopied(true);\n setTimeout(() => setCopied(false), 1800);\n } catch {}\n };\n return (\n <div className=\"anet-empty-cmd flex items-start sm:items-center gap-2 bg-[#0e0e10] border border-[#26262b] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm\">\n {/* #209 R44: long quickstart commands (e.g. the `npm install -g …`\n variant) overflowed the empty-state card horizontally on phones\n because <code> defaults to white-space:pre. break-all on mobile\n lets them wrap inside the box; sm: up restores normal wrapping\n so desktop monospace lines stay clean. items-start on phones\n aligns the Copy button to the top so a wrapped 2-line command\n doesn't bottom-anchor the button. */}\n <code className=\"text-cyan-300 font-mono select-all min-w-0 break-all sm:break-normal\">{cmd}</code>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? 'Copied' : 'Copy command'}\n className=\"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1c1c1f] transition-colors\"\n >\n {copied ? (\n <span className=\"flex items-center gap-1 text-green-400\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n Copied\n </span>\n ) : (\n <span className=\"flex items-center gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n Copy\n </span>\n )}\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState, Suspense } from 'react';\nimport Link from 'next/link';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport { EmptyState } from '../components/EmptyState';\n\n/**\n * Requirements board — #1633 (read-only first slice).\n *\n * Why this page exists: the dashboard only ever showed dispatch tasks\n * (/tasks = who asked whom). The requirement board — 需求池 / 进行中 /\n * 完成, tags, owner vs agent owner, checklist progress — is what people\n * actually work from in the client. This is the read half; the write half\n * is #1634.\n */\n\ninterface RequirementPerson { kind: 'user' | 'node'; id: string; alias?: string }\ninterface Requirement {\n id: string;\n seq: number;\n name: string;\n column: 'pool' | 'doing' | 'done' | 'abandoned';\n priority: 'high' | 'normal' | 'low' | 'lowest';\n due?: string;\n tags?: string[];\n owner?: RequirementPerson | null;\n agent_owner?: RequirementPerson | null;\n project_id?: string | null;\n checklist_count?: { total: number; done: number };\n children?: { total: number; done: number };\n updatedAt?: string;\n has_description?: boolean;\n}\n\nconst COLUMNS: { key: Requirement['column'] | ''; label: string }[] = [\n { key: '', label: 'All' },\n { key: 'pool', label: '需求池' },\n { key: 'doing', label: '进行中' },\n { key: 'done', label: '完成' },\n { key: 'abandoned', label: '已放弃' },\n];\n\nconst COLUMN_CHIP: Record<string, string> = {\n pool: 'bg-amber-500/10 text-amber-300 border-amber-500/20',\n doing: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n done: 'bg-emerald-500/10 text-emerald-300 border-emerald-500/20',\n abandoned: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n};\n\nfunction priorityClass(priority: string) {\n if (priority === 'high') return 'text-red-400';\n if (priority === 'low' || priority === 'lowest') return 'text-gray-600';\n return 'text-gray-400';\n}\n\nfunction personLabel(p?: RequirementPerson | null) {\n if (!p) return '—';\n return p.alias || p.id;\n}\n\nfunction dueLabel(due?: string) {\n if (!due) return '—';\n const day = due.slice(0, 10);\n const overdue = day < new Date().toISOString().slice(0, 10);\n return overdue ? <span className=\"text-red-400\">{day}</span> : <span className=\"text-gray-400\">{day}</span>;\n}\n\nfunction RequirementsContent() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [rows, setRows] = useState<Requirement[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [needsLogin, setNeedsLogin] = useState(false);\n\n const status = searchParams.get('status') || '';\n const tag = searchParams.get('tag') || '';\n const q = searchParams.get('q') || '';\n const [tagInput, setTagInput] = useState(tag);\n const [qInput, setQInput] = useState(q);\n\n const setParam = useCallback((patch: Record<string, string>) => {\n const next = new URLSearchParams(searchParams.toString());\n for (const [key, value] of Object.entries(patch)) {\n if (value) next.set(key, value);\n else next.delete(key);\n }\n const qs = next.toString();\n router.replace(qs ? `/requirements?${qs}` : '/requirements', { scroll: false });\n }, [router, searchParams]);\n\n const load = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const params = new URLSearchParams();\n if (status) params.set('status', status);\n if (tag) params.set('tag', tag);\n if (q) params.set('q', q);\n params.set('limit', '200');\n const res = await fetch(`/api/hub/requirements?${params.toString()}`, { cache: 'no-store' });\n if (res.status === 401) { setNeedsLogin(true); setRows([]); return; }\n const data = await res.json();\n if (!res.ok || !data.ok) {\n setError(data?.error || `hub_${res.status}`);\n setRows([]);\n return;\n }\n setNeedsLogin(false);\n setRows(data.requirements || []);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [status, tag, q]);\n\n useEffect(() => { load(); }, [load]);\n\n const counts = useMemo(() => {\n const out: Record<string, number> = {};\n for (const r of rows) out[r.column] = (out[r.column] || 0) + 1;\n return out;\n }, [rows]);\n\n return (\n <div className=\"min-h-screen bg-[var(--bg)] text-gray-200\">\n <div className=\"mx-auto max-w-6xl px-4 py-6 sm:px-6\">\n <div className=\"mb-5 flex flex-wrap items-end justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold text-white\">Requirements</h1>\n <p className=\"mt-1 text-xs text-gray-500\">\n 需求池 / 进行中 / 完成 —— 只读视图(写面见 #1634)。任务派单在 <Link href=\"/tasks\" className=\"text-blue-400 hover:underline\">Tasks</Link>。\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => load()}\n className=\"rounded-lg border border-[var(--border)] px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Refresh\n </button>\n </div>\n\n {/* Status tabs */}\n <div className=\"mb-4 flex flex-wrap items-center gap-1.5\">\n {COLUMNS.map(col => {\n const count = col.key ? counts[col.key] || 0 : rows.length;\n const active = status === col.key;\n return (\n <button\n key={col.key || 'all'}\n type=\"button\"\n onClick={() => setParam({ status: col.key })}\n className={`rounded-md border px-3 py-1.5 text-xs transition-colors ${\n active\n ? 'border-blue-500/30 bg-blue-500/10 text-blue-300'\n : 'border-transparent text-gray-500 hover:bg-[var(--border)]/60 hover:text-gray-300'\n }`}\n >\n {col.label}\n <span className=\"ml-1.5 text-[10px] tabular-nums opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n\n {/* Text filters */}\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Search</span>\n <input\n value={qInput}\n onChange={e => setQInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ q: qInput }); }}\n onBlur={() => { if (qInput !== q) setParam({ q: qInput }); }}\n placeholder=\"标题 / 人 / 标签\"\n className=\"w-40 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none sm:w-56\"\n />\n </div>\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Tag</span>\n <input\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ tag: tagInput }); }}\n onBlur={() => { if (tagInput !== tag) setParam({ tag: tagInput }); }}\n placeholder=\"exact tag\"\n className=\"w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n {(status || tag || q) && (\n <button\n type=\"button\"\n onClick={() => { setTagInput(''); setQInput(''); setParam({ status: '', tag: '', q: '' }); }}\n className=\"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:border-gray-600 hover:text-gray-200\"\n >\n Clear filters\n </button>\n )}\n </div>\n\n {needsLogin && (\n <div className=\"mb-4 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-300\">\n 会话已过期,<Link href=\"/login\" className=\"underline\">重新登录</Link> 后再看需求。\n </div>\n )}\n {error && !needsLogin && (\n <div className=\"mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-3 text-sm text-red-300\">\n 读取失败:{error}\n <button type=\"button\" onClick={() => load()} className=\"ml-3 underline\">重试</button>\n </div>\n )}\n\n {loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"h-12 animate-pulse rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)]\" />\n ))}\n </div>\n ) : rows.length === 0 ? (\n <EmptyState\n variant=\"generic\"\n title={status || tag || q ? '没有符合筛选的需求' : '需求池是空的'}\n sub={status || tag || q ? '清掉筛选再试,或换一个标签。' : '客户端建一条需求后,这里就会出现。'}\n cta={status || tag || q ? { label: '清空筛选', onClick: () => setParam({ status: '', tag: '', q: '' }) } : undefined}\n />\n ) : (\n <ul className=\"divide-y divide-[var(--border)] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)]\">\n {rows.map(row => {\n const chk = row.checklist_count;\n const kids = row.children;\n return (\n <li key={row.id} className=\"hover:bg-[var(--bg-secondary)]/60\">\n <Link href={`/requirements/${row.id}`} className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 px-3 py-2.5 sm:px-4\">\n <span className=\"w-12 shrink-0 text-[11px] tabular-nums text-gray-600\">#{row.seq}</span>\n <span className={`shrink-0 rounded border px-1.5 py-0.5 text-[10px] ${COLUMN_CHIP[row.column] || COLUMN_CHIP.abandoned}`}>\n {row.column}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm text-gray-100\">{row.name}</span>\n {(row.tags || []).slice(0, 3).map(t => (\n <span key={t} className=\"hidden shrink-0 rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-[10px] text-gray-400 sm:inline\">\n {t}\n </span>\n ))}\n <span className={`shrink-0 text-[11px] ${priorityClass(row.priority)}`}>{row.priority}</span>\n <span className=\"hidden w-24 shrink-0 truncate text-[11px] text-gray-500 sm:inline\">{personLabel(row.agent_owner)}</span>\n <span className=\"w-20 shrink-0 text-right text-[11px]\">{dueLabel(row.due)}</span>\n {chk && chk.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 sm:inline\">\n ✓ {chk.done}/{chk.total}\n </span>\n )}\n {kids && kids.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 md:inline\">\n ↳ {kids.done}/{kids.total}\n </span>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n );\n}\n\nexport default function RequirementsPage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[var(--bg)]\" />}>\n <RequirementsContent />\n </Suspense>\n );\n}\n"],"names":["DEFAULTS","nodes","title","sub","tasks","messages","logs","tokens","networks","generic","Glyph","variant","size","s","width","height","baseProps","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","viewBox","cx","cy","r","x1","y1","x2","y2","strokeDasharray","opacity","x","y","rx","d","ry","EmptyState","cta","compact","headline","subcopy","iconSize","className","role","href","label","onClick","EmptyCard","children","NodesEmptyState","hint","taskHistoryCount","global_count","toLocaleString","QuickstartCommand","cmd","target","rel","copied","setCopied","onCopy","navigator","clipboard","writeText","setTimeout","type","COLUMNS","key","COLUMN_CHIP","pool","doing","done","abandoned","priorityClass","priority","personLabel","p","alias","id","dueLabel","due","day","slice","overdue","Date","toISOString","RequirementsContent","router","searchParams","rows","setRows","loading","setLoading","error","setError","needsLogin","setNeedsLogin","status","get","tag","q","tagInput","setTagInput","qInput","setQInput","setParam","patch","next","URLSearchParams","toString","value","Object","entries","set","delete","qs","replace","scroll","load","params","res","fetch","cache","data","json","ok","requirements","e","Error","message","counts","out","column","map","col","count","length","active","onChange","onKeyDown","onBlur","placeholder","Array","from","_","i","undefined","row","chk","checklist_count","kids","seq","name","tags","t","agent_owner","total","RequirementsPage","fallback"],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAiBA,IAAMA,EAAiE,CACrEC,MAAU,CAAEC,MAAO,4BAA+BC,IAAK,mEAAoE,EAC3HC,MAAU,CAAEF,MAAO,eAA+BC,IAAK,2DAA4D,EACnHE,SAAU,CAAEH,MAAO,cAA+BC,IAAK,2CAA4C,EACnGG,KAAU,CAAEJ,MAAO,gBAA+BC,IAAK,yEAA0E,EACjII,OAAU,CAAEL,MAAO,gBAA+BC,IAAK,iEAAkE,EACzHK,SAAU,CAAEN,MAAO,oBAA+BC,IAAK,0DAA2D,EAClHM,QAAU,CAAEP,MAAO,mBAA+BC,IAAK,uCAAwC,CACjG,EAOA,SAASO,EAAM,SAAEC,CAAO,MAAEC,CAAI,CAA2C,EACvE,IAAMC,EAAI,CAAEC,MAAOF,EAAMG,OAAQH,CAAK,EAChCI,EAAY,CAChBC,KAAM,OACNC,OAAQ,eACRC,YAAa,KACbC,cAAe,QACfC,eAAgB,OAClB,EAEA,OAAQV,GACN,IAAK,QAEH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIW,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOO,GAAG,KAAKC,GAAG,KAAKC,EAAE,MAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOF,GAAG,KAAKC,GAAG,KAAKC,EAAE,MAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOF,GAAG,KAAKC,GAAG,KAAKC,EAAE,MAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,gBAAgB,MAAMC,QAAQ,QACpE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,gBAAgB,MAAMC,QAAQ,QACpE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,gBAAgB,MAAMC,QAAQ,YAI5E,KAAK,QAEH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIT,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKgB,EAAE,KAAKC,EAAE,KAAKnB,MAAM,KAAKC,OAAO,IAAImB,GAAG,QAC7C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKF,EAAE,KAAKC,EAAE,KAAKnB,MAAM,KAAKC,OAAO,IAAImB,GAAG,MAAMH,QAAQ,QAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,EAAE,KAAKC,EAAE,KAAKnB,MAAM,KAAKC,OAAO,IAAImB,GAAG,MAAMH,QAAQ,aAInE,KAAK,WAEH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIT,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKmB,EAAE,8GACR,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKT,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,QAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,YAItD,KAAK,OAEH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIT,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKmB,EAAE,qFACR,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,EAAE,eAAeJ,QAAQ,QAC/B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,SAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,QAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,aAItD,KAAK,SAEH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIT,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOO,GAAG,KAAKC,GAAG,KAAKC,EAAE,MAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,OACjC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKH,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,OACjC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKH,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,WAIzC,KAAK,WAEH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIP,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOO,GAAG,KAAKC,GAAG,KAAKC,EAAE,OAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQF,GAAG,KAAKC,GAAG,KAAKU,GAAG,KAAKE,GAAG,IAAIL,QAAQ,SAChD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,SAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,aAItD,KAAK,IAGH,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIT,QAAQ,YAAa,GAAGT,CAAC,UAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAG,GAAGG,CAAS,WACd,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOO,GAAG,KAAKC,GAAG,KAAKC,EAAE,KAAKK,gBAAgB,MAAMC,QAAQ,QAC7D,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOR,GAAG,KAAKC,GAAG,KAAKC,EAAE,UAIpC,CACF,CAEO,SAASY,EAAW,SAAE1B,EAAU,SAAS,OAAET,CAAK,KAAEC,CAAG,KAAEmC,CAAG,SAAEC,GAAU,CAAK,CAAmB,EACnG,IAAMJ,EAAInC,CAAQ,CAACW,EAAQ,CACrB6B,EAAWtC,GAASiC,EAAEjC,KAAK,CAC3BuC,EAAUtC,GAAOgC,EAAEhC,GAAG,CAG5B,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIwC,UAAW,CAAC,YAAY,EAAEJ,EAAU,OAAS,QAAQ,KAAK,CAAC,CAAEK,KAAK,mBACrE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAID,UAAU,8EAA8E,aAAW,CAAA,CAAA,WACtG,CAAA,EAAA,EAAA,GAAA,EAACjC,EAAAA,CAAMC,QAASA,EAASC,KALd2B,CAKoBG,CALV,GAAK,OAO5B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGC,UAAW,CAAC,0BAA0B,EAAEJ,EAAU,UAAY,YAAA,CAAa,UAAGC,IACjFC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEE,UAAW,CAAC,cAAc,EAAEJ,EAAU,iBAAmB,eAAe,iCAAiC,CAAC,UAC1GE,IAGJH,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIK,UAAU,gBACZL,EAAIO,IAAI,CACP,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAI,CAAA,CAACA,KAAMP,EAAIO,IAAI,CAAEF,UAAU,mGAC7BL,EAAIQ,KAAK,CACV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,aAAW,CAAA,CAAA,WAAC,SAGpB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAOC,QAAST,EAAIS,OAAO,CAAEJ,UAAU,mGACrCL,EAAIQ,KAAK,CACV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,aAAW,CAAA,CAAA,WAAC,aAOhC,CAKA,SAASE,EAAU,UAAEC,CAAQ,CAAiC,EAC5D,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIN,UAAU,uGACZM,GAGP,CAgGA,SAASM,EAAkB,KAAEC,CAAG,CAAmB,EACjD,GAAM,CAACG,EAAQC,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/BC,EAAS,UACb,GAAI,CACF,MAAMC,UAAUC,SAAS,CAACC,SAAS,CAACR,GACpCI,GAAU,GACVK,WAAW,IAAML,GAAU,GAAQ,KACrC,CAAE,KAAM,CAAC,CACX,EACA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIjB,UAAU,wJAQb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,gFAAwEa,IACxF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCU,KAAK,SACLnB,QAASc,EACT,aAAYF,EAAS,SAAW,eAChChB,UAAU,8HAETgB,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKhB,UAAU,mDACd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI7B,MAAM,KAAKC,OAAO,KAAKO,QAAQ,YAAYL,KAAK,OAAOC,OAAO,eAAeC,YAAY,IAAIC,cAAc,QAAQC,eAAe,iBACrI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKc,EAAE,sBACJ,YAIR,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKQ,UAAU,oCACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI7B,MAAM,KAAKC,OAAO,KAAKO,QAAQ,YAAYL,KAAK,OAAOC,OAAO,eAAeC,YAAY,MAAMC,cAAc,QAAQC,eAAe,kBACvI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKW,EAAE,IAAIC,EAAE,IAAInB,MAAM,KAAKC,OAAO,KAAKmB,GAAG,IAAIE,GAAG,MACnD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKD,EAAE,+DACJ,cAOlB,2CAlIO,SAASe,AAAgB,MAC9BC,CAAI,kBACJC,EAAmB,CAAC,CAIrB,SACC,AAAID,GAAME,aAEN,CAFoB,AAEpB,EAAA,EAAA,GAAA,EAACL,EAAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAACX,EAAAA,CACC1B,QAAQ,QACRT,MAAM,4BACNC,IAAK,CAAC,WAAW,EAAEgD,EAAKE,YAAY,CAAC,iGAAiG,CAAC,KAS3ID,EAAmB,EAEnB,CAFsB,AAEtB,EAAA,EAAA,GAAA,EAACJ,EAAAA,UACC,CAAA,EAAA,EAAA,GAAA,EAACX,EAAAA,CACC1B,QAAQ,QACRT,MAAM,mBACNC,IAAK,CAAC,kDAAkD,EAAEiD,EAAiBE,cAAc,GAAG,KAAK,EAAuB,IAArBF,EAAyB,GAAK,IAAI,gEAAgE,CAAC,CACtMd,IAAK,CAAEQ,MAAO,oBAAqBD,KAAM,QAAS,MAUxD,CAAA,EAAA,EAAA,GAAA,EAACG,EAAAA,UACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIL,UAAU,yBAAyBC,KAAK,mBAC3C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAID,UAAU,8EAA8E,aAAW,CAAA,CAAA,WACtG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIrB,QAAQ,YAAYR,MAAO,GAAIC,OAAQ,YAC1C,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAEG,OAAO,eAAeC,YAAY,MAAMF,KAAK,iBAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKe,EAAE,KAAKC,EAAE,KAAKnB,MAAM,KAAKC,OAAO,KAAKmB,GAAG,MAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKF,EAAE,KAAKC,EAAE,KAAKnB,MAAM,IAAIC,OAAO,IAAIgB,QAAQ,QACjD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,EAAE,KAAKC,EAAE,KAAKnB,MAAM,IAAIC,OAAO,IAAIgB,QAAQ,QACjD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKC,EAAE,KAAKC,EAAE,KAAKnB,MAAM,IAAIC,OAAO,IAAIgB,QAAQ,QACjD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKL,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKE,QAAQ,QAC9C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAOR,GAAG,KAAKC,GAAG,KAAKC,EAAE,MAAMR,KAAK,wBAI3C,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG0B,UAAU,+CAAsC,6BACpD,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEA,UAAU,uEAA8D,yEAG3E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,6BACb,CAAA,EAAA,EAAA,GAAA,EAACY,EAAAA,CAAkBC,IAAI,8CAMzB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAEb,UAAU,uDAA8C,qGAI3D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,gBACb,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CACCE,KAAK,kBACLY,OAAO,SACPC,IAAI,sBACJf,UAAU,mGACX,wBAEC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,aAAW,CAAA,CAAA,WAAC,eAM9B,6CC5QA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OA8BA,IAAMwB,EAAgE,CACpE,CAAEC,IAAK,GAAItB,MAAO,KAAM,EACxB,CAAEsB,IAAK,OAAQtB,MAAO,KAAM,EAC5B,CAAEsB,IAAK,QAAStB,MAAO,KAAM,EAC7B,CAAEsB,IAAK,OAAQtB,MAAO,IAAK,EAC3B,CAAEsB,IAAK,YAAatB,MAAO,KAAM,EAClC,CAEKuB,EAAsC,CAC1CC,KAAM,qDACNC,MAAO,kDACPC,KAAM,2DACNC,UAAW,iDACb,EAoBA,SAASc,IACP,IAAMC,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClBC,EAAe,CAAA,EAAA,EAAA,eAAA,AAAe,IAE9B,CAACC,EAAMC,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,EAAE,EAC5C,CAACC,EAASC,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAACC,EAAOC,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC7B,CAACC,EAAYC,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEvCC,EAAST,EAAaU,GAAG,CAAC,WAAa,GACvCC,EAAMX,EAAaU,GAAG,CAAC,QAAU,GACjCE,EAAIZ,EAAaU,GAAG,CAAC,MAAQ,GAC7B,CAACG,EAAUC,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAACH,GACnC,CAACI,EAAQC,EAAU,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAASJ,GAE/BK,EAAW,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,AAACC,IAC5B,IAAMC,EAAO,IAAIC,gBAAgBpB,EAAaqB,QAAQ,IACtD,IAAK,GAAM,CAAC1C,EAAK2C,EAAM,GAAIC,OAAOC,OAAO,CAACN,GACpCI,EAAOH,EADqC,AAChCM,GAAG,CAAC9C,EAAK2C,GACpBH,EAAKO,MAAM,CAAC/C,GAEnB,IAAMgD,EAAKR,EAAKE,QAAQ,GACxBtB,EAAO6B,OAAO,CAACD,EAAK,CAAC,cAAc,EAAEA,EAAAA,CAAI,CAAG,gBAAiB,CAAEE,QAAQ,CAAM,EAC/E,EAAG,CAAC9B,EAAQC,EAAa,EAEnB8B,EAAO,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UACvB1B,GAAW,GACXE,EAAS,IACT,GAAI,CACF,IAAMyB,EAAS,IAAIX,gBACfX,GAAQsB,EAAON,GAAG,CAAC,SAAUhB,GAC7BE,GAAKoB,EAAON,GAAG,CAAC,MAAOd,GACvBC,GAAGmB,EAAON,GAAG,CAAC,IAAKb,GACvBmB,EAAON,GAAG,CAAC,QAAS,OACpB,IAAMO,EAAM,MAAMC,MAAM,CAAC,sBAAsB,EAAEF,EAAOV,QAAQ,GAAA,CAAI,CAAE,CAAEa,MAAO,UAAW,GAC1F,GAAmB,MAAfF,EAAIvB,MAAM,CAAU,CAAED,EAAc,IAAON,EAAQ,EAAE,EAAG,MAAQ,CACpE,IAAMiC,EAAO,MAAMH,EAAII,IAAI,GAC3B,GAAI,CAACJ,EAAIK,EAAE,EAAI,CAACF,EAAKE,EAAE,CAAE,CACvB/B,EAAS6B,GAAM9B,OAAS,CAAC,IAAI,EAAE2B,EAAIvB,MAAM,CAAA,CAAE,EAC3CP,EAAQ,EAAE,EACV,MACF,CACAM,GAAc,GACdN,EAAQiC,EAAKG,YAAY,EAAI,EAAE,CACjC,CAAE,MAAOC,EAAY,CACnBjC,EAASiC,aAAaC,MAAQD,EAAEE,OAAO,CAAG,gBAC1CvC,EAAQ,EAAE,CACZ,QAAU,CACRE,GAAW,EACb,CACF,EAAG,CAACK,EAAQE,EAAKC,EAAE,EAEnB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAAQkB,GAAQ,EAAG,CAACA,EAAK,EAEnC,IAAMY,EAAS,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACrB,IAAMC,EAA8B,CAAC,EACrC,IAAK,IAAM3G,KAAKiE,EAAM0C,CAAG,CAAC3G,EAAE4G,MAAM,CAAC,CAAG,CAACD,CAAG,CAAC3G,EAAE4G,MAAM,CAAC,EAAI,CAAC,EAAI,EAC7D,OAAOD,CACT,EAAG,CAAC1C,EAAK,EAET,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI/C,UAAU,qDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,gDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,gEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGA,UAAU,4CAAmC,iBACjD,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAEA,UAAU,uCAA6B,2CACA,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAACE,KAAK,SAASF,UAAU,yCAAgC,UAAY,UAGtH,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCuB,KAAK,SACLnB,QAAS,IAAMwE,IACf5E,UAAU,0GACX,eAMH,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIA,UAAU,oDACZwB,EAAQmE,GAAG,CAACC,IACX,IAAMC,EAAQD,EAAInE,GAAG,CAAG+D,CAAM,CAACI,EAAInE,GAAG,CAAC,EAAI,EAAIsB,EAAK+C,MAAM,CACpDC,EAASxC,IAAWqC,EAAInE,GAAG,CACjC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAECF,KAAK,SACLnB,QAAS,IAAM2D,EAAS,CAAER,OAAQqC,EAAInE,GAAG,AAAC,GAC1CzB,UAAW,CAAC,wDAAwD,EAClE+F,EACI,kDACA,mFAAA,CACJ,WAEDH,EAAIzF,KAAK,CACV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKH,UAAU,sDAA8C6F,MAVzDD,EAAInE,GAAG,EAAI,MAatB,KAIF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIzB,UAAU,mDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,sJACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,6DAAoD,WACpE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACCoE,MAAOP,EACPmC,SAAUX,GAAKvB,EAAUuB,EAAEvE,MAAM,CAACsD,KAAK,EACvC6B,UAAWZ,IAAqB,UAAVA,EAAE5D,GAAG,EAAcsC,EAAS,CAAEL,EAAGG,CAAO,EAAI,EAClEqC,OAAQ,KAAYrC,IAAWH,GAAGK,EAAS,CAAEL,EAAGG,CAAO,EAAI,EAC3DsC,YAAY,cACZnG,UAAU,8FAGd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIA,UAAU,sJACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKA,UAAU,6DAAoD,QACpE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACCoE,MAAOT,EACPqC,SAAUX,GAAKzB,EAAYyB,EAAEvE,MAAM,CAACsD,KAAK,EACzC6B,UAAWZ,IAAqB,UAAVA,EAAE5D,GAAG,EAAcsC,EAAS,CAAEN,IAAKE,CAAS,EAAI,EACtEuC,OAAQ,KAAYvC,IAAaF,GAAKM,EAAS,CAAEN,IAAKE,CAAS,EAAI,EACnEwC,YAAY,YACZnG,UAAU,sFAGb,CAACuD,GAAUE,IAAOC,CAAC,EAClB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACCnC,KAAK,SACLnB,QAAS,KAAQwD,EAAY,IAAKE,EAAU,IAAKC,EAAS,CAAER,OAAQ,GAAIE,IAAK,GAAIC,EAAG,EAAG,EAAI,EAC3F1D,UAAU,+HACX,qBAMJqD,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIrD,UAAU,uGAA6F,SACpG,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAACE,KAAK,SAASF,UAAU,qBAAY,SAAW,aAG9DmD,GAAS,CAACE,GACT,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAIrD,UAAU,iGAAuF,QAC9FmD,EACN,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO5B,KAAK,SAASnB,QAAS,IAAMwE,IAAQ5E,UAAU,0BAAiB,UAI3EiD,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIjD,UAAU,qBACZoG,MAAMC,IAAI,CAAC,CAAEP,OAAQ,CAAE,GAAGH,GAAG,CAAC,CAACW,EAAGC,IACjC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAYvG,UAAU,wFAAbuG,MAGI,IAAhBxD,EAAK+C,MAAM,CACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAU,CAAA,CACT9H,QAAQ,UACRT,MAAOgG,GAAUE,GAAOC,EAAI,YAAc,SAC1ClG,IAAK+F,GAAUE,GAAOC,EAAI,iBAAmB,oBAC7C/D,IAAK4D,GAAUE,GAAOC,EAAI,CAAEvD,MAAO,OAAQC,QAAS,IAAM2D,EAAS,CAAER,OAAQ,GAAIE,IAAK,GAAIC,EAAG,EAAG,EAAG,OAAI8C,IAGzG,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAGxG,UAAU,6HACX+C,EAAK4C,GAAG,CAACc,YACR,IAAMC,EAAMD,EAAIE,eAAe,CACzBC,EAAOH,EAAInG,QAAQ,CACzB,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAgBN,UAAU,6CACzB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAI,CAAA,CAACE,KAAM,CAAC,cAAc,EAAEuG,EAAIrE,EAAE,CAAA,CAAE,CAAEpC,UAAU,8EAC/C,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKA,UAAU,iEAAuD,IAAEyG,EAAII,GAAG,IAChF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK7G,UAAW,CAAC,kDAAkD,EAAE0B,CAAW,CAAC+E,EAAIf,MAAM,CAAC,EAAIhE,EAAYI,SAAS,CAAA,CAAE,UACrH2E,EAAIf,MAAM,GAEb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK1F,UAAU,yDAAiDyG,EAAIK,IAAI,GACxE,CAACL,EAAIM,IAAI,EAAI,EAAA,AAAE,EAAEvE,KAAK,CAAC,EAAG,GAAGmD,GAAG,CAACqB,GAChC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAahH,UAAU,6GACrBgH,GADQA,IAIb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKhH,UAAW,CAAC,qBAAqB,EArMzD,AAAIgC,AAAa,AAqM0CD,QArMlC,EADJC,EAsMoDyE,EAAIzE,IAtMxC,IAsMgD,EArMrD,eACf,QAAbA,GAAmC,UAAU,CAAvBA,EAA8B,gBACjD,gBAmM8E,CAAG,UAAGyE,EAAIzE,QAAQ,GACrF,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKhC,UAAU,6EAhMlC,CAgMuGiC,AAjMpFC,CAA4B,CAiMoEuE,CAhM/G,CAgMmHQ,AAhMlH/E,GAAG,QAgM0H,EA/L3HA,EAAEC,KAAK,EAAID,EAAEE,EAAE,CADP,MAiMG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKpC,UAAU,gDAAwCqC,AA7L5E,SAASA,AAASC,CAAY,EAC5B,GAAI,CAACA,EAAK,MAAO,IACjB,IAAMC,EAAMD,EAAIE,KAAK,CAAC,EAAG,IAEzB,OADgBD,AACTE,EADe,IAAIC,OAAOC,WAAW,GAAGH,KAAK,CAAC,EAAG,IACvC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKxC,UAAU,wBAAgBuC,IAAc,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAKvC,UAAU,yBAAiBuC,GAClG,EAwLqFkE,EAAInE,GAAG,IACvEoE,GAAOA,EAAIQ,KAAK,CAAG,GAClB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKlH,UAAU,6EAAmE,KAC9E0G,EAAI7E,IAAI,CAAC,IAAE6E,EAAIQ,KAAK,IAG1BN,GAAQA,EAAKM,KAAK,CAAG,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAKlH,UAAU,6EAAmE,KAC9E4G,EAAK/E,IAAI,CAAC,IAAE+E,EAAKM,KAAK,QAtBxBT,EAAIrE,EAAE,CA4BnB,SAMZ,kBAEe,SAAS+E,EACtB,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,QAAQ,CAAA,CAACC,SAAU,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAIpH,UAAU,yCACjC,CAAA,EAAA,EAAA,GAAA,EAAC4C,EAAAA,CAAAA,IAGP"}
|
|
1
|
+
{"version":3,"sources":["../../../../app/components/EmptyState.tsx","../../../../app/requirements/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\n\nexport type EmptyVariant = 'nodes' | 'tasks' | 'messages' | 'logs' | 'tokens' | 'networks' | 'generic';\n\ninterface EmptyStateProps {\n /** Picks the icon glyph and default copy if title/sub omitted. */\n variant?: EmptyVariant;\n /** Optional override headline. */\n title?: string;\n /** Optional override sub-copy. */\n sub?: string;\n /** Optional CTA: text + href (internal) or onClick. */\n cta?: { label: string; href?: string; onClick?: () => void };\n /** Compact mode for in-card empty states (smaller padding). */\n compact?: boolean;\n}\n\nconst DEFAULTS: Record<EmptyVariant, { title: string; sub: string }> = {\n nodes: { title: 'No agents in this network', sub: 'Agent sessions will appear here once they connect to the CommHub.' },\n tasks: { title: 'No tasks yet', sub: 'Tasks will appear here when agents send them via CommHub.' },\n messages: { title: 'No messages', sub: 'Messages between agents will appear here.' },\n logs: { title: 'No audit logs', sub: 'Events will appear here when users register, login, or perform actions.' },\n tokens: { title: 'No API tokens', sub: 'Create one to authenticate CLI tools and external integrations.' },\n networks: { title: 'No networks found', sub: 'Create one or sign in with V3 auth to see your networks.' },\n generic: { title: 'Nothing here yet', sub: 'Data will appear here once available.' },\n};\n\n/**\n * Minimal monochrome SVG glyphs per variant. No filled shapes, no gradients,\n * no AI-decoration — just thin-stroke line art that fades into the page.\n * 64×64 viewBox; rendered at 56×56 (compact 40×40).\n */\nfunction Glyph({ variant, size }: { variant: EmptyVariant; size: number }) {\n const s = { width: size, height: size };\n const baseProps = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.25,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n\n switch (variant) {\n case 'nodes':\n // Mesh with dashed edges = \"nodes will land here\"\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"14\" r=\"4\" />\n <circle cx=\"14\" cy=\"44\" r=\"4\" />\n <circle cx=\"50\" cy=\"44\" r=\"4\" />\n <line x1=\"32\" y1=\"18\" x2=\"14\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"32\" y1=\"18\" x2=\"50\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"18\" y1=\"44\" x2=\"46\" y2=\"44\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n </g>\n </svg>\n );\n case 'tasks':\n // Empty checkbox list\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <rect x=\"14\" y=\"14\" width=\"36\" height=\"6\" rx=\"1.5\" />\n <rect x=\"14\" y=\"26\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.6\" />\n <rect x=\"14\" y=\"38\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.35\" />\n </g>\n </svg>\n );\n case 'messages':\n // Speech bubble outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <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\" />\n <line x1=\"22\" y1=\"28\" x2=\"42\" y2=\"28\" opacity=\"0.5\" />\n <line x1=\"22\" y1=\"34\" x2=\"36\" y2=\"34\" opacity=\"0.5\" />\n </g>\n </svg>\n );\n case 'logs':\n // Document with lines\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <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\" />\n <path d=\"M40 12 v8 h8\" opacity=\"0.6\" />\n <line x1=\"24\" y1=\"32\" x2=\"40\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"24\" y1=\"38\" x2=\"40\" y2=\"38\" opacity=\"0.4\" />\n <line x1=\"24\" y1=\"44\" x2=\"34\" y2=\"44\" opacity=\"0.25\" />\n </g>\n </svg>\n );\n case 'tokens':\n // Key outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"22\" cy=\"32\" r=\"8\" />\n <line x1=\"30\" y1=\"32\" x2=\"54\" y2=\"32\" />\n <line x1=\"44\" y1=\"32\" x2=\"44\" y2=\"38\" />\n <line x1=\"50\" y1=\"32\" x2=\"50\" y2=\"40\" />\n </g>\n </svg>\n );\n case 'networks':\n // Globe-ish concentric ovals\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"18\" />\n <ellipse cx=\"32\" cy=\"32\" rx=\"18\" ry=\"9\" opacity=\"0.55\" />\n <line x1=\"14\" y1=\"32\" x2=\"50\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"32\" y1=\"14\" x2=\"32\" y2=\"50\" opacity=\"0.55\" />\n </g>\n </svg>\n );\n case 'generic':\n default:\n // Soft sparkle outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"14\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <circle cx=\"32\" cy=\"32\" r=\"3\" />\n </g>\n </svg>\n );\n }\n}\n\nexport function EmptyState({ variant = 'generic', title, sub, cta, compact = false }: EmptyStateProps) {\n const d = DEFAULTS[variant];\n const headline = title ?? d.title;\n const subcopy = sub ?? d.sub;\n const iconSize = compact ? 40 : 56;\n\n return (\n <div className={`text-center ${compact ? 'py-8' : 'py-16'} px-4`} role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <Glyph variant={variant} size={iconSize} />\n </div>\n <h3 className={`font-medium text-gray-300 ${compact ? 'text-sm' : 'text-base'}`}>{headline}</h3>\n {subcopy && (\n <p className={`text-gray-500 ${compact ? 'text-xs mt-1.5' : 'text-sm mt-2'} max-w-md mx-auto leading-relaxed`}>\n {subcopy}\n </p>\n )}\n {cta && (\n <div className=\"mt-4\">\n {cta.href ? (\n <Link href={cta.href} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </Link>\n ) : (\n <button onClick={cta.onClick} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Round 105 (issue #90): centered card shell so the Overview empty state\n * reads as an intentional, layout-aligned card instead of bare text\n * floating in the content column. */\nfunction EmptyCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"max-w-2xl mx-auto rounded-xl border border-[#26262b] bg-[#161618] shadow-lg shadow-black/20\">\n {children}\n </div>\n );\n}\n\n/**\n * Overview-specific variant. Three cases:\n * 1. network-mismatch — agents exist globally, none in this network\n * 2. agents-offline — 0 registered now BUT task history exists, so this\n * is NOT a first run (round 105 / issue #90: showing \"Spin up your\n * first agent\" next to \"acked: 499\" was misleading)\n * 3. true first-run — 0 agents, 0 history → quickstart command\n */\nexport function NodesEmptyState({\n hint,\n taskHistoryCount = 0,\n}: {\n hint?: { global_count?: number; filtered_network?: string };\n taskHistoryCount?: number;\n}) {\n if (hint?.global_count) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents in this network\"\n sub={`Server has ${hint.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}\n />\n </EmptyCard>\n );\n }\n\n // Round 105 (issue #90): there's task history but no agents online right\n // now — they finished or disconnected. Don't pitch a first-run setup;\n // point at the history instead.\n if (taskHistoryCount > 0) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents online\"\n sub={`Every agent in this network is currently offline. ${taskHistoryCount.toLocaleString()} task${taskHistoryCount === 1 ? '' : 's'} in history — they may have finished their work or disconnected.`}\n cta={{ label: 'View task history', href: '/tasks' }}\n />\n </EmptyCard>\n );\n }\n\n // Round 52: true empty state (zero agents anywhere) — show the\n // quickstart command inline so users don't have to leave the dashboard\n // to figure out how to spin up their first agent.\n return (\n <EmptyCard>\n <div className=\"text-center py-16 px-4\" role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <svg viewBox=\"0 0 64 64\" width={56} height={56}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\">\n <rect x=\"10\" y=\"20\" width=\"44\" height=\"28\" rx=\"2\" />\n <rect x=\"20\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"32\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"44\" y=\"32\" width=\"4\" height=\"8\" opacity=\"0.5\" />\n <line x1=\"10\" y1=\"26\" x2=\"54\" y2=\"26\" opacity=\"0.4\" />\n <circle cx=\"14\" cy=\"23\" r=\"0.8\" fill=\"currentColor\" />\n </g>\n </svg>\n </div>\n <h3 className=\"font-medium text-gray-300 text-base\">Spin up your first agent</h3>\n <p className=\"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed\">\n Run this in a fresh terminal to register an agent with this CommHub:\n </p>\n <div className=\"mt-4 inline-block\">\n <QuickstartCommand cmd=\"npx --yes @sleep2agi/agent-network init\" />\n </div>\n {/* #214 F6: expectation management — without this line, users\n copy the command and stare at an empty screen not knowing\n what to wait for. The page polls every 5s, so the node\n really does appear by itself. */}\n <p className=\"text-gray-600 text-xs mt-3 max-w-md mx-auto\">\n Once the agent connects, it appears here automatically within a\n few seconds — no refresh needed.\n </p>\n <div className=\"mt-3\">\n <a\n href=\"https://anet.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300\"\n >\n Full quickstart guide\n <span aria-hidden>→</span>\n </a>\n </div>\n </div>\n </EmptyCard>\n );\n}\n\n/** Code block + inline copy button used by the empty-Overview first-run\n * CTA. State lives here so the parent stays stateless. */\nfunction QuickstartCommand({ cmd }: { cmd: string }) {\n const [copied, setCopied] = useState(false);\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(cmd);\n setCopied(true);\n setTimeout(() => setCopied(false), 1800);\n } catch {}\n };\n return (\n <div className=\"anet-empty-cmd flex items-start sm:items-center gap-2 bg-[#0e0e10] border border-[#26262b] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm\">\n {/* #209 R44: long quickstart commands (e.g. the `npm install -g …`\n variant) overflowed the empty-state card horizontally on phones\n because <code> defaults to white-space:pre. break-all on mobile\n lets them wrap inside the box; sm: up restores normal wrapping\n so desktop monospace lines stay clean. items-start on phones\n aligns the Copy button to the top so a wrapped 2-line command\n doesn't bottom-anchor the button. */}\n <code className=\"text-cyan-300 font-mono select-all min-w-0 break-all sm:break-normal\">{cmd}</code>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? 'Copied' : 'Copy command'}\n className=\"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1c1c1f] transition-colors\"\n >\n {copied ? (\n <span className=\"flex items-center gap-1 text-green-400\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n Copied\n </span>\n ) : (\n <span className=\"flex items-center gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n Copy\n </span>\n )}\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState, Suspense } from 'react';\nimport Link from 'next/link';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport { EmptyState } from '../components/EmptyState';\n\n/**\n * Requirements board — #1633 (read-only first slice).\n *\n * Why this page exists: the dashboard only ever showed dispatch tasks\n * (/tasks = who asked whom). The requirement board — 需求池 / 进行中 /\n * 完成, tags, owner vs agent owner, checklist progress — is what people\n * actually work from in the client. This is the read half; the write half\n * is #1634.\n */\n\ninterface RequirementPerson { kind: 'user' | 'node'; id: string; alias?: string }\ninterface Requirement {\n id: string;\n seq: number;\n name: string;\n column: 'pool' | 'doing' | 'done' | 'abandoned';\n priority: 'high' | 'normal' | 'low' | 'lowest';\n due?: string;\n tags?: string[];\n owner?: RequirementPerson | null;\n agent_owner?: RequirementPerson | null;\n project_id?: string | null;\n checklist_count?: { total: number; done: number };\n children?: { total: number; done: number };\n updatedAt?: string;\n has_description?: boolean;\n}\n\nconst COLUMNS: { key: Requirement['column'] | ''; label: string }[] = [\n { key: '', label: 'All' },\n { key: 'pool', label: '需求池' },\n { key: 'doing', label: '进行中' },\n { key: 'done', label: '完成' },\n { key: 'abandoned', label: '已放弃' },\n];\n\nconst COLUMN_CHIP: Record<string, string> = {\n pool: 'bg-amber-500/10 text-amber-300 border-amber-500/20',\n doing: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n done: 'bg-emerald-500/10 text-emerald-300 border-emerald-500/20',\n abandoned: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n};\n\nfunction priorityClass(priority: string) {\n if (priority === 'high') return 'text-red-400';\n if (priority === 'low' || priority === 'lowest') return 'text-gray-600';\n return 'text-gray-400';\n}\n\nfunction personLabel(p?: RequirementPerson | null) {\n if (!p) return '—';\n return p.alias || p.id;\n}\n\nfunction dueLabel(due?: string) {\n if (!due) return '—';\n const day = due.slice(0, 10);\n const overdue = day < new Date().toISOString().slice(0, 10);\n return overdue ? <span className=\"text-red-400\">{day}</span> : <span className=\"text-gray-400\">{day}</span>;\n}\n\nfunction RequirementsContent() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [rows, setRows] = useState<Requirement[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [needsLogin, setNeedsLogin] = useState(false);\n // #1633 follow-up: the list used to hard-stop at 200 rows with has_more ignored.\n const [cursor, setCursor] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n\n const status = searchParams.get('status') || '';\n const tag = searchParams.get('tag') || '';\n const q = searchParams.get('q') || '';\n const [tagInput, setTagInput] = useState(tag);\n const [qInput, setQInput] = useState(q);\n\n const setParam = useCallback((patch: Record<string, string>) => {\n const next = new URLSearchParams(searchParams.toString());\n for (const [key, value] of Object.entries(patch)) {\n if (value) next.set(key, value);\n else next.delete(key);\n }\n const qs = next.toString();\n router.replace(qs ? `/requirements?${qs}` : '/requirements', { scroll: false });\n }, [router, searchParams]);\n\n const load = useCallback(async (opts: { cursor?: string | null; append?: boolean } = {}) => {\n const nextCursor = opts.cursor ?? null;\n const append = opts.append === true;\n setLoading(true);\n setError('');\n try {\n const params = new URLSearchParams();\n if (status) params.set('status', status);\n if (tag) params.set('tag', tag);\n if (q) params.set('q', q);\n params.set('limit', '200');\n if (nextCursor) params.set('cursor', nextCursor);\n const res = await fetch(`/api/hub/requirements?${params.toString()}`, { cache: 'no-store' });\n if (res.status === 401) { setNeedsLogin(true); if (!append) setRows([]); return; }\n const data = await res.json();\n if (!res.ok || !data.ok) {\n setError(data?.error || `hub_${res.status}`);\n if (!append) setRows([]);\n return;\n }\n setNeedsLogin(false);\n const incoming = (data.requirements || []) as Requirement[];\n setRows(prev => (append ? [...prev, ...incoming] : incoming));\n setCursor(typeof data.next_cursor === 'string' ? data.next_cursor : null);\n setHasMore(data.has_more === true && typeof data.next_cursor === 'string');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n if (!append) setRows([]);\n } finally {\n setLoading(false);\n }\n }, [status, tag, q]);\n\n useEffect(() => { load(); }, [load]);\n\n const counts = useMemo(() => {\n const out: Record<string, number> = {};\n for (const r of rows) out[r.column] = (out[r.column] || 0) + 1;\n return out;\n }, [rows]);\n\n return (\n <div className=\"min-h-screen bg-[var(--bg)] text-gray-200\">\n <div className=\"mx-auto max-w-6xl px-4 py-6 sm:px-6\">\n <div className=\"mb-5 flex flex-wrap items-end justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold text-white\">Requirements</h1>\n <p className=\"mt-1 text-xs text-gray-500\">\n 需求池 / 进行中 / 完成 —— 只读视图(写面见 #1634)。任务派单在 <Link href=\"/tasks\" className=\"text-blue-400 hover:underline\">Tasks</Link>。\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => load()}\n className=\"rounded-lg border border-[var(--border)] px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Refresh\n </button>\n </div>\n\n {/* Status tabs */}\n <div className=\"mb-4 flex flex-wrap items-center gap-1.5\">\n {COLUMNS.map(col => {\n const count = col.key ? counts[col.key] || 0 : rows.length;\n const active = status === col.key;\n return (\n <button\n key={col.key || 'all'}\n type=\"button\"\n onClick={() => setParam({ status: col.key })}\n className={`rounded-md border px-3 py-1.5 text-xs transition-colors ${\n active\n ? 'border-blue-500/30 bg-blue-500/10 text-blue-300'\n : 'border-transparent text-gray-500 hover:bg-[var(--border)]/60 hover:text-gray-300'\n }`}\n >\n {col.label}\n <span className=\"ml-1.5 text-[10px] tabular-nums opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n\n {/* Text filters */}\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Search</span>\n <input\n value={qInput}\n onChange={e => setQInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ q: qInput }); }}\n onBlur={() => { if (qInput !== q) setParam({ q: qInput }); }}\n placeholder=\"标题 / 人 / 标签\"\n className=\"w-40 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none sm:w-56\"\n />\n </div>\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Tag</span>\n <input\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ tag: tagInput }); }}\n onBlur={() => { if (tagInput !== tag) setParam({ tag: tagInput }); }}\n placeholder=\"exact tag\"\n className=\"w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n {(status || tag || q) && (\n <button\n type=\"button\"\n onClick={() => { setTagInput(''); setQInput(''); setParam({ status: '', tag: '', q: '' }); }}\n className=\"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:border-gray-600 hover:text-gray-200\"\n >\n Clear filters\n </button>\n )}\n </div>\n\n {needsLogin && (\n <div className=\"mb-4 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-300\">\n 会话已过期,<Link href=\"/login\" className=\"underline\">重新登录</Link> 后再看需求。\n </div>\n )}\n {error && !needsLogin && (\n <div className=\"mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-3 text-sm text-red-300\">\n 读取失败:{error}\n <button type=\"button\" onClick={() => load()} className=\"ml-3 underline\">重试</button>\n </div>\n )}\n\n {loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"h-12 animate-pulse rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)]\" />\n ))}\n </div>\n ) : rows.length === 0 ? (\n <EmptyState\n variant=\"generic\"\n title={status || tag || q ? '没有符合筛选的需求' : '需求池是空的'}\n sub={status || tag || q ? '清掉筛选再试,或换一个标签。' : '客户端建一条需求后,这里就会出现。'}\n cta={status || tag || q ? { label: '清空筛选', onClick: () => setParam({ status: '', tag: '', q: '' }) } : undefined}\n />\n ) : (\n <ul className=\"divide-y divide-[var(--border)] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)]\">\n {rows.map(row => {\n const chk = row.checklist_count;\n const kids = row.children;\n return (\n <li key={row.id} className=\"hover:bg-[var(--bg-secondary)]/60\">\n <Link href={`/requirements/${row.id}`} className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 px-3 py-2.5 sm:px-4\">\n <span className=\"w-12 shrink-0 text-[11px] tabular-nums text-gray-600\">#{row.seq}</span>\n <span className={`shrink-0 rounded border px-1.5 py-0.5 text-[10px] ${COLUMN_CHIP[row.column] || COLUMN_CHIP.abandoned}`}>\n {row.column}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm text-gray-100\">{row.name}</span>\n {(row.tags || []).slice(0, 3).map(t => (\n <span key={t} className=\"hidden shrink-0 rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-[10px] text-gray-400 sm:inline\">\n {t}\n </span>\n ))}\n <span className={`shrink-0 text-[11px] ${priorityClass(row.priority)}`}>{row.priority}</span>\n <span className=\"hidden w-24 shrink-0 truncate text-[11px] text-gray-500 sm:inline\">{personLabel(row.agent_owner)}</span>\n <span className=\"w-20 shrink-0 text-right text-[11px]\">{dueLabel(row.due)}</span>\n {chk && chk.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 sm:inline\">\n ✓ {chk.done}/{chk.total}\n </span>\n )}\n {kids && kids.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 md:inline\">\n ↳ {kids.done}/{kids.total}\n </span>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n )}\n\n {hasMore && (\n <button\n type=\"button\"\n disabled={loading}\n onClick={() => load({ cursor, append: true })}\n className=\"mx-auto mt-4 block rounded-lg border border-[var(--border)] px-4 py-2 text-xs text-gray-400 hover:text-gray-200 disabled:opacity-50\"\n >\n {loading ? '加载中…' : '加载更多'}\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport default function RequirementsPage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[var(--bg)]\" />}>\n <RequirementsContent />\n </Suspense>\n );\n}\n"],"names":["DEFAULTS","nodes","title","sub","tasks","messages","logs","tokens","networks","generic","Glyph","variant","size","s","width","height","baseProps","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","viewBox","cx","cy","r","x1","y1","x2","y2","strokeDasharray","opacity","x","y","rx","d","ry","EmptyState","cta","compact","headline","subcopy","iconSize","className","role","href","label","onClick","EmptyCard","children","NodesEmptyState","hint","taskHistoryCount","global_count","toLocaleString","QuickstartCommand","cmd","target","rel","copied","setCopied","onCopy","navigator","clipboard","writeText","setTimeout","type","COLUMNS","key","COLUMN_CHIP","pool","doing","done","abandoned","priorityClass","priority","personLabel","p","alias","id","dueLabel","due","day","slice","overdue","Date","toISOString","RequirementsContent","router","searchParams","rows","setRows","loading","setLoading","error","setError","needsLogin","setNeedsLogin","cursor","setCursor","hasMore","setHasMore","status","get","tag","q","tagInput","setTagInput","qInput","setQInput","setParam","patch","next","URLSearchParams","toString","value","Object","entries","set","delete","qs","replace","scroll","load","opts","nextCursor","append","params","res","fetch","cache","data","json","ok","incoming","requirements","prev","next_cursor","has_more","e","Error","message","counts","out","column","map","col","count","length","active","onChange","onKeyDown","onBlur","placeholder","Array","from","_","i","undefined","row","chk","checklist_count","kids","seq","name","tags","t","agent_owner","total","disabled","RequirementsPage","fallback"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.
|
|
1
|
+
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.59"],344)},83694,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(344);a.s(["default",0,function(){let[a,e]=(0,c.useState)("login"),[f,g]=(0,c.useState)(""),[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(!1),p=async b=>{b.preventDefault(),o(!0),m("");try{let b=await fetch("/api/auth/v3",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,username:f,password:h})}),c=await b.json();if(c.ok){c.token&&sessionStorage.setItem("anet_v3_auth",JSON.stringify({user:c.user,token:c.token,networks:c.networks||[],currentNetwork:c.network_id||c.networks?.[0]?.network_id||""})),window.location.assign("/");return}m(c.error||"Login failed")}catch{m("Connection failed")}o(!1)};return(0,b.jsxs)("main",{className:"min-h-screen bg-[#0b0b0d] text-gray-100 flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16",children:[(0,b.jsx)("div",{className:"absolute inset-0 pointer-events-none anet-login-bg","aria-hidden":!0}),(0,b.jsx)("div",{className:"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[460px] h-[460px] rounded-full bg-cyan-500/[0.045] blur-[110px] pointer-events-none","aria-hidden":!0}),(0,b.jsxs)("div",{className:"relative w-full max-w-sm",children:[(0,b.jsxs)("div",{className:"text-center mb-7",children:[(0,b.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#161618] border border-[#26262b] anet-login-mark",children:(0,b.jsxs)("svg",{className:"w-9 h-9",viewBox:"0 0 32 32","aria-hidden":!0,children:[(0,b.jsx)("circle",{cx:"16",cy:"16",r:"10",fill:"none",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.25",className:"text-cyan-400 anet-login-mark-ring"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"10",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"10",y1:"20",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("circle",{cx:"16",cy:"10",r:"3",fill:"currentColor",className:"text-cyan-400 anet-login-mark-node-a"}),(0,b.jsx)("circle",{cx:"10",cy:"20",r:"3",fill:"currentColor",className:"text-green-400 anet-login-mark-node-b"}),(0,b.jsx)("circle",{cx:"22",cy:"20",r:"3",fill:"currentColor",className:"text-violet-400 anet-login-mark-node-c"})]})}),(0,b.jsx)("h1",{className:"text-[22px] sm:text-2xl font-semibold text-white tracking-tight",children:"Agent Network"}),(0,b.jsx)("p",{className:"text-[13px] text-gray-400 mt-1.5 leading-snug",children:"login"===a?(0,b.jsxs)(b.Fragment,{children:["Welcome back · ",(0,b.jsx)("span",{className:"text-gray-500",children:"Tasks · Mesh · Messages"})]}):(0,b.jsxs)(b.Fragment,{children:["Create your account · ",(0,b.jsx)("span",{className:"text-gray-500",children:"Free preview · no credit card"})]})})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#26262b] bg-[#161618] p-1 mb-4",children:["login","register"].map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>{e(c),m("")},className:`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${a===c?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"login"===c?"Sign in":"Register"},c))}),(0,b.jsxs)("form",{onSubmit:p,className:"border border-[#26262b] bg-[#161618]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30",children:[(0,b.jsx)("label",{htmlFor:"username",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Username"}),(0,b.jsx)("input",{id:"username",type:"text",value:f,onChange:a=>g(a.target.value),autoFocus:!0,placeholder:"Enter username",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4"}),(0,b.jsx)("label",{htmlFor:"password",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Password"}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("input",{id:"password",type:j?"text":"password",value:h,onChange:a=>i(a.target.value),placeholder:"Enter password",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 pr-11 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all"}),(0,b.jsx)("button",{type:"button",onClick:()=>k(a=>!a),tabIndex:-1,"aria-label":j?"Hide password":"Show password",className:"absolute inset-y-0 right-0 flex items-center justify-center min-w-[44px] px-3 text-gray-600 hover:text-gray-300 transition-colors",children:j?(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"}),(0,b.jsx)("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]}):(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),(0,b.jsx)("circle",{cx:"12",cy:"12",r:"3"})]})})]}),l&&(0,b.jsx)("div",{className:"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2",children:l}),(0,b.jsxs)("button",{type:"submit",disabled:n||!h||!f.trim(),className:"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none",children:[n&&(0,b.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4 animate-spin",viewBox:"0 0 24 24",fill:"none",children:[(0,b.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),(0,b.jsx)("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),(0,b.jsx)("span",{children:n?"login"===a?"Signing in…":"Registering…":"login"===a?"Sign in":"Create account"})]})]}),(0,b.jsxs)("p",{className:"text-center text-[11px] text-gray-700 mt-6",children:["Sleep2AGI · Apache-2.0 · ",(0,b.jsx)("a",{href:"https://anet.sh",className:"hover:text-gray-500 transition-colors",children:"anet.sh"}),(0,b.jsx)("span",{className:"mx-1 text-gray-800",children:"·"}),(0,b.jsxs)("span",{className:"font-mono",title:"@sleep2agi/agent-network-dashboard",children:["v",d.DASHBOARD_VERSION]})]})]})]})}])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=app_0iz553k._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../package.json.%5Bjson%5D.mjs","../../../../app/lib/version.ts","../../../../app/login/page.tsx"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"desktopName\":\"agent-network.desktop\",\"version\":\"0.6.3-preview.57\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"postbuild\":\"node scripts/stamp-build-commit.mjs\",\"start\":\"next start\",\"lint\":\"eslint\",\"oss:check\":\"node scripts/oss-readiness-check.mjs\",\"oss:binaries\":\"node scripts/oss-binary-scan.mjs\",\"oss:secrets\":\"node scripts/oss-secret-scan.mjs --scope tree\",\"oss:secrets:history\":\"node scripts/oss-secret-scan.mjs --scope history\",\"oss:surface\":\"node scripts/oss-public-surface-scan.mjs --scope all\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\",\"avatars:check\":\"node scripts/check-avatars.mjs\",\"ratchet\":\"node scripts/check-color-ratchet.mjs\",\"gates\":\"node scripts/check-color-ratchet.mjs && node scripts/check-avatars.mjs\",\"test\":\"node scripts/run-tests.mjs\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"engines\":{\"node\":\">=20\"},\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.3.0\",\"pinyin-pro\":\"^3.28.1\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint\":\"^9\",\"eslint-config-next\":\"16.3.0\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwiZGVza3RvcE5hbWVcIjpcImFnZW50LW5ldHdvcmsuZGVza3RvcFwiLFwidmVyc2lvblwiOlwiMC42LjMtcHJldmlldy41N1wiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwicG9zdGJ1aWxkXCI6XCJub2RlIHNjcmlwdHMvc3RhbXAtYnVpbGQtY29tbWl0Lm1qc1wiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwib3NzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvb3NzLXJlYWRpbmVzcy1jaGVjay5tanNcIixcIm9zczpiaW5hcmllc1wiOlwibm9kZSBzY3JpcHRzL29zcy1iaW5hcnktc2Nhbi5tanNcIixcIm9zczpzZWNyZXRzXCI6XCJub2RlIHNjcmlwdHMvb3NzLXNlY3JldC1zY2FuLm1qcyAtLXNjb3BlIHRyZWVcIixcIm9zczpzZWNyZXRzOmhpc3RvcnlcIjpcIm5vZGUgc2NyaXB0cy9vc3Mtc2VjcmV0LXNjYW4ubWpzIC0tc2NvcGUgaGlzdG9yeVwiLFwib3NzOnN1cmZhY2VcIjpcIm5vZGUgc2NyaXB0cy9vc3MtcHVibGljLXN1cmZhY2Utc2Nhbi5tanMgLS1zY29wZSBhbGxcIixcImFwcDphbmRyb2lkOmluaXRcIjpcIm5weCBjYXAgYWRkIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOnN5bmNcIjpcIm5weCBjYXAgc3luYyBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpvcGVuXCI6XCJucHggY2FwIG9wZW4gYW5kcm9pZFwiLFwiYXBwOmlvczppbml0XCI6XCJucHggY2FwIGFkZCBpb3NcIixcImFwcDppb3M6c3luY1wiOlwibnB4IGNhcCBzeW5jIGlvc1wiLFwiYXBwOmlvczpvcGVuXCI6XCJucHggY2FwIG9wZW4gaW9zXCIsXCJhcHA6ZGVza3RvcFwiOlwiZWxlY3Ryb24gYXBwcy9kZXNrdG9wL2VsZWN0cm9uL21haW4uY2pzXCIsXCJhcHA6ZGVza3RvcDpwYWNrXCI6XCJlbGVjdHJvbi1idWlsZGVyIC0tY29uZmlnIGVsZWN0cm9uLWJ1aWxkZXIuanNvblwiLFwicHJlcHVibGlzaE9ubHlcIjpcIlsgLWYgLm5leHQvQlVJTERfSUQgXSB8fCAoZWNobyAncHJlcHVibGlzaE9ubHk6IC5uZXh0L0JVSUxEX0lEIG1pc3Npbmcg4oCUIHJ1biBucG0gcnVuIGJ1aWxkIGZpcnN0IChzZWUgY29tbWl0IDA1YzFlYmYgYm9keSBmb3IgUjIyNCBjaHVuay01MDAgcm9vdCBjYXVzZSknID4mMiAmJiBleGl0IDEpXCIsXCJhdmF0YXJzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInJhdGNoZXRcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qc1wiLFwiZ2F0ZXNcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qcyAmJiBub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInRlc3RcIjpcIm5vZGUgc2NyaXB0cy9ydW4tdGVzdHMubWpzXCJ9LFwiYmluXCI6e1wiYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIjpcIi4vYmluL3N0YXJ0LmpzXCJ9LFwiaG9tZXBhZ2VcIjpcImh0dHBzOi8vYW5ldC5zaFwiLFwicmVwb3NpdG9yeVwiOntcInR5cGVcIjpcImdpdFwiLFwidXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkXCJ9LFwiYnVnc1wiOntcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9pc3N1ZXNcIn0sXCJhdXRob3JcIjpcInNsZWVwMmFnaVwiLFwibGljZW5zZVwiOlwiQXBhY2hlLTIuMFwiLFwiZW5naW5lc1wiOntcIm5vZGVcIjpcIj49MjBcIn0sXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMy4wXCIsXCJwaW55aW4tcHJvXCI6XCJeMy4yOC4xXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludFwiOlwiXjlcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMy4wXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n","'use client';\n\nimport { FormEvent, useState } from 'react';\nimport { DASHBOARD_VERSION } from '../lib/version';\n\nexport default function LoginPage() {\n const [mode, setMode] = useState<'login' | 'register'>('login');\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState('');\n const [pending, setPending] = useState(false);\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setPending(true);\n setError('');\n\n try {\n const res = await fetch('/api/auth/v3', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: mode, username, password }),\n });\n const data = await res.json();\n\n if (data.ok) {\n // Store V3 auth data for client-side features\n if (data.token) {\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({\n user: data.user,\n token: data.token,\n networks: data.networks || [],\n currentNetwork: data.network_id || data.networks?.[0]?.network_id || '',\n }));\n }\n window.location.assign('/');\n return;\n }\n\n setError(data.error || 'Login failed');\n } catch {\n setError('Connection failed');\n }\n setPending(false);\n };\n\n return (\n <main className=\"min-h-screen bg-[#0b0b0d] text-gray-100 flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16\">\n {/* Subtle off-grid background — restraint over AI-glow.\n Dark themes get a faint radial wash; light themes show a low-contrast\n dotted grid for surface texture without noise. */}\n <div className=\"absolute inset-0 pointer-events-none anet-login-bg\" aria-hidden />\n {/* Soft brand glow behind the card — adds depth to the flat near-black\n field without competing with the form (design-polish #17 R1). */}\n <div className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[460px] h-[460px] rounded-full bg-cyan-500/[0.045] blur-[110px] pointer-events-none\" aria-hidden />\n\n <div className=\"relative w-full max-w-sm\">\n <div className=\"text-center mb-7\">\n {/* Brand mark — uses the favicon 3-node mesh SVG which IS the\n agent-network concept (nodes + edges). Replaces the previous\n flat emerald square placeholder. */}\n <div className=\"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#161618] border border-[#26262b] anet-login-mark\">\n <svg className=\"w-9 h-9\" viewBox=\"0 0 32 32\" aria-hidden>\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" className=\"text-cyan-400 anet-login-mark-ring\" />\n <line x1=\"16\" y1=\"10\" x2=\"10\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"16\" y1=\"10\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"10\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <circle cx=\"16\" cy=\"10\" r=\"3\" fill=\"currentColor\" className=\"text-cyan-400 anet-login-mark-node-a\" />\n <circle cx=\"10\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-green-400 anet-login-mark-node-b\" />\n <circle cx=\"22\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-violet-400 anet-login-mark-node-c\" />\n </svg>\n </div>\n <h1 className=\"text-[22px] sm:text-2xl font-semibold text-white tracking-tight\">Agent Network</h1>\n <p className=\"text-[13px] text-gray-400 mt-1.5 leading-snug\">\n {mode === 'login'\n ? <>Welcome back · <span className=\"text-gray-500\">Tasks · Mesh · Messages</span></>\n : <>Create your account · <span className=\"text-gray-500\">Free preview · no credit card</span></>}\n </p>\n </div>\n\n {/* Mode toggle */}\n <div className=\"flex rounded-lg border border-[#26262b] bg-[#161618] p-1 mb-4\">\n {(['login', 'register'] as const).map(m => (\n <button key={m} type=\"button\" onClick={() => { setMode(m); setError(''); }}\n className={`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${mode === m ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {m === 'login' ? 'Sign in' : 'Register'}\n </button>\n ))}\n </div>\n\n <form onSubmit={submit} className=\"border border-[#26262b] bg-[#161618]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30\">\n <label htmlFor=\"username\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Username\n </label>\n <input id=\"username\" type=\"text\" value={username} onChange={e => setUsername(e.target.value)} autoFocus\n placeholder=\"Enter username\"\n className=\"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4\" />\n\n <label htmlFor=\"password\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Password\n </label>\n <div className=\"relative\">\n <input id=\"password\" type={showPassword ? 'text' : 'password'} value={password} onChange={e => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n className=\"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 pr-11 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all\" />\n <button\n type=\"button\"\n onClick={() => setShowPassword(s => !s)}\n tabIndex={-1}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"absolute inset-y-0 right-0 flex items-center justify-center min-w-[44px] px-3 text-gray-600 hover:text-gray-300 transition-colors\"\n >\n {showPassword ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n\n {error && (\n <div className=\"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2\">{error}</div>\n )}\n\n <button type=\"submit\" disabled={pending || !password || !username.trim()}\n className=\"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none\">\n {pending && (\n <svg aria-hidden className=\"w-4 h-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" opacity=\"0.25\" />\n <path d=\"M4 12a8 8 0 018-8\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n )}\n <span>{pending ? (mode === 'login' ? 'Signing in…' : 'Registering…') : (mode === 'login' ? 'Sign in' : 'Create account')}</span>\n </button>\n </form>\n\n <p className=\"text-center text-[11px] text-gray-700 mt-6\">\n Sleep2AGI · Apache-2.0 · <a href=\"https://anet.sh\" className=\"hover:text-gray-500 transition-colors\">anet.sh</a>\n <span className=\"mx-1 text-gray-800\">·</span>\n <span className=\"font-mono\" title=\"@sleep2agi/agent-network-dashboard\">v{DASHBOARD_VERSION}</span>\n </p>\n </div>\n </main>\n );\n}\n"],"names":["LoginPage","mode","setMode","username","setUsername","password","setPassword","showPassword","setShowPassword","error","setError","pending","setPending","submit","event","preventDefault","res","fetch","method","headers","body","JSON","stringify","action","data","json","ok","token","sessionStorage","setItem","user","networks","currentNetwork","network_id","window","location","assign","className","viewBox","cx","cy","r","fill","stroke","strokeWidth","opacity","x1","y1","x2","y2","map","m","type","onClick","onSubmit","htmlFor","id","value","onChange","e","target","autoFocus","placeholder","s","tabIndex","width","height","strokeLinecap","strokeLinejoin","d","disabled","trim","href","title"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../package.json.%5Bjson%5D.mjs","../../../../app/lib/version.ts","../../../../app/login/page.tsx"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"desktopName\":\"agent-network.desktop\",\"version\":\"0.6.3-preview.59\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"postbuild\":\"node scripts/stamp-build-commit.mjs\",\"start\":\"next start\",\"lint\":\"eslint\",\"oss:check\":\"node scripts/oss-readiness-check.mjs\",\"oss:binaries\":\"node scripts/oss-binary-scan.mjs\",\"oss:secrets\":\"node scripts/oss-secret-scan.mjs --scope tree\",\"oss:secrets:history\":\"node scripts/oss-secret-scan.mjs --scope history\",\"oss:surface\":\"node scripts/oss-public-surface-scan.mjs --scope all\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\",\"avatars:check\":\"node scripts/check-avatars.mjs\",\"ratchet\":\"node scripts/check-color-ratchet.mjs\",\"gates\":\"node scripts/check-color-ratchet.mjs && node scripts/check-avatars.mjs\",\"test\":\"node scripts/run-tests.mjs\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"engines\":{\"node\":\">=20\"},\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.3.0\",\"pinyin-pro\":\"^3.28.1\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint\":\"^9\",\"eslint-config-next\":\"16.3.0\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwiZGVza3RvcE5hbWVcIjpcImFnZW50LW5ldHdvcmsuZGVza3RvcFwiLFwidmVyc2lvblwiOlwiMC42LjMtcHJldmlldy41OVwiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwicG9zdGJ1aWxkXCI6XCJub2RlIHNjcmlwdHMvc3RhbXAtYnVpbGQtY29tbWl0Lm1qc1wiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwib3NzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvb3NzLXJlYWRpbmVzcy1jaGVjay5tanNcIixcIm9zczpiaW5hcmllc1wiOlwibm9kZSBzY3JpcHRzL29zcy1iaW5hcnktc2Nhbi5tanNcIixcIm9zczpzZWNyZXRzXCI6XCJub2RlIHNjcmlwdHMvb3NzLXNlY3JldC1zY2FuLm1qcyAtLXNjb3BlIHRyZWVcIixcIm9zczpzZWNyZXRzOmhpc3RvcnlcIjpcIm5vZGUgc2NyaXB0cy9vc3Mtc2VjcmV0LXNjYW4ubWpzIC0tc2NvcGUgaGlzdG9yeVwiLFwib3NzOnN1cmZhY2VcIjpcIm5vZGUgc2NyaXB0cy9vc3MtcHVibGljLXN1cmZhY2Utc2Nhbi5tanMgLS1zY29wZSBhbGxcIixcImFwcDphbmRyb2lkOmluaXRcIjpcIm5weCBjYXAgYWRkIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOnN5bmNcIjpcIm5weCBjYXAgc3luYyBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpvcGVuXCI6XCJucHggY2FwIG9wZW4gYW5kcm9pZFwiLFwiYXBwOmlvczppbml0XCI6XCJucHggY2FwIGFkZCBpb3NcIixcImFwcDppb3M6c3luY1wiOlwibnB4IGNhcCBzeW5jIGlvc1wiLFwiYXBwOmlvczpvcGVuXCI6XCJucHggY2FwIG9wZW4gaW9zXCIsXCJhcHA6ZGVza3RvcFwiOlwiZWxlY3Ryb24gYXBwcy9kZXNrdG9wL2VsZWN0cm9uL21haW4uY2pzXCIsXCJhcHA6ZGVza3RvcDpwYWNrXCI6XCJlbGVjdHJvbi1idWlsZGVyIC0tY29uZmlnIGVsZWN0cm9uLWJ1aWxkZXIuanNvblwiLFwicHJlcHVibGlzaE9ubHlcIjpcIlsgLWYgLm5leHQvQlVJTERfSUQgXSB8fCAoZWNobyAncHJlcHVibGlzaE9ubHk6IC5uZXh0L0JVSUxEX0lEIG1pc3Npbmcg4oCUIHJ1biBucG0gcnVuIGJ1aWxkIGZpcnN0IChzZWUgY29tbWl0IDA1YzFlYmYgYm9keSBmb3IgUjIyNCBjaHVuay01MDAgcm9vdCBjYXVzZSknID4mMiAmJiBleGl0IDEpXCIsXCJhdmF0YXJzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInJhdGNoZXRcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qc1wiLFwiZ2F0ZXNcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qcyAmJiBub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInRlc3RcIjpcIm5vZGUgc2NyaXB0cy9ydW4tdGVzdHMubWpzXCJ9LFwiYmluXCI6e1wiYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIjpcIi4vYmluL3N0YXJ0LmpzXCJ9LFwiaG9tZXBhZ2VcIjpcImh0dHBzOi8vYW5ldC5zaFwiLFwicmVwb3NpdG9yeVwiOntcInR5cGVcIjpcImdpdFwiLFwidXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkXCJ9LFwiYnVnc1wiOntcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9pc3N1ZXNcIn0sXCJhdXRob3JcIjpcInNsZWVwMmFnaVwiLFwibGljZW5zZVwiOlwiQXBhY2hlLTIuMFwiLFwiZW5naW5lc1wiOntcIm5vZGVcIjpcIj49MjBcIn0sXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMy4wXCIsXCJwaW55aW4tcHJvXCI6XCJeMy4yOC4xXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludFwiOlwiXjlcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMy4wXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n","'use client';\n\nimport { FormEvent, useState } from 'react';\nimport { DASHBOARD_VERSION } from '../lib/version';\n\nexport default function LoginPage() {\n const [mode, setMode] = useState<'login' | 'register'>('login');\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState('');\n const [pending, setPending] = useState(false);\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setPending(true);\n setError('');\n\n try {\n const res = await fetch('/api/auth/v3', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: mode, username, password }),\n });\n const data = await res.json();\n\n if (data.ok) {\n // Store V3 auth data for client-side features\n if (data.token) {\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({\n user: data.user,\n token: data.token,\n networks: data.networks || [],\n currentNetwork: data.network_id || data.networks?.[0]?.network_id || '',\n }));\n }\n window.location.assign('/');\n return;\n }\n\n setError(data.error || 'Login failed');\n } catch {\n setError('Connection failed');\n }\n setPending(false);\n };\n\n return (\n <main className=\"min-h-screen bg-[#0b0b0d] text-gray-100 flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16\">\n {/* Subtle off-grid background — restraint over AI-glow.\n Dark themes get a faint radial wash; light themes show a low-contrast\n dotted grid for surface texture without noise. */}\n <div className=\"absolute inset-0 pointer-events-none anet-login-bg\" aria-hidden />\n {/* Soft brand glow behind the card — adds depth to the flat near-black\n field without competing with the form (design-polish #17 R1). */}\n <div className=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[460px] h-[460px] rounded-full bg-cyan-500/[0.045] blur-[110px] pointer-events-none\" aria-hidden />\n\n <div className=\"relative w-full max-w-sm\">\n <div className=\"text-center mb-7\">\n {/* Brand mark — uses the favicon 3-node mesh SVG which IS the\n agent-network concept (nodes + edges). Replaces the previous\n flat emerald square placeholder. */}\n <div className=\"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#161618] border border-[#26262b] anet-login-mark\">\n <svg className=\"w-9 h-9\" viewBox=\"0 0 32 32\" aria-hidden>\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.25\" className=\"text-cyan-400 anet-login-mark-ring\" />\n <line x1=\"16\" y1=\"10\" x2=\"10\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"16\" y1=\"10\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <line x1=\"10\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.5\" className=\"text-cyan-400 anet-login-mark-edge\" />\n <circle cx=\"16\" cy=\"10\" r=\"3\" fill=\"currentColor\" className=\"text-cyan-400 anet-login-mark-node-a\" />\n <circle cx=\"10\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-green-400 anet-login-mark-node-b\" />\n <circle cx=\"22\" cy=\"20\" r=\"3\" fill=\"currentColor\" className=\"text-violet-400 anet-login-mark-node-c\" />\n </svg>\n </div>\n <h1 className=\"text-[22px] sm:text-2xl font-semibold text-white tracking-tight\">Agent Network</h1>\n <p className=\"text-[13px] text-gray-400 mt-1.5 leading-snug\">\n {mode === 'login'\n ? <>Welcome back · <span className=\"text-gray-500\">Tasks · Mesh · Messages</span></>\n : <>Create your account · <span className=\"text-gray-500\">Free preview · no credit card</span></>}\n </p>\n </div>\n\n {/* Mode toggle */}\n <div className=\"flex rounded-lg border border-[#26262b] bg-[#161618] p-1 mb-4\">\n {(['login', 'register'] as const).map(m => (\n <button key={m} type=\"button\" onClick={() => { setMode(m); setError(''); }}\n className={`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${mode === m ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {m === 'login' ? 'Sign in' : 'Register'}\n </button>\n ))}\n </div>\n\n <form onSubmit={submit} className=\"border border-[#26262b] bg-[#161618]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30\">\n <label htmlFor=\"username\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Username\n </label>\n <input id=\"username\" type=\"text\" value={username} onChange={e => setUsername(e.target.value)} autoFocus\n placeholder=\"Enter username\"\n className=\"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4\" />\n\n <label htmlFor=\"password\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Password\n </label>\n <div className=\"relative\">\n <input id=\"password\" type={showPassword ? 'text' : 'password'} value={password} onChange={e => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n className=\"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 pr-11 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all\" />\n <button\n type=\"button\"\n onClick={() => setShowPassword(s => !s)}\n tabIndex={-1}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"absolute inset-y-0 right-0 flex items-center justify-center min-w-[44px] px-3 text-gray-600 hover:text-gray-300 transition-colors\"\n >\n {showPassword ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </div>\n\n {error && (\n <div className=\"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2\">{error}</div>\n )}\n\n <button type=\"submit\" disabled={pending || !password || !username.trim()}\n className=\"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none\">\n {pending && (\n <svg aria-hidden className=\"w-4 h-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" opacity=\"0.25\" />\n <path d=\"M4 12a8 8 0 018-8\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n )}\n <span>{pending ? (mode === 'login' ? 'Signing in…' : 'Registering…') : (mode === 'login' ? 'Sign in' : 'Create account')}</span>\n </button>\n </form>\n\n <p className=\"text-center text-[11px] text-gray-700 mt-6\">\n Sleep2AGI · Apache-2.0 · <a href=\"https://anet.sh\" className=\"hover:text-gray-500 transition-colors\">anet.sh</a>\n <span className=\"mx-1 text-gray-800\">·</span>\n <span className=\"font-mono\" title=\"@sleep2agi/agent-network-dashboard\">v{DASHBOARD_VERSION}</span>\n </p>\n </div>\n </main>\n );\n}\n"],"names":["LoginPage","mode","setMode","username","setUsername","password","setPassword","showPassword","setShowPassword","error","setError","pending","setPending","submit","event","preventDefault","res","fetch","method","headers","body","JSON","stringify","action","data","json","ok","token","sessionStorage","setItem","user","networks","currentNetwork","network_id","window","location","assign","className","viewBox","cx","cy","r","fill","stroke","strokeWidth","opacity","x1","y1","x2","y2","map","m","type","onClick","onSubmit","htmlFor","id","value","onChange","e","target","autoFocus","placeholder","s","tabIndex","width","height","strokeLinecap","strokeLinejoin","d","disabled","trim","href","title"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.57"],344)},45343,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(44332),f=a.i(76194),g=a.i(344),h=a.i(5537);a.s(["default",0,function(){let{config:a}=(0,e.useAnetConfig)(),{health:i,error:j}=(0,e.useHealth)(),[k,l]=(0,c.useState)(()=>"cyber"),[m,n]=(0,c.useState)(""),[o,p]=(0,c.useState)(""),[q,r]=(0,c.useState)(""),s="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",t="break-all sm:max-w-[320px] sm:text-right";return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white mb-3 lg:ml-0 ml-10",children:"Settings"}),(0,b.jsx)("nav",{className:"mb-4 sm:mb-8 flex flex-wrap gap-2 text-xs",children:[{href:"#appearance",label:"Appearance"},{href:"#connection",label:"Connection"},{href:"#account",label:"Account"},{href:"#resources",label:"Resources"}].map(a=>(0,b.jsx)("a",{href:a.href,className:"inline-flex min-h-[44px] items-center rounded-md border border-[#26262b] bg-[#0e0e10]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors",children:a.label},a.href))}),(0,b.jsxs)("div",{className:"max-w-2xl space-y-10",children:[(0,b.jsxs)("div",{id:"appearance",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Appearance"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Theme"}),(0,b.jsx)("div",{className:"grid grid-cols-2 gap-3",children:[{id:"cyber",label:"Dark",swatch:"#0b0b0d"},{id:"light",label:"Light",swatch:"#f6f7f9"},{id:"slack",label:"Slack",swatch:"#3f0e40"}].map(a=>(0,b.jsxs)("button",{onClick:()=>{try{localStorage.setItem("anet-theme",a.id)}catch{}(0,f.applyTheme)(a.id),l(a.id)},"aria-pressed":k===a.id,className:`flex items-center gap-3 rounded-lg border px-4 py-3 text-sm transition-colors ${k===a.id?"border-cyan-500/60 bg-cyan-500/10 text-gray-100":"border-[#26262b] text-gray-400 hover:border-[#3a3a41]"}`,children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-5 h-5 rounded-full border border-black/20 shrink-0",style:{backgroundColor:a.swatch}}),a.label,k===a.id&&(0,b.jsx)("svg",{"aria-hidden":!0,className:"ml-auto w-4 h-4 text-cyan-400",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,b.jsx)("path",{d:"M20 6 9 17l-5-5"})})]},a.id))})]})]}),(0,b.jsxs)("div",{id:"connection",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Connection"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"CommHub Connection"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,b.jsx)("span",{className:`text-cyan-300 ${t}`,children:a?.hub||"not configured"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:a?.source==="file"?"Local file (~/.anet/config.json)":a?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Auth Token"}),(0,b.jsx)("span",{className:`${a?.tokenConfigured?"text-green-400":"text-red-400"} ${t}`,children:a?.tokenConfigured?`Configured (${a.tokenPreview})`:"Not configured"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Server Auth"}),(0,b.jsx)("span",{className:`${i?.auth==="enabled"?"text-green-400":"text-yellow-400"} sm:text-right`,children:i?.auth||"--"})]}),a?.error&&(0,b.jsx)("div",{className:"border-t border-[#26262b] pt-3 text-xs text-gray-500",children:a.error}),(j||i?.ok===!1)&&(0,b.jsxs)("div",{className:"border-t border-red-500/20 pt-3 text-xs space-y-1.5",role:"alert",children:[(0,b.jsx)("div",{className:"text-red-300 font-medium",children:"CommHub unreachable — how to recover:"}),(0,b.jsxs)("div",{className:"text-gray-400",children:["1. Check the hub process on the server: ",(0,b.jsx)("code",{className:"font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5",children:"anet hub status"})]}),(0,b.jsxs)("div",{className:"text-gray-400",children:["2. Start it if stopped: ",(0,b.jsx)("code",{className:"font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5",children:"anet hub start"})]}),(0,b.jsx)("div",{className:"text-gray-400",children:"3. Confirm the Hub URL above matches where the hub actually listens."})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Info"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.version||"--"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.sessions??"--"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsxs)("span",{className:"text-gray-500",children:["SSE streams ",(0,b.jsx)("span",{className:"text-gray-600",children:"· server"})]}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.sse_connections??"--"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.uptime?`${Math.floor(i.uptime/3600)}h ${Math.floor(i.uptime%3600/60)}m`:"--"})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Dashboard"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 font-mono ${t}`,title:"From package.json @sleep2agi/agent-network-dashboard",children:g.DASHBOARD_VERSION})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:"Overview, Tasks, Nodes, Messages, Networks, Audit, Server Logs, Admin, Settings"})]})]})]})]}),(0,b.jsxs)("div",{id:"account",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Account"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Change Password"}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("input",{type:"password",value:m,onChange:a=>n(a.target.value),placeholder:"Current password",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("input",{type:"password",value:o,onChange:a=>p(a.target.value),placeholder:"New password",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("button",{onClick:async()=>{if(!m||!o)return;let a=sessionStorage.getItem("anet_v3_auth");if(!a)return void r("Not logged in with V3 auth");let{token:b}=JSON.parse(a),c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",token:b,current_password:m,new_password:o})}),d=await c.json();if(r(d.ok?"Password changed":`Failed: ${d.error}`),d.ok){if(d.token){let b=JSON.parse(a);sessionStorage.setItem("anet_v3_auth",JSON.stringify({...b,token:d.token}))}n(""),p("")}setTimeout(()=>r(""),5e3)},disabled:!m||!o,className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Change Password"})]}),q&&(0,b.jsx)("div",{className:`mt-2 text-xs ${q.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:q})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Sign out"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Signing out clears your dashboard session cookie. You'll return to the login page."}),(0,b.jsx)("button",{onClick:async()=>{await fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),(0,h.clearPrivateChatStorage)(),sessionStorage.removeItem("anet_v3_auth"),window.location.assign("/login")},className:"px-4 py-2 bg-transparent hover:bg-[#1c1c1f] text-gray-300 text-sm rounded-lg border border-[#26262b] hover:border-[#3a3a41] transition-colors",children:"Sign out"})]})]}),(0,b.jsxs)("div",{id:"resources",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Resources"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,b.jsxs)(d.default,{href:"/settings/tokens",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"API Tokens"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create and manage tokens for CLI access."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/settings/networks",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Networks"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create, manage, and delete agent networks."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/settings/providers",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Model Providers"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Configure model providers and per-server reachability."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/messages",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Messages"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Global timeline of CommHub messages across all agents."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,b.jsxs)(d.default,{href:"/logs",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Audit Log"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Authentication, token rotations, and admin actions."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,b.jsxs)(d.default,{href:"/server-logs",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Server Logs"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Live stdout / stderr from the CommHub server."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]})]})]})]})]})}])}];
|
|
1
|
+
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.59"],344)},45343,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(44332),f=a.i(76194),g=a.i(344),h=a.i(5537);a.s(["default",0,function(){let{config:a}=(0,e.useAnetConfig)(),{health:i,error:j}=(0,e.useHealth)(),[k,l]=(0,c.useState)(()=>"cyber"),[m,n]=(0,c.useState)(""),[o,p]=(0,c.useState)(""),[q,r]=(0,c.useState)(""),s="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",t="break-all sm:max-w-[320px] sm:text-right";return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0b0b0d] text-gray-100 p-4 sm:p-6",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white mb-3 lg:ml-0 ml-10",children:"Settings"}),(0,b.jsx)("nav",{className:"mb-4 sm:mb-8 flex flex-wrap gap-2 text-xs",children:[{href:"#appearance",label:"Appearance"},{href:"#connection",label:"Connection"},{href:"#account",label:"Account"},{href:"#resources",label:"Resources"}].map(a=>(0,b.jsx)("a",{href:a.href,className:"inline-flex min-h-[44px] items-center rounded-md border border-[#26262b] bg-[#0e0e10]/60 px-3 py-2 text-gray-400 hover:border-cyan-500/50 hover:text-cyan-300 hover:bg-cyan-500/10 transition-colors",children:a.label},a.href))}),(0,b.jsxs)("div",{className:"max-w-2xl space-y-10",children:[(0,b.jsxs)("div",{id:"appearance",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Appearance"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Theme"}),(0,b.jsx)("div",{className:"grid grid-cols-2 gap-3",children:[{id:"cyber",label:"Dark",swatch:"#0b0b0d"},{id:"light",label:"Light",swatch:"#f6f7f9"},{id:"slack",label:"Slack",swatch:"#3f0e40"}].map(a=>(0,b.jsxs)("button",{onClick:()=>{try{localStorage.setItem("anet-theme",a.id)}catch{}(0,f.applyTheme)(a.id),l(a.id)},"aria-pressed":k===a.id,className:`flex items-center gap-3 rounded-lg border px-4 py-3 text-sm transition-colors ${k===a.id?"border-cyan-500/60 bg-cyan-500/10 text-gray-100":"border-[#26262b] text-gray-400 hover:border-[#3a3a41]"}`,children:[(0,b.jsx)("span",{"aria-hidden":!0,className:"inline-block w-5 h-5 rounded-full border border-black/20 shrink-0",style:{backgroundColor:a.swatch}}),a.label,k===a.id&&(0,b.jsx)("svg",{"aria-hidden":!0,className:"ml-auto w-4 h-4 text-cyan-400",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,b.jsx)("path",{d:"M20 6 9 17l-5-5"})})]},a.id))})]})]}),(0,b.jsxs)("div",{id:"connection",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Connection"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"CommHub Connection"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,b.jsx)("span",{className:`text-cyan-300 ${t}`,children:a?.hub||"not configured"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:a?.source==="file"?"Local file (~/.anet/config.json)":a?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Auth Token"}),(0,b.jsx)("span",{className:`${a?.tokenConfigured?"text-green-400":"text-red-400"} ${t}`,children:a?.tokenConfigured?`Configured (${a.tokenPreview})`:"Not configured"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Server Auth"}),(0,b.jsx)("span",{className:`${i?.auth==="enabled"?"text-green-400":"text-yellow-400"} sm:text-right`,children:i?.auth||"--"})]}),a?.error&&(0,b.jsx)("div",{className:"border-t border-[#26262b] pt-3 text-xs text-gray-500",children:a.error}),(j||i?.ok===!1)&&(0,b.jsxs)("div",{className:"border-t border-red-500/20 pt-3 text-xs space-y-1.5",role:"alert",children:[(0,b.jsx)("div",{className:"text-red-300 font-medium",children:"CommHub unreachable — how to recover:"}),(0,b.jsxs)("div",{className:"text-gray-400",children:["1. Check the hub process on the server: ",(0,b.jsx)("code",{className:"font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5",children:"anet hub status"})]}),(0,b.jsxs)("div",{className:"text-gray-400",children:["2. Start it if stopped: ",(0,b.jsx)("code",{className:"font-mono bg-[#0e0e10] border border-[#1c1c1f] rounded px-1.5 py-0.5",children:"anet hub start"})]}),(0,b.jsx)("div",{className:"text-gray-400",children:"3. Confirm the Hub URL above matches where the hub actually listens."})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Info"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.version||"--"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.sessions??"--"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsxs)("span",{className:"text-gray-500",children:["SSE streams ",(0,b.jsx)("span",{className:"text-gray-600",children:"· server"})]}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.sse_connections??"--"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:i?.uptime?`${Math.floor(i.uptime/3600)}h ${Math.floor(i.uptime%3600/60)}m`:"--"})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Dashboard"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 font-mono ${t}`,title:"From package.json @sleep2agi/agent-network-dashboard",children:g.DASHBOARD_VERSION})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,b.jsxs)("div",{className:s,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,b.jsx)("span",{className:`text-gray-300 ${t}`,children:"Overview, Tasks, Nodes, Messages, Networks, Audit, Server Logs, Admin, Settings"})]})]})]})]}),(0,b.jsxs)("div",{id:"account",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Account"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Change Password"}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("input",{type:"password",value:m,onChange:a=>n(a.target.value),placeholder:"Current password",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("input",{type:"password",value:o,onChange:a=>p(a.target.value),placeholder:"New password",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-3 py-2 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("button",{onClick:async()=>{if(!m||!o)return;let a=sessionStorage.getItem("anet_v3_auth");if(!a)return void r("Not logged in with V3 auth");let{token:b}=JSON.parse(a),c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",token:b,current_password:m,new_password:o})}),d=await c.json();if(r(d.ok?"Password changed":`Failed: ${d.error}`),d.ok){if(d.token){let b=JSON.parse(a);sessionStorage.setItem("anet_v3_auth",JSON.stringify({...b,token:d.token}))}n(""),p("")}setTimeout(()=>r(""),5e3)},disabled:!m||!o,className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Change Password"})]}),q&&(0,b.jsx)("div",{className:`mt-2 text-xs ${q.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:q})]}),(0,b.jsxs)("section",{className:"bg-[#161618] border border-[#26262b] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Sign out"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Signing out clears your dashboard session cookie. You'll return to the login page."}),(0,b.jsx)("button",{onClick:async()=>{await fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),(0,h.clearPrivateChatStorage)(),sessionStorage.removeItem("anet_v3_auth"),window.location.assign("/login")},className:"px-4 py-2 bg-transparent hover:bg-[#1c1c1f] text-gray-300 text-sm rounded-lg border border-[#26262b] hover:border-[#3a3a41] transition-colors",children:"Sign out"})]})]}),(0,b.jsxs)("div",{id:"resources",className:"space-y-4 scroll-mt-6",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 px-1",children:[(0,b.jsx)("div",{className:"text-[11px] uppercase tracking-[0.14em] text-gray-400 font-semibold",children:"Resources"}),(0,b.jsx)("div",{className:"flex-1 h-px bg-[#26262b]"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,b.jsxs)(d.default,{href:"/settings/tokens",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"API Tokens"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create and manage tokens for CLI access."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/settings/networks",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Networks"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create, manage, and delete agent networks."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/settings/providers",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Model Providers"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Configure model providers and per-server reachability."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/messages",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Messages"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Global timeline of CommHub messages across all agents."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,b.jsxs)(d.default,{href:"/logs",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Audit Log"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Authentication, token rotations, and admin actions."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]}),(0,b.jsxs)(d.default,{href:"/server-logs",className:"bg-[#161618] border border-[#26262b] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Server Logs"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Live stdout / stderr from the CommHub server."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Open →"})]})]})]})]})]})}])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=app_0los-eu._.js.map
|