@sleep2agi/agent-network-dashboard 0.3.0 → 0.3.2
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/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +19 -0
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/diagnostics/route-bundle-stats.json +4 -4
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +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/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- 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/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.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 +1 -1
- package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
- package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/docs.html +2 -2
- package/.next/server/app/docs.rsc +3 -3
- package/.next/server/app/docs.segments/_full.segment.rsc +3 -3
- package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/docs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/docs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/login.segments/login.segment.rsc +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/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.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 +1 -1
- package/.next/server/app/logs.segments/logs.segment.rsc +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/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.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 +1 -1
- package/.next/server/app/messages.segments/messages.segment.rsc +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/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.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 +1 -1
- package/.next/server/app/node.segments/node.segment.rsc +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/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.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 +1 -1
- package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +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/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.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 +1 -1
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +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/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.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 +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +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/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.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 +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +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/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.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 +1 -1
- package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/.next/server/chunks/[root-of-the-server]__0.r9hpx._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0.~awwb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__011ghni._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0_roltz._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0ak3zmb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0c0_p0v._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0c5h0a~._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0cfodg2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0fo7jlh._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0h-9kwu._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0h-9kwu._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0hj~i84._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0hj~i84._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0hxwf9u._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0k3eytp._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0khwewd._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0ku8l.~._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0ku8l.~._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0lu__6g._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0nsfjkb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0nsfjkb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0wpe~w2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__10ducxb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__114809t._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__114809t._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__11yl3c.._.js.map +1 -1
- package/.next/server/chunks/ssr/app_docs_page_tsx_0a3qz3_._.js +1 -1
- package/.next/server/chunks/ssr/app_docs_page_tsx_0a3qz3_._.js.map +1 -1
- package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js +1 -1
- package/.next/server/chunks/ssr/app_login_page_tsx_0z71ad3._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{063eleenll4ri.js → 06.gd_vlnz5n0.js} +6 -6
- package/.next/static/chunks/0mz9c6--6di2j.css +2 -0
- package/.next/static/chunks/{0afxijuigt-49.js → 0o5zj~5vjeks3.js} +1 -1
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/CODE_OF_CONDUCT.md +43 -0
- package/CONTRIBUTING.md +67 -0
- package/LICENSE +202 -0
- package/NOTICE +17 -0
- package/SECURITY.md +41 -0
- package/app/api/hub/events/route.ts +1 -1
- package/app/api/hub/nodes/route.ts +1 -1
- package/app/api/hub/send/route.ts +1 -1
- package/app/api/hub/server-logs/route.ts +1 -1
- package/app/api/hub/tasks/route.ts +1 -1
- package/app/docs/page.tsx +1 -1
- package/app/globals.css +158 -12
- package/app/lib/hub.ts +0 -3
- package/app/login/page.tsx +1 -1
- package/package.json +9 -3
- package/test-results/.last-run.json +2 -7
- package/.next/static/chunks/0f7op3pijuqfp.css +0 -2
- package/test-results/e2e-Dashboard-E2E-Tests-nodes-page-shows-demo-nodes/error-context.md +0 -149
- package/test-results/e2e-Dashboard-E2E-Tests-overview-page-shows-stats/error-context.md +0 -149
- package/test-results/e2e-Dashboard-E2E-Tests-settings-page-shows-license-config/error-context.md +0 -149
- package/test-results/e2e-Dashboard-E2E-Tests-sidebar-navigation-works/error-context.md +0 -149
- package/tsconfig.tsbuildinfo +0 -1
- /package/.next/static/{-jUT94SC1lsdw_iAzLYdx → dR3GSMnwa4k46SIbP3PaK}/_buildManifest.js +0 -0
- /package/.next/static/{-jUT94SC1lsdw_iAzLYdx → dR3GSMnwa4k46SIbP3PaK}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{-jUT94SC1lsdw_iAzLYdx → dR3GSMnwa4k46SIbP3PaK}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../app/api/hub/tasks/route.ts"],"sourcesContent":["import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/hub/tasks/route\",\n pathname: \"/api/hub/tasks\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/hub/tasks/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/hub/tasks/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { requireDashboardAuth, getV3UserToken } from '@/app/lib/dashboard-auth';\n\nconst HUB_URL = process.env.COMMHUB_URL || 'http://47.77.216.1:9200';\nconst AUTH_TOKEN = process.env.COMMHUB_AUTH_TOKEN || '';\n\nasync function hubHeaders(): Promise<Record<string, string>> {\n const userToken = await getV3UserToken();\n const bearer = userToken || AUTH_TOKEN;\n const h: Record<string, string> = {};\n if (bearer) h['Authorization'] = `Bearer ${bearer}`;\n return h;\n}\n\ninterface Completion {\n id: string;\n session_name: string;\n task: string;\n result: string;\n artifacts: unknown;\n score: number | null;\n duration_minutes: number | null;\n completed_at: string;\n}\n\n/**\n * Proxy layer: tries /api/tasks first (v2), falls back to /api/completions (v0.4.1).\n * Front-end always gets a stable {ok, tasks[], count} shape.\n */\nexport async function GET(req: Request) {\n const authFailure = await requireDashboardAuth();\n if (authFailure) return authFailure;\n\n const { searchParams } = new URL(req.url);\n const limit = parseInt(searchParams.get('limit') || '100', 10);\n const networkId = searchParams.get('network_id') || '';\n const filterStatus = searchParams.get('status') || '';\n const filterFrom = searchParams.get('from_name') || '';\n const filterTo = searchParams.get('to_name') || '';\n const filterTaskId = searchParams.get('task_id') || '';\n\n try {\n // Try v2 /api/tasks first\n const params = new URLSearchParams();\n if (networkId) params.set('network_id', networkId);\n if (filterStatus) params.set('status', filterStatus);\n if (filterFrom) params.set('from_name', filterFrom);\n if (filterTo) params.set('to_name', filterTo);\n if (filterTaskId) params.set('task_id', filterTaskId);\n params.set('limit', String(limit));\n\n const tasksRes = await fetch(\n `${HUB_URL}/api/tasks?${params.toString()}`,\n { headers: await hubHeaders(), next: { revalidate: 0 } },\n );\n const contentType = tasksRes.headers.get('content-type') || '';\n if (tasksRes.ok && contentType.includes('application/json')) {\n const data = await tasksRes.json();\n if (data.ok && data.tasks && data.tasks.length > 0) {\n return Response.json(data);\n }\n // network_id filter returned empty — retry without filter to include unassigned tasks\n if (networkId && data.tasks?.length === 0) {\n const fallbackParams = new URLSearchParams();\n if (filterStatus) fallbackParams.set('status', filterStatus);\n if (filterFrom) fallbackParams.set('from_name', filterFrom);\n if (filterTo) fallbackParams.set('to_name', filterTo);\n fallbackParams.set('limit', String(limit));\n const fbRes = await fetch(`${HUB_URL}/api/tasks?${fallbackParams.toString()}`, { headers: await hubHeaders(), next: { revalidate: 0 } });\n if (fbRes.ok) {\n const fbData = await fbRes.json();\n if (fbData.ok && fbData.tasks?.length > 0) {\n return Response.json({ ...fbData, source: 'global' });\n }\n }\n return Response.json(data);\n }\n }\n\n // Fallback: map /api/completions to tasks shape\n const compRes = await fetch(\n `${HUB_URL}/api/completions?limit=${limit}`,\n { headers: await hubHeaders(), next: { revalidate: 0 } },\n );\n const compData = await compRes.json();\n const completions: Completion[] = compData.completions || [];\n\n let tasks = completions.map(c => ({\n task_id: c.id,\n from_name: '',\n to_name: c.session_name,\n status: 'replied',\n priority: 'normal',\n content: c.task || '',\n result: c.result || '',\n created_at: c.completed_at,\n updated_at: c.completed_at,\n delivered_at: '',\n started_at: '',\n completed_at: c.completed_at,\n expires_at: '',\n }));\n\n // Apply client-side filters for fallback mode\n if (filterStatus && filterStatus !== 'replied') {\n tasks = []; // completions are all \"replied\"\n }\n if (filterFrom) {\n tasks = tasks.filter(t => t.from_name.includes(filterFrom));\n }\n if (filterTo) {\n tasks = tasks.filter(t => t.to_name.includes(filterTo));\n }\n\n return Response.json({ ok: true, tasks, count: tasks.length, source: 'completions' });\n } catch (e: unknown) {\n return Response.json(\n { error: 'CommHub unreachable', detail: e instanceof Error ? e.message : String(e) },\n { status: 502 },\n );\n }\n}\n"],"names":["HUB_URL","process","env","COMMHUB_URL","AUTH_TOKEN","COMMHUB_AUTH_TOKEN","hubHeaders","userToken","bearer","h","filterStatus","params","GET","req","authFailure","ok","searchParams","URL","url","limit","parseInt","get","networkId","filterFrom","filterTo","filterTaskId","set","URLSearchParams","String","tasksRes","fetch","toString","headers","next","revalidate","contentType","includes","data","json","tasks","length","Response","fallbackParams","fbRes","completed_at","c","fbData","source","compRes","compData","completions","map","task_id","id","from_name","to_name","session_name","status","priority","content","task","result","created_at","updated_at","delivered_at","started_at","expires_at","filter","t","count","e","error","detail","Error","message"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../app/api/hub/tasks/route.ts"],"sourcesContent":["import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/hub/tasks/route\",\n pathname: \"/api/hub/tasks\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/hub/tasks/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/hub/tasks/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { requireDashboardAuth, getV3UserToken } from '@/app/lib/dashboard-auth';\n\nconst HUB_URL = process.env.COMMHUB_URL || 'http://127.0.0.1:9200';\nconst AUTH_TOKEN = process.env.COMMHUB_AUTH_TOKEN || '';\n\nasync function hubHeaders(): Promise<Record<string, string>> {\n const userToken = await getV3UserToken();\n const bearer = userToken || AUTH_TOKEN;\n const h: Record<string, string> = {};\n if (bearer) h['Authorization'] = `Bearer ${bearer}`;\n return h;\n}\n\ninterface Completion {\n id: string;\n session_name: string;\n task: string;\n result: string;\n artifacts: unknown;\n score: number | null;\n duration_minutes: number | null;\n completed_at: string;\n}\n\n/**\n * Proxy layer: tries /api/tasks first (v2), falls back to /api/completions (v0.4.1).\n * Front-end always gets a stable {ok, tasks[], count} shape.\n */\nexport async function GET(req: Request) {\n const authFailure = await requireDashboardAuth();\n if (authFailure) return authFailure;\n\n const { searchParams } = new URL(req.url);\n const limit = parseInt(searchParams.get('limit') || '100', 10);\n const networkId = searchParams.get('network_id') || '';\n const filterStatus = searchParams.get('status') || '';\n const filterFrom = searchParams.get('from_name') || '';\n const filterTo = searchParams.get('to_name') || '';\n const filterTaskId = searchParams.get('task_id') || '';\n\n try {\n // Try v2 /api/tasks first\n const params = new URLSearchParams();\n if (networkId) params.set('network_id', networkId);\n if (filterStatus) params.set('status', filterStatus);\n if (filterFrom) params.set('from_name', filterFrom);\n if (filterTo) params.set('to_name', filterTo);\n if (filterTaskId) params.set('task_id', filterTaskId);\n params.set('limit', String(limit));\n\n const tasksRes = await fetch(\n `${HUB_URL}/api/tasks?${params.toString()}`,\n { headers: await hubHeaders(), next: { revalidate: 0 } },\n );\n const contentType = tasksRes.headers.get('content-type') || '';\n if (tasksRes.ok && contentType.includes('application/json')) {\n const data = await tasksRes.json();\n if (data.ok && data.tasks && data.tasks.length > 0) {\n return Response.json(data);\n }\n // network_id filter returned empty — retry without filter to include unassigned tasks\n if (networkId && data.tasks?.length === 0) {\n const fallbackParams = new URLSearchParams();\n if (filterStatus) fallbackParams.set('status', filterStatus);\n if (filterFrom) fallbackParams.set('from_name', filterFrom);\n if (filterTo) fallbackParams.set('to_name', filterTo);\n fallbackParams.set('limit', String(limit));\n const fbRes = await fetch(`${HUB_URL}/api/tasks?${fallbackParams.toString()}`, { headers: await hubHeaders(), next: { revalidate: 0 } });\n if (fbRes.ok) {\n const fbData = await fbRes.json();\n if (fbData.ok && fbData.tasks?.length > 0) {\n return Response.json({ ...fbData, source: 'global' });\n }\n }\n return Response.json(data);\n }\n }\n\n // Fallback: map /api/completions to tasks shape\n const compRes = await fetch(\n `${HUB_URL}/api/completions?limit=${limit}`,\n { headers: await hubHeaders(), next: { revalidate: 0 } },\n );\n const compData = await compRes.json();\n const completions: Completion[] = compData.completions || [];\n\n let tasks = completions.map(c => ({\n task_id: c.id,\n from_name: '',\n to_name: c.session_name,\n status: 'replied',\n priority: 'normal',\n content: c.task || '',\n result: c.result || '',\n created_at: c.completed_at,\n updated_at: c.completed_at,\n delivered_at: '',\n started_at: '',\n completed_at: c.completed_at,\n expires_at: '',\n }));\n\n // Apply client-side filters for fallback mode\n if (filterStatus && filterStatus !== 'replied') {\n tasks = []; // completions are all \"replied\"\n }\n if (filterFrom) {\n tasks = tasks.filter(t => t.from_name.includes(filterFrom));\n }\n if (filterTo) {\n tasks = tasks.filter(t => t.to_name.includes(filterTo));\n }\n\n return Response.json({ ok: true, tasks, count: tasks.length, source: 'completions' });\n } catch (e: unknown) {\n return Response.json(\n { error: 'CommHub unreachable', detail: e instanceof Error ? e.message : String(e) },\n { status: 502 },\n );\n }\n}\n"],"names":["HUB_URL","process","env","COMMHUB_URL","AUTH_TOKEN","COMMHUB_AUTH_TOKEN","hubHeaders","userToken","bearer","h","set","toString","GET","req","authFailure","searchParams","URL","url","limit","parseInt","get","networkId","filterStatus","filterFrom","filterTo","filterTaskId","params","URLSearchParams","ok","String","tasksRes","fetch","json","headers","next","revalidate","contentType","includes","data","tasks","length","Response","fallbackParams","completions","content","c","fbRes","completed_at","fbData","source","filter","compRes","compData","map","task_id","id","from_name","to_name","session_name","status","priority","task","result","created_at","updated_at","delivered_at","started_at","expires_at","t","count","e","error","detail","Error","message"],"mappings":"wjCAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,CAAA,CAAA,OAAA,IAAA,EAAA,EAAA,CAAA,CAAA,KChBA,EAAA,EAAA,CAAA,CAAA,KAEA,IAAMA,EAAUC,QAAQC,GAAG,CAACC,WAAW,EAAI,wBACrCC,EAAaH,QAAQC,GAAG,CAACG,kBAAkB,EAAI,GAErD,eAAeC,IAEb,IAAME,EADY,AACHD,MADS,CAAA,EAAA,EAAA,cAAc,AAAd,KACIH,EACtBK,EAA4B,CAAC,EAEnC,OADID,IAAQC,CAAC,CAAC,aAAgB,CAAG,CAAC,OAAO,EAAED,EAAAA,CAAAA,AAAQ,EAC5CC,CACT,CAiBO,eAAeG,EAAIC,CAAY,EACpC,IAAMC,EAAc,MAAM,CAAA,EAAA,EAAA,oBAAA,AAAoB,IAC9C,GAAIA,EAAa,OAAOA,EAExB,GAAM,cAAEC,CAAY,CAAE,CAAG,IAAIC,IAAIH,EAAII,GAAG,EAClCC,EAAQC,SAASJ,EAAaK,GAAG,CAAC,UAAY,MAAO,IACrDC,EAAYN,EAAaK,GAAG,CAAC,eAAiB,GAC9CE,EAAeP,EAAaK,GAAG,CAAC,WAAa,GAC7CG,EAAaR,EAAaK,GAAG,CAAC,cAAgB,GAC9CI,EAAWT,EAAaK,GAAG,CAAC,YAAc,GAC1CK,EAAeV,EAAaK,GAAG,CAAC,YAAc,GAEpD,GAAI,CAEF,IAAMM,EAAS,IAAIC,gBACfN,GAAWK,EAAOhB,GAAG,CAAC,aAAcW,GACpCC,GAAcI,EAAOhB,GAAG,CAAC,SAAUY,GACnCC,GAAYG,EAAOhB,GAAG,CAAC,YAAaa,GACpCC,GAAUE,EAAOhB,GAAG,CAAC,UAAWc,GAChCC,GAAcC,EAAOhB,GAAG,CAAC,UAAWe,GACxCC,EAAOhB,GAAG,CAAC,QAASmB,OAAOX,IAE3B,IAAMY,EAAW,MAAMC,MACrB,CAAA,EAAG/B,EAAQ,WAAW,EAAE0B,EAAOf,QAAQ,GAAA,CAAI,CAC3C,CAAEsB,QAAS,MAAM3B,IAAc4B,KAAM,CAAEC,WAAY,CAAE,CAAE,GAEnDC,EAAcN,EAASG,OAAO,CAACb,GAAG,CAAC,iBAAmB,GAC5D,GAAIU,EAASF,EAAE,EAAIQ,EAAYC,QAAQ,CAAC,oBAAqB,CAC3D,IAAMC,EAAO,MAAMR,EAASE,IAAI,GAChC,GAAIM,EAAKV,EAAE,EAAIU,EAAKC,KAAK,EAAID,EAAKC,KAAK,CAACC,MAAM,CAAG,EAC/C,CADkD,MAC3CC,SAAST,IAAI,CAACM,GAGvB,GAAIjB,GAAaiB,EAAKC,KAAK,EAAEC,SAAW,EAAG,CACzC,IAAME,EAAiB,IAAIf,gBACvBL,GAAcoB,EAAehC,GAAG,CAAC,SAAUY,GAC3CC,GAAYmB,EAAehC,GAAG,CAAC,YAAaa,GAC5CC,GAAUkB,EAAehC,GAAG,CAAC,UAAWc,GAC5CkB,EAAehC,GAAG,CAAC,QAASmB,OAAOX,IACnC,IAAM4B,EAAQ,MAAMf,MAAM,CAAA,EAAG/B,EAAQ,WAAW,EAAE0C,EAAe/B,QAAQ,GAAA,CAAI,CAAE,CAAEsB,QAAS,MAAM3B,IAAc4B,KAAM,CAAEC,WAAY,CAAE,CAAE,GACtI,GAAIW,EAAMlB,EAAE,CAAE,CACZ,IAAMoB,EAAS,MAAMF,EAAMd,IAAI,GAC/B,GAAIgB,EAAOpB,EAAE,EAAIoB,EAAOT,KAAK,EAAEC,OAAS,EACtC,CADyC,MAClCC,SAAST,IAAI,CAAC,CAAE,GAAGgB,CAAM,CAAEC,OAAQ,QAAS,EAEvD,CACA,OAAOR,SAAST,IAAI,CAACM,EACvB,CACF,CAGA,IAAMa,EAAU,MAAMpB,MACpB,CAAA,EAAG/B,EAAQ,uBAAuB,EAAEkB,EAAAA,CAAO,CAC3C,CAAEe,QAAS,MAAM3B,IAAc4B,KAAM,CAAEC,WAAY,CAAE,CAAE,GAKrDI,EAAQI,CAFsBS,CADjB,MAAMD,EAAQnB,IAAI,EAAA,EACQW,WAAW,EAAI,EAAA,AAAE,EAEpCU,GAAG,CAACR,IAAM,AAAD,CAC/BS,QAAST,EAAEU,EAAE,CACbC,UAAW,GACXC,QAASZ,EAAEa,YAAY,CACvBC,OAAQ,UACRC,SAAU,SACVhB,QAASC,EAAEgB,IAAI,EAAI,GACnBC,OAAQjB,EAAEiB,MAAM,EAAI,GACpBC,WAAYlB,EAAEE,YAAY,CAC1BiB,WAAYnB,EAAEE,YAAY,CAC1BkB,aAAc,GACdC,WAAY,GACZnB,aAAcF,EAAEE,YAAY,CAC5BoB,WAAY,GACd,CAAC,EAaD,OAVI7C,GAAiC,WAAW,CAA5BA,IAClBiB,EAAQ,EAAA,AAAE,EAERhB,AAFU,IAGZgB,EAAQA,EAAMW,IADA,EACM,CAACkB,GAAKA,EAAEZ,SAAS,CAACnB,EAHM,MAGE,CAACd,GAAAA,EAE7CC,GACFe,GAAQA,EAAMW,EADF,IACQ,CAACkB,GAAKA,EAAEX,OAAO,CAACpB,QAAQ,CAACb,GAAAA,EAGxCiB,SAAST,IAAI,CAAC,CAAEJ,IAAI,QAAMW,EAAO8B,MAAO9B,EAAMC,MAAM,CAAES,OAAQ,aAAc,EACrF,CAAE,MAAOqB,EAAY,CACnB,OAAO7B,SAAST,IAAI,CAClB,CAAEuC,MAAO,sBAAuBC,OAAQF,aAAaG,MAAQH,EAAEI,OAAO,CAAG7C,OAAOyC,EAAG,EACnF,CAAEX,OAAQ,GAAI,EAElB,CACF,wBDvGA,IAAA,EAAA,EAAA,CAAA,CAAA,OAIA,IAAM,EAAc,IAAI,EAAA,mBAAmB,CAAC,CACxC,WAAY,CACR,KAAM,EAAA,SAAS,CAAC,SAAS,CACzBjD,KAAM,uBACN,SAAU,iBACV,SAAU,QACVC,WAAY,EAChB,EACA,QAAS,CAAA,OACT,IADiD,eACc,CAA3C,EACpB,iBAAkB,uCAClB,iBAZqB,GAcrB,SAAU,EAKV,GAAG,AAEC,CAAC,CAAC,AACV,GAIM,kBAAE,CAAgB,cAPwC,QAOtC,CAAoB,aAAE,CAAW,CAAE,CAAG,EAQzD,eAAe,EAAQ,CAAG,CAAE,CAAG,CAAE,CAAG,EACnC,EAAI,WAAW,EAAE,AACjB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,EAAI,WAAW,EAEnC,EAAY,KAAK,EAAE,AACnB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,+BAAgC,QAAQ,MAAM,CAAC,MAAM,IAE7E,IAAI,EAAU,uBAKV,EAAU,EAAQ,OAAO,CAAC,WAAY,KAAO,IAMjD,IAAM,EAAgB,MAAM,EAAY,OAAO,CAAC,EAAK,EAAK,SACtD,EACA,mBAHEoC,CAAAA,CAIN,GACA,GAAI,CAAC,EAID,OAHA,EAAI,IADY,MACF,CAAG,IACjB,EAAI,GAAGG,CAAC,eACS,MAAjB,CAAwB,CAApB,IAAyB,KAAhB,EAAoB,EAAI,SAAS,CAAC,IAAI,CAAC,EAAK,QAAQ,OAAO,IACjE,KAEX,GAAM,SAAE,CAAO,QAAE,CAAM,CAAE,YAAU,WAAEtB,CAAS,aAAE,CAAW,mBAAEW,CAAiB,qBAAE,CAAmB,sBAAE,CAAoB,yBAAE,CAAuBP,kBAAE,CAAgB,yBAAE,CAAuB,uBAAE,CAAqB,CAAE,CAAG,EACnN,EAAoB,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,GACvC,GAAQ,EAAQ,EAAkB,aAAa,CAAC,EAAkB,EAAI,EAAkB,MAAM,CAAC,EAAA,AAAiB,EAC9G,EAAY,WAEa,MAAvB,EAA8B,KAAK,EAAI,EAAoB,SAAA,AAAS,EAAE,AACtE,MAAM,EAAoB,SAAS,CAAC,EAAK,EAAK,GAAW,GAEzD,EAAI,GAAG,CAAC,gCAEL,MAEX,GAAI,GAAS,CAAC,EAAa,CACvB,IAAM,GAAgB,CAAQ,EAAkB,MAAM,CAAC,EAAiB,CAClE,EAAgB,EAAkB,aAAa,CAAC,EAAkB,CACxE,GAAI,IAC+B,IAA3B,EAAc,KADH,GACW,EAAc,CAAC,EAAe,CACpD,GAAI,EAAW,WAAW,CACtB,CADwB,MACjB,MAAM,GAEjB,OAAM,IAAI,EAAA,eAAe,AAC7B,CAER,CACA,IAAI,EAAW,MACX,GAAU,EAAY,IAAb,CAAkB,EAAK,EAAD,EAG/B,EAAW,AAAa,OAHqB,KAC7C,EAAW,CAAA,EAEwB,IAAM,CAAA,EAE7C,IAAM,GACgB,IAAtB,EAAY,EAAkB,GAAb,EAEjB,CAAC,EAKK,EAAqB,GAAS,CAAC,EAIjC,GAAyB,GACzB,CAAA,EAAA,EAAA,iBADkD,IAClD,AAAqB,EAAC,CAClB,KAAM,aAbqF,aAc3F,wBACA,CACJ,GAEJ,IAAM,EAAS,EAAI,MAAM,EAAI,MACvB,EAAS,CAAA,EAAA,EAAA,SAAS,AAAT,IACT,EAAa,EAAO,kBAAkB,GACtC,GAAwB,EAAQ,AAAuB,QAAO,KAAK,EAAI,EAAoB,qBAAA,AAAqB,EAChH,EAAgB,EAAQ,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,eAC5C,EAAmB,CAAA,EAAA,EAAA,cAAA,AAAc,EAAC,EAAK,qBAAuB,MAAM,EAAY,mBAAmB,CAAC,EAAK,EAAY,EAAmB,EAC1H,OAApB,AAA2B,GAAS,EAAiB,AAArB,iBAAsC,GACtE,WAAW,kBAAkB,CAAG,EAChC,IAAM,EAAU,QACZ,EACA,aAAc,EAAkB,OAAO,CACvC,WAAY,CACR,aAAc,CACV,gBAAgB,CAAQ,EAAW,YAAY,CAAC,cAAc,AAClE,EACA,gBAAiB,EAAQ,EAAW,eAAe,yBACnD,mBACA,EACA,kBAAmB,EAAW,SAAS,CACvC,UAAW,EAAI,SAAS,CACxB,QAAU,AAAD,IACL,EAAI,EAAE,CAAC,QAAS,EACpB,EACA,sBAAkB,EAClB,8BAA+B,CAAC,EAAO,EAAU,EAAc,IAAa,EAAY,cAAc,CAAC,EAAK,EAAO,EAAc,EAAY,EACjJ,EACA,cAAe,SACX,CACJ,CACJ,EACM,EAAc,IAAI,EAAA,eAAe,CAAC,GAClC,EAAc,IAAI,EAAA,gBAAgB,CAAC,GACnC,EAAU,EAAA,kBAAkB,CAAC,mBAAmB,CAAC,EAAa,CAAA,EAAA,EAAA,sBAAA,AAAsB,EAAC,IAC3F,GAAI,CAEA,IADI,EACE,EAAoB,MAAO,GACtB,EAAY,MAAM,CAAC,EAAS,GAAS,OAAO,CAAC,KAChD,GAAI,CAAC,EAAM,OACX,EAAK,aAAa,CAAC,CACf,mBAAoB,EAAI,UAAU,CAClC,YAAY,CAChB,GACA,IAAM,EAAqB,EAAO,qBAAqB,GAEvD,GAAI,CAAC,EACD,OAEJ,GAAI,EAAmB,GAAG,CAAC,EAHF,kBAGwB,EAAA,cAAc,CAAC,aAAa,CAAE,YAC3E,QAAQ,IAAI,CAAC,CAAC,2BAA2B,EAAE,EAAmB,GAAG,CAAC,kBAAkB,qEAAqE,CAAC,EAG9J,IAAM,EAAQ,EAAmB,GAAG,CAAC,cACrC,GAAI,EAAO,CACP,IAAM,EAAO,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAO,CACjC,EAAK,aAAa,CAAC,CACf,aAAc,EACd,aAAc,EACd,iBAAkB,CACtB,GACA,EAAK,UAAU,CAAC,GAGZ,GAAc,IAAe,IAC7B,EADmC,AACxB,YAAY,CAAC,aAAc,GACtC,EAAW,UAAU,CAAC,GAE9B,MACI,CADG,CACE,UAAU,CAAC,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAS,CAE9C,GAEE,EAAiB,MAAO,QACtB,EA4FI,EA3FR,IAAM,EAAoB,MAAO,CAAE,oBAAkB,CAAE,IACnD,GAAI,CACA,GAAI,CAAC,GAAiB,GAAwB,GAA2B,CAAC,EAKtE,OAJA,EAAI,SADsF,CAC5E,CAAG,IAEjB,EAAI,SAAS,CAAC,iBAAkB,eAChC,EAAI,GAAG,CAAC,gCACD,KAEX,IAAM,EAAW,MAAM,EAAkB,GACzC,EAAI,YAAY,CAAG,EAAQ,UAAU,CAAC,YAAY,CAClD,IAAI,EAAmB,EAAQ,UAAU,CAAC,gBAAgB,CAGtD,GACI,EAAI,SAAS,EAAE,CACf,CAFc,CAEV,SAAS,CAAC,GACd,OAAmB,GAG3B,IAAM,EAAY,EAAQ,UAAU,CAAC,aAAa,CAGlD,IAAI,EA6BA,OADA,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAAa,EAAU,EAAQ,UAAU,CAAC,gBAAgB,EACnF,IA7BA,EACP,IAAM,EAAO,MAAM,EAAS,IAAI,GAE1B,EAAU,CAAA,EAAA,EAAA,yBAAA,AAAyB,EAAC,EAAS,OAAO,EACtD,IACA,CAAO,CAAC,EAAA,GADG,mBACmB,CAAC,CAAG,CAAA,EAElC,CAAC,CAAO,CAAC,eAAe,EAAI,EAAK,IAAI,EAAE,CACvC,CAAO,CAAC,eAAe,CAAG,EAAK,IAAA,AAAI,EAEvC,IAAM,EAAa,KAAkD,IAA3C,EAAQ,UAAU,CAAC,mBAAmB,IAAoB,EAAQ,UAAU,CAAC,mBAAmB,EAAI,EAAA,cAAA,AAAc,GAAG,AAAQ,EAAQ,UAAU,CAAC,mBAAmB,CACvL,EAAS,KAA8C,IAAvC,EAAQ,UAAU,CAAC,eAAe,EAAoB,EAAQ,UAAU,CAAC,eAAe,EAAI,EAAA,cAAc,MAAG,EAAY,EAAQ,UAAU,CAAC,eAAe,CAcjL,MAZmB,CAYZ,AAXH,MAAO,CACH,KAAM,EAAA,eAAe,CAAC,SAAS,CAC/B,OAAQ,EAAS,MAAM,CACvB,KAAM,OAAO,IAAI,CAAC,MAAM,EAAK,WAAW,YACxC,CACJ,EACA,aAAc,YACV,SACA,CACJ,CACJ,CAEJ,CAKJ,CAAE,KALS,CAKF,EAAK,CAeV,KAZI,CAAsB,QAAO,KAAK,EAAI,EAAmB,OAAA,AAAO,EAAE,CAElE,MAAM,EAAY,cAAc,CAAC,EAAK,EAAK,CACvC,WAAY,aACZ,UAAW,EACX,UAAW,QACX,iBAAkB,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAAC,oBAClC,uBACA,CACJ,EACJ,GAAG,AATgB,EASJ,GAEb,CACV,CACJ,EACM,EAAa,MAAM,EAAY,cAAc,CAAC,KAChD,aACA,WACA,EACA,UAAW,EAAA,SAAS,CAAC,SAAS,CAC9B,WAAY,qBACZ,EACA,mBAAmB,uBACnB,0BACA,oBACA,EACA,UAAW,EAAI,SAAS,eACxB,CACJ,GAEA,GAAI,CAAC,EACD,KADQ,EACD,KAEX,GAAI,CAAe,MAAd,CAAqB,EAAS,AAA0C,GAA9C,IAAK,EAAoB,EAAW,KAAA,AAAK,EAAY,KAAK,EAAI,EAAkB,IAAI,IAAM,EAAA,eAAe,CAAC,SAAS,CAE9I,CAFgJ,KAE1I,OAAO,cAAc,CAAC,AAAI,MAAM,CAAC,kDAAkD,EAAgB,MAAd,CAAqB,EAAS,AAA2C,GAA/C,IAAK,EAAqB,EAAW,KAAA,AAAK,EAAY,KAAK,EAAI,EAAmB,IAAI,CAAA,CAAE,EAAG,oBAAqB,CACjO,MAAO,OACP,YAAY,EACZ,cAAc,CAClB,EAEA,CAAC,GACD,EAAI,SAAS,CADG,AACF,iBAAkB,EAAuB,cAAgB,EAAW,MAAM,CAAG,OAAS,EAAW,OAAO,CAAG,QAAU,OAGnI,GACA,EAAI,QADS,CACA,CAAC,gBAAiB,2DAEnC,IAAM,EAAU,CAAA,EAAA,EAAA,2BAAA,AAA2B,EAAC,EAAW,KAAK,CAAC,OAAO,EAcpE,OAbI,AAAE,CAAD,EAAkB,GACnB,EAAQ,AADgB,GAAG,GACb,CAAC,EAAA,sBAAsB,EAIrC,GAAW,YAAY,EAAK,EAAD,AAAK,SAAS,CAAC,kBAAqB,EAAD,AAAS,GAAG,CAAC,kBAAkB,AAC7F,EAAQ,GAAG,CAAC,gBAAiB,CAAA,EAAA,EAAA,qBAAA,AAAqB,EAAC,EAAW,YAAY,GAE9E,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAChC,IAAI,SAAS,EAAW,KAAK,CAAC,IAAI,CAAE,CAChC,UACA,OAAQ,EAAW,KAAK,CAAC,MAAM,EAAI,GACvC,IACO,IACX,EAGI,GAAyB,EACzB,MAAM,EAAe,EADgB,EAGrC,EAAa,EAAO,kBAAkB,GACtC,MAAM,EAAO,qBAAqB,CAAC,EAAI,OAAO,CAAE,IAAI,EAAO,KAAK,CAAC,EAAA,cAAc,CAAC,aAAa,CAAE,CACvF,SAAU,CAAA,EAAG,EAAO,CAAC,EAAE,EAAA,CAAS,CAChC,KAAM,EAAA,QAAQ,CAAC,MAAM,CACrB,WAAY,CACR,cAAe,EACf,cAAe,EAAI,GAAG,AAC1B,CACJ,EAAG,QAAiB,EAAW,CAAC,GAE5C,CAAE,MAAO,EAAK,CAeV,GAdM,aAAe,EAAA,eAAe,EAEhC,CAFmC,KAE7B,EAAY,cAAc,CAAC,EAAK,EAAK,CACvC,WAAY,aACZ,UAAW,EACX,UAAW,QACX,iBAAkB,CAAA,EAAA,EAAA,mBAAA,AAAmB,EAAC,CAClC,qBACA,sBACJ,EACJ,GAAG,AATgB,EASJ,GAIf,EAAO,MAAM,EAKjB,OAHA,MAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAa,EAAa,IAAI,SAAS,KAAM,CAC5D,OAAQ,GACZ,IACO,IACX,CACJ,mCA3TA,SAAS,EACL,MAAO,CAAA,EAAA,EAAA,UAAA,AAAWJ,EAAC,kBACf,uBACA,CACJI,EACJ","ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../app/lib/hub.ts","../../../app/api/hub/audit-log/route.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["import { getV3UserToken } from './dashboard-auth';\n\nfunction getHubUrl() {\n // Default to local hub. Was previously a leftover dev IP (47.77.216.1)\n // which broke any deployment that didn't set COMMHUB_URL — login appeared\n // to \"fail\" because every hub call resolved to an unreachable IP.\n return process.env.COMMHUB_URL || 'http://127.0.0.1:9200';\n}\n\nfunction getCommHubToken() {\n return process.env.COMMHUB_AUTH_TOKEN || '';\n}\n\nexport const HUB_URL = getHubUrl();\n\nexport function hubHeaders(): Record<string, string> {\n const h: Record<string, string> = {};\n const token = getCommHubToken();\n if (token) h['Authorization'] = `Bearer ${token}`;\n return h;\n}\n\n/**\n * Fetch from CommHub. Prefers V3 user token (atok_) if logged in,\n * falls back to CommHub service token.\n */\nexport async function hubFetch(path: string, init?: RequestInit): Promise<Response> {\n const url = `${getHubUrl()}${path}`;\n const COMMHUB_TOKEN = getCommHubToken();\n\n // Build auth: prefer V3 user token, fallback to service token\n let authHeader: Record<string, string> = {};\n\n // Only try V3 token if no Authorization already in init.headers\n const initHeaders = init?.headers as Record<string, string> | undefined;\n if (!initHeaders?.['Authorization']) {\n try {\n const userToken = await getV3UserToken();\n if (userToken) {\n authHeader = { 'Authorization': `Bearer ${userToken}` };\n }\n } catch {\n // cookies() not available in this context, ignore\n }\n\n if (!authHeader['Authorization'] && COMMHUB_TOKEN) {\n authHeader = { 'Authorization': `Bearer ${COMMHUB_TOKEN}` };\n }\n }\n\n return fetch(url, {\n ...init,\n headers: { ...authHeader, ...init?.headers },\n next: { revalidate: 0 },\n } as RequestInit);\n}\n","import { requireDashboardAuth } from '@/app/lib/dashboard-auth';\nimport { hubFetch } from '@/app/lib/hub';\n\nexport async function GET(req: Request) {\n const authFailure = await requireDashboardAuth();\n if (authFailure) return authFailure;\n\n const { searchParams } = new URL(req.url);\n const params = new URLSearchParams();\n for (const key of ['limit', 'action', 'user_id', 'network_id']) {\n const val = searchParams.get(key);\n if (val) params.set(key, val);\n }\n // User token overrides CommHub token for user-scoped access\n const userToken = searchParams.get('token') || '';\n\n try {\n const init: RequestInit = {};\n if (userToken) {\n init.headers = { 'Authorization': `Bearer ${userToken}` };\n }\n // Without userToken, hubFetch uses CommHub auth token\n\n const res = await hubFetch(`/api/audit-log?${params.toString()}`, init);\n const contentType = res.headers.get('content-type') || '';\n if (res.ok && contentType.includes('application/json')) {\n return Response.json(await res.json());\n }\n // Graceful fallback\n const text = await res.text().catch(() => '');\n return Response.json({ ok: false, logs: [], count: 0, error: text || `status ${res.status}` });\n } catch (e: unknown) {\n return Response.json({ error: 'failed', detail: e instanceof Error ? e.message : String(e) }, { status: 502 });\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/hub/audit-log/route\",\n pathname: \"/api/hub/audit-log\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/hub/audit-log/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/hub/audit-log/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":["getHubUrl","process","env","COMMHUB_URL","getCommHubToken","COMMHUB_AUTH_TOKEN","HUB_URL","hubHeaders","h","token","hubFetch","path","init","url","COMMHUB_TOKEN","authHeader","initHeaders","headers","userToken","fetch","next","revalidate","GET","req","authFailure","searchParams","URL","params","URLSearchParams","key","res","val","get","set","toString","contentType","ok","includes","Response","json","text","catch","logs","count","error","status","e","detail","Error","message","String"],"mappings":"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","ignoreList":[2]}
|
|
1
|
+
{"version":3,"sources":["../../../app/lib/hub.ts","../../../app/api/hub/audit-log/route.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js"],"sourcesContent":["import { getV3UserToken } from './dashboard-auth';\n\nfunction getHubUrl() {\n return process.env.COMMHUB_URL || 'http://127.0.0.1:9200';\n}\n\nfunction getCommHubToken() {\n return process.env.COMMHUB_AUTH_TOKEN || '';\n}\n\nexport const HUB_URL = getHubUrl();\n\nexport function hubHeaders(): Record<string, string> {\n const h: Record<string, string> = {};\n const token = getCommHubToken();\n if (token) h['Authorization'] = `Bearer ${token}`;\n return h;\n}\n\n/**\n * Fetch from CommHub. Prefers V3 user token (atok_) if logged in,\n * falls back to CommHub service token.\n */\nexport async function hubFetch(path: string, init?: RequestInit): Promise<Response> {\n const url = `${getHubUrl()}${path}`;\n const COMMHUB_TOKEN = getCommHubToken();\n\n // Build auth: prefer V3 user token, fallback to service token\n let authHeader: Record<string, string> = {};\n\n // Only try V3 token if no Authorization already in init.headers\n const initHeaders = init?.headers as Record<string, string> | undefined;\n if (!initHeaders?.['Authorization']) {\n try {\n const userToken = await getV3UserToken();\n if (userToken) {\n authHeader = { 'Authorization': `Bearer ${userToken}` };\n }\n } catch {\n // cookies() not available in this context, ignore\n }\n\n if (!authHeader['Authorization'] && COMMHUB_TOKEN) {\n authHeader = { 'Authorization': `Bearer ${COMMHUB_TOKEN}` };\n }\n }\n\n return fetch(url, {\n ...init,\n headers: { ...authHeader, ...init?.headers },\n next: { revalidate: 0 },\n } as RequestInit);\n}\n","import { requireDashboardAuth } from '@/app/lib/dashboard-auth';\nimport { hubFetch } from '@/app/lib/hub';\n\nexport async function GET(req: Request) {\n const authFailure = await requireDashboardAuth();\n if (authFailure) return authFailure;\n\n const { searchParams } = new URL(req.url);\n const params = new URLSearchParams();\n for (const key of ['limit', 'action', 'user_id', 'network_id']) {\n const val = searchParams.get(key);\n if (val) params.set(key, val);\n }\n // User token overrides CommHub token for user-scoped access\n const userToken = searchParams.get('token') || '';\n\n try {\n const init: RequestInit = {};\n if (userToken) {\n init.headers = { 'Authorization': `Bearer ${userToken}` };\n }\n // Without userToken, hubFetch uses CommHub auth token\n\n const res = await hubFetch(`/api/audit-log?${params.toString()}`, init);\n const contentType = res.headers.get('content-type') || '';\n if (res.ok && contentType.includes('application/json')) {\n return Response.json(await res.json());\n }\n // Graceful fallback\n const text = await res.text().catch(() => '');\n return Response.json({ ok: false, logs: [], count: 0, error: text || `status ${res.status}` });\n } catch (e: unknown) {\n return Response.json({ error: 'failed', detail: e instanceof Error ? e.message : String(e) }, { status: 502 });\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/hub/audit-log/route\",\n pathname: \"/api/hub/audit-log\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/hub/audit-log/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/hub/audit-log/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n"],"names":["getHubUrl","process","env","COMMHUB_URL","getCommHubToken","COMMHUB_AUTH_TOKEN","HUB_URL","hubHeaders","h","token","hubFetch","path","init","url","COMMHUB_TOKEN","authHeader","initHeaders","headers","userToken","fetch","next","revalidate","GET","req","authFailure","searchParams","URL","params","URLSearchParams","key","res","val","get","set","toString","contentType","ok","includes","Response","json","text","catch","logs","count","error","status","e","detail","Error","message","String"],"mappings":"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","ignoreList":[2]}
|
|
@@ -40,6 +40,6 @@ GET /api/tasks — 任务列表
|
|
|
40
40
|
GET /api/nodes — 节点列表
|
|
41
41
|
GET /api/stats — 统计
|
|
42
42
|
GET /api/audit-log — 审计日志
|
|
43
|
-
GET /health — 健康检查`})]}),(0,b.jsxs)(e,{id:"faq",title:"常见问题",children:[(0,b.jsx)(j,{q:"ChatPanel 发消息没反应?",a:"检查节点是否在线(Overview 页绿色圆点)。MiniMax 节点响应较慢(30-60秒正常)。"}),(0,b.jsx)(j,{q:"Tasks 页为空?",a:"确保通过 ChatPanel 或 MCP send_task 发送过任务。"}),(0,b.jsx)(j,{q:"切换网络后数据为空?",a:"新网络没有 Agent 注册。需要用该网络的 ntok_ 启动 Agent。"}),(0,b.jsx)(j,{q:"侧栏看不到新建的网络?",a:"侧栏每 15s 自动刷新。稍等或手动刷新页面。"}),(0,b.jsx)(j,{q:"Codex 节点报错?",a:"宿主机执行 codex auth login 刷新 token。"})]}),(0,b.jsx)("div",{className:"mt-16 pt-6 border-t border-[#2a2a4a] text-center text-xs text-gray-600",children:"Agent Network Dashboard · Powered by
|
|
43
|
+
GET /health — 健康检查`})]}),(0,b.jsxs)(e,{id:"faq",title:"常见问题",children:[(0,b.jsx)(j,{q:"ChatPanel 发消息没反应?",a:"检查节点是否在线(Overview 页绿色圆点)。MiniMax 节点响应较慢(30-60秒正常)。"}),(0,b.jsx)(j,{q:"Tasks 页为空?",a:"确保通过 ChatPanel 或 MCP send_task 发送过任务。"}),(0,b.jsx)(j,{q:"切换网络后数据为空?",a:"新网络没有 Agent 注册。需要用该网络的 ntok_ 启动 Agent。"}),(0,b.jsx)(j,{q:"侧栏看不到新建的网络?",a:"侧栏每 15s 自动刷新。稍等或手动刷新页面。"}),(0,b.jsx)(j,{q:"Codex 节点报错?",a:"宿主机执行 codex auth login 刷新 token。"})]}),(0,b.jsx)("div",{className:"mt-16 pt-6 border-t border-[#2a2a4a] text-center text-xs text-gray-600",children:"Agent Network Dashboard · Powered by Sleep2AGI"})]})]})}])}];
|
|
44
44
|
|
|
45
45
|
//# sourceMappingURL=app_docs_page_tsx_0a3qz3_._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../app/docs/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useRef } from 'react';\n\nconst TOC = [\n { id: 'overview', label: '概览' },\n { id: 'login', label: '登录与注册' },\n { id: 'dashboard', label: 'Overview 首页' },\n { id: 'chat', label: 'ChatPanel 对话' },\n { id: 'nodes', label: 'Nodes 节点管理' },\n { id: 'tasks', label: 'Tasks 任务流水' },\n { id: 'messages', label: 'Messages 消息' },\n { id: 'networks', label: 'Networks 网络管理' },\n { id: 'admin', label: 'Admin 管理' },\n { id: 'cli', label: 'CLI 命令参考' },\n { id: 'config', label: '配置说明' },\n { id: 'api', label: 'API 参考' },\n { id: 'faq', label: '常见问题' },\n];\n\nexport default function DocsPage() {\n const [active, setActive] = useState('overview');\n const [tocOpen, setTocOpen] = useState(false);\n const [search, setSearch] = useState('');\n\n // Scroll spy\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n entries.forEach(e => { if (e.isIntersecting) setActive(e.target.id); });\n }, { rootMargin: '-20% 0px -70% 0px' });\n TOC.forEach(t => { const el = document.getElementById(t.id); if (el) observer.observe(el); });\n return () => observer.disconnect();\n }, []);\n\n const filteredToc = search ? TOC.filter(t => t.label.toLowerCase().includes(search.toLowerCase())) : TOC;\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex\">\n {/* Left sidebar TOC — desktop */}\n <aside className=\"hidden lg:block w-64 shrink-0 border-r border-[#2a2a4a] bg-[#0d0d1a] sticky top-0 h-screen overflow-y-auto\">\n <div className=\"p-4 border-b border-[#2a2a4a]\">\n <h2 className=\"text-sm font-bold text-white\">文档</h2>\n <p className=\"text-[10px] text-gray-600 mt-0.5\">Agent Network Dashboard</p>\n </div>\n <div className=\"px-3 py-2\">\n <input type=\"text\" value={search} onChange={e => setSearch(e.target.value)} placeholder=\"搜索文档...\"\n className=\"w-full bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-1.5 text-xs text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none\" />\n </div>\n <nav className=\"px-2 pb-4\">\n {filteredToc.map(t => (\n <a key={t.id} href={`#${t.id}`}\n className={`block px-3 py-1.5 rounded-lg text-xs transition-colors ${\n active === t.id ? 'bg-cyan-500/10 text-cyan-300 border-l-2 border-cyan-400' : 'text-gray-500 hover:text-gray-300 hover:bg-[#1a1a2a]'\n }`}>{t.label}</a>\n ))}\n </nav>\n </aside>\n\n {/* Mobile TOC toggle */}\n <button onClick={() => setTocOpen(!tocOpen)}\n className=\"lg:hidden fixed bottom-4 right-4 z-50 w-12 h-12 bg-cyan-600 rounded-full shadow-lg flex items-center justify-center text-white\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 12h16M4 18h7\" />\n </svg>\n </button>\n {tocOpen && (\n <>\n <div className=\"lg:hidden fixed inset-0 bg-black/50 z-40\" onClick={() => setTocOpen(false)} />\n <div className=\"lg:hidden fixed left-0 top-0 h-full w-64 bg-[#0d0d1a] border-r border-[#2a2a4a] z-50 overflow-y-auto p-4\">\n <h2 className=\"text-sm font-bold text-white mb-3\">目录</h2>\n {TOC.map(t => (\n <a key={t.id} href={`#${t.id}`} onClick={() => setTocOpen(false)}\n className={`block px-3 py-2 rounded-lg text-sm ${active === t.id ? 'text-cyan-300 bg-cyan-500/10' : 'text-gray-400'}`}>{t.label}</a>\n ))}\n </div>\n </>\n )}\n\n {/* Content */}\n <main className=\"flex-1 max-w-3xl mx-auto px-4 sm:px-8 py-8 lg:ml-0 ml-10\">\n <h1 className=\"text-3xl font-bold text-white mb-1\">Agent Network Dashboard</h1>\n <p className=\"text-gray-500 text-sm mb-10\">企业级 AI Agent 军团管控平台 · 使用指南</p>\n\n <Section id=\"overview\" title=\"概览\">\n <p>Agent Network 是基于 MCP (Model Context Protocol) 的多智能体协作基础设施。通过 CommHub Server 实现 Agent 间的任务派发、状态同步、消息路由。</p>\n <StepList steps={['查看所有 Agent 节点的实时状态','通过 ChatPanel 直接与任意 Agent 对话','派发任务、查看执行结果','管理网络、成员、权限','查看审计日志和通信记录']} />\n </Section>\n\n <Section id=\"login\" title=\"登录与注册\">\n <p>首次使用需注册账号。第一个注册的用户自动成为 admin。</p>\n <CodeBlock lang=\"bash\">{`# 注册\nUsername: 自定义\nPassword: 至少 6 位\n\n# 登录后自动跳转到 Overview 首页`}</CodeBlock>\n <Callout type=\"warning\">HTTP 环境下 cookie 不带 Secure 标志(已适配 Docker 场景)。</Callout>\n </Section>\n\n <Section id=\"dashboard\" title=\"Overview 首页\">\n <p>首页展示军团全貌:</p>\n <FeatureGrid features={[\n { title: 'Stats 卡片', desc: 'Online / Working / Offline / Total 实时计数' },\n { title: '拓扑图', desc: '节点关系可视化(桌面端)' },\n { title: 'Agent 卡片', desc: 'alias、status、runtime、SSE 状态' },\n { title: 'Chat 按钮', desc: '点击任意卡片发任务' },\n { title: '⚡ Dispatch', desc: '多选 Agent 批量派发' },\n { title: 'Quick Actions', desc: 'Nodes / Tasks / Messages 快速跳转' },\n ]} />\n </Section>\n\n <Section id=\"chat\" title=\"ChatPanel 对话\">\n <p>点击 Agent 卡片上的 <span className=\"text-cyan-400 font-medium\">Chat</span> 按钮打开聊天面板:</p>\n <StepList steps={[\n '输入任务内容 → Cmd+Enter 或点 Send 发送',\n '实时状态追踪:created → delivered → running → replied',\n '回复内容支持 Markdown 渲染(代码块、粗体)',\n '输入 @ 可选择其他节点,跨节点通信',\n 'CommandCenter:多 tab 并行与多个 Agent 对话',\n ]} />\n </Section>\n\n <Section id=\"nodes\" title=\"Nodes 节点管理\">\n <p>查看所有在线节点。支持 <span className=\"text-cyan-400\">Grid</span> / <span className=\"text-cyan-400\">List</span> 视图。</p>\n <p className=\"mt-2\">点击节点进入详情页,三个 Tab:</p>\n <FeatureGrid features={[\n { title: '💬 Chat', desc: '与该节点对话(全宽聊天区域)' },\n { title: '📋 Events', desc: '任务事件时间线(分组、颜色编码)' },\n { title: '📊 Info', desc: 'Runtime / Model / Server / Session ID' },\n ]} />\n </Section>\n\n <Section id=\"tasks\" title=\"Tasks 任务流水\">\n <StepList steps={[\n 'Tab 筛选:All / created / delivered / running / replied / failed',\n '按 From / To 节点过滤',\n '点击展开 TaskDrawer:输入、输出、时长、事件时间线',\n 'Failed 任务一键 Retry',\n ]} />\n </Section>\n\n <Section id=\"messages\" title=\"Messages 消息\">\n <FeatureGrid features={[\n { title: 'Timeline / Grouped', desc: '按时间线或对话对分组' },\n { title: '类型过滤', desc: 'task / message / broadcast / reply' },\n { title: '搜索高亮', desc: '关键词黄色高亮' },\n { title: '导出 MD', desc: '下载 Markdown 格式' },\n ]} />\n </Section>\n\n <Section id=\"networks\" title=\"Networks 网络管理\">\n <p>不同网络的 Agent 互不可见。</p>\n <StepList steps={[\n '创建网络(名称 + 描述)',\n '管理成员(owner / admin / member / viewer)',\n '侧栏点击切换网络',\n '生成邀请码分享',\n ]} />\n </Section>\n\n <Section id=\"admin\" title=\"Admin 管理\">\n <FeatureGrid features={[\n { title: 'Broadcast', desc: '群发消息给所有在线节点' },\n { title: 'DispatchPanel', desc: '多选 Agent 批量派发任务' },\n { title: 'User Register', desc: '注册新用户' },\n { title: 'Stats', desc: '系统统计概览' },\n ]} />\n </Section>\n\n <Section id=\"cli\" title=\"CLI 命令参考\">\n <CodeBlock lang=\"bash\">{`# 安装\nnpm i -g @sleep2agi/agent-network\n\n# 快速开始\nanet quickstart\n\n# 创建 + 启动节点\nanet create my-bot --runtime codex-sdk\nanet start my-bot\n\n# 网络管理\nanet network create my-project\nanet network invite <network-id>\nanet network join <invite-code>\n\n# 状态\nanet whoami\nanet status`}</CodeBlock>\n </Section>\n\n <Section id=\"config\" title=\"配置说明\">\n <p>优先级:CLI 参数 > 环境变量 > 项目 config > 全局 config</p>\n <CodeBlock lang=\"json\">{`// ~/.anet/config.json\n{\n \"hub\": \"http://127.0.0.1:9200\",\n \"token\": \"ntok_xxx\"\n}\n\n// 节点配置 .anet/nodes/<name>/config.json\n{\n \"runtime\": \"codex-sdk\",\n \"model\": \"gpt-5.4\",\n \"tools\": [\"Read\", \"Write\", \"Bash\"]\n}`}</CodeBlock>\n <CodeBlock lang=\"bash\">{`# 环境变量\nCOMMHUB_URL=http://127.0.0.1:9200\nCOMMHUB_TOKEN=ntok_xxx`}</CodeBlock>\n </Section>\n\n <Section id=\"api\" title=\"API 参考\">\n <h3 className=\"text-base font-semibold text-white mt-4 mb-3\">MCP Tools</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n {[\n ['report_status', '心跳 + 状态上报'], ['report_completion', '任务完成汇报'],\n ['get_inbox', '拉取待办'], ['ack_inbox', '确认收到'],\n ['send_task', '派发任务'], ['send_message', '发消息'],\n ['send_reply', '回复任务'], ['broadcast', '群发'],\n ['get_all_status', '全局状态'], ['get_session_status', '单节点状态'],\n ['retry_task', '重试任务'], ['cancel_task', '取消任务'],\n ].map(([name, desc]) => (\n <div key={name} className=\"flex items-center gap-3 bg-[#111128] rounded-lg px-3 py-2 border border-[#2a2a4a]\">\n <code className=\"text-cyan-400 text-xs shrink-0\">{name}</code>\n <span className=\"text-gray-500 text-xs\">{desc}</span>\n </div>\n ))}\n </div>\n\n <h3 className=\"text-base font-semibold text-white mt-6 mb-3\">REST API</h3>\n <CodeBlock lang=\"http\">{`POST /api/auth/register — 注册\nPOST /api/auth/login — 登录\nGET /api/auth/me — 当前用户\nGET /api/status — 全局状态\nGET /api/tasks — 任务列表\nGET /api/nodes — 节点列表\nGET /api/stats — 统计\nGET /api/audit-log — 审计日志\nGET /health — 健康检查`}</CodeBlock>\n </Section>\n\n <Section id=\"faq\" title=\"常见问题\">\n <FAQ q=\"ChatPanel 发消息没反应?\" a=\"检查节点是否在线(Overview 页绿色圆点)。MiniMax 节点响应较慢(30-60秒正常)。\" />\n <FAQ q=\"Tasks 页为空?\" a=\"确保通过 ChatPanel 或 MCP send_task 发送过任务。\" />\n <FAQ q=\"切换网络后数据为空?\" a=\"新网络没有 Agent 注册。需要用该网络的 ntok_ 启动 Agent。\" />\n <FAQ q=\"侧栏看不到新建的网络?\" a=\"侧栏每 15s 自动刷新。稍等或手动刷新页面。\" />\n <FAQ q=\"Codex 节点报错?\" a=\"宿主机执行 codex auth login 刷新 token。\" />\n </Section>\n\n {/* Page nav */}\n <div className=\"mt-16 pt-6 border-t border-[#2a2a4a] text-center text-xs text-gray-600\">\n Agent Network Dashboard · Powered by CommHub V3\n </div>\n </main>\n </div>\n );\n}\n\nfunction Section({ id, title, children }: { id: string; title: string; children: React.ReactNode }) {\n return (\n <section id={id} className=\"mb-12 scroll-mt-8\">\n <h2 className=\"text-xl font-bold text-white mb-4 pb-2 border-b border-[#2a2a4a]\">{title}</h2>\n <div className=\"text-gray-300 text-sm leading-relaxed space-y-3\">{children}</div>\n </section>\n );\n}\n\nfunction CodeBlock({ children, lang }: { children: string; lang?: string }) {\n const [copied, setCopied] = useState(false);\n const copy = () => {\n navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n return (\n <div className=\"mt-3 rounded-xl overflow-hidden border border-[#2a2a4a]\">\n <div className=\"flex items-center justify-between bg-[#0d0d1a] px-4 py-1.5 border-b border-[#2a2a4a]\">\n <span className=\"text-[10px] text-gray-600\">{lang || 'code'}</span>\n <button onClick={copy} className=\"text-[10px] text-gray-500 hover:text-gray-300 transition-colors\">\n {copied ? '✓ Copied' : 'Copy'}\n </button>\n </div>\n <pre className=\"bg-[#050510] px-4 py-3 text-[12px] text-green-300 overflow-x-auto leading-relaxed\">\n <code>{children}</code>\n </pre>\n </div>\n );\n}\n\nfunction StepList({ steps }: { steps: string[] }) {\n return (\n <div className=\"mt-3 space-y-2\">\n {steps.map((step, i) => (\n <div key={i} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-cyan-500/20 border border-cyan-500/30 flex items-center justify-center text-[10px] text-cyan-300 font-bold shrink-0\">{i + 1}</div>\n {i < steps.length - 1 && <div className=\"w-0.5 flex-1 mt-1 bg-[#2a2a4a]\" />}\n </div>\n <div className=\"text-sm text-gray-300 pt-0.5\">{step}</div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction FeatureGrid({ features }: { features: { title: string; desc: string }[] }) {\n return (\n <div className=\"mt-3 grid grid-cols-1 sm:grid-cols-2 gap-2\">\n {features.map(f => (\n <div key={f.title} className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl px-4 py-3\">\n <div className=\"text-sm text-white font-medium\">{f.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{f.desc}</div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction Callout({ children, type }: { children: React.ReactNode; type: 'info' | 'warning' }) {\n const colors = type === 'warning' ? 'border-yellow-500/20 bg-yellow-500/5 text-yellow-300' : 'border-blue-500/20 bg-blue-500/5 text-blue-300';\n return <div className={`mt-3 px-4 py-2.5 rounded-xl border text-xs ${colors}`}>{type === 'warning' ? '⚠️ ' : 'ℹ️ '}{children}</div>;\n}\n\nfunction FAQ({ q, a }: { q: string; a: string }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"mb-2 bg-[#111128] rounded-xl border border-[#2a2a4a] overflow-hidden\">\n <button onClick={() => setOpen(!open)} className=\"w-full flex items-center justify-between px-4 py-3 text-left\">\n <span className=\"text-sm text-cyan-400 font-medium\">{q}</span>\n <svg className={`w-4 h-4 text-gray-600 transition-transform ${open ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {open && <div className=\"px-4 pb-3 text-sm text-gray-400\">{a}</div>}\n </div>\n );\n}\n"],"names":["TOC","id","label","DocsPage","active","setActive","tocOpen","setTocOpen","search","setSearch","observer","IntersectionObserver","entries","forEach","e","isIntersecting","target","rootMargin","t","el","document","getElementById","observe","disconnect","filteredToc","filter","toLowerCase","includes","className","type","value","onChange","placeholder","map","href","onClick","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","d","Section","title","StepList","steps","CodeBlock","lang","Callout","FeatureGrid","features","desc","name","FAQ","q","a","children","copied","setCopied","copy","navigator","clipboard","writeText","setTimeout","step","i","length","f","colors","open","setOpen"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../app/docs/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useRef } from 'react';\n\nconst TOC = [\n { id: 'overview', label: '概览' },\n { id: 'login', label: '登录与注册' },\n { id: 'dashboard', label: 'Overview 首页' },\n { id: 'chat', label: 'ChatPanel 对话' },\n { id: 'nodes', label: 'Nodes 节点管理' },\n { id: 'tasks', label: 'Tasks 任务流水' },\n { id: 'messages', label: 'Messages 消息' },\n { id: 'networks', label: 'Networks 网络管理' },\n { id: 'admin', label: 'Admin 管理' },\n { id: 'cli', label: 'CLI 命令参考' },\n { id: 'config', label: '配置说明' },\n { id: 'api', label: 'API 参考' },\n { id: 'faq', label: '常见问题' },\n];\n\nexport default function DocsPage() {\n const [active, setActive] = useState('overview');\n const [tocOpen, setTocOpen] = useState(false);\n const [search, setSearch] = useState('');\n\n // Scroll spy\n useEffect(() => {\n const observer = new IntersectionObserver(entries => {\n entries.forEach(e => { if (e.isIntersecting) setActive(e.target.id); });\n }, { rootMargin: '-20% 0px -70% 0px' });\n TOC.forEach(t => { const el = document.getElementById(t.id); if (el) observer.observe(el); });\n return () => observer.disconnect();\n }, []);\n\n const filteredToc = search ? TOC.filter(t => t.label.toLowerCase().includes(search.toLowerCase())) : TOC;\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex\">\n {/* Left sidebar TOC — desktop */}\n <aside className=\"hidden lg:block w-64 shrink-0 border-r border-[#2a2a4a] bg-[#0d0d1a] sticky top-0 h-screen overflow-y-auto\">\n <div className=\"p-4 border-b border-[#2a2a4a]\">\n <h2 className=\"text-sm font-bold text-white\">文档</h2>\n <p className=\"text-[10px] text-gray-600 mt-0.5\">Agent Network Dashboard</p>\n </div>\n <div className=\"px-3 py-2\">\n <input type=\"text\" value={search} onChange={e => setSearch(e.target.value)} placeholder=\"搜索文档...\"\n className=\"w-full bg-[#111128] border border-[#2a2a4a] rounded-lg px-3 py-1.5 text-xs text-white placeholder-gray-600 focus:border-cyan-500/40 focus:outline-none\" />\n </div>\n <nav className=\"px-2 pb-4\">\n {filteredToc.map(t => (\n <a key={t.id} href={`#${t.id}`}\n className={`block px-3 py-1.5 rounded-lg text-xs transition-colors ${\n active === t.id ? 'bg-cyan-500/10 text-cyan-300 border-l-2 border-cyan-400' : 'text-gray-500 hover:text-gray-300 hover:bg-[#1a1a2a]'\n }`}>{t.label}</a>\n ))}\n </nav>\n </aside>\n\n {/* Mobile TOC toggle */}\n <button onClick={() => setTocOpen(!tocOpen)}\n className=\"lg:hidden fixed bottom-4 right-4 z-50 w-12 h-12 bg-cyan-600 rounded-full shadow-lg flex items-center justify-center text-white\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 12h16M4 18h7\" />\n </svg>\n </button>\n {tocOpen && (\n <>\n <div className=\"lg:hidden fixed inset-0 bg-black/50 z-40\" onClick={() => setTocOpen(false)} />\n <div className=\"lg:hidden fixed left-0 top-0 h-full w-64 bg-[#0d0d1a] border-r border-[#2a2a4a] z-50 overflow-y-auto p-4\">\n <h2 className=\"text-sm font-bold text-white mb-3\">目录</h2>\n {TOC.map(t => (\n <a key={t.id} href={`#${t.id}`} onClick={() => setTocOpen(false)}\n className={`block px-3 py-2 rounded-lg text-sm ${active === t.id ? 'text-cyan-300 bg-cyan-500/10' : 'text-gray-400'}`}>{t.label}</a>\n ))}\n </div>\n </>\n )}\n\n {/* Content */}\n <main className=\"flex-1 max-w-3xl mx-auto px-4 sm:px-8 py-8 lg:ml-0 ml-10\">\n <h1 className=\"text-3xl font-bold text-white mb-1\">Agent Network Dashboard</h1>\n <p className=\"text-gray-500 text-sm mb-10\">企业级 AI Agent 军团管控平台 · 使用指南</p>\n\n <Section id=\"overview\" title=\"概览\">\n <p>Agent Network 是基于 MCP (Model Context Protocol) 的多智能体协作基础设施。通过 CommHub Server 实现 Agent 间的任务派发、状态同步、消息路由。</p>\n <StepList steps={['查看所有 Agent 节点的实时状态','通过 ChatPanel 直接与任意 Agent 对话','派发任务、查看执行结果','管理网络、成员、权限','查看审计日志和通信记录']} />\n </Section>\n\n <Section id=\"login\" title=\"登录与注册\">\n <p>首次使用需注册账号。第一个注册的用户自动成为 admin。</p>\n <CodeBlock lang=\"bash\">{`# 注册\nUsername: 自定义\nPassword: 至少 6 位\n\n# 登录后自动跳转到 Overview 首页`}</CodeBlock>\n <Callout type=\"warning\">HTTP 环境下 cookie 不带 Secure 标志(已适配 Docker 场景)。</Callout>\n </Section>\n\n <Section id=\"dashboard\" title=\"Overview 首页\">\n <p>首页展示军团全貌:</p>\n <FeatureGrid features={[\n { title: 'Stats 卡片', desc: 'Online / Working / Offline / Total 实时计数' },\n { title: '拓扑图', desc: '节点关系可视化(桌面端)' },\n { title: 'Agent 卡片', desc: 'alias、status、runtime、SSE 状态' },\n { title: 'Chat 按钮', desc: '点击任意卡片发任务' },\n { title: '⚡ Dispatch', desc: '多选 Agent 批量派发' },\n { title: 'Quick Actions', desc: 'Nodes / Tasks / Messages 快速跳转' },\n ]} />\n </Section>\n\n <Section id=\"chat\" title=\"ChatPanel 对话\">\n <p>点击 Agent 卡片上的 <span className=\"text-cyan-400 font-medium\">Chat</span> 按钮打开聊天面板:</p>\n <StepList steps={[\n '输入任务内容 → Cmd+Enter 或点 Send 发送',\n '实时状态追踪:created → delivered → running → replied',\n '回复内容支持 Markdown 渲染(代码块、粗体)',\n '输入 @ 可选择其他节点,跨节点通信',\n 'CommandCenter:多 tab 并行与多个 Agent 对话',\n ]} />\n </Section>\n\n <Section id=\"nodes\" title=\"Nodes 节点管理\">\n <p>查看所有在线节点。支持 <span className=\"text-cyan-400\">Grid</span> / <span className=\"text-cyan-400\">List</span> 视图。</p>\n <p className=\"mt-2\">点击节点进入详情页,三个 Tab:</p>\n <FeatureGrid features={[\n { title: '💬 Chat', desc: '与该节点对话(全宽聊天区域)' },\n { title: '📋 Events', desc: '任务事件时间线(分组、颜色编码)' },\n { title: '📊 Info', desc: 'Runtime / Model / Server / Session ID' },\n ]} />\n </Section>\n\n <Section id=\"tasks\" title=\"Tasks 任务流水\">\n <StepList steps={[\n 'Tab 筛选:All / created / delivered / running / replied / failed',\n '按 From / To 节点过滤',\n '点击展开 TaskDrawer:输入、输出、时长、事件时间线',\n 'Failed 任务一键 Retry',\n ]} />\n </Section>\n\n <Section id=\"messages\" title=\"Messages 消息\">\n <FeatureGrid features={[\n { title: 'Timeline / Grouped', desc: '按时间线或对话对分组' },\n { title: '类型过滤', desc: 'task / message / broadcast / reply' },\n { title: '搜索高亮', desc: '关键词黄色高亮' },\n { title: '导出 MD', desc: '下载 Markdown 格式' },\n ]} />\n </Section>\n\n <Section id=\"networks\" title=\"Networks 网络管理\">\n <p>不同网络的 Agent 互不可见。</p>\n <StepList steps={[\n '创建网络(名称 + 描述)',\n '管理成员(owner / admin / member / viewer)',\n '侧栏点击切换网络',\n '生成邀请码分享',\n ]} />\n </Section>\n\n <Section id=\"admin\" title=\"Admin 管理\">\n <FeatureGrid features={[\n { title: 'Broadcast', desc: '群发消息给所有在线节点' },\n { title: 'DispatchPanel', desc: '多选 Agent 批量派发任务' },\n { title: 'User Register', desc: '注册新用户' },\n { title: 'Stats', desc: '系统统计概览' },\n ]} />\n </Section>\n\n <Section id=\"cli\" title=\"CLI 命令参考\">\n <CodeBlock lang=\"bash\">{`# 安装\nnpm i -g @sleep2agi/agent-network\n\n# 快速开始\nanet quickstart\n\n# 创建 + 启动节点\nanet create my-bot --runtime codex-sdk\nanet start my-bot\n\n# 网络管理\nanet network create my-project\nanet network invite <network-id>\nanet network join <invite-code>\n\n# 状态\nanet whoami\nanet status`}</CodeBlock>\n </Section>\n\n <Section id=\"config\" title=\"配置说明\">\n <p>优先级:CLI 参数 > 环境变量 > 项目 config > 全局 config</p>\n <CodeBlock lang=\"json\">{`// ~/.anet/config.json\n{\n \"hub\": \"http://127.0.0.1:9200\",\n \"token\": \"ntok_xxx\"\n}\n\n// 节点配置 .anet/nodes/<name>/config.json\n{\n \"runtime\": \"codex-sdk\",\n \"model\": \"gpt-5.4\",\n \"tools\": [\"Read\", \"Write\", \"Bash\"]\n}`}</CodeBlock>\n <CodeBlock lang=\"bash\">{`# 环境变量\nCOMMHUB_URL=http://127.0.0.1:9200\nCOMMHUB_TOKEN=ntok_xxx`}</CodeBlock>\n </Section>\n\n <Section id=\"api\" title=\"API 参考\">\n <h3 className=\"text-base font-semibold text-white mt-4 mb-3\">MCP Tools</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n {[\n ['report_status', '心跳 + 状态上报'], ['report_completion', '任务完成汇报'],\n ['get_inbox', '拉取待办'], ['ack_inbox', '确认收到'],\n ['send_task', '派发任务'], ['send_message', '发消息'],\n ['send_reply', '回复任务'], ['broadcast', '群发'],\n ['get_all_status', '全局状态'], ['get_session_status', '单节点状态'],\n ['retry_task', '重试任务'], ['cancel_task', '取消任务'],\n ].map(([name, desc]) => (\n <div key={name} className=\"flex items-center gap-3 bg-[#111128] rounded-lg px-3 py-2 border border-[#2a2a4a]\">\n <code className=\"text-cyan-400 text-xs shrink-0\">{name}</code>\n <span className=\"text-gray-500 text-xs\">{desc}</span>\n </div>\n ))}\n </div>\n\n <h3 className=\"text-base font-semibold text-white mt-6 mb-3\">REST API</h3>\n <CodeBlock lang=\"http\">{`POST /api/auth/register — 注册\nPOST /api/auth/login — 登录\nGET /api/auth/me — 当前用户\nGET /api/status — 全局状态\nGET /api/tasks — 任务列表\nGET /api/nodes — 节点列表\nGET /api/stats — 统计\nGET /api/audit-log — 审计日志\nGET /health — 健康检查`}</CodeBlock>\n </Section>\n\n <Section id=\"faq\" title=\"常见问题\">\n <FAQ q=\"ChatPanel 发消息没反应?\" a=\"检查节点是否在线(Overview 页绿色圆点)。MiniMax 节点响应较慢(30-60秒正常)。\" />\n <FAQ q=\"Tasks 页为空?\" a=\"确保通过 ChatPanel 或 MCP send_task 发送过任务。\" />\n <FAQ q=\"切换网络后数据为空?\" a=\"新网络没有 Agent 注册。需要用该网络的 ntok_ 启动 Agent。\" />\n <FAQ q=\"侧栏看不到新建的网络?\" a=\"侧栏每 15s 自动刷新。稍等或手动刷新页面。\" />\n <FAQ q=\"Codex 节点报错?\" a=\"宿主机执行 codex auth login 刷新 token。\" />\n </Section>\n\n {/* Page nav */}\n <div className=\"mt-16 pt-6 border-t border-[#2a2a4a] text-center text-xs text-gray-600\">\n Agent Network Dashboard · Powered by Sleep2AGI\n </div>\n </main>\n </div>\n );\n}\n\nfunction Section({ id, title, children }: { id: string; title: string; children: React.ReactNode }) {\n return (\n <section id={id} className=\"mb-12 scroll-mt-8\">\n <h2 className=\"text-xl font-bold text-white mb-4 pb-2 border-b border-[#2a2a4a]\">{title}</h2>\n <div className=\"text-gray-300 text-sm leading-relaxed space-y-3\">{children}</div>\n </section>\n );\n}\n\nfunction CodeBlock({ children, lang }: { children: string; lang?: string }) {\n const [copied, setCopied] = useState(false);\n const copy = () => {\n navigator.clipboard.writeText(children);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n return (\n <div className=\"mt-3 rounded-xl overflow-hidden border border-[#2a2a4a]\">\n <div className=\"flex items-center justify-between bg-[#0d0d1a] px-4 py-1.5 border-b border-[#2a2a4a]\">\n <span className=\"text-[10px] text-gray-600\">{lang || 'code'}</span>\n <button onClick={copy} className=\"text-[10px] text-gray-500 hover:text-gray-300 transition-colors\">\n {copied ? '✓ Copied' : 'Copy'}\n </button>\n </div>\n <pre className=\"bg-[#050510] px-4 py-3 text-[12px] text-green-300 overflow-x-auto leading-relaxed\">\n <code>{children}</code>\n </pre>\n </div>\n );\n}\n\nfunction StepList({ steps }: { steps: string[] }) {\n return (\n <div className=\"mt-3 space-y-2\">\n {steps.map((step, i) => (\n <div key={i} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-cyan-500/20 border border-cyan-500/30 flex items-center justify-center text-[10px] text-cyan-300 font-bold shrink-0\">{i + 1}</div>\n {i < steps.length - 1 && <div className=\"w-0.5 flex-1 mt-1 bg-[#2a2a4a]\" />}\n </div>\n <div className=\"text-sm text-gray-300 pt-0.5\">{step}</div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction FeatureGrid({ features }: { features: { title: string; desc: string }[] }) {\n return (\n <div className=\"mt-3 grid grid-cols-1 sm:grid-cols-2 gap-2\">\n {features.map(f => (\n <div key={f.title} className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl px-4 py-3\">\n <div className=\"text-sm text-white font-medium\">{f.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{f.desc}</div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction Callout({ children, type }: { children: React.ReactNode; type: 'info' | 'warning' }) {\n const colors = type === 'warning' ? 'border-yellow-500/20 bg-yellow-500/5 text-yellow-300' : 'border-blue-500/20 bg-blue-500/5 text-blue-300';\n return <div className={`mt-3 px-4 py-2.5 rounded-xl border text-xs ${colors}`}>{type === 'warning' ? '⚠️ ' : 'ℹ️ '}{children}</div>;\n}\n\nfunction FAQ({ q, a }: { q: string; a: string }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"mb-2 bg-[#111128] rounded-xl border border-[#2a2a4a] overflow-hidden\">\n <button onClick={() => setOpen(!open)} className=\"w-full flex items-center justify-between px-4 py-3 text-left\">\n <span className=\"text-sm text-cyan-400 font-medium\">{q}</span>\n <svg className={`w-4 h-4 text-gray-600 transition-transform ${open ? 'rotate-180' : ''}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {open && <div className=\"px-4 pb-3 text-sm text-gray-400\">{a}</div>}\n </div>\n );\n}\n"],"names":["TOC","id","label","DocsPage","active","setActive","tocOpen","setTocOpen","search","setSearch","observer","IntersectionObserver","entries","forEach","e","isIntersecting","target","rootMargin","t","el","document","getElementById","observe","disconnect","filteredToc","filter","toLowerCase","includes","className","type","value","onChange","placeholder","map","href","onClick","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","d","Section","title","StepList","steps","CodeBlock","lang","Callout","FeatureGrid","features","desc","name","FAQ","q","a","children","copied","setCopied","copy","navigator","clipboard","writeText","setTimeout","step","i","length","f","colors","open","setOpen"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[83694,a=>{"use strict";var b=a.i(87924),c=a.i(72131);a.s(["default",0,function(){let[a,d]=(0,c.useState)("login"),[e,f]=(0,c.useState)(""),[g,h]=(0,c.useState)(""),[i,j]=(0,c.useState)(""),[k,l]=(0,c.useState)(!1),m=async b=>{b.preventDefault(),l(!0),j("");try{let b=await fetch("/api/auth/v3",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,username:e,password:g})}),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}j(c.error||"Login failed")}catch{j("Connection failed")}l(!1)};return(0,b.jsxs)("main",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden",children:[(0,b.jsxs)("div",{className:"absolute inset-0 pointer-events-none",children:[(0,b.jsx)("div",{className:"absolute top-1/4 left-1/2 -translate-x-1/2 w-[600px] h-[600px] rounded-full bg-cyan-500/5 blur-[120px]"}),(0,b.jsx)("div",{className:"absolute bottom-1/4 left-1/3 w-[400px] h-[400px] rounded-full bg-blue-500/5 blur-[100px]"})]}),(0,b.jsxs)("div",{className:"relative w-full max-w-sm mx-4",children:[(0,b.jsxs)("div",{className:"text-center mb-8",children:[(0,b.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-gradient-to-br from-cyan-500/20 to-blue-500/20 border border-cyan-500/20 mb-4",children:(0,b.jsx)("svg",{className:"w-8 h-8 text-cyan-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z"})})}),(0,b.jsx)("h1",{className:"text-2xl font-bold text-white tracking-tight",children:"Agent Network"}),(0,b.jsx)("p",{className:"text-sm text-gray-500 mt-1",children:"Dashboard"})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4",children:["login","register"].map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>{d(c),j("")},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:m,className:"border border-[#2a2a4a] bg-[#111128]/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:e,onChange:a=>f(a.target.value),autoFocus:!0,placeholder:"Enter username",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 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.jsx)("input",{id:"password",type:"password",value:g,onChange:a=>h(a.target.value),placeholder:"Enter password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 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"}),i&&(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:i}),(0,b.jsx)("button",{type:"submit",disabled:k||!g,className:"mt-5 w-full 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:k?"login"===a?"Signing in...":"Registering...":"login"===a?"Sign in":"Create account"})]}),(0,b.jsx)("p",{className:"text-center text-xs text-gray-700 mt-6",children:"Powered by
|
|
1
|
+
module.exports=[83694,a=>{"use strict";var b=a.i(87924),c=a.i(72131);a.s(["default",0,function(){let[a,d]=(0,c.useState)("login"),[e,f]=(0,c.useState)(""),[g,h]=(0,c.useState)(""),[i,j]=(0,c.useState)(""),[k,l]=(0,c.useState)(!1),m=async b=>{b.preventDefault(),l(!0),j("");try{let b=await fetch("/api/auth/v3",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,username:e,password:g})}),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}j(c.error||"Login failed")}catch{j("Connection failed")}l(!1)};return(0,b.jsxs)("main",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden",children:[(0,b.jsxs)("div",{className:"absolute inset-0 pointer-events-none",children:[(0,b.jsx)("div",{className:"absolute top-1/4 left-1/2 -translate-x-1/2 w-[600px] h-[600px] rounded-full bg-cyan-500/5 blur-[120px]"}),(0,b.jsx)("div",{className:"absolute bottom-1/4 left-1/3 w-[400px] h-[400px] rounded-full bg-blue-500/5 blur-[100px]"})]}),(0,b.jsxs)("div",{className:"relative w-full max-w-sm mx-4",children:[(0,b.jsxs)("div",{className:"text-center mb-8",children:[(0,b.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-gradient-to-br from-cyan-500/20 to-blue-500/20 border border-cyan-500/20 mb-4",children:(0,b.jsx)("svg",{className:"w-8 h-8 text-cyan-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:(0,b.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z"})})}),(0,b.jsx)("h1",{className:"text-2xl font-bold text-white tracking-tight",children:"Agent Network"}),(0,b.jsx)("p",{className:"text-sm text-gray-500 mt-1",children:"Dashboard"})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4",children:["login","register"].map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>{d(c),j("")},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:m,className:"border border-[#2a2a4a] bg-[#111128]/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:e,onChange:a=>f(a.target.value),autoFocus:!0,placeholder:"Enter username",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 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.jsx)("input",{id:"password",type:"password",value:g,onChange:a=>h(a.target.value),placeholder:"Enter password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 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"}),i&&(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:i}),(0,b.jsx)("button",{type:"submit",disabled:k||!g,className:"mt-5 w-full 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:k?"login"===a?"Signing in...":"Registering...":"login"===a?"Sign in":"Create account"})]}),(0,b.jsx)("p",{className:"text-center text-xs text-gray-700 mt-6",children:"Powered by Sleep2AGI"})]})]})}])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=app_login_page_tsx_0z71ad3._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../app/login/page.tsx"],"sourcesContent":["'use client';\n\nimport { FormEvent, useState } from 'react';\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 [error, setError] = useState('');\n const [pending, setPending] = useState(false);\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setPending(true);\n setError('');\n\n try {\n const res = await fetch('/api/auth/v3', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: mode, username, password }),\n });\n const data = await res.json();\n\n if (data.ok) {\n // Store V3 auth data for client-side features\n if (data.token) {\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({\n user: data.user,\n token: data.token,\n networks: data.networks || [],\n currentNetwork: data.network_id || data.networks?.[0]?.network_id || '',\n }));\n }\n window.location.assign('/');\n return;\n }\n\n setError(data.error || 'Login failed');\n } catch {\n setError('Connection failed');\n }\n setPending(false);\n };\n\n return (\n <main className=\"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden\">\n <div className=\"absolute inset-0 pointer-events-none\">\n <div className=\"absolute top-1/4 left-1/2 -translate-x-1/2 w-[600px] h-[600px] rounded-full bg-cyan-500/5 blur-[120px]\" />\n <div className=\"absolute bottom-1/4 left-1/3 w-[400px] h-[400px] rounded-full bg-blue-500/5 blur-[100px]\" />\n </div>\n\n <div className=\"relative w-full max-w-sm mx-4\">\n <div className=\"text-center mb-8\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-gradient-to-br from-cyan-500/20 to-blue-500/20 border border-cyan-500/20 mb-4\">\n <svg className=\"w-8 h-8 text-cyan-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z\" />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-white tracking-tight\">Agent Network</h1>\n <p className=\"text-sm text-gray-500 mt-1\">Dashboard</p>\n </div>\n\n {/* Mode toggle */}\n <div className=\"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4\">\n {(['login', 'register'] as const).map(m => (\n <button key={m} type=\"button\" onClick={() => { setMode(m); setError(''); }}\n className={`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${mode === m ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {m === 'login' ? 'Sign in' : 'Register'}\n </button>\n ))}\n </div>\n\n <form onSubmit={submit} className=\"border border-[#2a2a4a] bg-[#111128]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30\">\n <label htmlFor=\"username\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Username\n </label>\n <input id=\"username\" type=\"text\" value={username} onChange={e => setUsername(e.target.value)} autoFocus\n placeholder=\"Enter username\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 text-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 <input id=\"password\" type=\"password\" value={password} onChange={e => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 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\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}\n className=\"mt-5 w-full 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 ? (mode === 'login' ? 'Signing in...' : 'Registering...') : (mode === 'login' ? 'Sign in' : 'Create account')}\n </button>\n </form>\n\n <p className=\"text-center text-xs text-gray-700 mt-6\">Powered by
|
|
1
|
+
{"version":3,"sources":["../../../../app/login/page.tsx"],"sourcesContent":["'use client';\n\nimport { FormEvent, useState } from 'react';\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 [error, setError] = useState('');\n const [pending, setPending] = useState(false);\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setPending(true);\n setError('');\n\n try {\n const res = await fetch('/api/auth/v3', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: mode, username, password }),\n });\n const data = await res.json();\n\n if (data.ok) {\n // Store V3 auth data for client-side features\n if (data.token) {\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({\n user: data.user,\n token: data.token,\n networks: data.networks || [],\n currentNetwork: data.network_id || data.networks?.[0]?.network_id || '',\n }));\n }\n window.location.assign('/');\n return;\n }\n\n setError(data.error || 'Login failed');\n } catch {\n setError('Connection failed');\n }\n setPending(false);\n };\n\n return (\n <main className=\"min-h-screen bg-[#0a0a1a] text-gray-100 font-mono flex items-center justify-center relative overflow-hidden\">\n <div className=\"absolute inset-0 pointer-events-none\">\n <div className=\"absolute top-1/4 left-1/2 -translate-x-1/2 w-[600px] h-[600px] rounded-full bg-cyan-500/5 blur-[120px]\" />\n <div className=\"absolute bottom-1/4 left-1/3 w-[400px] h-[400px] rounded-full bg-blue-500/5 blur-[100px]\" />\n </div>\n\n <div className=\"relative w-full max-w-sm mx-4\">\n <div className=\"text-center mb-8\">\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-gradient-to-br from-cyan-500/20 to-blue-500/20 border border-cyan-500/20 mb-4\">\n <svg className=\"w-8 h-8 text-cyan-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z\" />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-white tracking-tight\">Agent Network</h1>\n <p className=\"text-sm text-gray-500 mt-1\">Dashboard</p>\n </div>\n\n {/* Mode toggle */}\n <div className=\"flex rounded-lg border border-[#2a2a4a] bg-[#111128] p-1 mb-4\">\n {(['login', 'register'] as const).map(m => (\n <button key={m} type=\"button\" onClick={() => { setMode(m); setError(''); }}\n className={`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${mode === m ? 'bg-cyan-500/10 text-cyan-300' : 'text-gray-500 hover:text-gray-200'}`}>\n {m === 'login' ? 'Sign in' : 'Register'}\n </button>\n ))}\n </div>\n\n <form onSubmit={submit} className=\"border border-[#2a2a4a] bg-[#111128]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30\">\n <label htmlFor=\"username\" className=\"block text-xs text-gray-500 mb-2 uppercase tracking-wider\">\n Username\n </label>\n <input id=\"username\" type=\"text\" value={username} onChange={e => setUsername(e.target.value)} autoFocus\n placeholder=\"Enter username\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 text-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 <input id=\"password\" type=\"password\" value={password} onChange={e => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-4 py-3 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\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}\n className=\"mt-5 w-full 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 ? (mode === 'login' ? 'Signing in...' : 'Registering...') : (mode === 'login' ? 'Sign in' : 'Create account')}\n </button>\n </form>\n\n <p className=\"text-center text-xs text-gray-700 mt-6\">Powered by Sleep2AGI</p>\n </div>\n </main>\n );\n}\n"],"names":["LoginPage","mode","setMode","username","setUsername","password","setPassword","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","fill","viewBox","stroke","strokeWidth","strokeLinecap","strokeLinejoin","d","map","m","type","onClick","onSubmit","htmlFor","id","value","onChange","e","target","autoFocus","placeholder","disabled"],"mappings":"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"}
|
|
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
|
|
|
7
7
|
"static/chunks/03~yq9q893hmn.js"
|
|
8
8
|
],
|
|
9
9
|
"lowPriorityFiles": [
|
|
10
|
-
"static
|
|
11
|
-
"static
|
|
12
|
-
"static
|
|
10
|
+
"static/dR3GSMnwa4k46SIbP3PaK/_buildManifest.js",
|
|
11
|
+
"static/dR3GSMnwa4k46SIbP3PaK/_ssgManifest.js",
|
|
12
|
+
"static/dR3GSMnwa4k46SIbP3PaK/_clientMiddlewareManifest.js"
|
|
13
13
|
],
|
|
14
14
|
"rootMainFiles": [
|
|
15
15
|
"static/chunks/0xrnwfefpke-g.js",
|