@sleep2agi/agent-network-dashboard 0.6.3-preview.59 → 0.6.3-preview.60
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 +5 -5
- package/.next/fallback-build-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 +2 -2
- package/.next/server/app/requirements.segments/_full.segment.rsc +2 -2
- package/.next/server/app/requirements.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/requirements.segments/requirements/__PAGE__.segment.rsc +2 -2
- 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_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/static/chunks/{0bdi2zpxri7v7.js → 19fd0xkthktfd.js} +1 -1
- package/.next/static/chunks/1bodrx7tf8p2w.css +1 -0
- package/.next/static/chunks/{3bhrv--4hfk_s.js → 1nuakrl171qpb.js} +1 -1
- package/.next/static/chunks/1s2e250jttn9d.js +1 -0
- package/.next/static/chunks/{18j3xrz53qmqz.js → 26xlnp89uspg3.js} +1 -1
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/CommentMarkdown.tsx +45 -9
- package/package.json +1 -1
- package/.next/static/chunks/15_vs82xxi3ms.js +0 -1
- package/.next/static/chunks/1uj0l14szn69i.css +0 -1
- /package/.next/static/{P7kvvskkiKN8sB8Fz6DfZ → C2qOHg1jUq4YeefJrZef1}/_buildManifest.js +0 -0
- /package/.next/static/{P7kvvskkiKN8sB8Fz6DfZ → C2qOHg1jUq4YeefJrZef1}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{P7kvvskkiKN8sB8Fz6DfZ → C2qOHg1jUq4YeefJrZef1}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../app/components/EmptyState.tsx","../../../../app/requirements/%5Bid%5D/page.tsx","../../../../app/components/CommentMarkdown.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 { useEffect, useState } from 'react';\nimport Link from 'next/link';\nimport { useParams } from 'next/navigation';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { EmptyState } from '../../components/EmptyState';\nimport CommentMarkdown from '../../components/CommentMarkdown';\n\n/**\n * One requirement — #1633 (read-only).\n *\n * Shows description, checklist, and the activity timeline. The write\n * surface (status/owner/tags/comments) is #1634 on purpose: the read\n * shape has to be right before anyone can edit against it.\n */\n\ninterface Person { kind: 'user' | 'node'; id: string; alias?: string }\ninterface ChecklistItem { id: string; text: string; done?: boolean }\ninterface Requirement {\n id: string; seq: number; name: string; column: string; priority: string;\n due?: string; start?: string; tags?: string[];\n owner?: Person | null; agent_owner?: Person | null;\n parent_id?: string | null;\n children?: { total: number; done: number };\n description?: string; checklist?: ChecklistItem[];\n createdAt?: string; updatedAt?: string;\n external_ref?: string | null; external_url?: string | null;\n}\ninterface EventRow {\n id: string; kind: string; field?: string | null;\n actor?: Person | null;\n at?: string;\n new?: Record<string, unknown> | null;\n old?: Record<string, unknown> | null;\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\nconst COLUMN_OPTIONS: { key: string; label: string }[] = [\n { key: 'pool', label: '需求池' },\n { key: 'doing', label: '进行中' },\n { key: 'done', label: '完成' },\n { key: 'abandoned', label: '放弃' },\n];\nconst PRIORITY_OPTIONS = ['high', 'normal', 'low', 'lowest'] as const;\n\nfunction personLabel(p?: Person | null) {\n if (!p) return '—';\n return p.alias || p.id;\n}\n\nfunction describeEvent(ev: EventRow) {\n if (ev.kind === 'comment') {\n const text = typeof ev.new?.text === 'string' ? ev.new.text : '';\n return { label: 'comment', body: text };\n }\n if (ev.kind === 'created') return { label: 'created', body: '' };\n if (ev.field) {\n const from = ev.old == null ? '—' : typeof ev.old === 'object' ? JSON.stringify(ev.old) : String(ev.old);\n const to = ev.new == null ? '—' : typeof ev.new === 'object' ? JSON.stringify(ev.new) : String(ev.new);\n return { label: ev.field, body: `${from.slice(0, 120)} → ${to.slice(0, 120)}` };\n }\n return { label: ev.kind, body: '' };\n}\n\nexport default function RequirementDetailPage() {\n const params = useParams<{ id: string }>();\n const id = params?.id;\n const [req, setReq] = useState<Requirement | null>(null);\n const [events, setEvents] = useState<EventRow[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [needsLogin, setNeedsLogin] = useState(false);\n // #1634 — write surface. Every mutation goes through Hub's own rules; we\n // only show its error code back to the user instead of failing silently.\n const [actionError, setActionError] = useState('');\n const [busy, setBusy] = useState(false);\n const [comment, setComment] = useState('');\n const [reloadKey, setReloadKey] = useState(0);\n\n const reload = () => setReloadKey(k => k + 1);\n\n async function sendPatch(fields: Record<string, unknown>) {\n if (!id || busy) return;\n setBusy(true); setActionError('');\n try {\n const res = await fetch(`/api/hub/requirements/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(fields),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || data.ok === false) { setActionError(data?.error || `hub_${res.status}`); return; }\n reload();\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : 'patch failed');\n } finally { setBusy(false); }\n }\n\n async function toggleItem(itemId: string, done: boolean) {\n if (!id || busy) return;\n setBusy(true); setActionError('');\n try {\n const res = await fetch(`/api/hub/requirements/${encodeURIComponent(id)}/checklist/${encodeURIComponent(itemId)}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ done }),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || data.ok === false) { setActionError(data?.error || `hub_${res.status}`); return; }\n reload();\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : 'checklist failed');\n } finally { setBusy(false); }\n }\n\n async function submitComment() {\n if (!id || busy || !comment.trim()) return;\n setBusy(true); setActionError('');\n try {\n const res = await fetch(`/api/hub/requirements/${encodeURIComponent(id)}/comments`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: comment.trim() }),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || data.ok === false) { setActionError(data?.error || `hub_${res.status}`); return; }\n setComment('');\n reload();\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : 'comment failed');\n } finally { setBusy(false); }\n }\n\n useEffect(() => {\n if (!id) return;\n let alive = true;\n (async () => {\n setLoading(true); setError('');\n try {\n const [detailRes, eventsRes] = await Promise.all([\n fetch(`/api/hub/requirements/${encodeURIComponent(id)}`, { cache: 'no-store' }),\n fetch(`/api/hub/requirements/events?requirement_id=${encodeURIComponent(id)}&limit=100`, { cache: 'no-store' }),\n ]);\n if (detailRes.status === 401) { if (alive) { setNeedsLogin(true); } return; }\n const detail = await detailRes.json();\n if (!detailRes.ok || !detail.ok) { if (alive) setError(detail?.error || `hub_${detailRes.status}`); return; }\n const eventsJson = eventsRes.ok ? await eventsRes.json() : { events: [] };\n if (!alive) return;\n setReq(detail.requirement as Requirement);\n setEvents((eventsJson.events || []) as EventRow[]);\n } catch (e: unknown) {\n if (alive) setError(e instanceof Error ? e.message : 'fetch failed');\n } finally {\n if (alive) setLoading(false);\n }\n })();\n return () => { alive = false; };\n }, [id, reloadKey]);\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-[var(--bg)] p-6 text-gray-500\">\n <div className=\"mx-auto max-w-4xl space-y-3\">\n <div className=\"h-6 w-2/3 animate-pulse rounded bg-[var(--bg-elevated)]\" />\n <div className=\"h-40 animate-pulse rounded bg-[var(--bg-secondary)]\" />\n </div>\n </div>\n );\n }\n\n if (needsLogin) {\n return (\n <div className=\"min-h-screen bg-[var(--bg)] p-6\">\n <div className=\"mx-auto max-w-4xl 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 </div>\n );\n }\n\n if (error || !req) {\n return (\n <div className=\"min-h-screen bg-[var(--bg)] p-6\">\n <div className=\"mx-auto max-w-4xl\">\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 ? `读取失败:${error}` : '这条需求不存在或不可见。'}\n </div>\n <Link href=\"/requirements\" className=\"text-sm text-blue-400 hover:underline\">← 返回需求列表</Link>\n </div>\n </div>\n );\n }\n\n const checklist = req.checklist || [];\n\n return (\n <div className=\"min-h-screen bg-[var(--bg)] text-gray-200\">\n <div className=\"mx-auto max-w-4xl px-4 py-6 sm:px-6\">\n <div className=\"mb-4\">\n <Link href=\"/requirements\" className=\"text-xs text-gray-500 hover:text-gray-300\">← 需求列表</Link>\n </div>\n\n <header className=\"mb-5\">\n <div className=\"mb-2 flex flex-wrap items-center gap-2 text-[11px] text-gray-500\">\n <span className=\"tabular-nums\">#{req.seq}</span>\n <span className={`rounded border px-1.5 py-0.5 ${COLUMN_CHIP[req.column] || COLUMN_CHIP.abandoned}`}>{req.column}</span>\n <span>{req.priority}</span>\n {req.due && <span>due {String(req.due).slice(0, 10)}</span>}\n {(req.tags || []).map(t => (\n <span key={t} className=\"rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-gray-400\">{t}</span>\n ))}\n </div>\n <h1 className=\"text-lg font-semibold text-white\">{req.name}</h1>\n <div className=\"mt-2 flex flex-wrap gap-4 text-[11px] text-gray-500\">\n <span>负责人 {personLabel(req.owner)}</span>\n <span>负责 Agent {personLabel(req.agent_owner)}</span>\n {req.children && req.children.total > 0 && <span>子卡 {req.children.done}/{req.children.total}</span>}\n {req.external_url && (\n <a href={req.external_url} target=\"_blank\" rel=\"noreferrer\" className=\"text-blue-400 hover:underline\">\n {req.external_ref || 'external'}\n </a>\n )}\n </div>\n </header>\n\n {/* #1634 — write surface. Hub keeps the rules (owner must be human,\n node tokens may not delete); this bar only sends whitelisted fields. */}\n <section className=\"mb-6 flex flex-wrap items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] px-3 py-2.5\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Status</span>\n {COLUMN_OPTIONS.map(opt => (\n <button\n key={opt.key}\n type=\"button\"\n disabled={busy || req.column === opt.key}\n onClick={() => sendPatch({ column: opt.key })}\n className={`rounded-md border px-2.5 py-1 text-xs transition-colors disabled:opacity-60 ${\n req.column === opt.key\n ? (COLUMN_CHIP[opt.key] || COLUMN_CHIP.abandoned)\n : 'border-transparent text-gray-500 hover:bg-[var(--bg-elevated)] hover:text-gray-200'\n }`}\n >\n {opt.label}\n </button>\n ))}\n <span className=\"mx-1 h-4 w-px bg-[var(--border)]\" />\n <label className=\"flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-gray-600\">\n Priority\n <select\n value={req.priority}\n disabled={busy}\n onChange={e => sendPatch({ priority: e.target.value })}\n className=\"rounded border border-[var(--border)] bg-[var(--bg-secondary)] px-1.5 py-1 text-xs normal-case text-gray-200\"\n >\n {PRIORITY_OPTIONS.map(p => <option key={p} value={p}>{p}</option>)}\n </select>\n </label>\n <label className=\"flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-gray-600\">\n Due\n <input\n type=\"date\"\n value={req.due ? String(req.due).slice(0, 10) : ''}\n disabled={busy}\n onChange={e => sendPatch({ due: e.target.value })}\n className=\"rounded border border-[var(--border)] bg-[var(--bg-secondary)] px-1.5 py-1 text-xs normal-case text-gray-200\"\n />\n </label>\n {busy && <span className=\"text-[11px] text-gray-500\">saving…</span>}\n {actionError && <span className=\"text-[11px] text-red-400\">{actionError}</span>}\n </section>\n\n <section className=\"mb-6 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-4\">\n <h2 className=\"mb-2 text-xs uppercase tracking-wide text-gray-500\">Description</h2>\n {req.description ? (\n <div className=\"prose prose-invert max-w-none prose-sm prose-pre:bg-[var(--bg)] prose-pre:border prose-pre:border-[var(--border)]\">\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{req.description}</ReactMarkdown>\n </div>\n ) : (\n <p className=\"text-sm text-gray-600\">(没有描述)</p>\n )}\n </section>\n\n <section className=\"mb-6 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-4\">\n <h2 className=\"mb-2 text-xs uppercase tracking-wide text-gray-500\">\n Checklist {checklist.length > 0 && <span className=\"ml-1 text-gray-600\">{checklist.filter(c => c.done).length}/{checklist.length}</span>}\n </h2>\n {checklist.length === 0 ? (\n <p className=\"text-sm text-gray-600\">(没有检查项)</p>\n ) : (\n <ul className=\"space-y-1.5\">\n {checklist.map(item => (\n <li key={item.id}>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => toggleItem(item.id, !item.done)}\n className=\"flex items-start gap-2 text-left text-sm hover:opacity-80 disabled:opacity-60\"\n >\n <span aria-hidden className={item.done ? 'text-emerald-400' : 'text-gray-600'}>{item.done ? '✓' : '○'}</span>\n <span className={item.done ? 'text-gray-500 line-through' : 'text-gray-200'}>{item.text}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className=\"rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-4\">\n <h2 className=\"mb-2 text-xs uppercase tracking-wide text-gray-500\">Activity</h2>\n {events.length === 0 ? (\n <EmptyState variant=\"generic\" compact title=\"还没有动态\" sub=\"状态变更和评论会出现在这里。\" />\n ) : (\n <ul className=\"space-y-2\">\n {events.map(ev => {\n const d = describeEvent(ev);\n return (\n <li key={ev.id} className=\"rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-3 py-2\">\n <div className=\"flex flex-wrap items-center gap-2 text-[11px] text-gray-500\">\n <span className=\"text-gray-300\">{personLabel(ev.actor)}</span>\n <span className=\"rounded bg-[var(--bg-elevated)] px-1.5 py-0.5\">{d.label}</span>\n {ev.at && <span>{String(ev.at).replace('T', ' ').slice(0, 16)}</span>}\n </div>\n {d.body && (d.label === 'comment'\n ? <CommentMarkdown text={d.body} />\n : <p className=\"mt-1 whitespace-pre-wrap break-words text-sm text-gray-300\">{d.body}</p>)}\n </li>\n );\n })}\n </ul>\n )}\n\n <div className=\"mt-3 border-t border-[var(--border)] pt-3\">\n <textarea\n value={comment}\n onChange={e => setComment(e.target.value)}\n rows={2}\n placeholder=\"写一条进展或评论…(Ctrl/⌘+Enter 发送)\"\n className=\"w-full resize-y rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-2 text-sm text-gray-200 placeholder-gray-700 focus:border-blue-500/40 focus:outline-none\"\n onKeyDown={e => { if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') submitComment(); }}\n />\n <div className=\"mt-2 flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={busy || !comment.trim()}\n onClick={submitComment}\n className=\"rounded-lg border border-blue-500/30 bg-blue-500/10 px-3 py-1.5 text-xs text-blue-300 disabled:opacity-50\"\n >\n Add comment\n </button>\n {actionError && <span className=\"text-[11px] text-red-400\">{actionError}</span>}\n </div>\n </div>\n </section>\n </div>\n </div>\n );\n}\n","'use client';\n\n// 需求评论正文的 Markdown 渲染(#1831 的 Web 侧)。\n//\n// Activity 里评论和「字段变更」混在一条时间线:评论正文是 Agent 用 requirements_comment 写的\n// Markdown,admin 2026-10-19 截图指出它此前按 `whitespace-pre-wrap` 纯文本显示,`## 归因更正`、\n// `**错误**`、反引号 `agent_owner` 全露出原字符。客户端那半边在 agent-network-app 的 #961。\n//\n// 渲染器沿用本仓已有的 react-markdown + remark-gfm(Description 与 TaskChatPanel 都在用):\n// 不拼 HTML 字符串,也不开 rehype-raw,所以评论里的标签只会当文字显示。\n// 外链统一新窗口打开并带 noopener。\n//\n// 用 prose 而不是手写每个标签的样式:和 Description 的观感一致,也不用在颜色棘轮里新增色值。\n\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nconst COMPONENTS: Components = {\n a: ({ href, children }) => (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-400 underline hover:no-underline\">\n {children}\n </a>\n ),\n};\n\nexport default function CommentMarkdown({ text }: { text: string }) {\n if (!text) return null;\n return (\n <div\n className=\"prose prose-invert prose-sm mt-1 max-w-none break-words prose-p:my-1 prose-headings:mb-1 prose-headings:mt-2 prose-pre:my-1 prose-pre:border prose-pre:border-[var(--border)] prose-pre:bg-[var(--bg)] prose-table:my-1 prose-li:my-0\"\n data-testid=\"requirement-comment-markdown\"\n >\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={COMPONENTS}>{text}</ReactMarkdown>\n </div>\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","COMPONENTS","a","CommentMarkdown","text","remarkPlugins","components"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../app/components/EmptyState.tsx","../../../../app/requirements/%5Bid%5D/page.tsx","../../../../app/components/CommentMarkdown.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 { useEffect, useState } from 'react';\nimport Link from 'next/link';\nimport { useParams } from 'next/navigation';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { EmptyState } from '../../components/EmptyState';\nimport CommentMarkdown from '../../components/CommentMarkdown';\n\n/**\n * One requirement — #1633 (read-only).\n *\n * Shows description, checklist, and the activity timeline. The write\n * surface (status/owner/tags/comments) is #1634 on purpose: the read\n * shape has to be right before anyone can edit against it.\n */\n\ninterface Person { kind: 'user' | 'node'; id: string; alias?: string }\ninterface ChecklistItem { id: string; text: string; done?: boolean }\ninterface Requirement {\n id: string; seq: number; name: string; column: string; priority: string;\n due?: string; start?: string; tags?: string[];\n owner?: Person | null; agent_owner?: Person | null;\n parent_id?: string | null;\n children?: { total: number; done: number };\n description?: string; checklist?: ChecklistItem[];\n createdAt?: string; updatedAt?: string;\n external_ref?: string | null; external_url?: string | null;\n}\ninterface EventRow {\n id: string; kind: string; field?: string | null;\n actor?: Person | null;\n at?: string;\n new?: Record<string, unknown> | null;\n old?: Record<string, unknown> | null;\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\nconst COLUMN_OPTIONS: { key: string; label: string }[] = [\n { key: 'pool', label: '需求池' },\n { key: 'doing', label: '进行中' },\n { key: 'done', label: '完成' },\n { key: 'abandoned', label: '放弃' },\n];\nconst PRIORITY_OPTIONS = ['high', 'normal', 'low', 'lowest'] as const;\n\nfunction personLabel(p?: Person | null) {\n if (!p) return '—';\n return p.alias || p.id;\n}\n\nfunction describeEvent(ev: EventRow) {\n if (ev.kind === 'comment') {\n const text = typeof ev.new?.text === 'string' ? ev.new.text : '';\n return { label: 'comment', body: text };\n }\n if (ev.kind === 'created') return { label: 'created', body: '' };\n if (ev.field) {\n const from = ev.old == null ? '—' : typeof ev.old === 'object' ? JSON.stringify(ev.old) : String(ev.old);\n const to = ev.new == null ? '—' : typeof ev.new === 'object' ? JSON.stringify(ev.new) : String(ev.new);\n return { label: ev.field, body: `${from.slice(0, 120)} → ${to.slice(0, 120)}` };\n }\n return { label: ev.kind, body: '' };\n}\n\nexport default function RequirementDetailPage() {\n const params = useParams<{ id: string }>();\n const id = params?.id;\n const [req, setReq] = useState<Requirement | null>(null);\n const [events, setEvents] = useState<EventRow[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [needsLogin, setNeedsLogin] = useState(false);\n // #1634 — write surface. Every mutation goes through Hub's own rules; we\n // only show its error code back to the user instead of failing silently.\n const [actionError, setActionError] = useState('');\n const [busy, setBusy] = useState(false);\n const [comment, setComment] = useState('');\n const [reloadKey, setReloadKey] = useState(0);\n\n const reload = () => setReloadKey(k => k + 1);\n\n async function sendPatch(fields: Record<string, unknown>) {\n if (!id || busy) return;\n setBusy(true); setActionError('');\n try {\n const res = await fetch(`/api/hub/requirements/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(fields),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || data.ok === false) { setActionError(data?.error || `hub_${res.status}`); return; }\n reload();\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : 'patch failed');\n } finally { setBusy(false); }\n }\n\n async function toggleItem(itemId: string, done: boolean) {\n if (!id || busy) return;\n setBusy(true); setActionError('');\n try {\n const res = await fetch(`/api/hub/requirements/${encodeURIComponent(id)}/checklist/${encodeURIComponent(itemId)}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ done }),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || data.ok === false) { setActionError(data?.error || `hub_${res.status}`); return; }\n reload();\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : 'checklist failed');\n } finally { setBusy(false); }\n }\n\n async function submitComment() {\n if (!id || busy || !comment.trim()) return;\n setBusy(true); setActionError('');\n try {\n const res = await fetch(`/api/hub/requirements/${encodeURIComponent(id)}/comments`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: comment.trim() }),\n });\n const data = await res.json().catch(() => ({}));\n if (!res.ok || data.ok === false) { setActionError(data?.error || `hub_${res.status}`); return; }\n setComment('');\n reload();\n } catch (e: unknown) {\n setActionError(e instanceof Error ? e.message : 'comment failed');\n } finally { setBusy(false); }\n }\n\n useEffect(() => {\n if (!id) return;\n let alive = true;\n (async () => {\n setLoading(true); setError('');\n try {\n const [detailRes, eventsRes] = await Promise.all([\n fetch(`/api/hub/requirements/${encodeURIComponent(id)}`, { cache: 'no-store' }),\n fetch(`/api/hub/requirements/events?requirement_id=${encodeURIComponent(id)}&limit=100`, { cache: 'no-store' }),\n ]);\n if (detailRes.status === 401) { if (alive) { setNeedsLogin(true); } return; }\n const detail = await detailRes.json();\n if (!detailRes.ok || !detail.ok) { if (alive) setError(detail?.error || `hub_${detailRes.status}`); return; }\n const eventsJson = eventsRes.ok ? await eventsRes.json() : { events: [] };\n if (!alive) return;\n setReq(detail.requirement as Requirement);\n setEvents((eventsJson.events || []) as EventRow[]);\n } catch (e: unknown) {\n if (alive) setError(e instanceof Error ? e.message : 'fetch failed');\n } finally {\n if (alive) setLoading(false);\n }\n })();\n return () => { alive = false; };\n }, [id, reloadKey]);\n\n if (loading) {\n return (\n <div className=\"min-h-screen bg-[var(--bg)] p-6 text-gray-500\">\n <div className=\"mx-auto max-w-4xl space-y-3\">\n <div className=\"h-6 w-2/3 animate-pulse rounded bg-[var(--bg-elevated)]\" />\n <div className=\"h-40 animate-pulse rounded bg-[var(--bg-secondary)]\" />\n </div>\n </div>\n );\n }\n\n if (needsLogin) {\n return (\n <div className=\"min-h-screen bg-[var(--bg)] p-6\">\n <div className=\"mx-auto max-w-4xl 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 </div>\n );\n }\n\n if (error || !req) {\n return (\n <div className=\"min-h-screen bg-[var(--bg)] p-6\">\n <div className=\"mx-auto max-w-4xl\">\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 ? `读取失败:${error}` : '这条需求不存在或不可见。'}\n </div>\n <Link href=\"/requirements\" className=\"text-sm text-blue-400 hover:underline\">← 返回需求列表</Link>\n </div>\n </div>\n );\n }\n\n const checklist = req.checklist || [];\n\n return (\n <div className=\"min-h-screen bg-[var(--bg)] text-gray-200\">\n <div className=\"mx-auto max-w-4xl px-4 py-6 sm:px-6\">\n <div className=\"mb-4\">\n <Link href=\"/requirements\" className=\"text-xs text-gray-500 hover:text-gray-300\">← 需求列表</Link>\n </div>\n\n <header className=\"mb-5\">\n <div className=\"mb-2 flex flex-wrap items-center gap-2 text-[11px] text-gray-500\">\n <span className=\"tabular-nums\">#{req.seq}</span>\n <span className={`rounded border px-1.5 py-0.5 ${COLUMN_CHIP[req.column] || COLUMN_CHIP.abandoned}`}>{req.column}</span>\n <span>{req.priority}</span>\n {req.due && <span>due {String(req.due).slice(0, 10)}</span>}\n {(req.tags || []).map(t => (\n <span key={t} className=\"rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-gray-400\">{t}</span>\n ))}\n </div>\n <h1 className=\"text-lg font-semibold text-white\">{req.name}</h1>\n <div className=\"mt-2 flex flex-wrap gap-4 text-[11px] text-gray-500\">\n <span>负责人 {personLabel(req.owner)}</span>\n <span>负责 Agent {personLabel(req.agent_owner)}</span>\n {req.children && req.children.total > 0 && <span>子卡 {req.children.done}/{req.children.total}</span>}\n {req.external_url && (\n <a href={req.external_url} target=\"_blank\" rel=\"noreferrer\" className=\"text-blue-400 hover:underline\">\n {req.external_ref || 'external'}\n </a>\n )}\n </div>\n </header>\n\n {/* #1634 — write surface. Hub keeps the rules (owner must be human,\n node tokens may not delete); this bar only sends whitelisted fields. */}\n <section className=\"mb-6 flex flex-wrap items-center gap-2 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] px-3 py-2.5\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Status</span>\n {COLUMN_OPTIONS.map(opt => (\n <button\n key={opt.key}\n type=\"button\"\n disabled={busy || req.column === opt.key}\n onClick={() => sendPatch({ column: opt.key })}\n className={`rounded-md border px-2.5 py-1 text-xs transition-colors disabled:opacity-60 ${\n req.column === opt.key\n ? (COLUMN_CHIP[opt.key] || COLUMN_CHIP.abandoned)\n : 'border-transparent text-gray-500 hover:bg-[var(--bg-elevated)] hover:text-gray-200'\n }`}\n >\n {opt.label}\n </button>\n ))}\n <span className=\"mx-1 h-4 w-px bg-[var(--border)]\" />\n <label className=\"flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-gray-600\">\n Priority\n <select\n value={req.priority}\n disabled={busy}\n onChange={e => sendPatch({ priority: e.target.value })}\n className=\"rounded border border-[var(--border)] bg-[var(--bg-secondary)] px-1.5 py-1 text-xs normal-case text-gray-200\"\n >\n {PRIORITY_OPTIONS.map(p => <option key={p} value={p}>{p}</option>)}\n </select>\n </label>\n <label className=\"flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-gray-600\">\n Due\n <input\n type=\"date\"\n value={req.due ? String(req.due).slice(0, 10) : ''}\n disabled={busy}\n onChange={e => sendPatch({ due: e.target.value })}\n className=\"rounded border border-[var(--border)] bg-[var(--bg-secondary)] px-1.5 py-1 text-xs normal-case text-gray-200\"\n />\n </label>\n {busy && <span className=\"text-[11px] text-gray-500\">saving…</span>}\n {actionError && <span className=\"text-[11px] text-red-400\">{actionError}</span>}\n </section>\n\n <section className=\"mb-6 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-4\">\n <h2 className=\"mb-2 text-xs uppercase tracking-wide text-gray-500\">Description</h2>\n {req.description ? (\n <div className=\"prose prose-invert max-w-none prose-sm prose-pre:bg-[var(--bg)] prose-pre:border prose-pre:border-[var(--border)]\">\n <ReactMarkdown remarkPlugins={[remarkGfm]}>{req.description}</ReactMarkdown>\n </div>\n ) : (\n <p className=\"text-sm text-gray-600\">(没有描述)</p>\n )}\n </section>\n\n <section className=\"mb-6 rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-4\">\n <h2 className=\"mb-2 text-xs uppercase tracking-wide text-gray-500\">\n Checklist {checklist.length > 0 && <span className=\"ml-1 text-gray-600\">{checklist.filter(c => c.done).length}/{checklist.length}</span>}\n </h2>\n {checklist.length === 0 ? (\n <p className=\"text-sm text-gray-600\">(没有检查项)</p>\n ) : (\n <ul className=\"space-y-1.5\">\n {checklist.map(item => (\n <li key={item.id}>\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => toggleItem(item.id, !item.done)}\n className=\"flex items-start gap-2 text-left text-sm hover:opacity-80 disabled:opacity-60\"\n >\n <span aria-hidden className={item.done ? 'text-emerald-400' : 'text-gray-600'}>{item.done ? '✓' : '○'}</span>\n <span className={item.done ? 'text-gray-500 line-through' : 'text-gray-200'}>{item.text}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className=\"rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)] p-4\">\n <h2 className=\"mb-2 text-xs uppercase tracking-wide text-gray-500\">Activity</h2>\n {events.length === 0 ? (\n <EmptyState variant=\"generic\" compact title=\"还没有动态\" sub=\"状态变更和评论会出现在这里。\" />\n ) : (\n <ul className=\"space-y-2\">\n {events.map(ev => {\n const d = describeEvent(ev);\n return (\n <li key={ev.id} className=\"rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-3 py-2\">\n <div className=\"flex flex-wrap items-center gap-2 text-[11px] text-gray-500\">\n <span className=\"text-gray-300\">{personLabel(ev.actor)}</span>\n <span className=\"rounded bg-[var(--bg-elevated)] px-1.5 py-0.5\">{d.label}</span>\n {ev.at && <span>{String(ev.at).replace('T', ' ').slice(0, 16)}</span>}\n </div>\n {d.body && (d.label === 'comment'\n ? <CommentMarkdown text={d.body} />\n : <p className=\"mt-1 whitespace-pre-wrap break-words text-sm text-gray-300\">{d.body}</p>)}\n </li>\n );\n })}\n </ul>\n )}\n\n <div className=\"mt-3 border-t border-[var(--border)] pt-3\">\n <textarea\n value={comment}\n onChange={e => setComment(e.target.value)}\n rows={2}\n placeholder=\"写一条进展或评论…(Ctrl/⌘+Enter 发送)\"\n className=\"w-full resize-y rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-2 text-sm text-gray-200 placeholder-gray-700 focus:border-blue-500/40 focus:outline-none\"\n onKeyDown={e => { if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') submitComment(); }}\n />\n <div className=\"mt-2 flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={busy || !comment.trim()}\n onClick={submitComment}\n className=\"rounded-lg border border-blue-500/30 bg-blue-500/10 px-3 py-1.5 text-xs text-blue-300 disabled:opacity-50\"\n >\n Add comment\n </button>\n {actionError && <span className=\"text-[11px] text-red-400\">{actionError}</span>}\n </div>\n </div>\n </section>\n </div>\n </div>\n );\n}\n","'use client';\n\n// 需求评论正文的 Markdown 渲染(#1831 的 Web 侧)。\n//\n// Activity 里评论和「字段变更」混在一条时间线:评论正文是 Agent 用 requirements_comment 写的\n// Markdown,admin 2026-10-19 截图指出它此前按 `whitespace-pre-wrap` 纯文本显示,`## 归因更正`、\n// `**错误**`、反引号 `agent_owner` 全露出原字符。客户端那半边在 agent-network-app 的 #961。\n//\n// 渲染器沿用本仓已有的 react-markdown + remark-gfm:不拼 HTML 字符串,也不开 rehype-raw,\n// 所以评论里写标签只会当文字。\n//\n// ⚠️ 不要用 `prose` 类:本仓是 Tailwind v4,**没装 @tailwindcss/typography**,\n// `prose` 在这里是空类;而 Tailwind 的 preflight 会把 h1–h6 的 font-size/weight 重置成\n// 继承、把 ul/ol 的 list-style 清掉 —— 结果标题和列表看起来和正文一模一样(等于「去掉了 # 号\n// 但没渲染」)。所以这里按元素逐个给类,和 TaskChatPanel 的 markdown 组件表同一思路,\n// 颜色只用语义 token。\n\nimport ReactMarkdown, { type Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\n\nconst COMPONENTS: Components = {\n p: ({ children }) => <p className=\"my-1 whitespace-pre-wrap break-words leading-relaxed\">{children}</p>,\n h1: ({ children }) => <h1 className=\"mb-1 mt-3 text-base font-semibold text-[var(--fg)]\">{children}</h1>,\n h2: ({ children }) => <h2 className=\"mb-1 mt-3 text-sm font-semibold text-[var(--fg)]\">{children}</h2>,\n h3: ({ children }) => <h3 className=\"mb-1 mt-2 text-sm font-semibold text-[var(--fg-muted)]\">{children}</h3>,\n h4: ({ children }) => <h4 className=\"mb-1 mt-2 text-xs font-semibold uppercase tracking-wide text-[var(--fg-muted)]\">{children}</h4>,\n strong: ({ children }) => <strong className=\"font-semibold text-[var(--fg)]\">{children}</strong>,\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n del: ({ children }) => <del className=\"line-through opacity-70\">{children}</del>,\n a: ({ href, children }) => (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-[var(--info)] underline hover:no-underline\">\n {children}\n </a>\n ),\n ul: ({ children }) => <ul className=\"my-1 list-disc space-y-0.5 pl-5\">{children}</ul>,\n ol: ({ children }) => <ol className=\"my-1 list-decimal space-y-0.5 pl-5\">{children}</ol>,\n li: ({ children }) => <li className=\"break-words\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"my-1 border-l-2 border-[var(--border)] pl-2.5 text-[var(--fg-muted)]\">{children}</blockquote>\n ),\n hr: () => <hr className=\"my-2 border-[var(--border)]\" />,\n // 行内 code 与代码块共用 `code`;react-markdown 会给围栏代码的父级 <pre> 单独回调,\n // 所以这里只画行内样式,代码块在 `pre` 里统一处理。\n code: ({ children }) => (\n <code className=\"rounded bg-[var(--code-bg)] px-1 py-0.5 font-mono text-[0.9em] text-[var(--code-fg)]\">{children}</code>\n ),\n pre: ({ children }) => (\n <pre className=\"my-2 overflow-x-auto rounded-lg border border-[var(--border)] bg-[var(--code-bg)] px-2.5 py-2 font-mono text-xs leading-relaxed [&>code]:bg-transparent [&>code]:p-0\">\n {children}\n </pre>\n ),\n table: ({ children }) => (\n <div className=\"my-2 overflow-x-auto\">\n <table className=\"w-full border-collapse text-xs\">{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"bg-[var(--code-bg)]\">{children}</thead>,\n tr: ({ children }) => <tr className=\"border-b border-[var(--border)]\">{children}</tr>,\n th: ({ children }) => (\n <th className=\"border border-[var(--border)] px-2 py-1 text-left font-semibold text-[var(--fg)]\">{children}</th>\n ),\n td: ({ children }) => <td className=\"border border-[var(--border)] px-2 py-1 align-top\">{children}</td>,\n};\n\nexport default function CommentMarkdown({ text }: { text: string }) {\n if (!text) return null;\n return (\n <div className=\"mt-1 break-words text-sm text-[var(--fg-muted)]\" data-testid=\"requirement-comment-markdown\">\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={COMPONENTS}>{text}</ReactMarkdown>\n </div>\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","COMPONENTS","p","h1","h2","h3","h4","strong","em","del","a","ul","ol","li","blockquote","hr","code","pre","table","thead","tr","th","td","CommentMarkdown","text","remarkPlugins","components"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.
|
|
1
|
+
module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.60"],344)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=%5Broot-of-the-server%5D__1ovdbox._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../package.json.%5Bjson%5D.mjs","../../../../app/lib/version.ts"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"desktopName\":\"agent-network.desktop\",\"version\":\"0.6.3-preview.
|
|
1
|
+
{"version":3,"sources":["../../../../package.json.%5Bjson%5D.mjs","../../../../app/lib/version.ts"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"desktopName\":\"agent-network.desktop\",\"version\":\"0.6.3-preview.60\",\"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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwiZGVza3RvcE5hbWVcIjpcImFnZW50LW5ldHdvcmsuZGVza3RvcFwiLFwidmVyc2lvblwiOlwiMC42LjMtcHJldmlldy42MFwiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwicG9zdGJ1aWxkXCI6XCJub2RlIHNjcmlwdHMvc3RhbXAtYnVpbGQtY29tbWl0Lm1qc1wiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwib3NzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvb3NzLXJlYWRpbmVzcy1jaGVjay5tanNcIixcIm9zczpiaW5hcmllc1wiOlwibm9kZSBzY3JpcHRzL29zcy1iaW5hcnktc2Nhbi5tanNcIixcIm9zczpzZWNyZXRzXCI6XCJub2RlIHNjcmlwdHMvb3NzLXNlY3JldC1zY2FuLm1qcyAtLXNjb3BlIHRyZWVcIixcIm9zczpzZWNyZXRzOmhpc3RvcnlcIjpcIm5vZGUgc2NyaXB0cy9vc3Mtc2VjcmV0LXNjYW4ubWpzIC0tc2NvcGUgaGlzdG9yeVwiLFwib3NzOnN1cmZhY2VcIjpcIm5vZGUgc2NyaXB0cy9vc3MtcHVibGljLXN1cmZhY2Utc2Nhbi5tanMgLS1zY29wZSBhbGxcIixcImFwcDphbmRyb2lkOmluaXRcIjpcIm5weCBjYXAgYWRkIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOnN5bmNcIjpcIm5weCBjYXAgc3luYyBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpvcGVuXCI6XCJucHggY2FwIG9wZW4gYW5kcm9pZFwiLFwiYXBwOmlvczppbml0XCI6XCJucHggY2FwIGFkZCBpb3NcIixcImFwcDppb3M6c3luY1wiOlwibnB4IGNhcCBzeW5jIGlvc1wiLFwiYXBwOmlvczpvcGVuXCI6XCJucHggY2FwIG9wZW4gaW9zXCIsXCJhcHA6ZGVza3RvcFwiOlwiZWxlY3Ryb24gYXBwcy9kZXNrdG9wL2VsZWN0cm9uL21haW4uY2pzXCIsXCJhcHA6ZGVza3RvcDpwYWNrXCI6XCJlbGVjdHJvbi1idWlsZGVyIC0tY29uZmlnIGVsZWN0cm9uLWJ1aWxkZXIuanNvblwiLFwicHJlcHVibGlzaE9ubHlcIjpcIlsgLWYgLm5leHQvQlVJTERfSUQgXSB8fCAoZWNobyAncHJlcHVibGlzaE9ubHk6IC5uZXh0L0JVSUxEX0lEIG1pc3Npbmcg4oCUIHJ1biBucG0gcnVuIGJ1aWxkIGZpcnN0IChzZWUgY29tbWl0IDA1YzFlYmYgYm9keSBmb3IgUjIyNCBjaHVuay01MDAgcm9vdCBjYXVzZSknID4mMiAmJiBleGl0IDEpXCIsXCJhdmF0YXJzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInJhdGNoZXRcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qc1wiLFwiZ2F0ZXNcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qcyAmJiBub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInRlc3RcIjpcIm5vZGUgc2NyaXB0cy9ydW4tdGVzdHMubWpzXCJ9LFwiYmluXCI6e1wiYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIjpcIi4vYmluL3N0YXJ0LmpzXCJ9LFwiaG9tZXBhZ2VcIjpcImh0dHBzOi8vYW5ldC5zaFwiLFwicmVwb3NpdG9yeVwiOntcInR5cGVcIjpcImdpdFwiLFwidXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkXCJ9LFwiYnVnc1wiOntcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9pc3N1ZXNcIn0sXCJhdXRob3JcIjpcInNsZWVwMmFnaVwiLFwibGljZW5zZVwiOlwiQXBhY2hlLTIuMFwiLFwiZW5naW5lc1wiOntcIm5vZGVcIjpcIj49MjBcIn0sXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMy4wXCIsXCJwaW55aW4tcHJvXCI6XCJeMy4yOC4xXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludFwiOlwiXjlcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMy4wXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** 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"],"names":[],"mappings":"qIAC4G"}
|
|
@@ -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.60"],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.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
|
+
{"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.60\",\"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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwiZGVza3RvcE5hbWVcIjpcImFnZW50LW5ldHdvcmsuZGVza3RvcFwiLFwidmVyc2lvblwiOlwiMC42LjMtcHJldmlldy42MFwiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwicG9zdGJ1aWxkXCI6XCJub2RlIHNjcmlwdHMvc3RhbXAtYnVpbGQtY29tbWl0Lm1qc1wiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwib3NzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvb3NzLXJlYWRpbmVzcy1jaGVjay5tanNcIixcIm9zczpiaW5hcmllc1wiOlwibm9kZSBzY3JpcHRzL29zcy1iaW5hcnktc2Nhbi5tanNcIixcIm9zczpzZWNyZXRzXCI6XCJub2RlIHNjcmlwdHMvb3NzLXNlY3JldC1zY2FuLm1qcyAtLXNjb3BlIHRyZWVcIixcIm9zczpzZWNyZXRzOmhpc3RvcnlcIjpcIm5vZGUgc2NyaXB0cy9vc3Mtc2VjcmV0LXNjYW4ubWpzIC0tc2NvcGUgaGlzdG9yeVwiLFwib3NzOnN1cmZhY2VcIjpcIm5vZGUgc2NyaXB0cy9vc3MtcHVibGljLXN1cmZhY2Utc2Nhbi5tanMgLS1zY29wZSBhbGxcIixcImFwcDphbmRyb2lkOmluaXRcIjpcIm5weCBjYXAgYWRkIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOnN5bmNcIjpcIm5weCBjYXAgc3luYyBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpvcGVuXCI6XCJucHggY2FwIG9wZW4gYW5kcm9pZFwiLFwiYXBwOmlvczppbml0XCI6XCJucHggY2FwIGFkZCBpb3NcIixcImFwcDppb3M6c3luY1wiOlwibnB4IGNhcCBzeW5jIGlvc1wiLFwiYXBwOmlvczpvcGVuXCI6XCJucHggY2FwIG9wZW4gaW9zXCIsXCJhcHA6ZGVza3RvcFwiOlwiZWxlY3Ryb24gYXBwcy9kZXNrdG9wL2VsZWN0cm9uL21haW4uY2pzXCIsXCJhcHA6ZGVza3RvcDpwYWNrXCI6XCJlbGVjdHJvbi1idWlsZGVyIC0tY29uZmlnIGVsZWN0cm9uLWJ1aWxkZXIuanNvblwiLFwicHJlcHVibGlzaE9ubHlcIjpcIlsgLWYgLm5leHQvQlVJTERfSUQgXSB8fCAoZWNobyAncHJlcHVibGlzaE9ubHk6IC5uZXh0L0JVSUxEX0lEIG1pc3Npbmcg4oCUIHJ1biBucG0gcnVuIGJ1aWxkIGZpcnN0IChzZWUgY29tbWl0IDA1YzFlYmYgYm9keSBmb3IgUjIyNCBjaHVuay01MDAgcm9vdCBjYXVzZSknID4mMiAmJiBleGl0IDEpXCIsXCJhdmF0YXJzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInJhdGNoZXRcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qc1wiLFwiZ2F0ZXNcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qcyAmJiBub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInRlc3RcIjpcIm5vZGUgc2NyaXB0cy9ydW4tdGVzdHMubWpzXCJ9LFwiYmluXCI6e1wiYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIjpcIi4vYmluL3N0YXJ0LmpzXCJ9LFwiaG9tZXBhZ2VcIjpcImh0dHBzOi8vYW5ldC5zaFwiLFwicmVwb3NpdG9yeVwiOntcInR5cGVcIjpcImdpdFwiLFwidXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkXCJ9LFwiYnVnc1wiOntcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9pc3N1ZXNcIn0sXCJhdXRob3JcIjpcInNsZWVwMmFnaVwiLFwibGljZW5zZVwiOlwiQXBhY2hlLTIuMFwiLFwiZW5naW5lc1wiOntcIm5vZGVcIjpcIj49MjBcIn0sXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMy4wXCIsXCJwaW55aW4tcHJvXCI6XCJeMy4yOC4xXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludFwiOlwiXjlcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMy4wXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** 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.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 →"})]})]})]})]})]})}])}];
|
|
1
|
+
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.60"],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
|