@sleep2agi/agent-network-dashboard 0.3.4-preview.0 → 0.4.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/diagnostics/route-bundle-stats.json +2 -2
  5. package/.next/fallback-build-manifest.json +3 -3
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/admin.html +1 -1
  22. package/.next/server/app/admin.rsc +1 -1
  23. package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
  27. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  29. package/.next/server/app/api/hub/auth/route.js +2 -1
  30. package/.next/server/app/api/hub/auth/route.js.nft.json +1 -1
  31. package/.next/server/app/index.html +1 -1
  32. package/.next/server/app/index.rsc +1 -1
  33. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  34. package/.next/server/app/index.segments/_full.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  36. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  37. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  38. package/.next/server/app/login.html +1 -1
  39. package/.next/server/app/login.rsc +1 -1
  40. package/.next/server/app/login.segments/_full.segment.rsc +1 -1
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +1 -1
  43. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs.html +1 -1
  47. package/.next/server/app/logs.rsc +1 -1
  48. package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
  49. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  50. package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
  52. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  53. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  54. package/.next/server/app/messages.html +1 -1
  55. package/.next/server/app/messages.rsc +1 -1
  56. package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
  57. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  58. package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
  59. package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  61. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  62. package/.next/server/app/node.html +1 -1
  63. package/.next/server/app/node.rsc +1 -1
  64. package/.next/server/app/node.segments/_full.segment.rsc +1 -1
  65. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  66. package/.next/server/app/node.segments/_index.segment.rsc +1 -1
  67. package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
  68. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  70. package/.next/server/app/nodes.html +1 -1
  71. package/.next/server/app/nodes.rsc +1 -1
  72. package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
  73. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  74. package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
  75. package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
  76. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  77. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  78. package/.next/server/app/server-logs.html +1 -1
  79. package/.next/server/app/server-logs.rsc +1 -1
  80. package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
  81. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  82. package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
  83. package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
  84. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  85. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  86. package/.next/server/app/settings/networks.html +1 -1
  87. package/.next/server/app/settings/networks.rsc +1 -1
  88. package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
  89. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  90. package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
  91. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  93. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  94. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  95. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/.next/server/app/settings/tokens.html +1 -1
  97. package/.next/server/app/settings/tokens.rsc +1 -1
  98. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
  99. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  100. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
  101. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
  102. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  103. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  104. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  105. package/.next/server/app/settings.html +2 -2
  106. package/.next/server/app/settings.rsc +2 -2
  107. package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
  108. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  109. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  110. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  111. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  112. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/tasks.html +1 -1
  114. package/.next/server/app/tasks.rsc +1 -1
  115. package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
  116. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
  118. package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
  119. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  120. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  121. package/.next/server/chunks/[root-of-the-server]__0-mykaf._.js.map +1 -1
  122. package/.next/server/chunks/[root-of-the-server]__0.d_kqy._.js +1 -1
  123. package/.next/server/chunks/[root-of-the-server]__0.d_kqy._.js.map +1 -1
  124. package/.next/server/chunks/[root-of-the-server]__02pocyg._.js.map +1 -1
  125. package/.next/server/chunks/[root-of-the-server]__03ueci3._.js.map +1 -1
  126. package/.next/server/chunks/[root-of-the-server]__04aud7x._.js +1 -1
  127. package/.next/server/chunks/[root-of-the-server]__04aud7x._.js.map +1 -1
  128. package/.next/server/chunks/[root-of-the-server]__05fnt3n._.js.map +1 -1
  129. package/.next/server/chunks/[root-of-the-server]__0adhu1m._.js.map +1 -1
  130. package/.next/server/chunks/[root-of-the-server]__0aqv02v._.js +1 -1
  131. package/.next/server/chunks/[root-of-the-server]__0aqv02v._.js.map +1 -1
  132. package/.next/server/chunks/[root-of-the-server]__0cawhfq._.js.map +1 -1
  133. package/.next/server/chunks/[root-of-the-server]__0d_-_k.._.js.map +1 -1
  134. package/.next/server/chunks/[root-of-the-server]__0f6bxfl._.js.map +1 -1
  135. package/.next/server/chunks/[root-of-the-server]__0h15edq._.js.map +1 -1
  136. package/.next/server/chunks/[root-of-the-server]__0kltbce._.js.map +1 -1
  137. package/.next/server/chunks/[root-of-the-server]__0mn04fw._.js.map +1 -1
  138. package/.next/server/chunks/[root-of-the-server]__0o29v8c._.js.map +1 -1
  139. package/.next/server/chunks/[root-of-the-server]__0o4qfn9._.js.map +1 -1
  140. package/.next/server/chunks/[root-of-the-server]__0o7ya7r._.js.map +1 -1
  141. package/.next/server/chunks/[root-of-the-server]__0p6tutt._.js +1 -1
  142. package/.next/server/chunks/[root-of-the-server]__0p6tutt._.js.map +1 -1
  143. package/.next/server/chunks/[root-of-the-server]__0pn3wsx._.js +1 -1
  144. package/.next/server/chunks/[root-of-the-server]__0pn3wsx._.js.map +1 -1
  145. package/.next/server/chunks/[root-of-the-server]__0x.a_yh._.js.map +1 -1
  146. package/.next/server/chunks/[root-of-the-server]__139~d6a._.js +1 -1
  147. package/.next/server/chunks/[root-of-the-server]__139~d6a._.js.map +1 -1
  148. package/.next/server/chunks/ssr/app_0dk5wao._.js +1 -1
  149. package/.next/server/chunks/ssr/app_0dk5wao._.js.map +1 -1
  150. package/.next/server/middleware-build-manifest.js +3 -3
  151. package/.next/server/pages/404.html +1 -1
  152. package/.next/server/pages/500.html +1 -1
  153. package/.next/static/chunks/{0vlojka~d~9h4.js → 0y_po~f~fk~ap.js} +1 -1
  154. package/.next/trace +2 -2
  155. package/.next/trace-build +1 -1
  156. package/app/api/hub/events/route.ts +2 -5
  157. package/app/api/hub/nodes/route.ts +1 -3
  158. package/app/api/hub/send/route.ts +1 -6
  159. package/app/api/hub/server-logs/route.ts +1 -3
  160. package/app/api/hub/tasks/route.ts +1 -3
  161. package/app/lib/hub.ts +1 -8
  162. package/package.json +1 -1
  163. /package/.next/static/{cDL0lLOkoUg3hMg9wv7XO → TiDWPnTdwl4UAFFsW9Wa9}/_buildManifest.js +0 -0
  164. /package/.next/static/{cDL0lLOkoUg3hMg9wv7XO → TiDWPnTdwl4UAFFsW9Wa9}/_clientMiddlewareManifest.js +0 -0
  165. /package/.next/static/{cDL0lLOkoUg3hMg9wv7XO → TiDWPnTdwl4UAFFsW9Wa9}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},70406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},80453,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),d=e.i(87718),u=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),m=e.i(74838),x=e.i(10372),R=e.i(93695);e.i(20232);var g=e.i(220),v=e.i(282);let f=process.env.COMMHUB_URL||"http://127.0.0.1:9200",w=process.env.COMMHUB_AUTH_TOKEN||"";async function _(){let e=await (0,v.getV3UserToken)()||w,t={};return e&&(t.Authorization=`Bearer ${e}`),t}async function E(e){let t=await (0,v.requireDashboardAuth)();if(t)return t;let{searchParams:r}=new URL(e.url),a=parseInt(r.get("limit")||"100",10),n=r.get("network_id")||"",s=r.get("status")||"",i=r.get("from_name")||"",o=r.get("to_name")||"",l=r.get("task_id")||"";try{let e=new URLSearchParams;n&&e.set("network_id",n),s&&e.set("status",s),i&&e.set("from_name",i),o&&e.set("to_name",o),l&&e.set("task_id",l),e.set("limit",String(a));let t=await fetch(`${f}/api/tasks?${e.toString()}`,{headers:await _(),next:{revalidate:0}}),r=t.headers.get("content-type")||"";if(t.ok&&r.includes("application/json")){let e=await t.json();if(e.ok&&e.tasks&&e.tasks.length>0)return Response.json(e);if(n&&e.tasks?.length===0){let t=new URLSearchParams;s&&t.set("status",s),i&&t.set("from_name",i),o&&t.set("to_name",o),t.set("limit",String(a));let r=await fetch(`${f}/api/tasks?${t.toString()}`,{headers:await _(),next:{revalidate:0}});if(r.ok){let e=await r.json();if(e.ok&&e.tasks?.length>0)return Response.json({...e,source:"global"})}return Response.json(e)}}let d=await fetch(`${f}/api/completions?limit=${a}`,{headers:await _(),next:{revalidate:0}}),u=((await d.json()).completions||[]).map(e=>({task_id:e.id,from_name:"",to_name:e.session_name,status:"replied",priority:"normal",content:e.task||"",result:e.result||"",created_at:e.completed_at,updated_at:e.completed_at,delivered_at:"",started_at:"",completed_at:e.completed_at,expires_at:""}));return s&&"replied"!==s&&(u=[]),i&&(u=u.filter(e=>e.from_name.includes(i))),o&&(u=u.filter(e=>e.to_name.includes(o))),Response.json({ok:!0,tasks:u,count:u.length,source:"completions"})}catch(e){return Response.json({error:"CommHub unreachable",detail:e instanceof Error?e.message:String(e)},{status:502})}}e.s(["GET",0,E],67716);var k=e.i(67716);let y=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/hub/tasks/route",pathname:"/api/hub/tasks",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/hub/tasks/route.ts",nextConfigOutput:"",userland:k,...{}}),{workAsyncStorage:C,workUnitAsyncStorage:b,serverHooks:A}=y;async function S(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),y.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/hub/tasks/route";v=v.replace(/\/index$/,"")||"/";let f=await y.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!f)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:w,params:_,nextConfig:E,parsedUrl:k,isDraftMode:C,prerenderManifest:b,routerServerContext:A,isOnDemandRevalidate:S,revalidateOnlyGenerated:T,resolvedPathname:j,clientReferenceManifest:q,serverActionsManifest:N}=f,P=(0,o.normalizeAppPath)(v),O=!!(b.dynamicRoutes[P]||b.routes[j]),U=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,k,!1):t.end("This page could not be found"),null);if(O&&!C){let e=!!b.routes[j],t=b.dynamicRoutes[P];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await U();throw new R.NoFallbackError}}let H=null;!O||y.isDev||C||(H="/index"===(H=j)?"/":H);let M=!0===y.isDev||!O,I=O&&!M;N&&q&&(0,i.setManifestsSingleton)({page:v,clientReferenceManifest:q,serverActionsManifest:N});let $=e.method||"GET",D=(0,s.getTracer)(),B=D.getActiveScopeSpan(),K=!!(null==A?void 0:A.isWrappedByNextServer),L=!!(0,n.getRequestMeta)(e,"minimalMode"),F=(0,n.getRequestMeta)(e,"incrementalCache")||await y.getIncrementalCache(e,E,b,L);null==F||F.resetRequestCache(),globalThis.__incrementalCache=F;let G={params:_,previewProps:b.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:M,incrementalCache:F,cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>y.onRequestError(e,t,a,n,A)},sharedContext:{buildId:w}},V=new l.NodeNextRequest(e),W=new l.NodeNextResponse(t),X=d.NextRequestAdapter.fromNodeNextRequest(V,(0,d.signalFromNodeResponse)(t));try{let n,i=async e=>y.handle(X,G).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=D.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==u.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route");if(a){let t=`${$} ${a}`;e.setAttributes({"next.route":a,"http.route":a,"next.span_name":t}),e.updateName(t),n&&n!==e&&(n.setAttribute("http.route",a),n.updateName(t))}else e.updateName(`${$} ${v}`)}),o=async n=>{var s,o;let l=async({previousCacheEntry:r})=>{try{if(!L&&S&&T&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await i(n);e.fetchMetrics=G.renderOpts.fetchMetrics;let o=G.renderOpts.pendingWaitUntil;o&&a.waitUntil&&(a.waitUntil(o),o=void 0);let l=G.renderOpts.collectedTags;if(!O)return await (0,c.sendResponse)(V,W,s,G.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[x.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=x.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,a=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=x.INFINITE_CACHE?void 0:G.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await y.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:I,isOnDemandRevalidate:S})},!1,A),t}},d=await y.handleResponse({req:e,nextConfig:E,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:b,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:T,responseGenerator:l,waitUntil:a.waitUntil,isMinimalMode:L});if(!O)return null;if((null==d||null==(s=d.value)?void 0:s.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==d||null==(o=d.value)?void 0:o.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});L||t.setHeader("x-nextjs-cache",S?"REVALIDATED":d.isMiss?"MISS":d.isStale?"STALE":"HIT"),C&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let u=(0,h.fromNodeOutgoingHttpHeaders)(d.value.headers);return L&&O||u.delete(x.NEXT_CACHE_TAGS_HEADER),!d.cacheControl||t.getHeader("Cache-Control")||u.get("Cache-Control")||u.set("Cache-Control",(0,m.getCacheControlHeader)(d.cacheControl)),await (0,c.sendResponse)(V,W,new Response(d.value.body,{headers:u,status:d.value.status||200})),null};K&&B?await o(B):(n=D.getActiveScopeSpan(),await D.withPropagatedContext(e.headers,()=>D.trace(u.BaseServerSpan.handleRequest,{spanName:`${$} ${v}`,kind:s.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},o),void 0,!K))}catch(t){if(t instanceof R.NoFallbackError||await y.onRequestError(e,t,{routerKind:"App Router",routePath:P,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:I,isOnDemandRevalidate:S})},!1,A),O)throw t;return await (0,c.sendResponse)(V,W,new Response(null,{status:500})),null}}e.s(["handler",0,S,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:C,workUnitAsyncStorage:b})},"routeModule",0,y,"serverHooks",0,A,"workAsyncStorage",0,C,"workUnitAsyncStorage",0,b],80453)}];
