@sleep2agi/agent-network-dashboard 0.6.3-preview.57 → 0.6.3-preview.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_COMMIT +1 -1
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +9 -9
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.html +1 -1
- package/.next/server/app/admin.rsc +1 -1
- package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/logs.html +1 -1
- package/.next/server/app/logs.rsc +1 -1
- package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.html +1 -1
- package/.next/server/app/messages.rsc +1 -1
- package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.html +1 -1
- package/.next/server/app/node.rsc +1 -1
- package/.next/server/app/node.segments/_full.segment.rsc +1 -1
- package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes.html +1 -1
- package/.next/server/app/nodes.rsc +1 -1
- package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/org.html +1 -1
- package/.next/server/app/org.rsc +1 -1
- package/.next/server/app/org.segments/_full.segment.rsc +1 -1
- package/.next/server/app/org.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/org.segments/org/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers.html +1 -1
- package/.next/server/app/providers.rsc +1 -1
- package/.next/server/app/providers.segments/_full.segment.rsc +1 -1
- package/.next/server/app/providers.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/requirements/page.js.nft.json +1 -1
- package/.next/server/app/requirements/page_client-reference-manifest.js +1 -1
- package/.next/server/app/requirements.html +2 -2
- package/.next/server/app/requirements.rsc +2 -2
- package/.next/server/app/requirements.segments/_full.segment.rsc +2 -2
- package/.next/server/app/requirements.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/requirements.segments/requirements/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/scheduled-tasks.html +1 -1
- package/.next/server/app/scheduled-tasks.rsc +1 -1
- package/.next/server/app/scheduled-tasks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/scheduled-tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/scheduled-tasks.segments/scheduled-tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.html +1 -1
- package/.next/server/app/server-logs.rsc +1 -1
- package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/servers.html +1 -1
- package/.next/server/app/servers.rsc +1 -1
- package/.next/server/app/servers.segments/_full.segment.rsc +1 -1
- package/.next/server/app/servers.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/servers.segments/servers/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks.html +1 -1
- package/.next/server/app/settings/networks.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +1 -1
- package/.next/server/app/settings/tokens.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/skillhub.html +1 -1
- package/.next/server/app/skillhub.rsc +1 -1
- package/.next/server/app/skillhub.segments/_full.segment.rsc +1 -1
- package/.next/server/app/skillhub.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/skillhub.segments/skillhub/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.html +1 -1
- package/.next/server/app/tasks.rsc +1 -1
- package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1ovdbox._.js.map +1 -1
- package/.next/server/chunks/ssr/app_099f0wg._.js +1 -1
- package/.next/server/chunks/ssr/app_099f0wg._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js +1 -1
- package/.next/server/chunks/ssr/app_0iz553k._.js.map +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js +1 -1
- package/.next/server/chunks/ssr/app_0los-eu._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{0cuzbmf4k1kgl.js → 0z9tzvfwtc16z.js} +1 -1
- package/.next/static/chunks/{21djd6ixldlx0.js → 26bpf-fpc6zpt.js} +1 -1
- package/.next/static/chunks/{2juzvtg9ne4yt.js → 2divamiv1re3v.js} +1 -1
- package/.next/static/chunks/3vv0y_64bnnsf.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/requirements/page.tsx +25 -5
- package/package.json +1 -1
- package/.next/static/chunks/3shtxab8cmux9.js +0 -1
- /package/.next/static/{_HZB6K84VKNaxf1K7dqqj → FEaCQpBc05SBAWTBHRt5h}/_buildManifest.js +0 -0
- /package/.next/static/{_HZB6K84VKNaxf1K7dqqj → FEaCQpBc05SBAWTBHRt5h}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{_HZB6K84VKNaxf1K7dqqj → FEaCQpBc05SBAWTBHRt5h}/_ssgManifest.js +0 -0
|
@@ -17,7 +17,7 @@ d:"$Sreact.suspense"
|
|
|
17
17
|
:HL["/_next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
18
18
|
:HL["/_next/static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
19
19
|
f:X
|
|
20
|
-
0:{"P":null,"c":["","tasks"],"q":"","i":false,"f":[[["",{"children":["tasks",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3d-1vk5hzu5rq.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-4980o5t7_r.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/3u059pjgl4gcw.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/08-obrj2goweb.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/0iz44n632kw4w.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","data-theme":"cyber","className":"geist_a71539c9-module__T19VSG__variable 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,{}],["$","$L5",null,{"children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",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,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L8",null,{"Component":"$9","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@a","$@b"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/3y_rsz82k2_ty.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0iiu4-g5k8jcq.js","async":true,"nonce":"$undefined"}]],["$","$Lc",null,{"children":["$","$d",null,{"name":"Next.MetadataOutlet","children":"$@e"}]}]]}],{},null,false,null]},null,false,"$f"]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$d",null,{"name":"Next.Metadata","children":"$L13"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3d-1vk5hzu5rq.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-4980o5t7_r.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"
|
|
20
|
+
0:{"P":null,"c":["","tasks"],"q":"","i":false,"f":[[["",{"children":["tasks",{"children":["__PAGE__",{},"$undefined","$undefined",4608]},"$undefined","$undefined",4608]},"$undefined","$undefined",4624],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3d-1vk5hzu5rq.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-4980o5t7_r.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/3u059pjgl4gcw.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/08-obrj2goweb.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/0iz44n632kw4w.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","data-theme":"cyber","className":"geist_a71539c9-module__T19VSG__variable 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,{}],["$","$L5",null,{"children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",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,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L8",null,{"Component":"$9","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@a","$@b"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/3y_rsz82k2_ty.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0iiu4-g5k8jcq.js","async":true,"nonce":"$undefined"}]],["$","$Lc",null,{"children":["$","$d",null,{"name":"Next.MetadataOutlet","children":"$@e"}]}]]}],{},null,false,null]},null,false,"$f"]},null,false,null],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$d",null,{"name":"Next.Metadata","children":"$L13"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$14",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3d-1vk5hzu5rq.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-4980o5t7_r.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"FEaCQpBc05SBAWTBHRt5h"}
|
|
21
21
|
f:C
|
|
22
22
|
a:{}
|
|
23
23
|
b:"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params"
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
:HL["/_next/static/chunks/0k-4980o5t7_r.css","style"]
|
|
3
3
|
:HL["/_next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
4
4
|
:HL["/_next/static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
5
|
-
0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"tasks","param":null,"prefetchHints":4192,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}}}},"staleTime":300,"buildId":"
|
|
5
|
+
0:{"tree":{"name":"","param":null,"prefetchHints":4176,"slots":{"children":{"name":"tasks","param":null,"prefetchHints":4192,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":4256,"slots":null}}}}},"staleTime":300,"buildId":"FEaCQpBc05SBAWTBHRt5h"}
|
|
@@ -17,7 +17,7 @@ f:I[39756,["/_next/static/chunks/3u059pjgl4gcw.js","/_next/static/chunks/08-obrj
|
|
|
17
17
|
a:X
|
|
18
18
|
12:X
|
|
19
19
|
12:C
|
|
20
|
-
0:{"buildId":"
|
|
20
|
+
0:{"buildId":"FEaCQpBc05SBAWTBHRt5h","data":[{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","script","script-0",{"src":"/_next/static/chunks/3y_rsz82k2_ty.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0iiu4-g5k8jcq.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":"$@9","staleTime":"$a","varyParams":null},{"rsc":["$","$1","h",{"children":[null,["$","$Lb",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#0b0b0d"}]]}],["$","div",null,{"hidden":true,"children":["$","$Lc",null,{"children":["$","$7",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Agent Network Dashboard"}],["$","meta","1",{"name":"description","content":"Real-time monitoring dashboard for Agent Network nodes via CommHub"}],["$","link","2",{"rel":"manifest","href":"/manifest.webmanifest"}],["$","meta","3",{"name":"apple-mobile-web-app-capable","content":"yes"}],["$","meta","4",{"name":"mobile-web-app-capable","content":"yes"}],["$","meta","5",{"name":"apple-mobile-web-app-title","content":"Agent Network"}],["$","meta","6",{"name":"apple-mobile-web-app-status-bar-style","content":"black-translucent"}],["$","meta","7",{"property":"og:title","content":"Agent Network Dashboard"}],["$","meta","8",{"property":"og:description","content":"Real-time monitoring dashboard for Agent Network nodes"}],["$","meta","9",{"property":"og:type","content":"website"}],["$","meta","10",{"name":"twitter:card","content":"summary"}],["$","meta","11",{"name":"twitter:title","content":"Agent Network Dashboard"}],["$","meta","12",{"name":"twitter:description","content":"Real-time monitoring dashboard for Agent Network nodes"}],["$","link","13",{"rel":"shortcut icon","href":"/favicon.svg"}],["$","link","14",{"rel":"icon","href":"/favicon.ico?favicon.2vob68tjqpejf.ico","sizes":"256x256","type":"image/x-icon"}],["$","link","15",{"rel":"icon","href":"/favicon.svg","type":"image/svg+xml"}],["$","link","16",{"rel":"apple-touch-icon","href":"/sleep2agi-logo.svg","type":"image/svg+xml"}],["$","$Ld","17",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":"$@e","staleTime":"$a","varyParams":null},{"rsc":["$","$1","c",{"children":[null,["$","$Lf",null,{"parallelRouterKey":"children","template":["$","$L10",null,{}]}]]}],"isPartial":"$@11","staleTime":"$a","varyParams":"$12"},{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/3d-1vk5hzu5rq.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-4980o5t7_r.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/3u059pjgl4gcw.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/08-obrj2goweb.js","async":true}],["$","script","script-2",{"src":"/_next/static/chunks/0iz44n632kw4w.js","async":true}]],["$","html",null,{"lang":"en","data-theme":"cyber","className":"geist_a71539c9-module__T19VSG__variable 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":["$","$L13",null,{"children":["$","$L14",null,{"children":[["$","$L15",null,{}],["$","$L16",null,{"children":["$","$Lf",null,{"parallelRouterKey":"children","template":["$","$L10",null,{}],"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)}}"}}],"$L17","$L18"]}]}]],[]]}]}]]}]}]}]]}]]}],"isPartial":"$@19","staleTime":"$a","varyParams":null}],"isUpgradeableISRFallback":false,"a":"$@1a","rootVaryParams":null,"needsRuntimeRequest":"$@1b"}
|
|
21
21
|
4:{}
|
|
22
22
|
5:"$0:data:0:rsc:props:children:0:props:serverProvidedParams:params"
|
|
23
23
|
8:null
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.
|
|
1
|
+
module.exports=[50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.58"],344)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=%5Broot-of-the-server%5D__1ovdbox._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../package.json.%5Bjson%5D.mjs","../../../../app/lib/version.ts"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"desktopName\":\"agent-network.desktop\",\"version\":\"0.6.3-preview.
|
|
1
|
+
{"version":3,"sources":["../../../../package.json.%5Bjson%5D.mjs","../../../../app/lib/version.ts"],"sourcesContent":["\"use turbopack no side effects\";\nexport default {\"name\":\"@sleep2agi/agent-network-dashboard\",\"desktopName\":\"agent-network.desktop\",\"version\":\"0.6.3-preview.58\",\"description\":\"Agent Network Dashboard — Web UI for managing AI Agent networks\",\"main\":\"apps/desktop/electron/main.cjs\",\"scripts\":{\"dev\":\"next dev\",\"build\":\"next build\",\"postbuild\":\"node scripts/stamp-build-commit.mjs\",\"start\":\"next start\",\"lint\":\"eslint\",\"oss:check\":\"node scripts/oss-readiness-check.mjs\",\"oss:binaries\":\"node scripts/oss-binary-scan.mjs\",\"oss:secrets\":\"node scripts/oss-secret-scan.mjs --scope tree\",\"oss:secrets:history\":\"node scripts/oss-secret-scan.mjs --scope history\",\"oss:surface\":\"node scripts/oss-public-surface-scan.mjs --scope all\",\"app:android:init\":\"npx cap add android\",\"app:android:sync\":\"npx cap sync android\",\"app:android:open\":\"npx cap open android\",\"app:ios:init\":\"npx cap add ios\",\"app:ios:sync\":\"npx cap sync ios\",\"app:ios:open\":\"npx cap open ios\",\"app:desktop\":\"electron apps/desktop/electron/main.cjs\",\"app:desktop:pack\":\"electron-builder --config electron-builder.json\",\"prepublishOnly\":\"[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing — run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)\",\"avatars:check\":\"node scripts/check-avatars.mjs\",\"ratchet\":\"node scripts/check-color-ratchet.mjs\",\"gates\":\"node scripts/check-color-ratchet.mjs && node scripts/check-avatars.mjs\",\"test\":\"node scripts/run-tests.mjs\"},\"bin\":{\"agent-network-dashboard\":\"./bin/start.js\"},\"homepage\":\"https://anet.sh\",\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/sleep2agi/agent-network-dashboard\"},\"bugs\":{\"url\":\"https://github.com/sleep2agi/agent-network-dashboard/issues\"},\"author\":\"sleep2agi\",\"license\":\"Apache-2.0\",\"engines\":{\"node\":\">=20\"},\"publishConfig\":{\"access\":\"public\"},\"dependencies\":{\"@capacitor/core\":\"^7.4.4\",\"next\":\"16.3.0\",\"pinyin-pro\":\"^3.28.1\",\"react\":\"19.2.4\",\"react-dom\":\"19.2.4\",\"react-markdown\":\"^10.1.0\",\"remark-gfm\":\"^4.0.1\",\"swr\":\"^2.4.1\"},\"devDependencies\":{\"@capacitor/android\":\"^7.4.4\",\"@capacitor/cli\":\"^7.4.4\",\"@capacitor/ios\":\"^7.4.4\",\"@playwright/test\":\"^1.59.1\",\"@tailwindcss/postcss\":\"^4\",\"@types/node\":\"^20\",\"@types/react\":\"^19\",\"@types/react-dom\":\"^19\",\"electron\":\"^39.2.6\",\"electron-builder\":\"^26.0.12\",\"eslint\":\"^9\",\"eslint-config-next\":\"16.3.0\",\"tailwindcss\":\"^4\",\"typescript\":\"^5\"}};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInR1cmJvcGFjazovLy9wYWNrYWdlLmpzb24iXSwic291cmNlc0NvbnRlbnQiOlsie1wibmFtZVwiOlwiQHNsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZFwiLFwiZGVza3RvcE5hbWVcIjpcImFnZW50LW5ldHdvcmsuZGVza3RvcFwiLFwidmVyc2lvblwiOlwiMC42LjMtcHJldmlldy41OFwiLFwiZGVzY3JpcHRpb25cIjpcIkFnZW50IE5ldHdvcmsgRGFzaGJvYXJkIOKAlCBXZWIgVUkgZm9yIG1hbmFnaW5nIEFJIEFnZW50IG5ldHdvcmtzXCIsXCJtYWluXCI6XCJhcHBzL2Rlc2t0b3AvZWxlY3Ryb24vbWFpbi5janNcIixcInNjcmlwdHNcIjp7XCJkZXZcIjpcIm5leHQgZGV2XCIsXCJidWlsZFwiOlwibmV4dCBidWlsZFwiLFwicG9zdGJ1aWxkXCI6XCJub2RlIHNjcmlwdHMvc3RhbXAtYnVpbGQtY29tbWl0Lm1qc1wiLFwic3RhcnRcIjpcIm5leHQgc3RhcnRcIixcImxpbnRcIjpcImVzbGludFwiLFwib3NzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvb3NzLXJlYWRpbmVzcy1jaGVjay5tanNcIixcIm9zczpiaW5hcmllc1wiOlwibm9kZSBzY3JpcHRzL29zcy1iaW5hcnktc2Nhbi5tanNcIixcIm9zczpzZWNyZXRzXCI6XCJub2RlIHNjcmlwdHMvb3NzLXNlY3JldC1zY2FuLm1qcyAtLXNjb3BlIHRyZWVcIixcIm9zczpzZWNyZXRzOmhpc3RvcnlcIjpcIm5vZGUgc2NyaXB0cy9vc3Mtc2VjcmV0LXNjYW4ubWpzIC0tc2NvcGUgaGlzdG9yeVwiLFwib3NzOnN1cmZhY2VcIjpcIm5vZGUgc2NyaXB0cy9vc3MtcHVibGljLXN1cmZhY2Utc2Nhbi5tanMgLS1zY29wZSBhbGxcIixcImFwcDphbmRyb2lkOmluaXRcIjpcIm5weCBjYXAgYWRkIGFuZHJvaWRcIixcImFwcDphbmRyb2lkOnN5bmNcIjpcIm5weCBjYXAgc3luYyBhbmRyb2lkXCIsXCJhcHA6YW5kcm9pZDpvcGVuXCI6XCJucHggY2FwIG9wZW4gYW5kcm9pZFwiLFwiYXBwOmlvczppbml0XCI6XCJucHggY2FwIGFkZCBpb3NcIixcImFwcDppb3M6c3luY1wiOlwibnB4IGNhcCBzeW5jIGlvc1wiLFwiYXBwOmlvczpvcGVuXCI6XCJucHggY2FwIG9wZW4gaW9zXCIsXCJhcHA6ZGVza3RvcFwiOlwiZWxlY3Ryb24gYXBwcy9kZXNrdG9wL2VsZWN0cm9uL21haW4uY2pzXCIsXCJhcHA6ZGVza3RvcDpwYWNrXCI6XCJlbGVjdHJvbi1idWlsZGVyIC0tY29uZmlnIGVsZWN0cm9uLWJ1aWxkZXIuanNvblwiLFwicHJlcHVibGlzaE9ubHlcIjpcIlsgLWYgLm5leHQvQlVJTERfSUQgXSB8fCAoZWNobyAncHJlcHVibGlzaE9ubHk6IC5uZXh0L0JVSUxEX0lEIG1pc3Npbmcg4oCUIHJ1biBucG0gcnVuIGJ1aWxkIGZpcnN0IChzZWUgY29tbWl0IDA1YzFlYmYgYm9keSBmb3IgUjIyNCBjaHVuay01MDAgcm9vdCBjYXVzZSknID4mMiAmJiBleGl0IDEpXCIsXCJhdmF0YXJzOmNoZWNrXCI6XCJub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInJhdGNoZXRcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qc1wiLFwiZ2F0ZXNcIjpcIm5vZGUgc2NyaXB0cy9jaGVjay1jb2xvci1yYXRjaGV0Lm1qcyAmJiBub2RlIHNjcmlwdHMvY2hlY2stYXZhdGFycy5tanNcIixcInRlc3RcIjpcIm5vZGUgc2NyaXB0cy9ydW4tdGVzdHMubWpzXCJ9LFwiYmluXCI6e1wiYWdlbnQtbmV0d29yay1kYXNoYm9hcmRcIjpcIi4vYmluL3N0YXJ0LmpzXCJ9LFwiaG9tZXBhZ2VcIjpcImh0dHBzOi8vYW5ldC5zaFwiLFwicmVwb3NpdG9yeVwiOntcInR5cGVcIjpcImdpdFwiLFwidXJsXCI6XCJodHRwczovL2dpdGh1Yi5jb20vc2xlZXAyYWdpL2FnZW50LW5ldHdvcmstZGFzaGJvYXJkXCJ9LFwiYnVnc1wiOntcInVybFwiOlwiaHR0cHM6Ly9naXRodWIuY29tL3NsZWVwMmFnaS9hZ2VudC1uZXR3b3JrLWRhc2hib2FyZC9pc3N1ZXNcIn0sXCJhdXRob3JcIjpcInNsZWVwMmFnaVwiLFwibGljZW5zZVwiOlwiQXBhY2hlLTIuMFwiLFwiZW5naW5lc1wiOntcIm5vZGVcIjpcIj49MjBcIn0sXCJwdWJsaXNoQ29uZmlnXCI6e1wiYWNjZXNzXCI6XCJwdWJsaWNcIn0sXCJkZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2NvcmVcIjpcIl43LjQuNFwiLFwibmV4dFwiOlwiMTYuMy4wXCIsXCJwaW55aW4tcHJvXCI6XCJeMy4yOC4xXCIsXCJyZWFjdFwiOlwiMTkuMi40XCIsXCJyZWFjdC1kb21cIjpcIjE5LjIuNFwiLFwicmVhY3QtbWFya2Rvd25cIjpcIl4xMC4xLjBcIixcInJlbWFyay1nZm1cIjpcIl40LjAuMVwiLFwic3dyXCI6XCJeMi40LjFcIn0sXCJkZXZEZXBlbmRlbmNpZXNcIjp7XCJAY2FwYWNpdG9yL2FuZHJvaWRcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9jbGlcIjpcIl43LjQuNFwiLFwiQGNhcGFjaXRvci9pb3NcIjpcIl43LjQuNFwiLFwiQHBsYXl3cmlnaHQvdGVzdFwiOlwiXjEuNTkuMVwiLFwiQHRhaWx3aW5kY3NzL3Bvc3Rjc3NcIjpcIl40XCIsXCJAdHlwZXMvbm9kZVwiOlwiXjIwXCIsXCJAdHlwZXMvcmVhY3RcIjpcIl4xOVwiLFwiQHR5cGVzL3JlYWN0LWRvbVwiOlwiXjE5XCIsXCJlbGVjdHJvblwiOlwiXjM5LjIuNlwiLFwiZWxlY3Ryb24tYnVpbGRlclwiOlwiXjI2LjAuMTJcIixcImVzbGludFwiOlwiXjlcIixcImVzbGludC1jb25maWctbmV4dFwiOlwiMTYuMy4wXCIsXCJ0YWlsd2luZGNzc1wiOlwiXjRcIixcInR5cGVzY3JpcHRcIjpcIl41XCJ9fSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSJ9","/** Dashboard package version sourced from package.json at build time.\n * Importing JSON requires `resolveJsonModule: true` in tsconfig, which\n * Next sets by default. Bumping is automated by the publish flow, so this\n * surfaces the real preview number in Settings → Dashboard. */\nimport pkg from '../../package.json' assert { type: 'json' };\n\nexport const DASHBOARD_VERSION: string = pkg.version;\n"],"names":[],"mappings":"qIAC4G"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[53142,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246);let e={nodes:{title:"No agents in this network",sub:"Agent sessions will appear here once they connect to the CommHub."},tasks:{title:"No tasks yet",sub:"Tasks will appear here when agents send them via CommHub."},messages:{title:"No messages",sub:"Messages between agents will appear here."},logs:{title:"No audit logs",sub:"Events will appear here when users register, login, or perform actions."},tokens:{title:"No API tokens",sub:"Create one to authenticate CLI tools and external integrations."},networks:{title:"No networks found",sub:"Create one or sign in with V3 auth to see your networks."},generic:{title:"Nothing here yet",sub:"Data will appear here once available."}};function f({variant:a,size:c}){let d={width:c,height:c},e={fill:"none",stroke:"currentColor",strokeWidth:1.25,strokeLinecap:"round",strokeLinejoin:"round"};switch(a){case"nodes":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"14",r:"4"}),(0,b.jsx)("circle",{cx:"14",cy:"44",r:"4"}),(0,b.jsx)("circle",{cx:"50",cy:"44",r:"4"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"14",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"50",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"18",y1:"44",x2:"46",y2:"44",strokeDasharray:"3 3",opacity:"0.6"})]})});case"tasks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("rect",{x:"14",y:"14",width:"36",height:"6",rx:"1.5"}),(0,b.jsx)("rect",{x:"14",y:"26",width:"36",height:"6",rx:"1.5",opacity:"0.6"}),(0,b.jsx)("rect",{x:"14",y:"38",width:"36",height:"6",rx:"1.5",opacity:"0.35"})]})});case"messages":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z"}),(0,b.jsx)("line",{x1:"22",y1:"28",x2:"42",y2:"28",opacity:"0.5"}),(0,b.jsx)("line",{x1:"22",y1:"34",x2:"36",y2:"34",opacity:"0.5"})]})});case"logs":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z"}),(0,b.jsx)("path",{d:"M40 12 v8 h8",opacity:"0.6"}),(0,b.jsx)("line",{x1:"24",y1:"32",x2:"40",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"24",y1:"38",x2:"40",y2:"38",opacity:"0.4"}),(0,b.jsx)("line",{x1:"24",y1:"44",x2:"34",y2:"44",opacity:"0.25"})]})});case"tokens":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"22",cy:"32",r:"8"}),(0,b.jsx)("line",{x1:"30",y1:"32",x2:"54",y2:"32"}),(0,b.jsx)("line",{x1:"44",y1:"32",x2:"44",y2:"38"}),(0,b.jsx)("line",{x1:"50",y1:"32",x2:"50",y2:"40"})]})});case"networks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"18"}),(0,b.jsx)("ellipse",{cx:"32",cy:"32",rx:"18",ry:"9",opacity:"0.55"}),(0,b.jsx)("line",{x1:"14",y1:"32",x2:"50",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"32",y1:"14",x2:"32",y2:"50",opacity:"0.55"})]})});default:return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"14",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("circle",{cx:"32",cy:"32",r:"3"})]})})}}function g({variant:a="generic",title:c,sub:h,cta:i,compact:j=!1}){let k=e[a],l=c??k.title,m=h??k.sub;return(0,b.jsxs)("div",{className:`text-center ${j?"py-8":"py-16"} px-4`,role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)(f,{variant:a,size:j?40:56})}),(0,b.jsx)("h3",{className:`font-medium text-gray-300 ${j?"text-sm":"text-base"}`,children:l}),m&&(0,b.jsx)("p",{className:`text-gray-500 ${j?"text-xs mt-1.5":"text-sm mt-2"} max-w-md mx-auto leading-relaxed`,children:m}),i&&(0,b.jsx)("div",{className:"mt-4",children:i.href?(0,b.jsxs)(d.default,{href:i.href,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]}):(0,b.jsxs)("button",{onClick:i.onClick,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}function h({children:a}){return(0,b.jsx)("div",{className:"max-w-2xl mx-auto rounded-xl border border-[#26262b] bg-[#161618] shadow-lg shadow-black/20",children:a})}function i({cmd:a}){let[d,e]=(0,c.useState)(!1),f=async()=>{try{await navigator.clipboard.writeText(a),e(!0),setTimeout(()=>e(!1),1800)}catch{}};return(0,b.jsxs)("div",{className:"anet-empty-cmd flex items-start sm:items-center gap-2 bg-[#0e0e10] border border-[#26262b] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm",children:[(0,b.jsx)("code",{className:"text-cyan-300 font-mono select-all min-w-0 break-all sm:break-normal",children:a}),(0,b.jsx)("button",{type:"button",onClick:f,"aria-label":d?"Copied":"Copy command",className:"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1c1c1f] transition-colors",children:d?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-green-400",children:[(0,b.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,b.jsx)("path",{d:"M20 6 9 17l-5-5"})}),"Copied"]}):(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,b.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Copy"]})})]})}a.s(["EmptyState",0,g,"NodesEmptyState",0,function({hint:a,taskHistoryCount:c=0}){return a?.global_count?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents in this network",sub:`Server has ${a.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`})}):c>0?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents online",sub:`Every agent in this network is currently offline. ${c.toLocaleString()} task${1===c?"":"s"} in history — they may have finished their work or disconnected.`,cta:{label:"View task history",href:"/tasks"}})}):(0,b.jsx)(h,{children:(0,b.jsxs)("div",{className:"text-center py-16 px-4",role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)("svg",{viewBox:"0 0 64 64",width:56,height:56,children:(0,b.jsxs)("g",{stroke:"currentColor",strokeWidth:"1.5",fill:"none",children:[(0,b.jsx)("rect",{x:"10",y:"20",width:"44",height:"28",rx:"2"}),(0,b.jsx)("rect",{x:"20",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"32",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"44",y:"32",width:"4",height:"8",opacity:"0.5"}),(0,b.jsx)("line",{x1:"10",y1:"26",x2:"54",y2:"26",opacity:"0.4"}),(0,b.jsx)("circle",{cx:"14",cy:"23",r:"0.8",fill:"currentColor"})]})})}),(0,b.jsx)("h3",{className:"font-medium text-gray-300 text-base",children:"Spin up your first agent"}),(0,b.jsx)("p",{className:"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed",children:"Run this in a fresh terminal to register an agent with this CommHub:"}),(0,b.jsx)("div",{className:"mt-4 inline-block",children:(0,b.jsx)(i,{cmd:"npx --yes @sleep2agi/agent-network init"})}),(0,b.jsx)("p",{className:"text-gray-600 text-xs mt-3 max-w-md mx-auto",children:"Once the agent connects, it appears here automatically within a few seconds — no refresh needed."}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsxs)("a",{href:"https://anet.sh",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300",children:["Full quickstart guide",(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})})}])},52010,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(50944),f=a.i(53142);let g=[{key:"",label:"All"},{key:"pool",label:"需求池"},{key:"doing",label:"进行中"},{key:"done",label:"完成"},{key:"abandoned",label:"已放弃"}],h={pool:"bg-amber-500/10 text-amber-300 border-amber-500/20",doing:"bg-blue-500/10 text-blue-300 border-blue-500/20",done:"bg-emerald-500/10 text-emerald-300 border-emerald-500/20",abandoned:"bg-gray-500/10 text-gray-400 border-gray-500/20"};function i(){let a=(0,e.useRouter)(),i=(0,e.useSearchParams)(),[j,k]=(0,c.useState)([]),[l,m]=(0,c.useState)(!0),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(!1),r=i.get("status")||"",s=i.get("tag")||"",t=i.get("q")||"",[u,v]=(0,c.useState)(s),[w,x]=(0,c.useState)(t),y=(0,c.useCallback)(b=>{let c=new URLSearchParams(i.toString());for(let[a,d]of Object.entries(b))d?c.set(a,d):c.delete(a);let d=c.toString();a.replace(d?`/requirements?${d}`:"/requirements",{scroll:!1})},[a,i]),z=(0,c.useCallback)(async()=>{m(!0),o("");try{let a=new URLSearchParams;r&&a.set("status",r),s&&a.set("tag",s),t&&a.set("q",t),a.set("limit","200");let b=await fetch(`/api/hub/requirements?${a.toString()}`,{cache:"no-store"});if(401===b.status){q(!0),k([]);return}let c=await b.json();if(!b.ok||!c.ok){o(c?.error||`hub_${b.status}`),k([]);return}q(!1),k(c.requirements||[])}catch(a){o(a instanceof Error?a.message:"fetch failed"),k([])}finally{m(!1)}},[r,s,t]);(0,c.useEffect)(()=>{z()},[z]);let A=(0,c.useMemo)(()=>{let a={};for(let b of j)a[b.column]=(a[b.column]||0)+1;return a},[j]);return(0,b.jsx)("div",{className:"min-h-screen bg-[var(--bg)] text-gray-200",children:(0,b.jsxs)("div",{className:"mx-auto max-w-6xl px-4 py-6 sm:px-6",children:[(0,b.jsxs)("div",{className:"mb-5 flex flex-wrap items-end justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-lg font-semibold text-white",children:"Requirements"}),(0,b.jsxs)("p",{className:"mt-1 text-xs text-gray-500",children:["需求池 / 进行中 / 完成 —— 只读视图(写面见 #1634)。任务派单在 ",(0,b.jsx)(d.default,{href:"/tasks",className:"text-blue-400 hover:underline",children:"Tasks"}),"。"]})]}),(0,b.jsx)("button",{type:"button",onClick:()=>z(),className:"rounded-lg border border-[var(--border)] px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200",children:"Refresh"})]}),(0,b.jsx)("div",{className:"mb-4 flex flex-wrap items-center gap-1.5",children:g.map(a=>{let c=a.key?A[a.key]||0:j.length,d=r===a.key;return(0,b.jsxs)("button",{type:"button",onClick:()=>y({status:a.key}),className:`rounded-md border px-3 py-1.5 text-xs transition-colors ${d?"border-blue-500/30 bg-blue-500/10 text-blue-300":"border-transparent text-gray-500 hover:bg-[var(--border)]/60 hover:text-gray-300"}`,children:[a.label,(0,b.jsx)("span",{className:"ml-1.5 text-[10px] tabular-nums opacity-70",children:c})]},a.key||"all")})}),(0,b.jsxs)("div",{className:"mb-4 flex flex-wrap items-center gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"Search"}),(0,b.jsx)("input",{value:w,onChange:a=>x(a.target.value),onKeyDown:a=>{"Enter"===a.key&&y({q:w})},onBlur:()=>{w!==t&&y({q:w})},placeholder:"标题 / 人 / 标签",className:"w-40 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none sm:w-56"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"Tag"}),(0,b.jsx)("input",{value:u,onChange:a=>v(a.target.value),onKeyDown:a=>{"Enter"===a.key&&y({tag:u})},onBlur:()=>{u!==s&&y({tag:u})},placeholder:"exact tag",className:"w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none"})]}),(r||s||t)&&(0,b.jsx)("button",{type:"button",onClick:()=>{v(""),x(""),y({status:"",tag:"",q:""})},className:"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:border-gray-600 hover:text-gray-200",children:"Clear filters"})]}),p&&(0,b.jsxs)("div",{className:"mb-4 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-300",children:["会话已过期,",(0,b.jsx)(d.default,{href:"/login",className:"underline",children:"重新登录"})," 后再看需求。"]}),n&&!p&&(0,b.jsxs)("div",{className:"mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-3 text-sm text-red-300",children:["读取失败:",n,(0,b.jsx)("button",{type:"button",onClick:()=>z(),className:"ml-3 underline",children:"重试"})]}),l?(0,b.jsx)("div",{className:"space-y-2",children:Array.from({length:8}).map((a,c)=>(0,b.jsx)("div",{className:"h-12 animate-pulse rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)]"},c))}):0===j.length?(0,b.jsx)(f.EmptyState,{variant:"generic",title:r||s||t?"没有符合筛选的需求":"需求池是空的",sub:r||s||t?"清掉筛选再试,或换一个标签。":"客户端建一条需求后,这里就会出现。",cta:r||s||t?{label:"清空筛选",onClick:()=>y({status:"",tag:"",q:""})}:void 0}):(0,b.jsx)("ul",{className:"divide-y divide-[var(--border)] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)]",children:j.map(a=>{var c,e;let f=a.checklist_count,g=a.children;return(0,b.jsx)("li",{className:"hover:bg-[var(--bg-secondary)]/60",children:(0,b.jsxs)(d.default,{href:`/requirements/${a.id}`,className:"flex flex-wrap items-center gap-x-3 gap-y-1.5 px-3 py-2.5 sm:px-4",children:[(0,b.jsxs)("span",{className:"w-12 shrink-0 text-[11px] tabular-nums text-gray-600",children:["#",a.seq]}),(0,b.jsx)("span",{className:`shrink-0 rounded border px-1.5 py-0.5 text-[10px] ${h[a.column]||h.abandoned}`,children:a.column}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-sm text-gray-100",children:a.name}),(a.tags||[]).slice(0,3).map(a=>(0,b.jsx)("span",{className:"hidden shrink-0 rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-[10px] text-gray-400 sm:inline",children:a},a)),(0,b.jsx)("span",{className:`shrink-0 text-[11px] ${"high"===(c=a.priority)?"text-red-400":"low"===c||"lowest"===c?"text-gray-600":"text-gray-400"}`,children:a.priority}),(0,b.jsx)("span",{className:"hidden w-24 shrink-0 truncate text-[11px] text-gray-500 sm:inline",children:(e=a.agent_owner)?e.alias||e.id:"—"}),(0,b.jsx)("span",{className:"w-20 shrink-0 text-right text-[11px]",children:function(a){if(!a)return"—";let c=a.slice(0,10);return c<new Date().toISOString().slice(0,10)?(0,b.jsx)("span",{className:"text-red-400",children:c}):(0,b.jsx)("span",{className:"text-gray-400",children:c})}(a.due)}),f&&f.total>0&&(0,b.jsxs)("span",{className:"hidden shrink-0 text-[10px] tabular-nums text-gray-500 sm:inline",children:["✓ ",f.done,"/",f.total]}),g&&g.total>0&&(0,b.jsxs)("span",{className:"hidden shrink-0 text-[10px] tabular-nums text-gray-500 md:inline",children:["↳ ",g.done,"/",g.total]})]})},a.id)})})]})})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)("div",{className:"min-h-screen bg-[var(--bg)]"}),children:(0,b.jsx)(i,{})})}])}];
|
|
1
|
+
module.exports=[53142,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246);let e={nodes:{title:"No agents in this network",sub:"Agent sessions will appear here once they connect to the CommHub."},tasks:{title:"No tasks yet",sub:"Tasks will appear here when agents send them via CommHub."},messages:{title:"No messages",sub:"Messages between agents will appear here."},logs:{title:"No audit logs",sub:"Events will appear here when users register, login, or perform actions."},tokens:{title:"No API tokens",sub:"Create one to authenticate CLI tools and external integrations."},networks:{title:"No networks found",sub:"Create one or sign in with V3 auth to see your networks."},generic:{title:"Nothing here yet",sub:"Data will appear here once available."}};function f({variant:a,size:c}){let d={width:c,height:c},e={fill:"none",stroke:"currentColor",strokeWidth:1.25,strokeLinecap:"round",strokeLinejoin:"round"};switch(a){case"nodes":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"14",r:"4"}),(0,b.jsx)("circle",{cx:"14",cy:"44",r:"4"}),(0,b.jsx)("circle",{cx:"50",cy:"44",r:"4"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"14",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"32",y1:"18",x2:"50",y2:"40",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("line",{x1:"18",y1:"44",x2:"46",y2:"44",strokeDasharray:"3 3",opacity:"0.6"})]})});case"tasks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("rect",{x:"14",y:"14",width:"36",height:"6",rx:"1.5"}),(0,b.jsx)("rect",{x:"14",y:"26",width:"36",height:"6",rx:"1.5",opacity:"0.6"}),(0,b.jsx)("rect",{x:"14",y:"38",width:"36",height:"6",rx:"1.5",opacity:"0.35"})]})});case"messages":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z"}),(0,b.jsx)("line",{x1:"22",y1:"28",x2:"42",y2:"28",opacity:"0.5"}),(0,b.jsx)("line",{x1:"22",y1:"34",x2:"36",y2:"34",opacity:"0.5"})]})});case"logs":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("path",{d:"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z"}),(0,b.jsx)("path",{d:"M40 12 v8 h8",opacity:"0.6"}),(0,b.jsx)("line",{x1:"24",y1:"32",x2:"40",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"24",y1:"38",x2:"40",y2:"38",opacity:"0.4"}),(0,b.jsx)("line",{x1:"24",y1:"44",x2:"34",y2:"44",opacity:"0.25"})]})});case"tokens":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"22",cy:"32",r:"8"}),(0,b.jsx)("line",{x1:"30",y1:"32",x2:"54",y2:"32"}),(0,b.jsx)("line",{x1:"44",y1:"32",x2:"44",y2:"38"}),(0,b.jsx)("line",{x1:"50",y1:"32",x2:"50",y2:"40"})]})});case"networks":return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"18"}),(0,b.jsx)("ellipse",{cx:"32",cy:"32",rx:"18",ry:"9",opacity:"0.55"}),(0,b.jsx)("line",{x1:"14",y1:"32",x2:"50",y2:"32",opacity:"0.55"}),(0,b.jsx)("line",{x1:"32",y1:"14",x2:"32",y2:"50",opacity:"0.55"})]})});default:return(0,b.jsx)("svg",{viewBox:"0 0 64 64",...d,children:(0,b.jsxs)("g",{...e,children:[(0,b.jsx)("circle",{cx:"32",cy:"32",r:"14",strokeDasharray:"3 3",opacity:"0.6"}),(0,b.jsx)("circle",{cx:"32",cy:"32",r:"3"})]})})}}function g({variant:a="generic",title:c,sub:h,cta:i,compact:j=!1}){let k=e[a],l=c??k.title,m=h??k.sub;return(0,b.jsxs)("div",{className:`text-center ${j?"py-8":"py-16"} px-4`,role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)(f,{variant:a,size:j?40:56})}),(0,b.jsx)("h3",{className:`font-medium text-gray-300 ${j?"text-sm":"text-base"}`,children:l}),m&&(0,b.jsx)("p",{className:`text-gray-500 ${j?"text-xs mt-1.5":"text-sm mt-2"} max-w-md mx-auto leading-relaxed`,children:m}),i&&(0,b.jsx)("div",{className:"mt-4",children:i.href?(0,b.jsxs)(d.default,{href:i.href,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]}):(0,b.jsxs)("button",{onClick:i.onClick,className:"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300",children:[i.label,(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})}function h({children:a}){return(0,b.jsx)("div",{className:"max-w-2xl mx-auto rounded-xl border border-[#26262b] bg-[#161618] shadow-lg shadow-black/20",children:a})}function i({cmd:a}){let[d,e]=(0,c.useState)(!1),f=async()=>{try{await navigator.clipboard.writeText(a),e(!0),setTimeout(()=>e(!1),1800)}catch{}};return(0,b.jsxs)("div",{className:"anet-empty-cmd flex items-start sm:items-center gap-2 bg-[#0e0e10] border border-[#26262b] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm",children:[(0,b.jsx)("code",{className:"text-cyan-300 font-mono select-all min-w-0 break-all sm:break-normal",children:a}),(0,b.jsx)("button",{type:"button",onClick:f,"aria-label":d?"Copied":"Copy command",className:"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1c1c1f] transition-colors",children:d?(0,b.jsxs)("span",{className:"flex items-center gap-1 text-green-400",children:[(0,b.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,b.jsx)("path",{d:"M20 6 9 17l-5-5"})}),"Copied"]}):(0,b.jsxs)("span",{className:"flex items-center gap-1",children:[(0,b.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,b.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Copy"]})})]})}a.s(["EmptyState",0,g,"NodesEmptyState",0,function({hint:a,taskHistoryCount:c=0}){return a?.global_count?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents in this network",sub:`Server has ${a.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`})}):c>0?(0,b.jsx)(h,{children:(0,b.jsx)(g,{variant:"nodes",title:"No agents online",sub:`Every agent in this network is currently offline. ${c.toLocaleString()} task${1===c?"":"s"} in history — they may have finished their work or disconnected.`,cta:{label:"View task history",href:"/tasks"}})}):(0,b.jsx)(h,{children:(0,b.jsxs)("div",{className:"text-center py-16 px-4",role:"status",children:[(0,b.jsx)("div",{className:"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500","aria-hidden":!0,children:(0,b.jsx)("svg",{viewBox:"0 0 64 64",width:56,height:56,children:(0,b.jsxs)("g",{stroke:"currentColor",strokeWidth:"1.5",fill:"none",children:[(0,b.jsx)("rect",{x:"10",y:"20",width:"44",height:"28",rx:"2"}),(0,b.jsx)("rect",{x:"20",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"32",y:"32",width:"6",height:"8",opacity:"0.5"}),(0,b.jsx)("rect",{x:"44",y:"32",width:"4",height:"8",opacity:"0.5"}),(0,b.jsx)("line",{x1:"10",y1:"26",x2:"54",y2:"26",opacity:"0.4"}),(0,b.jsx)("circle",{cx:"14",cy:"23",r:"0.8",fill:"currentColor"})]})})}),(0,b.jsx)("h3",{className:"font-medium text-gray-300 text-base",children:"Spin up your first agent"}),(0,b.jsx)("p",{className:"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed",children:"Run this in a fresh terminal to register an agent with this CommHub:"}),(0,b.jsx)("div",{className:"mt-4 inline-block",children:(0,b.jsx)(i,{cmd:"npx --yes @sleep2agi/agent-network init"})}),(0,b.jsx)("p",{className:"text-gray-600 text-xs mt-3 max-w-md mx-auto",children:"Once the agent connects, it appears here automatically within a few seconds — no refresh needed."}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsxs)("a",{href:"https://anet.sh",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300",children:["Full quickstart guide",(0,b.jsx)("span",{"aria-hidden":!0,children:"→"})]})})]})})}])},52010,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(50944),f=a.i(53142);let g=[{key:"",label:"All"},{key:"pool",label:"需求池"},{key:"doing",label:"进行中"},{key:"done",label:"完成"},{key:"abandoned",label:"已放弃"}],h={pool:"bg-amber-500/10 text-amber-300 border-amber-500/20",doing:"bg-blue-500/10 text-blue-300 border-blue-500/20",done:"bg-emerald-500/10 text-emerald-300 border-emerald-500/20",abandoned:"bg-gray-500/10 text-gray-400 border-gray-500/20"};function i(){let a=(0,e.useRouter)(),i=(0,e.useSearchParams)(),[j,k]=(0,c.useState)([]),[l,m]=(0,c.useState)(!0),[n,o]=(0,c.useState)(""),[p,q]=(0,c.useState)(!1),[r,s]=(0,c.useState)(null),[t,u]=(0,c.useState)(!1),v=i.get("status")||"",w=i.get("tag")||"",x=i.get("q")||"",[y,z]=(0,c.useState)(w),[A,B]=(0,c.useState)(x),C=(0,c.useCallback)(b=>{let c=new URLSearchParams(i.toString());for(let[a,d]of Object.entries(b))d?c.set(a,d):c.delete(a);let d=c.toString();a.replace(d?`/requirements?${d}`:"/requirements",{scroll:!1})},[a,i]),D=(0,c.useCallback)(async(a={})=>{let b=a.cursor??null,c=!0===a.append;m(!0),o("");try{let a=new URLSearchParams;v&&a.set("status",v),w&&a.set("tag",w),x&&a.set("q",x),a.set("limit","200"),b&&a.set("cursor",b);let d=await fetch(`/api/hub/requirements?${a.toString()}`,{cache:"no-store"});if(401===d.status){q(!0),c||k([]);return}let e=await d.json();if(!d.ok||!e.ok){o(e?.error||`hub_${d.status}`),c||k([]);return}q(!1);let f=e.requirements||[];k(a=>c?[...a,...f]:f),s("string"==typeof e.next_cursor?e.next_cursor:null),u(!0===e.has_more&&"string"==typeof e.next_cursor)}catch(a){o(a instanceof Error?a.message:"fetch failed"),c||k([])}finally{m(!1)}},[v,w,x]);(0,c.useEffect)(()=>{D()},[D]);let E=(0,c.useMemo)(()=>{let a={};for(let b of j)a[b.column]=(a[b.column]||0)+1;return a},[j]);return(0,b.jsx)("div",{className:"min-h-screen bg-[var(--bg)] text-gray-200",children:(0,b.jsxs)("div",{className:"mx-auto max-w-6xl px-4 py-6 sm:px-6",children:[(0,b.jsxs)("div",{className:"mb-5 flex flex-wrap items-end justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-lg font-semibold text-white",children:"Requirements"}),(0,b.jsxs)("p",{className:"mt-1 text-xs text-gray-500",children:["需求池 / 进行中 / 完成 —— 只读视图(写面见 #1634)。任务派单在 ",(0,b.jsx)(d.default,{href:"/tasks",className:"text-blue-400 hover:underline",children:"Tasks"}),"。"]})]}),(0,b.jsx)("button",{type:"button",onClick:()=>D(),className:"rounded-lg border border-[var(--border)] px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200",children:"Refresh"})]}),(0,b.jsx)("div",{className:"mb-4 flex flex-wrap items-center gap-1.5",children:g.map(a=>{let c=a.key?E[a.key]||0:j.length,d=v===a.key;return(0,b.jsxs)("button",{type:"button",onClick:()=>C({status:a.key}),className:`rounded-md border px-3 py-1.5 text-xs transition-colors ${d?"border-blue-500/30 bg-blue-500/10 text-blue-300":"border-transparent text-gray-500 hover:bg-[var(--border)]/60 hover:text-gray-300"}`,children:[a.label,(0,b.jsx)("span",{className:"ml-1.5 text-[10px] tabular-nums opacity-70",children:c})]},a.key||"all")})}),(0,b.jsxs)("div",{className:"mb-4 flex flex-wrap items-center gap-2",children:[(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"Search"}),(0,b.jsx)("input",{value:A,onChange:a=>B(a.target.value),onKeyDown:a=>{"Enter"===a.key&&C({q:A})},onBlur:()=>{A!==x&&C({q:A})},placeholder:"标题 / 人 / 标签",className:"w-40 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none sm:w-56"})]}),(0,b.jsxs)("div",{className:"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40",children:[(0,b.jsx)("span",{className:"text-[10px] uppercase tracking-wide text-gray-600",children:"Tag"}),(0,b.jsx)("input",{value:y,onChange:a=>z(a.target.value),onKeyDown:a=>{"Enter"===a.key&&C({tag:y})},onBlur:()=>{y!==w&&C({tag:y})},placeholder:"exact tag",className:"w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none"})]}),(v||w||x)&&(0,b.jsx)("button",{type:"button",onClick:()=>{z(""),B(""),C({status:"",tag:"",q:""})},className:"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:border-gray-600 hover:text-gray-200",children:"Clear filters"})]}),p&&(0,b.jsxs)("div",{className:"mb-4 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-300",children:["会话已过期,",(0,b.jsx)(d.default,{href:"/login",className:"underline",children:"重新登录"})," 后再看需求。"]}),n&&!p&&(0,b.jsxs)("div",{className:"mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-3 text-sm text-red-300",children:["读取失败:",n,(0,b.jsx)("button",{type:"button",onClick:()=>D(),className:"ml-3 underline",children:"重试"})]}),l?(0,b.jsx)("div",{className:"space-y-2",children:Array.from({length:8}).map((a,c)=>(0,b.jsx)("div",{className:"h-12 animate-pulse rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)]"},c))}):0===j.length?(0,b.jsx)(f.EmptyState,{variant:"generic",title:v||w||x?"没有符合筛选的需求":"需求池是空的",sub:v||w||x?"清掉筛选再试,或换一个标签。":"客户端建一条需求后,这里就会出现。",cta:v||w||x?{label:"清空筛选",onClick:()=>C({status:"",tag:"",q:""})}:void 0}):(0,b.jsx)("ul",{className:"divide-y divide-[var(--border)] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)]",children:j.map(a=>{var c,e;let f=a.checklist_count,g=a.children;return(0,b.jsx)("li",{className:"hover:bg-[var(--bg-secondary)]/60",children:(0,b.jsxs)(d.default,{href:`/requirements/${a.id}`,className:"flex flex-wrap items-center gap-x-3 gap-y-1.5 px-3 py-2.5 sm:px-4",children:[(0,b.jsxs)("span",{className:"w-12 shrink-0 text-[11px] tabular-nums text-gray-600",children:["#",a.seq]}),(0,b.jsx)("span",{className:`shrink-0 rounded border px-1.5 py-0.5 text-[10px] ${h[a.column]||h.abandoned}`,children:a.column}),(0,b.jsx)("span",{className:"min-w-0 flex-1 truncate text-sm text-gray-100",children:a.name}),(a.tags||[]).slice(0,3).map(a=>(0,b.jsx)("span",{className:"hidden shrink-0 rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-[10px] text-gray-400 sm:inline",children:a},a)),(0,b.jsx)("span",{className:`shrink-0 text-[11px] ${"high"===(c=a.priority)?"text-red-400":"low"===c||"lowest"===c?"text-gray-600":"text-gray-400"}`,children:a.priority}),(0,b.jsx)("span",{className:"hidden w-24 shrink-0 truncate text-[11px] text-gray-500 sm:inline",children:(e=a.agent_owner)?e.alias||e.id:"—"}),(0,b.jsx)("span",{className:"w-20 shrink-0 text-right text-[11px]",children:function(a){if(!a)return"—";let c=a.slice(0,10);return c<new Date().toISOString().slice(0,10)?(0,b.jsx)("span",{className:"text-red-400",children:c}):(0,b.jsx)("span",{className:"text-gray-400",children:c})}(a.due)}),f&&f.total>0&&(0,b.jsxs)("span",{className:"hidden shrink-0 text-[10px] tabular-nums text-gray-500 sm:inline",children:["✓ ",f.done,"/",f.total]}),g&&g.total>0&&(0,b.jsxs)("span",{className:"hidden shrink-0 text-[10px] tabular-nums text-gray-500 md:inline",children:["↳ ",g.done,"/",g.total]})]})},a.id)})}),t&&(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>D({cursor:r,append:!0}),className:"mx-auto mt-4 block rounded-lg border border-[var(--border)] px-4 py-2 text-xs text-gray-400 hover:text-gray-200 disabled:opacity-50",children:l?"加载中…":"加载更多"})]})})}a.s(["default",0,function(){return(0,b.jsx)(c.Suspense,{fallback:(0,b.jsx)("div",{className:"min-h-screen bg-[var(--bg)]"}),children:(0,b.jsx)(i,{})})}])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=app_099f0wg._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../app/components/EmptyState.tsx","../../../../app/requirements/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\n\nexport type EmptyVariant = 'nodes' | 'tasks' | 'messages' | 'logs' | 'tokens' | 'networks' | 'generic';\n\ninterface EmptyStateProps {\n /** Picks the icon glyph and default copy if title/sub omitted. */\n variant?: EmptyVariant;\n /** Optional override headline. */\n title?: string;\n /** Optional override sub-copy. */\n sub?: string;\n /** Optional CTA: text + href (internal) or onClick. */\n cta?: { label: string; href?: string; onClick?: () => void };\n /** Compact mode for in-card empty states (smaller padding). */\n compact?: boolean;\n}\n\nconst DEFAULTS: Record<EmptyVariant, { title: string; sub: string }> = {\n nodes: { title: 'No agents in this network', sub: 'Agent sessions will appear here once they connect to the CommHub.' },\n tasks: { title: 'No tasks yet', sub: 'Tasks will appear here when agents send them via CommHub.' },\n messages: { title: 'No messages', sub: 'Messages between agents will appear here.' },\n logs: { title: 'No audit logs', sub: 'Events will appear here when users register, login, or perform actions.' },\n tokens: { title: 'No API tokens', sub: 'Create one to authenticate CLI tools and external integrations.' },\n networks: { title: 'No networks found', sub: 'Create one or sign in with V3 auth to see your networks.' },\n generic: { title: 'Nothing here yet', sub: 'Data will appear here once available.' },\n};\n\n/**\n * Minimal monochrome SVG glyphs per variant. No filled shapes, no gradients,\n * no AI-decoration — just thin-stroke line art that fades into the page.\n * 64×64 viewBox; rendered at 56×56 (compact 40×40).\n */\nfunction Glyph({ variant, size }: { variant: EmptyVariant; size: number }) {\n const s = { width: size, height: size };\n const baseProps = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.25,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n\n switch (variant) {\n case 'nodes':\n // Mesh with dashed edges = \"nodes will land here\"\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"14\" r=\"4\" />\n <circle cx=\"14\" cy=\"44\" r=\"4\" />\n <circle cx=\"50\" cy=\"44\" r=\"4\" />\n <line x1=\"32\" y1=\"18\" x2=\"14\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"32\" y1=\"18\" x2=\"50\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"18\" y1=\"44\" x2=\"46\" y2=\"44\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n </g>\n </svg>\n );\n case 'tasks':\n // Empty checkbox list\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <rect x=\"14\" y=\"14\" width=\"36\" height=\"6\" rx=\"1.5\" />\n <rect x=\"14\" y=\"26\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.6\" />\n <rect x=\"14\" y=\"38\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.35\" />\n </g>\n </svg>\n );\n case 'messages':\n // Speech bubble outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <path d=\"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z\" />\n <line x1=\"22\" y1=\"28\" x2=\"42\" y2=\"28\" opacity=\"0.5\" />\n <line x1=\"22\" y1=\"34\" x2=\"36\" y2=\"34\" opacity=\"0.5\" />\n </g>\n </svg>\n );\n case 'logs':\n // Document with lines\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <path d=\"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z\" />\n <path d=\"M40 12 v8 h8\" opacity=\"0.6\" />\n <line x1=\"24\" y1=\"32\" x2=\"40\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"24\" y1=\"38\" x2=\"40\" y2=\"38\" opacity=\"0.4\" />\n <line x1=\"24\" y1=\"44\" x2=\"34\" y2=\"44\" opacity=\"0.25\" />\n </g>\n </svg>\n );\n case 'tokens':\n // Key outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"22\" cy=\"32\" r=\"8\" />\n <line x1=\"30\" y1=\"32\" x2=\"54\" y2=\"32\" />\n <line x1=\"44\" y1=\"32\" x2=\"44\" y2=\"38\" />\n <line x1=\"50\" y1=\"32\" x2=\"50\" y2=\"40\" />\n </g>\n </svg>\n );\n case 'networks':\n // Globe-ish concentric ovals\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"18\" />\n <ellipse cx=\"32\" cy=\"32\" rx=\"18\" ry=\"9\" opacity=\"0.55\" />\n <line x1=\"14\" y1=\"32\" x2=\"50\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"32\" y1=\"14\" x2=\"32\" y2=\"50\" opacity=\"0.55\" />\n </g>\n </svg>\n );\n case 'generic':\n default:\n // Soft sparkle outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"14\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <circle cx=\"32\" cy=\"32\" r=\"3\" />\n </g>\n </svg>\n );\n }\n}\n\nexport function EmptyState({ variant = 'generic', title, sub, cta, compact = false }: EmptyStateProps) {\n const d = DEFAULTS[variant];\n const headline = title ?? d.title;\n const subcopy = sub ?? d.sub;\n const iconSize = compact ? 40 : 56;\n\n return (\n <div className={`text-center ${compact ? 'py-8' : 'py-16'} px-4`} role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <Glyph variant={variant} size={iconSize} />\n </div>\n <h3 className={`font-medium text-gray-300 ${compact ? 'text-sm' : 'text-base'}`}>{headline}</h3>\n {subcopy && (\n <p className={`text-gray-500 ${compact ? 'text-xs mt-1.5' : 'text-sm mt-2'} max-w-md mx-auto leading-relaxed`}>\n {subcopy}\n </p>\n )}\n {cta && (\n <div className=\"mt-4\">\n {cta.href ? (\n <Link href={cta.href} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </Link>\n ) : (\n <button onClick={cta.onClick} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Round 105 (issue #90): centered card shell so the Overview empty state\n * reads as an intentional, layout-aligned card instead of bare text\n * floating in the content column. */\nfunction EmptyCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"max-w-2xl mx-auto rounded-xl border border-[#26262b] bg-[#161618] shadow-lg shadow-black/20\">\n {children}\n </div>\n );\n}\n\n/**\n * Overview-specific variant. Three cases:\n * 1. network-mismatch — agents exist globally, none in this network\n * 2. agents-offline — 0 registered now BUT task history exists, so this\n * is NOT a first run (round 105 / issue #90: showing \"Spin up your\n * first agent\" next to \"acked: 499\" was misleading)\n * 3. true first-run — 0 agents, 0 history → quickstart command\n */\nexport function NodesEmptyState({\n hint,\n taskHistoryCount = 0,\n}: {\n hint?: { global_count?: number; filtered_network?: string };\n taskHistoryCount?: number;\n}) {\n if (hint?.global_count) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents in this network\"\n sub={`Server has ${hint.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}\n />\n </EmptyCard>\n );\n }\n\n // Round 105 (issue #90): there's task history but no agents online right\n // now — they finished or disconnected. Don't pitch a first-run setup;\n // point at the history instead.\n if (taskHistoryCount > 0) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents online\"\n sub={`Every agent in this network is currently offline. ${taskHistoryCount.toLocaleString()} task${taskHistoryCount === 1 ? '' : 's'} in history — they may have finished their work or disconnected.`}\n cta={{ label: 'View task history', href: '/tasks' }}\n />\n </EmptyCard>\n );\n }\n\n // Round 52: true empty state (zero agents anywhere) — show the\n // quickstart command inline so users don't have to leave the dashboard\n // to figure out how to spin up their first agent.\n return (\n <EmptyCard>\n <div className=\"text-center py-16 px-4\" role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <svg viewBox=\"0 0 64 64\" width={56} height={56}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\">\n <rect x=\"10\" y=\"20\" width=\"44\" height=\"28\" rx=\"2\" />\n <rect x=\"20\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"32\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"44\" y=\"32\" width=\"4\" height=\"8\" opacity=\"0.5\" />\n <line x1=\"10\" y1=\"26\" x2=\"54\" y2=\"26\" opacity=\"0.4\" />\n <circle cx=\"14\" cy=\"23\" r=\"0.8\" fill=\"currentColor\" />\n </g>\n </svg>\n </div>\n <h3 className=\"font-medium text-gray-300 text-base\">Spin up your first agent</h3>\n <p className=\"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed\">\n Run this in a fresh terminal to register an agent with this CommHub:\n </p>\n <div className=\"mt-4 inline-block\">\n <QuickstartCommand cmd=\"npx --yes @sleep2agi/agent-network init\" />\n </div>\n {/* #214 F6: expectation management — without this line, users\n copy the command and stare at an empty screen not knowing\n what to wait for. The page polls every 5s, so the node\n really does appear by itself. */}\n <p className=\"text-gray-600 text-xs mt-3 max-w-md mx-auto\">\n Once the agent connects, it appears here automatically within a\n few seconds — no refresh needed.\n </p>\n <div className=\"mt-3\">\n <a\n href=\"https://anet.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300\"\n >\n Full quickstart guide\n <span aria-hidden>→</span>\n </a>\n </div>\n </div>\n </EmptyCard>\n );\n}\n\n/** Code block + inline copy button used by the empty-Overview first-run\n * CTA. State lives here so the parent stays stateless. */\nfunction QuickstartCommand({ cmd }: { cmd: string }) {\n const [copied, setCopied] = useState(false);\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(cmd);\n setCopied(true);\n setTimeout(() => setCopied(false), 1800);\n } catch {}\n };\n return (\n <div className=\"anet-empty-cmd flex items-start sm:items-center gap-2 bg-[#0e0e10] border border-[#26262b] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm\">\n {/* #209 R44: long quickstart commands (e.g. the `npm install -g …`\n variant) overflowed the empty-state card horizontally on phones\n because <code> defaults to white-space:pre. break-all on mobile\n lets them wrap inside the box; sm: up restores normal wrapping\n so desktop monospace lines stay clean. items-start on phones\n aligns the Copy button to the top so a wrapped 2-line command\n doesn't bottom-anchor the button. */}\n <code className=\"text-cyan-300 font-mono select-all min-w-0 break-all sm:break-normal\">{cmd}</code>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? 'Copied' : 'Copy command'}\n className=\"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1c1c1f] transition-colors\"\n >\n {copied ? (\n <span className=\"flex items-center gap-1 text-green-400\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n Copied\n </span>\n ) : (\n <span className=\"flex items-center gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n Copy\n </span>\n )}\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState, Suspense } from 'react';\nimport Link from 'next/link';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport { EmptyState } from '../components/EmptyState';\n\n/**\n * Requirements board — #1633 (read-only first slice).\n *\n * Why this page exists: the dashboard only ever showed dispatch tasks\n * (/tasks = who asked whom). The requirement board — 需求池 / 进行中 /\n * 完成, tags, owner vs agent owner, checklist progress — is what people\n * actually work from in the client. This is the read half; the write half\n * is #1634.\n */\n\ninterface RequirementPerson { kind: 'user' | 'node'; id: string; alias?: string }\ninterface Requirement {\n id: string;\n seq: number;\n name: string;\n column: 'pool' | 'doing' | 'done' | 'abandoned';\n priority: 'high' | 'normal' | 'low' | 'lowest';\n due?: string;\n tags?: string[];\n owner?: RequirementPerson | null;\n agent_owner?: RequirementPerson | null;\n project_id?: string | null;\n checklist_count?: { total: number; done: number };\n children?: { total: number; done: number };\n updatedAt?: string;\n has_description?: boolean;\n}\n\nconst COLUMNS: { key: Requirement['column'] | ''; label: string }[] = [\n { key: '', label: 'All' },\n { key: 'pool', label: '需求池' },\n { key: 'doing', label: '进行中' },\n { key: 'done', label: '完成' },\n { key: 'abandoned', label: '已放弃' },\n];\n\nconst COLUMN_CHIP: Record<string, string> = {\n pool: 'bg-amber-500/10 text-amber-300 border-amber-500/20',\n doing: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n done: 'bg-emerald-500/10 text-emerald-300 border-emerald-500/20',\n abandoned: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n};\n\nfunction priorityClass(priority: string) {\n if (priority === 'high') return 'text-red-400';\n if (priority === 'low' || priority === 'lowest') return 'text-gray-600';\n return 'text-gray-400';\n}\n\nfunction personLabel(p?: RequirementPerson | null) {\n if (!p) return '—';\n return p.alias || p.id;\n}\n\nfunction dueLabel(due?: string) {\n if (!due) return '—';\n const day = due.slice(0, 10);\n const overdue = day < new Date().toISOString().slice(0, 10);\n return overdue ? <span className=\"text-red-400\">{day}</span> : <span className=\"text-gray-400\">{day}</span>;\n}\n\nfunction RequirementsContent() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [rows, setRows] = useState<Requirement[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [needsLogin, setNeedsLogin] = useState(false);\n\n const status = searchParams.get('status') || '';\n const tag = searchParams.get('tag') || '';\n const q = searchParams.get('q') || '';\n const [tagInput, setTagInput] = useState(tag);\n const [qInput, setQInput] = useState(q);\n\n const setParam = useCallback((patch: Record<string, string>) => {\n const next = new URLSearchParams(searchParams.toString());\n for (const [key, value] of Object.entries(patch)) {\n if (value) next.set(key, value);\n else next.delete(key);\n }\n const qs = next.toString();\n router.replace(qs ? `/requirements?${qs}` : '/requirements', { scroll: false });\n }, [router, searchParams]);\n\n const load = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const params = new URLSearchParams();\n if (status) params.set('status', status);\n if (tag) params.set('tag', tag);\n if (q) params.set('q', q);\n params.set('limit', '200');\n const res = await fetch(`/api/hub/requirements?${params.toString()}`, { cache: 'no-store' });\n if (res.status === 401) { setNeedsLogin(true); setRows([]); return; }\n const data = await res.json();\n if (!res.ok || !data.ok) {\n setError(data?.error || `hub_${res.status}`);\n setRows([]);\n return;\n }\n setNeedsLogin(false);\n setRows(data.requirements || []);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [status, tag, q]);\n\n useEffect(() => { load(); }, [load]);\n\n const counts = useMemo(() => {\n const out: Record<string, number> = {};\n for (const r of rows) out[r.column] = (out[r.column] || 0) + 1;\n return out;\n }, [rows]);\n\n return (\n <div className=\"min-h-screen bg-[var(--bg)] text-gray-200\">\n <div className=\"mx-auto max-w-6xl px-4 py-6 sm:px-6\">\n <div className=\"mb-5 flex flex-wrap items-end justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold text-white\">Requirements</h1>\n <p className=\"mt-1 text-xs text-gray-500\">\n 需求池 / 进行中 / 完成 —— 只读视图(写面见 #1634)。任务派单在 <Link href=\"/tasks\" className=\"text-blue-400 hover:underline\">Tasks</Link>。\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => load()}\n className=\"rounded-lg border border-[var(--border)] px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Refresh\n </button>\n </div>\n\n {/* Status tabs */}\n <div className=\"mb-4 flex flex-wrap items-center gap-1.5\">\n {COLUMNS.map(col => {\n const count = col.key ? counts[col.key] || 0 : rows.length;\n const active = status === col.key;\n return (\n <button\n key={col.key || 'all'}\n type=\"button\"\n onClick={() => setParam({ status: col.key })}\n className={`rounded-md border px-3 py-1.5 text-xs transition-colors ${\n active\n ? 'border-blue-500/30 bg-blue-500/10 text-blue-300'\n : 'border-transparent text-gray-500 hover:bg-[var(--border)]/60 hover:text-gray-300'\n }`}\n >\n {col.label}\n <span className=\"ml-1.5 text-[10px] tabular-nums opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n\n {/* Text filters */}\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Search</span>\n <input\n value={qInput}\n onChange={e => setQInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ q: qInput }); }}\n onBlur={() => { if (qInput !== q) setParam({ q: qInput }); }}\n placeholder=\"标题 / 人 / 标签\"\n className=\"w-40 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none sm:w-56\"\n />\n </div>\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Tag</span>\n <input\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ tag: tagInput }); }}\n onBlur={() => { if (tagInput !== tag) setParam({ tag: tagInput }); }}\n placeholder=\"exact tag\"\n className=\"w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n {(status || tag || q) && (\n <button\n type=\"button\"\n onClick={() => { setTagInput(''); setQInput(''); setParam({ status: '', tag: '', q: '' }); }}\n className=\"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:border-gray-600 hover:text-gray-200\"\n >\n Clear filters\n </button>\n )}\n </div>\n\n {needsLogin && (\n <div className=\"mb-4 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-300\">\n 会话已过期,<Link href=\"/login\" className=\"underline\">重新登录</Link> 后再看需求。\n </div>\n )}\n {error && !needsLogin && (\n <div className=\"mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-3 text-sm text-red-300\">\n 读取失败:{error}\n <button type=\"button\" onClick={() => load()} className=\"ml-3 underline\">重试</button>\n </div>\n )}\n\n {loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"h-12 animate-pulse rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)]\" />\n ))}\n </div>\n ) : rows.length === 0 ? (\n <EmptyState\n variant=\"generic\"\n title={status || tag || q ? '没有符合筛选的需求' : '需求池是空的'}\n sub={status || tag || q ? '清掉筛选再试,或换一个标签。' : '客户端建一条需求后,这里就会出现。'}\n cta={status || tag || q ? { label: '清空筛选', onClick: () => setParam({ status: '', tag: '', q: '' }) } : undefined}\n />\n ) : (\n <ul className=\"divide-y divide-[var(--border)] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)]\">\n {rows.map(row => {\n const chk = row.checklist_count;\n const kids = row.children;\n return (\n <li key={row.id} className=\"hover:bg-[var(--bg-secondary)]/60\">\n <Link href={`/requirements/${row.id}`} className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 px-3 py-2.5 sm:px-4\">\n <span className=\"w-12 shrink-0 text-[11px] tabular-nums text-gray-600\">#{row.seq}</span>\n <span className={`shrink-0 rounded border px-1.5 py-0.5 text-[10px] ${COLUMN_CHIP[row.column] || COLUMN_CHIP.abandoned}`}>\n {row.column}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm text-gray-100\">{row.name}</span>\n {(row.tags || []).slice(0, 3).map(t => (\n <span key={t} className=\"hidden shrink-0 rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-[10px] text-gray-400 sm:inline\">\n {t}\n </span>\n ))}\n <span className={`shrink-0 text-[11px] ${priorityClass(row.priority)}`}>{row.priority}</span>\n <span className=\"hidden w-24 shrink-0 truncate text-[11px] text-gray-500 sm:inline\">{personLabel(row.agent_owner)}</span>\n <span className=\"w-20 shrink-0 text-right text-[11px]\">{dueLabel(row.due)}</span>\n {chk && chk.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 sm:inline\">\n ✓ {chk.done}/{chk.total}\n </span>\n )}\n {kids && kids.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 md:inline\">\n ↳ {kids.done}/{kids.total}\n </span>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n );\n}\n\nexport default function RequirementsPage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[var(--bg)]\" />}>\n <RequirementsContent />\n </Suspense>\n );\n}\n"],"names":["DEFAULTS","nodes","title","sub","tasks","messages","logs","tokens","networks","generic","Glyph","variant","size","s","width","height","baseProps","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","viewBox","cx","cy","r","x1","y1","x2","y2","strokeDasharray","opacity","x","y","rx","d","ry","EmptyState","cta","compact","headline","subcopy","iconSize","className","role","href","label","onClick","EmptyCard","children","NodesEmptyState","hint","taskHistoryCount","global_count","toLocaleString","QuickstartCommand","cmd","target","rel","copied","setCopied","onCopy","navigator","clipboard","writeText","setTimeout","type","COLUMNS","key","COLUMN_CHIP","pool","doing","done","abandoned","priorityClass","priority","personLabel","p","alias","id","dueLabel","due","day","slice","overdue","Date","toISOString","RequirementsContent","router","searchParams","rows","setRows","loading","setLoading","error","setError","needsLogin","setNeedsLogin","status","get","tag","q","tagInput","setTagInput","qInput","setQInput","setParam","patch","next","URLSearchParams","toString","value","Object","entries","set","delete","qs","replace","scroll","load","params","res","fetch","cache","data","json","ok","requirements","e","Error","message","counts","out","column","map","col","count","length","active","onChange","onKeyDown","onBlur","placeholder","Array","from","_","i","undefined","row","chk","checklist_count","kids","seq","name","tags","t","agent_owner","total","RequirementsPage","fallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../app/components/EmptyState.tsx","../../../../app/requirements/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\n\nexport type EmptyVariant = 'nodes' | 'tasks' | 'messages' | 'logs' | 'tokens' | 'networks' | 'generic';\n\ninterface EmptyStateProps {\n /** Picks the icon glyph and default copy if title/sub omitted. */\n variant?: EmptyVariant;\n /** Optional override headline. */\n title?: string;\n /** Optional override sub-copy. */\n sub?: string;\n /** Optional CTA: text + href (internal) or onClick. */\n cta?: { label: string; href?: string; onClick?: () => void };\n /** Compact mode for in-card empty states (smaller padding). */\n compact?: boolean;\n}\n\nconst DEFAULTS: Record<EmptyVariant, { title: string; sub: string }> = {\n nodes: { title: 'No agents in this network', sub: 'Agent sessions will appear here once they connect to the CommHub.' },\n tasks: { title: 'No tasks yet', sub: 'Tasks will appear here when agents send them via CommHub.' },\n messages: { title: 'No messages', sub: 'Messages between agents will appear here.' },\n logs: { title: 'No audit logs', sub: 'Events will appear here when users register, login, or perform actions.' },\n tokens: { title: 'No API tokens', sub: 'Create one to authenticate CLI tools and external integrations.' },\n networks: { title: 'No networks found', sub: 'Create one or sign in with V3 auth to see your networks.' },\n generic: { title: 'Nothing here yet', sub: 'Data will appear here once available.' },\n};\n\n/**\n * Minimal monochrome SVG glyphs per variant. No filled shapes, no gradients,\n * no AI-decoration — just thin-stroke line art that fades into the page.\n * 64×64 viewBox; rendered at 56×56 (compact 40×40).\n */\nfunction Glyph({ variant, size }: { variant: EmptyVariant; size: number }) {\n const s = { width: size, height: size };\n const baseProps = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.25,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n\n switch (variant) {\n case 'nodes':\n // Mesh with dashed edges = \"nodes will land here\"\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"14\" r=\"4\" />\n <circle cx=\"14\" cy=\"44\" r=\"4\" />\n <circle cx=\"50\" cy=\"44\" r=\"4\" />\n <line x1=\"32\" y1=\"18\" x2=\"14\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"32\" y1=\"18\" x2=\"50\" y2=\"40\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <line x1=\"18\" y1=\"44\" x2=\"46\" y2=\"44\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n </g>\n </svg>\n );\n case 'tasks':\n // Empty checkbox list\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <rect x=\"14\" y=\"14\" width=\"36\" height=\"6\" rx=\"1.5\" />\n <rect x=\"14\" y=\"26\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.6\" />\n <rect x=\"14\" y=\"38\" width=\"36\" height=\"6\" rx=\"1.5\" opacity=\"0.35\" />\n </g>\n </svg>\n );\n case 'messages':\n // Speech bubble outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <path d=\"M14 18 h36 a3 3 0 0 1 3 3 v18 a3 3 0 0 1 -3 3 h-18 l-8 6 v-6 h-10 a3 3 0 0 1 -3 -3 v-18 a3 3 0 0 1 3 -3 z\" />\n <line x1=\"22\" y1=\"28\" x2=\"42\" y2=\"28\" opacity=\"0.5\" />\n <line x1=\"22\" y1=\"34\" x2=\"36\" y2=\"34\" opacity=\"0.5\" />\n </g>\n </svg>\n );\n case 'logs':\n // Document with lines\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <path d=\"M18 12 h22 l8 8 v32 a2 2 0 0 1 -2 2 h-28 a2 2 0 0 1 -2 -2 v-38 a2 2 0 0 1 2 -2 z\" />\n <path d=\"M40 12 v8 h8\" opacity=\"0.6\" />\n <line x1=\"24\" y1=\"32\" x2=\"40\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"24\" y1=\"38\" x2=\"40\" y2=\"38\" opacity=\"0.4\" />\n <line x1=\"24\" y1=\"44\" x2=\"34\" y2=\"44\" opacity=\"0.25\" />\n </g>\n </svg>\n );\n case 'tokens':\n // Key outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"22\" cy=\"32\" r=\"8\" />\n <line x1=\"30\" y1=\"32\" x2=\"54\" y2=\"32\" />\n <line x1=\"44\" y1=\"32\" x2=\"44\" y2=\"38\" />\n <line x1=\"50\" y1=\"32\" x2=\"50\" y2=\"40\" />\n </g>\n </svg>\n );\n case 'networks':\n // Globe-ish concentric ovals\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"18\" />\n <ellipse cx=\"32\" cy=\"32\" rx=\"18\" ry=\"9\" opacity=\"0.55\" />\n <line x1=\"14\" y1=\"32\" x2=\"50\" y2=\"32\" opacity=\"0.55\" />\n <line x1=\"32\" y1=\"14\" x2=\"32\" y2=\"50\" opacity=\"0.55\" />\n </g>\n </svg>\n );\n case 'generic':\n default:\n // Soft sparkle outline\n return (\n <svg viewBox=\"0 0 64 64\" {...s}>\n <g {...baseProps}>\n <circle cx=\"32\" cy=\"32\" r=\"14\" strokeDasharray=\"3 3\" opacity=\"0.6\" />\n <circle cx=\"32\" cy=\"32\" r=\"3\" />\n </g>\n </svg>\n );\n }\n}\n\nexport function EmptyState({ variant = 'generic', title, sub, cta, compact = false }: EmptyStateProps) {\n const d = DEFAULTS[variant];\n const headline = title ?? d.title;\n const subcopy = sub ?? d.sub;\n const iconSize = compact ? 40 : 56;\n\n return (\n <div className={`text-center ${compact ? 'py-8' : 'py-16'} px-4`} role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <Glyph variant={variant} size={iconSize} />\n </div>\n <h3 className={`font-medium text-gray-300 ${compact ? 'text-sm' : 'text-base'}`}>{headline}</h3>\n {subcopy && (\n <p className={`text-gray-500 ${compact ? 'text-xs mt-1.5' : 'text-sm mt-2'} max-w-md mx-auto leading-relaxed`}>\n {subcopy}\n </p>\n )}\n {cta && (\n <div className=\"mt-4\">\n {cta.href ? (\n <Link href={cta.href} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </Link>\n ) : (\n <button onClick={cta.onClick} className=\"inline-flex items-center gap-1.5 text-sm font-medium text-cyan-400 hover:text-cyan-300\">\n {cta.label}\n <span aria-hidden>→</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** Round 105 (issue #90): centered card shell so the Overview empty state\n * reads as an intentional, layout-aligned card instead of bare text\n * floating in the content column. */\nfunction EmptyCard({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"max-w-2xl mx-auto rounded-xl border border-[#26262b] bg-[#161618] shadow-lg shadow-black/20\">\n {children}\n </div>\n );\n}\n\n/**\n * Overview-specific variant. Three cases:\n * 1. network-mismatch — agents exist globally, none in this network\n * 2. agents-offline — 0 registered now BUT task history exists, so this\n * is NOT a first run (round 105 / issue #90: showing \"Spin up your\n * first agent\" next to \"acked: 499\" was misleading)\n * 3. true first-run — 0 agents, 0 history → quickstart command\n */\nexport function NodesEmptyState({\n hint,\n taskHistoryCount = 0,\n}: {\n hint?: { global_count?: number; filtered_network?: string };\n taskHistoryCount?: number;\n}) {\n if (hint?.global_count) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents in this network\"\n sub={`Server has ${hint.global_count} nodes globally, but none are registered to the current network. Switch network or contact admin.`}\n />\n </EmptyCard>\n );\n }\n\n // Round 105 (issue #90): there's task history but no agents online right\n // now — they finished or disconnected. Don't pitch a first-run setup;\n // point at the history instead.\n if (taskHistoryCount > 0) {\n return (\n <EmptyCard>\n <EmptyState\n variant=\"nodes\"\n title=\"No agents online\"\n sub={`Every agent in this network is currently offline. ${taskHistoryCount.toLocaleString()} task${taskHistoryCount === 1 ? '' : 's'} in history — they may have finished their work or disconnected.`}\n cta={{ label: 'View task history', href: '/tasks' }}\n />\n </EmptyCard>\n );\n }\n\n // Round 52: true empty state (zero agents anywhere) — show the\n // quickstart command inline so users don't have to leave the dashboard\n // to figure out how to spin up their first agent.\n return (\n <EmptyCard>\n <div className=\"text-center py-16 px-4\" role=\"status\">\n <div className=\"anet-empty-glyph inline-flex items-center justify-center mb-4 text-gray-500\" aria-hidden>\n <svg viewBox=\"0 0 64 64\" width={56} height={56}>\n <g stroke=\"currentColor\" strokeWidth=\"1.5\" fill=\"none\">\n <rect x=\"10\" y=\"20\" width=\"44\" height=\"28\" rx=\"2\" />\n <rect x=\"20\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"32\" y=\"32\" width=\"6\" height=\"8\" opacity=\"0.5\" />\n <rect x=\"44\" y=\"32\" width=\"4\" height=\"8\" opacity=\"0.5\" />\n <line x1=\"10\" y1=\"26\" x2=\"54\" y2=\"26\" opacity=\"0.4\" />\n <circle cx=\"14\" cy=\"23\" r=\"0.8\" fill=\"currentColor\" />\n </g>\n </svg>\n </div>\n <h3 className=\"font-medium text-gray-300 text-base\">Spin up your first agent</h3>\n <p className=\"text-gray-500 text-sm mt-2 max-w-md mx-auto leading-relaxed\">\n Run this in a fresh terminal to register an agent with this CommHub:\n </p>\n <div className=\"mt-4 inline-block\">\n <QuickstartCommand cmd=\"npx --yes @sleep2agi/agent-network init\" />\n </div>\n {/* #214 F6: expectation management — without this line, users\n copy the command and stare at an empty screen not knowing\n what to wait for. The page polls every 5s, so the node\n really does appear by itself. */}\n <p className=\"text-gray-600 text-xs mt-3 max-w-md mx-auto\">\n Once the agent connects, it appears here automatically within a\n few seconds — no refresh needed.\n </p>\n <div className=\"mt-3\">\n <a\n href=\"https://anet.sh\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-cyan-300\"\n >\n Full quickstart guide\n <span aria-hidden>→</span>\n </a>\n </div>\n </div>\n </EmptyCard>\n );\n}\n\n/** Code block + inline copy button used by the empty-Overview first-run\n * CTA. State lives here so the parent stays stateless. */\nfunction QuickstartCommand({ cmd }: { cmd: string }) {\n const [copied, setCopied] = useState(false);\n const onCopy = async () => {\n try {\n await navigator.clipboard.writeText(cmd);\n setCopied(true);\n setTimeout(() => setCopied(false), 1800);\n } catch {}\n };\n return (\n <div className=\"anet-empty-cmd flex items-start sm:items-center gap-2 bg-[#0e0e10] border border-[#26262b] rounded-lg pl-4 pr-1.5 py-1.5 text-xs sm:text-sm\">\n {/* #209 R44: long quickstart commands (e.g. the `npm install -g …`\n variant) overflowed the empty-state card horizontally on phones\n because <code> defaults to white-space:pre. break-all on mobile\n lets them wrap inside the box; sm: up restores normal wrapping\n so desktop monospace lines stay clean. items-start on phones\n aligns the Copy button to the top so a wrapped 2-line command\n doesn't bottom-anchor the button. */}\n <code className=\"text-cyan-300 font-mono select-all min-w-0 break-all sm:break-normal\">{cmd}</code>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? 'Copied' : 'Copy command'}\n className=\"shrink-0 rounded-md px-2 py-1.5 text-[11px] text-gray-500 hover:text-gray-200 hover:bg-[#1c1c1f] transition-colors\"\n >\n {copied ? (\n <span className=\"flex items-center gap-1 text-green-400\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n Copied\n </span>\n ) : (\n <span className=\"flex items-center gap-1\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n Copy\n </span>\n )}\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState, Suspense } from 'react';\nimport Link from 'next/link';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport { EmptyState } from '../components/EmptyState';\n\n/**\n * Requirements board — #1633 (read-only first slice).\n *\n * Why this page exists: the dashboard only ever showed dispatch tasks\n * (/tasks = who asked whom). The requirement board — 需求池 / 进行中 /\n * 完成, tags, owner vs agent owner, checklist progress — is what people\n * actually work from in the client. This is the read half; the write half\n * is #1634.\n */\n\ninterface RequirementPerson { kind: 'user' | 'node'; id: string; alias?: string }\ninterface Requirement {\n id: string;\n seq: number;\n name: string;\n column: 'pool' | 'doing' | 'done' | 'abandoned';\n priority: 'high' | 'normal' | 'low' | 'lowest';\n due?: string;\n tags?: string[];\n owner?: RequirementPerson | null;\n agent_owner?: RequirementPerson | null;\n project_id?: string | null;\n checklist_count?: { total: number; done: number };\n children?: { total: number; done: number };\n updatedAt?: string;\n has_description?: boolean;\n}\n\nconst COLUMNS: { key: Requirement['column'] | ''; label: string }[] = [\n { key: '', label: 'All' },\n { key: 'pool', label: '需求池' },\n { key: 'doing', label: '进行中' },\n { key: 'done', label: '完成' },\n { key: 'abandoned', label: '已放弃' },\n];\n\nconst COLUMN_CHIP: Record<string, string> = {\n pool: 'bg-amber-500/10 text-amber-300 border-amber-500/20',\n doing: 'bg-blue-500/10 text-blue-300 border-blue-500/20',\n done: 'bg-emerald-500/10 text-emerald-300 border-emerald-500/20',\n abandoned: 'bg-gray-500/10 text-gray-400 border-gray-500/20',\n};\n\nfunction priorityClass(priority: string) {\n if (priority === 'high') return 'text-red-400';\n if (priority === 'low' || priority === 'lowest') return 'text-gray-600';\n return 'text-gray-400';\n}\n\nfunction personLabel(p?: RequirementPerson | null) {\n if (!p) return '—';\n return p.alias || p.id;\n}\n\nfunction dueLabel(due?: string) {\n if (!due) return '—';\n const day = due.slice(0, 10);\n const overdue = day < new Date().toISOString().slice(0, 10);\n return overdue ? <span className=\"text-red-400\">{day}</span> : <span className=\"text-gray-400\">{day}</span>;\n}\n\nfunction RequirementsContent() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [rows, setRows] = useState<Requirement[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [needsLogin, setNeedsLogin] = useState(false);\n // #1633 follow-up: the list used to hard-stop at 200 rows with has_more ignored.\n const [cursor, setCursor] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n\n const status = searchParams.get('status') || '';\n const tag = searchParams.get('tag') || '';\n const q = searchParams.get('q') || '';\n const [tagInput, setTagInput] = useState(tag);\n const [qInput, setQInput] = useState(q);\n\n const setParam = useCallback((patch: Record<string, string>) => {\n const next = new URLSearchParams(searchParams.toString());\n for (const [key, value] of Object.entries(patch)) {\n if (value) next.set(key, value);\n else next.delete(key);\n }\n const qs = next.toString();\n router.replace(qs ? `/requirements?${qs}` : '/requirements', { scroll: false });\n }, [router, searchParams]);\n\n const load = useCallback(async (opts: { cursor?: string | null; append?: boolean } = {}) => {\n const nextCursor = opts.cursor ?? null;\n const append = opts.append === true;\n setLoading(true);\n setError('');\n try {\n const params = new URLSearchParams();\n if (status) params.set('status', status);\n if (tag) params.set('tag', tag);\n if (q) params.set('q', q);\n params.set('limit', '200');\n if (nextCursor) params.set('cursor', nextCursor);\n const res = await fetch(`/api/hub/requirements?${params.toString()}`, { cache: 'no-store' });\n if (res.status === 401) { setNeedsLogin(true); if (!append) setRows([]); return; }\n const data = await res.json();\n if (!res.ok || !data.ok) {\n setError(data?.error || `hub_${res.status}`);\n if (!append) setRows([]);\n return;\n }\n setNeedsLogin(false);\n const incoming = (data.requirements || []) as Requirement[];\n setRows(prev => (append ? [...prev, ...incoming] : incoming));\n setCursor(typeof data.next_cursor === 'string' ? data.next_cursor : null);\n setHasMore(data.has_more === true && typeof data.next_cursor === 'string');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'fetch failed');\n if (!append) setRows([]);\n } finally {\n setLoading(false);\n }\n }, [status, tag, q]);\n\n useEffect(() => { load(); }, [load]);\n\n const counts = useMemo(() => {\n const out: Record<string, number> = {};\n for (const r of rows) out[r.column] = (out[r.column] || 0) + 1;\n return out;\n }, [rows]);\n\n return (\n <div className=\"min-h-screen bg-[var(--bg)] text-gray-200\">\n <div className=\"mx-auto max-w-6xl px-4 py-6 sm:px-6\">\n <div className=\"mb-5 flex flex-wrap items-end justify-between gap-3\">\n <div>\n <h1 className=\"text-lg font-semibold text-white\">Requirements</h1>\n <p className=\"mt-1 text-xs text-gray-500\">\n 需求池 / 进行中 / 完成 —— 只读视图(写面见 #1634)。任务派单在 <Link href=\"/tasks\" className=\"text-blue-400 hover:underline\">Tasks</Link>。\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => load()}\n className=\"rounded-lg border border-[var(--border)] px-3 py-1.5 text-xs text-gray-400 hover:text-gray-200\"\n >\n Refresh\n </button>\n </div>\n\n {/* Status tabs */}\n <div className=\"mb-4 flex flex-wrap items-center gap-1.5\">\n {COLUMNS.map(col => {\n const count = col.key ? counts[col.key] || 0 : rows.length;\n const active = status === col.key;\n return (\n <button\n key={col.key || 'all'}\n type=\"button\"\n onClick={() => setParam({ status: col.key })}\n className={`rounded-md border px-3 py-1.5 text-xs transition-colors ${\n active\n ? 'border-blue-500/30 bg-blue-500/10 text-blue-300'\n : 'border-transparent text-gray-500 hover:bg-[var(--border)]/60 hover:text-gray-300'\n }`}\n >\n {col.label}\n <span className=\"ml-1.5 text-[10px] tabular-nums opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n\n {/* Text filters */}\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Search</span>\n <input\n value={qInput}\n onChange={e => setQInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ q: qInput }); }}\n onBlur={() => { if (qInput !== q) setParam({ q: qInput }); }}\n placeholder=\"标题 / 人 / 标签\"\n className=\"w-40 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none sm:w-56\"\n />\n </div>\n <div className=\"flex items-center gap-1.5 rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)] px-2.5 py-1.5 focus-within:border-blue-500/40\">\n <span className=\"text-[10px] uppercase tracking-wide text-gray-600\">Tag</span>\n <input\n value={tagInput}\n onChange={e => setTagInput(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') setParam({ tag: tagInput }); }}\n onBlur={() => { if (tagInput !== tag) setParam({ tag: tagInput }); }}\n placeholder=\"exact tag\"\n className=\"w-28 bg-transparent text-sm text-white placeholder-gray-700 focus:outline-none\"\n />\n </div>\n {(status || tag || q) && (\n <button\n type=\"button\"\n onClick={() => { setTagInput(''); setQInput(''); setParam({ status: '', tag: '', q: '' }); }}\n className=\"rounded-lg border border-gray-700 px-2.5 py-1.5 text-[11px] text-gray-500 hover:border-gray-600 hover:text-gray-200\"\n >\n Clear filters\n </button>\n )}\n </div>\n\n {needsLogin && (\n <div className=\"mb-4 rounded-lg border border-amber-500/20 bg-amber-500/5 px-4 py-3 text-sm text-amber-300\">\n 会话已过期,<Link href=\"/login\" className=\"underline\">重新登录</Link> 后再看需求。\n </div>\n )}\n {error && !needsLogin && (\n <div className=\"mb-4 rounded-lg border border-red-500/20 bg-red-500/5 px-4 py-3 text-sm text-red-300\">\n 读取失败:{error}\n <button type=\"button\" onClick={() => load()} className=\"ml-3 underline\">重试</button>\n </div>\n )}\n\n {loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"h-12 animate-pulse rounded-lg border border-[var(--border)] bg-[var(--bg-secondary)]\" />\n ))}\n </div>\n ) : rows.length === 0 ? (\n <EmptyState\n variant=\"generic\"\n title={status || tag || q ? '没有符合筛选的需求' : '需求池是空的'}\n sub={status || tag || q ? '清掉筛选再试,或换一个标签。' : '客户端建一条需求后,这里就会出现。'}\n cta={status || tag || q ? { label: '清空筛选', onClick: () => setParam({ status: '', tag: '', q: '' }) } : undefined}\n />\n ) : (\n <ul className=\"divide-y divide-[var(--border)] overflow-hidden rounded-xl border border-[var(--border)] bg-[var(--bg-secondary)]\">\n {rows.map(row => {\n const chk = row.checklist_count;\n const kids = row.children;\n return (\n <li key={row.id} className=\"hover:bg-[var(--bg-secondary)]/60\">\n <Link href={`/requirements/${row.id}`} className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 px-3 py-2.5 sm:px-4\">\n <span className=\"w-12 shrink-0 text-[11px] tabular-nums text-gray-600\">#{row.seq}</span>\n <span className={`shrink-0 rounded border px-1.5 py-0.5 text-[10px] ${COLUMN_CHIP[row.column] || COLUMN_CHIP.abandoned}`}>\n {row.column}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm text-gray-100\">{row.name}</span>\n {(row.tags || []).slice(0, 3).map(t => (\n <span key={t} className=\"hidden shrink-0 rounded bg-[var(--bg-elevated)] px-1.5 py-0.5 text-[10px] text-gray-400 sm:inline\">\n {t}\n </span>\n ))}\n <span className={`shrink-0 text-[11px] ${priorityClass(row.priority)}`}>{row.priority}</span>\n <span className=\"hidden w-24 shrink-0 truncate text-[11px] text-gray-500 sm:inline\">{personLabel(row.agent_owner)}</span>\n <span className=\"w-20 shrink-0 text-right text-[11px]\">{dueLabel(row.due)}</span>\n {chk && chk.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 sm:inline\">\n ✓ {chk.done}/{chk.total}\n </span>\n )}\n {kids && kids.total > 0 && (\n <span className=\"hidden shrink-0 text-[10px] tabular-nums text-gray-500 md:inline\">\n ↳ {kids.done}/{kids.total}\n </span>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n )}\n\n {hasMore && (\n <button\n type=\"button\"\n disabled={loading}\n onClick={() => load({ cursor, append: true })}\n className=\"mx-auto mt-4 block rounded-lg border border-[var(--border)] px-4 py-2 text-xs text-gray-400 hover:text-gray-200 disabled:opacity-50\"\n >\n {loading ? '加载中…' : '加载更多'}\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport default function RequirementsPage() {\n return (\n <Suspense fallback={<div className=\"min-h-screen bg-[var(--bg)]\" />}>\n <RequirementsContent />\n </Suspense>\n );\n}\n"],"names":["DEFAULTS","nodes","title","sub","tasks","messages","logs","tokens","networks","generic","Glyph","variant","size","s","width","height","baseProps","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","viewBox","cx","cy","r","x1","y1","x2","y2","strokeDasharray","opacity","x","y","rx","d","ry","EmptyState","cta","compact","headline","subcopy","iconSize","className","role","href","label","onClick","EmptyCard","children","NodesEmptyState","hint","taskHistoryCount","global_count","toLocaleString","QuickstartCommand","cmd","target","rel","copied","setCopied","onCopy","navigator","clipboard","writeText","setTimeout","type","COLUMNS","key","COLUMN_CHIP","pool","doing","done","abandoned","priorityClass","priority","personLabel","p","alias","id","dueLabel","due","day","slice","overdue","Date","toISOString","RequirementsContent","router","searchParams","rows","setRows","loading","setLoading","error","setError","needsLogin","setNeedsLogin","cursor","setCursor","hasMore","setHasMore","status","get","tag","q","tagInput","setTagInput","qInput","setQInput","setParam","patch","next","URLSearchParams","toString","value","Object","entries","set","delete","qs","replace","scroll","load","opts","nextCursor","append","params","res","fetch","cache","data","json","ok","incoming","requirements","prev","next_cursor","has_more","e","Error","message","counts","out","column","map","col","count","length","active","onChange","onKeyDown","onBlur","placeholder","Array","from","_","i","undefined","row","chk","checklist_count","kids","seq","name","tags","t","agent_owner","total","disabled","RequirementsPage","fallback"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.
|
|
1
|
+
module.exports=[344,a=>{"use strict";a.s(["DASHBOARD_VERSION",0,"0.6.3-preview.58"],344)},83694,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(344);a.s(["default",0,function(){let[a,e]=(0,c.useState)("login"),[f,g]=(0,c.useState)(""),[h,i]=(0,c.useState)(""),[j,k]=(0,c.useState)(!1),[l,m]=(0,c.useState)(""),[n,o]=(0,c.useState)(!1),p=async b=>{b.preventDefault(),o(!0),m("");try{let b=await fetch("/api/auth/v3",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:a,username:f,password:h})}),c=await b.json();if(c.ok){c.token&&sessionStorage.setItem("anet_v3_auth",JSON.stringify({user:c.user,token:c.token,networks:c.networks||[],currentNetwork:c.network_id||c.networks?.[0]?.network_id||""})),window.location.assign("/");return}m(c.error||"Login failed")}catch{m("Connection failed")}o(!1)};return(0,b.jsxs)("main",{className:"min-h-screen bg-[#0b0b0d] text-gray-100 flex items-center justify-center relative overflow-hidden px-4 py-10 sm:py-16",children:[(0,b.jsx)("div",{className:"absolute inset-0 pointer-events-none anet-login-bg","aria-hidden":!0}),(0,b.jsx)("div",{className:"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[460px] h-[460px] rounded-full bg-cyan-500/[0.045] blur-[110px] pointer-events-none","aria-hidden":!0}),(0,b.jsxs)("div",{className:"relative w-full max-w-sm",children:[(0,b.jsxs)("div",{className:"text-center mb-7",children:[(0,b.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 mb-4 rounded-2xl bg-[#161618] border border-[#26262b] anet-login-mark",children:(0,b.jsxs)("svg",{className:"w-9 h-9",viewBox:"0 0 32 32","aria-hidden":!0,children:[(0,b.jsx)("circle",{cx:"16",cy:"16",r:"10",fill:"none",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.25",className:"text-cyan-400 anet-login-mark-ring"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"10",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"16",y1:"10",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("line",{x1:"10",y1:"20",x2:"22",y2:"20",stroke:"currentColor",strokeWidth:"1",opacity:"0.5",className:"text-cyan-400 anet-login-mark-edge"}),(0,b.jsx)("circle",{cx:"16",cy:"10",r:"3",fill:"currentColor",className:"text-cyan-400 anet-login-mark-node-a"}),(0,b.jsx)("circle",{cx:"10",cy:"20",r:"3",fill:"currentColor",className:"text-green-400 anet-login-mark-node-b"}),(0,b.jsx)("circle",{cx:"22",cy:"20",r:"3",fill:"currentColor",className:"text-violet-400 anet-login-mark-node-c"})]})}),(0,b.jsx)("h1",{className:"text-[22px] sm:text-2xl font-semibold text-white tracking-tight",children:"Agent Network"}),(0,b.jsx)("p",{className:"text-[13px] text-gray-400 mt-1.5 leading-snug",children:"login"===a?(0,b.jsxs)(b.Fragment,{children:["Welcome back · ",(0,b.jsx)("span",{className:"text-gray-500",children:"Tasks · Mesh · Messages"})]}):(0,b.jsxs)(b.Fragment,{children:["Create your account · ",(0,b.jsx)("span",{className:"text-gray-500",children:"Free preview · no credit card"})]})})]}),(0,b.jsx)("div",{className:"flex rounded-lg border border-[#26262b] bg-[#161618] p-1 mb-4",children:["login","register"].map(c=>(0,b.jsx)("button",{type:"button",onClick:()=>{e(c),m("")},className:`flex-1 rounded-md px-3 py-2 text-sm transition-colors ${a===c?"bg-cyan-500/10 text-cyan-300":"text-gray-500 hover:text-gray-200"}`,children:"login"===c?"Sign in":"Register"},c))}),(0,b.jsxs)("form",{onSubmit:p,className:"border border-[#26262b] bg-[#161618]/80 backdrop-blur-sm rounded-xl p-6 shadow-2xl shadow-black/30",children:[(0,b.jsx)("label",{htmlFor:"username",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Username"}),(0,b.jsx)("input",{id:"username",type:"text",value:f,onChange:a=>g(a.target.value),autoFocus:!0,placeholder:"Enter username",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all mb-4"}),(0,b.jsx)("label",{htmlFor:"password",className:"block text-xs text-gray-500 mb-2 uppercase tracking-wider",children:"Password"}),(0,b.jsxs)("div",{className:"relative",children:[(0,b.jsx)("input",{id:"password",type:j?"text":"password",value:h,onChange:a=>i(a.target.value),placeholder:"Enter password",className:"w-full bg-[#0e0e10] border border-[#26262b] rounded-lg px-4 pr-11 py-3 text-base sm:text-sm text-white placeholder-gray-600 focus:border-cyan-500/50 focus:ring-1 focus:ring-cyan-500/20 focus:outline-none transition-all"}),(0,b.jsx)("button",{type:"button",onClick:()=>k(a=>!a),tabIndex:-1,"aria-label":j?"Hide password":"Show password",className:"absolute inset-y-0 right-0 flex items-center justify-center min-w-[44px] px-3 text-gray-600 hover:text-gray-300 transition-colors",children:j?(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"}),(0,b.jsx)("line",{x1:"1",y1:"1",x2:"23",y2:"23"})]}):(0,b.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),(0,b.jsx)("circle",{cx:"12",cy:"12",r:"3"})]})})]}),l&&(0,b.jsx)("div",{className:"mt-3 text-sm text-red-300 bg-red-500/5 border border-red-500/10 rounded-lg px-3 py-2",children:l}),(0,b.jsxs)("button",{type:"submit",disabled:n||!h||!f.trim(),className:"mt-5 w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-cyan-600 to-blue-600 hover:from-cyan-500 hover:to-blue-500 disabled:from-gray-800 disabled:to-gray-800 disabled:text-gray-600 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-cyan-500/10 hover:shadow-cyan-500/20 disabled:shadow-none",children:[n&&(0,b.jsxs)("svg",{"aria-hidden":!0,className:"w-4 h-4 animate-spin",viewBox:"0 0 24 24",fill:"none",children:[(0,b.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",opacity:"0.25"}),(0,b.jsx)("path",{d:"M4 12a8 8 0 018-8",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),(0,b.jsx)("span",{children:n?"login"===a?"Signing in…":"Registering…":"login"===a?"Sign in":"Create account"})]})]}),(0,b.jsxs)("p",{className:"text-center text-[11px] text-gray-700 mt-6",children:["Sleep2AGI · Apache-2.0 · ",(0,b.jsx)("a",{href:"https://anet.sh",className:"hover:text-gray-500 transition-colors",children:"anet.sh"}),(0,b.jsx)("span",{className:"mx-1 text-gray-800",children:"·"}),(0,b.jsxs)("span",{className:"font-mono",title:"@sleep2agi/agent-network-dashboard",children:["v",d.DASHBOARD_VERSION]})]})]})]})}])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=app_0iz553k._.js.map
|