1
+ module.exports=[50227,(e,t,a)=>{t.exports=e.x("node:path",()=>require("node:path"))},18622,(e,t,a)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,a)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,a)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,a)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},70406,(e,t,a)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},93695,(e,t,a)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},80453,e=>{"use strict";var t=e.i(47909),a=e.i(74017),r=e.i(96250),n=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),d=e.i(87718),u=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),m=e.i(74838),x=e.i(10372),R=e.i(93695);e.i(20232);var g=e.i(220),v=e.i(282);let f=process.env.COMMHUB_URL||"http://127.0.0.1:9200";async function w(){let e=await (0,v.getV3UserToken)(),t={};return e&&(t.Authorization=`Bearer ${e}`),t}async function _(e){let t=await (0,v.requireDashboardAuth)();if(t)return t;let{searchParams:a}=new URL(e.url),r=parseInt(a.get("limit")||"100",10),n=a.get("network_id")||"",s=a.get("status")||"",i=a.get("from_name")||"",o=a.get("to_name")||"",l=a.get("task_id")||"";try{let e=new URLSearchParams;n&&e.set("network_id",n),s&&e.set("status",s),i&&e.set("from_name",i),o&&e.set("to_name",o),l&&e.set("task_id",l),e.set("limit",String(r));let t=await fetch(`${f}/api/tasks?${e.toString()}`,{headers:await w(),next:{revalidate:0}}),a=t.headers.get("content-type")||"";if(t.ok&&a.includes("application/json")){let e=await t.json();if(e.ok&&e.tasks&&e.tasks.length>0)return Response.json(e);if(n&&e.tasks?.length===0){let t=new URLSearchParams;s&&t.set("status",s),i&&t.set("from_name",i),o&&t.set("to_name",o),t.set("limit",String(r));let a=await fetch(`${f}/api/tasks?${t.toString()}`,{headers:await w(),next:{revalidate:0}});if(a.ok){let e=await a.json();if(e.ok&&e.tasks?.length>0)return Response.json({...e,source:"global"})}return Response.json(e)}}let d=await fetch(`${f}/api/completions?limit=${r}`,{headers:await w(),next:{revalidate:0}}),u=((await d.json()).completions||[]).map(e=>({task_id:e.id,from_name:"",to_name:e.session_name,status:"replied",priority:"normal",content:e.task||"",result:e.result||"",created_at:e.completed_at,updated_at:e.completed_at,delivered_at:"",started_at:"",completed_at:e.completed_at,expires_at:""}));return s&&"replied"!==s&&(u=[]),i&&(u=u.filter(e=>e.from_name.includes(i))),o&&(u=u.filter(e=>e.to_name.includes(o))),Response.json({ok:!0,tasks:u,count:u.length,source:"completions"})}catch(e){return Response.json({error:"CommHub unreachable",detail:e instanceof Error?e.message:String(e)},{status:502})}}e.s(["GET",0,_],67716);var k=e.i(67716);let E=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/hub/tasks/route",pathname:"/api/hub/tasks",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/app/api/hub/tasks/route.ts",nextConfigOutput:"",userland:k,...{}}),{workAsyncStorage:y,workUnitAsyncStorage:C,serverHooks:b}=E;async function A(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),E.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/hub/tasks/route";v=v.replace(/\/index$/,"")||"/";let f=await E.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!f)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:w,params:_,nextConfig:k,parsedUrl:y,isDraftMode:C,prerenderManifest:b,routerServerContext:A,isOnDemandRevalidate:S,revalidateOnlyGenerated:T,resolvedPathname:j,clientReferenceManifest:q,serverActionsManifest:P}=f,N=(0,o.normalizeAppPath)(v),O=!!(b.dynamicRoutes[N]||b.routes[j]),U=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,y,!1):t.end("This page could not be found"),null);if(O&&!C){let e=!!b.routes[j],t=b.dynamicRoutes[N];if(t&&!1===t.fallback&&!e){if(k.adapterPath)return await U();throw new R.NoFallbackError}}let H=null;!O||E.isDev||C||(H="/index"===(H=j)?"/":H);let I=!0===E.isDev||!O,M=O&&!I;P&&q&&(0,i.setManifestsSingleton)({page:v,clientReferenceManifest:q,serverActionsManifest:P});let $=e.method||"GET",D=(0,s.getTracer)(),L=D.getActiveScopeSpan(),B=!!(null==A?void 0:A.isWrappedByNextServer),F=!!(0,n.getRequestMeta)(e,"minimalMode"),K=(0,n.getRequestMeta)(e,"incrementalCache")||await E.getIncrementalCache(e,k,b,F);null==K||K.resetRequestCache(),globalThis.__incrementalCache=K;let G={params:_,previewProps:b.preview,renderOpts:{experimental:{authInterrupts:!!k.experimental.authInterrupts},cacheComponents:!!k.cacheComponents,supportsDynamicResponse:I,incrementalCache:K,cacheLifeProfiles:k.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>E.onRequestError(e,t,r,n,A)},sharedContext:{buildId:w}},V=new l.NodeNextRequest(e),W=new l.NodeNextResponse(t),X=d.NextRequestAdapter.fromNodeNextRequest(V,(0,d.signalFromNodeResponse)(t));try{let n,i=async e=>E.handle(X,G).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let a=D.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==u.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route");if(r){let t=`${$} ${r}`;e.setAttributes({"next.route":r,"http.route":r,"next.span_name":t}),e.updateName(t),n&&n!==e&&(n.setAttribute("http.route",r),n.updateName(t))}else e.updateName(`${$} ${v}`)}),o=async n=>{var s,o;let l=async({previousCacheEntry:a})=>{try{if(!F&&S&&T&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await i(n);e.fetchMetrics=G.renderOpts.fetchMetrics;let o=G.renderOpts.pendingWaitUntil;o&&r.waitUntil&&(r.waitUntil(o),o=void 0);let l=G.renderOpts.collectedTags;if(!O)return await (0,c.sendResponse)(V,W,s,G.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[x.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=x.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,r=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=x.INFINITE_CACHE?void 0:G.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await E.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:M,isOnDemandRevalidate:S})},!1,A),t}},d=await E.handleResponse({req:e,nextConfig:k,cacheKey:H,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:b,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:T,responseGenerator:l,waitUntil:r.waitUntil,isMinimalMode:F});if(!O)return null;if((null==d||null==(s=d.value)?void 0:s.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==d||null==(o=d.value)?void 0:o.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});F||t.setHeader("x-nextjs-cache",S?"REVALIDATED":d.isMiss?"MISS":d.isStale?"STALE":"HIT"),C&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let u=(0,h.fromNodeOutgoingHttpHeaders)(d.value.headers);return F&&O||u.delete(x.NEXT_CACHE_TAGS_HEADER),!d.cacheControl||t.getHeader("Cache-Control")||u.get("Cache-Control")||u.set("Cache-Control",(0,m.getCacheControlHeader)(d.cacheControl)),await (0,c.sendResponse)(V,W,new Response(d.value.body,{headers:u,status:d.value.status||200})),null};B&&L?await o(L):(n=D.getActiveScopeSpan(),await D.withPropagatedContext(e.headers,()=>D.trace(u.BaseServerSpan.handleRequest,{spanName:`${$} ${v}`,kind:s.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},o),void 0,!B))}catch(t){if(t instanceof R.NoFallbackError||await E.onRequestError(e,t,{routerKind:"App Router",routePath:N,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:M,isOnDemandRevalidate:S})},!1,A),O)throw t;return await (0,c.sendResponse)(V,W,new Response(null,{status:500})),null}}e.s(["handler",0,A,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:y,workUnitAsyncStorage:C})},"routeModule",0,E,"serverHooks",0,b,"workAsyncStorage",0,y,"workUnitAsyncStorage",0,C],80453)}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__139~d6a._.js.map
@@ -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://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":"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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';\n\nasync function hubHeaders(): Promise<Record<string, string>> {\n const userToken = await getV3UserToken();\n const h: Record<string, string> = {};\n if (userToken) h['Authorization'] = `Bearer ${userToken}`;\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","hubHeaders","userToken","h","GET","req","authFailure","contentType","searchParams","URL","url","limit","parseInt","get","networkId","filterStatus","filterFrom","filterTo","filterTaskId","params","URLSearchParams","set","fbRes","String","tasksRes","fetch","toString","headers","next","revalidate","ok","includes","data","json","tasks","length","Response","completions","fallbackParams","content","updated_at","fbData","source","compRes","filter","compData","map","c","task_id","id","from_name","to_name","session_name","status","priority","task","result","created_at","completed_at","delivered_at","started_at","expires_at","t","count","e","error","detail","Error","message"],"mappings":"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","ignoreList":[0]}
@@ -1,3 +1,3 @@
1
- module.exports=[44332,a=>{"use strict";var b=a.i(72596),c=a.i(22397);let d=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()},e={refreshInterval:5e3,dedupingInterval:3e3};function f(a,b){if(!b)return a;let c=a.includes("?")?"&":"?";return`${a}${c}network_id=${encodeURIComponent(b)}`}a.s(["useAnetConfig",0,function(){let{data:a}=(0,b.default)("/api/anet/config",d,{refreshInterval:3e4});return{config:a||null}},"useHealth",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/health",d,e);return{health:a||null,error:c}},"useLicense",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/license",d,{refreshInterval:6e4});return{license:a?.ok?a:null,error:c}},"useMessages",0,function(a=100){let{networkId:g}=(0,c.useNetworkId)(),{data:h,error:i,isLoading:j}=(0,b.default)(f(`/api/hub/messages?limit=${a}`,g),d,e);return{messages:h?.messages||[],error:i,isLoading:j}},"useSessions",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h,isLoading:i}=(0,b.default)(f("/api/hub/status",a),d,e);return{sessions:g?.sessions||[],hint:g?._hint,error:h,isLoading:i}},"useStats",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h}=(0,b.default)(f("/api/hub/stats",a),d,e);return{stats:g?.ok?g:null,error:h}},"useTasks",0,function(a){let{networkId:g}=(0,c.useNetworkId)(),h=new URLSearchParams({limit:"100",...a}).toString(),{data:i,error:j,isLoading:k}=(0,b.default)(f(`/api/hub/tasks?${h}`,g),d,e);return{tasks:i?.tasks||[],count:i?.count??0,source:i?.source,error:j,isLoading:k}}])},45343,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(44332);a.s(["default",0,function(){let{config:a}=(0,e.useAnetConfig)(),{health:f}=(0,e.useHealth)(),{license:g}=(0,e.useLicense)(),[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",s="break-all sm:max-w-[320px] sm:text-right";return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10",children:"Settings"}),(0,b.jsxs)("div",{className:"max-w-2xl space-y-6",children:[(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"CommHub Connection"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,b.jsx)("span",{className:`text-cyan-300 ${s}`,children:a?.hub||"not configured"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:a?.source==="file"?"Local file (~/.anet/config.json)":a?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Auth Token"}),(0,b.jsx)("span",{className:`${a?.tokenConfigured?"text-green-400":"text-red-400"} ${s}`,children:a?.tokenConfigured?`Configured (${a.tokenPreview})`:"Not configured"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Server Auth"}),(0,b.jsx)("span",{className:`${f?.auth==="enabled"?"text-green-400":"text-yellow-400"} sm:text-right`,children:f?.auth||"--"})]}),a?.error&&(0,b.jsx)("div",{className:"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600",children:a.error})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Info"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.version||"--"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.sessions??"--"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"SSE Connections"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.sse_connections??"--"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.uptime?`${Math.floor(f.uptime/3600)}h ${Math.floor(f.uptime%3600/60)}m`:"--"})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Dashboard"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:"V2.1"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:"Overview, Tasks, Nodes, Messages, Settings"})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"License"}),g?.license?(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Type"}),(0,b.jsx)("span",{className:`font-medium ${"pro"===g.license.type?"text-green-400":"text-yellow-400"}`,children:g.license.type})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Days Left"}),(0,b.jsxs)("span",{className:`${g.license.days_left<=7?"text-red-400":"text-gray-300"}`,children:[g.license.days_left," days",g.license.days_left<=7&&" — expiring soon!"]})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Expires"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.license.expires_at})]}),g.limits&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Max Agents"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.limits.max_agents})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Max Networks"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.limits.max_networks})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Tasks/Day"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.limits.max_tasks_day})]})]}),(0,b.jsxs)("div",{className:"pt-3 border-t border-[#2a2a4a]",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("input",{type:"text",value:h,onChange:a=>i(a.target.value),placeholder:"anet-XXXX-XXXX-XXXX-XXXX",className:"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none"}),(0,b.jsx)("button",{onClick:async()=>{if(!h.trim())return;let a=await fetch("/api/hub/license",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:h})}),b=await a.json();k(b.ok?`Activated: ${b.type}`:`Failed: ${b.error}`),b.ok&&i(""),setTimeout(()=>k(""),5e3)},className:"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors",children:"Activate"})]}),j&&(0,b.jsx)("div",{className:`mt-2 text-xs ${j.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:j})]})]}):(0,b.jsx)("div",{className:"text-xs text-gray-600",children:"License info not available"})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Change Password"}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("input",{type:"password",value:l,onChange:a=>m(a.target.value),placeholder:"Current password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("input",{type:"password",value:n,onChange:a=>o(a.target.value),placeholder:"New password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("button",{onClick:async()=>{if(!l||!n)return;let a=sessionStorage.getItem("anet_v3_auth");if(!a)return void q("Not logged in with V3 auth");let{token:b}=JSON.parse(a),c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",token:b,current_password:l,new_password:n})}),d=await c.json();q(d.ok?"Password changed":`Failed: ${d.error}`),d.ok&&(m(""),o("")),setTimeout(()=>q(""),5e3)},disabled:!l||!n,className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Change Password"})]}),p&&(0,b.jsx)("div",{className:`mt-2 text-xs ${p.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:p})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,b.jsxs)(d.default,{href:"/settings/tokens",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"API Tokens"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create and manage tokens for CLI access."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/settings/networks",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Networks"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create, manage, and delete agent networks."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-red-900/30 rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-red-400 mb-4",children:"Session"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Sign out will clear your dashboard session cookie."}),(0,b.jsx)("button",{onClick:async()=>{await fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),window.location.assign("/login")},className:"px-4 py-2 bg-red-600/20 hover:bg-red-600/30 text-red-300 text-sm rounded-lg border border-red-800/30 transition-colors",children:"Sign out"})]})]})]})}])}];
1
+ module.exports=[44332,a=>{"use strict";var b=a.i(72596),c=a.i(22397);let d=async a=>{let b=await fetch(a);if(401===b.status)throw window.location.assign("/login"),Error("unauthorized");return b.json()},e={refreshInterval:5e3,dedupingInterval:3e3};function f(a,b){if(!b)return a;let c=a.includes("?")?"&":"?";return`${a}${c}network_id=${encodeURIComponent(b)}`}a.s(["useAnetConfig",0,function(){let{data:a}=(0,b.default)("/api/anet/config",d,{refreshInterval:3e4});return{config:a||null}},"useHealth",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/health",d,e);return{health:a||null,error:c}},"useLicense",0,function(){let{data:a,error:c}=(0,b.default)("/api/hub/license",d,{refreshInterval:6e4});return{license:a?.ok?a:null,error:c}},"useMessages",0,function(a=100){let{networkId:g}=(0,c.useNetworkId)(),{data:h,error:i,isLoading:j}=(0,b.default)(f(`/api/hub/messages?limit=${a}`,g),d,e);return{messages:h?.messages||[],error:i,isLoading:j}},"useSessions",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h,isLoading:i}=(0,b.default)(f("/api/hub/status",a),d,e);return{sessions:g?.sessions||[],hint:g?._hint,error:h,isLoading:i}},"useStats",0,function(){let{networkId:a}=(0,c.useNetworkId)(),{data:g,error:h}=(0,b.default)(f("/api/hub/stats",a),d,e);return{stats:g?.ok?g:null,error:h}},"useTasks",0,function(a){let{networkId:g}=(0,c.useNetworkId)(),h=new URLSearchParams({limit:"100",...a}).toString(),{data:i,error:j,isLoading:k}=(0,b.default)(f(`/api/hub/tasks?${h}`,g),d,e);return{tasks:i?.tasks||[],count:i?.count??0,source:i?.source,error:j,isLoading:k}}])},45343,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(44332);a.s(["default",0,function(){let{config:a}=(0,e.useAnetConfig)(),{health:f}=(0,e.useHealth)(),{license:g}=(0,e.useLicense)(),[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(""),r="flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",s="break-all sm:max-w-[320px] sm:text-right";return(0,b.jsxs)("div",{className:"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono",children:[(0,b.jsx)("h1",{className:"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10",children:"Settings"}),(0,b.jsxs)("div",{className:"max-w-2xl space-y-6",children:[(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"CommHub Connection"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500 shrink-0",children:"Hub URL"}),(0,b.jsx)("span",{className:`text-cyan-300 ${s}`,children:a?.hub||"not configured"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Config Source"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:a?.source==="file"?"Local file (~/.anet/config.json)":a?.source==="runtime-env"?"Vercel env vars":"Missing"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Auth Token"}),(0,b.jsx)("span",{className:`${a?.tokenConfigured?"text-green-400":"text-red-400"} ${s}`,children:a?.tokenConfigured?`Configured (${a.tokenPreview})`:"Not configured"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Server Auth"}),(0,b.jsx)("span",{className:`${f?.auth==="enabled"?"text-green-400":"text-yellow-400"} sm:text-right`,children:f?.auth||"--"})]}),a?.error&&(0,b.jsx)("div",{className:"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600",children:a.error})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Server Info"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.version||"--"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Sessions"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.sessions??"--"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"SSE Connections"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.sse_connections??"--"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Uptime"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:f?.uptime?`${Math.floor(f.uptime/3600)}h ${Math.floor(f.uptime%3600/60)}m`:"--"})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Dashboard"}),(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Version"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:"V2.1"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Data Layer"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:"SWR (5s refresh, 3s dedup)"})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Pages"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:"Overview, Tasks, Nodes, Messages, Settings"})]})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"License"}),g?.license?(0,b.jsxs)("div",{className:"space-y-3 text-sm",children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Type"}),(0,b.jsx)("span",{className:`font-medium ${"pro"===g.license.type?"text-green-400":"text-yellow-400"}`,children:g.license.type})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Days Left"}),(0,b.jsxs)("span",{className:`${g.license.days_left<=7?"text-red-400":"text-gray-300"}`,children:[g.license.days_left," days",g.license.days_left<=7&&" — expiring soon!"]})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Expires"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.license.expires_at})]}),g.limits&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Max Agents"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.limits.max_agents})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Max Networks"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.limits.max_networks})]}),(0,b.jsxs)("div",{className:r,children:[(0,b.jsx)("span",{className:"text-gray-500",children:"Tasks/Day"}),(0,b.jsx)("span",{className:`text-gray-300 ${s}`,children:g.limits.max_tasks_day})]})]}),(0,b.jsxs)("div",{className:"pt-3 border-t border-[#2a2a4a]",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("input",{type:"text",value:h,onChange:a=>i(a.target.value),placeholder:"anet-XXXX-XXXX-XXXX-XXXX",className:"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none"}),(0,b.jsx)("button",{onClick:async()=>{if(!h.trim())return;let a=await fetch("/api/hub/license",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:h})}),b=await a.json();k(b.ok?`Activated: ${b.type}`:`Failed: ${b.error}`),b.ok&&i(""),setTimeout(()=>k(""),5e3)},className:"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors",children:"Activate"})]}),j&&(0,b.jsx)("div",{className:`mt-2 text-xs ${j.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:j})]})]}):(0,b.jsx)("div",{className:"text-xs text-gray-600",children:"License info not available"})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300 mb-4",children:"Change Password"}),(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)("input",{type:"password",value:l,onChange:a=>m(a.target.value),placeholder:"Current password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("input",{type:"password",value:n,onChange:a=>o(a.target.value),placeholder:"New password",className:"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none"}),(0,b.jsx)("button",{onClick:async()=>{if(!l||!n)return;let a=sessionStorage.getItem("anet_v3_auth");if(!a)return void q("Not logged in with V3 auth");let{token:b}=JSON.parse(a),c=await fetch("/api/hub/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"change_password",token:b,current_password:l,new_password:n})}),d=await c.json();if(q(d.ok?"Password changed":`Failed: ${d.error}`),d.ok){if(d.token){let b=JSON.parse(a);sessionStorage.setItem("anet_v3_auth",JSON.stringify({...b,token:d.token}))}m(""),o("")}setTimeout(()=>q(""),5e3)},disabled:!l||!n,className:"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors",children:"Change Password"})]}),p&&(0,b.jsx)("div",{className:`mt-2 text-xs ${p.startsWith("Failed")?"text-red-400":"text-green-400"}`,children:p})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-4",children:[(0,b.jsxs)(d.default,{href:"/settings/tokens",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"API Tokens"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create and manage tokens for CLI access."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]}),(0,b.jsxs)(d.default,{href:"/settings/networks",className:"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:"Networks"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mt-2",children:"Create, manage, and delete agent networks."}),(0,b.jsx)("span",{className:"text-xs text-cyan-400 mt-3 inline-block",children:"Manage →"})]})]}),(0,b.jsxs)("section",{className:"bg-[#111128] border border-red-900/30 rounded-xl p-5",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold text-red-400 mb-4",children:"Session"}),(0,b.jsx)("p",{className:"text-xs text-gray-500 mb-3",children:"Sign out will clear your dashboard session cookie."}),(0,b.jsx)("button",{onClick:async()=>{await fetch("/api/auth/logout",{method:"POST"}).catch(()=>{}),window.location.assign("/login")},className:"px-4 py-2 bg-red-600/20 hover:bg-red-600/30 text-red-300 text-sm rounded-lg border border-red-800/30 transition-colors",children:"Sign out"})]})]})]})}])}];
2
2
 
3
3
  //# sourceMappingURL=app_0dk5wao._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../app/lib/hooks.ts","../../../../app/settings/page.tsx"],"sourcesContent":["import useSWR from 'swr';\nimport { Session, Health, AnetConfig } from '../components/types';\nimport { useNetworkId } from './network-context';\n\nconst fetcher = async (url: string) => {\n const res = await fetch(url);\n if (res.status === 401) {\n window.location.assign('/login');\n throw new Error('unauthorized');\n }\n return res.json();\n};\n\nconst SWR_OPTIONS = { refreshInterval: 5000, dedupingInterval: 3000 };\n\n/** Append network_id to URL if set */\nfunction withNetwork(url: string, networkId: string): string {\n if (!networkId) return url;\n const sep = url.includes('?') ? '&' : '?';\n return `${url}${sep}network_id=${encodeURIComponent(networkId)}`;\n}\n\nexport function useSessions() {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR<{ sessions: Session[]; _hint?: { global_count?: number; filtered_network?: string } }>(\n withNetwork('/api/hub/status', networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { sessions: data?.sessions || [], hint: data?._hint, error, isLoading };\n}\n\nexport function useHealth() {\n const { data, error } = useSWR<Health>('/api/hub/health', fetcher, SWR_OPTIONS);\n return { health: data || null, error };\n}\n\nexport function useAnetConfig() {\n const { data } = useSWR<AnetConfig>('/api/anet/config', fetcher, { refreshInterval: 30000 });\n return { config: data || null };\n}\n\nexport function useTasks(params?: Record<string, string>) {\n const { networkId } = useNetworkId();\n const query = new URLSearchParams({ limit: '100', ...params }).toString();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/tasks?${query}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return {\n tasks: data?.tasks || [],\n count: data?.count ?? 0,\n source: data?.source,\n error,\n isLoading,\n };\n}\n\nexport function useStats() {\n const { networkId } = useNetworkId();\n const { data, error } = useSWR(withNetwork('/api/hub/stats', networkId), fetcher, SWR_OPTIONS);\n return { stats: data?.ok ? data : null, error };\n}\n\nexport function useLicense() {\n const { data, error } = useSWR('/api/hub/license', fetcher, { refreshInterval: 60000 });\n return { license: data?.ok ? data : null, error };\n}\n\nexport function useMessages(limit = 100) {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/messages?limit=${limit}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { messages: data?.messages || [], error, isLoading };\n}\n\nexport function useNodeSession(alias: string) {\n const { data, error, isLoading } = useSWR(\n alias ? `/api/hub/session?alias=${encodeURIComponent(alias)}` : null,\n fetcher,\n SWR_OPTIONS,\n );\n return {\n session: data?.session || null,\n inbox: data?.inbox || [],\n sse: data?.sse || 0,\n error,\n isLoading,\n };\n}\n","'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { useAnetConfig, useHealth, useLicense } from '../lib/hooks';\n\nexport default function SettingsPage() {\n const { config } = useAnetConfig();\n const { health } = useHealth();\n const { license: licData } = useLicense();\n const [licKey, setLicKey] = useState('');\n const [licResult, setLicResult] = useState('');\n const [oldPwd, setOldPwd] = useState('');\n const [newPwd, setNewPwd] = useState('');\n const [pwdResult, setPwdResult] = useState('');\n const rowClass = 'flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between';\n const valueClass = 'break-all sm:max-w-[320px] sm:text-right';\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <h1 className=\"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10\">Settings</h1>\n\n <div className=\"max-w-2xl space-y-6\">\n {/* CommHub Connection */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">CommHub Connection</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500 shrink-0\">Hub URL</span>\n <span className={`text-cyan-300 ${valueClass}`}>{config?.hub || 'not configured'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Config Source</span>\n <span className={`text-gray-300 ${valueClass}`}>\n {config?.source === 'file' ? 'Local file (~/.anet/config.json)' : config?.source === 'runtime-env' ? 'Vercel env vars' : 'Missing'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Auth Token</span>\n <span className={`${config?.tokenConfigured ? 'text-green-400' : 'text-red-400'} ${valueClass}`}>\n {config?.tokenConfigured ? `Configured (${config.tokenPreview})` : 'Not configured'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Server Auth</span>\n <span className={`${health?.auth === 'enabled' ? 'text-green-400' : 'text-yellow-400'} sm:text-right`}>\n {health?.auth || '--'}\n </span>\n </div>\n {config?.error && (\n <div className=\"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600\">\n {config.error}\n </div>\n )}\n </div>\n </section>\n\n {/* Server Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Server Info</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.version || '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Sessions</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sessions ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">SSE Connections</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sse_connections ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Uptime</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.uptime ? `${Math.floor(health.uptime / 3600)}h ${Math.floor((health.uptime % 3600) / 60)}m` : '--'}</span>\n </div>\n </div>\n </section>\n\n {/* Dashboard Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Dashboard</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 ${valueClass}`}>V2.1</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Data Layer</span>\n <span className={`text-gray-300 ${valueClass}`}>SWR (5s refresh, 3s dedup)</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Pages</span>\n <span className={`text-gray-300 ${valueClass}`}>Overview, Tasks, Nodes, Messages, Settings</span>\n </div>\n </div>\n </section>\n\n {/* License */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">License</h2>\n {licData?.license ? (\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Type</span>\n <span className={`font-medium ${licData.license.type === 'pro' ? 'text-green-400' : 'text-yellow-400'}`}>\n {licData.license.type}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Days Left</span>\n <span className={`${licData.license.days_left <= 7 ? 'text-red-400' : 'text-gray-300'}`}>\n {licData.license.days_left} days\n {licData.license.days_left <= 7 && ' — expiring soon!'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Expires</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.license.expires_at}</span>\n </div>\n {licData.limits && (\n <>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Agents</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_agents}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Networks</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_networks}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Tasks/Day</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_tasks_day}</span>\n </div>\n </>\n )}\n <div className=\"pt-3 border-t border-[#2a2a4a]\">\n <div className=\"flex gap-2\">\n <input type=\"text\" value={licKey} onChange={e => setLicKey(e.target.value)}\n placeholder=\"anet-XXXX-XXXX-XXXX-XXXX\"\n className=\"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none\" />\n <button onClick={async () => {\n if (!licKey.trim()) return;\n const res = await fetch('/api/hub/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: licKey }) });\n const data = await res.json();\n setLicResult(data.ok ? `Activated: ${data.type}` : `Failed: ${data.error}`);\n if (data.ok) setLicKey('');\n setTimeout(() => setLicResult(''), 5000);\n }} className=\"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors\">\n Activate\n </button>\n </div>\n {licResult && <div className={`mt-2 text-xs ${licResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{licResult}</div>}\n </div>\n </div>\n ) : (\n <div className=\"text-xs text-gray-600\">License info not available</div>\n )}\n </section>\n\n {/* Change Password */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Change Password</h2>\n <div className=\"space-y-3\">\n <input type=\"password\" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder=\"Current password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none\" />\n <input type=\"password\" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder=\"New password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none\" />\n <button onClick={async () => {\n if (!oldPwd || !newPwd) return;\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (!saved) { setPwdResult('Not logged in with V3 auth'); return; }\n const { token } = JSON.parse(saved);\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'change_password', token, current_password: oldPwd, new_password: newPwd }),\n });\n const data = await res.json();\n setPwdResult(data.ok ? 'Password changed' : `Failed: ${data.error}`);\n if (data.ok) { setOldPwd(''); setNewPwd(''); }\n setTimeout(() => setPwdResult(''), 5000);\n }} disabled={!oldPwd || !newPwd}\n className=\"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\">\n Change Password\n </button>\n </div>\n {pwdResult && <div className={`mt-2 text-xs ${pwdResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{pwdResult}</div>}\n </section>\n\n {/* API Tokens + Networks */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <Link href=\"/settings/tokens\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">API Tokens</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create and manage tokens for CLI access.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n <Link href=\"/settings/networks\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">Networks</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create, manage, and delete agent networks.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n </div>\n\n {/* Danger Zone */}\n <section className=\"bg-[#111128] border border-red-900/30 rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-red-400 mb-4\">Session</h2>\n <p className=\"text-xs text-gray-500 mb-3\">Sign out will clear your dashboard session cookie.</p>\n <button\n onClick={async () => {\n await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});\n window.location.assign('/login');\n }}\n className=\"px-4 py-2 bg-red-600/20 hover:bg-red-600/30 text-red-300 text-sm rounded-lg border border-red-800/30 transition-colors\"\n >\n Sign out\n </button>\n </section>\n </div>\n </div>\n );\n}\n"],"names":["fetcher","url","res","fetch","status","window","location","assign","Error","json","SWR_OPTIONS","refreshInterval","dedupingInterval","withNetwork","networkId","sep","includes","encodeURIComponent","useSessions","data","error","isLoading","sessions","hint","_hint","useHealth","health","useAnetConfig","config","useTasks","params","query","URLSearchParams","limit","toString","tasks","count","source","useStats","stats","ok","useLicense","license","useMessages","messages","useNodeSession","alias","session","inbox","sse","SettingsPage","licData","licKey","setLicKey","licResult","setLicResult","oldPwd","setOldPwd","newPwd","setNewPwd","pwdResult","setPwdResult","rowClass","valueClass","className","hub","tokenConfigured","tokenPreview","auth","version","sse_connections","uptime","Math","floor","type","days_left","expires_at","limits","max_agents","max_networks","max_tasks_day","value","onChange","e","target","placeholder","onClick","trim","method","headers","body","JSON","stringify","key","setTimeout","startsWith","saved","sessionStorage","getItem","token","parse","action","current_password","new_password","disabled","href","catch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../app/lib/hooks.ts","../../../../app/settings/page.tsx"],"sourcesContent":["import useSWR from 'swr';\nimport { Session, Health, AnetConfig } from '../components/types';\nimport { useNetworkId } from './network-context';\n\nconst fetcher = async (url: string) => {\n const res = await fetch(url);\n if (res.status === 401) {\n window.location.assign('/login');\n throw new Error('unauthorized');\n }\n return res.json();\n};\n\nconst SWR_OPTIONS = { refreshInterval: 5000, dedupingInterval: 3000 };\n\n/** Append network_id to URL if set */\nfunction withNetwork(url: string, networkId: string): string {\n if (!networkId) return url;\n const sep = url.includes('?') ? '&' : '?';\n return `${url}${sep}network_id=${encodeURIComponent(networkId)}`;\n}\n\nexport function useSessions() {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR<{ sessions: Session[]; _hint?: { global_count?: number; filtered_network?: string } }>(\n withNetwork('/api/hub/status', networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { sessions: data?.sessions || [], hint: data?._hint, error, isLoading };\n}\n\nexport function useHealth() {\n const { data, error } = useSWR<Health>('/api/hub/health', fetcher, SWR_OPTIONS);\n return { health: data || null, error };\n}\n\nexport function useAnetConfig() {\n const { data } = useSWR<AnetConfig>('/api/anet/config', fetcher, { refreshInterval: 30000 });\n return { config: data || null };\n}\n\nexport function useTasks(params?: Record<string, string>) {\n const { networkId } = useNetworkId();\n const query = new URLSearchParams({ limit: '100', ...params }).toString();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/tasks?${query}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return {\n tasks: data?.tasks || [],\n count: data?.count ?? 0,\n source: data?.source,\n error,\n isLoading,\n };\n}\n\nexport function useStats() {\n const { networkId } = useNetworkId();\n const { data, error } = useSWR(withNetwork('/api/hub/stats', networkId), fetcher, SWR_OPTIONS);\n return { stats: data?.ok ? data : null, error };\n}\n\nexport function useLicense() {\n const { data, error } = useSWR('/api/hub/license', fetcher, { refreshInterval: 60000 });\n return { license: data?.ok ? data : null, error };\n}\n\nexport function useMessages(limit = 100) {\n const { networkId } = useNetworkId();\n const { data, error, isLoading } = useSWR(\n withNetwork(`/api/hub/messages?limit=${limit}`, networkId),\n fetcher,\n SWR_OPTIONS,\n );\n return { messages: data?.messages || [], error, isLoading };\n}\n\nexport function useNodeSession(alias: string) {\n const { data, error, isLoading } = useSWR(\n alias ? `/api/hub/session?alias=${encodeURIComponent(alias)}` : null,\n fetcher,\n SWR_OPTIONS,\n );\n return {\n session: data?.session || null,\n inbox: data?.inbox || [],\n sse: data?.sse || 0,\n error,\n isLoading,\n };\n}\n","'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { useAnetConfig, useHealth, useLicense } from '../lib/hooks';\n\nexport default function SettingsPage() {\n const { config } = useAnetConfig();\n const { health } = useHealth();\n const { license: licData } = useLicense();\n const [licKey, setLicKey] = useState('');\n const [licResult, setLicResult] = useState('');\n const [oldPwd, setOldPwd] = useState('');\n const [newPwd, setNewPwd] = useState('');\n const [pwdResult, setPwdResult] = useState('');\n const rowClass = 'flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between';\n const valueClass = 'break-all sm:max-w-[320px] sm:text-right';\n\n return (\n <div className=\"min-h-screen bg-[#0a0a1a] text-gray-100 p-4 sm:p-6 font-mono\">\n <h1 className=\"text-2xl font-bold text-white mb-6 lg:ml-0 ml-10\">Settings</h1>\n\n <div className=\"max-w-2xl space-y-6\">\n {/* CommHub Connection */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">CommHub Connection</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500 shrink-0\">Hub URL</span>\n <span className={`text-cyan-300 ${valueClass}`}>{config?.hub || 'not configured'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Config Source</span>\n <span className={`text-gray-300 ${valueClass}`}>\n {config?.source === 'file' ? 'Local file (~/.anet/config.json)' : config?.source === 'runtime-env' ? 'Vercel env vars' : 'Missing'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Auth Token</span>\n <span className={`${config?.tokenConfigured ? 'text-green-400' : 'text-red-400'} ${valueClass}`}>\n {config?.tokenConfigured ? `Configured (${config.tokenPreview})` : 'Not configured'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Server Auth</span>\n <span className={`${health?.auth === 'enabled' ? 'text-green-400' : 'text-yellow-400'} sm:text-right`}>\n {health?.auth || '--'}\n </span>\n </div>\n {config?.error && (\n <div className=\"border-t border-[#2a2a4a] pt-3 text-xs text-gray-600\">\n {config.error}\n </div>\n )}\n </div>\n </section>\n\n {/* Server Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Server Info</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.version || '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Sessions</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sessions ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">SSE Connections</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.sse_connections ?? '--'}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Uptime</span>\n <span className={`text-gray-300 ${valueClass}`}>{health?.uptime ? `${Math.floor(health.uptime / 3600)}h ${Math.floor((health.uptime % 3600) / 60)}m` : '--'}</span>\n </div>\n </div>\n </section>\n\n {/* Dashboard Info */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Dashboard</h2>\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Version</span>\n <span className={`text-gray-300 ${valueClass}`}>V2.1</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Data Layer</span>\n <span className={`text-gray-300 ${valueClass}`}>SWR (5s refresh, 3s dedup)</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Pages</span>\n <span className={`text-gray-300 ${valueClass}`}>Overview, Tasks, Nodes, Messages, Settings</span>\n </div>\n </div>\n </section>\n\n {/* License */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">License</h2>\n {licData?.license ? (\n <div className=\"space-y-3 text-sm\">\n <div className={rowClass}>\n <span className=\"text-gray-500\">Type</span>\n <span className={`font-medium ${licData.license.type === 'pro' ? 'text-green-400' : 'text-yellow-400'}`}>\n {licData.license.type}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Days Left</span>\n <span className={`${licData.license.days_left <= 7 ? 'text-red-400' : 'text-gray-300'}`}>\n {licData.license.days_left} days\n {licData.license.days_left <= 7 && ' — expiring soon!'}\n </span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Expires</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.license.expires_at}</span>\n </div>\n {licData.limits && (\n <>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Agents</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_agents}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Max Networks</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_networks}</span>\n </div>\n <div className={rowClass}>\n <span className=\"text-gray-500\">Tasks/Day</span>\n <span className={`text-gray-300 ${valueClass}`}>{licData.limits.max_tasks_day}</span>\n </div>\n </>\n )}\n <div className=\"pt-3 border-t border-[#2a2a4a]\">\n <div className=\"flex gap-2\">\n <input type=\"text\" value={licKey} onChange={e => setLicKey(e.target.value)}\n placeholder=\"anet-XXXX-XXXX-XXXX-XXXX\"\n className=\"flex-1 bg-[#0a0a15] border border-[#2a2a4a] rounded px-3 py-2 text-xs text-white placeholder-gray-600 focus:outline-none\" />\n <button onClick={async () => {\n if (!licKey.trim()) return;\n const res = await fetch('/api/hub/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: licKey }) });\n const data = await res.json();\n setLicResult(data.ok ? `Activated: ${data.type}` : `Failed: ${data.error}`);\n if (data.ok) setLicKey('');\n setTimeout(() => setLicResult(''), 5000);\n }} className=\"px-3 py-2 bg-cyan-600 hover:bg-cyan-500 text-white text-xs rounded transition-colors\">\n Activate\n </button>\n </div>\n {licResult && <div className={`mt-2 text-xs ${licResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{licResult}</div>}\n </div>\n </div>\n ) : (\n <div className=\"text-xs text-gray-600\">License info not available</div>\n )}\n </section>\n\n {/* Change Password */}\n <section className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-gray-300 mb-4\">Change Password</h2>\n <div className=\"space-y-3\">\n <input type=\"password\" value={oldPwd} onChange={e => setOldPwd(e.target.value)} placeholder=\"Current password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none\" />\n <input type=\"password\" value={newPwd} onChange={e => setNewPwd(e.target.value)} placeholder=\"New password\"\n className=\"w-full bg-[#0a0a15] border border-[#2a2a4a] rounded-lg px-3 py-2 text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:outline-none\" />\n <button onClick={async () => {\n if (!oldPwd || !newPwd) return;\n const saved = sessionStorage.getItem('anet_v3_auth');\n if (!saved) { setPwdResult('Not logged in with V3 auth'); return; }\n const { token } = JSON.parse(saved);\n const res = await fetch('/api/hub/auth', {\n method: 'POST', headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action: 'change_password', token, current_password: oldPwd, new_password: newPwd }),\n });\n const data = await res.json();\n setPwdResult(data.ok ? 'Password changed' : `Failed: ${data.error}`);\n if (data.ok) {\n if (data.token) {\n const auth = JSON.parse(saved);\n sessionStorage.setItem('anet_v3_auth', JSON.stringify({ ...auth, token: data.token }));\n }\n setOldPwd('');\n setNewPwd('');\n }\n setTimeout(() => setPwdResult(''), 5000);\n }} disabled={!oldPwd || !newPwd}\n className=\"px-4 py-2 bg-cyan-600 hover:bg-cyan-500 disabled:bg-gray-800 disabled:text-gray-600 text-white text-sm rounded-lg transition-colors\">\n Change Password\n </button>\n </div>\n {pwdResult && <div className={`mt-2 text-xs ${pwdResult.startsWith('Failed') ? 'text-red-400' : 'text-green-400'}`}>{pwdResult}</div>}\n </section>\n\n {/* API Tokens + Networks */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <Link href=\"/settings/tokens\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">API Tokens</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create and manage tokens for CLI access.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n <Link href=\"/settings/networks\" className=\"bg-[#111128] border border-[#2a2a4a] rounded-xl p-5 hover:border-cyan-500/30 transition-colors\">\n <h2 className=\"text-sm font-semibold text-gray-300\">Networks</h2>\n <p className=\"text-xs text-gray-500 mt-2\">Create, manage, and delete agent networks.</p>\n <span className=\"text-xs text-cyan-400 mt-3 inline-block\">Manage &rarr;</span>\n </Link>\n </div>\n\n {/* Danger Zone */}\n <section className=\"bg-[#111128] border border-red-900/30 rounded-xl p-5\">\n <h2 className=\"text-sm font-semibold text-red-400 mb-4\">Session</h2>\n <p className=\"text-xs text-gray-500 mb-3\">Sign out will clear your dashboard session cookie.</p>\n <button\n onClick={async () => {\n await fetch('/api/auth/logout', { method: 'POST' }).catch(() => {});\n window.location.assign('/login');\n }}\n className=\"px-4 py-2 bg-red-600/20 hover:bg-red-600/30 text-red-300 text-sm rounded-lg border border-red-800/30 transition-colors\"\n >\n Sign out\n </button>\n </section>\n </div>\n </div>\n );\n}\n"],"names":["fetcher","url","res","fetch","status","window","location","assign","Error","json","SWR_OPTIONS","refreshInterval","dedupingInterval","withNetwork","networkId","sep","includes","encodeURIComponent","useSessions","data","error","isLoading","sessions","hint","_hint","useHealth","health","useAnetConfig","config","useTasks","params","query","URLSearchParams","limit","toString","tasks","count","source","useStats","stats","ok","useLicense","license","useMessages","messages","useNodeSession","alias","session","inbox","sse","SettingsPage","licData","licKey","setLicKey","licResult","setLicResult","oldPwd","setOldPwd","newPwd","setNewPwd","pwdResult","setPwdResult","rowClass","valueClass","className","hub","tokenConfigured","tokenPreview","auth","version","sse_connections","uptime","Math","floor","type","days_left","expires_at","limits","max_agents","max_networks","max_tasks_day","value","onChange","e","target","placeholder","onClick","trim","method","headers","body","JSON","stringify","key","setTimeout","startsWith","saved","sessionStorage","getItem","token","parse","action","current_password","new_password","setItem","disabled","href","catch"],"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/cDL0lLOkoUg3hMg9wv7XO/_buildManifest.js",
11
- "static/cDL0lLOkoUg3hMg9wv7XO/_ssgManifest.js",
12
- "static/cDL0lLOkoUg3hMg9wv7XO/_clientMiddlewareManifest.js"
10
+ "static/TiDWPnTdwl4UAFFsW9Wa9/_buildManifest.js",
11
+ "static/TiDWPnTdwl4UAFFsW9Wa9/_ssgManifest.js",
12
+ "static/TiDWPnTdwl4UAFFsW9Wa9/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/0xrnwfefpke-g.js",
@@ -9,4 +9,4 @@ try {
9
9
  w-52
10
10
  -translate-x-full
11
11
  lg:translate-x-0 lg:static lg:shrink-0
12
- "><div class="px-4 py-5 border-b border-[#2a2a4a] "><div><div class="text-white font-bold text-sm">Agent Network</div><div class="text-gray-600 text-xs">Dashboard</div></div></div><div class="pb-20"><nav class="flex flex-col gap-1 px-2 py-4"><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg><span>Overview</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/tasks"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path></svg><span>Tasks</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/nodes"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"></path></svg><span>Nodes</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/messages"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg><span>Messages</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/settings/networks"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"></path></svg><span>Networks</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/logs"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg><span>Audit Log</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/server-logs"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"></path></svg><span>Server Logs</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/admin"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"></path></svg><span>Admin</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/settings"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path></svg><span>Settings</span></a></nav></div><div class="absolute bottom-0 left-0 right-0 border-t border-[#2a2a4a] bg-[#0d0d1a]"><button class="w-full flex items-center gap-3 px-5 py-3 text-xs text-gray-500 hover:text-red-400 hover:bg-red-500/5 transition-colors"><svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9"></path></svg>Sign out</button><div class="flex items-center gap-2 px-3 py-2 justify-between"><div class="relative"><button aria-label="切换主题" class="px-2.5 py-1.5 rounded-md text-xs flex items-center gap-1.5 hover:opacity-80 transition-opacity" style="background:var(--bg-elevated);color:var(--fg);border:1px solid var(--border)"><span aria-hidden="true">🌃</span><span>Cyber</span></button></div><button class="hidden lg:flex p-1.5 rounded text-gray-600 hover:text-gray-400 transition-colors" aria-label="Collapse sidebar"><svg class="w-4 h-4 transition-transform " fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg></button></div></div></aside><main class="flex-1 min-w-0"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0xrnwfefpke-g.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[84128,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"ThemeProvider\"]\n3:I[58963,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"NetworkProvider\"]\n4:I[25045,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"AppShell\"]\n5:I[39756,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0_b22ht_r8.-s.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_b22ht_r8.-s.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14bsg3_-taiw4.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"cyber\",\"className\":\"geist_mono_8d43a2aa-module__8Li5zG__variable h-full antialiased\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\ntry {\\n var t = localStorage.getItem('anet-theme') || 'cyber';\\n document.documentElement.setAttribute('data-theme', t);\\n} catch (e) {}\\n\"}}]}],[\"$\",\"body\",null,{\"className\":\"min-h-full\",\"style\":{\"background\":\"var(--bg)\",\"color\":\"var(--fg)\"},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_b22ht_r8.-s.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"cDL0lLOkoUg3hMg9wv7XO\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0a0a1a\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"Agent Network Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Real-time monitoring dashboard for Agent Network nodes via CommHub\"}],[\"$\",\"meta\",\"2\",{\"property\":\"og:title\",\"content\":\"Agent Network Dashboard\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:description\",\"content\":\"Real-time monitoring dashboard for Agent Network nodes\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"5\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"6\",{\"name\":\"twitter:title\",\"content\":\"Agent Network Dashboard\"}],[\"$\",\"meta\",\"7\",{\"name\":\"twitter:description\",\"content\":\"Real-time monitoring dashboard for Agent Network nodes\"}],[\"$\",\"link\",\"8\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"9\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"$L11\",\"10\",{}]]\n"])</script></body></html>
12
+ "><div class="px-4 py-5 border-b border-[#2a2a4a] "><div><div class="text-white font-bold text-sm">Agent Network</div><div class="text-gray-600 text-xs">Dashboard</div></div></div><div class="pb-20"><nav class="flex flex-col gap-1 px-2 py-4"><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg><span>Overview</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/tasks"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path></svg><span>Tasks</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/nodes"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"></path></svg><span>Nodes</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/messages"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg><span>Messages</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/settings/networks"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"></path></svg><span>Networks</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/logs"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg><span>Audit Log</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/server-logs"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"></path></svg><span>Server Logs</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/admin"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"></path></svg><span>Admin</span></a><a class="flex items-center gap-3 px-3 py-3 rounded-lg text-sm transition-colors active:bg-[#1a1a3a] text-gray-400 hover:text-gray-200 hover:bg-[#1a1a2a] " href="/settings"><svg class="w-5 h-5 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path></svg><span>Settings</span></a></nav></div><div class="absolute bottom-0 left-0 right-0 border-t border-[#2a2a4a] bg-[#0d0d1a]"><button class="w-full flex items-center gap-3 px-5 py-3 text-xs text-gray-500 hover:text-red-400 hover:bg-red-500/5 transition-colors"><svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9"></path></svg>Sign out</button><div class="flex items-center gap-2 px-3 py-2 justify-between"><div class="relative"><button aria-label="切换主题" class="px-2.5 py-1.5 rounded-md text-xs flex items-center gap-1.5 hover:opacity-80 transition-opacity" style="background:var(--bg-elevated);color:var(--fg);border:1px solid var(--border)"><span aria-hidden="true">🌃</span><span>Cyber</span></button></div><button class="hidden lg:flex p-1.5 rounded text-gray-600 hover:text-gray-400 transition-colors" aria-label="Collapse sidebar"><svg class="w-4 h-4 transition-transform " fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg></button></div></div></aside><main class="flex-1 min-w-0"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0xrnwfefpke-g.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[84128,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"ThemeProvider\"]\n3:I[58963,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"NetworkProvider\"]\n4:I[25045,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"AppShell\"]\n5:I[39756,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"default\"]\n7:I[97367,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"OutletBoundary\"]\n8:\"$Sreact.suspense\"\nb:I[97367,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"ViewportBoundary\"]\nd:I[97367,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"MetadataBoundary\"]\nf:I[68027,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0_b22ht_r8.-s.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_b22ht_r8.-s.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14bsg3_-taiw4.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"cyber\",\"className\":\"geist_mono_8d43a2aa-module__8Li5zG__variable h-full antialiased\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\ntry {\\n var t = localStorage.getItem('anet-theme') || 'cyber';\\n document.documentElement.setAttribute('data-theme', t);\\n} catch (e) {}\\n\"}}]}],[\"$\",\"body\",null,{\"className\":\"min-h-full\",\"style\":{\"background\":\"var(--bg)\",\"color\":\"var(--fg)\"},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L7\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@9\"}]}]]}],{},null,false,null]},null,false,\"$@a\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$8\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Le\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0_b22ht_r8.-s.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"TiDWPnTdwl4UAFFsW9Wa9\"}\n"])</script><script>self.__next_f.push([1,"10:[]\na:\"$W10\"\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0a0a1a\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[27201,[\"/_next/static/chunks/0gjbwb8u5wd72.js\",\"/_next/static/chunks/14bsg3_-taiw4.js\"],\"IconMark\"]\n9:null\ne:[[\"$\",\"title\",\"0\",{\"children\":\"Agent Network Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Real-time monitoring dashboard for Agent Network nodes via CommHub\"}],[\"$\",\"meta\",\"2\",{\"property\":\"og:title\",\"content\":\"Agent Network Dashboard\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:description\",\"content\":\"Real-time monitoring dashboard for Agent Network nodes\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"5\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"6\",{\"name\":\"twitter:title\",\"content\":\"Agent Network Dashboard\"}],[\"$\",\"meta\",\"7\",{\"name\":\"twitter:description\",\"content\":\"Real-time monitoring dashboard for Agent Network nodes\"}],[\"$\",\"link\",\"8\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"9\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"$L11\",\"10\",{}]]\n"])</script></body></html>