From e46d3d77ae075929246cf8f1f2ad5dda89e44c10 Mon Sep 17 00:00:00 2001 From: Roman Chernyak Date: Sat, 16 May 2026 17:25:36 +0200 Subject: [PATCH] fix(embed): untrack web/frontend/dist/* and serve a fallback stub MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The .gitignore already declares `web/frontend/` "auto-generated", and every documented build path (`make build`, `make build-server`, the release.yml + pr-build.yml CI workflows, the frontend/README.md "Production Deployment" recipe) regenerates the bundle from source. But the 39+ files under web/frontend/dist/ have been tracked since a27d360, which means every `make frontend-build` produces a flood of "deleted old-hash" + "untracked-but-gitignored new-hash" entries in `git status`. This commit brings the tracked state in line with the maintainers' stated intent. Changes: 1. `git rm --cached -r web/frontend/` removes the tracked Vite output. 2. Track `web/frontend/dist/.gitkeep` so //go:embed has at least one file to embed on a fresh module fetch. 3. Track `web/embedded_fallback/index.html`, a small stub UI shown when no real Vite bundle is present. 4. Change the embed directive in web/web.go to `all:frontend/dist` (required to pick up the dotfile placeholder) and add a second embed for the fallback. The handler falls back to the stub when index.html isn't found in the real bundle. 5. `.gitignore` gains explicit re-include lines so the new .gitkeep survives the generic `dist/` ignore rule earlier in the file. 6. Makefile's `frontend-build` recreates `.gitkeep` after copying the freshly built dist into web/frontend/, so subsequent rebuilds leave a clean `git status`. User-visible behavior: | Flow | Before | After | |-----------------------------------------|---------------------|------------------------| | `make build` from a clean tree | dirty tree after | clean tree after | | `make build` re-run | dirty tree after | clean tree after | | Bare `go build ./cmd/mcpproxy` | stale embedded UI | fallback stub at /ui/ | | `go install …@latest` (no npm) | stale embedded UI | fallback stub at /ui/ | | Docker / .deb / DMG release | uses `make build` | unchanged | | CI release.yml / pr-build.yml | always rebuilds | unchanged | The trade-off is that bare-Go-toolchain users (no npm) now get a stub UI with a "build from source for the real UI" message instead of a silently-stale bundle. The REST API, MCP endpoints, and CLI are unaffected β€” only the `/ui/` route changes. Verified: - `go build ./...` succeeds - `make frontend-build` produces a clean `git status` - After wiping web/frontend/dist/* except .gitkeep, bare `go build ./cmd/mcpproxy` compiles and the binary serves the fallback HTML at /ui/ - `git archive HEAD | tar -x -C tmp && cd tmp && go build ./cmd/mcpproxy` (the `go install` module-fetch simulation) produces the same fallback behaviour --- .gitignore | 12 +- Makefile | 9 +- web/embedded_fallback/index.html | 38 ++++++ web/frontend/dist/.gitkeep | 0 .../dist/assets/Activity-7YqHqUto.css | 1 - web/frontend/dist/assets/Activity-DhitPCWU.js | 1 - .../dist/assets/AdminDashboard-C1SaV16-.js | 1 - .../dist/assets/AdminServers-Bq_mhKvu.js | 1 - .../dist/assets/AdminUsers-DsLLAbcP.js | 1 - .../dist/assets/AgentTokens-BUr0zPZZ.js | 1 - web/frontend/dist/assets/Feedback-BTV7aiQR.js | 1 - web/frontend/dist/assets/Login-BS5rjyms.js | 1 - web/frontend/dist/assets/NotFound-BpDrBCs_.js | 1 - .../dist/assets/Repositories-BAogKZE_.js | 1 - .../dist/assets/ScanReport-nG0rtEIx.js | 1 - web/frontend/dist/assets/Search-D-mj47__.js | 7 - web/frontend/dist/assets/Secrets-BKIyhyih.js | 23 ---- web/frontend/dist/assets/Security-DiXvJatK.js | 1 - .../dist/assets/ServerDetail-DZf4WjHw.js | 14 -- web/frontend/dist/assets/Servers-vGmGbuV-.js | 16 --- web/frontend/dist/assets/Sessions-Dsg-0ylf.js | 1 - web/frontend/dist/assets/Settings-RcQ5dhlx.js | 22 --- .../dist/assets/UserActivity-DJXmTB_5.js | 1 - .../dist/assets/UserDiagnostics-D1TBjGe7.js | 1 - .../dist/assets/UserServers-CcZ1PmWJ.js | 3 - .../dist/assets/UserTokens-IkJLKSRQ.js | 1 - web/frontend/dist/assets/index-_GHynmUp.css | 1 - web/frontend/dist/assets/index-myMLoUzQ.js | 75 ----------- web/frontend/dist/favicon.svg | 125 ------------------ web/frontend/dist/index.html | 14 -- web/web.go | 35 ++++- 31 files changed, 84 insertions(+), 326 deletions(-) create mode 100644 web/embedded_fallback/index.html create mode 100644 web/frontend/dist/.gitkeep delete mode 100644 web/frontend/dist/assets/Activity-7YqHqUto.css delete mode 100644 web/frontend/dist/assets/Activity-DhitPCWU.js delete mode 100644 web/frontend/dist/assets/AdminDashboard-C1SaV16-.js delete mode 100644 web/frontend/dist/assets/AdminServers-Bq_mhKvu.js delete mode 100644 web/frontend/dist/assets/AdminUsers-DsLLAbcP.js delete mode 100644 web/frontend/dist/assets/AgentTokens-BUr0zPZZ.js delete mode 100644 web/frontend/dist/assets/Feedback-BTV7aiQR.js delete mode 100644 web/frontend/dist/assets/Login-BS5rjyms.js delete mode 100644 web/frontend/dist/assets/NotFound-BpDrBCs_.js delete mode 100644 web/frontend/dist/assets/Repositories-BAogKZE_.js delete mode 100644 web/frontend/dist/assets/ScanReport-nG0rtEIx.js delete mode 100644 web/frontend/dist/assets/Search-D-mj47__.js delete mode 100644 web/frontend/dist/assets/Secrets-BKIyhyih.js delete mode 100644 web/frontend/dist/assets/Security-DiXvJatK.js delete mode 100644 web/frontend/dist/assets/ServerDetail-DZf4WjHw.js delete mode 100644 web/frontend/dist/assets/Servers-vGmGbuV-.js delete mode 100644 web/frontend/dist/assets/Sessions-Dsg-0ylf.js delete mode 100644 web/frontend/dist/assets/Settings-RcQ5dhlx.js delete mode 100644 web/frontend/dist/assets/UserActivity-DJXmTB_5.js delete mode 100644 web/frontend/dist/assets/UserDiagnostics-D1TBjGe7.js delete mode 100644 web/frontend/dist/assets/UserServers-CcZ1PmWJ.js delete mode 100644 web/frontend/dist/assets/UserTokens-IkJLKSRQ.js delete mode 100644 web/frontend/dist/assets/index-_GHynmUp.css delete mode 100644 web/frontend/dist/assets/index-myMLoUzQ.js delete mode 100644 web/frontend/dist/favicon.svg delete mode 100644 web/frontend/dist/index.html diff --git a/.gitignore b/.gitignore index ee4291a6..6bb0bef6 100644 --- a/.gitignore +++ b/.gitignore @@ -81,8 +81,16 @@ frontend/.output/ frontend/.cache/ frontend/coverage/ -# Embedded frontend assets (auto-generated) -web/frontend/ +# Embedded frontend assets (auto-generated by `make frontend-build`). +# Everything under web/frontend/dist/ is rebuilt from frontend/ on every +# `make build`, except the tracked .gitkeep β€” it exists only so that the +# //go:embed all:frontend/dist directive in web/web.go can compile from a +# fresh module fetch (e.g. `go install …@latest`) before the real UI has +# been produced. The explicit re-includes are needed because the generic +# `dist/` rule above would otherwise mask web/frontend/dist entirely. +!web/frontend/dist/ +web/frontend/dist/* +!web/frontend/dist/.gitkeep # Test coverage coverage.out diff --git a/Makefile b/Makefile index b8cf7ef9..a7e711eb 100644 --- a/Makefile +++ b/Makefile @@ -74,8 +74,13 @@ frontend-build: cd frontend && npm install && npm run build @echo "πŸ“ Copying dist files for embedding..." rm -rf web/frontend - mkdir -p web/frontend - cp -r frontend/dist web/frontend/ + mkdir -p web/frontend/dist + cp -r frontend/dist/. web/frontend/dist/ + # Recreate the tracked .gitkeep so //go:embed all:frontend/dist still has + # something to embed even before the real UI is built (e.g. on a fresh + # `go install …@latest`), and so subsequent rebuilds don't show a phantom + # "deleted .gitkeep" in `git status`. + touch web/frontend/dist/.gitkeep @echo "βœ… Frontend build completed" # Start frontend development server diff --git a/web/embedded_fallback/index.html b/web/embedded_fallback/index.html new file mode 100644 index 00000000..9732efbb --- /dev/null +++ b/web/embedded_fallback/index.html @@ -0,0 +1,38 @@ + + + + + + MCPProxy β€” Web UI not built + + + +

MCPProxy Web UI is not embedded in this build

+

+ This binary was built without running the frontend build step, so the + React/Vue UI assets are not embedded. The REST API and MCP endpoints + still work normally β€” this fallback page only replaces the + /ui/ route. +

+

+ If you installed mcpproxy with go install …@latest or + bare go build ./cmd/mcpproxy, this is expected: the Go + toolchain doesn't run npm. To get the real UI, either + install a release artifact (DMG, Homebrew, .deb, .rpm, AUR, Docker) + or build from source with: +

+
make build       # full build (swagger + frontend + backend)
+make build-server  # server edition
+

+ See the project README for details. +

+ + diff --git a/web/frontend/dist/.gitkeep b/web/frontend/dist/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/web/frontend/dist/assets/Activity-7YqHqUto.css b/web/frontend/dist/assets/Activity-7YqHqUto.css deleted file mode 100644 index 923e101f..00000000 --- a/web/frontend/dist/assets/Activity-7YqHqUto.css +++ /dev/null @@ -1 +0,0 @@ -.json-viewer-container[data-v-919a3d3e]{width:100%}.json-viewer[data-v-919a3d3e]{white-space:pre-wrap;word-wrap:break-word;overflow-wrap:anywhere;line-height:1.5;font-family:Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace}.json-viewer[data-v-919a3d3e]::-webkit-scrollbar{width:8px;height:8px}.json-viewer[data-v-919a3d3e]::-webkit-scrollbar-track{border-radius:.25rem;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.json-viewer[data-v-919a3d3e]::-webkit-scrollbar-thumb{border-radius:.25rem;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.json-viewer[data-v-919a3d3e]::-webkit-scrollbar-thumb:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.3))} diff --git a/web/frontend/dist/assets/Activity-DhitPCWU.js b/web/frontend/dist/assets/Activity-DhitPCWU.js deleted file mode 100644 index 714ce0ef..00000000 --- a/web/frontend/dist/assets/Activity-DhitPCWU.js +++ /dev/null @@ -1 +0,0 @@ -import{d as Be,e as Ve,r as v,g as C,y as ie,c as o,o as l,a as t,t as n,n as g,i as y,E as Ke,_ as Qe,z as Ge,A as We,B as Xe,h as r,p as x,N as je,m as ae,M as le,F as B,s as V,D as N,G as Ye,v as Le,k as Y,w as Ee,l as Ze,q as oe,j as et}from"./index-myMLoUzQ.js";const tt={class:"json-viewer-container"},st={class:"flex justify-between items-start mb-2"},at={class:"text-xs text-base-content/60"},lt=["title"],ot={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},nt={key:1,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},it=["innerHTML"],rt=Be({__name:"JsonViewer",props:{data:{},maxHeight:{default:"24rem"}},setup(re){const H=re,I=Ve(),b=v(!1);let _=null;const M=C(()=>{try{return JSON.stringify(H.data,null,2)}catch{return String(H.data)}}),F=C(()=>new Blob([M.value]).size.toLocaleString()),i=C(()=>{let m=M.value;return m=m.replace(/&/g,"&").replace(//g,">"),m=m.replace(/("(?:[^"\\]|\\.)*")\s*:/g,'$1:').replace(/:\s*("(?:[^"\\]|\\.)*")/g,': $1').replace(/:\s*(-?\d+\.?\d*)/g,': $1').replace(/:\s*(true|false)/g,': $1').replace(/:\s*(null)/g,': $1'),m}),U=async()=>{try{await navigator.clipboard.writeText(M.value),b.value=!0,I.addToast({type:"success",title:"Copied!",message:"JSON copied to clipboard"}),_&&clearTimeout(_),_=setTimeout(()=>{b.value=!1},2e3)}catch{I.addToast({type:"error",title:"Copy Failed",message:"Failed to copy to clipboard"})}};return ie(()=>H.data,()=>{b.value=!1,_&&clearTimeout(_)}),(m,c)=>(l(),o("div",tt,[t("div",st,[t("div",at,n(F.value)+" bytes ",1),t("button",{onClick:U,class:g(["btn btn-xs btn-ghost gap-1",{"btn-success":b.value}]),title:b.value?"Copied!":"Copy to clipboard"},[b.value?(l(),o("svg",nt,[...c[1]||(c[1]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"},null,-1)])])):(l(),o("svg",ot,[...c[0]||(c[0]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])])),y(" "+n(b.value?"Copied!":"Copy"),1)],10,lt)]),t("pre",{class:"json-viewer bg-base-300 p-3 rounded text-xs overflow-auto w-full",style:Ke({maxHeight:m.maxHeight}),innerHTML:i.value},null,12,it)]))}}),ne=Qe(rt,[["__scopeId","data-v-919a3d3e"]]),dt={class:"space-y-6"},ut={class:"flex flex-wrap justify-between items-start gap-4"},ct={class:"flex items-center gap-4"},vt={class:"form-control"},pt={class:"label cursor-pointer gap-2"},mt={class:"flex items-center gap-2"},bt=["disabled"],gt={key:0,class:"stats shadow bg-base-100 w-full"},_t={class:"stat"},xt={class:"stat-value text-2xl"},yt={class:"stat"},ft={class:"stat-value text-2xl text-success"},ht={class:"stat"},kt={class:"stat-value text-2xl text-error"},wt={class:"stat"},Ct={class:"stat-value text-2xl text-warning"},St={class:"card bg-base-100 shadow-md"},At={class:"card-body py-4"},Tt={class:"flex flex-wrap gap-4 items-end"},Dt={class:"form-control min-w-[180px]"},Mt={class:"dropdown dropdown-bottom"},$t={tabindex:"0",role:"button",class:"select select-bordered select-sm w-full text-left flex items-center justify-between"},jt={key:0},Lt={key:1},Et={key:2,class:"truncate"},Bt={tabindex:"0",class:"dropdown-content z-[10] menu p-2 shadow-lg bg-base-200 rounded-box w-56"},Vt={class:"menu-title flex flex-row justify-between items-center"},Nt={class:"label cursor-pointer justify-start gap-2 py-1"},Ft=["checked","onChange"],Ut={class:"text-lg"},zt={class:"form-control min-w-[150px]"},It=["value"],Jt={class:"form-control min-w-[120px]"},Ot={class:"form-control min-w-[120px]"},Rt={key:0,class:"form-control min-w-[150px]"},Ht=["value"],Pt={class:"form-control min-w-[140px]"},qt={key:1,class:"form-control min-w-[120px]"},Kt={class:"form-control min-w-[180px]"},Qt=["value"],Gt={class:"form-control min-w-[160px]"},Wt={class:"form-control min-w-[160px]"},Xt={class:"dropdown dropdown-end"},Yt={tabindex:"0",class:"dropdown-content z-[1] menu p-2 shadow-lg bg-base-200 rounded-box w-40"},Zt={key:0,class:"flex flex-wrap gap-2 mt-2 pt-2 border-t border-base-300"},es=["onClick"],ts={key:0,class:"badge badge-sm badge-outline"},ss={key:1,class:"badge badge-sm badge-outline"},as={key:2,class:"badge badge-sm badge-outline"},ls={key:3,class:"badge badge-sm badge-outline"},os={key:4,class:"badge badge-sm badge-outline"},ns={key:5,class:"badge badge-sm badge-outline"},is={key:6,class:"badge badge-sm badge-outline"},rs={key:7,class:"badge badge-sm badge-outline"},ds={key:8,class:"badge badge-sm badge-outline"},us={class:"card bg-base-100 shadow-md"},cs={class:"card-body"},vs={key:0,class:"flex justify-center py-12"},ps={key:1,class:"alert alert-error"},ms={key:2,class:"text-center py-12 text-base-content/60"},bs={class:"text-lg"},gs={class:"text-sm mt-1"},_s={key:3,class:"overflow-x-auto"},xs={class:"table table-sm"},ys=["onClick"],fs={class:"text-sm"},hs={class:"text-xs text-base-content/60"},ks={class:"flex items-center gap-2"},ws={class:"text-lg"},Cs={class:"text-sm"},Ss={key:1,class:"text-base-content/40"},As={class:"max-w-xs truncate"},Ts={key:0,class:"text-sm bg-base-200 px-2 py-1 rounded"},Ds={key:1,class:"text-sm"},Ms={key:2,class:"text-base-content/40"},$s=["data-tip"],js={key:1,class:"text-base-content/40"},Ls=["data-tip"],Es={key:1,class:"text-base-content/40"},Bs={key:0,class:"text-sm"},Vs={key:1,class:"text-base-content/40"},Ns=["onClick"],Fs={key:0,class:"flex justify-between items-center mt-4 pt-4 border-t border-base-300"},Us={class:"text-sm text-base-content/60"},zs={class:"join"},Is=["disabled"],Js=["disabled"],Os={class:"join-item btn btn-sm"},Rs=["disabled"],Hs=["disabled"],Ps={class:"form-control"},qs={class:"drawer drawer-end"},Ks={class:"drawer-side z-50"},Qs={class:"bg-base-100 w-[500px] min-h-full p-6"},Gs={key:0,class:"space-y-4"},Ws={class:"flex justify-between items-start"},Xs={class:"text-lg font-bold flex items-center gap-2"},Ys={class:"text-2xl"},Zs={class:"text-sm text-base-content/60"},ea={class:"flex items-center gap-2"},ta={class:"space-y-3"},sa={key:0,class:"flex gap-2"},aa={class:"text-xs bg-base-200 px-2 py-1 rounded break-all"},la={key:1,class:"flex gap-2"},oa={key:2,class:"flex gap-2"},na={class:"text-sm bg-base-200 px-2 py-1 rounded"},ia={key:3,class:"flex gap-2"},ra={class:"text-sm"},da={key:4,class:"flex gap-2"},ua={class:"text-xs bg-base-200 px-2 py-1 rounded"},ca={key:5,class:"flex gap-2"},va={class:"badge badge-sm badge-outline"},pa={key:0},ma={class:"font-semibold mb-2 text-warning flex items-center gap-2"},ba={class:"flex flex-col gap-2 w-full text-inherit"},ga={class:"flex items-center gap-2"},_a={key:0,class:"flex flex-col gap-1"},xa={class:"flex flex-wrap gap-1"},ya={key:1,class:"flex flex-col gap-1"},fa={class:"text-sm space-y-1"},ha={class:"font-mono text-xs text-inherit"},ka={class:"text-inherit/70 text-xs"},wa={key:0,class:"badge badge-xs badge-ghost"},Ca={key:1},Sa={class:"alert alert-warning"},Aa={class:"flex flex-col gap-2 w-full"},Ta={class:"flex items-center gap-2"},Da={class:"badge badge-warning"},Ma={key:0,class:"flex flex-col gap-1"},$a={class:"text-sm"},ja={key:1,class:"flex flex-col gap-1"},La={class:"text-sm"},Ea={key:2,class:"text-sm italic"},Ba={key:2},Va={key:3},Na={class:"font-semibold mb-2 flex items-center gap-2"},Fa={key:0,class:"badge badge-sm badge-warning"},Ua={key:4},za={class:"alert alert-error"},Ia={class:"text-sm break-words"},Ja={key:5},Oa={class:"bg-base-200 rounded p-3 space-y-2"},Ra={key:0,class:"flex gap-2"},Ha={key:1,class:"flex gap-2"},Pa={class:"text-sm"},qa={key:2,class:"flex gap-2"},Ka={class:"text-sm"},Qa={key:6},Wa=Be({__name:"Activity",setup(re){const H=We(),I=Ve(),b=v([]),_=v(null),M=v(!1),F=v(null),i=v(null),U=v(!1),m=v(!0),c=v([]),S=v(""),$=v(""),A=v(""),f=v(""),j=v(""),h=v(""),T=v(""),L=v(""),E=v(""),de=[{value:"tool_call",label:"Tool Call",icon:"πŸ”§"},{value:"system_start",label:"System Start",icon:"πŸš€"},{value:"system_stop",label:"System Stop",icon:"πŸ›‘"},{value:"internal_tool_call",label:"Internal Tool Call",icon:"βš™οΈ"},{value:"config_change",label:"Config Change",icon:"⚑"},{value:"policy_decision",label:"Policy Decision",icon:"πŸ›‘οΈ"},{value:"quarantine_change",label:"Quarantine Change",icon:"⚠️"},{value:"server_change",label:"Server Change",icon:"πŸ”„"}],p=v(1),z=v(25),G=v("timestamp"),P=v("desc"),Ne=C(()=>{const s=new Set;return b.value.forEach(e=>{e.server_name&&s.add(e.server_name)}),Array.from(s).sort()}),Fe=C(()=>{const s=new Set;return b.value.forEach(e=>{var u;const d=(u=e.metadata)==null?void 0:u._auth_agent_name;d&&s.add(d)}),Array.from(s).sort()}),ue=C(()=>{const s=new Map;return b.value.forEach(e=>{var d;if(e.session_id&&!s.has(e.session_id)){const u=(d=e.metadata)==null?void 0:d.client_name;s.set(e.session_id,{clientName:u})}}),Array.from(s.entries()).map(([e,d])=>{const u=e.slice(-5),D=d.clientName?`${d.clientName} ...${u}`:`...${u}`;return{id:e,label:D,clientName:d.clientName}}).sort((e,d)=>e.label.localeCompare(d.label))}),Ue=s=>{const e=ue.value.find(d=>d.id===s);return(e==null?void 0:e.label)||`...${s.slice(-5)}`},W=C(()=>c.value.length>0||S.value||$.value||A.value||f.value||j.value||h.value||T.value||L.value||E.value),ce=C(()=>{let s=b.value;if(c.value.length>0&&(s=s.filter(e=>c.value.includes(e.type))),S.value&&(s=s.filter(e=>e.server_name===S.value)),$.value&&(s=s.filter(e=>e.session_id===$.value)),A.value&&(s=s.filter(e=>e.status===A.value)),f.value==="true"?s=s.filter(e=>e.has_sensitive_data===!0):f.value==="false"&&(s=s.filter(e=>!e.has_sensitive_data)),j.value&&f.value==="true"&&(s=s.filter(e=>e.max_severity===j.value)),h.value&&(s=s.filter(e=>{var d;return((d=e.metadata)==null?void 0:d._auth_auth_type)===h.value})),T.value&&(s=s.filter(e=>{var d;return((d=e.metadata)==null?void 0:d._auth_agent_name)===T.value})),L.value){const e=new Date(L.value).getTime();s=s.filter(d=>new Date(d.timestamp).getTime()>=e)}if(E.value){const e=new Date(E.value).getTime();s=s.filter(d=>new Date(d.timestamp).getTime()<=e)}return s}),X=C(()=>{const s=[...ce.value],e=G.value,d=P.value;return s.sort((u,D)=>{let k,w;return e==="timestamp"?(k=new Date(u.timestamp).getTime(),w=new Date(D.timestamp).getTime()):e==="duration_ms"?(k=u.duration_ms??0,w=D.duration_ms??0):(k=u[e]??"",w=D[e]??""),typeof k=="string"&&typeof w=="string"?d==="asc"?k.localeCompare(w):w.localeCompare(k):d==="asc"?k-w:w-k}),s}),J=C(()=>Math.ceil(X.value.length/z.value)),ze=C(()=>{const s=(p.value-1)*z.value;return X.value.slice(s,s+z.value)}),q=async()=>{M.value=!0,F.value=null;try{const[s,e]=await Promise.all([oe.getActivities({limit:200}),oe.getActivitySummary("24h")]);s.success&&s.data?b.value=s.data.activities||[]:F.value=s.error||"Failed to load activities",e.success&&e.data&&(_.value=e.data)}catch(s){F.value=s instanceof Error?s.message:"Unknown error"}finally{M.value=!1}},Ie=()=>{c.value=[],S.value="",$.value="",A.value="",f.value="",j.value="",h.value="",T.value="",L.value="",E.value="",p.value=1},ve=s=>{const e=c.value.indexOf(s);e>=0?c.value.splice(e,1):c.value.push(s)},Je=()=>{c.value=[]},K=s=>{G.value===s?P.value=P.value==="asc"?"desc":"asc":(G.value=s,P.value=s==="timestamp"||s==="duration_ms"?"desc":"asc")},Q=s=>G.value!==s?"":P.value==="asc"?"↑":"↓",pe=s=>{i.value=s,U.value=!0},me=()=>{U.value=!1,i.value=null},be=s=>{const e=oe.getActivityExportUrl({format:s,type:c.value.length>0?c.value.join(","):void 0,server:S.value||void 0,status:A.value||void 0});window.open(e,"_blank")},O=s=>{if(!m.value)return;const e=s.detail;e&&(e.server_name||e.tool_name||e.type||e.internal_tool_name||e.action||e.version||e.reason)&&(console.log("Activity event received, refreshing from API:",e),q())},ge=s=>{if(!m.value)return;const e=s.detail;e&&(e.server_name||e.tool_name||e.status||e.internal_tool_name||e.target_server)&&(console.log("Activity completed event received, refreshing from API:",e),q())},_e=s=>new Date(s).toLocaleString(),Oe=s=>{const e=Date.now(),d=new Date(s).getTime(),u=e-d;return u<1e3?"Just now":u<6e4?`${Math.floor(u/1e3)}s ago`:u<36e5?`${Math.floor(u/6e4)}m ago`:u<864e5?`${Math.floor(u/36e5)}h ago`:`${Math.floor(u/864e5)}d ago`},Z=s=>({tool_call:"Tool Call",system_start:"System Start",system_stop:"System Stop",internal_tool_call:"Internal Tool Call",config_change:"Config Change",policy_decision:"Policy Decision",quarantine_change:"Quarantine Change",server_change:"Server Change"})[s]||s,ee=s=>({tool_call:"πŸ”§",system_start:"πŸš€",system_stop:"πŸ›‘",internal_tool_call:"βš™οΈ",config_change:"⚑",policy_decision:"πŸ›‘οΈ",quarantine_change:"⚠️",server_change:"πŸ”„"})[s]||"πŸ“‹",xe=s=>({success:"Success",error:"Error",blocked:"Blocked"})[s]||s,ye=s=>({success:"badge-success",error:"badge-error",blocked:"badge-warning"})[s]||"badge-ghost",fe=s=>s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(2)}s`,Re=s=>{if(typeof s=="object")return s;try{return JSON.parse(s)}catch{return s}},te=s=>({critical:"☒️",high:"⚠️",medium:"⚑",low:"ℹ️"})[s||""]||"⚠️",se=s=>({critical:"badge-error",high:"badge-warning",medium:"badge-info",low:"badge-ghost"})[s||""]||"badge-warning",he=s=>({read:"πŸ“–",write:"✏️",destructive:"⚠️"})[s]||"❓",ke=s=>({read:"badge-info",write:"badge-warning",destructive:"badge-error"})[s]||"badge-ghost",He=s=>{if(!s.metadata)return!1;const e=["intent","decision","reason","policy_rule"];return Object.keys(s.metadata).filter(u=>!e.includes(u)).length>0},Pe=s=>{if(!s.metadata)return{};const e=["intent","decision","reason","policy_rule"],d={};for(const[u,D]of Object.entries(s.metadata))e.includes(u)||(d[u]=D);return d};ie([c,S,A,f,j,h,T,L,E],()=>{p.value=1},{deep:!0}),ie(h,s=>{s!=="agent"&&(T.value="")});const we=s=>{s.key==="Escape"&&U.value&&me()};return Ge(()=>{const s=H.query.session;s&&($.value=s),q(),window.addEventListener("mcpproxy:activity",O),window.addEventListener("mcpproxy:activity-started",O),window.addEventListener("mcpproxy:activity-completed",ge),window.addEventListener("mcpproxy:activity-policy",O),window.addEventListener("keydown",we)}),Xe(()=>{window.removeEventListener("mcpproxy:activity",O),window.removeEventListener("mcpproxy:activity-started",O),window.removeEventListener("mcpproxy:activity-completed",ge),window.removeEventListener("mcpproxy:activity-policy",O),window.removeEventListener("keydown",we)}),(s,e)=>{var u,D,k,w,Ce;const d=Ze("router-link");return l(),o("div",dt,[t("div",ut,[e[26]||(e[26]=t("div",null,[t("h1",{class:"text-3xl font-bold"},"Activity Log"),t("p",{class:"text-base-content/70 mt-1"},"Monitor and analyze all activity across your MCP servers")],-1)),t("div",ct,[t("div",vt,[t("label",pt,[e[24]||(e[24]=t("span",{class:"label-text text-sm"},"Auto-refresh",-1)),x(t("input",{type:"checkbox","onUpdate:modelValue":e[0]||(e[0]=a=>m.value=a),class:"toggle toggle-sm toggle-primary"},null,512),[[je,m.value]])])]),t("div",mt,[t("div",{class:g(["badge",ae(I).connected?"badge-success":"badge-error"])},[t("span",{class:g(["w-2 h-2 rounded-full mr-1",ae(I).connected?"bg-success animate-pulse":"bg-error"])},null,2),y(" "+n(ae(I).connected?"Live":"Disconnected"),1)],2)]),m.value?r("",!0):(l(),o("button",{key:0,onClick:q,class:"btn btn-sm btn-ghost",disabled:M.value},[(l(),o("svg",{class:g(["w-4 h-4",{"animate-spin":M.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...e[25]||(e[25]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2))],8,bt))])]),_.value?(l(),o("div",gt,[t("div",_t,[e[27]||(e[27]=t("div",{class:"stat-title"},"Total (24h)",-1)),t("div",xt,n(_.value.total_count),1)]),t("div",yt,[e[28]||(e[28]=t("div",{class:"stat-title"},"Success",-1)),t("div",ft,n(_.value.success_count),1)]),t("div",ht,[e[29]||(e[29]=t("div",{class:"stat-title"},"Errors",-1)),t("div",kt,n(_.value.error_count),1)]),t("div",wt,[e[30]||(e[30]=t("div",{class:"stat-title"},"Blocked",-1)),t("div",Ct,n(_.value.blocked_count),1)])])):r("",!0),t("div",St,[t("div",At,[t("div",Tt,[t("div",Dt,[e[33]||(e[33]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Type")],-1)),t("div",Mt,[t("div",$t,[c.value.length===0?(l(),o("span",jt,"All Types")):c.value.length===de.length?(l(),o("span",Lt,"All Types")):(l(),o("span",Et,n(c.value.length)+" selected",1)),e[31]||(e[31]=t("svg",{class:"w-4 h-4 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"})],-1))]),t("ul",Bt,[t("li",Vt,[e[32]||(e[32]=t("span",null,"Event Types",-1)),c.value.length>0?(l(),o("button",{key:0,onClick:le(Je,["stop"]),class:"btn btn-xs btn-ghost"}," Clear ")):r("",!0)]),(l(),o(B,null,V(de,a=>t("li",{key:a.value},[t("label",Nt,[t("input",{type:"checkbox",checked:c.value.includes(a.value),onChange:R=>ve(a.value),class:"checkbox checkbox-sm"},null,40,Ft),t("span",Ut,n(a.icon),1),t("span",null,n(a.label),1)])])),64))])])]),t("div",zt,[e[35]||(e[35]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Server")],-1)),x(t("select",{"onUpdate:modelValue":e[1]||(e[1]=a=>S.value=a),class:"select select-bordered select-sm"},[e[34]||(e[34]=t("option",{value:""},"All Servers",-1)),(l(!0),o(B,null,V(Ne.value,a=>(l(),o("option",{key:a,value:a},n(a),9,It))),128))],512),[[N,S.value]])]),t("div",Jt,[e[37]||(e[37]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Status")],-1)),x(t("select",{"onUpdate:modelValue":e[2]||(e[2]=a=>A.value=a),class:"select select-bordered select-sm"},[...e[36]||(e[36]=[t("option",{value:""},"All",-1),t("option",{value:"success"},"Success",-1),t("option",{value:"error"},"Error",-1),t("option",{value:"blocked"},"Blocked",-1)])],512),[[N,A.value]])]),t("div",Ot,[e[39]||(e[39]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Auth")],-1)),x(t("select",{"onUpdate:modelValue":e[3]||(e[3]=a=>h.value=a),class:"select select-bordered select-sm"},[...e[38]||(e[38]=[t("option",{value:""},"All",-1),t("option",{value:"admin"},"πŸ”‘ Admin",-1),t("option",{value:"agent"},"πŸ€– Agent",-1)])],512),[[N,h.value]])]),h.value==="agent"?(l(),o("div",Rt,[e[41]||(e[41]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Agent")],-1)),x(t("select",{"onUpdate:modelValue":e[4]||(e[4]=a=>T.value=a),class:"select select-bordered select-sm"},[e[40]||(e[40]=t("option",{value:""},"All Agents",-1)),(l(!0),o(B,null,V(Fe.value,a=>(l(),o("option",{key:a,value:a},n(a),9,Ht))),128))],512),[[N,T.value]])])):r("",!0),t("div",Pt,[e[43]||(e[43]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Sensitive Data")],-1)),x(t("select",{"onUpdate:modelValue":e[5]||(e[5]=a=>f.value=a),class:"select select-bordered select-sm"},[...e[42]||(e[42]=[t("option",{value:""},"All",-1),t("option",{value:"true"},"⚠️ Detected",-1),t("option",{value:"false"},"Clean",-1)])],512),[[N,f.value]])]),f.value==="true"?(l(),o("div",qt,[e[45]||(e[45]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Severity")],-1)),x(t("select",{"onUpdate:modelValue":e[6]||(e[6]=a=>j.value=a),class:"select select-bordered select-sm"},[...e[44]||(e[44]=[Ye('',5)])],512),[[N,j.value]])])):r("",!0),t("div",Kt,[e[47]||(e[47]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"Session")],-1)),x(t("select",{"onUpdate:modelValue":e[7]||(e[7]=a=>$.value=a),class:"select select-bordered select-sm"},[e[46]||(e[46]=t("option",{value:""},"All Sessions",-1)),(l(!0),o(B,null,V(ue.value,a=>(l(),o("option",{key:a.id,value:a.id},n(a.label),9,Qt))),128))],512),[[N,$.value]])]),t("div",Gt,[e[48]||(e[48]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"From")],-1)),x(t("input",{type:"datetime-local","onUpdate:modelValue":e[8]||(e[8]=a=>L.value=a),class:"input input-bordered input-sm"},null,512),[[Le,L.value]])]),t("div",Wt,[e[49]||(e[49]=t("label",{class:"label py-1"},[t("span",{class:"label-text text-xs"},"To")],-1)),x(t("input",{type:"datetime-local","onUpdate:modelValue":e[9]||(e[9]=a=>E.value=a),class:"input input-bordered input-sm"},null,512),[[Le,E.value]])]),W.value?(l(),o("button",{key:2,onClick:Ie,class:"btn btn-sm btn-ghost"}," Clear Filters ")):r("",!0),e[51]||(e[51]=t("div",{class:"flex-1"},null,-1)),t("div",Xt,[e[50]||(e[50]=t("div",{tabindex:"0",role:"button",class:"btn btn-sm btn-outline"},[t("svg",{class:"w-4 h-4 mr-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})]),y(" Export ")],-1)),t("ul",Yt,[t("li",null,[t("a",{onClick:e[10]||(e[10]=a=>be("json"))},"Export as JSON")]),t("li",null,[t("a",{onClick:e[11]||(e[11]=a=>be("csv"))},"Export as CSV")])])])]),W.value?(l(),o("div",Zt,[e[53]||(e[53]=t("span",{class:"text-xs text-base-content/60"},"Active filters:",-1)),(l(!0),o(B,null,V(c.value,a=>(l(),o("span",{key:a,class:"badge badge-sm badge-outline gap-1 cursor-pointer hover:badge-error",onClick:R=>ve(a)},[y(n(ee(a))+" "+n(Z(a))+" ",1),e[52]||(e[52]=t("svg",{class:"w-3 h-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1))],8,es))),128)),S.value?(l(),o("span",ts,"Server: "+n(S.value),1)):r("",!0),A.value?(l(),o("span",ss,"Status: "+n(A.value),1)):r("",!0),h.value?(l(),o("span",as,"Auth: "+n(h.value==="admin"?"πŸ”‘ Admin":"πŸ€– Agent"),1)):r("",!0),T.value?(l(),o("span",ls,"Agent: "+n(T.value),1)):r("",!0),f.value?(l(),o("span",os," Sensitive: "+n(f.value==="true"?"⚠️ Detected":"Clean"),1)):r("",!0),j.value?(l(),o("span",ns,"Severity: "+n(j.value),1)):r("",!0),$.value?(l(),o("span",is,"Session: "+n(Ue($.value)),1)):r("",!0),L.value?(l(),o("span",rs,"From: "+n(new Date(L.value).toLocaleString()),1)):r("",!0),E.value?(l(),o("span",ds,"To: "+n(new Date(E.value).toLocaleString()),1)):r("",!0)])):r("",!0)])]),t("div",us,[t("div",cs,[M.value&&b.value.length===0?(l(),o("div",vs,[...e[54]||(e[54]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):F.value?(l(),o("div",ps,[e[55]||(e[55]=t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,n(F.value),1),t("button",{onClick:q,class:"btn btn-sm btn-ghost"},"Retry")])):ce.value.length===0?(l(),o("div",ms,[e[56]||(e[56]=t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"})],-1)),t("p",bs,n(W.value?"No matching activities":"No activity records found"),1),t("p",gs,n(W.value?"Try adjusting your filters":"Activity will appear here as tools are called and actions are taken"),1)])):(l(),o("div",_s,[t("table",xs,[t("thead",null,[t("tr",null,[t("th",{class:"cursor-pointer hover:bg-base-200",onClick:e[12]||(e[12]=a=>K("timestamp"))}," Time "+n(Q("timestamp")),1),t("th",{class:"cursor-pointer hover:bg-base-200",onClick:e[13]||(e[13]=a=>K("type"))}," Type "+n(Q("type")),1),t("th",{class:"cursor-pointer hover:bg-base-200",onClick:e[14]||(e[14]=a=>K("server_name"))}," Server "+n(Q("server_name")),1),e[57]||(e[57]=t("th",null,"Details",-1)),e[58]||(e[58]=t("th",null,"Sensitive",-1)),e[59]||(e[59]=t("th",null,"Intent",-1)),t("th",{class:"cursor-pointer hover:bg-base-200",onClick:e[15]||(e[15]=a=>K("status"))}," Status "+n(Q("status")),1),t("th",{class:"cursor-pointer hover:bg-base-200",onClick:e[16]||(e[16]=a=>K("duration_ms"))}," Duration "+n(Q("duration_ms")),1),e[60]||(e[60]=t("th",null,null,-1))])]),t("tbody",null,[(l(!0),o(B,null,V(ze.value,a=>{var R,Se,Ae,Te,De,Me,$e;return l(),o("tr",{key:a.id,class:g(["hover cursor-pointer",{"bg-base-200":((R=i.value)==null?void 0:R.id)===a.id}]),onClick:qe=>pe(a)},[t("td",null,[t("div",fs,n(_e(a.timestamp)),1),t("div",hs,n(Oe(a.timestamp)),1)]),t("td",null,[t("div",ks,[t("span",ws,n(ee(a.type)),1),t("span",Cs,n(Z(a.type)),1)])]),t("td",null,[a.server_name?(l(),et(d,{key:0,to:`/servers/${a.server_name}`,class:"link link-hover font-medium",onClick:e[17]||(e[17]=le(()=>{},["stop"]))},{default:Ee(()=>[y(n(a.server_name),1)]),_:2},1032,["to"])):(l(),o("span",Ss,"-"))]),t("td",null,[t("div",As,[a.tool_name?(l(),o("code",Ts,n(a.tool_name),1)):(Se=a.metadata)!=null&&Se.action?(l(),o("span",Ds,n(a.metadata.action),1)):(l(),o("span",Ms,"-"))])]),t("td",null,[a.has_sensitive_data?(l(),o("div",{key:0,class:"tooltip tooltip-top","data-tip":(a.detection_types||[]).join(", ")},[t("span",{class:g(["badge badge-sm gap-1",se(a.max_severity)])},n(te(a.max_severity))+" "+n(((Ae=a.detection_types)==null?void 0:Ae.length)||0),3)],8,$s)):(l(),o("span",js,"-"))]),t("td",null,[(De=(Te=a.metadata)==null?void 0:Te.intent)!=null&&De.operation_type?(l(),o("div",{key:0,class:"tooltip tooltip-top","data-tip":(($e=(Me=a.metadata)==null?void 0:Me.intent)==null?void 0:$e.reason)||"No reason provided"},[t("span",{class:g(["badge badge-sm gap-1",ke(a.metadata.intent.operation_type)])},n(he(a.metadata.intent.operation_type))+" "+n(a.metadata.intent.operation_type),3)],8,Ls)):(l(),o("span",Es,"-"))]),t("td",null,[t("div",{class:g(["badge badge-sm",ye(a.status)])},n(xe(a.status)),3)]),t("td",null,[a.duration_ms!==void 0?(l(),o("span",Bs,n(fe(a.duration_ms)),1)):(l(),o("span",Vs,"-"))]),t("td",null,[t("button",{class:"btn btn-xs btn-ghost",onClick:le(qe=>pe(a),["stop"])},[...e[61]||(e[61]=[t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])],8,Ns)])],10,ys)}),128))])]),J.value>1?(l(),o("div",Fs,[t("div",Us," Showing "+n((p.value-1)*z.value+1)+"-"+n(Math.min(p.value*z.value,X.value.length))+" of "+n(X.value.length),1),t("div",zs,[t("button",{onClick:e[18]||(e[18]=a=>p.value=1),disabled:p.value===1,class:"join-item btn btn-sm"}," Β« ",8,Is),t("button",{onClick:e[19]||(e[19]=a=>p.value=Math.max(1,p.value-1)),disabled:p.value===1,class:"join-item btn btn-sm"}," β€Ή ",8,Js),t("button",Os,n(p.value)+" / "+n(J.value),1),t("button",{onClick:e[20]||(e[20]=a=>p.value=Math.min(J.value,p.value+1)),disabled:p.value===J.value,class:"join-item btn btn-sm"}," β€Ί ",8,Rs),t("button",{onClick:e[21]||(e[21]=a=>p.value=J.value),disabled:p.value===J.value,class:"join-item btn btn-sm"}," Β» ",8,Hs)]),t("div",Ps,[x(t("select",{"onUpdate:modelValue":e[22]||(e[22]=a=>z.value=a),class:"select select-bordered select-sm"},[...e[62]||(e[62]=[t("option",{value:10},"10 / page",-1),t("option",{value:25},"25 / page",-1),t("option",{value:50},"50 / page",-1),t("option",{value:100},"100 / page",-1)])],512),[[N,z.value,void 0,{number:!0}]])])])):r("",!0)]))])]),t("div",qs,[x(t("input",{id:"activity-detail-drawer",type:"checkbox",class:"drawer-toggle","onUpdate:modelValue":e[23]||(e[23]=a=>U.value=a)},null,512),[[je,U.value]]),t("div",Ks,[e[88]||(e[88]=t("label",{for:"activity-detail-drawer","aria-label":"close sidebar",class:"drawer-overlay"},null,-1)),t("div",Qs,[i.value?(l(),o("div",Gs,[t("div",Ws,[t("div",null,[t("h3",Xs,[t("span",Ys,n(ee(i.value.type)),1),y(" "+n(Z(i.value.type)),1)]),t("p",Zs,n(_e(i.value.timestamp)),1)]),t("button",{onClick:me,class:"btn btn-sm btn-circle btn-ghost"},[...e[63]||(e[63]=[t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),t("div",ea,[e[64]||(e[64]=t("span",{class:"text-sm text-base-content/60"},"Status:",-1)),t("div",{class:g(["badge",ye(i.value.status)])},n(xe(i.value.status)),3)]),t("div",ta,[i.value.id?(l(),o("div",sa,[e[65]||(e[65]=t("span",{class:"text-sm text-base-content/60 w-24 shrink-0"},"ID:",-1)),t("code",aa,n(i.value.id),1)])):r("",!0),i.value.server_name?(l(),o("div",la,[e[66]||(e[66]=t("span",{class:"text-sm text-base-content/60 w-24 shrink-0"},"Server:",-1)),Y(d,{to:`/servers/${i.value.server_name}`,class:"link link-primary text-sm"},{default:Ee(()=>[y(n(i.value.server_name),1)]),_:1},8,["to"])])):r("",!0),i.value.tool_name?(l(),o("div",oa,[e[67]||(e[67]=t("span",{class:"text-sm text-base-content/60 w-24 shrink-0"},"Tool:",-1)),t("code",na,n(i.value.tool_name),1)])):r("",!0),i.value.duration_ms!==void 0?(l(),o("div",ia,[e[68]||(e[68]=t("span",{class:"text-sm text-base-content/60 w-24 shrink-0"},"Duration:",-1)),t("span",ra,n(fe(i.value.duration_ms)),1)])):r("",!0),i.value.session_id?(l(),o("div",da,[e[69]||(e[69]=t("span",{class:"text-sm text-base-content/60 w-24 shrink-0"},"Session:",-1)),t("code",ua,n(i.value.session_id),1)])):r("",!0),i.value.source?(l(),o("div",ca,[e[70]||(e[70]=t("span",{class:"text-sm text-base-content/60 w-24 shrink-0"},"Source:",-1)),t("span",va,n(i.value.source),1)])):r("",!0)]),i.value.has_sensitive_data?(l(),o("div",pa,[t("h4",ma,[t("span",null,n(te(i.value.max_severity)),1),e[71]||(e[71]=y(" Sensitive Data Detected ",-1))]),t("div",{class:g(["alert",i.value.max_severity==="critical"?"alert-error":"alert-warning"])},[t("div",ba,[t("div",ga,[e[72]||(e[72]=t("span",{class:"font-semibold"},"Severity:",-1)),t("span",{class:g(["badge",se(i.value.max_severity)])},n(te(i.value.max_severity))+" "+n(i.value.max_severity||"unknown"),3)]),i.value.detection_types&&i.value.detection_types.length>0?(l(),o("div",_a,[e[73]||(e[73]=t("span",{class:"font-semibold"},"Detection Types:",-1)),t("div",xa,[(l(!0),o(B,null,V(i.value.detection_types,a=>(l(),o("span",{key:a,class:"badge badge-sm bg-base-100/20 border-current text-inherit"},n(a),1))),128))])])):r("",!0),(u=i.value.metadata)!=null&&u.sensitive_data_detection?(l(),o("div",ya,[e[74]||(e[74]=t("span",{class:"font-semibold"},"Detections:",-1)),t("div",fa,[(l(!0),o(B,null,V(i.value.metadata.sensitive_data_detection.detections||[],(a,R)=>(l(),o("div",{key:R,class:"flex items-center gap-2 bg-base-100/20 rounded px-2 py-1"},[t("span",{class:g(["badge badge-xs",se(a.severity)])},n(a.severity),3),t("span",ha,n(a.type),1),t("span",ka,"in "+n(a.location),1),a.is_likely_example?(l(),o("span",wa,"example")):r("",!0)]))),128))])])):r("",!0)])],2)])):r("",!0),i.value.type==="policy_decision"||i.value.status==="blocked"?(l(),o("div",Ca,[e[78]||(e[78]=t("h4",{class:"font-semibold mb-2 text-warning flex items-center gap-2"},[t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})]),y(" Policy Decision ")],-1)),t("div",Sa,[t("div",Aa,[t("div",Ta,[e[75]||(e[75]=t("span",{class:"font-semibold"},"Decision:",-1)),t("span",Da,n(((D=i.value.metadata)==null?void 0:D.decision)||i.value.status||"Blocked"),1)]),(k=i.value.metadata)!=null&&k.reason?(l(),o("div",Ma,[e[76]||(e[76]=t("span",{class:"font-semibold"},"Reason:",-1)),t("span",$a,n(i.value.metadata.reason),1)])):(w=i.value.metadata)!=null&&w.policy_rule?(l(),o("div",ja,[e[77]||(e[77]=t("span",{class:"font-semibold"},"Policy Rule:",-1)),t("span",La,n(i.value.metadata.policy_rule),1)])):(l(),o("div",Ea," Tool call was blocked by security policy "))])])])):r("",!0),i.value.arguments&&Object.keys(i.value.arguments).length>0?(l(),o("div",Ba,[e[79]||(e[79]=t("h4",{class:"font-semibold mb-2 flex items-center gap-2"},[y(" Request Arguments "),t("span",{class:"badge badge-sm badge-info"},"JSON")],-1)),Y(ne,{data:i.value.arguments,"max-height":"12rem"},null,8,["data"])])):r("",!0),i.value.response?(l(),o("div",Va,[t("h4",Na,[e[80]||(e[80]=y(" Response Body ",-1)),e[81]||(e[81]=t("span",{class:"badge badge-sm badge-info"},"JSON",-1)),i.value.response_truncated?(l(),o("span",Fa,"Truncated")):r("",!0)]),Y(ne,{data:Re(i.value.response),"max-height":"16rem"},null,8,["data"])])):r("",!0),i.value.error_message?(l(),o("div",Ua,[e[82]||(e[82]=t("h4",{class:"font-semibold mb-2 text-error"},"Error Message",-1)),t("div",za,[t("span",Ia,n(i.value.error_message),1)])])):r("",!0),(Ce=i.value.metadata)!=null&&Ce.intent?(l(),o("div",Ja,[e[86]||(e[86]=t("h4",{class:"font-semibold mb-2"},"Intent Declaration",-1)),t("div",Oa,[i.value.metadata.intent.operation_type?(l(),o("div",Ra,[e[83]||(e[83]=t("span",{class:"text-sm text-base-content/60"},"Operation:",-1)),t("span",{class:g(["badge badge-sm",ke(i.value.metadata.intent.operation_type)])},n(he(i.value.metadata.intent.operation_type))+" "+n(i.value.metadata.intent.operation_type),3)])):r("",!0),i.value.metadata.intent.data_sensitivity?(l(),o("div",Ha,[e[84]||(e[84]=t("span",{class:"text-sm text-base-content/60"},"Sensitivity:",-1)),t("span",Pa,n(i.value.metadata.intent.data_sensitivity),1)])):r("",!0),i.value.metadata.intent.reason?(l(),o("div",qa,[e[85]||(e[85]=t("span",{class:"text-sm text-base-content/60"},"Reason:",-1)),t("span",Ka,n(i.value.metadata.intent.reason),1)])):r("",!0)])])):r("",!0),He(i.value)?(l(),o("div",Qa,[e[87]||(e[87]=t("h4",{class:"font-semibold mb-2 flex items-center gap-2"},[y(" Additional Details "),t("span",{class:"badge badge-sm badge-ghost"},"JSON")],-1)),Y(ne,{data:Pe(i.value),"max-height":"12rem"},null,8,["data"])])):r("",!0)])):r("",!0)])])])])}}});export{Wa as default}; diff --git a/web/frontend/dist/assets/AdminDashboard-C1SaV16-.js b/web/frontend/dist/assets/AdminDashboard-C1SaV16-.js deleted file mode 100644 index 44ec6a7d..00000000 --- a/web/frontend/dist/assets/AdminDashboard-C1SaV16-.js +++ /dev/null @@ -1 +0,0 @@ -import{d as C,r as _,L as j,g as S,z as U,B,c as l,o as n,a as s,h as m,i as b,n as f,t as a,k,w,l as A,F as y,s as M}from"./index-myMLoUzQ.js";const T={class:"space-y-6 max-w-6xl mx-auto"},V={class:"flex justify-between items-center"},N=["disabled"],R={class:"stats shadow bg-base-100 w-full"},D={class:"stat"},H={class:"stat-value text-primary"},$={class:"stat-desc"},z={class:"stat"},E={class:"stat-value text-secondary"},F={class:"stat"},I={class:"stat-value text-accent"},L={class:"stat-desc"},J={class:"stat"},P={class:"stat-value text-info"},q={class:"stat-desc"},G={key:0,class:"flex justify-center py-12"},K={key:1,class:"alert alert-error"},O={key:2,class:"grid grid-cols-1 lg:grid-cols-2 gap-6"},Q={class:"card bg-base-100 shadow-sm"},W={class:"card-body"},X={class:"flex items-center justify-between mb-3"},Y={key:0,class:"text-center py-4 text-base-content/60 text-sm"},Z={key:1,class:"space-y-2"},ss={class:"font-medium text-sm"},ts={class:"text-xs text-base-content/50"},es={class:"flex items-center gap-2"},as={class:"text-xs text-base-content/50"},os={class:"card bg-base-100 shadow-sm"},ls={class:"card-body"},ns={class:"flex items-center justify-between mb-3"},rs={key:0,class:"text-center py-4 text-base-content/60 text-sm"},is={key:1,class:"space-y-2"},ds={class:"text-sm"},cs={class:"text-xs"},vs={key:0,class:"text-base-content/50 ml-1"},us={class:"text-xs text-base-content/50"},hs={class:"flex items-center gap-2"},_s={class:"text-xs text-base-content/50"},bs=C({__name:"AdminDashboard",setup(ms){const i=_(!1),d=_(""),c=_([]),v=_([]);let u=null;const o=j({totalUsers:0,activeUsers:0,activeSessions:0,totalServers:0,healthyServers:0,toolCalls24h:0,errorRate24h:0}),g=S(()=>o.totalUsers>0||c.value.length>0||v.value.length>0);function p(r){const t=Date.now(),h=new Date(r).getTime(),e=t-h;return e<1e3?"Just now":e<6e4?`${Math.floor(e/1e3)}s ago`:e<36e5?`${Math.floor(e/6e4)}m ago`:e<864e5?`${Math.floor(e/36e5)}h ago`:`${Math.floor(e/864e5)}d ago`}async function x(){i.value=!0,d.value="";try{const r=await fetch("/api/v1/admin/dashboard",{credentials:"include"});if(!r.ok)throw new Error(`HTTP ${r.status}: ${r.statusText}`);const t=await r.json();o.totalUsers=t.total_users||0,o.activeUsers=t.active_users||0,o.activeSessions=t.active_sessions||0,o.totalServers=t.total_servers||0,o.healthyServers=t.healthy_servers||0,o.toolCalls24h=t.tool_calls_24h||0,o.errorRate24h=t.error_rate_24h||0,c.value=t.recent_users||[],v.value=t.recent_activity||[]}catch(r){d.value=r instanceof Error?r.message:"Failed to load dashboard data"}finally{i.value=!1}}return U(()=>{x(),u=setInterval(x,3e4)}),B(()=>{u&&(clearInterval(u),u=null)}),(r,t)=>{const h=A("router-link");return n(),l("div",T,[s("div",V,[t[2]||(t[2]=s("div",null,[s("h1",{class:"text-2xl font-bold"},"Admin Dashboard"),s("p",{class:"text-base-content/70 mt-1"},"Server overview and system health")],-1)),s("button",{onClick:x,class:"btn btn-sm btn-ghost",disabled:i.value},[(n(),l("svg",{class:f(["w-4 h-4",{"animate-spin":i.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[0]||(t[0]=[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2)),t[1]||(t[1]=b(" Refresh ",-1))],8,N)]),s("div",R,[s("div",D,[t[3]||(t[3]=s("div",{class:"stat-figure text-primary"},[s("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z"})])],-1)),t[4]||(t[4]=s("div",{class:"stat-title"},"Total Users",-1)),s("div",H,a(o.totalUsers),1),s("div",$,a(o.activeUsers)+" active",1)]),s("div",z,[t[5]||(t[5]=s("div",{class:"stat-figure text-secondary"},[s("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})])],-1)),t[6]||(t[6]=s("div",{class:"stat-title"},"Active Sessions",-1)),s("div",E,a(o.activeSessions),1),t[7]||(t[7]=s("div",{class:"stat-desc"},"Current connections",-1))]),s("div",F,[t[8]||(t[8]=s("div",{class:"stat-figure text-accent"},[s("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})])],-1)),t[9]||(t[9]=s("div",{class:"stat-title"},"Total Servers",-1)),s("div",I,a(o.totalServers),1),s("div",L,a(o.healthyServers)+" healthy",1)]),s("div",J,[t[10]||(t[10]=s("div",{class:"stat-figure text-info"},[s("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"})])],-1)),t[11]||(t[11]=s("div",{class:"stat-title"},"Tool Calls (24h)",-1)),s("div",P,a(o.toolCalls24h),1),s("div",q,a(o.errorRate24h)+"% error rate",1)])]),i.value&&!g.value?(n(),l("div",G,[...t[12]||(t[12]=[s("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):m("",!0),d.value?(n(),l("div",K,[t[13]||(t[13]=s("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),s("span",null,a(d.value),1)])):m("",!0),g.value?(n(),l("div",O,[s("div",Q,[s("div",W,[s("div",X,[t[15]||(t[15]=s("h2",{class:"card-title text-lg"},"Recent Users",-1)),k(h,{to:"/admin/users",class:"btn btn-xs btn-ghost"},{default:w(()=>[...t[14]||(t[14]=[b("View All",-1)])]),_:1})]),c.value.length===0?(n(),l("div",Y," No users yet ")):(n(),l("div",Z,[(n(!0),l(y,null,M(c.value,e=>(n(),l("div",{key:e.id,class:"flex items-center justify-between py-2 border-b border-base-200 last:border-0"},[s("div",null,[s("div",ss,a(e.display_name||e.email),1),s("div",ts,a(e.email),1)]),s("div",es,[s("span",{class:f(["badge badge-xs",e.role==="admin"?"badge-primary":"badge-ghost"])},a(e.role),3),s("span",as,a(e.last_login_at?p(e.last_login_at):"Never"),1)])]))),128))]))])]),s("div",os,[s("div",ls,[s("div",ns,[t[17]||(t[17]=s("h2",{class:"card-title text-lg"},"Recent Activity",-1)),k(h,{to:"/activity",class:"btn btn-xs btn-ghost"},{default:w(()=>[...t[16]||(t[16]=[b("View All",-1)])]),_:1})]),v.value.length===0?(n(),l("div",rs," No recent activity ")):(n(),l("div",is,[(n(!0),l(y,null,M(v.value,e=>(n(),l("div",{key:e.id,class:"flex items-center justify-between py-2 border-b border-base-200 last:border-0"},[s("div",null,[s("div",ds,[s("code",cs,a(e.tool_name||e.type),1),e.server_name?(n(),l("span",vs,"on "+a(e.server_name),1)):m("",!0)]),s("div",us,a(e.user_email||"system"),1)]),s("div",hs,[s("span",{class:f(["badge badge-xs",e.status==="success"?"badge-success":e.status==="error"?"badge-error":"badge-ghost"])},a(e.status),3),s("span",_s,a(p(e.timestamp)),1)])]))),128))]))])])])):m("",!0)])}}});export{bs as default}; diff --git a/web/frontend/dist/assets/AdminServers-Bq_mhKvu.js b/web/frontend/dist/assets/AdminServers-Bq_mhKvu.js deleted file mode 100644 index 74a03f9d..00000000 --- a/web/frontend/dist/assets/AdminServers-Bq_mhKvu.js +++ /dev/null @@ -1 +0,0 @@ -import{d as U,r as c,g as p,z as L,c as o,o as r,a as t,h as w,t as n,F as _,p as x,v as R,D as y,s as q,n as k,M as B,Q as V}from"./index-myMLoUzQ.js";const H={class:"p-4 max-w-7xl mx-auto"},I={class:"grid grid-cols-4 gap-3 mb-6"},N={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},O={class:"stat-value text-lg"},z={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},Q={class:"stat-value text-lg text-success"},J={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},G={class:"stat-value text-lg text-info"},K={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},W={class:"stat-value text-lg text-base-content/40"},X={key:0,class:"flex justify-center py-8"},Y={class:"flex gap-2 mb-4"},Z={key:0,class:"text-base-content/50 py-8 text-center"},ee={key:1,class:"overflow-x-auto"},te={class:"table table-sm w-full"},se=["onClick"],ae={class:"font-medium"},ne={class:"badge badge-ghost badge-xs"},le={class:"text-xs text-base-content/50 truncate max-w-xs"},oe={key:0,class:"badge badge-info badge-xs"},re={key:1,class:"badge badge-ghost badge-xs"},de={class:"dropdown dropdown-end"},ie={tabindex:"0",class:"dropdown-content z-[1] menu p-1 shadow-lg bg-base-100 rounded-lg w-48 border border-base-300"},ue=["onClick"],ce=["onClick"],ve={class:"border-t border-base-200 mt-1 pt-1"},be=["onClick"],he={key:2,class:"alert alert-error mt-4"},ge={key:3,class:"toast toast-end toast-bottom"},pe={class:"alert alert-success"},xe=U({__name:"AdminServers",setup(me){const C=V(),m=c(!0),l=c(""),d=c(""),i=c([]),v=c(""),b=c(""),h=c(""),S=p(()=>i.value.filter(s=>s.enabled&&s.connected).length),$=p(()=>i.value.filter(s=>s.shared).length),T=p(()=>i.value.filter(s=>!s.enabled).length),E=p(()=>{let s=i.value;if(v.value){const e=v.value.toLowerCase();s=s.filter(a=>a.name.toLowerCase().includes(e)||a.url&&a.url.toLowerCase().includes(e)||a.command&&a.command.toLowerCase().includes(e)||a.protocol.toLowerCase().includes(e))}return b.value==="enabled"?s=s.filter(e=>e.enabled):b.value==="disabled"&&(s=s.filter(e=>!e.enabled)),h.value==="shared"?s=s.filter(e=>e.shared):h.value==="private"&&(s=s.filter(e=>!e.shared)),s});function M(s){if(s.quarantined)return"badge-error";if(!s.enabled)return"badge-ghost";if(s.health)switch(s.health.level){case"healthy":return"badge-success";case"degraded":return"badge-warning";case"unhealthy":return"badge-error"}return s.connected?"badge-success":"badge-warning"}function P(s){return s.quarantined?"quarantined":s.enabled?s.health?s.health.level:s.connected?"connected":"disconnected":"disabled"}function A(s){C.push("/servers/"+encodeURIComponent(s.name))}async function g(){m.value=!0,l.value="";try{const s=await fetch("/api/v1/admin/servers",{credentials:"include"});if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);const e=await s.json();Array.isArray(e)?i.value=e:e&&Array.isArray(e.servers)?i.value=e.servers:i.value=[]}catch(s){l.value=s instanceof Error?s.message:"Failed to load servers"}finally{m.value=!1}}async function D(s){l.value="",d.value="";try{const e=s.enabled?"disable":"enable",a=await fetch(`/api/v1/admin/servers/${encodeURIComponent(s.name)}/${e}`,{method:"POST",credentials:"include"});if(!a.ok){const u=await a.json().catch(()=>({}));throw new Error(u.message||u.error||`HTTP ${a.status}`)}d.value=`Server "${s.name}" ${s.enabled?"disabled":"enabled"}.`,await g(),f()}catch(e){l.value=e instanceof Error?e.message:"Failed to update server"}}async function F(s){if(s.enabled){l.value="",d.value="";try{const e=await fetch(`/api/v1/admin/servers/${encodeURIComponent(s.name)}/restart`,{method:"POST",credentials:"include"});if(!e.ok){const a=await e.json().catch(()=>({}));throw new Error(a.message||a.error||`HTTP ${e.status}`)}d.value=`Server "${s.name}" restarted.`,await g(),f()}catch(e){l.value=e instanceof Error?e.message:"Failed to restart server"}}}async function j(s){l.value="",d.value="";try{const e=!s.shared,a=await fetch(`/api/v1/admin/servers/${encodeURIComponent(s.name)}/shared`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({shared:e})});if(!a.ok){const u=await a.json().catch(()=>({}));throw new Error(u.message||u.error||`HTTP ${a.status}`)}d.value=`Server "${s.name}" is now ${e?"shared with all users":"private"}.`,await g(),f()}catch(e){l.value=e instanceof Error?e.message:"Failed to update server"}}function f(){setTimeout(()=>{d.value=""},3e3)}return L(()=>{g()}),(s,e)=>(r(),o("div",H,[e[14]||(e[14]=t("div",{class:"flex justify-between items-center mb-6"},[t("div",null,[t("h1",{class:"text-2xl font-bold"},"Server Management"),t("p",{class:"text-sm text-base-content/60 mt-1"},"Manage upstream MCP servers. Shared servers are available to all users.")])],-1)),t("div",I,[t("div",N,[e[5]||(e[5]=t("div",{class:"stat-title text-xs"},"Total",-1)),t("div",O,n(i.value.length),1)]),t("div",z,[e[6]||(e[6]=t("div",{class:"stat-title text-xs"},"Connected",-1)),t("div",Q,n(S.value),1)]),t("div",J,[e[7]||(e[7]=t("div",{class:"stat-title text-xs"},"Shared",-1)),t("div",G,n($.value),1)]),t("div",K,[e[8]||(e[8]=t("div",{class:"stat-title text-xs"},"Disabled",-1)),t("div",W,n(T.value),1)])]),m.value?(r(),o("div",X,[...e[9]||(e[9]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(r(),o(_,{key:1},[t("div",Y,[x(t("input",{"onUpdate:modelValue":e[0]||(e[0]=a=>v.value=a),type:"text",placeholder:"Filter servers...",class:"input input-bordered input-sm flex-1"},null,512),[[R,v.value]]),x(t("select",{"onUpdate:modelValue":e[1]||(e[1]=a=>b.value=a),class:"select select-bordered select-sm"},[...e[10]||(e[10]=[t("option",{value:""},"All Status",-1),t("option",{value:"enabled"},"Enabled",-1),t("option",{value:"disabled"},"Disabled",-1)])],512),[[y,b.value]]),x(t("select",{"onUpdate:modelValue":e[2]||(e[2]=a=>h.value=a),class:"select select-bordered select-sm"},[...e[11]||(e[11]=[t("option",{value:""},"All",-1),t("option",{value:"shared"},"Shared",-1),t("option",{value:"private"},"Private",-1)])],512),[[y,h.value]])]),i.value.length===0?(r(),o("div",Z," No servers configured. Add servers in the configuration file. ")):(r(),o("div",ee,[t("table",te,[e[13]||(e[13]=t("thead",null,[t("tr",{class:"text-xs uppercase text-base-content/50"},[t("th",null,"Server"),t("th",null,"Protocol"),t("th",null,"Endpoint"),t("th",null,"Status"),t("th",null,"Sharing"),t("th",{class:"text-right"},"Actions")])],-1)),t("tbody",null,[(r(!0),o(_,null,q(E.value,a=>(r(),o("tr",{key:a.name,class:"hover:bg-base-200/50 cursor-pointer transition-colors",onClick:u=>A(a)},[t("td",ae,n(a.name),1),t("td",null,[t("span",ne,n(a.protocol),1)]),t("td",le,n(a.url||a.command||"β€”"),1),t("td",null,[t("span",{class:k(["badge badge-xs",M(a)])},n(P(a)),3)]),t("td",null,[a.shared?(r(),o("span",oe,"shared")):(r(),o("span",re,"private"))]),t("td",{class:"text-right",onClick:e[3]||(e[3]=B(()=>{},["stop"]))},[t("div",de,[e[12]||(e[12]=t("label",{tabindex:"0",class:"btn btn-ghost btn-xs btn-square"},[t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v.01M12 12v.01M12 19v.01"})])],-1)),t("ul",ie,[t("li",null,[t("a",{onClick:u=>D(a)},n(a.enabled?"Disable":"Enable"),9,ue)]),t("li",null,[t("a",{onClick:u=>F(a),class:k({"opacity-50":!a.enabled})}," Restart ",10,ce)]),t("li",ve,[t("a",{onClick:u=>j(a)},n(a.shared?"Make Private":"Share with Users"),9,be)])])])])],8,se))),128))])])]))],64)),l.value?(r(),o("div",he,[t("span",null,n(l.value),1),t("button",{class:"btn btn-ghost btn-xs",onClick:e[4]||(e[4]=a=>l.value="")},"Dismiss")])):w("",!0),d.value?(r(),o("div",ge,[t("div",pe,[t("span",null,n(d.value),1)])])):w("",!0)]))}});export{xe as default}; diff --git a/web/frontend/dist/assets/AdminUsers-DsLLAbcP.js b/web/frontend/dist/assets/AdminUsers-DsLLAbcP.js deleted file mode 100644 index 89fe6ea9..00000000 --- a/web/frontend/dist/assets/AdminUsers-DsLLAbcP.js +++ /dev/null @@ -1 +0,0 @@ -import{d as T,r as u,g,z as $,c as l,o as n,a as t,h as p,i as f,n as x,t as o,p as M,v as U,F as A,s as D,k as E,w as N,l as j}from"./index-myMLoUzQ.js";const L={class:"space-y-6 max-w-6xl mx-auto"},V={class:"flex justify-between items-center"},B=["disabled"],S={class:"stats shadow bg-base-100 w-full"},F={class:"stat"},H={class:"stat-value"},P={class:"stat"},z={class:"stat-value text-success"},R={class:"stat"},q={class:"stat-value text-base-content/40"},I={key:0,class:"flex justify-center py-12"},J={key:1,class:"alert alert-error"},O={key:2,class:"text-center py-12 text-base-content/60"},Q={key:3,class:"card bg-base-100 shadow-sm"},G={class:"p-4 border-b border-base-300"},K={class:"overflow-x-auto"},W={class:"table"},X={class:"font-medium"},Y={class:"text-sm text-base-content/60"},Z={class:"badge badge-sm badge-outline"},tt=["title"],et={key:1,class:"text-sm text-base-content/40"},st={class:"flex gap-2"},at=["onClick","disabled","title"],lt={key:0,class:"loading loading-spinner loading-xs"},nt={key:0,class:"p-8 text-center text-base-content/60"},ot={key:4,class:"alert alert-error"},ut=T({__name:"AdminUsers",setup(it){const c=u(!1),b=u(""),v=u(""),i=u([]),r=u(""),m=u(""),y=g(()=>i.value.filter(a=>!a.disabled).length),w=g(()=>i.value.filter(a=>a.disabled).length),_=g(()=>{if(!r.value)return i.value;const a=r.value.toLowerCase();return i.value.filter(e=>e.email.toLowerCase().includes(a)||e.display_name&&e.display_name.toLowerCase().includes(a))});function k(a){const e=Date.now(),d=new Date(a).getTime(),s=e-d;return s<1e3?"Just now":s<6e4?`${Math.floor(s/1e3)}s ago`:s<36e5?`${Math.floor(s/6e4)}m ago`:s<864e5?`${Math.floor(s/36e5)}h ago`:`${Math.floor(s/864e5)}d ago`}async function h(){c.value=!0,b.value="";try{const a=await fetch("/api/v1/admin/users",{credentials:"include"});if(!a.ok)throw new Error(`HTTP ${a.status}: ${a.statusText}`);const e=await a.json();i.value=Array.isArray(e)?e:[]}catch(a){b.value=a instanceof Error?a.message:"Failed to load users"}finally{c.value=!1}}async function C(a){m.value=a.id,v.value="";try{const e=a.disabled?"enable":"disable",d=await fetch(`/api/v1/admin/users/${encodeURIComponent(a.id)}/${e}`,{method:"POST",credentials:"include"});if(!d.ok){const s=await d.json().catch(()=>({}));throw new Error(s.error||`HTTP ${d.status}`)}await h()}catch(e){v.value=e instanceof Error?e.message:"Failed to update user"}finally{m.value=""}}return $(()=>{h()}),(a,e)=>{const d=j("router-link");return n(),l("div",L,[t("div",V,[e[4]||(e[4]=t("div",null,[t("h1",{class:"text-2xl font-bold"},"Users"),t("p",{class:"text-base-content/70 mt-1"},"Manage users and their access")],-1)),t("button",{onClick:h,class:"btn btn-sm btn-ghost",disabled:c.value},[(n(),l("svg",{class:x(["w-4 h-4",{"animate-spin":c.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...e[2]||(e[2]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2)),e[3]||(e[3]=f(" Refresh ",-1))],8,B)]),t("div",S,[t("div",F,[e[5]||(e[5]=t("div",{class:"stat-title"},"Total Users",-1)),t("div",H,o(i.value.length),1)]),t("div",P,[e[6]||(e[6]=t("div",{class:"stat-title"},"Active",-1)),t("div",z,o(y.value),1)]),t("div",R,[e[7]||(e[7]=t("div",{class:"stat-title"},"Disabled",-1)),t("div",q,o(w.value),1)])]),c.value&&i.value.length===0?(n(),l("div",I,[...e[8]||(e[8]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):b.value?(n(),l("div",J,[e[9]||(e[9]=t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,o(b.value),1),t("button",{class:"btn btn-sm",onClick:h},"Try Again")])):i.value.length===0?(n(),l("div",O,[...e[10]||(e[10]=[t("p",{class:"text-lg font-medium"},"No users found",-1)])])):(n(),l("div",Q,[t("div",G,[M(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>r.value=s),type:"text",placeholder:"Search by email or name...",class:"input input-bordered input-sm w-full max-w-xs"},null,512),[[U,r.value]])]),t("div",K,[t("table",W,[e[12]||(e[12]=t("thead",null,[t("tr",null,[t("th",null,"User"),t("th",null,"Provider"),t("th",null,"Last Login"),t("th",null,"Status"),t("th",null,"Actions")])],-1)),t("tbody",null,[(n(!0),l(A,null,D(_.value,s=>(n(),l("tr",{key:s.id,class:"hover"},[t("td",null,[t("div",null,[t("div",X,o(s.display_name||"-"),1),t("div",Y,o(s.email),1)])]),t("td",null,[t("span",Z,o(s.provider),1)]),t("td",null,[s.last_login_at?(n(),l("span",{key:0,class:"text-sm",title:s.last_login_at},o(k(s.last_login_at)),9,tt)):(n(),l("span",et,"Never"))]),t("td",null,[t("span",{class:x(["badge badge-sm",s.disabled?"badge-error":"badge-success"])},o(s.disabled?"Disabled":"Active"),3)]),t("td",null,[t("div",st,[t("button",{class:"btn btn-ghost btn-xs",onClick:dt=>C(s),disabled:m.value===s.id,title:s.disabled?"Enable user":"Disable user"},[m.value===s.id?(n(),l("span",lt)):p("",!0),f(" "+o(s.disabled?"Enable":"Disable"),1)],8,at),E(d,{to:{path:"/activity",query:{user_id:s.id}},class:"btn btn-ghost btn-xs",title:"View user's activity"},{default:N(()=>[...e[11]||(e[11]=[f(" Activity ",-1)])]),_:1},8,["to"])])])]))),128))])])]),_.value.length===0&&r.value?(n(),l("div",nt,' No users match "'+o(r.value)+'" ',1)):p("",!0)])),v.value?(n(),l("div",ot,[t("span",null,o(v.value),1),t("button",{class:"btn btn-ghost btn-xs",onClick:e[1]||(e[1]=s=>v.value="")},"Dismiss")])):p("",!0)])}}});export{ut as default}; diff --git a/web/frontend/dist/assets/AgentTokens-BUr0zPZZ.js b/web/frontend/dist/assets/AgentTokens-BUr0zPZZ.js deleted file mode 100644 index 0e332e7b..00000000 --- a/web/frontend/dist/assets/AgentTokens-BUr0zPZZ.js +++ /dev/null @@ -1 +0,0 @@ -import{d as Y,e as Z,b as G,r as v,g as M,z as J,c as a,o,a as e,h as k,m as C,i as g,t as r,F as T,s as S,n as A,p as y,v as K,N as B,D as Q,q as F}from"./index-myMLoUzQ.js";const X={class:"space-y-6"},ee={class:"flex justify-between items-center"},se={class:"flex gap-2"},te=["disabled"],le={key:0,class:"loading loading-spinner loading-sm"},ae={class:"stats shadow bg-base-100 w-full"},oe={class:"stat"},ne={class:"stat-value"},re={class:"stat"},ie={class:"stat-value text-success"},de={class:"stat"},ue={class:"stat-value text-warning"},ce={key:0,class:"text-center py-12"},ve={key:1,class:"alert alert-error"},me={class:"text-sm"},pe={key:2,class:"text-center py-12"},be={key:3,class:"overflow-x-auto"},ke={class:"table table-zebra w-full"},ge={class:"font-medium"},fe={class:"text-sm bg-base-200 px-2 py-1 rounded"},xe={class:"flex flex-wrap gap-1"},he={class:"flex flex-wrap gap-1"},ye={key:0,class:"text-sm"},we={key:1,class:"text-base-content/40 text-sm"},_e={key:0,class:"badge badge-error badge-sm"},Ce={key:1,class:"badge badge-warning badge-sm"},Te={key:2,class:"badge badge-success badge-sm"},Se={class:"flex gap-1"},Ae=["onClick","disabled"],Fe=["onClick","disabled"],De={key:4,class:"alert alert-warning shadow-lg"},Re={class:"flex-1"},Me={class:"flex items-center gap-2"},Be={class:"text-sm bg-neutral text-neutral-content px-3 py-2 rounded font-mono break-all"},Le={class:"modal-box"},Ne={class:"space-y-4"},je={class:"form-control"},Ee={key:0,class:"label"},He={class:"label-text-alt text-error"},Ie={key:1,class:"label"},Ve={class:"form-control"},$e={class:"flex items-center gap-2 cursor-pointer mb-2 px-1"},ze=["checked"],Ue={key:0,class:"border border-base-300 rounded-lg p-3 max-h-48 overflow-y-auto space-y-1"},Pe={key:0,class:"text-sm text-base-content/50 py-2 text-center"},We=["value"],qe={class:"text-sm"},Oe={key:0,class:"badge badge-success badge-xs ml-auto"},Ye={key:1,class:"badge badge-ghost badge-xs ml-auto"},Ze={key:1,class:"label"},Ge={class:"label-text-alt text-error"},Je={class:"form-control"},Ke={class:"flex flex-col gap-2"},Qe={class:"flex items-center gap-2 cursor-pointer"},Xe={class:"flex items-center gap-2 cursor-pointer"},es={class:"form-control"},ss={class:"modal-action"},ts=["disabled"],ls={key:0,class:"loading loading-spinner loading-sm"},ns=Y({__name:"AgentTokens",setup(as){const u=Z(),D=G(),p=v(!0),f=v(null),b=v([]),x=v(!1),m=v(null),c=v(!1),R=v(null),n=v({name:"",allServers:!0,selectedServers:[],permWrite:!1,permDestructive:!1,expiresIn:"720h"}),d=v({}),L=M(()=>D.servers.map(t=>({name:t.name,connected:t.enabled&&t.tool_count>0})).sort((t,s)=>t.name.localeCompare(s.name)));function H(t){const s=t.target.checked;n.value.allServers=s,s&&(n.value.selectedServers=[])}const I=M(()=>b.value.filter(t=>!t.revoked&&!h(t)).length),V=M(()=>b.value.filter(t=>t.revoked||h(t)).length);function h(t){return new Date(t.expires_at){c.value=!1},2e3)}catch{const t=document.createElement("textarea");t.value=m.value,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),c.value=!0,setTimeout(()=>{c.value=!1},2e3)}}function O(){m.value=null,c.value=!1}return J(async()=>{await new Promise(t=>setTimeout(t,100)),w()}),(t,s)=>(o(),a("div",X,[e("div",ee,[s[9]||(s[9]=e("div",null,[e("h1",{class:"text-3xl font-bold"},"Agent Tokens"),e("p",{class:"text-base-content/70 mt-1"},"Create and manage scoped API tokens for AI agents and automation")],-1)),e("div",se,[e("button",{onClick:s[0]||(s[0]=(...l)=>C(_)&&C(_)(...l)),disabled:p.value,class:"btn btn-outline"},[s[7]||(s[7]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)),p.value?(o(),a("span",le)):k("",!0),g(" "+r(p.value?"Refreshing...":"Refresh"),1)],8,te),e("button",{onClick:j,class:"btn btn-primary"},[...s[8]||(s[8]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),g(" Create Token ",-1)])])])]),e("div",ae,[e("div",oe,[s[10]||(s[10]=e("div",{class:"stat-title"},"Total Tokens",-1)),e("div",ne,r(b.value.length),1),s[11]||(s[11]=e("div",{class:"stat-desc"},"All agent tokens",-1))]),e("div",re,[s[12]||(s[12]=e("div",{class:"stat-title"},"Active",-1)),e("div",ie,r(I.value),1),s[13]||(s[13]=e("div",{class:"stat-desc"},"Currently valid",-1))]),e("div",de,[s[14]||(s[14]=e("div",{class:"stat-title"},"Expired / Revoked",-1)),e("div",ue,r(V.value),1),s[15]||(s[15]=e("div",{class:"stat-desc"},"No longer usable",-1))])]),p.value?(o(),a("div",ce,[...s[16]||(s[16]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1),e("p",{class:"mt-4"},"Loading tokens...",-1)])])):f.value?(o(),a("div",ve,[s[18]||(s[18]=e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[s[17]||(s[17]=e("h3",{class:"font-bold"},"Failed to load tokens",-1)),e("div",me,r(f.value),1)]),e("button",{onClick:s[1]||(s[1]=(...l)=>C(_)&&C(_)(...l)),class:"btn btn-sm"}," Try Again ")])):b.value.length===0?(o(),a("div",pe,[s[20]||(s[20]=e("svg",{class:"w-24 h-24 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"})],-1)),s[21]||(s[21]=e("h3",{class:"text-xl font-semibold mb-2"},"No agent tokens yet",-1)),s[22]||(s[22]=e("p",{class:"text-base-content/70 mb-4"}," Create scoped tokens for your AI agents and automated workflows. ",-1)),e("button",{onClick:j,class:"btn btn-primary"},[...s[19]||(s[19]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),g(" Create Your First Token ",-1)])])])):(o(),a("div",be,[e("table",ke,[s[25]||(s[25]=e("thead",null,[e("tr",null,[e("th",null,"Name"),e("th",null,"Prefix"),e("th",null,"Servers"),e("th",null,"Permissions"),e("th",null,"Expires"),e("th",null,"Last Used"),e("th",null,"Status"),e("th",null,"Actions")])],-1)),e("tbody",null,[(o(!0),a(T,null,S(b.value,l=>(o(),a("tr",{key:l.name},[e("td",ge,r(l.name),1),e("td",null,[e("code",fe,r(l.token_prefix),1)]),e("td",null,[e("div",xe,[(o(!0),a(T,null,S(l.allowed_servers,i=>(o(),a("span",{key:i,class:"badge badge-outline badge-sm"},r(i),1))),128))])]),e("td",null,[e("div",he,[(o(!0),a(T,null,S(l.permissions,i=>(o(),a("span",{key:i,class:A(["badge badge-sm",z(i)])},r(i),3))),128))])]),e("td",null,[e("span",{class:A({"text-warning":$(l),"text-error":h(l)})},r(N(l.expires_at)),3)]),e("td",null,[l.last_used_at?(o(),a("span",ye,r(N(l.last_used_at)),1)):(o(),a("span",we,"Never"))]),e("td",null,[l.revoked?(o(),a("span",_e,"Revoked")):h(l)?(o(),a("span",Ce,"Expired")):(o(),a("span",Te,"Active"))]),e("td",null,[e("div",Se,[e("button",{onClick:i=>P(l.name),disabled:l.revoked,class:"btn btn-xs btn-outline",title:"Regenerate token secret"},[...s[23]||(s[23]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1),g(" Regenerate ",-1)])],8,Ae),e("button",{onClick:i=>W(l.name),disabled:l.revoked,class:"btn btn-xs btn-error btn-outline",title:"Revoke token"},[...s[24]||(s[24]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M18.364 18.364A9 9 0 005.636 5.636m12.728 12.728A9 9 0 015.636 5.636m12.728 12.728L5.636 5.636"})],-1),g(" Revoke ",-1)])],8,Fe)])])]))),128))])])])),m.value?(o(),a("div",De,[s[28]||(s[28]=e("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),e("div",Re,[s[26]||(s[26]=e("h3",{class:"font-bold"},"Save this token now!",-1)),s[27]||(s[27]=e("p",{class:"text-sm mb-2"},"This token cannot be retrieved again after you dismiss this message.",-1)),e("div",Me,[e("code",Be,r(m.value),1),e("button",{onClick:q,class:A(["btn btn-sm btn-neutral shrink-0",{"btn-success":c.value}])},r(c.value?"Copied!":"Copy"),3)])]),e("button",{onClick:O,class:"btn btn-sm btn-ghost shrink-0"},"Dismiss")])):k("",!0),e("dialog",{ref_key:"createDialog",ref:R,class:"modal"},[e("div",Le,[s[40]||(s[40]=e("h3",{class:"font-bold text-lg mb-4"},"Create Agent Token",-1)),e("div",Ne,[e("div",je,[s[30]||(s[30]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Token Name")],-1)),y(e("input",{"onUpdate:modelValue":s[2]||(s[2]=l=>n.value.name=l),type:"text",placeholder:"e.g., ci-pipeline, dev-agent",class:A(["input input-bordered w-full",{"input-error":d.value.name}])},null,2),[[K,n.value.name]]),d.value.name?(o(),a("label",Ee,[e("span",He,r(d.value.name),1)])):(o(),a("label",Ie,[...s[29]||(s[29]=[e("span",{class:"label-text-alt"},"Alphanumeric, hyphens, and underscores only",-1)])]))]),e("div",Ve,[s[33]||(s[33]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Allowed Servers")],-1)),e("label",$e,[e("input",{type:"checkbox",checked:n.value.allServers,onChange:H,class:"checkbox checkbox-sm checkbox-primary"},null,40,ze),s[31]||(s[31]=e("span",{class:"text-sm font-medium"},"All servers",-1)),s[32]||(s[32]=e("span",{class:"badge badge-ghost badge-xs"},"wildcard",-1))]),n.value.allServers?k("",!0):(o(),a("div",Ue,[L.value.length===0?(o(),a("div",Pe," No servers configured ")):k("",!0),(o(!0),a(T,null,S(L.value,l=>(o(),a("label",{key:l.name,class:"flex items-center gap-2 cursor-pointer hover:bg-base-200 rounded px-2 py-1"},[y(e("input",{type:"checkbox",value:l.name,"onUpdate:modelValue":s[3]||(s[3]=i=>n.value.selectedServers=i),class:"checkbox checkbox-sm"},null,8,We),[[B,n.value.selectedServers]]),e("span",qe,r(l.name),1),l.connected?(o(),a("span",Oe,"connected")):(o(),a("span",Ye,"offline"))]))),128))])),!n.value.allServers&&d.value.servers?(o(),a("label",Ze,[e("span",Ge,r(d.value.servers),1)])):k("",!0)]),e("div",Je,[s[37]||(s[37]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Permissions")],-1)),e("div",Ke,[s[36]||(s[36]=e("label",{class:"flex items-center gap-2 cursor-not-allowed"},[e("input",{type:"checkbox",checked:"",disabled:"",class:"checkbox checkbox-sm checkbox-info"}),e("span",{class:"text-sm"},"read"),e("span",{class:"badge badge-info badge-xs"},"always included")],-1)),e("label",Qe,[y(e("input",{"onUpdate:modelValue":s[4]||(s[4]=l=>n.value.permWrite=l),type:"checkbox",class:"checkbox checkbox-sm checkbox-warning"},null,512),[[B,n.value.permWrite]]),s[34]||(s[34]=e("span",{class:"text-sm"},"write",-1))]),e("label",Xe,[y(e("input",{"onUpdate:modelValue":s[5]||(s[5]=l=>n.value.permDestructive=l),type:"checkbox",class:"checkbox checkbox-sm checkbox-error"},null,512),[[B,n.value.permDestructive]]),s[35]||(s[35]=e("span",{class:"text-sm"},"destructive",-1))])])]),e("div",es,[s[39]||(s[39]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Expires In")],-1)),y(e("select",{"onUpdate:modelValue":s[6]||(s[6]=l=>n.value.expiresIn=l),class:"select select-bordered w-full"},[...s[38]||(s[38]=[e("option",{value:"168h"},"7 days",-1),e("option",{value:"720h"},"30 days",-1),e("option",{value:"2160h"},"90 days",-1),e("option",{value:"8760h"},"365 days",-1)])],512),[[Q,n.value.expiresIn]])])]),e("div",ss,[e("button",{onClick:E,class:"btn"},"Cancel"),e("button",{onClick:U,disabled:x.value,class:"btn btn-primary"},[x.value?(o(),a("span",ls)):k("",!0),g(" "+r(x.value?"Creating...":"Create Token"),1)],8,ts)])]),s[41]||(s[41]=e("form",{method:"dialog",class:"modal-backdrop"},[e("button",null,"close")],-1))],512)]))}});export{ns as default}; diff --git a/web/frontend/dist/assets/Feedback-BTV7aiQR.js b/web/frontend/dist/assets/Feedback-BTV7aiQR.js deleted file mode 100644 index f2192024..00000000 --- a/web/frontend/dist/assets/Feedback-BTV7aiQR.js +++ /dev/null @@ -1 +0,0 @@ -import{d as k,L as y,r as d,c as a,o,a as e,h as m,t as g,M as x,p as b,D as w,i as p,v as f,n as _,q as C}from"./index-myMLoUzQ.js";const F={class:"space-y-6"},M={key:0,class:"alert alert-success"},V={key:0,class:"text-sm mt-1"},B=["href"],S={key:1,class:"alert alert-error"},q={key:2,class:"card bg-base-100 shadow-md"},D={class:"card-body"},U={class:"form-control w-full"},z={class:"form-control w-full"},E={class:"label"},H={class:"form-control w-full"},N={class:"form-control mt-6"},P=["disabled"],T={key:0,class:"loading loading-spinner loading-sm"},j={key:1},R=k({__name:"Feedback",setup(A){const t=y({category:"bug",message:"",email:""}),n=d(!1),i=d(!1),r=d(""),u=d("");async function v(){var c;if(!(t.message.length<10)){n.value=!0,r.value="";try{const s={category:t.category,message:t.message};t.email&&(s.email=t.email);const l=await C.submitFeedback(s);l.success?(i.value=!0,u.value=((c=l.data)==null?void 0:c.issue_url)||""):r.value=l.error||"Failed to submit feedback. Please try again."}catch(s){r.value=s instanceof Error?s.message:"An unexpected error occurred."}finally{n.value=!1}}}function h(){t.category="bug",t.message="",t.email="",i.value=!1,r.value="",u.value=""}return(c,s)=>(o(),a("div",F,[s[10]||(s[10]=e("div",null,[e("h1",{class:"text-3xl font-bold"},"Send Feedback"),e("p",{class:"text-base-content/70 mt-1"},"Help us improve MCPProxy by sharing your thoughts, reporting bugs, or requesting features.")],-1)),i.value?(o(),a("div",M,[s[4]||(s[4]=e("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[s[3]||(s[3]=e("h3",{class:"font-bold"},"Thanks! Your feedback was submitted.",-1)),u.value?(o(),a("p",V,[e("a",{href:u.value,target:"_blank",rel:"noopener noreferrer",class:"link link-hover underline"}," View the GitHub Issue ",8,B)])):m("",!0)]),e("button",{class:"btn btn-sm btn-ghost",onClick:h},"Send Another")])):m("",!0),r.value?(o(),a("div",S,[s[5]||(s[5]=e("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,g(r.value),1)])):m("",!0),i.value?m("",!0):(o(),a("div",q,[e("div",D,[e("form",{onSubmit:x(v,["prevent"]),class:"space-y-4"},[e("div",U,[s[7]||(s[7]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Category")],-1)),b(e("select",{"onUpdate:modelValue":s[0]||(s[0]=l=>t.category=l),class:"select select-bordered w-full"},[...s[6]||(s[6]=[e("option",{value:"bug"},"Bug Report",-1),e("option",{value:"feature"},"Feature Request",-1),e("option",{value:"other"},"Other",-1)])],512),[[w,t.category]])]),e("div",z,[s[8]||(s[8]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},[p("Message "),e("span",{class:"text-error"},"*")])],-1)),b(e("textarea",{"onUpdate:modelValue":s[1]||(s[1]=l=>t.message=l),class:"textarea textarea-bordered w-full h-40",placeholder:"Describe the bug, feature request, or other feedback...",required:"",minlength:"10",maxlength:"5000"},null,512),[[f,t.message]]),e("label",E,[e("span",{class:_(["label-text-alt",{"text-error":t.message.length>0&&t.message.length<10}])},g(t.message.length)+"/5000 characters (minimum 10) ",3)])]),e("div",H,[s[9]||(s[9]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Email")],-1)),b(e("input",{"onUpdate:modelValue":s[2]||(s[2]=l=>t.email=l),type:"email",class:"input input-bordered w-full",placeholder:"For follow-up (optional)"},null,512),[[f,t.email]])]),e("div",N,[e("button",{type:"submit",class:"btn btn-primary",disabled:n.value||t.message.length<10},[n.value?(o(),a("span",T)):(o(),a("span",j,"Submit Feedback"))],8,P)])],32)])])),s[11]||(s[11]=e("div",{class:"text-sm text-base-content/60"},[p(" You can also "),e("a",{href:"https://github.com/smart-mcp-proxy/mcpproxy-go/issues/new",target:"_blank",rel:"noopener noreferrer",class:"link link-hover link-primary"},"open an issue on GitHub"),p(". ")],-1))]))}});export{R as default}; diff --git a/web/frontend/dist/assets/Login-BS5rjyms.js b/web/frontend/dist/assets/Login-BS5rjyms.js deleted file mode 100644 index 813b7a01..00000000 --- a/web/frontend/dist/assets/Login-BS5rjyms.js +++ /dev/null @@ -1 +0,0 @@ -import{d as o,u as r,c as a,o as i,a as e,t as l}from"./index-myMLoUzQ.js";const d={class:"min-h-screen flex items-center justify-center bg-base-200"},c="your organization",p=o({__name:"Login",setup(u){const s=r();function n(){s.login()}return(m,t)=>(i(),a("div",d,[e("div",{class:"card w-96 bg-base-100 shadow-xl"},[e("div",{class:"card-body items-center text-center"},[t[0]||(t[0]=e("h1",{class:"card-title text-2xl font-bold"},"MCPProxy Server",-1)),t[1]||(t[1]=e("p",{class:"text-base-content/70 mb-4"},"Sign in to access your MCP tools",-1)),t[2]||(t[2]=e("div",{class:"divider"},null,-1)),e("button",{class:"btn btn-primary w-full",onClick:n}," Sign in with "+l(c)),t[3]||(t[3]=e("p",{class:"text-sm text-base-content/50 mt-4"}," Powered by MCPProxy ",-1))])])]))}});export{p as default}; diff --git a/web/frontend/dist/assets/NotFound-BpDrBCs_.js b/web/frontend/dist/assets/NotFound-BpDrBCs_.js deleted file mode 100644 index c430da35..00000000 --- a/web/frontend/dist/assets/NotFound-BpDrBCs_.js +++ /dev/null @@ -1 +0,0 @@ -import{d as s,c as n,o as a,a as e,k as r,w as l,l as d,i as m}from"./index-myMLoUzQ.js";const i={class:"text-center py-20"},u=s({__name:"NotFound",setup(p){return(x,t)=>{const o=d("router-link");return a(),n("div",i,[t[1]||(t[1]=e("h1",{class:"text-6xl font-bold text-base-content/50 mb-4"},"404",-1)),t[2]||(t[2]=e("h2",{class:"text-2xl font-semibold mb-4"},"Page Not Found",-1)),t[3]||(t[3]=e("p",{class:"text-base-content/70 mb-8"}," The page you're looking for doesn't exist or has been moved. ",-1)),r(o,{to:"/",class:"btn btn-primary"},{default:l(()=>[...t[0]||(t[0]=[m(" Go Home ",-1)])]),_:1})])}}});export{u as default}; diff --git a/web/frontend/dist/assets/Repositories-BAogKZE_.js b/web/frontend/dist/assets/Repositories-BAogKZE_.js deleted file mode 100644 index 0d1e5ce5..00000000 --- a/web/frontend/dist/assets/Repositories-BAogKZE_.js +++ /dev/null @@ -1 +0,0 @@ -import{d as $,r,g as T,z as q,c as a,o as l,a as e,h as v,k as P,p as B,D as G,F as V,s as j,v as U,t as d,w as E,T as Q,G as z,C as J,q as x,i as w}from"./index-myMLoUzQ.js";const K={class:"space-y-6"},O={class:"card bg-base-100 shadow-md"},W={class:"card-body"},X={class:"flex flex-col sm:flex-row gap-4"},Y={class:"form-control flex-1"},Z=["disabled"],ee=["value"],se={class:"form-control flex-1"},te=["disabled"],oe={class:"form-control sm:self-end"},ae=["disabled"],le={key:0,class:"loading loading-spinner loading-sm"},ne={key:1},ie={key:0,class:"alert alert-info mt-4"},re={class:"font-semibold"},de={class:"text-sm"},ce={key:0,class:"card bg-base-100 shadow-md"},ue={key:1,class:"alert alert-error"},ve={key:2,class:"space-y-4"},pe={class:"flex justify-between items-center"},he={class:"text-sm text-base-content/70"},me={class:"card-body"},fe={class:"flex justify-between items-start"},be={class:"card-title text-lg"},ge={class:"badge badge-outline badge-sm"},ye={class:"text-sm text-base-content/70 line-clamp-3"},_e={class:"flex flex-wrap gap-2 mt-2"},xe={key:0,class:"badge badge-success badge-sm"},we={key:1,class:"badge badge-info badge-sm"},ke={key:0,class:"mt-3"},Ce={class:"flex items-center justify-between bg-base-200 rounded px-2 py-1"},Me={class:"text-xs flex-1 overflow-x-auto"},Se=["onClick"],Re={class:"card-actions justify-end mt-4"},Te=["onClick"],Pe=["onClick","disabled"],Be={key:0,class:"loading loading-spinner loading-xs"},Ve={key:1},je={key:3,class:"card bg-base-100 shadow-md"},ze={key:4,class:"card bg-base-100 shadow-md"},He={key:5,class:"toast toast-end"},Fe={class:"alert alert-success"},De=$({__name:"Repositories",setup(Ie){const m=r([]),i=r(""),p=r(""),c=r([]),f=r(!1),u=r(!1),n=r(null),h=r(null),b=r(!1),k=r("");let g=null;const y=T(()=>m.value.find(t=>t.id===i.value)),H=T(()=>[{icon:"πŸ“¦",title:"Discover MCP Servers",description:"Browse official and community MCP servers from multiple registries",sections:[{title:"How to use",list:["Select a registry from the dropdown menu","Search for servers by name or description",'Click "Add to MCP" to install a server',"View source code and installation commands for each server"]}]},{icon:"πŸ€–",title:"LLM Agent Integration",description:"Let AI agents help you discover and install MCP servers",sections:[{title:"Example prompts",list:["Find and add MCP servers for working with GitHub","Install the best MCP server for file system operations","Search for database-related MCP servers and add them","Discover Slack integration servers and configure them"]}]},{icon:"πŸ’‘",title:"Installation Tips",description:"Servers can be installed via npm, pip, or connected remotely",sections:[{title:"Server types",list:["NPM packages: Installed with npx command","Python packages: Installed with uvx or pipx","Remote servers: Connected via HTTP endpoints","Docker containers: Run in isolated environments"]}]}]);async function F(){f.value=!0,n.value=null;try{const t=await x.listRegistries();t.success&&t.data?m.value=t.data.registries:n.value=t.error||"Failed to load registries"}catch(t){n.value="Failed to load registries: "+t.message}finally{f.value=!1}}async function _(){if(i.value){u.value=!0,n.value=null;try{const t=await x.searchRegistryServers(i.value,{query:p.value,limit:20});t.success&&t.data?c.value=t.data.servers:(n.value=t.error||"Failed to search servers",c.value=[])}catch(t){n.value="Failed to search servers: "+t.message,c.value=[]}finally{u.value=!1}}}function I(){p.value="",c.value=[],n.value=null,i.value&&_()}function N(){g&&clearTimeout(g),g=setTimeout(()=>{i.value&&_()},500)}async function D(t){h.value=t.id,n.value=null;try{const s=await x.addServerFromRepository(t);s.success?C(`Server "${t.name}" added successfully!`):n.value=s.error||"Failed to add server"}catch(s){n.value="Failed to add server: "+s.message}finally{h.value=null}}function L(t){navigator.clipboard.writeText(t),C("Installation command copied to clipboard!")}function A(t){window.open(t,"_blank")}function C(t){k.value=t,b.value=!0,setTimeout(()=>{b.value=!1},3e3)}return q(()=>{F()}),(t,s)=>(l(),a("div",K,[s[15]||(s[15]=e("div",{class:"flex justify-between items-center"},[e("div",null,[e("h1",{class:"text-3xl font-bold"},"Repositories"),e("p",{class:"text-base-content/70 mt-1"},"Browse and discover MCP server repositories")])],-1)),e("div",O,[e("div",W,[e("div",X,[e("div",Y,[s[3]||(s[3]=e("label",{class:"label"},[e("span",{class:"label-text font-semibold"},"Select Registry")],-1)),B(e("select",{"onUpdate:modelValue":s[0]||(s[0]=o=>i.value=o),class:"select select-bordered w-full",onChange:I,disabled:f.value},[s[2]||(s[2]=e("option",{disabled:"",value:""},"Choose a registry...",-1)),(l(!0),a(V,null,j(m.value,o=>(l(),a("option",{key:o.id,value:o.id},d(o.name),9,ee))),128))],40,Z),[[G,i.value]])]),e("div",se,[s[4]||(s[4]=e("label",{class:"label"},[e("span",{class:"label-text font-semibold"},"Search Servers")],-1)),B(e("input",{"onUpdate:modelValue":s[1]||(s[1]=o=>p.value=o),type:"text",placeholder:"Search by name or description...",class:"input input-bordered w-full",onInput:N,disabled:!i.value||u.value},null,40,te),[[U,p.value]])]),e("div",oe,[e("button",{onClick:_,class:"btn btn-primary",disabled:!i.value||u.value},[u.value?(l(),a("span",le)):(l(),a("span",ne,"Search"))],8,ae)])]),y.value?(l(),a("div",ie,[s[5]||(s[5]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[e("p",re,d(y.value.name),1),e("p",de,d(y.value.description),1)])])):v("",!0)])]),u.value?(l(),a("div",ce,[...s[6]||(s[6]=[e("div",{class:"card-body"},[e("div",{class:"flex flex-col items-center justify-center py-12"},[e("div",{class:"loading loading-spinner loading-lg mb-4"}),e("p",{class:"text-base-content/70"},"Searching servers...")])],-1)])])):n.value?(l(),a("div",ue,[s[7]||(s[7]=e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,d(n.value),1)])):c.value.length>0?(l(),a("div",ve,[e("div",pe,[e("p",he,"Found "+d(c.value.length)+" server(s)",1)]),P(Q,{name:"repo-card",tag:"div",class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},{default:E(()=>[(l(!0),a(V,null,j(c.value,o=>{var M,S;return l(),a("div",{key:o.id,class:"card bg-base-100 shadow-md hover:shadow-lg transition-shadow"},[e("div",me,[e("div",fe,[e("h3",be,d(o.name),1),e("div",ge,d(o.registry),1)]),e("p",ye,d(o.description),1),e("div",_e,[(S=(M=o.repository_info)==null?void 0:M.npm)!=null&&S.exists?(l(),a("div",xe,[...s[8]||(s[8]=[e("svg",{class:"w-3 h-3 mr-1",fill:"currentColor",viewBox:"0 0 24 24"},[e("path",{d:"M0 0h24v24H0z",fill:"none"}),e("path",{d:"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"})],-1),w(" NPM ",-1)])])):v("",!0),o.url?(l(),a("div",we,[...s[9]||(s[9]=[e("svg",{class:"w-3 h-3 mr-1",fill:"currentColor",viewBox:"0 0 24 24"},[e("path",{d:"M0 0h24v24H0z",fill:"none"}),e("path",{d:"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"})],-1),w(" Remote ",-1)])])):v("",!0)]),o.installCmd?(l(),a("div",ke,[e("div",Ce,[e("code",Me,d(o.installCmd),1),e("button",{onClick:R=>L(o.installCmd),class:"btn btn-ghost btn-xs ml-2",title:"Copy install command"},[...s[10]||(s[10]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})],-1)])],8,Se)])])):v("",!0),e("div",Re,[o.source_code_url?(l(),a("button",{key:0,onClick:R=>A(o.source_code_url),class:"btn btn-ghost btn-sm"},[...s[11]||(s[11]=[e("svg",{class:"w-4 h-4 mr-1",fill:"currentColor",viewBox:"0 0 24 24"},[e("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"})],-1),w(" Source ",-1)])],8,Te)):v("",!0),e("button",{onClick:R=>D(o),class:"btn btn-primary btn-sm",disabled:h.value===o.id},[h.value===o.id?(l(),a("span",Be)):(l(),a("span",Ve,"Add to MCP"))],8,Pe)])])])}),128))]),_:1})])):i.value?(l(),a("div",ze,[...s[13]||(s[13]=[z('

No Servers Found

Try adjusting your search query or select a different registry.

',1)])])):(l(),a("div",je,[...s[12]||(s[12]=[z('

Select a Registry

Choose a registry from the dropdown to start browsing MCP servers.

',1)])])),b.value?(l(),a("div",He,[e("div",Fe,[s[14]||(s[14]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,d(k.value),1)])])):v("",!0),P(J,{hints:H.value},null,8,["hints"])]))}});export{De as default}; diff --git a/web/frontend/dist/assets/ScanReport-nG0rtEIx.js b/web/frontend/dist/assets/ScanReport-nG0rtEIx.js deleted file mode 100644 index bae55143..00000000 --- a/web/frontend/dist/assets/ScanReport-nG0rtEIx.js +++ /dev/null @@ -1 +0,0 @@ -import{d as ye,b as fe,e as ke,r as g,g as S,z as we,c as t,o as a,a as e,h as i,k as X,w as Y,l as Se,n as b,t as l,F as h,s as M,p as Ce,N as Fe,i as _,q as D}from"./index-myMLoUzQ.js";const je={class:"space-y-6"},Te={class:"flex items-center gap-4"},Ae={class:"flex-1"},Me={key:0,class:"flex items-center gap-2 mt-1"},Be={key:0,class:"text-center py-12"},Le={key:1,class:"alert alert-error"},Re={class:"text-sm"},ze={class:"card bg-base-100 shadow-xl"},De={class:"card-body"},Ne={class:"grid grid-cols-1 md:grid-cols-2 gap-4 mt-2"},Pe={class:"font-mono text-sm select-all break-all"},$e={class:"text-sm"},qe={class:"text-sm"},Ve={key:0,class:"card bg-base-100 shadow-xl"},Ee={class:"card-body"},Ie={class:"flex flex-wrap gap-2 mt-2"},Ue={key:0,class:"badge badge-outline badge-sm"},Oe={key:1,class:"badge badge-info badge-sm"},He={key:2,class:"badge badge-warning badge-sm"},Qe={key:3,class:"badge badge-outline badge-sm"},We={key:4,class:"badge badge-outline badge-sm"},Ge={key:5,class:"badge badge-ghost badge-sm font-mono"},Je={class:"flex flex-wrap gap-3"},Ke={class:"stats shadow bg-base-100"},Xe={class:"stat py-3 px-4"},Ye={class:"stat-value text-lg text-error"},Ze={class:"stats shadow bg-base-100"},es={class:"stat py-3 px-4"},ss={class:"stat-value text-lg text-warning"},ts={class:"stats shadow bg-base-100"},as={class:"stat py-3 px-4"},ns={class:"stat-value text-lg text-info"},os={class:"stats shadow bg-base-100"},ls={class:"stat py-3 px-4"},rs={class:"stat-value text-lg"},is={key:1,class:"alert shadow-sm bg-base-200 border border-base-300"},ds={key:2,class:"alert alert-warning"},cs={key:3,class:"alert alert-error"},us={key:4,class:"alert alert-success"},vs={key:5,class:"space-y-4"},ps=["checked"],_s={class:"collapse-title font-medium flex items-center gap-2"},gs={class:"collapse-content"},bs={class:"space-y-2"},ms={class:"collapse-title py-2 px-4 min-h-0 flex items-center gap-3"},xs={class:"font-medium text-sm flex-1"},hs={key:0,class:"font-mono text-xs text-base-content/50"},ys={key:1,class:"badge badge-xs badge-success badge-outline"},fs={class:"collapse-content px-4 pb-3"},ks={class:"space-y-2 text-sm"},ws={class:"text-base-content/80"},Ss={key:0,class:"mt-2"},Cs={class:"bg-base-300 text-xs p-3 rounded-lg max-h-32 overflow-auto whitespace-pre-wrap break-words border border-base-content/10"},Fs={class:"grid grid-cols-2 gap-2 text-xs"},js={key:0},Ts={class:"ml-1 bg-base-300 px-1 rounded"},As={key:1},Ms={class:"ml-1 font-medium"},Bs={key:0,class:"ml-1"},Ls={key:2},Rs={class:"ml-1 font-mono"},zs={key:0,class:"ml-1 text-base-content/50"},Ds={key:3},Ns={class:"ml-1 font-mono text-success"},Ps={key:4},$s={class:"ml-1 bg-base-300 px-1 rounded"},qs={key:5},Vs={class:"ml-1"},Es=["href"],Is={key:6,class:"alert alert-info"},Us={key:7,class:"space-y-4"},Os={class:"collapse collapse-arrow bg-base-100 shadow-md"},Hs={class:"collapse-title font-medium flex items-center gap-2"},Qs={class:"collapse-content"},Ws={class:"space-y-2"},Gs={class:"collapse-title py-2 px-4 min-h-0 flex items-center gap-3"},Js={class:"font-medium text-sm flex-1"},Ks={key:0,class:"font-mono text-xs text-base-content/50"},Xs={key:1,class:"badge badge-xs badge-success badge-outline"},Ys={class:"collapse-content px-4 pb-3"},Zs={class:"space-y-2 text-sm"},et={class:"text-base-content/80"},st={key:0,class:"mt-2"},tt={class:"bg-base-300 text-xs p-3 rounded-lg max-h-32 overflow-auto whitespace-pre-wrap break-words border border-base-content/10"},at={class:"grid grid-cols-2 gap-2 text-xs"},nt={key:0},ot={class:"ml-1 bg-base-300 px-1 rounded"},lt={key:1},rt={class:"ml-1 font-medium"},it={key:0,class:"ml-1"},dt={key:2},ct={class:"ml-1 font-mono"},ut={key:0,class:"ml-1 text-base-content/50"},vt={key:3},pt={class:"ml-1 font-mono text-success"},_t={key:4},gt={class:"ml-1 bg-base-300 px-1 rounded"},bt={key:5},mt={class:"ml-1"},xt=["href"],ht={key:8,class:"alert alert-success"},yt={class:"collapse collapse-arrow bg-base-100 shadow-md"},ft=["checked"],kt={class:"collapse-title font-medium flex items-center gap-2 flex-wrap"},wt={key:0,class:"badge badge-sm badge-ghost"},St={key:1,class:"badge badge-sm badge-error"},Ct={key:2,class:"badge badge-sm badge-outline"},Ft={class:"collapse-content"},jt={key:0,class:"text-sm text-base-content/50 py-2"},Tt={key:1,class:"text-center py-6"},At={key:2},Mt={class:"flex flex-wrap items-center gap-3 mb-3 pb-3 border-b border-base-200"},Bt={class:"join"},Lt={class:"label cursor-pointer gap-2 py-0"},Rt={key:0,class:"text-xs text-base-content/50 ml-auto font-mono break-all"},zt={key:0,class:"text-sm text-base-content/50 py-4 italic"},Dt={key:1,class:"space-y-1 font-mono text-xs max-h-96 overflow-auto pr-2"},Nt={class:"text-base-content/30 select-none w-4 text-right flex-shrink-0"},Pt={key:0,class:"text-error flex-shrink-0",title:"File has at least one finding"},$t={key:1,class:"text-base-content/20 flex-shrink-0"},qt={key:2,class:"flex flex-wrap gap-1 ml-auto flex-shrink-0"},Vt=["title"],Et={key:0,class:"badge badge-xs badge-ghost"},It={key:2,class:"flex items-center justify-between mt-3 pt-2 border-t border-base-200 text-xs text-base-content/60"},Ut={key:0},Ot=["disabled"],Ht={key:0,class:"loading loading-spinner loading-xs"},Qt={key:9,class:"collapse collapse-arrow bg-base-100 shadow-md"},Wt={class:"collapse-title font-medium"},Gt={class:"badge badge-sm badge-ghost ml-2"},Jt={class:"collapse-content"},Kt={class:"space-y-4"},Xt={class:"flex items-center justify-between mb-2"},Yt={class:"font-medium"},Zt={class:"flex items-center gap-2"},ea={key:0,class:"text-xs text-base-content/60"},sa={key:1,class:"text-xs text-error"},ta={key:0,class:"text-sm text-error mb-2"},aa={key:1,class:"mb-2"},na={class:"bg-base-200 text-xs p-3 rounded-lg max-h-48 overflow-auto whitespace-pre-wrap break-words"},oa={key:2},la={class:"bg-base-200 text-xs p-3 rounded-lg max-h-48 overflow-auto whitespace-pre-wrap break-words text-warning"},ra={key:3,class:"text-xs text-base-content/40 italic"},ia={class:"card bg-base-100 shadow-xl"},da={class:"card-body py-4"},ca={class:"flex items-center justify-between"},ua={class:"flex items-center gap-3"},va={key:0,class:"loading loading-spinner loading-xs"},pa={class:"flex gap-2"},_a=["disabled"],ga={key:0,class:"loading loading-spinner loading-xs"},ba=["disabled","title"],ma={key:0,class:"loading loading-spinner loading-xs"},xa=["disabled"],ha={key:0,class:"loading loading-spinner loading-xs"},ya=["disabled"],fa={key:0,class:"loading loading-spinner loading-xs"},wa=ye({__name:"ScanReport",props:{jobId:{}},setup(Z){const U=fe(),F=ke(),ee=Z,q=g(!1),B=g(""),r=g(null),v=g(!1),V=g("loading"),x=g("unknown"),se={"mcp-ai-scanner":"MCP AI Scanner",trivy:"Trivy","cisco-mcp-scanner":"Cisco MCP Scanner","mcp-scan":"MCP Scan (Invariant)"};function E(o){return se[o]||o}const c=S(()=>{var o;return((o=r.value)==null?void 0:o.scan_context)||null}),O=S(()=>{var o,s;return r.value?r.value.scan_complete===!1?"incomplete":r.value.empty_scan?"empty":!r.value.findings||r.value.findings.length===0?"clean":((o=r.value.summary)==null?void 0:o.dangerous)>0?"dangerous":((s=r.value.summary)==null?void 0:s.warnings)>0?"warnings":"clean":"unknown"}),te=S(()=>{switch(O.value){case"dangerous":return"badge-error";case"warnings":return"badge-warning";case"incomplete":return"badge-error";case"empty":return"badge-warning";case"clean":return"badge-success";default:return"badge-ghost"}}),ae=S(()=>{var s;const o=((s=r.value)==null?void 0:s.risk_score)??0;return o>=70?"badge-error":o>=30?"badge-warning":"badge-success"}),ne={tool_poisoning:"Tool Poisoning",prompt_injection:"Prompt Injection",rug_pull:"Rug Pull Detection",malicious_code:"Malicious Code",uncategorized:"Other Findings"},oe=["tool_poisoning","prompt_injection","rug_pull","malicious_code"],le=S(()=>{var f;if(!((f=r.value)!=null&&f.findings))return[];const o=r.value.findings.filter(p=>!p.supply_chain_audit),s=new Map;for(const p of o){const k=p.threat_type||"uncategorized",C=k==="supply_chain"?"uncategorized":k;s.has(C)||s.set(C,[]),s.get(C).push(p)}const u=[],m=["tool_poisoning","prompt_injection","rug_pull","malicious_code","uncategorized"];for(const p of m){const k=s.get(p);if(!k)continue;const C=k.some(A=>A.threat_level==="dangerous");u.push({type:p,label:ne[p]||p,findings:k,defaultOpen:oe.includes(p),badgeClass:C?"badge-error":k.some(A=>A.threat_level==="warning")?"badge-warning":"badge-info"})}return u}),L=S(()=>{var o;return(o=r.value)!=null&&o.findings?r.value.findings.filter(s=>s.supply_chain_audit===!0):[]}),re=S(()=>L.value.some(o=>o.threat_level==="dangerous")),ie=S(()=>L.value.some(o=>o.threat_level==="warning"));function de(o){return o?new Date(o).toLocaleString():"-"}async function H(){q.value=!0,B.value="";try{const o=await D.getScanReportByJobId(ee.jobId);o.success&&o.data?r.value=o.data:B.value=o.error||"Failed to load scan report"}catch(o){B.value=o.message}finally{q.value=!1}}async function R(){var o,s,u;if((o=r.value)!=null&&o.server_name){V.value="loading";try{const m=await D.getServers();if(m.success&&((s=m.data)!=null&&s.servers)){const f=m.data.servers.find(p=>p.name===r.value.server_name);(u=f==null?void 0:f.health)!=null&&u.admin_state?x.value=f.health.admin_state:x.value="unknown"}}catch{x.value="unknown"}finally{V.value="loaded"}}}async function ce(){var o;if((o=r.value)!=null&&o.server_name&&confirm(`Quarantine ${r.value.server_name}? This will disconnect the server.`)){v.value=!0;try{await D.quarantineServer(r.value.server_name),await R()}finally{v.value=!1}}}const I=S(()=>{var o,s;return(((s=(o=r.value)==null?void 0:o.summary)==null?void 0:s.critical)??0)>0});async function ue(){var o;if((o=r.value)!=null&&o.server_name&&confirm(`Approve ${r.value.server_name}? This will unquarantine and re-enable the server.`)){v.value=!0;try{await U.securityApproveServer(r.value.server_name,!1),F.addToast({type:"success",title:"Server Approved",message:`${r.value.server_name} has been approved and unquarantined`}),await R()}catch(s){F.addToast({type:"error",title:"Approve Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{v.value=!1}}}async function ve(){var o,s;if((o=r.value)!=null&&o.server_name&&confirm(`Force-approve ${r.value.server_name}? This bypasses the scanner gate despite ${((s=r.value.summary)==null?void 0:s.critical)??0} critical finding(s).`)){v.value=!0;try{await U.securityApproveServer(r.value.server_name,!0),F.addToast({type:"success",title:"Server Force-Approved",message:`${r.value.server_name} was force-approved despite critical findings`}),await R()}catch(u){F.addToast({type:"error",title:"Force Approve Failed",message:u instanceof Error?u.message:"Unknown error"})}finally{v.value=!1}}}async function pe(){var o;if((o=r.value)!=null&&o.server_name&&confirm(`Reject the scan for ${r.value.server_name}? The server will remain quarantined.`)){v.value=!0;try{const s=await D.securityReject(r.value.server_name);if(!s.success)throw new Error(s.error||"Failed to reject scan");F.addToast({type:"success",title:"Scan Rejected",message:`${r.value.server_name} remains quarantined`}),await R()}catch(s){F.addToast({type:"error",title:"Reject Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{v.value=!1}}}const Q=g(!1),z=g(!1),y=g([]),j=g(!1),T=g(1),N=g(!1),w=g({total:0,has_more:!1,suspicious_count:0,offset:0});async function P(o){var s;if((s=r.value)!=null&&s.server_name){j.value=!0;try{const u=await D.getScanFiles(r.value.server_name,100,o,T.value,N.value);if(u.success&&u.data){const m=u.data.files||[];y.value=o===0?m:[...y.value,...m],w.value={total:u.data.total_files||0,has_more:u.data.has_more||!1,suspicious_count:u.data.suspicious_count||0,offset:o+m.length},z.value=!0}}catch{}finally{j.value=!1}}}async function _e(o){const s=o.target;Q.value=s.checked,s.checked&&!z.value&&await P(0)}async function ge(){await P(w.value.offset)}async function W(o){T.value!==o&&(T.value=o,y.value=[],z.value=!1,await P(0))}async function be(){y.value=[],z.value=!1,await P(0)}function me(o){return o?o.length<=28?o:o.slice(0,26)+"…":""}function xe(o){return!o||o<=0?"0 B":o<1024?`${o} B`:o<1024*1024?`${(o/1024).toFixed(1)} KB`:o<1024*1024*1024?`${(o/(1024*1024)).toFixed(1)} MB`:`${(o/(1024*1024*1024)).toFixed(1)} GB`}return we(async()=>{await H(),await R()}),(o,s)=>{var m,f,p,k,C,A,G,J,K;const u=Se("router-link");return a(),t("div",je,[e("div",Te,[X(u,{to:"/security",class:"btn btn-ghost btn-sm gap-1"},{default:Y(()=>[...s[3]||(s[3]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),_(" Security ",-1)])]),_:1}),e("div",Ae,[s[4]||(s[4]=e("h1",{class:"text-3xl font-bold"},"Scan Report",-1)),r.value?(a(),t("div",Me,[X(u,{to:{name:"server-detail",params:{serverName:r.value.server_name}},class:"link link-primary text-sm"},{default:Y(()=>[_(l(r.value.server_name),1)]),_:1},8,["to"]),r.value.risk_score!==void 0?(a(),t("span",{key:0,class:b(["badge",ae.value])},"Risk: "+l(r.value.risk_score)+"/100",3)):i("",!0)])):i("",!0)])]),q.value?(a(),t("div",Be,[...s[5]||(s[5]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1),e("p",{class:"mt-4"},"Loading scan report...",-1)])])):B.value?(a(),t("div",Le,[e("div",null,[s[6]||(s[6]=e("h3",{class:"font-bold"},"Error",-1)),e("div",Re,l(B.value),1)]),e("button",{onClick:H,class:"btn btn-sm"},"Retry")])):r.value?(a(),t(h,{key:2},[e("div",ze,[e("div",De,[s[11]||(s[11]=e("h2",{class:"card-title text-lg"},"Scan Metadata",-1)),e("div",Ne,[e("div",null,[s[7]||(s[7]=e("div",{class:"text-xs text-base-content/50"},"Scan ID",-1)),e("code",Pe,l(r.value.job_id),1)]),e("div",null,[s[8]||(s[8]=e("div",{class:"text-xs text-base-content/50"},"Status",-1)),e("span",{class:b(["badge badge-sm",te.value])},l(O.value),3)]),e("div",null,[s[9]||(s[9]=e("div",{class:"text-xs text-base-content/50"},"Scanned At",-1)),e("span",$e,l(de(r.value.scanned_at)),1)]),e("div",null,[s[10]||(s[10]=e("div",{class:"text-xs text-base-content/50"},"Scanners",-1)),e("span",qe,l(r.value.scanners_run??0)+" run, "+l(r.value.scanners_failed??0)+" failed, "+l(r.value.scanners_total??0)+" total",1)])])])]),c.value?(a(),t("div",Ve,[e("div",Ee,[s[12]||(s[12]=e("h2",{class:"card-title text-lg"},"Scan Context",-1)),e("div",Ie,[c.value.source_method?(a(),t("span",Ue," Source: "+l(c.value.source_method),1)):i("",!0),c.value.docker_isolation?(a(),t("span",Oe," Docker Isolated ")):i("",!0),c.value.docker_isolation?i("",!0):(a(),t("span",He," Local (no Docker) ")),c.value.server_protocol?(a(),t("span",Qe," Protocol: "+l(c.value.server_protocol),1)):i("",!0),c.value.total_files?(a(),t("span",We,l(c.value.total_files)+" files ",1)):i("",!0),c.value.container_image?(a(),t("span",Ge,l(c.value.container_image),1)):i("",!0)])])])):i("",!0),e("div",Je,[e("div",Ke,[e("div",Xe,[s[13]||(s[13]=e("div",{class:"stat-title text-xs"},"Dangerous",-1)),e("div",Ye,l(((m=r.value.summary)==null?void 0:m.dangerous)??0),1)])]),e("div",Ze,[e("div",es,[s[14]||(s[14]=e("div",{class:"stat-title text-xs"},"Warnings",-1)),e("div",ss,l(((f=r.value.summary)==null?void 0:f.warnings)??0),1)])]),e("div",ts,[e("div",as,[s[15]||(s[15]=e("div",{class:"stat-title text-xs"},"Info",-1)),e("div",ns,l(((p=r.value.summary)==null?void 0:p.info_level)??0),1)])]),e("div",os,[e("div",ls,[s[16]||(s[16]=e("div",{class:"stat-title text-xs"},"Total",-1)),e("div",rs,l(((k=r.value.summary)==null?void 0:k.total)??0),1)])])]),r.value.risk_score!==void 0?(a(),t("div",is,[...s[17]||(s[17]=[e("svg",{class:"w-5 h-5 text-base-content/50 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),e("span",{class:"text-xs text-base-content/60"}," The risk score is an experimental heuristic combining findings from multiple scanners using logarithmic aggregation. There is no industry standard for scoring MCP security risks. Treat the score as directional guidance, not a definitive safety assessment. ",-1)])])):i("",!0),r.value.scan_complete===!1&&r.value.empty_scan?(a(),t("div",ds,[...s[18]||(s[18]=[e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1),e("div",null,[e("div",{class:"font-semibold"},"No Files Scanned"),e("span",null,"Scanners ran but found no files to analyze. The server may have been disconnected during source extraction.")],-1)])])):r.value.scan_complete===!1?(a(),t("div",cs,[s[20]||(s[20]=e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[s[19]||(s[19]=e("div",{class:"font-semibold"},"Scan Incomplete",-1)),e("span",null,l(r.value.scanners_failed??0)+" of "+l(r.value.scanners_total??0)+" scanner(s) failed. Check scanner logs for details.",1)])])):!r.value.findings||r.value.findings.length===0?(a(),t("div",us,[...s[21]||(s[21]=[e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1),e("span",null,"No security issues detected. This server appears to be safe.",-1)])])):(a(),t("div",vs,[s[30]||(s[30]=e("h3",{class:"text-lg font-semibold"},"Findings",-1)),(a(!0),t(h,null,M(le.value,n=>(a(),t("div",{key:n.type,class:b(["collapse collapse-arrow bg-base-100 shadow-md",{"collapse-open":n.defaultOpen}])},[e("input",{type:"checkbox",checked:n.defaultOpen},null,8,ps),e("div",_s,[e("span",null,l(n.label),1),e("span",{class:b(["badge badge-sm",n.badgeClass])},l(n.findings.length),3)]),e("div",gs,[e("div",bs,[(a(!0),t(h,null,M(n.findings,(d,$)=>(a(),t("div",{key:$,class:"collapse collapse-arrow bg-base-200 rounded-lg"},[s[29]||(s[29]=e("input",{type:"checkbox"},null,-1)),e("div",ms,[e("span",{class:b(["badge badge-sm flex-shrink-0",{"badge-error":d.threat_level==="dangerous","badge-warning":d.threat_level==="warning","badge-info":d.threat_level==="info"}])},l(d.threat_level),3),e("span",xs,l(d.rule_id||d.title),1),d.package_name?(a(),t("span",hs,l(d.package_name),1)):i("",!0),d.fixed_version?(a(),t("span",ys," fix: "+l(d.fixed_version),1)):i("",!0)]),e("div",fs,[e("div",ks,[e("p",ws,l(d.description),1),d.evidence?(a(),t("div",Ss,[s[22]||(s[22]=e("div",{class:"text-xs text-base-content/50 mb-1"},"Triggering content:",-1)),e("pre",Cs,l(d.evidence),1)])):i("",!0),e("div",Fs,[d.rule_id?(a(),t("div",js,[s[23]||(s[23]=e("span",{class:"text-base-content/50"},"Rule:",-1)),e("code",Ts,l(d.rule_id),1)])):i("",!0),d.severity?(a(),t("div",As,[s[24]||(s[24]=e("span",{class:"text-base-content/50"},"CVSS Severity:",-1)),e("span",Ms,l(d.severity),1),d.cvss_score?(a(),t("span",Bs,"("+l(d.cvss_score)+")",1)):i("",!0)])):i("",!0),d.package_name?(a(),t("div",Ls,[s[25]||(s[25]=e("span",{class:"text-base-content/50"},"Package:",-1)),e("span",Rs,l(d.package_name),1),d.installed_version?(a(),t("span",zs,"v"+l(d.installed_version),1)):i("",!0)])):i("",!0),d.fixed_version?(a(),t("div",Ds,[s[26]||(s[26]=e("span",{class:"text-base-content/50"},"Fixed in:",-1)),e("span",Ns,l(d.fixed_version),1)])):i("",!0),d.location?(a(),t("div",Ps,[s[27]||(s[27]=e("span",{class:"text-base-content/50"},"Location:",-1)),e("code",$s,l(d.location),1)])):i("",!0),d.scanner?(a(),t("div",qs,[s[28]||(s[28]=e("span",{class:"text-base-content/50"},"Scanner:",-1)),e("span",Vs,l(E(d.scanner)),1)])):i("",!0)]),d.help_uri?(a(),t("a",{key:1,href:d.help_uri,target:"_blank",rel:"noopener noreferrer",class:"link link-primary text-xs inline-flex items-center gap-1"}," View Advisory Details β†’ ",8,Es)):i("",!0)])])]))),128))])])],2))),128))])),r.value.pass2_running?(a(),t("div",Is,[...s[31]||(s[31]=[e("span",{class:"loading loading-spinner loading-sm"},null,-1),e("div",null,[e("h3",{class:"font-bold"},"Supply Chain Audit"),e("p",{class:"text-sm"},"Deep dependency analysis running in background. Additional CVEs will appear here when complete.")],-1)])])):i("",!0),L.value.length>0?(a(),t("div",Us,[e("div",Os,[s[41]||(s[41]=e("input",{type:"checkbox"},null,-1)),e("div",Hs,[s[32]||(s[32]=e("span",null,"Supply Chain Audit (CVEs)",-1)),e("span",{class:b(["badge badge-sm",re.value?"badge-error":ie.value?"badge-warning":"badge-info"])},l(L.value.length),3)]),e("div",Qs,[e("div",Ws,[(a(!0),t(h,null,M(L.value,(n,d)=>(a(),t("div",{key:"sc-"+d,class:"collapse collapse-arrow bg-base-200 rounded-lg"},[s[40]||(s[40]=e("input",{type:"checkbox"},null,-1)),e("div",Gs,[e("span",{class:b(["badge badge-sm flex-shrink-0",{"badge-error":n.threat_level==="dangerous","badge-warning":n.threat_level==="warning","badge-info":n.threat_level==="info"}])},l(n.threat_level),3),e("span",Js,l(n.rule_id||n.title),1),n.package_name?(a(),t("span",Ks,l(n.package_name),1)):i("",!0),n.fixed_version?(a(),t("span",Xs," fix: "+l(n.fixed_version),1)):i("",!0)]),e("div",Ys,[e("div",Zs,[e("p",et,l(n.description),1),n.evidence?(a(),t("div",st,[s[33]||(s[33]=e("div",{class:"text-xs text-base-content/50 mb-1"},"Triggering content:",-1)),e("pre",tt,l(n.evidence),1)])):i("",!0),e("div",at,[n.rule_id?(a(),t("div",nt,[s[34]||(s[34]=e("span",{class:"text-base-content/50"},"Rule:",-1)),e("code",ot,l(n.rule_id),1)])):i("",!0),n.severity?(a(),t("div",lt,[s[35]||(s[35]=e("span",{class:"text-base-content/50"},"CVSS Severity:",-1)),e("span",rt,l(n.severity),1),n.cvss_score?(a(),t("span",it,"("+l(n.cvss_score)+")",1)):i("",!0)])):i("",!0),n.package_name?(a(),t("div",dt,[s[36]||(s[36]=e("span",{class:"text-base-content/50"},"Package:",-1)),e("span",ct,l(n.package_name),1),n.installed_version?(a(),t("span",ut,"v"+l(n.installed_version),1)):i("",!0)])):i("",!0),n.fixed_version?(a(),t("div",vt,[s[37]||(s[37]=e("span",{class:"text-base-content/50"},"Fixed in:",-1)),e("span",pt,l(n.fixed_version),1)])):i("",!0),n.location?(a(),t("div",_t,[s[38]||(s[38]=e("span",{class:"text-base-content/50"},"Location:",-1)),e("code",gt,l(n.location),1)])):i("",!0),n.scanner?(a(),t("div",bt,[s[39]||(s[39]=e("span",{class:"text-base-content/50"},"Scanner:",-1)),e("span",mt,l(E(n.scanner)),1)])):i("",!0)]),n.help_uri?(a(),t("a",{key:1,href:n.help_uri,target:"_blank",rel:"noopener noreferrer",class:"link link-primary text-xs inline-flex items-center gap-1"}," View Advisory Details β†’ ",8,xt)):i("",!0)])])]))),128))])])])])):r.value.pass2_complete?(a(),t("div",ht,[...s[42]||(s[42]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1),e("span",null,"Supply chain audit complete. No CVEs found in dependencies.",-1)])])):i("",!0),e("div",yt,[e("input",{type:"checkbox",checked:Q.value,onChange:_e},null,40,ft),e("div",kt,[s[43]||(s[43]=e("span",null,"Scanned Files",-1)),w.value.total>0?(a(),t("span",wt,l(w.value.total)+" "+l(w.value.total===1?"file":"files"),1)):i("",!0),w.value.suspicious_count>0?(a(),t("span",St,l(w.value.suspicious_count)+" suspicious ",1)):i("",!0),(C=c.value)!=null&&C.source_method?(a(),t("span",Ct,l(c.value.source_method),1)):i("",!0)]),e("div",Ft,[!z.value&&!j.value?(a(),t("div",jt," Click to load the file list. ")):j.value&&y.value.length===0?(a(),t("div",Tt,[...s[44]||(s[44]=[e("span",{class:"loading loading-spinner loading-md"},null,-1),e("p",{class:"mt-2 text-sm text-base-content/60"},"Loading file list…",-1)])])):(a(),t("div",At,[e("div",Mt,[e("div",Bt,[e("button",{class:b(["btn btn-xs join-item",T.value===1?"btn-active":"btn-ghost"]),onClick:s[0]||(s[0]=n=>W(1))},"Pass 1 β€” Security",2),e("button",{class:b(["btn btn-xs join-item",T.value===2?"btn-active":"btn-ghost"]),onClick:s[1]||(s[1]=n=>W(2))},"Pass 2 β€” Supply Chain",2)]),e("label",Lt,[Ce(e("input",{type:"checkbox","onUpdate:modelValue":s[2]||(s[2]=n=>N.value=n),onChange:be,class:"checkbox checkbox-xs"},null,544),[[Fe,N.value]]),s[45]||(s[45]=e("span",{class:"label-text text-xs"},"Suspicious only",-1))]),(A=c.value)!=null&&A.source_path?(a(),t("span",Rt,l(c.value.source_path),1)):i("",!0)]),y.value.length===0?(a(),t("div",zt,[N.value?(a(),t(h,{key:0},[_(' No suspicious files in this pass. Untoggle "Suspicious only" to see all scanned files. ')],64)):((G=c.value)==null?void 0:G.source_method)==="tool_definitions_only"?(a(),t(h,{key:1},[s[46]||(s[46]=_(" No source files were extracted for this server β€” the AI scanner ran on the exported tool definitions only. Findings located at ",-1)),s[47]||(s[47]=e("code",{class:"bg-base-200 px-1 rounded"},"tools.json",-1)),s[48]||(s[48]=_(" refer to that synthetic file, not real source code. ",-1))],64)):((J=c.value)==null?void 0:J.source_method)==="url"?(a(),t(h,{key:2},[_(" URL-based scan β€” no local files. Scanners connected to the server endpoint directly. ")],64)):(a(),t(h,{key:3},[_(" No files in Pass "+l(T.value)+". ",1)],64))])):(a(),t("div",Dt,[(a(!0),t(h,null,M(y.value,(n,d)=>(a(),t("div",{key:n.path,class:b(["flex items-start gap-2 py-0.5",n.suspicious?"bg-error/5 -mx-2 px-2 rounded":""])},[e("span",Nt,l(d===y.value.length-1?"β””":"β”œ"),1),n.suspicious?(a(),t("span",Pt,"●")):(a(),t("span",$t,"β—‹")),e("code",{class:b(["break-all",n.suspicious?"text-error font-medium":"text-base-content/80"])},l(n.path),3),n.findings&&n.findings.length?(a(),t("div",qt,[(a(!0),t(h,null,M(n.findings.slice(0,3),($,he)=>(a(),t("span",{key:he,class:"badge badge-xs badge-error badge-outline whitespace-nowrap",title:$},l(me($)),9,Vt))),128)),n.findings.length>3?(a(),t("span",Et," +"+l(n.findings.length-3),1)):i("",!0)])):i("",!0)],2))),128))])),y.value.length>0?(a(),t("div",It,[e("span",null,[_(" Showing "+l(y.value.length)+" of "+l(w.value.total)+" ",1),c.value&&(c.value.total_size_bytes??0)>0?(a(),t("span",Ut," Β· "+l(xe(c.value.total_size_bytes)),1)):i("",!0)]),w.value.has_more?(a(),t("button",{key:0,class:"btn btn-xs btn-ghost",disabled:j.value,onClick:ge},[j.value?(a(),t("span",Ht)):i("",!0),s[49]||(s[49]=_(" Load more ",-1))],8,Ot)):i("",!0)])):i("",!0)]))])]),r.value.scanner_statuses&&r.value.scanner_statuses.length>0?(a(),t("div",Qt,[s[53]||(s[53]=e("input",{type:"checkbox"},null,-1)),e("div",Wt,[s[50]||(s[50]=_(" Scanner Execution Logs ",-1)),e("span",Gt,l(r.value.scanner_statuses.length)+" scanners",1)]),e("div",Jt,[e("div",Kt,[(a(!0),t(h,null,M(r.value.scanner_statuses,n=>(a(),t("div",{key:n.scanner_id,class:"border border-base-300 rounded-lg p-3"},[e("div",Xt,[e("span",Yt,l(E(n.scanner_id)),1),e("div",Zt,[e("span",{class:b(["badge badge-sm",{"badge-success":n.status==="completed","badge-error":n.status==="failed","badge-info":n.status==="running","badge-ghost":!n.status}])},l(n.status||"unknown"),3),n.findings_count?(a(),t("span",ea,l(n.findings_count)+" findings",1)):i("",!0),n.exit_code!==void 0&&n.exit_code!==0?(a(),t("span",sa,"exit "+l(n.exit_code),1)):i("",!0)])]),n.error?(a(),t("div",ta,l(n.error),1)):i("",!0),n.stdout?(a(),t("div",aa,[s[51]||(s[51]=e("div",{class:"text-xs text-base-content/50 mb-1"},"stdout",-1)),e("pre",na,l(n.stdout),1)])):i("",!0),n.stderr?(a(),t("div",oa,[s[52]||(s[52]=e("div",{class:"text-xs text-base-content/50 mb-1"},"stderr",-1)),e("pre",la,l(n.stderr),1)])):i("",!0),!n.stdout&&!n.stderr&&!n.error?(a(),t("div",ra,"No output captured")):i("",!0)]))),128))])])])):i("",!0),e("div",ia,[e("div",da,[e("div",ca,[e("div",ua,[s[54]||(s[54]=e("span",{class:"text-sm text-base-content/60"},"Server Status:",-1)),V.value==="loading"?(a(),t("span",va)):(a(),t("span",{key:1,class:b(["badge",{"badge-success":x.value==="enabled","badge-warning":x.value==="disabled","badge-error":x.value==="quarantined"}])},l(x.value),3))]),e("div",pa,[x.value==="enabled"&&((K=r.value.summary)==null?void 0:K.dangerous)>0?(a(),t("button",{key:0,onClick:ce,disabled:v.value,class:"btn btn-error btn-sm"},[v.value?(a(),t("span",ga)):i("",!0),s[55]||(s[55]=_(" Quarantine Server ",-1))],8,_a)):i("",!0),x.value==="quarantined"?(a(),t("button",{key:1,onClick:ue,disabled:v.value||I.value,class:"btn btn-success btn-sm",title:I.value?"Unresolved critical findings β€” use Force Approve":"Approve and unquarantine this server"},[v.value?(a(),t("span",ma)):i("",!0),s[56]||(s[56]=_(" Approve Server ",-1))],8,ba)):i("",!0),x.value==="quarantined"&&I.value?(a(),t("button",{key:2,onClick:ve,disabled:v.value,class:"btn btn-error btn-sm",title:"Bypass the scanner gate and approve despite critical findings"},[v.value?(a(),t("span",ha)):i("",!0),s[57]||(s[57]=_(" Force Approve ",-1))],8,xa)):i("",!0),x.value==="quarantined"?(a(),t("button",{key:3,onClick:pe,disabled:v.value,class:"btn btn-outline btn-warning btn-sm",title:"Reject the scan and keep the server quarantined"},[v.value?(a(),t("span",fa)):i("",!0),s[58]||(s[58]=_(" Reject ",-1))],8,ya)):i("",!0)])])])])],64)):i("",!0)])}}});export{wa as default}; diff --git a/web/frontend/dist/assets/Search-D-mj47__.js b/web/frontend/dist/assets/Search-D-mj47__.js deleted file mode 100644 index 1cc24010..00000000 --- a/web/frontend/dist/assets/Search-D-mj47__.js +++ /dev/null @@ -1,7 +0,0 @@ -import{d as j,r as d,g as B,z as D,A as H,c as o,o as l,a as e,h as u,k as f,p as S,v as z,H as U,D as L,i as v,t as a,w as C,l as $,F as A,s as F,G as I,E,C as G,q as K}from"./index-myMLoUzQ.js";const Q={class:"space-y-6"},J={class:"card bg-base-100 shadow-lg max-w-4xl mx-auto"},O={class:"card-body"},W={class:"flex flex-col space-y-4"},X={class:"relative"},Y={class:"flex flex-wrap gap-4 items-center"},Z={class:"form-control"},ee={class:"form-control"},se=["disabled"],te={key:0,class:"loading loading-spinner loading-sm"},oe={key:0},le={class:"flex justify-between items-center"},ae={class:"text-base-content/70"},ne={class:"font-medium"},ie={key:0},re={key:0,class:"flex items-center space-x-2"},de={key:0,class:"text-center py-12"},ce={key:1,class:"alert alert-error"},ue={key:2,class:"text-center py-12"},ve={class:"space-x-2"},me={key:3,class:"space-y-3"},pe={class:"card-body py-4"},be={class:"flex items-start justify-between gap-4"},he={class:"flex-1 min-w-0"},fe={class:"flex items-center gap-2 mb-2 flex-wrap"},xe={class:"text-lg font-bold text-base-content"},ge={class:"badge badge-secondary badge-sm"},ye={class:"badge badge-ghost badge-sm"},ke={class:"text-sm text-base-content/70 line-clamp-2 mb-2"},_e={class:"flex items-center gap-3 text-xs text-base-content/60"},we={key:0,class:"flex items-center gap-1"},Se={class:"flex flex-col gap-2 flex-shrink-0"},Ce=["onClick"],Me={key:1,class:"text-center py-16"},Be={key:2,class:"modal modal-open"},Le={class:"modal-box max-w-4xl"},Te={class:"font-bold text-lg mb-4"},qe={class:"space-y-4"},Ve={class:"grid grid-cols-2 gap-4"},Ne={class:"badge badge-secondary"},Re={class:"flex items-center space-x-2"},Pe={class:"font-mono"},je={class:"w-20 bg-base-300 rounded-full h-2"},De={class:"text-sm"},He={key:0},ze={class:"mockup-code"},Ue={class:"modal-action"},Ie=j({__name:"Search",setup($e){const T=H(),i=d(""),x=d(""),c=d([]),p=d(!1),m=d(null),g=d(!1),b=d(null),n=d(null),y=d(10),k=d(0),q=B(()=>c.value.filter(r=>r.score>=k.value));let _=null;const V=()=>{_&&clearTimeout(_),_=setTimeout(()=>{i.value.trim()&&h()},500)};async function h(){if(!i.value.trim())return;p.value=!0,m.value=null,b.value=null,x.value=i.value;const r=Date.now();try{const s=await K.searchTools(i.value,y.value);s.success&&s.data?(c.value=s.data.results||[],b.value=Date.now()-r,g.value=!0):(m.value=s.error||"Search failed",c.value=[])}catch(s){m.value=s instanceof Error?s.message:"Search failed",c.value=[]}finally{p.value=!1}}function N(r){n.value=r}function M(){i.value="",x.value="",c.value=[],g.value=!1,m.value=null,b.value=null}D(()=>{const r=T.query.q;r&&typeof r=="string"&&(i.value=r,h())});const R=B(()=>[{icon:"πŸ”",title:"How to Search Tools",description:"Tips for getting the best search results",sections:[{title:"Search strategies",list:['Use descriptive keywords: "create file", "send email", "random number"',"Search by functionality rather than exact tool names","Use multiple keywords to narrow results","Adjust minimum relevance score to filter results"]},{title:"CLI search",codeBlock:{language:"bash",code:`# Search from command line -mcpproxy tools search "your query" - -# Limit results -mcpproxy tools search "your query" --limit=20`}}]},{icon:"πŸ€–",title:"Search with LLM Agents",description:"Let AI agents search and discover tools for you",sections:[{title:"Example LLM prompts",list:["Search for all file-related tools across my MCP servers","Find tools that can help me work with GitHub issues","Show me the most relevant tools for sending notifications","What tools are available for data analysis?"]},{title:"LLM can call retrieve_tools",text:"AI agents can use the retrieve_tools built-in tool:",codeBlock:{language:"bash",code:`# LLM agents call this tool internally -mcpproxy call tool --tool-name=retrieve_tools \\ - --json_args='{"query":"file operations","limit":10}'`}}]},{icon:"πŸ’‘",title:"Understanding Search Results",description:"How MCPProxy ranks and displays results",sections:[{title:"BM25 scoring",text:"MCPProxy uses BM25 (Best Matching 25) algorithm for relevance ranking:",list:["Scores range from 0.0 to ~1.0+ (higher is more relevant)","Takes into account keyword frequency and rarity","Considers tool name and description","Server-qualified names (server:tool) for easy identification"]}]}]);return(r,s)=>{const w=$("router-link");return l(),o("div",Q,[s[28]||(s[28]=e("div",{class:"text-center mb-8"},[e("h1",{class:"text-4xl font-bold mb-4"},"Search Tools"),e("p",{class:"text-base-content/70 text-lg"},"Find tools across all MCP servers using intelligent BM25 search")],-1)),e("div",J,[e("div",O,[e("div",W,[e("div",X,[S(e("input",{"onUpdate:modelValue":s[0]||(s[0]=t=>i.value=t),type:"text",placeholder:"Search for tools (e.g. 'echo', 'file operations', 'random number')...",class:"input input-bordered input-lg w-full pl-12 pr-4",onKeyup:U(h,["enter"]),onInput:V},null,544),[[z,i.value]]),s[5]||(s[5]=e("svg",{class:"absolute left-4 top-1/2 transform -translate-y-1/2 w-6 h-6 text-base-content/50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1))]),e("div",Y,[e("div",Z,[s[7]||(s[7]=e("label",{class:"label"},[e("span",{class:"label-text"},"Results per page")],-1)),S(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>y.value=t),class:"select select-bordered select-sm"},[...s[6]||(s[6]=[e("option",{value:5},"5",-1),e("option",{value:10},"10",-1),e("option",{value:20},"20",-1),e("option",{value:50},"50",-1)])],512),[[L,y.value]])]),e("div",ee,[s[9]||(s[9]=e("label",{class:"label"},[e("span",{class:"label-text"},"Minimum relevance")],-1)),S(e("select",{"onUpdate:modelValue":s[2]||(s[2]=t=>k.value=t),class:"select select-bordered select-sm"},[...s[8]||(s[8]=[e("option",{value:0},"Any",-1),e("option",{value:.1},"Low (0.1+)",-1),e("option",{value:.3},"Medium (0.3+)",-1),e("option",{value:.5},"High (0.5+)",-1),e("option",{value:.8},"Very High (0.8+)",-1)])],512),[[L,k.value]])]),e("button",{class:"btn btn-primary",disabled:!i.value.trim()||p.value,onClick:h},[p.value?(l(),o("span",te)):u("",!0),s[10]||(s[10]=v(" Search ",-1))],8,se),i.value?(l(),o("button",{key:0,class:"btn btn-outline btn-sm",onClick:M}," Clear ")):u("",!0)])])])]),g.value?(l(),o("div",oe,[e("div",le,[e("div",null,[s[12]||(s[12]=e("h2",{class:"text-2xl font-semibold"},"Search Results",-1)),e("p",ae,[v(a(c.value.length)+' results for "',1),e("span",ne,a(x.value),1),s[11]||(s[11]=v('" ',-1)),b.value?(l(),o("span",ie,"("+a(b.value)+"ms)",1)):u("",!0)])]),c.value.length>0?(l(),o("div",re,[...s[13]||(s[13]=[e("div",{class:"badge badge-outline"},"BM25 Ranked",-1)])])):u("",!0)]),p.value?(l(),o("div",de,[...s[14]||(s[14]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1),e("p",{class:"mt-4"},"Searching tools...",-1)])])):m.value?(l(),o("div",ce,[s[15]||(s[15]=e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,a(m.value),1),e("button",{class:"btn btn-sm",onClick:h},"Retry")])):c.value.length===0?(l(),o("div",ue,[s[17]||(s[17]=e("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1)),s[18]||(s[18]=e("h3",{class:"text-xl font-semibold mb-2"},"No tools found",-1)),s[19]||(s[19]=e("p",{class:"text-base-content/70 mb-4"}," Try different keywords or check if your servers are connected. ",-1)),e("div",ve,[e("button",{class:"btn btn-outline",onClick:M}," New Search "),f(w,{to:"/servers",class:"btn btn-primary"},{default:C(()=>[...s[16]||(s[16]=[v(" Check Servers ",-1)])]),_:1})])])):(l(),o("div",me,[(l(!0),o(A,null,F(q.value,(t,P)=>(l(),o("div",{key:`${t.tool.server_name}:${t.tool.name}`,class:"card bg-base-100 shadow-md hover:shadow-lg transition-shadow"},[e("div",pe,[e("div",be,[e("div",he,[e("div",fe,[e("h3",xe,a(t.tool.name),1),e("div",ge,a(t.tool.server_name),1),e("div",ye," Score: "+a(t.score.toFixed(2)),1)]),e("p",ke,a(t.tool.description||"No description available"),1),e("div",_e,[e("span",null,"#"+a(P+1)+" in results",1),t.tool.input_schema?(l(),o("span",we,[...s[20]||(s[20]=[e("svg",{class:"w-3 h-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),v(" Schema available ",-1)])])):u("",!0)])]),e("div",Se,[e("button",{class:"btn btn-sm btn-primary",onClick:Ae=>N(t)}," View Details ",8,Ce),f(w,{to:`/servers/${t.tool.server_name}`,class:"btn btn-sm btn-outline"},{default:C(()=>[...s[21]||(s[21]=[v(" Server Info ",-1)])]),_:1},8,["to"])])])])]))),128))]))])):(l(),o("div",Me,[...s[22]||(s[22]=[I('

Powerful Tool Search

Use our BM25-powered search to find the perfect tool for your task. Search by name, description, or functionality.

Natural Language

Search using natural descriptions like "send email" or "file operations"

Relevance Scoring

Results ranked by relevance with visual score indicators

Cross-Server

Search across all connected MCP servers simultaneously

',4)])])),n.value?(l(),o("div",Be,[e("div",Le,[e("h3",Te,a(n.value.tool.name),1),e("div",qe,[e("div",Ve,[e("div",null,[s[23]||(s[23]=e("label",{class:"block text-sm font-medium mb-1"},"Server",-1)),e("div",Ne,a(n.value.tool.server_name),1)]),e("div",null,[s[24]||(s[24]=e("label",{class:"block text-sm font-medium mb-1"},"Relevance Score",-1)),e("div",Re,[e("span",Pe,a(n.value.score.toFixed(3)),1),e("div",je,[e("div",{class:"bg-primary h-2 rounded-full",style:E({width:Math.min(100,n.value.score*100)+"%"})},null,4)])])])]),e("div",null,[s[25]||(s[25]=e("label",{class:"block text-sm font-medium mb-1"},"Description",-1)),e("p",De,a(n.value.tool.description||"No description available"),1)]),n.value.tool.input_schema?(l(),o("div",He,[s[26]||(s[26]=e("label",{class:"block text-sm font-medium mb-1"},"Input Schema",-1)),e("div",ze,[e("pre",null,[e("code",null,a(JSON.stringify(n.value.tool.input_schema,null,2)),1)])])])):u("",!0)]),e("div",Ue,[f(w,{to:`/servers/${n.value.tool.server_name}`,class:"btn btn-outline",onClick:s[3]||(s[3]=t=>n.value=null)},{default:C(()=>[...s[27]||(s[27]=[v(" View Server ",-1)])]),_:1},8,["to"]),e("button",{class:"btn",onClick:s[4]||(s[4]=t=>n.value=null)},"Close")])])])):u("",!0),f(G,{hints:R.value},null,8,["hints"])])}}});export{Ie as default}; diff --git a/web/frontend/dist/assets/Secrets-BKIyhyih.js b/web/frontend/dist/assets/Secrets-BKIyhyih.js deleted file mode 100644 index 09bc1aeb..00000000 --- a/web/frontend/dist/assets/Secrets-BKIyhyih.js +++ /dev/null @@ -1,23 +0,0 @@ -import{d as K,e as R,L as ee,r as f,y as se,c as l,o as a,a as e,M as te,h as y,p as N,v as T,n as x,t as i,i as C,q as B,g as w,z as ne,j as oe,k as I,m as j,w as ae,T as le,F as E,s as F,C as ie}from"./index-myMLoUzQ.js";const re=["open"],de={class:"modal-box max-w-2xl"},ce={class:"form-control mb-4"},ue=["readonly"],ve={class:"label"},me={key:0,class:"label-text-alt"},ge={key:1,class:"label-text-alt text-info"},fe={class:"form-control mb-4"},be={key:0,class:"alert alert-info mb-4"},pe={key:1,class:"alert alert-error mb-4"},ye={class:"modal-action"},he=["disabled"],ke={key:0,class:"loading loading-spinner loading-sm"},_e=K({__name:"AddSecretModal",props:{show:{type:Boolean},predefinedName:{}},emits:["close","added"],setup(L,{emit:h}){const m=L,b=h,u=R(),d=ee({name:"",value:""}),p=f(!1),r=f("");se(()=>m.predefinedName,v=>{v&&(d.name=v)},{immediate:!0});async function g(){var v;r.value="",p.value=!0;try{const o=await B.setSecret(d.name,d.value);o.success?(u.addToast({type:"success",title:"Secret Added",message:`${d.name} has been added successfully. Use in config: ${(v=o.data)==null?void 0:v.reference}`}),b("added"),k()):r.value=o.error||"Failed to add secret"}catch(o){r.value=o instanceof Error?o.message:"Failed to add secret"}finally{p.value=!1}}function k(){d.name="",d.value="",r.value="",b("close")}return(v,o)=>(a(),l("dialog",{open:v.show,class:"modal"},[e("div",de,[e("form",{onSubmit:te(g,["prevent"])},[o[7]||(o[7]=e("h3",{class:"font-bold text-lg mb-4"},"Add New Secret",-1)),e("div",ce,[o[2]||(o[2]=e("label",{class:"label"},[e("span",{class:"label-text font-semibold"},"Secret Name")],-1)),N(e("input",{type:"text","onUpdate:modelValue":o[0]||(o[0]=S=>d.name=S),placeholder:"e.g., my-api-key",class:x(["input input-bordered",{"input-disabled":!!m.predefinedName}]),readonly:!!m.predefinedName,required:""},null,10,ue),[[T,d.name]]),e("label",ve,[m.predefinedName?(a(),l("span",ge,"Name is predefined from config")):(a(),l("span",me,"Use only letters, numbers, and hyphens"))])]),e("div",fe,[o[3]||(o[3]=e("label",{class:"label"},[e("span",{class:"label-text font-semibold"},"Secret Value")],-1)),N(e("input",{type:"password","onUpdate:modelValue":o[1]||(o[1]=S=>d.value=S),placeholder:"Enter secret value",class:"input input-bordered",required:""},null,512),[[T,d.value]])]),d.name?(a(),l("div",be,[o[5]||(o[5]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[o[4]||(o[4]=e("div",{class:"font-semibold"},"Configuration reference:",-1)),e("code",null,"${keyring:"+i(d.name)+"}",1)])])):y("",!0),r.value?(a(),l("div",pe,[o[6]||(o[6]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,i(r.value),1)])):y("",!0),e("div",ye,[e("button",{type:"button",onClick:k,class:"btn btn-ghost"},"Cancel"),e("button",{type:"submit",class:"btn btn-primary",disabled:p.value||!d.name||!d.value},[p.value?(a(),l("span",ke)):y("",!0),C(" "+i(p.value?"Adding...":"Add Secret"),1)],8,he)])],32)]),e("form",{method:"dialog",class:"modal-backdrop",onClick:k},[...o[8]||(o[8]=[e("button",null,"close",-1)])])],8,re))}}),we={class:"space-y-6"},xe={class:"flex justify-between items-center"},Ce=["disabled"],Se={key:0,class:"loading loading-spinner loading-sm"},Me={class:"stats shadow bg-base-100 w-full"},$e={class:"stat"},Ae={class:"stat-value"},je={class:"stat"},Be={class:"stat-value text-info"},Ee={class:"stat"},Fe={class:"stat-value text-warning"},Ne={class:"stat"},Te={class:"stat-value text-error"},Le={class:"flex flex-wrap gap-4 items-center justify-between"},ze={class:"flex flex-wrap gap-2"},Pe={class:"form-control"},Ve={key:0,class:"text-center py-12"},He={key:1,class:"alert alert-error"},Ie={class:"text-sm"},Ke={key:2,class:"text-center py-12"},Re={class:"text-base-content/70 mb-4"},Ye={class:"card-body"},De={class:"flex justify-between items-start"},Ue={class:"flex-1"},qe={class:"card-title text-lg"},We={class:"flex items-center gap-2 mt-2"},Oe={key:0,class:"badge badge-success"},Ge={key:1,class:"badge badge-error"},Qe={class:"text-sm bg-base-200 px-2 py-1 rounded"},Je={class:"flex gap-2"},Xe=["onClick"],Ze=["onClick"],es=["onClick"],ss={class:"card-body"},ts={class:"flex justify-between items-start"},ns={class:"flex-1"},os={class:"card-title text-lg"},as={class:"flex items-center gap-2 mt-2"},ls={key:0,class:"badge badge-success"},is={key:1,class:"badge badge-error"},rs={class:"text-sm bg-base-200 px-2 py-1 rounded"},ds={class:"flex gap-2"},cs=["onClick"],us={key:4,class:"card bg-base-100 shadow"},vs={class:"card-body"},ms={class:"flex justify-between items-center mb-4"},gs=["disabled"],fs={class:"space-y-3"},bs={class:"flex-1"},ps={class:"font-bold"},ys={class:"text-sm opacity-70"},hs={class:"text-sm mt-1"},ks={class:"bg-base-200 px-2 py-1 rounded"},_s={class:"ml-2 opacity-60"},ws=["onClick","disabled"],Ss=K({__name:"Secrets",setup(L){const h=R(),m=f(!0),b=f(null),u=f(null),d=f([]),p=f(!1),r=f("all"),g=f(""),k=f(!1),v=f(void 0),o=w(()=>{var t,s;return((s=(t=u.value)==null?void 0:t.environment_vars)==null?void 0:s.filter(c=>!c.is_set).length)||0}),S=w(()=>{var t,s;return((s=(t=u.value)==null?void 0:t.secrets)==null?void 0:s.filter(c=>!c.is_set).length)||0}),Y=w(()=>o.value+S.value),D=w(()=>{var t,s;return(((t=u.value)==null?void 0:t.total_secrets)||0)+(((s=u.value)==null?void 0:s.total_env_vars)||0)}),z=w(()=>{var s;if(r.value==="envs")return[];let t=((s=u.value)==null?void 0:s.secrets)||[];if(r.value==="missing"&&(t=t.filter(c=>!c.is_set)),g.value){const c=g.value.toLowerCase();t=t.filter(_=>_.secret_ref.name.toLowerCase().includes(c)||_.secret_ref.original.toLowerCase().includes(c))}return t}),P=w(()=>{var s;if(r.value==="secrets")return[];let t=((s=u.value)==null?void 0:s.environment_vars)||[];if(r.value==="missing"&&(t=t.filter(c=>!c.is_set)),g.value){const c=g.value.toLowerCase();t=t.filter(_=>_.secret_ref.name.toLowerCase().includes(c)||_.secret_ref.original.toLowerCase().includes(c))}return t}),U=w(()=>[...z.value,...P.value]),$=async()=>{m.value=!0,b.value=null;try{const t=await B.getConfigSecrets();t.success&&t.data?u.value=t.data:b.value=t.error||"Failed to load config secrets"}catch(t){b.value=t.message||"Failed to load config secrets",console.error("Failed to load config secrets:",t)}finally{m.value=!1}},A=$,q=async()=>{p.value=!0;try{const t=await B.runMigrationAnalysis();t.success&&t.data?(d.value=t.data.analysis.candidates||[],h.addToast({type:"success",title:"Analysis Complete",message:`Found ${d.value.length} migration candidates`})):b.value=t.error||"Failed to run migration analysis"}catch(t){b.value=t.message||"Failed to run migration analysis",console.error("Failed to run migration analysis:",t)}finally{p.value=!1}},W=t=>{v.value=t,k.value=!0},O=async t=>{v.value=t.name,k.value=!0},G=async t=>{if(confirm(`Are you sure you want to delete secret "${t.name}"?`))try{const s=await B.deleteSecret(t.name,t.type);s.success?(h.addToast({type:"success",title:"Secret Deleted",message:`Secret "${t.name}" deleted successfully`}),await $()):h.addToast({type:"error",title:"Delete Failed",message:s.error||"Failed to delete secret"})}catch(s){h.addToast({type:"error",title:"Delete Failed",message:s.message||"Failed to delete secret"})}},Q=async t=>{t.migrating=!0;try{const s=t.suggested.match(/\$\{keyring:([^}]+)\}/);if(!s)throw new Error("Invalid suggested reference format");const c=s[1];h.addToast({type:"info",title:"Migration Instructions",message:`Run: mcpproxy secrets set ${c} -Then update config to use: ${t.suggested}`})}catch(s){h.addToast({type:"error",title:"Migration Failed",message:s.message})}finally{t.migrating=!1}},J=async t=>{const s=`To set "${t.secret_ref.name}": - -macOS/Linux: export ${t.secret_ref.name}="your-value" -Windows (PS): $env:${t.secret_ref.name}="your-value" -Windows (CMD): set ${t.secret_ref.name}=your-value`;h.addToast({type:"info",title:"Set Environment Variable",message:s})},X=async()=>{await $()},Z=w(()=>[{icon:"πŸ”",title:"Config-First Workflow",description:"Add secret references to your config first, then set their values",sections:[{title:"1. Add secret reference to config",text:"First, add the secret reference to your mcp_config.json file:",codeBlock:{language:"json",code:`{ - "mcpServers": [ - { - "name": "my-server", - "env": { - "API_KEY": "\${keyring:my-api-key}" - } - } - ] -}`}},{title:"2. Missing secrets will appear above",text:'After saving the config, the secret will appear in the "Missing" filter with a red border, showing it needs a value.'},{title:"3. Add the secret value",text:'Click the "Add Value" button next to the missing secret, or use the CLI:',codeBlock:{language:"bash",code:"mcpproxy secrets set my-api-key"}}]},{icon:"🌍",title:"Environment Variables",description:"Reference environment variables in your configuration",sections:[{title:"Use environment variables",codeBlock:{language:"json",code:`{ - "env": { - "API_KEY": "\${env:MY_API_KEY}" - } -}`}},{title:"Set environment variables",codeBlock:{language:"bash",code:`# macOS/Linux -export MY_API_KEY="your-value" - -# Windows PowerShell -$env:MY_API_KEY="your-value"`}}]},{icon:"πŸ”„",title:"Migrate Existing Secrets",description:"Find and migrate hardcoded secrets to secure storage",sections:[{title:"Run migration analysis",text:'MCPProxy can scan your configuration and identify potential secrets that should be moved to secure storage. Click the "Analyze Configuration" button to find migration candidates.'},{title:"Automatic detection",text:"The analyzer looks for patterns like API keys, tokens, passwords, and other sensitive values that might be hardcoded in your configuration."}]}]);return ne(async()=>{await new Promise(t=>setTimeout(t,100)),$()}),(t,s)=>{var c,_,V,H;return a(),l("div",we,[e("div",xe,[s[10]||(s[10]=e("div",null,[e("h1",{class:"text-3xl font-bold"},"Secrets & Environment Variables"),e("p",{class:"text-base-content/70 mt-1"},"Manage secrets stored in your system's secure keyring and environment variables")],-1)),e("button",{onClick:s[0]||(s[0]=(...n)=>j(A)&&j(A)(...n)),disabled:m.value,class:"btn btn-outline"},[s[9]||(s[9]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)),m.value?(a(),l("span",Se)):y("",!0),C(" "+i(m.value?"Refreshing...":"Refresh"),1)],8,Ce)]),e("div",Me,[e("div",$e,[s[11]||(s[11]=e("div",{class:"stat-title"},"Keyring Secrets",-1)),e("div",Ae,i(((c=u.value)==null?void 0:c.total_secrets)||0),1),s[12]||(s[12]=e("div",{class:"stat-desc"},"Stored in system keyring",-1))]),e("div",je,[s[13]||(s[13]=e("div",{class:"stat-title"},"Environment Variables",-1)),e("div",Be,i(((_=u.value)==null?void 0:_.total_env_vars)||0),1),s[14]||(s[14]=e("div",{class:"stat-desc"},"Referenced in config",-1))]),e("div",Ee,[s[15]||(s[15]=e("div",{class:"stat-title"},"Missing Env Vars",-1)),e("div",Fe,i(o.value),1),s[16]||(s[16]=e("div",{class:"stat-desc"},"Need to be set",-1))]),e("div",Ne,[s[17]||(s[17]=e("div",{class:"stat-title"},"Migration Candidates",-1)),e("div",Te,i(d.value.length),1),s[18]||(s[18]=e("div",{class:"stat-desc"},"Potential secrets to secure",-1))])]),e("div",Le,[e("div",ze,[e("button",{onClick:s[1]||(s[1]=n=>r.value="all"),class:x(["btn btn-sm",r.value==="all"?"btn-primary":"btn-outline"])}," All ("+i(D.value)+") ",3),e("button",{onClick:s[2]||(s[2]=n=>r.value="secrets"),class:x(["btn btn-sm",r.value==="secrets"?"btn-primary":"btn-outline"])}," Keyring Secrets ("+i(((V=u.value)==null?void 0:V.total_secrets)||0)+") ",3),e("button",{onClick:s[3]||(s[3]=n=>r.value="envs"),class:x(["btn btn-sm",r.value==="envs"?"btn-primary":"btn-outline"])}," Environment Variables ("+i(((H=u.value)==null?void 0:H.total_env_vars)||0)+") ",3),e("button",{onClick:s[4]||(s[4]=n=>r.value="missing"),class:x(["btn btn-sm",r.value==="missing"?"btn-primary":"btn-outline"])}," Missing ("+i(Y.value)+") ",3)]),e("div",Pe,[N(e("input",{"onUpdate:modelValue":s[5]||(s[5]=n=>g.value=n),type:"text",placeholder:"Search secrets...",class:"input input-bordered input-sm w-64"},null,512),[[T,g.value]])])]),m.value?(a(),l("div",Ve,[...s[19]||(s[19]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1),e("p",{class:"mt-4"},"Loading secrets...",-1)])])):b.value?(a(),l("div",He,[s[21]||(s[21]=e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[s[20]||(s[20]=e("h3",{class:"font-bold"},"Failed to load secrets",-1)),e("div",Ie,i(b.value),1)]),e("button",{onClick:s[6]||(s[6]=(...n)=>j(A)&&j(A)(...n)),class:"btn btn-sm"}," Try Again ")])):U.value.length===0?(a(),l("div",Ke,[s[22]||(s[22]=e("svg",{class:"w-24 h-24 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1)),s[23]||(s[23]=e("h3",{class:"text-xl font-semibold mb-2"},"No secrets found",-1)),e("p",Re,i(g.value?"No secrets match your search criteria":`No ${r.value==="all"?"":r.value} secrets available`.replace(/\s+/g," ").trim()),1),g.value?(a(),l("button",{key:0,onClick:s[7]||(s[7]=n=>g.value=""),class:"btn btn-outline"}," Clear Search ")):y("",!0)])):(a(),oe(le,{key:3,name:"secret-list",tag:"div",class:"space-y-4"},{default:ae(()=>[(a(!0),l(E,null,F(z.value,n=>(a(),l("div",{key:`secret-${n.secret_ref.name}`,class:x(["card bg-base-100 shadow",{"border-l-4 border-error":!n.is_set}])},[e("div",Ye,[e("div",De,[e("div",Ue,[e("h3",qe,i(n.secret_ref.name),1),e("div",We,[s[24]||(s[24]=e("span",{class:"badge badge-primary"},"Keyring",-1)),n.is_set?(a(),l("span",Oe,"βœ“ Set")):(a(),l("span",Ge,"βœ— Missing")),e("code",Qe,i(n.secret_ref.original),1)])]),e("div",Je,[n.is_set?y("",!0):(a(),l("button",{key:0,onClick:M=>W(n.secret_ref.name),class:"btn btn-sm btn-primary"},[...s[25]||(s[25]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),C(" Add Value ",-1)])],8,Xe)),n.is_set?(a(),l("button",{key:1,onClick:M=>O(n.secret_ref),class:"btn btn-sm btn-outline"},[...s[26]||(s[26]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"})],-1),C(" Update ",-1)])],8,Ze)):y("",!0),n.is_set?(a(),l("button",{key:2,onClick:M=>G(n.secret_ref),class:"btn btn-sm btn-error btn-outline"},[...s[27]||(s[27]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1),C(" Remove ",-1)])],8,es)):y("",!0)])])])],2))),128)),(a(!0),l(E,null,F(P.value,n=>(a(),l("div",{key:`env-${n.secret_ref.name}`,class:x(["card bg-base-100 shadow",{"border-l-4 border-error":!n.is_set}])},[e("div",ss,[e("div",ts,[e("div",ns,[e("h3",os,i(n.secret_ref.name),1),e("div",as,[s[28]||(s[28]=e("span",{class:"badge badge-info"},"Environment Variable",-1)),n.is_set?(a(),l("span",ls,"βœ“ Set")):(a(),l("span",is,"βœ— Missing")),e("code",rs,i(n.secret_ref.original),1)])]),e("div",ds,[n.is_set?y("",!0):(a(),l("button",{key:0,onClick:M=>J(n),class:"btn btn-sm btn-primary"},[...s[29]||(s[29]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),C(" How to Set ",-1)])],8,cs))])])])],2))),128))]),_:1})),d.value.length>0?(a(),l("div",us,[e("div",vs,[e("div",ms,[s[31]||(s[31]=e("h2",{class:"card-title"},"Migration Candidates",-1)),e("button",{onClick:q,class:"btn btn-sm btn-outline",disabled:p.value},[s[30]||(s[30]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)),C(" "+i(p.value?"Analyzing...":"Re-analyze"),1)],8,gs)]),s[34]||(s[34]=e("p",{class:"text-sm text-base-content/70 mb-4"}," These configuration values appear to be secrets that could be migrated to secure storage. ",-1)),e("div",fs,[(a(!0),l(E,null,F(d.value,(n,M)=>(a(),l("div",{key:M,class:x(["alert",{"alert-success":n.confidence>=.8,"alert-warning":n.confidence>=.6&&n.confidence<.8,"alert-error":n.confidence<.6}])},[s[33]||(s[33]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),e("div",bs,[e("div",ps,i(n.field),1),e("div",ys,i(n.value),1),e("div",hs,[s[32]||(s[32]=C(" Suggested: ",-1)),e("code",ks,i(n.suggested),1),e("span",_s,"("+i(Math.round(n.confidence*100))+"% confidence)",1)])]),e("button",{onClick:xs=>Q(n),class:"btn btn-sm btn-primary",disabled:n.migrating},i(n.migrating?"Migrating...":"Store in Keychain"),9,ws)],2))),128))])])])):y("",!0),I(ie,{hints:Z.value},null,8,["hints"]),I(_e,{show:k.value,predefinedName:v.value,onClose:s[8]||(s[8]=n=>{k.value=!1,v.value=void 0}),onAdded:X},null,8,["show","predefinedName"])])}}});export{Ss as default}; diff --git a/web/frontend/dist/assets/Security-DiXvJatK.js b/web/frontend/dist/assets/Security-DiXvJatK.js deleted file mode 100644 index 9e94c7f2..00000000 --- a/web/frontend/dist/assets/Security-DiXvJatK.js +++ /dev/null @@ -1 +0,0 @@ -import{d as Fe,e as ze,r,g as q,y as Ke,z as He,q as p,B as Qe,c as n,o as l,a as e,h as u,i as k,t as o,E as We,n as P,F as S,s as M,p as L,v as le,O as ne,k as Ye,w as we,l as Ge,j as Ze,P as Se}from"./index-myMLoUzQ.js";const Je={class:"space-y-6"},Xe={class:"flex justify-between items-center"},et={class:"flex gap-2"},tt=["data-tip"],st=["disabled"],at={key:0,class:"loading loading-spinner loading-sm"},lt=["disabled"],nt={key:0,class:"loading loading-spinner loading-sm"},ot={key:0,class:"card bg-base-100 shadow-xl"},it={class:"card-body"},rt={class:"text-sm text-base-content/70"},dt={key:0},ut={class:"ml-2 font-mono text-base-content/50"},ct={class:"w-full bg-base-200 rounded-full h-4 mt-2"},vt={class:"text-xs text-base-content/50 mt-1"},gt={key:0,class:"overflow-x-auto mt-4"},bt={class:"table table-sm"},pt={class:"font-mono text-sm"},ft={class:"text-xs text-base-content/60"},mt={key:1,class:"card-actions justify-end mt-2"},_t={key:2,class:"text-sm text-base-content/50 mt-2"},yt={class:"stats shadow bg-base-100 w-full"},ht={class:"stat"},kt={class:"stat-value"},xt={class:"stat"},wt={class:"stat-value"},St={class:"stat"},Ct={class:"stat"},Dt={key:0,class:"stat-desc"},It={key:1,class:"alert alert-warning"},At={key:2,class:"alert alert-info"},Et={class:"flex-1"},$t={class:"text-sm"},Pt={class:"flex gap-2"},Mt=["disabled"],jt={key:0,class:"loading loading-spinner loading-xs"},Ot={key:3,class:"card bg-base-100 shadow-xl"},Rt={class:"card-body flex-row justify-between items-center gap-4 flex-wrap"},Vt={class:"flex-1 min-w-64"},Nt={class:"text-xs text-base-content/50 mt-1"},Tt={class:"flex items-center gap-3"},Ut={key:0,class:"loading loading-spinner loading-sm"},qt={class:"text-sm text-base-content/60"},Lt=["checked","disabled"],Bt={key:4,class:"text-center py-12"},Ft={key:5,class:"alert alert-error"},zt={class:"text-sm"},Kt={class:"card bg-base-100 shadow-xl"},Ht={class:"card-body"},Qt={key:0,class:"text-center py-8 text-base-content/50"},Wt={key:1,class:"overflow-x-auto"},Yt={class:"table table-zebra"},Gt={class:"font-bold"},Zt={class:"text-sm text-base-content/50"},Jt=["href"],Xt={key:1},es={class:"flex flex-wrap gap-1"},ts={class:"flex flex-col gap-1"},ss={key:0,class:"loading loading-spinner loading-xs"},as=["title"],ls=["title"],ns={key:2,class:"text-xs text-warning"},os={class:"flex gap-2 items-center"},is=["checked","disabled","onChange"],rs={key:0,class:"loading loading-spinner loading-xs"},ds=["onClick","disabled"],us=["onClick","disabled"],cs=["onClick","disabled"],vs={class:"card bg-base-100 shadow-xl"},gs={class:"card-body"},bs={key:0,class:"text-center py-8"},ps={key:1,class:"text-center py-8 text-base-content/50"},fs={key:2,class:"overflow-x-auto"},ms={class:"table table-zebra"},_s={key:0,class:"text-xs text-base-content/50"},ys=["data-tip"],hs={key:0,class:"loading loading-spinner loading-xs mr-1"},ks={key:3,class:"flex justify-between items-center mt-4 pt-4 border-t border-base-300"},xs={class:"text-sm text-base-content/60"},ws={class:"join"},Ss=["disabled"],Cs=["disabled"],Ds={class:"join-item btn btn-sm"},Is=["disabled"],As=["disabled"],Es={class:"modal-box max-w-lg"},$s={class:"font-bold text-lg"},Ps={key:0,class:"py-4 space-y-4"},Ms={class:"label"},js={class:"label-text font-medium"},Os=["onUpdate:modelValue","type","placeholder"],Rs={class:"label"},Vs={class:"label-text"},Ns=["onUpdate:modelValue","type","placeholder"],Ts={class:"form-control"},Us=["placeholder"],qs={key:0,class:"label"},Ls={class:"label-text-alt text-base-content/40"},Bs={class:"flex gap-2"},Fs=["disabled"],zs={key:0,class:"mt-2"},Ks={class:"font-mono text-xs bg-base-200 px-2 py-0.5 rounded"},Hs={class:"text-base-content/50"},Qs=["onClick"],Ce="https://github.com/smart-mcp-proxy/mcpproxy-go/blob/main/docs/docker-isolation.md",De="mcpproxy.dockerIsolationNudgeDismissed",B=20,Zs=Fe({__name:"Security",setup(Ws){var _e;const Z=ze(),C=r(!1),h=r(""),j=r([]),c=r({}),F=r(!1),D=r(null),z=r([]),J=r(!1),K=r("started_at"),T=r("desc"),H=r(0),v=r(1),O=q(()=>Math.max(1,Math.ceil(H.value/B))),x=r(!1),oe=r(0),X=r(0);let _=null;const g=r(null);let Q=null;const Ie=q(()=>{const s=X.value;if(s<60)return`${s}s`;const t=Math.floor(s/60),i=s%60;return`${t}m ${i}s`}),ee=r(),f=r(null),y=r({}),I=r(""),A=r(""),R=r(""),ie=q(()=>{var s,t;return((t=(s=c.value)==null?void 0:s.findings_by_severity)==null?void 0:t.total)||0}),V=r(!1),E=r(0),te=r(0),N=r(!1),re=r(typeof window<"u"&&((_e=window.localStorage)==null?void 0:_e.getItem(De))==="1"),Ae=q(()=>{var s;return F.value&&((s=c.value)==null?void 0:s.docker_available)===!0&&!V.value&&E.value>0&&!re.value});async function Ee(){var s,t,i;try{const[d,m]=await Promise.all([p.getConfig(),p.getServers()]);if(d.success&&d.data&&(V.value=!!((t=(s=d.data.config)==null?void 0:s.docker_isolation)!=null&&t.enabled)),m.success&&((i=m.data)!=null&&i.servers)){const U=m.data.servers.filter(G=>G.protocol==="stdio");E.value=U.length,te.value=V.value?U.length:0}}catch{}}async function de(s){N.value=!0;try{const t=await p.setDockerIsolationEnabled(s);return t.success?(V.value=s,te.value=s?E.value:0,Z.addToast({type:"success",title:s?"Docker isolation enabled":"Docker isolation disabled",message:s?"New connections will isolate immediately. Existing connections will isolate after restart.":"Servers will run directly on the host."}),!0):(Z.addToast({type:"error",title:"Failed to update Docker isolation",message:t.error||"Unknown error"}),!1)}catch(t){return Z.addToast({type:"error",title:"Failed to update Docker isolation",message:(t==null?void 0:t.message)||String(t)}),!1}finally{N.value=!1}}async function $e(s){const t=s.target;await de(t.checked)}async function Pe(){await de(!0)&&ue()}function ue(){var s;re.value=!0;try{(s=window.localStorage)==null||s.setItem(De,"1")}catch{}}const ce=q(()=>{const s=g.value;return!s||!s.total?0:Math.round(((s.completed||0)+(s.failed||0)+(s.skipped||0))/s.total*100)});function Me(s){switch(s){case"completed":return"badge-success";case"running":return"badge-info";case"failed":return"badge-error";case"skipped":return"badge-ghost";case"cancelled":return"badge-warning";default:return"badge-ghost"}}function je(s){switch(s){case"configured":return"badge-success";case"installed":return"badge-success";case"pulling":return"badge-info";case"available":return"badge-ghost";case"error":return"badge-error";default:return"badge-ghost"}}function Oe(s){switch(s){case"installed":case"configured":return"enabled";case"pulling":return"pulling image…";case"available":return"disabled";case"error":return"failed";default:return s}}function ve(s){var i;if(s.status!=="installed"&&s.status!=="configured"||!((i=s.required_env)!=null&&i.length))return!1;const t=s.configured_env||{};return s.required_env.some(d=>!t[d.key])}async function w(){C.value=!0,h.value="";try{const[s,t]=await Promise.all([p.listScanners(),p.getSecurityOverview()]);if(s.success){const i=s.data||[];i.sort((d,m)=>String(d.id).localeCompare(String(m.id))),j.value=i}t.success&&(c.value=t.data||{},F.value=!0)}catch(s){h.value=s.message}finally{C.value=!1}}async function Re(s){D.value=s.id;try{if(s.status==="available"){const t=await p.installScanner(s.id);t.success||(h.value=`Failed to enable: ${t.error}`)}else s.status!=="error"&&await p.removeScanner(s.id);await w(),await ne()}finally{D.value=null}}async function Ve(s){D.value=s.id;try{const t=await p.installScanner(s.id);t.success||(h.value=`Retry failed: ${t.error}`),await w(),await ne()}finally{D.value=null}}function ge(s){var i;f.value=s;const t=s.configured_env||{};y.value={...t},I.value="",A.value="",R.value=s.image_override||"",(i=ee.value)==null||i.showModal()}function be(){var s;(s=ee.value)==null||s.close()}function pe(s){var i,d;const t=(d=(i=f.value)==null?void 0:i.configured_env)==null?void 0:d[s];return t?t.startsWith("${keyring:")?"(stored in keyring)":"(configured)":s}function Ne(){I.value&&A.value&&(y.value[I.value]=A.value,I.value="",A.value="")}async function Te(){var d;if(!f.value)return;const s={};for(const[m,$]of Object.entries(y.value))$&&!$.startsWith("${keyring:")&&(s[m]=$);const t=Object.keys(s).length>0,i=R.value&&R.value!==(((d=f.value)==null?void 0:d.image_override)||"");(t||i)&&await p.configureScanner(f.value.id,s,R.value||void 0),be(),await w()}function W(s){K.value===s?T.value=T.value==="desc"?"asc":"desc":(K.value=s,T.value="desc"),v.value=1,se()}function Y(s){return K.value!==s?"":T.value==="desc"?"β–Ό":"β–²"}function Ue(s){switch(s){case"completed":return"badge-success";case"running":return"badge-info";case"failed":return"badge-error";case"cancelled":return"badge-warning";default:return"badge-ghost"}}function qe(s){if(!s)return"-";const t=Date.now()-new Date(s).getTime(),i=Math.floor(t/6e4);if(i<1)return"just now";if(i<60)return`${i}m ago`;const d=Math.floor(i/60);return d<24?`${d}h ago`:`${Math.floor(d/24)}d ago`}async function se(){J.value=!0;try{const s=(v.value-1)*B,t=await p.listScanHistory({sort:K.value,order:T.value,limit:B,offset:s});t.success&&t.data&&(z.value=t.data.scans||[],H.value=t.data.total||0)}catch{}finally{J.value=!1}}Ke(v,()=>se());async function Le(){x.value=!0,oe.value=Date.now(),X.value=0,_=setInterval(()=>{X.value=Math.floor((Date.now()-oe.value)/1e3)},1e3);try{const s=await p.scanAll();if(!s.success){h.value=`Failed to start batch scan: ${s.error}`,x.value=!1,_&&(clearInterval(_),_=null);return}g.value=s.data,fe()}catch(s){h.value=s.message,x.value=!1}}function fe(){ae(),Q=setInterval(async()=>{try{const s=await p.getQueueProgress();s.success&&s.data&&(g.value=s.data,(s.data.status==="completed"||s.data.status==="cancelled")&&(ae(),_&&(clearInterval(_),_=null),x.value=!1,await w()))}catch{}},3e3)}function ae(){Q&&(clearInterval(Q),Q=null)}async function Be(){try{await p.cancelAllScans()}catch(s){h.value=s.message}}function me(s){const t=s.detail;if(!t)return;const i=j.value.findIndex(d=>d.id===t.scanner_id);i>=0&&(j.value[i]={...j.value[i],status:t.status,error_message:t.error||""}),w(),ne()}return He(async()=>{await Promise.all([w(),se(),Ee()]),window.addEventListener("mcpproxy:scanner-changed",me);try{const s=await p.getQueueProgress();s.success&&s.data&&s.data.status==="running"&&(g.value=s.data,x.value=!0,fe())}catch{}}),Qe(()=>{ae(),_&&(clearInterval(_),_=null),window.removeEventListener("mcpproxy:scanner-changed",me)}),(s,t)=>{var d,m,$,U,G,ye,he,ke,xe;const i=Ge("router-link");return l(),n("div",Je,[e("div",Xe,[t[11]||(t[11]=e("div",null,[e("h1",{class:"text-3xl font-bold"},"Security"),e("p",{class:"text-base-content/70 mt-1"},"Configure security scanner plugins and review scan results")],-1)),e("div",et,[(((d=c.value)==null?void 0:d.scanners_enabled)??((m=c.value)==null?void 0:m.scanners_installed)??0)>0?(l(),n("div",{key:0,class:"tooltip","data-tip":($=c.value)!=null&&$.docker_available?"":"Docker is required to run security scanners"},[e("button",{onClick:Le,disabled:C.value||x.value||!((U=c.value)!=null&&U.docker_available),class:"btn btn-primary"},[x.value?(l(),n("span",at)):u("",!0),k(" "+o(x.value?"Scanning...":"Scan All Servers"),1)],8,st)],8,tt)):u("",!0),e("button",{onClick:w,disabled:C.value,class:"btn btn-outline"},[C.value?(l(),n("span",nt)):u("",!0),k(" "+o(C.value?"Refreshing...":"Refresh"),1)],8,lt)])]),g.value&&g.value.status!=="idle"?(l(),n("div",ot,[e("div",it,[t[13]||(t[13]=e("h2",{class:"card-title text-lg"},"Scanning All Servers",-1)),e("p",rt,[k(" Progress: "+o(g.value.completed||0)+"/"+o(g.value.total||0)+" completed, "+o(g.value.running||0)+" running",1),g.value.skipped?(l(),n("span",dt,", "+o(g.value.skipped)+" skipped",1)):u("",!0),e("span",ut,o(Ie.value),1)]),e("div",ct,[e("div",{class:P(["h-4 rounded-full transition-all duration-500",g.value.status==="cancelled"?"bg-warning":"bg-primary"]),style:We({width:ce.value+"%"})},null,6)]),e("p",vt,o(ce.value)+"%",1),(G=g.value.items)!=null&&G.length?(l(),n("div",gt,[e("table",bt,[t[12]||(t[12]=e("thead",null,[e("tr",null,[e("th",null,"Server"),e("th",null,"Status"),e("th",null,"Error")])],-1)),e("tbody",null,[(l(!0),n(S,null,M(g.value.items,a=>(l(),n("tr",{key:a.server_name},[e("td",pt,o(a.server_name),1),e("td",null,[e("span",{class:P(["badge badge-sm",Me(a.status)])},o(a.status),3)]),e("td",ft,o(a.error||a.skip_reason||""),1)]))),128))])])])):u("",!0),g.value.status==="running"?(l(),n("div",mt,[e("button",{onClick:Be,class:"btn btn-sm btn-warning btn-outline"},"Cancel All")])):(l(),n("div",_t," Batch scan "+o(g.value.status)+". ",1))])])):u("",!0),e("div",yt,[e("div",ht,[t[14]||(t[14]=e("div",{class:"stat-title"},"Scanners Installed",-1)),e("div",kt,o(c.value.scanners_installed||0),1)]),e("div",xt,[t[15]||(t[15]=e("div",{class:"stat-title"},"Total Scans",-1)),e("div",wt,o(c.value.total_scans||0),1)]),e("div",St,[t[16]||(t[16]=e("div",{class:"stat-title"},"Active Scans",-1)),e("div",{class:P(["stat-value",c.value.active_scans>0?"text-warning":""])},o(c.value.active_scans||0),3)]),e("div",Ct,[t[17]||(t[17]=e("div",{class:"stat-title"},"Findings",-1)),e("div",{class:P(["stat-value",ie.value>0?"text-error":"text-success"])},o(ie.value),3),c.value.findings_by_severity?(l(),n("div",Dt,o(c.value.findings_by_severity.critical||0)+" critical, "+o(c.value.findings_by_severity.high||0)+" high ",1)):u("",!0)])]),F.value&&c.value.docker_available===!1?(l(),n("div",It,[...t[18]||(t[18]=[e("svg",{class:"w-5 h-5 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"})],-1),e("span",null,"Docker is not running. Security scanners require Docker to analyze MCP servers.",-1)])])):u("",!0),Ae.value?(l(),n("div",At,[t[21]||(t[21]=e("svg",{class:"w-5 h-5 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",Et,[t[19]||(t[19]=e("div",{class:"font-bold"},"Docker isolation is off.",-1)),e("div",$t," You have "+o(E.value)+" stdio server"+o(E.value===1?"":"s")+" running directly on your host. Enable Docker isolation to sandbox them. ",1)]),e("div",Pt,[e("button",{onClick:Pe,disabled:N.value,class:"btn btn-sm btn-primary"},[N.value?(l(),n("span",jt)):u("",!0),t[20]||(t[20]=k(" Enable ",-1))],8,Mt),e("a",{href:Ce,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-ghost"},"Learn more"),e("button",{onClick:ue,class:"btn btn-sm btn-ghost"},"Dismiss")])])):u("",!0),F.value&&c.value.docker_available===!0?(l(),n("div",Ot,[e("div",Rt,[e("div",Vt,[t[22]||(t[22]=e("h2",{class:"card-title text-lg"},"Docker Isolation",-1)),t[23]||(t[23]=e("p",{class:"text-sm text-base-content/70"}," Wrap each stdio MCP server in its own Docker container so it can't touch the host filesystem. ",-1)),e("p",Nt,[k(" Currently isolated: "+o(te.value)+" of "+o(E.value)+" stdio server"+o(E.value===1?"":"s")+". ",1),e("a",{href:Ce,target:"_blank",rel:"noopener noreferrer",class:"link link-hover"}," Learn more ")])]),e("div",Tt,[N.value?(l(),n("span",Ut)):u("",!0),e("span",qt,o(V.value?"On":"Off"),1),e("input",{type:"checkbox",class:"toggle toggle-primary",checked:V.value,disabled:N.value,onChange:$e},null,40,Lt)])])])):u("",!0),C.value?(l(),n("div",Bt,[...t[24]||(t[24]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1),e("p",{class:"mt-4"},"Loading security data...",-1)])])):h.value?(l(),n("div",Ft,[e("div",null,[t[25]||(t[25]=e("h3",{class:"font-bold"},"Error",-1)),e("div",zt,o(h.value),1)]),e("button",{onClick:w,class:"btn btn-sm"},"Retry")])):(l(),n(S,{key:6},[e("div",Kt,[e("div",Ht,[t[27]||(t[27]=e("h2",{class:"card-title"},"Security Scanners",-1)),t[28]||(t[28]=e("p",{class:"text-sm text-base-content/70 mb-4"},"Each scanner is a third-party security tool that runs inside an isolated Docker container β€” sandboxed from your host, with no access to your filesystem or network beyond what the scan requires. Enable or disable individual scanners and configure their API keys below.",-1)),j.value.length===0?(l(),n("div",Qt," No scanners available. Check Docker connectivity. ")):(l(),n("div",Wt,[e("table",Yt,[t[26]||(t[26]=e("thead",null,[e("tr",null,[e("th",null,"Scanner"),e("th",null,"Vendor"),e("th",null,"Inputs"),e("th",null,"Status"),e("th",null,"Actions")])],-1)),e("tbody",null,[(l(!0),n(S,null,M(j.value,a=>(l(),n("tr",{key:a.id},[e("td",null,[e("div",Gt,o(a.name),1),e("div",Zt,o(a.description),1)]),e("td",null,[a.homepage?(l(),n("a",{key:0,href:a.homepage,target:"_blank",rel:"noopener noreferrer",class:"link link-primary"},o(a.vendor),9,Jt)):(l(),n("span",Xt,o(a.vendor),1))]),e("td",null,[e("div",es,[(l(!0),n(S,null,M(a.inputs,b=>(l(),n("span",{key:b,class:"badge badge-sm badge-outline"},o(b),1))),128))])]),e("td",null,[e("div",ts,[e("span",{class:P(["badge badge-sm gap-1",je(a.status)])},[a.status==="pulling"?(l(),n("span",ss)):u("",!0),k(" "+o(Oe(a.status)),1)],2),a.status==="error"&&a.error_message?(l(),n("span",{key:0,class:"text-xs text-error max-w-xs",title:a.error_message},o(a.error_message),9,as)):a.status==="pulling"?(l(),n("span",{key:1,class:"text-xs text-info max-w-xs truncate font-mono",title:a.image_override||a.docker_image}," pulling "+o(a.image_override||a.docker_image),9,ls)):ve(a)?(l(),n("span",ns," API key required ")):u("",!0)])]),e("td",null,[e("div",os,[e("input",{type:"checkbox",class:"toggle toggle-sm toggle-primary",checked:a.status!=="available"&&a.status!=="error",disabled:D.value===a.id||a.status==="pulling",onChange:b=>Re(a)},null,40,is),D.value===a.id?(l(),n("span",rs)):u("",!0),a.status==="error"?(l(),n("button",{key:1,onClick:b=>Ve(a),disabled:D.value===a.id,class:"btn btn-sm btn-error btn-outline"}," Retry ",8,ds)):ve(a)?(l(),n("button",{key:2,onClick:b=>ge(a),disabled:a.status==="pulling",class:"btn btn-sm btn-warning btn-outline"}," Set API Key ",8,us)):(l(),n("button",{key:3,onClick:b=>ge(a),disabled:a.status==="pulling",class:"btn btn-sm btn-outline"}," Configure ",8,cs))])])]))),128))])])]))])]),e("div",vs,[e("div",gs,[t[32]||(t[32]=e("div",null,[e("h2",{class:"card-title"},"Scan History"),e("p",{class:"text-sm text-base-content/70 mb-4"},"All security scan results across servers")],-1)),J.value&&z.value.length===0?(l(),n("div",bs,[...t[29]||(t[29]=[e("span",{class:"loading loading-spinner loading-md"},null,-1),e("p",{class:"mt-2 text-sm text-base-content/50"},"Loading scan history...",-1)])])):z.value.length===0?(l(),n("div",ps,' No scan history yet. Use "Scan All Servers" to start scanning. ')):(l(),n("div",fs,[e("table",ms,[e("thead",null,[e("tr",null,[e("th",{class:"cursor-pointer select-none",onClick:t[0]||(t[0]=a=>W("server_name"))}," Server "+o(Y("server_name")),1),e("th",{class:"cursor-pointer select-none",onClick:t[1]||(t[1]=a=>W("started_at"))}," Date "+o(Y("started_at")),1),e("th",{class:"cursor-pointer select-none",onClick:t[2]||(t[2]=a=>W("status"))}," Status "+o(Y("status")),1),e("th",{class:"cursor-pointer select-none",onClick:t[3]||(t[3]=a=>W("findings_count"))}," Findings "+o(Y("findings_count")),1),t[30]||(t[30]=e("th",null,null,-1))])]),e("tbody",null,[(l(!0),n(S,null,M(z.value,a=>(l(),n("tr",{key:a.id},[e("td",null,[Ye(i,{to:`/servers/${encodeURIComponent(a.server_name)}`,class:"link link-primary font-medium"},{default:we(()=>[k(o(a.server_name),1)]),_:2},1032,["to"]),a.pass===2?(l(),n("div",_s,"(Pass 2)")):u("",!0)]),e("td",null,[e("span",{class:"tooltip","data-tip":a.started_at},o(qe(a.started_at)),9,ys)]),e("td",null,[e("span",{class:P(["badge badge-sm",Ue(a.status)])},[a.status==="running"?(l(),n("span",hs)):u("",!0),k(" "+o(a.status),1)],2)]),e("td",null,[e("span",{class:P({"font-bold":(a.findings_count||0)>0})},o(a.findings_count||0),3)]),e("td",null,[a.status==="completed"?(l(),Ze(i,{key:0,to:`/security/scans/${encodeURIComponent(a.id)}`,class:"link link-primary text-sm whitespace-nowrap"},{default:we(()=>[...t[31]||(t[31]=[k(" Details β†’ ",-1)])]),_:1},8,["to"])):u("",!0)])]))),128))])])])),O.value>1?(l(),n("div",ks,[e("div",xs," Showing "+o((v.value-1)*B+1)+"-"+o(Math.min(v.value*B,H.value))+" of "+o(H.value),1),e("div",ws,[e("button",{onClick:t[4]||(t[4]=a=>v.value=1),disabled:v.value===1,class:"join-item btn btn-sm"},"Β«",8,Ss),e("button",{onClick:t[5]||(t[5]=a=>v.value=Math.max(1,v.value-1)),disabled:v.value===1,class:"join-item btn btn-sm"},"β€Ή",8,Cs),e("button",Ds,o(v.value)+" / "+o(O.value),1),e("button",{onClick:t[6]||(t[6]=a=>v.value=Math.min(O.value,v.value+1)),disabled:v.value===O.value,class:"join-item btn btn-sm"},"β€Ί",8,Is),e("button",{onClick:t[7]||(t[7]=a=>v.value=O.value),disabled:v.value===O.value,class:"join-item btn btn-sm"},"Β»",8,As)])])):u("",!0)])])],64)),e("dialog",{ref_key:"configDialog",ref:ee,class:"modal"},[e("div",Es,[e("h3",$s,"Configure "+o((ye=f.value)==null?void 0:ye.name),1),t[39]||(t[39]=e("p",{class:"text-sm text-base-content/60 mt-1"},"Set API keys and environment variables. Secrets are stored in your OS keychain.",-1)),f.value?(l(),n("div",Ps,[(l(!0),n(S,null,M(f.value.required_env||[],a=>(l(),n("div",{key:a.key,class:"form-control"},[e("label",Ms,[e("span",js,o(a.label),1),t[33]||(t[33]=e("span",{class:"badge badge-sm badge-error"},"Required",-1))]),L(e("input",{"onUpdate:modelValue":b=>y.value[a.key]=b,type:a.secret?"password":"text",placeholder:pe(a.key),class:"input input-bordered"},null,8,Os),[[Se,y.value[a.key]]])]))),128)),(l(!0),n(S,null,M(f.value.optional_env||[],a=>(l(),n("div",{key:a.key,class:"form-control"},[e("label",Rs,[e("span",Vs,o(a.label),1),t[34]||(t[34]=e("span",{class:"badge badge-sm badge-ghost"},"Optional",-1))]),L(e("input",{"onUpdate:modelValue":b=>y.value[a.key]=b,type:a.secret?"password":"text",placeholder:pe(a.key),class:"input input-bordered"},null,8,Ns),[[Se,y.value[a.key]]])]))),128)),t[37]||(t[37]=e("div",{class:"divider text-xs"},"Docker Image",-1)),e("div",Ts,[t[35]||(t[35]=e("label",{class:"label"},[e("span",{class:"label-text"},"Docker Image"),e("span",{class:"badge badge-sm badge-ghost"},"Optional")],-1)),L(e("input",{"onUpdate:modelValue":t[8]||(t[8]=a=>R.value=a),type:"text",placeholder:((he=f.value)==null?void 0:he.image_override)||((ke=f.value)==null?void 0:ke.docker_image)||"default image",class:"input input-bordered input-sm font-mono"},null,8,Us),[[le,R.value]]),(xe=f.value)!=null&&xe.docker_image?(l(),n("label",qs,[e("span",Ls,"Default: "+o(f.value.docker_image),1)])):u("",!0)]),t[38]||(t[38]=e("div",{class:"divider text-xs"},"Add Custom Variable",-1)),e("div",Bs,[L(e("input",{"onUpdate:modelValue":t[9]||(t[9]=a=>I.value=a),type:"text",placeholder:"OPENAI_API_KEY",class:"input input-bordered input-sm flex-1"},null,512),[[le,I.value]]),L(e("input",{"onUpdate:modelValue":t[10]||(t[10]=a=>A.value=a),type:"password",placeholder:"Value",class:"input input-bordered input-sm flex-1"},null,512),[[le,A.value]]),e("button",{onClick:Ne,disabled:!I.value||!A.value,class:"btn btn-sm btn-outline"},"Add",8,Fs)]),Object.keys(y.value).length>0?(l(),n("div",zs,[t[36]||(t[36]=e("div",{class:"text-xs text-base-content/50 mb-1"},"Configured variables:",-1)),(l(!0),n(S,null,M(y.value,(a,b)=>(l(),n("div",{key:b,class:"flex items-center gap-2 text-sm py-1"},[e("code",Ks,o(b),1),e("span",Hs,o(a.startsWith("${keyring:")?"stored in keyring":"set"),1),e("button",{onClick:Ys=>delete y.value[b],class:"btn btn-ghost btn-xs text-error"},"x",8,Qs)]))),128))])):u("",!0)])):u("",!0),e("div",{class:"modal-action"},[e("button",{onClick:be,class:"btn"},"Cancel"),e("button",{onClick:Te,class:"btn btn-primary"},"Save")])]),t[40]||(t[40]=e("form",{method:"dialog",class:"modal-backdrop"},[e("button",null,"close")],-1))],512)])}}});export{Zs as default}; diff --git a/web/frontend/dist/assets/ServerDetail-DZf4WjHw.js b/web/frontend/dist/assets/ServerDetail-DZf4WjHw.js deleted file mode 100644 index e56e09d5..00000000 --- a/web/frontend/dist/assets/ServerDetail-DZf4WjHw.js +++ /dev/null @@ -1,14 +0,0 @@ -import{d as we,g as A,c as o,h as r,o as n,n as $,t as l,e as We,r as b,a as t,i as y,F as w,s as I,q as B,b as kt,f as wt,y as St,z as Ct,A as $t,B as Tt,k as _e,w as xe,l as At,j as he,m as ke,p as Ie,v as Mt,D as Dt,E as jt,G as Ft,C as Nt}from"./index-myMLoUzQ.js";const Lt=["title"],Bt={key:0},Rt={key:1},Et=["title"],zt={key:0},Pt={key:1},Ot=["title"],qt={key:0},Vt={key:1},Ht=["title"],Ut={key:0},It={key:1},Wt=we({__name:"AnnotationBadges",props:{annotations:{},compact:{type:Boolean,default:!1}},setup(J){const k=J,O=A(()=>k.annotations?k.annotations.title||k.annotations.readOnlyHint||k.annotations.destructiveHint||k.annotations.idempotentHint||k.annotations.openWorldHint:!1),_=u=>{const N=k.compact?"badge badge-sm cursor-help":"badge badge-sm";switch(u){case"info":return`${N} badge-info`;case"error":return`${N} badge-error`;case"neutral":return`${N} badge-neutral`;case"secondary":return`${N} badge-secondary`;default:return N}};return(u,N)=>{var z,a,M,m,R;return O.value?(n(),o("div",{key:0,class:$(["flex flex-wrap gap-1 items-center",u.compact?"gap-0.5":"gap-1"])},[(z=u.annotations)!=null&&z.title?(n(),o("div",{key:0,class:$(["text-sm font-medium text-base-content/80",u.compact?"text-xs":""])},l(u.annotations.title),3)):r("",!0),(a=u.annotations)!=null&&a.readOnlyHint?(n(),o("div",{key:1,class:$(_("info")),title:u.compact?"Read-only: Does not modify data":""},[u.compact?(n(),o("span",Rt,"πŸ“–")):(n(),o("span",Bt,"πŸ“– Read-only"))],10,Lt)):r("",!0),(M=u.annotations)!=null&&M.destructiveHint?(n(),o("div",{key:2,class:$(_("error")),title:u.compact?"Destructive: May delete or modify data":""},[u.compact?(n(),o("span",Pt,"⚠️")):(n(),o("span",zt,"⚠️ Destructive"))],10,Et)):r("",!0),(m=u.annotations)!=null&&m.idempotentHint?(n(),o("div",{key:3,class:$(_("neutral")),title:u.compact?"Idempotent: Safe to retry":""},[u.compact?(n(),o("span",Vt,"πŸ”„")):(n(),o("span",qt,"πŸ”„ Idempotent"))],10,Ot)):r("",!0),(R=u.annotations)!=null&&R.openWorldHint?(n(),o("div",{key:4,class:$(_("secondary")),title:u.compact?"Open World: May access external resources":""},[u.compact?(n(),o("span",It,"🌐")):(n(),o("span",Ut,"🌐 Open World"))],10,Ht)):r("",!0)],2)):r("",!0)}}}),Qt=["aria-label"],Kt={class:"w-full"},Yt={class:"flex items-start justify-between gap-3"},Gt={class:"flex items-center gap-2 flex-wrap"},Jt={class:"font-bold"},Xt={class:"text-xs opacity-80","data-testid":"error-panel-code"},Zt={key:0,class:"text-sm mt-1","data-testid":"error-panel-message"},es={key:1,class:"text-xs opacity-70 mt-1"},ts=["aria-expanded","aria-label"],ss={key:0,class:"mt-3 space-y-2","data-testid":"error-panel-fix-steps"},as={class:"list-decimal list-inside space-y-2 text-sm"},ns={class:"flex items-center gap-2 flex-wrap"},os={class:"font-medium"},ls={key:0,class:"badge badge-xs badge-warning","aria-label":"Destructive action"},rs=["href"],is={key:1,class:"flex items-center gap-2"},ds=["data-testid"],us=["aria-label","onClick"],cs={key:2,class:"flex items-center gap-2 flex-wrap"},vs=["disabled","data-testid","onClick"],ps={key:0,class:"loading loading-spinner loading-xs"},gs=["disabled","data-testid","onClick"],ms={key:0,class:"loading loading-spinner loading-xs"},fs=["href"],bs=we({__name:"ErrorPanel",props:{diagnostic:{},serverName:{}},emits:["fixed"],setup(J,{emit:k}){const O=J,_=k,u=We(),N=b(!0),z=b(new Set),a=A(()=>{var x;const c=(x=O.diagnostic)==null?void 0:x.severity;return c==="error"?"alert-error":c==="warn"?"alert-warning":"alert-info"}),M=A(()=>{var x;const c=(x=O.diagnostic)==null?void 0:x.severity;return c==="error"?"badge-error":c==="warn"?"badge-warning":"badge-info"}),m=A(()=>{var x;const c=(x=O.diagnostic)==null?void 0:x.severity;return c==="error"?"Server Error":c==="warn"?"Server Warning":"Diagnostic"});function R(c){return c?z.value.has(c):!1}async function X(c){try{await navigator.clipboard.writeText(c),u.addToast({type:"success",title:"Command copied",message:c.length>60?c.slice(0,57)+"...":c})}catch(x){u.addToast({type:"error",title:"Copy failed",message:x instanceof Error?x.message:String(x)})}}function W(c){!c.fixer_key||!(!(typeof window<"u"&&typeof window.confirm=="function")||window.confirm(`Execute destructive fix "${c.label}" on server "${O.serverName}"? - -This action may mutate configuration or trigger a new login.`))||U(c,"execute")}async function U(c,x){var P;if(!c.fixer_key||!((P=O.diagnostic)!=null&&P.code))return;const v=c.fixer_key;z.value.add(v);try{const F=await B.invokeDiagnosticFix({server:O.serverName,code:O.diagnostic.code,fixer_key:v,mode:x});if(F.success&&F.data){const Q=F.data.outcome,f=x==="dry_run"?"Dry-run":"Executed";u.addToast({type:Q==="success"?"success":Q==="failed"?"error":"warning",title:`${f}: ${c.label}`,message:F.data.preview||F.data.failure_msg||`Outcome: ${Q} (${F.data.duration_ms}ms)`}),_("fixed",{fixerKey:v,mode:x})}else u.addToast({type:"error",title:`Fix failed: ${c.label}`,message:F.error||"Unknown error"})}catch(F){u.addToast({type:"error",title:`Fix failed: ${c.label}`,message:F instanceof Error?F.message:String(F)})}finally{z.value.delete(v)}}return(c,x)=>c.diagnostic&&c.diagnostic.code?(n(),o("div",{key:0,class:$(["alert",a.value]),role:"alert","aria-label":`Diagnostic ${c.diagnostic.code}`},[x[4]||(x[4]=t("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","aria-hidden":"true"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("div",Kt,[t("div",Yt,[t("div",null,[t("div",Gt,[t("h3",Jt,l(m.value),1),t("span",{class:$(["badge badge-sm",M.value]),"data-testid":"error-panel-severity"},l(c.diagnostic.severity),3),t("code",Xt,l(c.diagnostic.code),1)]),c.diagnostic.user_message?(n(),o("p",Zt,l(c.diagnostic.user_message),1)):r("",!0),c.diagnostic.cause?(n(),o("p",es,[x[1]||(x[1]=t("span",{class:"font-semibold"},"Cause:",-1)),y(" "+l(c.diagnostic.cause),1)])):r("",!0)]),t("button",{type:"button",class:"btn btn-xs btn-ghost","aria-expanded":N.value?"true":"false","aria-label":N.value?"Collapse fix steps":"Expand fix steps",onClick:x[0]||(x[0]=v=>N.value=!N.value)},l(N.value?"Hide steps":"Show fix steps"),9,ts)]),N.value?(n(),o("div",ss,[t("ol",as,[(n(!0),o(w,null,I(c.diagnostic.fix_steps||[],(v,P)=>(n(),o("li",{key:P,class:"flex flex-col gap-1"},[t("div",ns,[t("span",os,l(v.label),1),v.destructive?(n(),o("span",ls,"destructive")):r("",!0)]),v.type==="link"&&v.url?(n(),o("a",{key:0,href:v.url,target:"_blank",rel:"noopener noreferrer",class:"link link-primary text-xs break-all"},l(v.url),9,rs)):v.type==="command"&&v.command?(n(),o("div",is,[t("code",{class:"text-xs bg-base-200 p-1 rounded break-all flex-1","data-testid":`error-panel-command-${P}`},l(v.command),9,ds),t("button",{type:"button",class:"btn btn-xs","aria-label":`Copy command: ${v.label}`,onClick:F=>X(v.command)},"Copy",8,us)])):v.type==="button"&&v.fixer_key?(n(),o("div",cs,[v.destructive?(n(),o("button",{key:0,type:"button",class:"btn btn-xs btn-warning",disabled:R(v.fixer_key),"data-testid":`error-panel-fix-button-${P}`,onClick:F=>U(v,"dry_run")},[R(v.fixer_key)?(n(),o("span",ps)):r("",!0),x[2]||(x[2]=y(" Preview (dry-run) ",-1))],8,vs)):r("",!0),t("button",{type:"button",class:$(["btn btn-xs",v.destructive?"btn-outline btn-error":"btn-primary"]),disabled:R(v.fixer_key),"data-testid":`error-panel-execute-button-${P}`,onClick:F=>v.destructive?W(v):U(v,"execute")},[!v.destructive&&R(v.fixer_key)?(n(),o("span",ms)):r("",!0),x[3]||(x[3]=y(" Execute ",-1))],10,gs)])):r("",!0)]))),128))]),c.diagnostic.docs_url?(n(),o("a",{key:0,href:c.diagnostic.docs_url,target:"_blank",rel:"noopener noreferrer",class:"link link-hover text-xs mt-2 inline-block","data-testid":"error-panel-docs-link"},"Documentation β†’",8,fs)):r("",!0)])):r("",!0)])],10,Qt)):r("",!0)}}),ys={class:"space-y-6"},_s={key:0,class:"text-center py-12"},xs={key:1,class:"alert alert-error"},hs={class:"text-sm"},ks={key:2,class:"text-center py-12"},ws={class:"text-base-content/70 mb-4"},Ss={key:3},Cs={class:"flex flex-col lg:flex-row lg:justify-between lg:items-start gap-4"},$s={class:"breadcrumbs text-sm mb-2"},Ts={class:"text-3xl font-bold"},As={class:"text-base-content/70 mt-1"},Ms={class:"flex items-center space-x-2"},Ds={class:"dropdown dropdown-end"},js={tabindex:"0",class:"dropdown-content menu bg-base-100 rounded-box z-[1] w-52 p-2 shadow"},Fs=["disabled"],Ns={key:0,class:"loading loading-spinner loading-xs"},Ls={key:0},Bs=["disabled"],Rs={key:0,class:"loading loading-spinner loading-xs"},Es={key:1},zs=["disabled"],Ps={key:0,class:"loading loading-spinner loading-xs"},Os={key:2},qs=["disabled"],Vs={key:0,class:"loading loading-spinner loading-xs"},Hs=["disabled"],Us={key:0,class:"loading loading-spinner loading-xs"},Is=["disabled"],Ws={key:0,class:"loading loading-spinner loading-xs"},Qs={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6"},Ks={class:"stats shadow bg-base-100"},Ys={class:"stat"},Gs={class:"stat-value"},Js={class:"stats shadow bg-base-100"},Xs={class:"stat"},Zs={class:"stat-value text-sm"},ea={class:"stat-desc"},ta={class:"stats shadow bg-base-100"},sa={class:"stat"},aa={class:"stat-value text-sm"},na={class:"stats shadow bg-base-100"},oa={class:"stat"},la={class:"stat-value text-sm"},ra={class:"space-y-4"},ia={key:1,class:"alert alert-error"},da={class:"text-sm"},ua={key:2,class:"alert alert-warning"},ca=["disabled"],va={key:0,class:"loading loading-spinner loading-xs"},pa={key:0,class:"modal modal-open"},ga={class:"modal-box"},ma={class:"font-bold text-lg mb-4"},fa={key:0,class:"mb-4"},ba={class:"text-error font-semibold"},ya={key:1,class:"mb-4"},_a={class:"modal-action"},xa=["disabled"],ha=["disabled"],ka=["disabled"],wa={key:0,class:"loading loading-spinner loading-xs"},Sa={class:"tabs tabs-bordered"},Ca={class:"flex items-center gap-2"},$a={key:0,class:"loading loading-spinner loading-xs"},Ta={class:"mt-6"},Aa={key:0},Ma={key:0,class:"text-center py-8"},Da={key:1,class:"alert alert-error"},ja={key:2,class:"text-center py-8"},Fa={class:"text-base-content/70"},Na={key:3,class:"space-y-4"},La={key:0,class:"alert alert-warning shadow-lg mb-4"},Ba={class:"flex-1"},Ra={class:"text-sm"},Ea=["disabled"],za={key:0,class:"loading loading-spinner loading-xs"},Pa={key:1,class:"space-y-3 mb-6"},Oa={class:"card-body py-3 px-4"},qa={class:"flex items-center justify-between"},Va={class:"flex-1"},Ha={class:"flex items-center gap-2"},Ua={class:"font-semibold"},Ia={key:0,class:"text-sm text-base-content/70 mt-1"},Wa={key:1,class:"mt-2 space-y-2 text-xs"},Qa={class:"bg-error/5 border border-error/20 px-2 py-1.5 rounded font-mono leading-relaxed"},Ka={key:0,class:"bg-error/20 text-error font-semibold px-0.5 rounded"},Ya={key:1},Ga={class:"bg-success/5 border border-success/20 px-2 py-1.5 rounded font-mono leading-relaxed"},Ja={key:0,class:"bg-success/20 text-success font-semibold px-0.5 rounded"},Xa={key:1},Za=["onClick","disabled"],en={class:"flex justify-between items-center"},tn={class:"text-base-content/70"},sn={class:"form-control"},an={class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},nn={class:"card-body"},on={class:"flex items-center gap-2"},ln={class:"card-title text-lg"},rn={key:0,class:"badge badge-info badge-sm"},dn={key:1,class:"badge badge-warning badge-sm"},un={class:"text-sm text-base-content/70"},cn={key:1,class:"card-actions justify-end mt-4"},vn=["onClick"],pn={key:1},gn={class:"flex justify-between items-center mb-4"},mn={class:"text-base-content/70"},fn={class:"flex items-center space-x-2"},bn=["disabled"],yn={key:0,class:"loading loading-spinner loading-xs"},_n={key:0,class:"text-center py-8"},xn={key:1,class:"alert alert-error"},hn={key:2,class:"text-center py-8"},kn={key:3,class:"mockup-code max-h-96 overflow-y-auto"},wn={key:2},Sn={class:"space-y-6"},Cn={class:"card bg-base-100 shadow-sm"},$n={class:"card-body py-4"},Tn={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},An={class:"font-medium"},Mn={class:"bg-base-200 px-1.5 py-0.5 rounded text-xs"},Dn={class:"flex items-center gap-2"},jn=["checked","disabled"],Fn={class:"text-base-content/70"},Nn={key:0,class:"card bg-base-100 shadow-sm"},Ln={class:"card-body py-4"},Bn={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},Rn={class:"bg-base-200 px-1.5 py-0.5 rounded text-xs break-all"},En={key:1,class:"card bg-base-100 shadow-sm"},zn={class:"card-body py-4"},Pn={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},On={class:"bg-base-200 px-1.5 py-0.5 rounded text-xs"},qn={class:"bg-base-200 px-1.5 py-0.5 rounded text-xs break-all"},Vn={class:"bg-base-200 px-1.5 py-0.5 rounded text-xs break-all"},Hn={key:2,class:"card bg-base-100 shadow-sm"},Un={class:"card-body py-4"},In={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},Wn={class:"font-mono text-xs"},Qn={class:"text-base-content/60"},Kn={key:3,class:"card bg-base-100 shadow-sm"},Yn={class:"card-body py-4"},Gn={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},Jn={key:0,class:"bg-base-200 px-1.5 py-0.5 rounded text-xs break-all"},Xn={key:1,class:"text-base-content/40 text-xs italic"},Zn={key:2,class:"text-base-content/40 text-xs"},eo={key:0,class:"badge badge-outline badge-sm"},to={key:1,class:"text-base-content/40 text-xs italic"},so={key:2,class:"text-base-content/40 text-xs"},ao={key:0,class:"bg-base-200 px-1.5 py-0.5 rounded text-xs break-all"},no={key:1,class:"text-base-content/40 text-xs italic"},oo={key:2,class:"text-base-content/40 text-xs"},lo={key:0,class:"bg-base-200 px-1.5 py-0.5 rounded text-xs"},ro={key:1,class:"text-base-content/40 text-xs italic"},io={key:2,class:"text-base-content/40 text-xs"},uo={class:"badge badge-ghost badge-sm"},co={class:"card bg-base-100 shadow-sm"},vo={class:"card-body py-4"},po={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},go={class:"text-error/80 break-words whitespace-pre-wrap"},mo={key:4,class:"card bg-base-100 shadow-sm"},fo={class:"card-body py-4"},bo={class:"grid grid-cols-[max-content_1fr] gap-x-6 gap-y-2 mt-2 text-sm"},yo={class:"badge badge-ghost badge-sm"},_o={class:"text-base-content/70 break-words whitespace-pre-wrap"},xo={class:"badge badge-info badge-outline badge-sm"},ho={key:3},ko={class:"space-y-6"},wo={class:"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-4"},So=["data-tip"],Co=["disabled"],$o={key:0,class:"loading loading-spinner loading-xs"},To={key:1,class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Ao={key:1,class:"flex items-center gap-3"},Mo={class:"text-right"},Do={key:2,class:"flex items-center gap-2"},jo={key:0,class:"text-sm text-warning font-medium"},Fo={key:1,class:"text-sm text-error font-medium"},No={key:0,class:"space-y-3"},Lo={class:"flex items-center justify-between text-sm"},Bo={class:"font-medium"},Ro={class:"text-base-content/60"},Eo=["value","max"],zo={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2"},Po={key:0,class:"loading loading-spinner loading-xs text-primary"},Oo={key:1,class:"text-success"},qo={key:2,class:"text-error"},Vo={key:3,class:"text-base-content/30"},Ho={class:"text-sm truncate flex-1"},Uo={key:4,class:"badge badge-xs badge-error"},Io={key:1,class:"mt-2"},Wo={key:0,class:"flex items-start gap-3 p-4 rounded-lg bg-base-200/60 border border-base-300"},Qo={class:"min-w-0 flex-1"},Ko={class:"text-sm text-base-content/70"},Yo={class:"bg-base-300 px-1 rounded text-xs"},Go={key:0},Jo={class:"text-sm text-base-content/60"},Xo={key:0},Zo={key:1,class:"flex items-start gap-3 p-4 rounded-lg bg-base-200/60 border border-base-300"},el={class:"min-w-0 flex-1"},tl={class:"text-sm text-base-content/70"},sl={key:0},al={class:"bg-base-300 px-1 rounded text-xs"},nl={class:"text-sm text-base-content/70"},ol={class:"bg-base-300 px-1 rounded text-xs"},ll={key:0},rl={class:"text-sm text-base-content/60"},il={key:0},dl={key:2,class:"flex items-start gap-3 p-4 rounded-lg bg-base-200/60 border border-base-300"},ul={class:"min-w-0 flex-1"},cl={class:"font-semibold text-sm"},vl={class:"text-sm text-base-content/70"},pl={key:0,class:"text-sm text-base-content/70"},gl={class:"bg-base-300 px-1 rounded text-xs"},ml={key:1,class:"text-sm text-base-content/60"},fl={key:3,class:"alert alert-error"},bl={key:2,class:"alert alert-error"},yl={key:3,class:"text-center py-8"},_l={key:4,class:"text-center py-12"},xl={class:"flex items-center gap-6 mb-4"},hl={class:"text-center"},kl={class:"flex gap-4 text-sm"},wl={key:0,class:"text-error font-semibold"},Sl={key:1,class:"text-warning font-semibold"},Cl={key:2,class:"text-info"},$l={key:3,class:"text-success font-semibold"},Tl={class:"text-sm text-base-content/60 mb-4"},Al={key:0},Ml={class:"bg-base-200 px-1 rounded text-xs"},Dl={key:1,class:"ml-4"},jl={key:2,class:"ml-4 badge badge-sm badge-info"},Fl={key:3,class:"ml-4 badge badge-sm badge-success"},Nl={class:"flex gap-3"},Ll={key:4,class:"modal modal-open"},Bl={class:"modal-box max-w-4xl"},Rl={class:"font-bold text-lg mb-4"},El={class:"mockup-code"},zl={class:"modal-action"},Ol=we({__name:"ServerDetail",props:{serverName:{}},setup(J){const k=J,O=$t(),_=kt(),u=We(),N=b(!0),z=b(null),a=b(null),M=b("tools"),m=b(!1),R=b([]),X=b(!1),W=b(null),U=b(""),c=b(null),x=b([]),v=b(!1),P=A(()=>x.value.filter(s=>s.status==="pending"||s.status==="changed")),F=b(!0),{hasEnabledScanners:Q}=wt(),f=b(null),Y=b(null),j=b(!1),ue=b(!1),q=b(null),V=b(null),ce=b({});let ae=null;const Qe=b([]);b(!1);const Ke=b(!1);b(1),b({total:0,has_more:!1,suspicious_count:0,offset:0});const h=A(()=>{var s;return((s=Y.value)==null?void 0:s.scan_context)||null}),Z=A(()=>{var e;const s=((e=h.value)==null?void 0:e.source_method)||"";return s==="url"||s==="url_full"}),ve=b([]),ee=b(!1),te=b(null),ne=b(100),Ye=A(()=>{var s,e;return((s=a.value)==null?void 0:s.protocol)==="http"||((e=a.value)==null?void 0:e.protocol)==="streamable-http"}),Ge=A(()=>{var s,e;return((e=(s=a.value)==null?void 0:s.health)==null?void 0:e.action)||""}),Je=A(()=>{var e;const s=(e=a.value)==null?void 0:e.diagnostic;return!s||!s.code?!1:s.severity==="warn"||s.severity==="error"});function Xe(s){_.fetchServers(!0)}const pe=A(()=>{var s,e;return j.value?"scanning":((e=(s=a.value)==null?void 0:s.security_scan)==null?void 0:e.status)||"not_scanned"});function Ze(s){return ce.value[s]||s}const H=A(()=>{var p;if(!((p=Y.value)!=null&&p.scanner_statuses))return null;const s=Y.value.scanner_statuses,e=s.length,i=s.filter(g=>g.status==="completed"||g.status==="failed").length;return{total:e,completed:i,scanners:s}}),et=A(()=>{switch(pe.value){case"clean":return"bg-success";case"warnings":return"bg-warning";case"dangerous":return"bg-error";case"failed":return"bg-error";case"scanning":return"";default:return"bg-base-content/30"}}),tt=A(()=>{var e;const s=(e=a.value)==null?void 0:e.security_scan;return s!=null&&s.last_scan_at?` (${mt(s.last_scan_at)})`:""}),oe=A(()=>{var s,e;return f.value?f.value.risk_score:((e=(s=a.value)==null?void 0:s.security_scan)==null?void 0:e.risk_score)??0}),Se=A(()=>{const s=oe.value;return s>=70?"text-error":s>=30?"text-warning":"text-success"}),st=A(()=>{if(!U.value)return R.value;const s=U.value.toLowerCase();return R.value.filter(e=>{var i;return e.name.toLowerCase().includes(s)||((i=e.description)==null?void 0:i.toLowerCase().includes(s))})});function Ce(s){const e=x.value.find(i=>i.tool_name===s);return e?e.status:null}function $e(s,e){const i=s.length,p=e.length;if(i===0&&p===0)return[];if(i===0)return e.map(T=>({type:"added",text:T}));if(p===0)return s.map(T=>({type:"removed",text:T}));const g=Array.from({length:i+1},()=>Array(p+1).fill(0));for(let T=1;T<=i;T++)for(let E=1;E<=p;E++)s[T-1]===e[E-1]?g[T][E]=g[T-1][E-1]+1:g[T][E]=Math.max(g[T-1][E],g[T][E-1]);const S=[];let C=i,D=p;for(;C>0||D>0;)C>0&&D>0&&s[C-1]===e[D-1]?(S.push({type:"same",text:s[C-1]}),C--,D--):D>0&&(C===0||g[C][D-1]>=g[C-1][D])?(S.push({type:"added",text:e[D-1]}),D--):(S.push({type:"removed",text:s[C-1]}),C--);return S.reverse()}function at(s,e,i=1500){return s.length>i||e.length>i?[{type:"removed",text:s},{type:"added",text:e}]:$e(Array.from(s),Array.from(e))}function Te(s){const e=[];for(const i of s){const p=e[e.length-1];p&&p.type===i.type?p.text+=i.text:e.push({...i})}return e}function Ae(s,e){const i=s.split(/(\s+)/).filter(C=>C.length>0),p=e.split(/(\s+)/).filter(C=>C.length>0),g=Te($e(i,p)),S=[];for(let C=0;Cs.name===k.serverName)||null,!a.value){z.value=`Server "${k.serverName}" not found`;return}await Promise.all([Me(),ge(),re()])}catch(s){z.value=s instanceof Error?s.message:"Failed to load server details"}finally{N.value=!1}}async function Me(){if(a.value){X.value=!0,W.value=null;try{const s=await B.getServerTools(a.value.name);s.success&&s.data?R.value=s.data.tools||[]:W.value=s.error||"Failed to load tools"}catch(s){W.value=s instanceof Error?s.message:"Failed to load tools"}finally{X.value=!1}}}async function ge(){if(a.value)try{const s=await B.getToolApprovals(a.value.name);if(s.success&&s.data){const e=s.data.tools||[],i=e.filter(p=>p.status==="changed");if(i.length>0){const p=i.map(async g=>{try{const S=await B.getToolDiff(a.value.name,g.tool_name);S.success&&S.data&&(g.previous_description=S.data.previous_description,g.current_description=S.data.current_description)}catch{}});await Promise.all(p)}x.value=e}}catch{}}async function nt(s){if(a.value){v.value=!0;try{const e=await B.approveTools(a.value.name,[s]);e.success?(u.addToast({type:"success",title:"Tool Approved",message:`${s} has been approved`}),await ge(),await _.fetchServers(),a.value=_.servers.find(i=>i.name===k.serverName)||null):u.addToast({type:"error",title:"Approval Failed",message:e.error||"Failed to approve tool"})}catch(e){u.addToast({type:"error",title:"Approval Failed",message:e instanceof Error?e.message:"Failed to approve tool"})}finally{v.value=!1}}}async function ot(){if(a.value){v.value=!0;try{const s=await B.approveTools(a.value.name);s.success?(u.addToast({type:"success",title:"Tools Approved",message:`All tools for ${a.value.name} have been approved`}),await ge(),await _.fetchServers(),a.value=_.servers.find(e=>e.name===k.serverName)||null):u.addToast({type:"error",title:"Approval Failed",message:s.error||"Failed to approve tools"})}catch(s){u.addToast({type:"error",title:"Approval Failed",message:s instanceof Error?s.message:"Failed to approve tools"})}finally{v.value=!1}}}async function re(){if(a.value){ee.value=!0,te.value=null;try{const s=await B.getServerLogs(a.value.name,ne.value);s.success&&s.data?ve.value=s.data.logs||[]:te.value=s.error||"Failed to load logs"}catch(s){te.value=s instanceof Error?s.message:"Failed to load logs"}finally{ee.value=!1}}}async function De(){if(a.value){m.value=!0;try{a.value.enabled?(await _.disableServer(a.value.name),u.addToast({type:"success",title:"Server Disabled",message:`${a.value.name} has been disabled`})):(await _.enableServer(a.value.name),u.addToast({type:"success",title:"Server Enabled",message:`${a.value.name} has been enabled`})),await _.fetchServers(),a.value=_.servers.find(s=>s.name===k.serverName)||null}catch(s){u.addToast({type:"error",title:"Operation Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{m.value=!1}}}async function lt(){if(a.value){m.value=!0;try{await _.restartServer(a.value.name),u.addToast({type:"success",title:"Server Restarted",message:`${a.value.name} is restarting`}),setTimeout(async()=>{await _.fetchServers(),a.value=_.servers.find(s=>s.name===k.serverName)||null},2e3)}catch(s){u.addToast({type:"error",title:"Restart Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{m.value=!1}}}async function rt(){if(a.value){m.value=!0;try{await _.triggerOAuthLogin(a.value.name),u.addToast({type:"success",title:"OAuth Login Triggered",message:`Check your browser for ${a.value.name} login`})}catch(s){u.addToast({type:"error",title:"OAuth Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{m.value=!1}}}async function it(){if(a.value){m.value=!0;try{await _.quarantineServer(a.value.name),u.addToast({type:"success",title:"Server Quarantined",message:`${a.value.name} has been quarantined`}),await _.fetchServers(),a.value=_.servers.find(s=>s.name===k.serverName)||null}catch(s){u.addToast({type:"error",title:"Quarantine Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{m.value=!1}}}const G=b(!1),se=b("no_scan"),me=A(()=>{var i,p,g;const s=f.value;if(((i=s==null?void 0:s.summary)==null?void 0:i.critical)!=null)return s.summary.critical;const e=(p=a.value)==null?void 0:p.security_scan;return((g=e==null?void 0:e.finding_counts)==null?void 0:g.critical)!=null?e.finding_counts.critical:0}),dt=A(()=>{var s,e;return f.value?!0:!!((e=(s=a.value)==null?void 0:s.security_scan)!=null&&e.last_scan_at)});function je(){if(a.value){if(!dt.value){se.value="no_scan",G.value=!0;return}if(me.value>0){se.value="critical",G.value=!0;return}Fe(!1)}}async function Fe(s){if(a.value){m.value=!0;try{await _.securityApproveServer(a.value.name,s),u.addToast({type:"success",title:"Server Approved",message:`${a.value.name} has been approved and unquarantined`}),G.value=!1,await _.fetchServers(),a.value=_.servers.find(e=>e.name===k.serverName)||null}catch(e){u.addToast({type:"error",title:"Approve Failed",message:e instanceof Error?e.message:"Unknown error"})}finally{m.value=!1}}}function ut(){Fe(!0)}async function ct(){G.value=!1,M.value="security",await be()}async function vt(){await le()}async function pt(){if(a.value){m.value=!0;try{const s=await B.discoverServerTools(a.value.name);if(!s.success)throw new Error(s.error||"Failed to discover tools");u.addToast({type:"success",title:"Tool Discovery Started",message:`Discovering tools for ${a.value.name}...`}),setTimeout(async()=>{var e;await le(),u.addToast({type:"info",title:"Tools Updated",message:`Tool cache refreshed for ${(e=a.value)==null?void 0:e.name}`})},2e3)}catch(s){u.addToast({type:"error",title:"Tool Discovery Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{m.value=!1}}}function gt(s){c.value=s}function Ne(s){return!s||s===0?"0 B":s<1024?`${s} B`:s<1024*1024?`${(s/1024).toFixed(1)} KB`:`${(s/(1024*1024)).toFixed(1)} MB`}function mt(s){const e=new Date(s),p=new Date().getTime()-e.getTime(),g=Math.floor(p/6e4);if(g<1)return"just now";if(g<60)return`${g}m ago`;const S=Math.floor(g/60);return S<24?`${S}h ago`:`${Math.floor(S/24)}d ago`}function ft(s){return s?s.length<=4?"β€’β€’β€’β€’":"β€’β€’β€’β€’"+s.slice(-2)+` (${s.length} chars)`:"(empty)"}const bt=A(()=>{if(!a.value)return!1;const s=a.value.isolation,e=a.value.isolation_defaults;return!!(s&&(s.image||s.network_mode||s.extra_args&&s.extra_args.length||s.working_dir||s.memory_limit||s.cpu_limit)||e&&(e.image||e.network_mode||e.extra_args&&e.extra_args.length||e.working_dir||e.runtime_type))});function yt(s){if(!s)return"";const e=new Date(s);return isNaN(e.getTime())?s:e.toLocaleString()}function _t(s){switch(s){case"healthy":return"badge badge-success badge-sm";case"degraded":return"badge badge-warning badge-sm";case"unhealthy":return"badge badge-error badge-sm";default:return"badge badge-ghost badge-sm"}}function K(){ae&&(clearInterval(ae),ae=null)}async function Le(){if(!(Object.keys(ce.value).length>0))try{const s=await B.listScanners();if(s.success&&s.data){const e={};for(const i of s.data)i.id&&i.name&&(e[i.id]=i.name);ce.value=e}}catch{}}async function ie(s=!1){var e;if(a.value&&!(!s&&!((e=a.value.security_scan)!=null&&e.last_scan_at)&&!f.value)){ue.value=!0,q.value=null;try{B.getSecurityOverview().then(g=>{g.success&&g.data&&(F.value=g.data.docker_available!==!1)});const[i,p]=await Promise.all([B.getScanReport(a.value.name),B.getScanStatus(a.value.name)]);i.success&&i.data&&(f.value=i.data),p.success&&p.data&&(Y.value=p.data,(p.data.status==="running"||p.data.status==="pending")&&(V.value=p.data.id,j.value=!0,fe()))}catch{}finally{ue.value=!1}}}function fe(){K(),ae=setInterval(async()=>{var s,e;if(!a.value){K();return}try{const i=await B.getScanStatus(a.value.name);if(i.success&&i.data){Y.value=i.data;const p=i.data.id,g=i.data.status;if(V.value&&p!==V.value){i.data.scan_pass===2&&(K(),j.value=!1,V.value=null,await ie(!0),await _.fetchServers(),a.value=_.servers.find(S=>S.name===k.serverName)||null,u.addToast({type:"success",title:"Scan Complete",message:`Security scan for ${(s=a.value)==null?void 0:s.name} finished.`}));return}g==="completed"||g==="complete"?(K(),j.value=!1,V.value=null,await ie(!0),await _.fetchServers(),a.value=_.servers.find(S=>S.name===k.serverName)||null,u.addToast({type:"success",title:"Scan Complete",message:`Security scan for ${(e=a.value)==null?void 0:e.name} finished.`})):(g==="failed"||g==="error")&&(K(),j.value=!1,V.value=null,q.value=i.data.error||"Scan failed")}}catch{}},2e3)}async function be(){var s;if(!(!a.value||j.value)){j.value=!0,q.value=null,f.value=null,Y.value=null,Qe.value=[],Ke.value=!1;try{const e=await B.startScan(a.value.name);if(!e.success){const i=e.error||"";if(i.includes("already in progress")){const p=i.match(/\(job ([\w-]+)\)/);V.value=p?p[1]:null,u.addToast({type:"info",title:"Scan In Progress",message:"A scan is already running for this server."}),fe();return}throw new Error(i||"Failed to start scan")}(s=e.data)!=null&&s.id&&(V.value=e.data.id),u.addToast({type:"info",title:"Security Scan Started",message:`Scanning ${a.value.name} for security issues...`}),fe()}catch(e){j.value=!1,q.value=e instanceof Error?e.message:"Failed to start scan"}}}async function xt(){var s,e;if(a.value)try{await B.cancelScan(a.value.name),K(),j.value=!1,q.value=null,V.value=null}catch(i){q.value=((e=(s=i.response)==null?void 0:s.data)==null?void 0:e.error)||"Failed to cancel scan"}}const ht=A(()=>[{icon:"πŸ”§",title:"Server Management",description:"Control and monitor this MCP server",sections:[{title:"Enable/Disable server",codeBlock:{language:"bash",code:`# Disable server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"update","name":"${k.serverName}","enabled":false}' - -# Enable server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"update","name":"${k.serverName}","enabled":true}'`}},{title:"View server logs",codeBlock:{language:"bash",code:`# Real-time logs for this server -tail -f ~/.mcpproxy/logs/server-${k.serverName}.log`}}]},{icon:"πŸ› οΈ",title:"Working with Tools",description:"Use tools provided by this server",sections:[{title:"List all tools",codeBlock:{language:"bash",code:`# List tools from this server -mcpproxy tools list --server=${k.serverName}`}},{title:"Call a tool",text:"Tools are prefixed with server name:",codeBlock:{language:"bash",code:`# Call tool from this server -mcpproxy call tool --tool-name=${k.serverName}:tool-name \\ - --json_args='{"arg1":"value1"}'`}}]},{icon:"πŸ’‘",title:"Troubleshooting",description:"Common issues and solutions",sections:[{title:"Connection issues",list:["Check if server is enabled in configuration","Review server logs for error messages","Verify network connectivity for remote servers","Check authentication credentials for OAuth servers"]},{title:"OAuth authentication",text:"If server requires OAuth login:",codeBlock:{language:"bash",code:`# Trigger OAuth login -mcpproxy auth login --server=${k.serverName}`}}]}]);return St(ne,()=>{re()}),Ct(()=>{const s=O.query.tab;s&&["tools","logs","config","security"].includes(s)&&(M.value=s),le().then(()=>{M.value==="security"&&(Le(),ie())})}),Tt(()=>{K()}),(s,e)=>{var p,g,S,C,D,T,E,de,Be,Re,Ee,ze,Pe,Oe,qe,Ve,He,Ue;const i=At("router-link");return n(),o("div",ys,[N.value?(n(),o("div",_s,[...e[10]||(e[10]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1),t("p",{class:"mt-4"},"Loading server details...",-1)])])):z.value?(n(),o("div",xs,[e[12]||(e[12]=t("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("div",null,[e[11]||(e[11]=t("h3",{class:"font-bold"},"Failed to load server details",-1)),t("div",hs,l(z.value),1)]),t("button",{onClick:le,class:"btn btn-sm"}," Try Again ")])):a.value?(n(),o("div",Ss,[t("div",Cs,[t("div",null,[t("div",$s,[t("ul",null,[t("li",null,[_e(i,{to:"/servers"},{default:xe(()=>[...e[16]||(e[16]=[y("Servers",-1)])]),_:1})]),t("li",null,l(a.value.name),1)])]),t("h1",Ts,l(a.value.name),1),t("p",As,l(a.value.protocol)+" β€’ "+l(a.value.url||a.value.command||"No endpoint"),1)]),t("div",Ms,[t("div",{class:$(["badge badge-lg",a.value.connected?"badge-success":a.value.connecting?"badge-warning":"badge-error"])},l(a.value.connected?"Connected":a.value.connecting?"Connecting":"Disconnected"),3),t("div",Ds,[e[20]||(e[20]=t("div",{tabindex:"0",role:"button",class:"btn btn-outline"},[y(" Actions "),t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"})])],-1)),t("ul",js,[t("li",null,[t("button",{onClick:De,disabled:m.value},[m.value?(n(),o("span",Ns)):r("",!0),y(" "+l(a.value.enabled?"Disable":"Enable"),1)],8,Fs)]),a.value.enabled?(n(),o("li",Ls,[t("button",{onClick:lt,disabled:m.value},[m.value?(n(),o("span",Rs)):r("",!0),y(" "+l(Ye.value?"Reconnect":"Restart"),1)],8,Bs)])):r("",!0),Ge.value==="login"?(n(),o("li",Es,[t("button",{onClick:rt,disabled:m.value},[m.value?(n(),o("span",Ps)):r("",!0),e[17]||(e[17]=y(" Login ",-1))],8,zs)])):r("",!0),a.value.enabled&&a.value.connected?(n(),o("li",Os,[t("button",{onClick:pt,disabled:m.value},[m.value?(n(),o("span",Vs)):r("",!0),e[18]||(e[18]=y(" Discover Tools ",-1))],8,qs)])):r("",!0),t("li",null,[t("button",{onClick:e[0]||(e[0]=d=>a.value.quarantined?je():it()),disabled:m.value},[m.value?(n(),o("span",Us)):r("",!0),y(" "+l(a.value.quarantined?"Approve":"Quarantine"),1)],8,Hs)]),t("li",null,[t("button",{onClick:vt,disabled:m.value},[m.value?(n(),o("span",Ws)):r("",!0),e[19]||(e[19]=y(" Refresh ",-1))],8,Is)])])])])]),t("div",Qs,[t("div",Ks,[t("div",Ys,[e[21]||(e[21]=t("div",{class:"stat-figure text-primary"},[t("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"})])],-1)),e[22]||(e[22]=t("div",{class:"stat-title"},"Tools",-1)),t("div",Gs,l(R.value.length),1),e[23]||(e[23]=t("div",{class:"stat-desc"},"available tools",-1))])]),t("div",Js,[t("div",Xs,[e[24]||(e[24]=t("div",{class:"stat-figure text-secondary"},[t("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1)),e[25]||(e[25]=t("div",{class:"stat-title"},"Status",-1)),t("div",Zs,l(a.value.enabled?"Enabled":"Disabled"),1),t("div",ea,l(a.value.quarantined?"Quarantined":"Active"),1)])]),t("div",ta,[t("div",sa,[e[26]||(e[26]=t("div",{class:"stat-figure text-info"},[t("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})])],-1)),e[27]||(e[27]=t("div",{class:"stat-title"},"Protocol",-1)),t("div",aa,l(a.value.protocol),1),e[28]||(e[28]=t("div",{class:"stat-desc"},"communication type",-1))])]),t("div",na,[t("div",oa,[e[29]||(e[29]=t("div",{class:"stat-figure text-warning"},[t("svg",{class:"w-8 h-8",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1)),e[30]||(e[30]=t("div",{class:"stat-title"},"Connection",-1)),t("div",la,l(a.value.connected?"Online":a.value.connecting?"Connecting":"Offline"),1),e[31]||(e[31]=t("div",{class:"stat-desc"},"current state",-1))])])]),t("div",ra,[Je.value?(n(),he(bs,{key:0,diagnostic:a.value.diagnostic,"server-name":a.value.name,onFixed:Xe},null,8,["diagnostic","server-name"])):a.value.last_error?(n(),o("div",ia,[e[33]||(e[33]=t("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("div",null,[e[32]||(e[32]=t("h3",{class:"font-bold"},"Server Error",-1)),t("div",da,l(a.value.last_error),1)])])):r("",!0),a.value.quarantined?(n(),o("div",ua,[e[35]||(e[35]=t("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})],-1)),e[36]||(e[36]=t("div",null,[t("h3",{class:"font-bold"},"Security Quarantine"),t("div",{class:"text-sm"},"This server is quarantined and requires manual approval before tools can be executed.")],-1)),t("button",{onClick:je,disabled:m.value,class:"btn btn-sm btn-warning"},[m.value?(n(),o("span",va)):r("",!0),e[34]||(e[34]=y(" Approve ",-1))],8,ca)])):r("",!0)]),G.value?(n(),o("div",pa,[t("div",ga,[t("h3",ma,l(se.value==="no_scan"?"No Security Scan Run":"Critical Findings Detected"),1),se.value==="critical"?(n(),o("p",fa,[t("strong",null,l(a.value.name),1),e[37]||(e[37]=y(" has ",-1)),t("span",ba,l(me.value)+" critical finding"+l(me.value===1?"":"s"),1),e[38]||(e[38]=y(" in its most recent security scan. Approving will allow this server to run despite these warnings. ",-1))])):(n(),o("p",ya,[e[39]||(e[39]=y(" No security scan has been run for ",-1)),t("strong",null,l(a.value.name),1),e[40]||(e[40]=y(". We strongly recommend running a scan first. ",-1))])),e[42]||(e[42]=t("p",{class:"text-sm text-base-content/70 mb-6"}," The security scanner is an experimental heuristic. Force-approving bypasses the scanner gate. ",-1)),t("div",_a,[t("button",{onClick:e[1]||(e[1]=d=>G.value=!1),disabled:m.value,class:"btn btn-outline"}," Cancel ",8,xa),se.value==="no_scan"?(n(),o("button",{key:0,onClick:ct,disabled:m.value,class:"btn btn-primary"}," Scan First ",8,ha)):r("",!0),t("button",{onClick:ut,disabled:m.value,class:"btn btn-error"},[m.value?(n(),o("span",wa)):r("",!0),e[41]||(e[41]=y(" Force Approve ",-1))],8,ka)])])])):r("",!0),t("div",Sa,[t("button",{class:$(["tab tab-lg",M.value==="tools"?"tab-active":""]),onClick:e[2]||(e[2]=d=>M.value="tools")}," Tools ("+l(R.value.length)+") ",3),t("button",{class:$(["tab tab-lg",M.value==="logs"?"tab-active":""]),onClick:e[3]||(e[3]=d=>M.value="logs")}," Logs ",2),t("button",{class:$(["tab tab-lg",M.value==="config"?"tab-active":""]),onClick:e[4]||(e[4]=d=>M.value="config")}," Configuration ",2),ke(Q)()?(n(),o("button",{key:0,class:$(["tab tab-lg",M.value==="security"?"tab-active":""]),onClick:e[5]||(e[5]=d=>{M.value="security",Le(),ie()})},[t("span",Ca,[pe.value==="scanning"?(n(),o("span",$a)):(n(),o("span",{key:1,class:$(["inline-block w-2.5 h-2.5 rounded-full",et.value])},null,2)),y(" Security"+l(tt.value),1)])],2)):r("",!0)]),t("div",Ta,[M.value==="tools"?(n(),o("div",Aa,[X.value?(n(),o("div",Ma,[...e[43]||(e[43]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1),t("p",{class:"mt-2"},"Loading tools...",-1)])])):W.value?(n(),o("div",Da,[e[44]||(e[44]=t("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,l(W.value),1),t("button",{onClick:Me,class:"btn btn-sm"},"Retry")])):R.value.length===0?(n(),o("div",ja,[e[45]||(e[45]=t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"})],-1)),e[46]||(e[46]=t("h3",{class:"text-xl font-semibold mb-2"},"No tools available",-1)),t("p",Fa,l(a.value.connected?"This server has no tools available.":"Server must be connected to view tools."),1)])):(n(),o("div",Na,[P.value.length>0?(n(),o("div",La,[e[49]||(e[49]=t("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),t("div",Ba,[e[47]||(e[47]=t("h3",{class:"font-bold"},"Tool Quarantine",-1)),t("div",Ra,l(P.value.length)+" tool(s) require approval before they can be used by AI agents. ",1)]),t("button",{onClick:ot,disabled:v.value,class:"btn btn-sm btn-warning"},[v.value?(n(),o("span",za)):r("",!0),e[48]||(e[48]=y(" Approve All ",-1))],8,Ea)])):r("",!0),P.value.length>0?(n(),o("div",Pa,[(n(!0),o(w,null,I(P.value,d=>(n(),o("div",{key:"q-"+d.tool_name,class:$(["card bg-base-200 border-l-4",d.status==="changed"?"border-error":"border-warning"])},[t("div",Oa,[t("div",qa,[t("div",Va,[t("div",Ha,[t("h4",Ua,l(d.tool_name),1),t("span",{class:$(["badge badge-sm",d.status==="changed"?"badge-error":"badge-warning"])},l(d.status),3)]),d.status!=="changed"||!d.previous_description?(n(),o("p",Ia,l(d.description),1)):r("",!0),d.status==="changed"&&d.previous_description?(n(),o("div",Wa,[t("div",null,[e[50]||(e[50]=t("div",{class:"text-[10px] font-semibold uppercase tracking-wide text-base-content/60 mb-1"},"Before (approved)",-1)),t("div",Qa,[(n(!0),o(w,null,I(Ae(d.previous_description,d.current_description||d.description),(L,ye)=>(n(),o(w,{key:"b"+ye},[L.type==="removed"?(n(),o("span",Ka,l(L.text),1)):L.type==="same"?(n(),o("span",Ya,l(L.text),1)):r("",!0)],64))),128))])]),t("div",null,[e[51]||(e[51]=t("div",{class:"text-[10px] font-semibold uppercase tracking-wide text-base-content/60 mb-1"},"After (current)",-1)),t("div",Ga,[(n(!0),o(w,null,I(Ae(d.previous_description,d.current_description||d.description),(L,ye)=>(n(),o(w,{key:"a"+ye},[L.type==="added"?(n(),o("span",Ja,l(L.text),1)):L.type==="same"?(n(),o("span",Xa,l(L.text),1)):r("",!0)],64))),128))])])])):r("",!0)]),t("button",{onClick:L=>nt(d.tool_name),disabled:v.value,class:"btn btn-sm btn-outline ml-4"}," Approve ",8,Za)])])],2))),128))])):r("",!0),t("div",en,[t("div",null,[e[52]||(e[52]=t("h3",{class:"text-lg font-semibold"},"Available Tools",-1)),t("p",tn,"Tools provided by "+l(a.value.name),1)]),t("div",sn,[Ie(t("input",{"onUpdate:modelValue":e[6]||(e[6]=d=>U.value=d),type:"text",placeholder:"Search tools...",class:"input input-bordered input-sm w-64"},null,512),[[Mt,U.value]])])]),t("div",an,[(n(!0),o(w,null,I(st.value,d=>(n(),o("div",{key:d.name,class:"card bg-base-100 shadow-md"},[t("div",nn,[t("div",on,[t("h4",ln,l(d.name),1),Ce(d.name)==="pending"?(n(),o("span",rn,"new")):Ce(d.name)==="changed"?(n(),o("span",dn,"changed")):r("",!0)]),t("p",un,l(d.description||"No description available"),1),d.annotations?(n(),he(Wt,{key:0,annotations:d.annotations,class:"mt-2"},null,8,["annotations"])):r("",!0),d.input_schema?(n(),o("div",cn,[t("button",{class:"btn btn-sm btn-outline",onClick:L=>gt(d)}," View Schema ",8,vn)])):r("",!0)])]))),128))])]))])):r("",!0),M.value==="logs"?(n(),o("div",pn,[t("div",gn,[t("div",null,[e[53]||(e[53]=t("h3",{class:"text-lg font-semibold"},"Server Logs",-1)),t("p",mn,"Recent log entries for "+l(a.value.name),1)]),t("div",fn,[Ie(t("select",{"onUpdate:modelValue":e[7]||(e[7]=d=>ne.value=d),class:"select select-bordered select-sm"},[...e[54]||(e[54]=[t("option",{value:50},"Last 50 lines",-1),t("option",{value:100},"Last 100 lines",-1),t("option",{value:200},"Last 200 lines",-1),t("option",{value:500},"Last 500 lines",-1)])],512),[[Dt,ne.value]]),t("button",{onClick:re,class:"btn btn-sm btn-outline",disabled:ee.value},[ee.value?(n(),o("span",yn)):r("",!0),e[55]||(e[55]=y(" Refresh ",-1))],8,bn)])]),ee.value?(n(),o("div",_n,[...e[56]||(e[56]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1),t("p",{class:"mt-2"},"Loading logs...",-1)])])):te.value?(n(),o("div",xn,[e[57]||(e[57]=t("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,l(te.value),1),t("button",{onClick:re,class:"btn btn-sm"},"Retry")])):ve.value.length===0?(n(),o("div",hn,[...e[58]||(e[58]=[t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1),t("h3",{class:"text-xl font-semibold mb-2"},"No logs available",-1),t("p",{class:"text-base-content/70"},"No log entries found for this server.",-1)])])):(n(),o("div",kn,[(n(!0),o(w,null,I(ve.value,(d,L)=>(n(),o("pre",{key:L,class:"text-xs"},[t("code",null,l(d),1)]))),128))]))])):r("",!0),M.value==="config"?(n(),o("div",wn,[t("div",Sn,[t("div",Cn,[t("div",$n,[e[63]||(e[63]=t("h3",{class:"card-title text-base"},"General",-1)),t("dl",Tn,[e[59]||(e[59]=t("dt",{class:"text-base-content/60"},"Name",-1)),t("dd",An,l(a.value.name),1),e[60]||(e[60]=t("dt",{class:"text-base-content/60"},"Protocol",-1)),t("dd",null,[t("code",Mn,l(a.value.protocol),1)]),e[61]||(e[61]=t("dt",{class:"text-base-content/60"},"Enabled",-1)),t("dd",Dn,[t("input",{type:"checkbox",checked:a.value.enabled,onChange:De,class:"toggle toggle-sm",disabled:m.value},null,40,jn),t("span",Fn,l(a.value.enabled?"Yes":"No"),1)]),e[62]||(e[62]=t("dt",{class:"text-base-content/60"},"Quarantined",-1)),t("dd",null,[t("span",{class:$(a.value.quarantined?"badge badge-warning badge-sm":"badge badge-ghost badge-sm")},l(a.value.quarantined?"Yes":"No"),3)])])])]),a.value.url?(n(),o("div",Nn,[t("div",Ln,[e[65]||(e[65]=t("h3",{class:"card-title text-base"},"Connection",-1)),t("dl",Bn,[e[64]||(e[64]=t("dt",{class:"text-base-content/60"},"URL",-1)),t("dd",null,[t("code",Rn,l(a.value.url),1)])])])])):r("",!0),a.value.command?(n(),o("div",En,[t("div",zn,[e[69]||(e[69]=t("h3",{class:"card-title text-base"},"Process",-1)),t("dl",Pn,[e[68]||(e[68]=t("dt",{class:"text-base-content/60"},"Command",-1)),t("dd",null,[t("code",On,l(a.value.command),1)]),a.value.args&&a.value.args.length?(n(),o(w,{key:0},[e[66]||(e[66]=t("dt",{class:"text-base-content/60"},"Args",-1)),t("dd",null,[t("code",qn,l(a.value.args.join(" ")),1)])],64)):r("",!0),a.value.working_dir?(n(),o(w,{key:1},[e[67]||(e[67]=t("dt",{class:"text-base-content/60"},"Working Dir",-1)),t("dd",null,[t("code",Vn,l(a.value.working_dir),1)])],64)):r("",!0)])])])):r("",!0),a.value.env&&Object.keys(a.value.env).length?(n(),o("div",Hn,[t("div",Un,[e[70]||(e[70]=t("h3",{class:"card-title text-base"},"Environment Variables",-1)),t("dl",In,[(n(!0),o(w,null,I(a.value.env,(d,L)=>(n(),o(w,{key:L},[t("dt",null,[t("code",Wn,l(L),1)]),t("dd",Qn,l(ft(d)),1)],64))),128))])])])):r("",!0),bt.value?(n(),o("div",Kn,[t("div",Yn,[e[78]||(e[78]=t("h3",{class:"card-title text-base"},"Docker Isolation Overrides",-1)),t("dl",Gn,[e[74]||(e[74]=t("dt",{class:"text-base-content/60"},"Image",-1)),t("dd",null,[(p=a.value.isolation)!=null&&p.image?(n(),o("code",Jn,l(a.value.isolation.image),1)):(g=a.value.isolation_defaults)!=null&&g.image?(n(),o("span",Xn,"default: "+l(a.value.isolation_defaults.image),1)):(n(),o("span",Zn,"β€”"))]),e[75]||(e[75]=t("dt",{class:"text-base-content/60"},"Network Mode",-1)),t("dd",null,[(S=a.value.isolation)!=null&&S.network_mode?(n(),o("span",eo,l(a.value.isolation.network_mode),1)):(C=a.value.isolation_defaults)!=null&&C.network_mode?(n(),o("span",to,"default: "+l(a.value.isolation_defaults.network_mode),1)):(n(),o("span",so,"β€”"))]),e[76]||(e[76]=t("dt",{class:"text-base-content/60"},"Extra Args",-1)),t("dd",null,[(D=a.value.isolation)!=null&&D.extra_args&&a.value.isolation.extra_args.length?(n(),o("code",ao,l(a.value.isolation.extra_args.join(" ")),1)):(T=a.value.isolation_defaults)!=null&&T.extra_args&&a.value.isolation_defaults.extra_args.length?(n(),o("span",no,"default: "+l(a.value.isolation_defaults.extra_args.join(" ")),1)):(n(),o("span",oo,"β€”"))]),e[77]||(e[77]=t("dt",{class:"text-base-content/60"},"Container Working Dir",-1)),t("dd",null,[(E=a.value.isolation)!=null&&E.working_dir?(n(),o("code",lo,l(a.value.isolation.working_dir),1)):(de=a.value.isolation_defaults)!=null&&de.working_dir?(n(),o("span",ro,"default: "+l(a.value.isolation_defaults.working_dir),1)):(n(),o("span",io,"β€”"))]),(Be=a.value.isolation)!=null&&Be.memory_limit?(n(),o(w,{key:0},[e[71]||(e[71]=t("dt",{class:"text-base-content/60"},"Memory Limit",-1)),t("dd",null,l(a.value.isolation.memory_limit),1)],64)):r("",!0),(Re=a.value.isolation)!=null&&Re.cpu_limit?(n(),o(w,{key:1},[e[72]||(e[72]=t("dt",{class:"text-base-content/60"},"CPU Limit",-1)),t("dd",null,l(a.value.isolation.cpu_limit),1)],64)):r("",!0),(Ee=a.value.isolation_defaults)!=null&&Ee.runtime_type?(n(),o(w,{key:2},[e[73]||(e[73]=t("dt",{class:"text-base-content/60"},"Runtime",-1)),t("dd",null,[t("span",uo,l(a.value.isolation_defaults.runtime_type),1)])],64)):r("",!0)])])])):r("",!0),t("div",co,[t("div",vo,[e[85]||(e[85]=t("h3",{class:"card-title text-base"},"Status",-1)),t("dl",po,[e[83]||(e[83]=t("dt",{class:"text-base-content/60"},"Connected",-1)),t("dd",null,[t("span",{class:$(a.value.connected?"badge badge-success badge-sm":"badge badge-ghost badge-sm")},l(a.value.connected?"Yes":"No"),3)]),a.value.connected_at?(n(),o(w,{key:0},[e[79]||(e[79]=t("dt",{class:"text-base-content/60"},"Connected At",-1)),t("dd",null,l(yt(a.value.connected_at)),1)],64)):r("",!0),(a.value.reconnect_count??0)>0?(n(),o(w,{key:1},[e[80]||(e[80]=t("dt",{class:"text-base-content/60"},"Reconnect Count",-1)),t("dd",null,l(a.value.reconnect_count),1)],64)):r("",!0),e[84]||(e[84]=t("dt",{class:"text-base-content/60"},"Tool Count",-1)),t("dd",null,l(a.value.tool_count??0),1),a.value.tool_list_token_size?(n(),o(w,{key:2},[e[81]||(e[81]=t("dt",{class:"text-base-content/60"},"Tool List Tokens",-1)),t("dd",null,l(a.value.tool_list_token_size),1)],64)):r("",!0),a.value.last_error?(n(),o(w,{key:3},[e[82]||(e[82]=t("dt",{class:"text-base-content/60"},"Last Error",-1)),t("dd",go,l(a.value.last_error),1)],64)):r("",!0)])])]),a.value.health?(n(),o("div",mo,[t("div",fo,[e[91]||(e[91]=t("h3",{class:"card-title text-base"},"Health",-1)),t("dl",bo,[e[88]||(e[88]=t("dt",{class:"text-base-content/60"},"Level",-1)),t("dd",null,[t("span",{class:$(_t(a.value.health.level))},l(a.value.health.level),3)]),e[89]||(e[89]=t("dt",{class:"text-base-content/60"},"Admin State",-1)),t("dd",null,[t("span",yo,l(a.value.health.admin_state),1)]),e[90]||(e[90]=t("dt",{class:"text-base-content/60"},"Summary",-1)),t("dd",null,l(a.value.health.summary),1),a.value.health.detail?(n(),o(w,{key:0},[e[86]||(e[86]=t("dt",{class:"text-base-content/60"},"Detail",-1)),t("dd",_o,l(a.value.health.detail),1)],64)):r("",!0),a.value.health.action?(n(),o(w,{key:1},[e[87]||(e[87]=t("dt",{class:"text-base-content/60"},"Suggested Action",-1)),t("dd",null,[t("span",xo,l(a.value.health.action),1)])],64)):r("",!0)])])])):r("",!0)])])):r("",!0),M.value==="security"?(n(),o("div",ho,[t("div",ko,[t("div",wo,[t("div",{class:"tooltip tooltip-bottom","data-tip":F.value?ke(Q)()?"":"No scanners enabled β€” install one from Security Scanners":"Docker is required to run security scanners"},[ke(Q)()?(n(),o("button",{key:0,onClick:be,disabled:j.value||!F.value,class:"btn btn-primary"},[j.value?(n(),o("span",$o)):(n(),o("svg",To,[...e[92]||(e[92]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"},null,-1)])])),y(" "+l(j.value?"Scanning...":"Scan Now"),1)],8,Co)):r("",!0)],8,So),j.value?(n(),o("button",{key:0,onClick:xt,class:"btn btn-error btn-outline btn-sm"},[...e[93]||(e[93]=[t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1),y(" Cancel ",-1)])])):r("",!0),(f.value||a.value.security_scan)&&((ze=f.value)==null?void 0:ze.scan_complete)!==!1&&!j.value?(n(),o("div",Ao,[t("div",Mo,[e[95]||(e[95]=t("div",{class:"text-sm text-base-content/70"},"Risk Score",-1)),t("div",{class:$(["text-2xl font-bold",Se.value])},[y(l(oe.value),1),e[94]||(e[94]=t("span",{class:"text-sm font-normal text-base-content/50"},"/100",-1))],2)]),t("div",{class:$(["radial-progress text-sm",Se.value]),style:jt(`--value:${oe.value}; --size:3.5rem; --thickness:4px;`),role:"progressbar"},l(oe.value),7)])):((Pe=f.value)==null?void 0:Pe.scan_complete)===!1&&!j.value?(n(),o("div",Do,[e[96]||(e[96]=t("svg",{class:"w-5 h-5 text-error",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),(Oe=f.value)!=null&&Oe.empty_scan?(n(),o("span",jo,"No Files Scanned")):(n(),o("span",Fo,"Scan Failed"))])):r("",!0)]),j.value?(n(),o("div",No,[H.value&&H.value.total>0?(n(),o(w,{key:0},[t("div",Lo,[t("span",Bo,"Scanning with "+l(H.value.total)+" scanner"+l(H.value.total!==1?"s":"")+"...",1),t("span",Ro,l(H.value.completed)+"/"+l(H.value.total)+" complete",1)]),t("progress",{class:"progress progress-primary w-full",value:H.value.completed,max:H.value.total},null,8,Eo),t("div",zo,[(n(!0),o(w,null,I(H.value.scanners,d=>(n(),o("div",{key:d.scanner_id,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-base-200"},[d.status==="running"?(n(),o("span",Po)):d.status==="completed"?(n(),o("span",Oo,"βœ“")):d.status==="failed"?(n(),o("span",qo,"βœ—")):(n(),o("span",Vo,"●")),t("span",Ho,l(Ze(d.scanner_id)),1),d.findings_count>0?(n(),o("span",Uo,l(d.findings_count),1)):r("",!0)]))),128))])],64)):(n(),o(w,{key:1},[e[97]||(e[97]=t("div",{class:"flex items-center gap-3 text-sm"},[t("span",{class:"loading loading-spinner loading-sm text-primary"}),t("span",{class:"font-medium"},"Initializing security scan...")],-1)),e[98]||(e[98]=t("progress",{class:"progress progress-primary w-full"},null,-1))],64))])):r("",!0),h.value?(n(),o("div",Io,[!h.value.docker_isolation&&!Z.value&&h.value.source_method!=="none"&&h.value.source_method!=="tool_definitions_only"?(n(),o("div",Wo,[e[102]||(e[102]=t("svg",{class:"w-5 h-5 shrink-0 mt-0.5 text-base-content/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"})],-1)),t("div",Qo,[e[100]||(e[100]=t("h3",{class:"font-semibold text-sm"},"Local Process",-1)),e[101]||(e[101]=t("p",{class:"text-sm text-base-content/70"},"Running directly on the host, without Docker isolation.",-1)),t("p",Ko,[e[99]||(e[99]=y(" Source: ",-1)),t("code",Yo,l(h.value.source_path),1),h.value.total_files?(n(),o("span",Go," ("+l(h.value.total_files)+" files, "+l(Ne(h.value.total_size_bytes))+")",1)):r("",!0)]),t("p",Jo,[y(" Protocol: "+l(h.value.server_protocol)+" ",1),h.value.server_command?(n(),o("span",Xo," β€’ Command: "+l(h.value.server_command),1)):r("",!0)])])])):h.value.docker_isolation?(n(),o("div",Zo,[e[107]||(e[107]=t("svg",{class:"w-5 h-5 shrink-0 mt-0.5 text-base-content/60",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})],-1)),t("div",el,[e[106]||(e[106]=t("h3",{class:"font-semibold text-sm"},"Docker Isolated",-1)),t("p",tl,[e[104]||(e[104]=y(" Source extracted from container",-1)),h.value.container_id?(n(),o("span",sl,[e[103]||(e[103]=y(": ",-1)),t("code",al,l(h.value.container_id.substring(0,12))+"...",1)])):r("",!0)]),t("p",nl,[e[105]||(e[105]=y(" Source: ",-1)),t("code",ol,l(h.value.source_path),1),h.value.total_files?(n(),o("span",ll," ("+l(h.value.total_files)+" files, "+l(Ne(h.value.total_size_bytes))+")",1)):r("",!0)]),t("p",rl,[y(" Protocol: "+l(h.value.server_protocol)+" ",1),h.value.server_command?(n(),o("span",il," β€’ Command: "+l(h.value.server_command),1)):r("",!0)])])])):Z.value||h.value.source_method==="tool_definitions_only"?(n(),o("div",dl,[e[109]||(e[109]=t("svg",{class:"w-5 h-5 shrink-0 mt-0.5 text-base-content/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1)),t("div",ul,[t("h3",cl,l(Z.value?"HTTP Server":"Tool Definitions Only"),1),t("p",vl,l(Z.value?"Tool description scanning only (no filesystem to scan)":"Scanning tool descriptions for poisoning and injection attacks"),1),Z.value&&h.value.source_path?(n(),o("p",pl,[e[108]||(e[108]=y(" URL: ",-1)),t("code",gl,l(h.value.source_path),1)])):r("",!0),h.value.tools_exported?(n(),o("p",ml,l(h.value.tools_exported)+" tool definitions exported for analysis ",1)):r("",!0)])])):h.value.source_method==="none"?(n(),o("div",fl,[...e[110]||(e[110]=[Ft('

No Source Available

Could not resolve source files for scanning.

Server may be disconnected or not running in Docker.

',2)])])):r("",!0)])):r("",!0),q.value?(n(),o("div",bl,[e[111]||(e[111]=t("svg",{class:"w-5 h-5 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,l(q.value),1),t("button",{onClick:e[8]||(e[8]=d=>{q.value=null,be()}),class:"btn btn-sm btn-ghost"},"Retry")])):r("",!0),ue.value&&!j.value?(n(),o("div",yl,[...e[112]||(e[112]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1),t("p",{class:"mt-2"},"Loading scan report...",-1)])])):!f.value&&!j.value&&pe.value==="not_scanned"?(n(),o("div",_l,[...e[113]||(e[113]=[t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-40",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1),t("h3",{class:"text-xl font-semibold mb-2"},"No Security Scan",-1),t("p",{class:"text-base-content/70 mb-4"},' This server has not been scanned yet. Click "Scan Now" to check for security issues. ',-1)])])):f.value&&!j.value?(n(),o(w,{key:5},[t("div",xl,[t("div",hl,[t("div",{class:$(["text-3xl font-bold",f.value.risk_score>=70?"text-error":f.value.risk_score>=40?"text-warning":"text-success"])},l(f.value.empty_scan?"N/A":f.value.risk_score+"/100"),3),e[114]||(e[114]=t("div",{class:"text-xs text-base-content/50"},"Risk Score",-1))]),t("div",kl,[(qe=f.value.summary)!=null&&qe.dangerous?(n(),o("span",wl,l(f.value.summary.dangerous)+" dangerous",1)):r("",!0),(Ve=f.value.summary)!=null&&Ve.warnings?(n(),o("span",Sl,l(f.value.summary.warnings)+" warnings",1)):r("",!0),(He=f.value.summary)!=null&&He.info_level?(n(),o("span",Cl,l(f.value.summary.info_level)+" info",1)):r("",!0),((Ue=f.value.summary)==null?void 0:Ue.total)===0?(n(),o("span",$l,"No findings")):r("",!0)])]),t("div",Tl,[f.value.job_id?(n(),o("span",Al,[e[115]||(e[115]=y("Scan ID: ",-1)),t("code",Ml,l(f.value.job_id.substring(0,8)),1)])):r("",!0),f.value.scanned_at?(n(),o("span",Dl,l(new Date(f.value.scanned_at).toLocaleString()),1)):r("",!0),f.value.pass2_running?(n(),o("span",jl,"Pass 2 running...")):f.value.pass2_complete?(n(),o("span",Fl,"Pass 2 complete")):r("",!0)]),t("div",Nl,[f.value.job_id?(n(),he(i,{key:0,to:`/security/scans/${f.value.job_id}`,class:"btn btn-primary btn-sm"},{default:xe(()=>[...e[116]||(e[116]=[y(" View Full Report β†’ ",-1)])]),_:1},8,["to"])):r("",!0)])],64)):r("",!0)])])):r("",!0)])])):(n(),o("div",ks,[e[14]||(e[14]=t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})],-1)),e[15]||(e[15]=t("h3",{class:"text-xl font-semibold mb-2"},"Server not found",-1)),t("p",ws,' The server "'+l(s.serverName)+'" was not found. ',1),_e(i,{to:"/servers",class:"btn btn-primary"},{default:xe(()=>[...e[13]||(e[13]=[y(" Back to Servers ",-1)])]),_:1})])),c.value?(n(),o("div",Ll,[t("div",Bl,[t("h3",Rl,l(c.value.name)+" - Input Schema",1),t("div",El,[t("pre",null,[t("code",null,l(JSON.stringify(c.value.input_schema,null,2)),1)])]),t("div",zl,[t("button",{class:"btn",onClick:e[9]||(e[9]=d=>c.value=null)},"Close")])])])):r("",!0),_e(Nt,{hints:ht.value},null,8,["hints"])])}}});export{Ol as default}; diff --git a/web/frontend/dist/assets/Servers-vGmGbuV-.js b/web/frontend/dist/assets/Servers-vGmGbuV-.js deleted file mode 100644 index 6cd32d5f..00000000 --- a/web/frontend/dist/assets/Servers-vGmGbuV-.js +++ /dev/null @@ -1,16 +0,0 @@ -import{d as R,b as V,e as O,f as U,r as C,g as m,c as l,o as a,a as e,h as u,t as d,n as $,i as v,j as S,k as H,l as se,w as x,m as g,F as Q,p as te,v as ne,T as re,C as ae,q as oe,s as le,x as ie}from"./index-myMLoUzQ.js";const de={class:"card bg-base-100 shadow-md hover:shadow-lg transition-shadow"},ue={class:"card-body"},ce={class:"flex justify-between items-start mb-4"},ve={class:"flex-1 min-w-0 mr-2"},ge={class:"card-title text-lg truncate"},me={class:"text-sm text-base-content/70 truncate"},pe=["data-tip"],be={class:"grid grid-cols-2 gap-4 mb-4"},fe={class:"stat bg-base-200 rounded-lg p-3"},ye={class:"stat-value text-lg"},he={key:0,class:"stat-desc text-xs text-warning flex items-center gap-1"},ke={key:1,class:"stat-desc text-xs"},_e={class:"stat bg-base-200 rounded-lg p-3"},we={class:"stat-value text-lg"},xe={class:"flex items-center space-x-1"},Se=["checked","disabled"],Ce={class:"text-sm"},$e={key:0,class:"flex items-center gap-2 mb-4"},Ae=["data-tip"],Te={key:0,d:"M10 15.5l-3.5-3.5 1.41-1.41L10 12.67l5.59-5.59L17 8.5l-7 7z"},Me={key:1,d:"M12 8v4m0 4h.01",stroke:"currentColor","stroke-width":"2",fill:"none","stroke-linecap":"round"},Le={key:0,class:"flex items-center gap-1 text-xs text-base-content/60"},Be={key:1,class:"alert alert-error alert-sm mb-4"},Ee={class:"text-xs"},je={key:2,class:"alert alert-warning alert-sm mb-4"},qe={class:"card-actions justify-end space-x-2"},Fe=["disabled"],De={key:0,class:"loading loading-spinner loading-xs"},Pe=["disabled"],ze={key:0,class:"loading loading-spinner loading-xs"},Ne=["disabled"],Re={key:0,class:"loading loading-spinner loading-xs"},Ve=["disabled"],Oe={key:0,class:"loading loading-spinner loading-xs"},Ue=["disabled"],He={key:0,class:"loading loading-spinner loading-xs"},Qe={key:0,class:"tooltip tooltip-top","data-tip":"Enable server first"},Ge=["disabled"],Ie={key:0,class:"modal modal-open"},We={class:"modal-box"},Je={class:"font-bold text-lg mb-4"},Ke={key:0,class:"mb-4"},Xe={class:"text-error font-semibold"},Ye={key:1,class:"mb-4"},Ze={class:"modal-action"},es=["disabled"],ss=["disabled"],ts={key:0,class:"loading loading-spinner loading-xs"},ns={key:1,class:"modal modal-open"},rs={class:"modal-box"},as={class:"mb-4"},os={class:"modal-action"},ls=["disabled"],is=["disabled"],ds={key:0,class:"loading loading-spinner loading-xs"},us=R({__name:"ServerCard",props:{server:{}},setup(z){const n=z,b=V(),c=O(),{hasEnabledScanners:y}=U(),o=C(!1),A=C(!1),h=C(!1),k=C("no_scan"),F=m(()=>n.server.protocol==="http"||n.server.protocol==="streamable-http"),D=m(()=>{const t=n.server.health;if(t)switch(t.admin_state){case"disabled":return"badge-neutral";case"quarantined":return"badge-secondary";default:switch(t.level){case"healthy":return"badge-success";case"degraded":return"badge-warning";case"unhealthy":return"badge-error";default:return"badge-ghost"}}return n.server.connected?"badge-success":n.server.connecting?"badge-warning":"badge-error"}),p=m(()=>{const t=n.server.health;return t?t.summary||t.level:n.server.connected?"Connected":n.server.connecting?"Connecting":"Disconnected"}),r=m(()=>{const t=n.server.health;return t!=null&&t.detail?t.detail:""}),i=m(()=>{var t;return((t=n.server.health)==null?void 0:t.action)||""}),T=m(()=>{const t=n.server.quarantine;return t?(t.pending_count??0)+(t.changed_count??0):0}),_=m(()=>{var t;return((t=n.server.security_scan)==null?void 0:t.status)||"not_scanned"}),w=m(()=>{switch(_.value){case"clean":return"text-success";case"warnings":return"text-warning";case"dangerous":return"text-error";case"failed":return"text-error";default:return"text-base-content/40"}}),B=m(()=>{var s;const t=n.server.security_scan;if(!t)return"Not scanned";switch(t.status){case"clean":return"Clean";case"warnings":{const f=((s=t.finding_counts)==null?void 0:s.warning)??0;return`${f} warning${f!==1?"s":""}`}case"dangerous":return"Dangerous";case"failed":return"Scan Failed";case"not_scanned":return"Not scanned";case"scanning":return"Scanning...";default:return t.status}}),E=m(()=>{var f,M;const t=n.server.security_scan;if(!t)return"";const s="Experimental heuristic β€” verify findings manually; results may not be precise.";switch(t.status){case"clean":return`Clean: no findings above the warning threshold in the most recent scan. ${s}`;case"warnings":{const L=((f=t.finding_counts)==null?void 0:f.warning)??0;return`${L} warning${L!==1?"s":""} found β€” review the Security tab for details. ${s}`}case"dangerous":{const L=((M=t.finding_counts)==null?void 0:M.dangerous)??0;return`${L} dangerous finding${L!==1?"s":""} detected. Review before approving. ${s}`}case"failed":return`The last scan failed to produce a verdict. Re-run from the Security tab. ${s}`;case"not_scanned":return"This server has not been scanned yet.";case"scanning":return"Security scan in progress…";default:return s}}),j=m(()=>!(!n.server.last_error||["login","set_secret","configure"].includes(i.value))),q=m(()=>!n.server.enabled||n.server.user_logged_out||!F.value||!(n.server.authenticated===!0)||n.server.connecting?!1:n.server.connected?!0:n.server.last_error?!(n.server.oauth_status==="expired"||n.server.last_error.includes("OAuth authentication required")||n.server.last_error.includes("authorization")||n.server.last_error.includes("401")||n.server.last_error.includes("invalid_token")):n.server.oauth_status==="authenticated");async function G(){o.value=!0;try{n.server.enabled?(await b.disableServer(n.server.name),c.addToast({type:"success",title:"Server Disabled",message:`${n.server.name} has been disabled`})):(await b.enableServer(n.server.name),c.addToast({type:"success",title:"Server Enabled",message:`${n.server.name} has been enabled`}))}catch(t){c.addToast({type:"error",title:"Operation Failed",message:t instanceof Error?t.message:"Unknown error"})}finally{o.value=!1}}async function I(){o.value=!0;try{await b.enableServer(n.server.name),c.addToast({type:"success",title:"Server Enabled",message:`${n.server.name} has been enabled`})}catch(t){c.addToast({type:"error",title:"Enable Failed",message:t instanceof Error?t.message:"Unknown error"})}finally{o.value=!1}}async function W(){o.value=!0;try{await b.restartServer(n.server.name),c.addToast({type:"success",title:"Server Restarted",message:`${n.server.name} is restarting`})}catch(t){c.addToast({type:"error",title:"Restart Failed",message:t instanceof Error?t.message:"Unknown error"})}finally{o.value=!1}}async function J(){o.value=!0;try{await b.triggerOAuthLogin(n.server.name),c.addToast({type:"success",title:"OAuth Login Triggered",message:`Check your browser for ${n.server.name} login`})}catch(t){c.addToast({type:"error",title:"OAuth Failed",message:t instanceof Error?t.message:"Unknown error"})}finally{o.value=!1}}async function K(){o.value=!0;try{await b.triggerOAuthLogout(n.server.name),c.addToast({type:"success",title:"OAuth Logout Successful",message:`${n.server.name} has been logged out`})}catch(t){c.addToast({type:"error",title:"Logout Failed",message:t instanceof Error?t.message:"Unknown error"})}finally{o.value=!1}}const P=m(()=>{const t=n.server.security_scan;if(!t)return 0;const s=t.finding_counts;return s&&typeof s.critical=="number"?s.critical:0}),X=m(()=>{const t=n.server.security_scan;return t?!!t.last_scan_at:!1});function Y(){if(!X.value){k.value="no_scan",h.value=!0;return}if(P.value>0){k.value="critical",h.value=!0;return}N(!1)}async function N(t){o.value=!0;try{await b.securityApproveServer(n.server.name,t),c.addToast({type:"success",title:"Server Approved",message:`${n.server.name} has been approved and unquarantined`}),h.value=!1}catch(s){c.addToast({type:"error",title:"Approve Failed",message:s instanceof Error?s.message:"Unknown error"})}finally{o.value=!1}}function Z(){N(!0)}async function ee(){o.value=!0;try{await b.deleteServer(n.server.name),c.addToast({type:"success",title:"Server Deleted",message:`${n.server.name} has been deleted successfully`}),A.value=!1}catch(t){c.addToast({type:"error",title:"Delete Failed",message:t instanceof Error?t.message:"Unknown error"})}finally{o.value=!1}}return(t,s)=>{const f=se("router-link");return a(),l("div",de,[e("div",ue,[e("div",ce,[e("div",ve,[e("h3",ge,d(t.server.name),1),e("p",me,d(t.server.protocol)+" β€’ "+d(t.server.url||t.server.command||"No endpoint"),1)]),e("div",{class:$(["badge badge-sm flex-shrink-0",D.value,r.value?"tooltip tooltip-left":""]),"data-tip":r.value},d(p.value),11,pe)]),e("div",be,[e("div",fe,[s[5]||(s[5]=e("div",{class:"stat-title text-xs"},"Tools",-1)),e("div",ye,d(t.server.tool_count),1),T.value>0?(a(),l("div",he,[s[4]||(s[4]=e("svg",{class:"w-3 h-3 inline-block flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),v(" "+d(T.value)+" pending approval ",1)])):t.server.tool_list_token_size?(a(),l("div",ke,d(t.server.tool_list_token_size.toLocaleString())+" tokens ",1)):u("",!0)]),e("div",_e,[s[6]||(s[6]=e("div",{class:"stat-title text-xs"},"Status",-1)),e("div",we,[e("div",xe,[e("input",{type:"checkbox",checked:t.server.enabled,onChange:G,class:"toggle toggle-sm",disabled:o.value},null,40,Se),e("span",Ce,d(t.server.enabled?"Enabled":"Disabled"),1)])])])]),t.server.security_scan?(a(),l("div",$e,[e("div",{class:"flex items-center gap-1.5 text-sm tooltip tooltip-right tooltip-bottom max-w-xs","data-tip":E.value},[(a(),l("svg",{class:$(["w-4 h-4 flex-shrink-0",w.value]),fill:"currentColor",viewBox:"0 0 24 24"},[s[7]||(s[7]=e("path",{d:"M12 2L3.5 6.5V11c0 5.55 3.84 10.74 8.5 12 4.66-1.26 8.5-6.45 8.5-12V6.5L12 2zm0 2.18l6.5 3.35V11c0 4.52-3.15 8.76-6.5 9.93C8.65 19.76 5.5 15.52 5.5 11V7.53L12 4.18z"},null,-1)),_.value==="clean"?(a(),l("path",Te)):_.value==="dangerous"?(a(),l("path",Me)):u("",!0)],2)),_.value==="scanning"?(a(),l("span",Le,[...s[8]||(s[8]=[e("span",{class:"loading loading-spinner loading-xs"},null,-1),v(" Scanning... ",-1)])])):(a(),l("span",{key:1,class:$(["text-xs",w.value])},d(B.value),3))],8,Ae)])):u("",!0),j.value?(a(),l("div",Be,[s[9]||(s[9]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",Ee,d(t.server.last_error),1)])):u("",!0),t.server.quarantined?(a(),l("div",je,[...s[10]||(s[10]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})],-1),e("span",{class:"text-xs"},"Server is quarantined",-1)])])):u("",!0),e("div",qe,[i.value==="approve"?(a(),l("button",{key:0,onClick:Y,disabled:o.value,class:"btn btn-sm btn-warning"},[o.value?(a(),l("span",De)):u("",!0),s[11]||(s[11]=v(" Approve ",-1))],8,Fe)):u("",!0),i.value==="enable"?(a(),l("button",{key:1,onClick:I,disabled:o.value,class:"btn btn-sm btn-primary"},[o.value?(a(),l("span",ze)):u("",!0),s[12]||(s[12]=v(" Enable ",-1))],8,Pe)):u("",!0),i.value==="login"?(a(),l("button",{key:2,onClick:J,disabled:o.value,class:"btn btn-sm btn-primary"},[o.value?(a(),l("span",Re)):u("",!0),s[13]||(s[13]=v(" Login ",-1))],8,Ne)):u("",!0),i.value==="restart"?(a(),l("button",{key:3,onClick:W,disabled:o.value,class:"btn btn-sm btn-primary"},[o.value?(a(),l("span",Oe)):u("",!0),s[14]||(s[14]=v(" Restart ",-1))],8,Ve)):u("",!0),i.value==="view_logs"?(a(),S(f,{key:4,to:`/servers/${t.server.name}?tab=logs`,class:"btn btn-sm btn-primary"},{default:x(()=>[...s[15]||(s[15]=[v(" View Logs ",-1)])]),_:1},8,["to"])):u("",!0),i.value==="set_secret"?(a(),S(f,{key:5,to:"/secrets",class:"btn btn-sm btn-primary"},{default:x(()=>[...s[16]||(s[16]=[v(" Set Secret ",-1)])]),_:1})):u("",!0),i.value==="configure"?(a(),S(f,{key:6,to:`/servers/${t.server.name}?tab=config`,class:"btn btn-sm btn-primary"},{default:x(()=>[...s[17]||(s[17]=[v(" Configure ",-1)])]),_:1},8,["to"])):u("",!0),q.value?(a(),l("button",{key:7,onClick:K,disabled:o.value,class:"btn btn-sm btn-outline btn-warning"},[o.value?(a(),l("span",He)):u("",!0),s[18]||(s[18]=v(" Logout ",-1))],8,Ue)):u("",!0),g(y)()?(a(),l(Q,{key:8},[t.server.enabled?(a(),S(f,{key:1,to:`/servers/${t.server.name}?tab=security`,class:"btn btn-sm btn-outline btn-ghost",title:"Security Scan"},{default:x(()=>[...s[20]||(s[20]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1),v(" Scan ",-1)])]),_:1},8,["to"])):(a(),l("div",Qe,[...s[19]||(s[19]=[e("button",{class:"btn btn-sm btn-outline btn-ghost",disabled:""},[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})]),v(" Scan ")],-1)])]))],64)):u("",!0),H(f,{to:`/servers/${t.server.name}`,class:"btn btn-sm btn-outline"},{default:x(()=>[...s[21]||(s[21]=[v(" Details ",-1)])]),_:1},8,["to"]),e("button",{onClick:s[0]||(s[0]=M=>A.value=!0),disabled:o.value,class:"btn btn-sm btn-error"}," Delete ",8,Ge)])]),h.value?(a(),l("div",Ie,[e("div",We,[e("h3",Je,d(k.value==="no_scan"?"No Security Scan Run":"Critical Findings Detected"),1),k.value==="critical"?(a(),l("p",Ke,[e("strong",null,d(t.server.name),1),s[22]||(s[22]=v(" has ",-1)),e("span",Xe,d(P.value)+" critical finding"+d(P.value===1?"":"s"),1),s[23]||(s[23]=v(" in its most recent security scan. Approving this server will allow it to run despite these warnings. ",-1))])):(a(),l("p",Ye,[s[24]||(s[24]=v(" No security scan has been run for ",-1)),e("strong",null,d(t.server.name),1),s[25]||(s[25]=v(". We strongly recommend running a scan first. ",-1))])),s[28]||(s[28]=e("p",{class:"text-sm text-base-content/70 mb-6"}," The security scanner is an experimental heuristic. Force-approving a server bypasses the scanner gate and is irreversible from this dialog. ",-1)),e("div",Ze,[e("button",{onClick:s[1]||(s[1]=M=>h.value=!1),disabled:o.value,class:"btn btn-outline"}," Cancel ",8,es),k.value==="no_scan"?(a(),S(f,{key:0,to:`/servers/${t.server.name}?tab=security`,class:"btn btn-primary",onClick:s[2]||(s[2]=M=>h.value=!1)},{default:x(()=>[...s[26]||(s[26]=[v(" Scan First ",-1)])]),_:1},8,["to"])):u("",!0),e("button",{onClick:Z,disabled:o.value,class:"btn btn-error"},[o.value?(a(),l("span",ts)):u("",!0),s[27]||(s[27]=v(" Force Approve ",-1))],8,ss)])])])):u("",!0),A.value?(a(),l("div",ns,[e("div",rs,[s[32]||(s[32]=e("h3",{class:"font-bold text-lg mb-4"},"Delete Server",-1)),e("p",as,[s[29]||(s[29]=v(" Are you sure you want to delete the server ",-1)),e("strong",null,d(t.server.name),1),s[30]||(s[30]=v("? ",-1))]),s[33]||(s[33]=e("p",{class:"text-sm text-base-content/70 mb-6"}," This action cannot be undone. The server will be removed from your configuration. ",-1)),e("div",os,[e("button",{onClick:s[3]||(s[3]=M=>A.value=!1),disabled:o.value,class:"btn btn-outline"}," Cancel ",8,ls),e("button",{onClick:ee,disabled:o.value,class:"btn btn-error"},[o.value?(a(),l("span",ds)):u("",!0),s[31]||(s[31]=v(" Delete Server ",-1))],8,is)])])])):u("",!0)])}}}),cs={class:"space-y-6"},vs={class:"flex justify-between items-center"},gs={class:"flex items-center space-x-2"},ms=["disabled"],ps={key:0,class:"loading loading-spinner loading-sm"},bs=["disabled"],fs={key:0,class:"loading loading-spinner loading-sm"},ys={class:"stats shadow bg-base-100 w-full"},hs={class:"stat"},ks={class:"stat-value"},_s={class:"stat-desc"},ws={class:"stat"},xs={class:"stat-value text-success"},Ss={class:"stat-desc"},Cs={class:"stat"},$s={class:"stat-value text-warning"},As={class:"stat"},Ts={class:"stat-value text-info"},Ms={class:"flex flex-wrap gap-4 items-center justify-between"},Ls={class:"flex flex-wrap gap-2"},Bs={class:"form-control"},Es={key:0,class:"text-center py-12"},js={key:1,class:"alert alert-error"},qs={class:"text-sm"},Fs={key:2,class:"text-center py-12"},Ds={class:"text-base-content/70 mb-4"},zs=R({__name:"Servers",setup(z){const n=V(),b=O(),c=C("all"),y=C(""),o=C(!1),{hasEnabledScanners:A}=U(),h=m(()=>{let p=n.servers;switch(c.value){case"connected":p=n.connectedServers;break;case"enabled":p=n.enabledServers;break;case"quarantined":p=n.quarantinedServers;break}if(y.value){const r=y.value.toLowerCase();p=p.filter(i=>{var T,_;return i.name.toLowerCase().includes(r)||((T=i.url)==null?void 0:T.toLowerCase().includes(r))||((_=i.command)==null?void 0:_.toLowerCase().includes(r))})}return p});async function k(){await n.fetchServers()}async function F(){o.value=!0;try{const p=await oe.scanAll();p.success?b.addToast({type:"success",title:"Batch Scan Started",message:"Scanning all servers. Check the Security page for progress."}):b.addToast({type:"error",title:"Scan Failed",message:p.error||"Failed to start batch scan"})}catch(p){b.addToast({type:"error",title:"Scan Failed",message:p.message||"Failed to start batch scan"})}finally{o.value=!1}}const D=m(()=>[{icon:"βž•",title:"Add New MCP Servers",description:"Multiple ways to add servers to MCPProxy",sections:[{title:"Add HTTP/HTTPS server",codeBlock:{language:"bash",code:`# Add a remote MCP server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"add","name":"my-server","url":"https://api.example.com/mcp","protocol":"http","enabled":true}'`}},{title:"Add stdio server (npx)",codeBlock:{language:"bash",code:`# Add an npm-based MCP server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"add","name":"filesystem","command":"npx","args_json":"[\\"@modelcontextprotocol/server-filesystem\\"]","protocol":"stdio","enabled":true}'`}},{title:"Add stdio server (uvx)",codeBlock:{language:"bash",code:`# Add a Python-based MCP server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"add","name":"python-server","command":"uvx","args_json":"[\\"mcp-server-package\\"]","protocol":"stdio","enabled":true}'`}}]},{icon:"πŸ”§",title:"Manage Servers via CLI",description:"Common server management operations",sections:[{title:"List all servers",codeBlock:{language:"bash",code:`# View all upstream servers -mcpproxy upstream list`}},{title:"Enable/disable server",codeBlock:{language:"bash",code:`# Disable a server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"update","name":"server-name","enabled":false}' - -# Enable a server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"update","name":"server-name","enabled":true}'`}},{title:"Remove server",codeBlock:{language:"bash",code:`# Delete a server -mcpproxy call tool --tool-name=upstream_servers \\ - --json_args='{"operation":"delete","name":"server-name"}'`}}]},{icon:"πŸ€–",title:"Use LLM Agents to Manage Servers",description:"Let AI agents help you configure MCPProxy",sections:[{title:"Example LLM prompts",list:["Add the GitHub MCP server from @modelcontextprotocol/server-github to my configuration","Show me all quarantined servers and help me review them","Disable all servers that haven't been used in the last 24 hours","Find and add MCP servers for working with Slack"]}]}]);return(p,r)=>(a(),l("div",cs,[e("div",vs,[r[10]||(r[10]=e("div",null,[e("h1",{class:"text-3xl font-bold"},"Servers"),e("p",{class:"text-base-content/70 mt-1"},"Manage upstream MCP servers")],-1)),e("div",gs,[e("button",{onClick:k,disabled:g(n).loading.loading,class:"btn btn-outline"},[r[8]||(r[8]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)),g(n).loading.loading?(a(),l("span",ps)):u("",!0),v(" "+d(g(n).loading.loading?"Refreshing...":"Refresh"),1)],8,ms),g(A)()?(a(),l("button",{key:0,onClick:F,disabled:o.value,class:"btn btn-primary"},[r[9]||(r[9]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1)),o.value?(a(),l("span",fs)):u("",!0),v(" "+d(o.value?"Scanning...":"Scan All"),1)],8,bs)):u("",!0)])]),e("div",ys,[e("div",hs,[r[11]||(r[11]=e("div",{class:"stat-title"},"Total Servers",-1)),e("div",ks,d(g(n).serverCount.total),1),e("div",_s,d(g(n).serverCount.enabled)+" enabled",1)]),e("div",ws,[r[12]||(r[12]=e("div",{class:"stat-title"},"Connected",-1)),e("div",xs,d(g(n).serverCount.connected),1),e("div",Ss,d(Math.round(g(n).serverCount.connected/g(n).serverCount.total*100)||0)+"% online",1)]),e("div",Cs,[r[13]||(r[13]=e("div",{class:"stat-title"},"Quarantined",-1)),e("div",$s,d(g(n).serverCount.quarantined),1),r[14]||(r[14]=e("div",{class:"stat-desc"},"Need security review",-1))]),e("div",As,[r[15]||(r[15]=e("div",{class:"stat-title"},"Total Tools",-1)),e("div",Ts,d(g(n).totalTools),1),r[16]||(r[16]=e("div",{class:"stat-desc"},"Available across all servers",-1))])]),e("div",Ms,[e("div",Ls,[e("button",{onClick:r[0]||(r[0]=i=>c.value="all"),class:$(["btn btn-sm",c.value==="all"?"btn-primary":"btn-outline"])}," All ("+d(g(n).servers.length)+") ",3),e("button",{onClick:r[1]||(r[1]=i=>c.value="connected"),class:$(["btn btn-sm",c.value==="connected"?"btn-primary":"btn-outline"])}," Connected ("+d(g(n).connectedServers.length)+") ",3),e("button",{onClick:r[2]||(r[2]=i=>c.value="enabled"),class:$(["btn btn-sm",c.value==="enabled"?"btn-primary":"btn-outline"])}," Enabled ("+d(g(n).enabledServers.length)+") ",3),e("button",{onClick:r[3]||(r[3]=i=>c.value="quarantined"),class:$(["btn btn-sm",c.value==="quarantined"?"btn-primary":"btn-outline"])}," Quarantined ("+d(g(n).quarantinedServers.length)+") ",3)]),e("div",Bs,[te(e("input",{"onUpdate:modelValue":r[4]||(r[4]=i=>y.value=i),type:"text",placeholder:"Search servers...",class:"input input-bordered input-sm w-64"},null,512),[[ne,y.value]])])]),g(n).loading.loading?(a(),l("div",Es,[...r[17]||(r[17]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1),e("p",{class:"mt-4"},"Loading servers...",-1)])])):g(n).loading.error?(a(),l("div",js,[r[19]||(r[19]=e("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[r[18]||(r[18]=e("h3",{class:"font-bold"},"Failed to load servers",-1)),e("div",qs,d(g(n).loading.error),1)]),e("button",{onClick:k,class:"btn btn-sm"}," Try Again ")])):h.value.length===0?(a(),l("div",Fs,[r[20]||(r[20]=e("svg",{class:"w-24 h-24 mx-auto mb-4 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})],-1)),r[21]||(r[21]=e("h3",{class:"text-xl font-semibold mb-2"},"No servers found",-1)),e("p",Ds,d(y.value?"No servers match your search criteria":`No ${c.value==="all"?"":c.value} servers available`.replace(/\s+/g," ").trim()),1),y.value?(a(),l("button",{key:0,onClick:r[5]||(r[5]=i=>y.value=""),class:"btn btn-outline"}," Clear Search ")):u("",!0)])):(a(),S(re,{key:3,name:"server-list",tag:"div",class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"},{default:x(()=>[(a(!0),l(Q,null,le(h.value,(i,T,_,w)=>{var j,q;const B=[i.connected,i.connecting,i.enabled,i.quarantined,i.tool_count,i.last_error,i.authenticated,(j=i.quarantine)==null?void 0:j.pending_count,(q=i.quarantine)==null?void 0:q.changed_count];if(w&&w.key===i.name&&ie(w,B))return w;const E=(a(),S(us,{key:i.name,server:i},null,8,["server"]));return E.memo=B,E},r,6),128))]),_:1})),H(ae,{hints:D.value},null,8,["hints"])]))}});export{zs as default}; diff --git a/web/frontend/dist/assets/Sessions-Dsg-0ylf.js b/web/frontend/dist/assets/Sessions-Dsg-0ylf.js deleted file mode 100644 index bc67c9fb..00000000 --- a/web/frontend/dist/assets/Sessions-Dsg-0ylf.js +++ /dev/null @@ -1 +0,0 @@ -import{d as b,r as v,z as f,B as k,c as n,o,a as t,G as y,i as _,n as x,h as i,t as l,F as w,s as C,q as M,k as S,w as T,l as A}from"./index-myMLoUzQ.js";const N={class:"space-y-6"},B={class:"flex justify-between items-center"},P=["disabled"],V={class:"card bg-base-100 shadow-md"},j={class:"card-body"},D={key:0,class:"flex justify-center py-12"},E={key:1,class:"alert alert-error"},I={key:2,class:"text-center py-12 text-base-content/60"},$={key:3,class:"overflow-x-auto"},z={class:"table"},L=["title"],U={class:"font-medium"},F={key:0,class:"text-xs text-base-content/60"},R={class:"flex flex-wrap gap-1"},q={key:0,class:"badge badge-sm badge-info",title:"Client supports roots capability"},H={key:1,class:"badge badge-sm badge-info",title:"Client supports sampling capability"},G=["title"],J={key:3,class:"text-xs text-base-content/40"},K={class:"font-mono"},O={class:"font-mono text-sm",title:"Total tokens used in this session"},Q={class:"text-sm"},W={class:"text-xs text-base-content/60"},X={class:"text-sm"},Y={class:"text-xs text-base-content/60"},Z={key:4,class:"text-sm text-base-content/60 mt-4 text-center"},st=b({__name:"Sessions",setup(tt){const r=v([]),d=v(!1),c=v(null);let u=null;const m=async()=>{d.value=!0,c.value=null;try{const a=await M.getSessions(10);a.success&&a.data?r.value=a.data.sessions||[]:c.value=a.error||"Failed to load sessions"}catch(a){c.value=a instanceof Error?a.message:"Unknown error"}finally{d.value=!1}},h=a=>new Date(a).toLocaleString(),g=a=>{const s=Date.now(),p=new Date(a).getTime(),e=s-p;return e<1e3?"Just now":e<6e4?`${Math.floor(e/1e3)}s ago`:e<36e5?`${Math.floor(e/6e4)}m ago`:e<864e5?`${Math.floor(e/36e5)}h ago`:`${Math.floor(e/864e5)}d ago`};return f(()=>{m(),u=setInterval(m,3e4)}),k(()=>{u&&clearInterval(u)}),(a,s)=>{const p=A("router-link");return o(),n("div",N,[t("div",B,[s[2]||(s[2]=t("div",null,[t("h1",{class:"text-3xl font-bold"},"MCP Sessions"),t("p",{class:"text-base-content/70 mt-1"},"Monitor active and recent MCP client sessions")],-1)),t("button",{onClick:m,class:"btn btn-sm btn-ghost",disabled:d.value},[(o(),n("svg",{class:x(["w-4 h-4",{"animate-spin":d.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...s[0]||(s[0]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2)),s[1]||(s[1]=_(" Refresh ",-1))],8,P)]),t("div",V,[t("div",j,[d.value?(o(),n("div",D,[...s[3]||(s[3]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):c.value?(o(),n("div",E,[s[4]||(s[4]=t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,l(c.value),1)])):r.value.length===0?(o(),n("div",I,[...s[5]||(s[5]=[t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1),t("p",{class:"text-lg"},"No sessions found",-1),t("p",{class:"text-sm mt-1"},"Sessions will appear here when MCP clients connect",-1)])])):(o(),n("div",$,[t("table",z,[s[7]||(s[7]=t("thead",null,[t("tr",null,[t("th",null,"Session ID"),t("th",null,"Client"),t("th",null,"Status"),t("th",null,"Capabilities"),t("th",null,"Tool Calls"),t("th",null,"Tokens"),t("th",null,"Started"),t("th",null,"Last Active"),t("th",null,"Actions")])],-1)),t("tbody",null,[(o(!0),n(w,null,C(r.value,e=>(o(),n("tr",{key:e.id},[t("td",null,[t("code",{class:"text-xs bg-base-200 px-2 py-1 rounded",title:e.id},l(e.id.substring(0,12))+"... ",9,L)]),t("td",null,[t("div",U,l(e.client_name||"Unknown"),1),e.client_version?(o(),n("div",F," v"+l(e.client_version),1)):i("",!0)]),t("td",null,[t("div",{class:x(["badge",e.status==="active"?"badge-success":"badge-neutral"])},l(e.status==="active"?"Active":"Closed"),3)]),t("td",null,[t("div",R,[e.has_roots?(o(),n("span",q," Roots ")):i("",!0),e.has_sampling?(o(),n("span",H," Sampling ")):i("",!0),e.experimental&&e.experimental.length>0?(o(),n("span",{key:2,class:"badge badge-sm badge-warning",title:`Experimental features: ${e.experimental.join(", ")}`}," Experimental ("+l(e.experimental.length)+") ",9,G)):i("",!0),!e.has_roots&&!e.has_sampling&&(!e.experimental||e.experimental.length===0)?(o(),n("span",J," None ")):i("",!0)])]),t("td",null,[t("span",K,l(e.tool_call_count),1)]),t("td",null,[t("span",O,l(e.total_tokens.toLocaleString()),1)]),t("td",null,[t("div",Q,l(h(e.start_time)),1),t("div",W,l(g(e.start_time)),1)]),t("td",null,[t("div",X,l(h(e.last_activity)),1),t("div",Y,l(g(e.last_activity)),1)]),t("td",null,[S(p,{to:{name:"activity",query:{session:e.id}},class:"btn btn-xs btn-primary",title:"View activity for this session"},{default:T(()=>[...s[6]||(s[6]=[_(" View Activity ",-1)])]),_:1},8,["to"])])]))),128))])])])),r.value.length>0?(o(),n("div",Z," Showing "+l(r.value.length)+" most recent sessions ",1)):i("",!0)])]),s[8]||(s[8]=y('

About MCP Sessions

MCP sessions represent individual connections from AI clients (like Claude Code) to MCPProxy. Each session tracks:

  • Tool Calls: Number of tool invocations made during the session
  • Token Usage: Total tokens consumed across all tool calls
  • Duration: Time from connection to disconnection

Sessions are retained for the 100 most recent connections.

',1))])}}});export{st as default}; diff --git a/web/frontend/dist/assets/Settings-RcQ5dhlx.js b/web/frontend/dist/assets/Settings-RcQ5dhlx.js deleted file mode 100644 index d5839bb3..00000000 --- a/web/frontend/dist/assets/Settings-RcQ5dhlx.js +++ /dev/null @@ -1,22 +0,0 @@ -import{d as ie,I as A,J as H,g as T,B as oe,y as C,r as y,z as J,K as le,b as pe,c as p,o as m,a as c,G as me,k as R,h as _,n as he,t as I,m as ye,F as be,s as we,i as L,C as Oe,q as F}from"./index-myMLoUzQ.js";function Se(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function W(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable})),n.push.apply(n,r)}return n}function K(e){for(var t=1;t=0)&&(n[a]=e[a]);return n}function je(e,t){if(e==null)return{};var n=_e(e,t),r,a;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function Ce(e,t){return Pe(e)||xe(e,t)||Me(e,t)||Ee()}function Pe(e){if(Array.isArray(e))return e}function xe(e,t){if(!(typeof Symbol>"u"||!(Symbol.iterator in Object(e)))){var n=[],r=!0,a=!1,i=void 0;try{for(var l=e[Symbol.iterator](),o;!(r=(o=l.next()).done)&&(n.push(o.value),!(t&&n.length===t));r=!0);}catch(u){a=!0,i=u}finally{try{!r&&l.return!=null&&l.return()}finally{if(a)throw i}}return n}}function Me(e,t){if(e){if(typeof e=="string")return G(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return G(e,t)}}function G(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?e.apply(this,a):function(){for(var l=arguments.length,o=new Array(l),u=0;u1&&arguments[1]!==void 0?arguments[1]:{};k.initial(e),k.handler(t);var n={current:e},r=j(Ue)(n,t),a=j(ze)(n),i=j(k.changes)(e),l=j(Be)(n);function o(){var v=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(g){return g};return k.selector(v),v(n.current)}function u(v){ke(r,a,i,l)(v)}return[o,u]}function Be(e,t){return P(t)?t(e.current):t}function ze(e,t){return e.current=Q(Q({},e.current),t),t}function Ue(e,t,n){return P(t)?t(e.current):Object.keys(n).forEach(function(r){var a;return(a=t[r])===null||a===void 0?void 0:a.call(t,e.current[r])}),n}var He={create:qe},Je={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs"}};function Re(e){return function t(){for(var n=this,r=arguments.length,a=new Array(r),i=0;i=e.length?e.apply(this,a):function(){for(var l=arguments.length,o=new Array(l),u=0;ut in e?st(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,B=(e,t)=>{for(var n in t||(t={}))dt.call(t,n)&&te(e,n,t[n]);if(ee)for(var n of ee(t))ft.call(t,n)&&te(e,n,t[n]);return e},vt=(e,t)=>ut(e,ct(t));const z={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}};function gt(e,t){const n=T(()=>{const{width:a,height:i}=e;return vt(B({},z.wrapper),{width:a,height:i})}),r=T(()=>B(B({},z.fullWidth),!t.value&&z.hide));return{wrapperStyle:n,containerStyle:r}}function pt(){const e=H(Z.__getMonacoInstance()),t=y(!1);let n;return J(()=>{e.value||(n=Z.init(),n.then(a=>e.value=a).catch(a=>{(a==null?void 0:a.type)!=="cancelation"&&(t.value=!0,console.error("Monaco initialization error:",a))}))}),{monacoRef:e,unload:()=>n==null?void 0:n.cancel(),isLoadFailed:t}}function ne(e){return typeof e=="function"?e():e}function U(e){return e===void 0}function fe(e,t,n,r){return mt(e,r)||ht(e,t,n,r)}function mt(e,t){return e.editor.getModel(ve(e,t))}function ht(e,t,n,r){return e.editor.createModel(t,n,r?ve(e,r):void 0)}function ve(e,t){return e.Uri.parse(t)}var yt=Object.defineProperty,re=Object.getOwnPropertySymbols,bt=Object.prototype.hasOwnProperty,wt=Object.prototype.propertyIsEnumerable,ae=(e,t,n)=>t in e?yt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ot=(e,t)=>{for(var n in t||(t={}))bt.call(t,n)&&ae(e,n,t[n]);if(re)for(var n of re(t))wt.call(t,n)&&ae(e,n,t[n]);return e};const St={display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"};var _t=ie({name:"VueMonacoEditor",model:{prop:"value",event:"update:value"},props:{defaultValue:String,defaultPath:String,defaultLanguage:String,value:String,language:String,path:String,theme:{type:String,default:"vs"},line:Number,options:{type:Object,default:()=>({})},overrideServices:{type:Object,default:()=>({})},saveViewState:{type:Boolean,default:!0},width:{type:[Number,String],default:"100%"},height:{type:[Number,String],default:"100%"},className:String},emits:["update:value","beforeMount","mount","change","validate"],setup(e,t){const n=new Map,r=H(null),{monacoRef:a,unload:i,isLoadFailed:l}=pt(),{editorRef:o}=jt(t,e,a,r),{disposeValidator:u}=Ct(t,e,a,o),v=T(()=>!!a.value&&!!o.value),{wrapperStyle:g,containerStyle:M}=gt(e,v);return oe(()=>{var f,h;(f=u.value)==null||f.call(u),o.value?((h=o.value.getModel())==null||h.dispose(),o.value.dispose()):i()}),C([()=>e.path,()=>e.value,()=>e.language,()=>e.line],([f,h,S,w],[E,N,d,s])=>{if(v.value){if(f!==E){const O=fe(a.value,h||e.defaultValue||"",S||e.defaultLanguage||"",f||e.defaultPath||"");e.saveViewState&&n.set(E,o.value.saveViewState()),o.value.setModel(O),e.saveViewState&&o.value.restoreViewState(n.get(f)),U(w)||o.value.revealLine(w);return}o.value.getValue()!==h&&o.value.setValue(h),S!==d&&a.value.editor.setModelLanguage(o.value.getModel(),S),!U(w)&&w!==s&&o.value.revealLine(w)}}),C(()=>e.options,f=>o.value&&o.value.updateOptions(f),{deep:!0}),C(()=>e.theme,f=>a.value&&a.value.editor.setTheme(f)),{containerRef:r,isEditorReady:v,isLoadFailed:l,wrapperStyle:g,containerStyle:M}},render(){const{$slots:e,isEditorReady:t,isLoadFailed:n,wrapperStyle:r,containerStyle:a,className:i}=this;return A("div",{style:r},[!t&&A("div",{style:St},n?e.failure?ne(e.failure):"load failed":e.default?ne(e.default):"loading..."),A("div",{ref:"containerRef",key:"monaco_editor_container",style:a,class:i})])}});function jt({emit:e},t,n,r){const a=H(null);J(()=>{const l=C(n,()=>{r.value&&n.value&&(le(()=>l()),i())},{immediate:!0})});function i(){var l;if(!r.value||!n.value||a.value)return;e("beforeMount",n.value);const o=t.path||t.defaultPath,u=fe(n.value,t.value||t.defaultValue||"",t.language||t.defaultLanguage||"",o||"");a.value=n.value.editor.create(r.value,Ot({model:u,theme:t.theme,automaticLayout:!0,autoIndent:"brackets",formatOnPaste:!0,formatOnType:!0},t.options),t.overrideServices),(l=a.value)==null||l.onDidChangeModelContent(v=>{const g=a.value.getValue();g!==t.value&&(e("update:value",g),e("change",g,v))}),a.value&&!U(t.line)&&a.value.revealLine(t.line),e("mount",a.value,n.value)}return{editorRef:a}}function Ct({emit:e},t,n,r){const a=y(null),i=C([n,r],()=>{if(n.value&&r.value){le(()=>i());const l=n.value.editor.onDidChangeMarkers(o=>{var u,v;const g=(v=(u=r.value)==null?void 0:u.getModel())==null?void 0:v.uri;if(g&&o.find(f=>f.path===g.path)){const f=n.value.editor.getModelMarkers({resource:g});e("validate",f)}});a.value=()=>l==null?void 0:l.dispose()}});return{disposeValidator:a}}const Pt={class:"space-y-6"},xt={class:"card bg-base-100 shadow-md"},Mt={class:"card-body"},Et={class:"flex justify-between items-center mb-4"},It={class:"flex items-center space-x-2"},kt=["disabled"],Tt={key:0,class:"loading loading-spinner loading-xs"},$t={key:1},Vt={class:"border border-base-300 rounded-lg overflow-hidden",style:{height:"600px"}},Nt={key:0,class:"alert alert-error mt-4"},At={class:"list-disc list-inside text-sm"},Lt={class:"font-mono"},Ft={class:"flex justify-between items-center mt-4"},Dt={class:"text-sm text-base-content/70"},qt={key:0,class:"text-warning"},Bt={key:1,class:"text-success"},zt={class:"flex items-center space-x-2"},Ut=["disabled"],Ht={key:0,class:"loading loading-spinner loading-sm"},Jt=["disabled"],Rt={key:0,class:"loading loading-spinner loading-sm"},Kt=ie({__name:"Settings",setup(e){const t=pe(),n=y(""),r=y(!1),a=y(!1),i=y(!1),l=y(null),o=y([]),u=y(null),v=y(null),g={automaticLayout:!0,formatOnType:!0,formatOnPaste:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:14,tabSize:2,wordWrap:"on",lineNumbers:"on",glyphMargin:!0,folding:!0,lineDecorationsWidth:10,lineNumbersMinChars:3};function M(d){v.value=d}function f(){o.value=[],l.value=null,u.value=null;try{JSON.parse(n.value),l.value={valid:!0}}catch{l.value={valid:!1}}}async function h(){r.value=!0,o.value=[],u.value=null;try{const d=await F.getConfig();d.success&&d.data?(n.value=JSON.stringify(d.data.config,null,2),l.value={valid:!0}):o.value=[{field:"general",message:d.error||"Failed to load configuration"}]}catch(d){console.error("Failed to load config:",d),o.value=[{field:"general",message:d.message||"Failed to load configuration"}]}finally{r.value=!1}}async function S(){a.value=!0,o.value=[];try{const d=JSON.parse(n.value),s=await F.validateConfig(d);s.success&&s.data?(o.value=s.data.errors||[],l.value={valid:s.data.valid},s.data.valid&&console.log("Configuration validated successfully")):(o.value=[{field:"general",message:s.error||"Validation failed"}],l.value={valid:!1})}catch(d){o.value=[{field:"json",message:d.message||"Invalid JSON syntax"}],l.value={valid:!1}}finally{a.value=!1}}async function w(){i.value=!0,o.value=[],u.value=null;try{const d=JSON.parse(n.value),s=await F.applyConfig(d);s.success&&s.data?(u.value=s.data,s.data.applied_immediately&&await t.fetchServers(),console.log("Configuration applied successfully:",s.data)):o.value=[{field:"apply",message:s.error||"Failed to apply configuration"}]}catch(d){o.value=[{field:"apply",message:d.message||"Failed to apply configuration"}]}finally{i.value=!1}}const E=T(()=>[{icon:"βš™οΈ",title:"Configuration Management",description:"Edit MCPProxy configuration with JSON editor",sections:[{title:"Hot-Reloadable Settings",text:"These settings are applied immediately without restarting:",list:["Server enable/disable status","Tool limits and search parameters","Log levels and output settings","Cache and timeout settings"]},{title:"Restart Required",text:"These settings require mcpproxy restart to take effect:",list:["Listen address (network binding)","Data directory path","API key authentication","TLS/HTTPS configuration"]}]},{icon:"πŸ”§",title:"CLI Configuration Tools",description:"Manage configuration from the command line",sections:[{title:"View current configuration",codeBlock:{language:"bash",code:`# View configuration location -mcpproxy config path - -# Dump current config -cat ~/.mcpproxy/mcp_config.json`}},{title:"Backup configuration",codeBlock:{language:"bash",code:`# Create backup -cp ~/.mcpproxy/mcp_config.json ~/.mcpproxy/mcp_config.backup.json`}}]},{icon:"πŸ’‘",title:"Configuration Tips",description:"Best practices for managing MCPProxy config",sections:[{title:"Editor features",list:["Use Ctrl+Space for autocomplete suggestions","Use Ctrl+F to search within the configuration","Invalid JSON is highlighted with red squiggles","Format with Ctrl+Shift+F (or Cmd+Shift+F on Mac)"]},{title:"Version control",text:"Consider tracking your configuration in git (excluding secrets):",codeBlock:{language:"bash",code:`# Initialize git repo for configs -cd ~/.mcpproxy -git init -echo "*.db" >> .gitignore -echo "*.bleve/" >> .gitignore -git add mcp_config.json -git commit -m "Initial MCPProxy configuration"`}}]}]);function N(d){console.log("Configuration saved event received, reloading config:",d.detail),h()}return J(()=>{h(),window.addEventListener("mcpproxy:config-saved",N)}),oe(()=>{window.removeEventListener("mcpproxy:config-saved",N)}),(d,s)=>(m(),p("div",Pt,[s[6]||(s[6]=c("div",{class:"flex justify-between items-center"},[c("div",null,[c("h1",{class:"text-3xl font-bold"},"Configuration"),c("p",{class:"text-base-content/70 mt-1"},"Edit your MCPProxy configuration directly. Changes require restart for some settings.")])],-1)),c("div",xt,[c("div",Mt,[c("div",Et,[s[1]||(s[1]=c("div",null,[c("h2",{class:"card-title"},"Configuration Editor"),c("p",{class:"text-sm text-base-content/70 mt-1"}," Edit your MCPProxy configuration directly. Changes require restart for some settings. ")],-1)),c("div",It,[l.value?(m(),p("div",{key:0,class:he(["badge",l.value.valid?"badge-success":"badge-error"])},I(l.value.valid?"βœ“ Valid":"βœ— Invalid"),3)):_("",!0),c("button",{class:"btn btn-sm btn-outline",onClick:h,disabled:r.value},[r.value?(m(),p("span",Tt)):(m(),p("span",$t,"Reload"))],8,kt)])]),c("div",Vt,[R(ye(_t),{value:n.value,"onUpdate:value":s[0]||(s[0]=O=>n.value=O),language:"json",theme:"vs-dark",options:g,onMount:M,onChange:f},null,8,["value"])]),o.value.length>0?(m(),p("div",Nt,[s[3]||(s[3]=c("svg",{xmlns:"http://www.w3.org/2000/svg",class:"stroke-current shrink-0 h-6 w-6",fill:"none",viewBox:"0 0 24 24"},[c("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),c("div",null,[s[2]||(s[2]=c("h3",{class:"font-bold"},"Validation Errors",-1)),c("ul",At,[(m(!0),p(be,null,we(o.value,(O,ge)=>(m(),p("li",{key:ge},[c("span",Lt,I(O.field),1),L(": "+I(O.message),1)]))),128))])])])):_("",!0),c("div",Ft,[c("div",Dt,[u.value&&u.value.requires_restart?(m(),p("span",qt," ⚠️ "+I(u.value.restart_reason),1)):u.value&&u.value.applied_immediately?(m(),p("span",Bt," βœ“ Configuration applied successfully ")):_("",!0)]),c("div",zt,[c("button",{class:"btn btn-outline",onClick:S,disabled:a.value||!n.value},[a.value?(m(),p("span",Ht)):_("",!0),s[4]||(s[4]=L(" Validate ",-1))],8,Ut),c("button",{class:"btn btn-primary",onClick:w,disabled:i.value||o.value.length>0||!n.value},[i.value?(m(),p("span",Rt)):_("",!0),s[5]||(s[5]=L(" Apply Configuration ",-1))],8,Jt)])])])]),s[7]||(s[7]=me('

Configuration Tips

β€’ Use Ctrl+Space for autocomplete

β€’ Use Ctrl+F to search in the configuration

β€’ Invalid JSON will be highlighted with red squiggles

β€’ Hot-reloadable: server changes, limits, logging

β€’ Requires restart: listen address, data directory, API key, TLS

',1)),R(Oe,{hints:E.value},null,8,["hints"])]))}});export{Kt as default}; diff --git a/web/frontend/dist/assets/UserActivity-DJXmTB_5.js b/web/frontend/dist/assets/UserActivity-DJXmTB_5.js deleted file mode 100644 index 0476e840..00000000 --- a/web/frontend/dist/assets/UserActivity-DJXmTB_5.js +++ /dev/null @@ -1 +0,0 @@ -import{d as F,r as v,L as E,g as S,z as L,c as i,o as r,a as t,i as P,n as g,h as _,p as y,D as k,F as T,s as A,t as n}from"./index-myMLoUzQ.js";const U={class:"space-y-6 max-w-6xl mx-auto"},z={class:"flex flex-wrap justify-between items-start gap-4"},H={class:"flex items-center gap-2"},R=["disabled"],J={class:"flex flex-wrap gap-3 items-center"},q={class:"form-control"},G=["value"],I={class:"form-control"},K={class:"form-control"},O={key:0,class:"ml-2"},Q={key:0,class:"flex justify-center py-12"},W={key:1,class:"alert alert-error"},X={key:2,class:"text-center py-12 text-base-content/60"},Y={key:3,class:"card bg-base-100 shadow-sm"},Z={class:"overflow-x-auto"},tt={class:"table table-sm"},st=["onClick"],et=["title"],ot={class:"text-xs"},lt={class:"text-sm"},nt={class:"text-right"},at={class:"text-xs text-base-content/70"},it={class:"flex justify-between items-center p-4 border-t border-base-300"},rt={class:"text-sm text-base-content/60"},ut={class:"join"},dt=["disabled"],ct={class:"join-item btn btn-sm btn-active"},vt=["disabled"],mt={class:"modal-box max-w-2xl"},pt={key:0,class:"space-y-3"},bt={class:"grid grid-cols-2 gap-3 text-sm"},ft={class:"font-medium"},gt={class:"font-medium"},xt={class:"font-medium"},ht={key:0,class:"mt-4"},_t={class:"bg-base-200 p-3 rounded-lg text-xs mt-1 overflow-x-auto"},yt={class:"modal-action"},M=25,Ct=F({__name:"UserActivity",setup(kt){const m=v(!1),b=v(""),d=v([]),x=v(0),c=v(1),a=v(null),w=v([]),l=E({server:"",status:"",type:""}),$=S(()=>!!(l.server||l.status||l.type)),j=S(()=>d.value.lengthh.name),u=(s.shared||[]).map(h=>h.name);w.value=[...e,...u]}}catch{}}function f(){c.value=1,p()}function V(){l.server="",l.status="",l.type="",f()}function C(o){c.value=o,p()}function B(o){a.value=o}return L(()=>{p(),N()}),(o,s)=>(r(),i("div",U,[t("div",z,[s[9]||(s[9]=t("div",null,[t("h1",{class:"text-2xl font-bold"},"My Activity"),t("p",{class:"text-base-content/70 mt-1"},"Tool calls and activity for your sessions")],-1)),t("div",H,[t("button",{onClick:p,class:"btn btn-sm btn-ghost",disabled:m.value},[(r(),i("svg",{class:g(["w-4 h-4",{"animate-spin":m.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...s[7]||(s[7]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2)),s[8]||(s[8]=P(" Refresh ",-1))],8,R)])]),t("div",J,[t("div",q,[y(t("select",{"onUpdate:modelValue":s[0]||(s[0]=e=>l.server=e),class:"select select-bordered select-sm",onChange:f},[s[10]||(s[10]=t("option",{value:""},"All Servers",-1)),(r(!0),i(T,null,A(w.value,e=>(r(),i("option",{key:e,value:e},n(e),9,G))),128))],544),[[k,l.server]])]),t("div",I,[y(t("select",{"onUpdate:modelValue":s[1]||(s[1]=e=>l.status=e),class:"select select-bordered select-sm",onChange:f},[...s[11]||(s[11]=[t("option",{value:""},"All Statuses",-1),t("option",{value:"success"},"Success",-1),t("option",{value:"error"},"Error",-1)])],544),[[k,l.status]])]),t("div",K,[y(t("select",{"onUpdate:modelValue":s[2]||(s[2]=e=>l.type=e),class:"select select-bordered select-sm",onChange:f},[...s[12]||(s[12]=[t("option",{value:""},"All Types",-1),t("option",{value:"tool_call"},"Tool Calls",-1),t("option",{value:"connection"},"Connections",-1),t("option",{value:"auth"},"Authentication",-1)])],544),[[k,l.type]])]),$.value?(r(),i("div",O,[t("button",{class:"btn btn-ghost btn-xs",onClick:V},"Clear Filters")])):_("",!0)]),m.value&&d.value.length===0?(r(),i("div",Q,[...s[13]||(s[13]=[t("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):b.value?(r(),i("div",W,[s[14]||(s[14]=t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),t("span",null,n(b.value),1),t("button",{class:"btn btn-sm",onClick:p},"Try Again")])):d.value.length===0?(r(),i("div",X,[...s[15]||(s[15]=[t("svg",{class:"w-16 h-16 mx-auto mb-4 opacity-30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"})],-1),t("p",{class:"text-lg font-medium"},"No activity yet",-1),t("p",{class:"text-sm mt-1"},"Activity will appear here once you start using tools",-1)])])):(r(),i("div",Y,[t("div",Z,[t("table",tt,[s[16]||(s[16]=t("thead",null,[t("tr",null,[t("th",null,"Time"),t("th",null,"Tool"),t("th",null,"Server"),t("th",null,"Status"),t("th",{class:"text-right"},"Duration")])],-1)),t("tbody",null,[(r(!0),i(T,null,A(d.value,e=>(r(),i("tr",{key:e.id,class:"hover cursor-pointer",onClick:u=>B(e)},[t("td",null,[t("span",{class:"text-xs",title:e.timestamp},n(D(e.timestamp)),9,et)]),t("td",null,[t("code",ot,n(e.tool_name||e.type),1)]),t("td",null,[t("span",lt,n(e.server_name||"-"),1)]),t("td",null,[t("span",{class:g(["badge badge-sm",e.status==="success"?"badge-success":e.status==="error"?"badge-error":"badge-ghost"])},n(e.status),3)]),t("td",nt,[t("span",at,n(e.duration_ms?`${e.duration_ms}ms`:"-"),1)])],8,st))),128))])])]),t("div",it,[t("div",rt," Showing "+n(d.value.length)+" of "+n(x.value)+" activities ",1),t("div",ut,[t("button",{class:"join-item btn btn-sm",disabled:c.value<=1,onClick:s[3]||(s[3]=e=>C(c.value-1))}," Previous ",8,dt),t("button",ct,n(c.value),1),t("button",{class:"join-item btn btn-sm",disabled:!j.value,onClick:s[4]||(s[4]=e=>C(c.value+1))}," Next ",8,vt)])])])),t("dialog",{class:g(["modal",{"modal-open":!!a.value}])},[t("div",mt,[s[24]||(s[24]=t("h3",{class:"font-bold text-lg mb-4"},"Activity Details",-1)),a.value?(r(),i("div",pt,[t("div",bt,[t("div",null,[s[17]||(s[17]=t("span",{class:"text-base-content/50"},"Type",-1)),t("p",ft,n(a.value.type),1)]),t("div",null,[s[18]||(s[18]=t("span",{class:"text-base-content/50"},"Status",-1)),t("p",null,[t("span",{class:g(["badge badge-sm",a.value.status==="success"?"badge-success":"badge-error"])},n(a.value.status),3)])]),t("div",null,[s[19]||(s[19]=t("span",{class:"text-base-content/50"},"Server",-1)),t("p",gt,n(a.value.server_name||"-"),1)]),t("div",null,[s[20]||(s[20]=t("span",{class:"text-base-content/50"},"Tool",-1)),t("p",xt,n(a.value.tool_name||"-"),1)]),t("div",null,[s[21]||(s[21]=t("span",{class:"text-base-content/50"},"Time",-1)),t("p",null,n(new Date(a.value.timestamp).toLocaleString()),1)]),t("div",null,[s[22]||(s[22]=t("span",{class:"text-base-content/50"},"Duration",-1)),t("p",null,n(a.value.duration_ms?`${a.value.duration_ms}ms`:"-"),1)])]),a.value.error?(r(),i("div",ht,[s[23]||(s[23]=t("span",{class:"text-base-content/50 text-sm"},"Error",-1)),t("pre",_t,n(a.value.error),1)])):_("",!0)])):_("",!0),t("div",yt,[t("button",{class:"btn",onClick:s[5]||(s[5]=e=>a.value=null)},"Close")])]),t("form",{method:"dialog",class:"modal-backdrop",onClick:s[6]||(s[6]=e=>a.value=null)})],2)]))}});export{Ct as default}; diff --git a/web/frontend/dist/assets/UserDiagnostics-D1TBjGe7.js b/web/frontend/dist/assets/UserDiagnostics-D1TBjGe7.js deleted file mode 100644 index f7070124..00000000 --- a/web/frontend/dist/assets/UserDiagnostics-D1TBjGe7.js +++ /dev/null @@ -1 +0,0 @@ -import{d as x,r as _,g as w,z as k,c as n,o,a as e,i as C,n as u,t as l,F as T,s as S,h}from"./index-myMLoUzQ.js";const D={class:"space-y-6 max-w-6xl mx-auto"},j={class:"flex justify-between items-center"},A=["disabled"],B={class:"stats shadow bg-base-100 w-full"},U={class:"stat"},$={class:"stat-value"},E={class:"stat"},M={class:"stat-value text-success"},N={class:"stat"},P={class:"stat-value text-warning"},R={class:"stat"},z={class:"stat-value text-error"},H={key:0,class:"flex justify-center py-12"},L={key:1,class:"alert alert-error"},V={key:2,class:"text-center py-12 text-base-content/60"},F={key:3,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},I={class:"card-body p-4"},O={class:"flex items-center justify-between mb-2"},Y={class:"font-semibold truncate"},q={class:"flex items-center gap-2 mb-3"},G={key:0,class:"text-sm text-base-content/60 mb-2"},J={class:"flex flex-wrap gap-2 mt-auto"},K={class:"badge badge-outline badge-xs"},Q={key:0,class:"badge badge-outline badge-xs badge-success"},W={key:1,class:"badge badge-outline badge-xs badge-error"},X={key:2,class:"badge badge-outline badge-xs"},Z={key:1,class:"mt-3 text-xs text-base-content/50"},ee={key:2,class:"mt-2"},te=["onClick"],oe=x({__name:"UserDiagnostics",setup(se){const d=_(!1),c=_(""),i=_([]),g=w(()=>{const t={healthy:0,degraded:0,unhealthy:0};for(const s of i.value)s.health_level==="healthy"?t.healthy++:s.health_level==="degraded"?t.degraded++:t.unhealthy++;return t});function m(t){return t?t.charAt(0).toUpperCase()+t.slice(1):""}function b(t){switch(t){case"healthy":return"bg-success";case"degraded":return"bg-warning";case"unhealthy":return"bg-error";default:return"bg-base-content/30"}}function v(t){switch(t){case"healthy":return"text-success";case"degraded":return"text-warning";case"unhealthy":return"text-error";default:return""}}function p(t){return t==="shared"?"badge-info":"badge-primary"}function f(t){switch(t){case"login":return"Login";case"restart":return"Restart";case"enable":return"Enable";case"approve":return"Approve";case"view_logs":return"View Logs";case"set_secret":return"Set Secret";case"configure":return"Configure";default:return t}}async function y(t){try{t.health_action==="login"?await fetch(`/api/v1/user/servers/${encodeURIComponent(t.name)}/login`,{method:"POST",credentials:"include"}):t.health_action==="restart"?await fetch(`/api/v1/user/servers/${encodeURIComponent(t.name)}/restart`,{method:"POST",credentials:"include"}):t.health_action==="enable"&&await fetch(`/api/v1/user/servers/${encodeURIComponent(t.name)}/enable`,{method:"POST",credentials:"include"}),setTimeout(r,1e3)}catch(s){c.value=s instanceof Error?s.message:"Action failed"}}async function r(){d.value=!0,c.value="";try{const t=await fetch("/api/v1/user/diagnostics",{credentials:"include"});if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);const s=await t.json();i.value=(s.servers||[]).map(a=>({...a,owner_type:a.ownership||"shared",health_level:a.connected?"healthy":a.enabled?"unhealthy":"degraded",health_summary:a.connected?"Connected":a.enabled?"Not connected":"Disabled",health_detail:"",health_action:""}))}catch(t){c.value=t instanceof Error?t.message:"Failed to load diagnostics"}finally{d.value=!1}}return k(()=>{r()}),(t,s)=>(o(),n("div",D,[e("div",j,[s[2]||(s[2]=e("div",null,[e("h1",{class:"text-2xl font-bold"},"Diagnostics"),e("p",{class:"text-base-content/70 mt-1"},"Server health for your accessible MCP servers")],-1)),e("button",{onClick:r,class:"btn btn-sm btn-ghost",disabled:d.value},[(o(),n("svg",{class:u(["w-4 h-4",{"animate-spin":d.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...s[0]||(s[0]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2)),s[1]||(s[1]=C(" Refresh ",-1))],8,A)]),e("div",B,[e("div",U,[s[3]||(s[3]=e("div",{class:"stat-title"},"Total Servers",-1)),e("div",$,l(i.value.length),1)]),e("div",E,[s[4]||(s[4]=e("div",{class:"stat-title"},"Healthy",-1)),e("div",M,l(g.value.healthy),1)]),e("div",N,[s[5]||(s[5]=e("div",{class:"stat-title"},"Degraded",-1)),e("div",P,l(g.value.degraded),1)]),e("div",R,[s[6]||(s[6]=e("div",{class:"stat-title"},"Unhealthy",-1)),e("div",z,l(g.value.unhealthy),1)])]),d.value&&i.value.length===0?(o(),n("div",H,[...s[7]||(s[7]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):c.value?(o(),n("div",L,[s[8]||(s[8]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,l(c.value),1),e("button",{class:"btn btn-sm",onClick:r},"Try Again")])):i.value.length===0?(o(),n("div",V,[...s[9]||(s[9]=[e("p",{class:"text-lg font-medium"},"No servers found",-1),e("p",{class:"text-sm mt-1"},"You don't have any accessible servers yet",-1)])])):(o(),n("div",F,[(o(!0),n(T,null,S(i.value,a=>(o(),n("div",{key:a.name,class:"card bg-base-100 shadow-sm"},[e("div",I,[e("div",O,[e("h3",Y,l(a.name),1),e("span",{class:u(["badge badge-sm",p(a.owner_type)])},l(a.owner_type),3)]),e("div",q,[e("div",{class:u(["w-3 h-3 rounded-full",b(a.health_level)])},null,2),e("span",{class:u(["text-sm font-medium",v(a.health_level)])},l(m(a.health_level)),3)]),a.health_summary?(o(),n("p",G,l(a.health_summary),1)):h("",!0),e("div",J,[e("span",K,l(a.protocol),1),a.connected?(o(),n("span",Q,"connected")):(o(),n("span",W,"disconnected")),a.tool_count>0?(o(),n("span",X,l(a.tool_count)+" tools",1)):h("",!0)]),a.health_detail?(o(),n("div",Z,l(a.health_detail),1)):h("",!0),a.health_action?(o(),n("div",ee,[e("button",{class:"btn btn-xs btn-outline btn-primary",onClick:ae=>y(a)},l(f(a.health_action)),9,te)])):h("",!0)])]))),128))]))]))}});export{oe as default}; diff --git a/web/frontend/dist/assets/UserServers-CcZ1PmWJ.js b/web/frontend/dist/assets/UserServers-CcZ1PmWJ.js deleted file mode 100644 index d3a51472..00000000 --- a/web/frontend/dist/assets/UserServers-CcZ1PmWJ.js +++ /dev/null @@ -1,3 +0,0 @@ -import{d as L,r as c,L as O,g as q,z,c as n,o as l,a as e,h as b,i as p,F as R,s as U,t as r,M,p as f,v as S,D as I,n as y,Q as J}from"./index-myMLoUzQ.js";const Q={class:"p-4 max-w-6xl mx-auto"},Y={class:"flex justify-between items-center mb-6"},G={class:"mb-8"},K={key:0,class:"flex justify-center py-8"},W={key:1,class:"text-base-content/50 py-8 text-center"},X={key:2,class:"overflow-x-auto"},Z={class:"table table-sm w-full"},ee=["onClick"],te={class:"font-medium"},oe={class:"badge badge-ghost badge-xs"},se={class:"text-xs text-base-content/50 truncate max-w-xs"},ae={class:"text-xs text-base-content/60"},ne={class:"dropdown dropdown-end"},le={tabindex:"0",class:"dropdown-content z-[1] menu p-1 shadow-lg bg-base-100 rounded-lg w-40 border border-base-300"},re=["onClick","disabled"],de={class:"border-t border-base-200 mt-1 pt-1"},ie=["onClick","disabled"],ue={key:0,class:"rounded-lg border border-base-300 bg-base-200/30 py-8 text-center"},ce={key:1,class:"overflow-x-auto"},be={class:"table table-sm w-full"},me=["onClick"],pe={class:"font-medium"},ve={class:"badge badge-ghost badge-xs"},ge={class:"text-xs text-base-content/50 truncate max-w-xs"},he={class:"text-xs text-base-content/60"},xe=["onClick","disabled"],fe={key:0,class:"loading loading-spinner loading-xs"},ye={key:0,class:"alert alert-error mt-4"},we={class:"modal-box"},ke={class:"form-control mb-3"},_e={class:"form-control mb-3"},Se={key:0,class:"form-control mb-3"},Ce={key:1,class:"form-control mb-3"},Te={key:2,class:"form-control mb-3"},Ee={key:3,class:"alert alert-error mb-3 text-sm"},$e={class:"modal-action"},Me=["disabled"],Pe={key:0,class:"loading loading-spinner loading-xs"},je={class:"modal-box"},Ae={class:"py-4"},Re={class:"modal-action"},Ue=["disabled"],Be={key:0,class:"loading loading-spinner loading-xs"},He=L({__name:"UserServers",setup(De){const B=J(),C=c(!0),d=c(""),T=c([]),E=c(!1),v=c(!1),g=c(""),m=c(""),h=c(""),u=c(""),a=O({name:"",url:"",protocol:"http",command:"",args:""}),w=q(()=>({personal:T.value.filter(s=>s.owner_type==="personal"),shared:T.value.filter(s=>s.owner_type==="shared")}));function P(s){if(!s.health)return s.enabled?s.connected?"badge-success":"badge-warning":"badge-ghost";switch(s.health.level){case"healthy":return"badge-success";case"degraded":return"badge-warning";case"unhealthy":return"badge-error";default:return"badge-ghost"}}function j(s){return s.health?s.health.level:s.enabled?s.connected?"connected":"disconnected":"disabled"}function A(s){B.push("/servers/"+encodeURIComponent(s.name))}async function x(){C.value=!0,d.value="";try{const s=await fetch("/api/v1/user/servers",{credentials:"include"});if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);const t=await s.json(),o=(t.personal||[]).map(_=>({..._,owner_type:"personal"})),i=(t.shared||[]).map(_=>({..._,owner_type:"shared",user_enabled:_.user_enabled??null}));T.value=[...o,...i]}catch(s){d.value=s instanceof Error?s.message:"Failed to load servers"}finally{C.value=!1}}function k(s){return s.user_enabled===!1}async function D(s){m.value=s.name,d.value="";try{const t=!!k(s),o=await fetch(`/api/v1/user/servers/${encodeURIComponent(s.name)}/enable`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:t})});if(!o.ok){const i=await o.json().catch(()=>({}));throw new Error(i.message||`HTTP ${o.status}`)}await x()}catch(t){d.value=t instanceof Error?t.message:"Failed to update server"}finally{m.value=""}}async function V(s){m.value=s.name,d.value="";try{const t=s.enabled?"disable":"enable",o=await fetch(`/api/v1/user/servers/${encodeURIComponent(s.name)}/${t}`,{method:"POST",credentials:"include"});if(!o.ok){const i=await o.json().catch(()=>({}));throw new Error(i.error||`HTTP ${o.status}`)}await x()}catch(t){d.value=t instanceof Error?t.message:"Failed to update server"}finally{m.value=""}}function H(s){u.value=s}async function N(){const s=u.value;if(s){h.value=s,d.value="";try{const t=await fetch(`/api/v1/user/servers/${encodeURIComponent(s)}`,{method:"DELETE",credentials:"include"});if(!t.ok){const o=await t.json().catch(()=>({}));throw new Error(o.error||`HTTP ${t.status}`)}u.value="",await x()}catch(t){d.value=t instanceof Error?t.message:"Failed to remove server"}finally{h.value=""}}}async function F(){v.value=!0,g.value="";try{const s={name:a.name,protocol:a.protocol,enabled:!0};a.protocol==="stdio"?(s.command=a.command,a.args.trim()&&(s.args=a.args.trim().split(` -`).map(o=>o.trim()).filter(Boolean))):s.url=a.url;const t=await fetch("/api/v1/user/servers",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!t.ok){const o=await t.json().catch(()=>({}));throw new Error(o.error||`HTTP ${t.status}`)}$(),await x()}catch(s){g.value=s instanceof Error?s.message:"Failed to add server"}finally{v.value=!1}}function $(){E.value=!1,g.value="",a.name="",a.url="",a.protocol="http",a.command="",a.args=""}return z(()=>{x()}),(s,t)=>(l(),n("div",Q,[e("div",Y,[t[12]||(t[12]=e("h1",{class:"text-2xl font-bold"},"My Servers",-1)),e("button",{class:"btn btn-primary btn-sm",onClick:t[0]||(t[0]=o=>E.value=!0)},[...t[11]||(t[11]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),p(" Add Personal Server ",-1)])])]),e("div",G,[t[16]||(t[16]=e("h2",{class:"text-lg font-semibold mb-3"},"Personal Servers",-1)),C.value?(l(),n("div",K,[...t[13]||(t[13]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):w.value.personal.length===0?(l(),n("div",W,' No personal servers yet. Click "Add Personal Server" to get started. ')):(l(),n("div",X,[e("table",Z,[t[15]||(t[15]=e("thead",null,[e("tr",{class:"text-xs uppercase text-base-content/50"},[e("th",null,"Server"),e("th",null,"Protocol"),e("th",null,"Endpoint"),e("th",null,"Status"),e("th",null,"Tools"),e("th",{class:"text-right"},"Actions")])],-1)),e("tbody",null,[(l(!0),n(R,null,U(w.value.personal,o=>(l(),n("tr",{key:o.name,class:"hover:bg-base-200/50 cursor-pointer transition-colors",onClick:i=>A(o)},[e("td",te,r(o.name),1),e("td",null,[e("span",oe,r(o.protocol),1)]),e("td",se,r(o.url||o.command||"β€”"),1),e("td",null,[e("span",{class:y(["badge badge-xs",P(o)])},r(j(o)),3)]),e("td",ae,r(o.tool_count!=null?o.tool_count:"β€”"),1),e("td",{class:"text-right",onClick:t[1]||(t[1]=M(()=>{},["stop"]))},[e("div",ne,[t[14]||(t[14]=e("label",{tabindex:"0",class:"btn btn-ghost btn-xs btn-square"},[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v.01M12 12v.01M12 19v.01"})])],-1)),e("ul",le,[e("li",null,[e("a",{onClick:i=>V(o),disabled:m.value===o.name},r(o.enabled?"Disable":"Enable"),9,re)]),e("li",de,[e("a",{class:"text-error",onClick:i=>H(o.name),disabled:h.value===o.name}," Remove ",8,ie)])])])])],8,ee))),128))])])]))]),e("div",null,[t[20]||(t[20]=e("h2",{class:"text-lg font-semibold mb-3"},"Shared Servers",-1)),w.value.shared.length===0?(l(),n("div",ue,[...t[17]||(t[17]=[e("svg",{class:"w-10 h-10 mx-auto mb-3 text-base-content/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})],-1),e("p",{class:"text-base-content/50 text-sm"},"No shared servers available.",-1),e("p",{class:"text-base-content/40 text-xs mt-1"},"Your administrator can share servers from the Server Management page.",-1)])])):(l(),n("div",ce,[e("table",be,[t[19]||(t[19]=e("thead",null,[e("tr",{class:"text-xs uppercase text-base-content/50"},[e("th",null,"Server"),e("th",null,"Protocol"),e("th",null,"Endpoint"),e("th",null,"Status"),e("th",null,"Tools"),e("th",{class:"text-right"},"Actions")])],-1)),e("tbody",null,[(l(!0),n(R,null,U(w.value.shared,o=>(l(),n("tr",{key:o.name,class:y(["hover:bg-base-200/50 cursor-pointer transition-colors",{"opacity-50":k(o)}]),onClick:i=>A(o)},[e("td",pe,[p(r(o.name)+" ",1),t[18]||(t[18]=e("span",{class:"badge badge-info badge-xs ml-1"},"shared",-1))]),e("td",null,[e("span",ve,r(o.protocol),1)]),e("td",ge,r(o.url||o.command||"β€”"),1),e("td",null,[e("span",{class:y(["badge badge-xs",P(o)])},r(k(o)?"disabled by you":j(o)),3)]),e("td",he,r(o.tool_count!=null?o.tool_count:"β€”"),1),e("td",{class:"text-right",onClick:t[2]||(t[2]=M(()=>{},["stop"]))},[e("button",{class:"btn btn-ghost btn-xs",onClick:i=>D(o),disabled:m.value===o.name},[m.value===o.name?(l(),n("span",fe)):b("",!0),p(" "+r(k(o)?"Enable":"Disable"),1)],8,xe)])],10,me))),128))])])]))]),d.value?(l(),n("div",ye,[t[21]||(t[21]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,r(d.value),1),e("button",{class:"btn btn-ghost btn-xs",onClick:t[3]||(t[3]=o=>d.value="")},"Dismiss")])):b("",!0),e("dialog",{class:y(["modal",{"modal-open":E.value}])},[e("div",we,[t[28]||(t[28]=e("h3",{class:"font-bold text-lg mb-4"},"Add Personal Server",-1)),e("form",{onSubmit:M(F,["prevent"])},[e("div",ke,[t[22]||(t[22]=e("label",{class:"label"},[e("span",{class:"label-text"},"Name")],-1)),f(e("input",{"onUpdate:modelValue":t[4]||(t[4]=o=>a.name=o),type:"text",class:"input input-bordered",required:"",placeholder:"my-server"},null,512),[[S,a.name]])]),e("div",_e,[t[24]||(t[24]=e("label",{class:"label"},[e("span",{class:"label-text"},"Protocol")],-1)),f(e("select",{"onUpdate:modelValue":t[5]||(t[5]=o=>a.protocol=o),class:"select select-bordered"},[...t[23]||(t[23]=[e("option",{value:"http"},"HTTP",-1),e("option",{value:"sse"},"SSE",-1),e("option",{value:"streamable-http"},"Streamable HTTP",-1),e("option",{value:"stdio"},"stdio",-1)])],512),[[I,a.protocol]])]),a.protocol!=="stdio"?(l(),n("div",Se,[t[25]||(t[25]=e("label",{class:"label"},[e("span",{class:"label-text"},"URL")],-1)),f(e("input",{"onUpdate:modelValue":t[6]||(t[6]=o=>a.url=o),type:"text",class:"input input-bordered",placeholder:"https://...",required:""},null,512),[[S,a.url]])])):b("",!0),a.protocol==="stdio"?(l(),n("div",Ce,[t[26]||(t[26]=e("label",{class:"label"},[e("span",{class:"label-text"},"Command")],-1)),f(e("input",{"onUpdate:modelValue":t[7]||(t[7]=o=>a.command=o),type:"text",class:"input input-bordered",placeholder:"npx",required:""},null,512),[[S,a.command]])])):b("",!0),a.protocol==="stdio"?(l(),n("div",Te,[t[27]||(t[27]=e("label",{class:"label"},[e("span",{class:"label-text"},"Arguments (one per line)")],-1)),f(e("textarea",{"onUpdate:modelValue":t[8]||(t[8]=o=>a.args=o),class:"textarea textarea-bordered",placeholder:`@modelcontextprotocol/server-filesystem -/path/to/dir`,rows:"3"},null,512),[[S,a.args]])])):b("",!0),g.value?(l(),n("div",Ee,r(g.value),1)):b("",!0),e("div",$e,[e("button",{type:"button",class:"btn",onClick:$},"Cancel"),e("button",{type:"submit",class:"btn btn-primary",disabled:v.value},[v.value?(l(),n("span",Pe)):b("",!0),p(" "+r(v.value?"Adding...":"Add Server"),1)],8,Me)])],32)]),e("form",{method:"dialog",class:"modal-backdrop",onClick:$})],2),e("dialog",{class:y(["modal",{"modal-open":!!u.value}])},[e("div",je,[t[32]||(t[32]=e("h3",{class:"font-bold text-lg"},"Remove Server",-1)),e("p",Ae,[t[29]||(t[29]=p("Are you sure you want to remove ",-1)),e("strong",null,r(u.value),1),t[30]||(t[30]=p("? This action cannot be undone.",-1))]),e("div",Re,[e("button",{class:"btn",onClick:t[9]||(t[9]=o=>u.value="")},"Cancel"),e("button",{class:"btn btn-error",onClick:N,disabled:h.value===u.value},[h.value===u.value?(l(),n("span",Be)):b("",!0),t[31]||(t[31]=p(" Remove ",-1))],8,Ue)])]),e("form",{method:"dialog",class:"modal-backdrop",onClick:t[10]||(t[10]=o=>u.value="")})],2)]))}});export{He as default}; diff --git a/web/frontend/dist/assets/UserTokens-IkJLKSRQ.js b/web/frontend/dist/assets/UserTokens-IkJLKSRQ.js deleted file mode 100644 index 02870538..00000000 --- a/web/frontend/dist/assets/UserTokens-IkJLKSRQ.js +++ /dev/null @@ -1 +0,0 @@ -import{d as q,r as d,g as H,z as J,c as o,o as l,a as e,h,i as E,t as i,n as p,F as T,s as S,p as y,v as Y,N as M,D as Z}from"./index-myMLoUzQ.js";const G={class:"p-4 max-w-6xl mx-auto"},K={class:"flex justify-between items-center mb-6"},Q={class:"flex gap-2"},X=["disabled"],ee={class:"grid grid-cols-3 gap-3 mb-6"},se={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},te={class:"stat-value text-lg"},ae={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},oe={class:"stat-value text-lg text-success"},le={class:"stat bg-base-100 rounded-lg shadow-sm p-3"},ne={class:"stat-value text-lg text-warning"},re={key:0,class:"alert alert-warning shadow-lg mb-6"},ie={class:"flex-1"},de={class:"flex items-center gap-2"},ce={class:"text-sm bg-neutral text-neutral-content px-3 py-2 rounded font-mono break-all"},ue={key:1,class:"flex justify-center py-8"},ve={key:2,class:"alert alert-error"},me={class:"text-sm"},pe={key:3,class:"rounded-lg border border-base-300 bg-base-200/30 py-12 text-center"},be={key:4,class:"overflow-x-auto"},xe={class:"table table-sm w-full"},he={class:"font-medium"},ge={class:"text-xs bg-base-200 px-1.5 py-0.5 rounded"},ke={class:"flex flex-wrap gap-1"},fe={class:"flex flex-wrap gap-1"},we={key:0,class:"text-xs"},ye={key:1,class:"text-base-content/40 text-xs"},_e={key:0,class:"badge badge-error badge-xs"},Ce={key:1,class:"badge badge-warning badge-xs"},Te={key:2,class:"badge badge-success badge-xs"},Se={class:"text-right"},De={class:"dropdown dropdown-end"},Ae={tabindex:"0",class:"dropdown-content z-[1] menu p-1 shadow-lg bg-base-100 rounded-lg w-40 border border-base-300"},je=["onClick"],Ee={class:"border-t border-base-200 mt-1 pt-1"},Me=["onClick"],$e={class:"modal-box"},Be={class:"space-y-4"},He={class:"form-control"},Re={key:0,class:"label"},Fe={class:"label-text-alt text-error"},Ie={key:1,class:"label"},Ne={class:"form-control"},Le={class:"flex items-center gap-2 cursor-pointer mb-2 px-1"},Pe=["checked"],Ue={key:0,class:"border border-base-300 rounded-lg p-3 max-h-48 overflow-y-auto space-y-1"},Ve={key:0,class:"text-sm text-base-content/50 py-2 text-center"},ze=["value"],Oe={class:"text-sm"},We={key:1,class:"label"},qe={class:"label-text-alt text-error"},Je={class:"form-control"},Ye={class:"flex flex-col gap-2"},Ze={class:"flex items-center gap-2 cursor-pointer"},Ge={class:"flex items-center gap-2 cursor-pointer"},Ke={class:"form-control"},Qe={key:0,class:"alert alert-error mt-4 text-sm"},Xe={class:"modal-action"},es=["disabled"],ss={key:0,class:"loading loading-spinner loading-sm"},os=q({__name:"UserTokens",setup(ts){const _=d(!0),b=d(null),x=d([]),g=d(!1),k=d(""),v=d(null),u=d(!1),D=d(!1),A=d([]),n=d({name:"",allServers:!0,selectedServers:[],permWrite:!1,permDestructive:!1,expiresIn:"720h"}),c=d({}),R=H(()=>x.value.filter(t=>!t.revoked&&!f(t)).length),F=H(()=>x.value.filter(t=>t.revoked||f(t)).length);function f(t){return new Date(t.expires_at)({name:m.name})),r=(s.shared||[]).map(m=>({name:m.name}));A.value=[...a,...r].sort((m,C)=>m.name.localeCompare(C.name))}catch{}}function B(){n.value={name:"",allServers:!0,selectedServers:[],permWrite:!1,permDestructive:!1,expiresIn:"720h"},c.value={},k.value="",P(),D.value=!0}function j(){D.value=!1}async function U(){c.value={},k.value="";const t=n.value.name.trim();if(!t){c.value.name="Token name is required";return}if(!/^[a-zA-Z0-9_-]+$/.test(t)){c.value.name="Only alphanumeric characters, hyphens, and underscores allowed";return}if(!n.value.allServers&&n.value.selectedServers.length===0){c.value.servers='Select at least one server or choose "All servers"';return}g.value=!0;try{const s=n.value.allServers?["*"]:[...n.value.selectedServers],a=["read"];n.value.permWrite&&a.push("write"),n.value.permDestructive&&a.push("destructive");const r=await fetch("/api/v1/user/tokens",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,allowed_servers:s,permissions:a,expires_in:n.value.expiresIn})});if(!r.ok){const C=await r.json().catch(()=>({}));throw new Error(C.error||C.message||`HTTP ${r.status}`)}const m=await r.json();v.value=m.token,u.value=!1,j(),await w()}catch(s){k.value=s.message||"Failed to create token"}finally{g.value=!1}}async function V(t){if(confirm(`Regenerate the secret for token "${t}"? The old secret will stop working immediately.`))try{const s=await fetch(`/api/v1/user/tokens/${encodeURIComponent(t)}/regenerate`,{method:"POST",credentials:"include"});if(!s.ok){const r=await s.json().catch(()=>({}));throw new Error(r.error||r.message||`HTTP ${s.status}`)}const a=await s.json();v.value=a.token,u.value=!1}catch(s){b.value=s.message||"Failed to regenerate token"}}async function z(t){if(confirm(`Revoke token "${t}"? This action cannot be undone.`))try{const s=await fetch(`/api/v1/user/tokens/${encodeURIComponent(t)}`,{method:"DELETE",credentials:"include"});if(!s.ok){const a=await s.json().catch(()=>({}));throw new Error(a.error||a.message||`HTTP ${s.status}`)}await w()}catch(s){b.value=s.message||"Failed to revoke token"}}async function O(){if(v.value)try{await navigator.clipboard.writeText(v.value),u.value=!0,setTimeout(()=>{u.value=!1},2e3)}catch{const t=document.createElement("textarea");t.value=v.value,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t),u.value=!0,setTimeout(()=>{u.value=!1},2e3)}}function W(){v.value=null,u.value=!1}return J(()=>{w()}),(t,s)=>(l(),o("div",G,[e("div",K,[s[7]||(s[7]=e("div",null,[e("h1",{class:"text-2xl font-bold"},"Agent Tokens"),e("p",{class:"text-sm text-base-content/60 mt-1"},"Create tokens for AI agents to act on your behalf")],-1)),e("div",Q,[e("button",{onClick:w,disabled:_.value,class:"btn btn-ghost btn-sm"},[...s[5]||(s[5]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)])],8,X),e("button",{onClick:B,class:"btn btn-primary btn-sm"},[...s[6]||(s[6]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),E(" Create Token ",-1)])])])]),e("div",ee,[e("div",se,[s[8]||(s[8]=e("div",{class:"stat-title text-xs"},"Total Tokens",-1)),e("div",te,i(x.value.length),1)]),e("div",ae,[s[9]||(s[9]=e("div",{class:"stat-title text-xs"},"Active",-1)),e("div",oe,i(R.value),1)]),e("div",le,[s[10]||(s[10]=e("div",{class:"stat-title text-xs"},"Expired / Revoked",-1)),e("div",ne,i(F.value),1)])]),v.value?(l(),o("div",re,[s[13]||(s[13]=e("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),e("div",ie,[s[11]||(s[11]=e("h3",{class:"font-bold"},"Save this token now!",-1)),s[12]||(s[12]=e("p",{class:"text-sm mb-2"},"This token cannot be retrieved again after you dismiss this message.",-1)),e("div",de,[e("code",ce,i(v.value),1),e("button",{onClick:O,class:p(["btn btn-sm btn-neutral shrink-0",{"btn-success":u.value}])},i(u.value?"Copied!":"Copy"),3)])]),e("button",{onClick:W,class:"btn btn-sm btn-ghost shrink-0"},"Dismiss")])):h("",!0),_.value?(l(),o("div",ue,[...s[14]||(s[14]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):b.value?(l(),o("div",ve,[s[16]||(s[16]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",null,[s[15]||(s[15]=e("h3",{class:"font-bold"},"Failed to load tokens",-1)),e("div",me,i(b.value),1)]),e("button",{onClick:w,class:"btn btn-sm"},"Try Again")])):x.value.length===0?(l(),o("div",pe,[s[18]||(s[18]=e("svg",{class:"w-16 h-16 mx-auto mb-4 text-base-content/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"})],-1)),s[19]||(s[19]=e("h3",{class:"text-lg font-semibold mb-2"},"No agent tokens yet",-1)),s[20]||(s[20]=e("p",{class:"text-base-content/50 text-sm mb-4"},"Create scoped tokens for your AI agents and automated workflows.",-1)),e("button",{onClick:B,class:"btn btn-primary btn-sm"},[...s[17]||(s[17]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),E(" Create Your First Token ",-1)])])])):(l(),o("div",be,[e("table",xe,[s[22]||(s[22]=e("thead",null,[e("tr",{class:"text-xs uppercase text-base-content/50"},[e("th",null,"Name"),e("th",null,"Prefix"),e("th",null,"Servers"),e("th",null,"Permissions"),e("th",null,"Expires"),e("th",null,"Last Used"),e("th",null,"Status"),e("th",{class:"text-right"},"Actions")])],-1)),e("tbody",null,[(l(!0),o(T,null,S(x.value,a=>(l(),o("tr",{key:a.name,class:"hover:bg-base-200/50"},[e("td",he,i(a.name),1),e("td",null,[e("code",ge,i(a.token_prefix),1)]),e("td",null,[e("div",ke,[(l(!0),o(T,null,S(a.allowed_servers,r=>(l(),o("span",{key:r,class:"badge badge-outline badge-xs"},i(r),1))),128))])]),e("td",null,[e("div",fe,[(l(!0),o(T,null,S(a.permissions,r=>(l(),o("span",{key:r,class:p(["badge badge-xs",N(r)])},i(r),3))),128))])]),e("td",null,[e("span",{class:p(["text-xs",{"text-warning":I(a),"text-error":f(a)}])},i($(a.expires_at)),3)]),e("td",null,[a.last_used_at?(l(),o("span",we,i($(a.last_used_at)),1)):(l(),o("span",ye,"Never"))]),e("td",null,[a.revoked?(l(),o("span",_e,"Revoked")):f(a)?(l(),o("span",Ce,"Expired")):(l(),o("span",Te,"Active"))]),e("td",Se,[e("div",De,[s[21]||(s[21]=e("label",{tabindex:"0",class:"btn btn-ghost btn-xs btn-square"},[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v.01M12 12v.01M12 19v.01"})])],-1)),e("ul",Ae,[e("li",null,[e("a",{onClick:r=>V(a.name),class:p({"opacity-50 pointer-events-none":a.revoked})}," Regenerate ",10,je)]),e("li",Ee,[e("a",{class:p(["text-error",{"opacity-50 pointer-events-none":a.revoked}]),onClick:r=>z(a.name)}," Revoke ",10,Me)])])])])]))),128))])])])),e("dialog",{class:p(["modal",{"modal-open":D.value}])},[e("div",$e,[s[34]||(s[34]=e("h3",{class:"font-bold text-lg mb-4"},"Create Agent Token",-1)),e("div",Be,[e("div",He,[s[24]||(s[24]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Token Name")],-1)),y(e("input",{"onUpdate:modelValue":s[0]||(s[0]=a=>n.value.name=a),type:"text",placeholder:"e.g., ci-pipeline, dev-agent",class:p(["input input-bordered w-full",{"input-error":c.value.name}])},null,2),[[Y,n.value.name]]),c.value.name?(l(),o("label",Re,[e("span",Fe,i(c.value.name),1)])):(l(),o("label",Ie,[...s[23]||(s[23]=[e("span",{class:"label-text-alt"},"Alphanumeric, hyphens, and underscores only",-1)])]))]),e("div",Ne,[s[27]||(s[27]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Allowed Servers")],-1)),e("label",Le,[e("input",{type:"checkbox",checked:n.value.allServers,onChange:L,class:"checkbox checkbox-sm checkbox-primary"},null,40,Pe),s[25]||(s[25]=e("span",{class:"text-sm font-medium"},"All servers",-1)),s[26]||(s[26]=e("span",{class:"badge badge-ghost badge-xs"},"wildcard",-1))]),n.value.allServers?h("",!0):(l(),o("div",Ue,[A.value.length===0?(l(),o("div",Ve," No servers available ")):h("",!0),(l(!0),o(T,null,S(A.value,a=>(l(),o("label",{key:a.name,class:"flex items-center gap-2 cursor-pointer hover:bg-base-200 rounded px-2 py-1"},[y(e("input",{type:"checkbox",value:a.name,"onUpdate:modelValue":s[1]||(s[1]=r=>n.value.selectedServers=r),class:"checkbox checkbox-sm"},null,8,ze),[[M,n.value.selectedServers]]),e("span",Oe,i(a.name),1)]))),128))])),!n.value.allServers&&c.value.servers?(l(),o("label",We,[e("span",qe,i(c.value.servers),1)])):h("",!0)]),e("div",Je,[s[31]||(s[31]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Permissions")],-1)),e("div",Ye,[s[30]||(s[30]=e("label",{class:"flex items-center gap-2 cursor-not-allowed"},[e("input",{type:"checkbox",checked:"",disabled:"",class:"checkbox checkbox-sm checkbox-info"}),e("span",{class:"text-sm"},"read"),e("span",{class:"badge badge-info badge-xs"},"always included")],-1)),e("label",Ze,[y(e("input",{"onUpdate:modelValue":s[2]||(s[2]=a=>n.value.permWrite=a),type:"checkbox",class:"checkbox checkbox-sm checkbox-warning"},null,512),[[M,n.value.permWrite]]),s[28]||(s[28]=e("span",{class:"text-sm"},"write",-1))]),e("label",Ge,[y(e("input",{"onUpdate:modelValue":s[3]||(s[3]=a=>n.value.permDestructive=a),type:"checkbox",class:"checkbox checkbox-sm checkbox-error"},null,512),[[M,n.value.permDestructive]]),s[29]||(s[29]=e("span",{class:"text-sm"},"destructive",-1))])])]),e("div",Ke,[s[33]||(s[33]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"Expires In")],-1)),y(e("select",{"onUpdate:modelValue":s[4]||(s[4]=a=>n.value.expiresIn=a),class:"select select-bordered w-full"},[...s[32]||(s[32]=[e("option",{value:"168h"},"7 days",-1),e("option",{value:"720h"},"30 days",-1),e("option",{value:"2160h"},"90 days",-1),e("option",{value:"8760h"},"365 days",-1)])],512),[[Z,n.value.expiresIn]])])]),k.value?(l(),o("div",Qe,i(k.value),1)):h("",!0),e("div",Xe,[e("button",{onClick:j,class:"btn"},"Cancel"),e("button",{onClick:U,disabled:g.value,class:"btn btn-primary"},[g.value?(l(),o("span",ss)):h("",!0),E(" "+i(g.value?"Creating...":"Create Token"),1)],8,es)])]),e("form",{method:"dialog",class:"modal-backdrop",onClick:j})],2)]))}});export{os as default}; diff --git a/web/frontend/dist/assets/index-_GHynmUp.css b/web/frontend/dist/assets/index-_GHynmUp.css deleted file mode 100644 index d6dfd8ac..00000000 --- a/web/frontend/dist/assets/index-_GHynmUp.css +++ /dev/null @@ -1 +0,0 @@ -nav[data-v-288e07db] .menu li>a,nav[data-v-288e07db] .menu li>.router-link-active,nav[data-v-288e07db] .menu li>a.router-link-active{transition:padding .15s ease}.toast-enter-active[data-v-b6801221],.toast-leave-active[data-v-b6801221]{transition:all .3s ease}.toast-enter-from[data-v-b6801221]{opacity:0;transform:translate(100%)}.toast-leave-to[data-v-b6801221]{opacity:0;transform:translate(100%) scale(.8)}.toast-move[data-v-b6801221]{transition:transform .3s ease}.modal-backdrop[data-v-54026b07]{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}code[data-v-54026b07]{font-family:Courier New,monospace;font-size:.875rem}.hints-panel-wrapper[data-v-22065a6e]{margin-top:2rem;z-index:10}.hints-collapsed[data-v-22065a6e]{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;background:hsl(var(--b2));border:1px solid hsl(var(--bc) / .15);border-radius:.5rem;cursor:pointer;transition:all .2s ease;box-shadow:0 2px 8px #0000001a}.hints-collapsed[data-v-22065a6e]:hover{background:hsl(var(--b3));border-color:hsl(var(--bc) / .25);box-shadow:0 4px 12px #00000026}.bulb-icon[data-v-22065a6e]{font-size:1.25rem;flex-shrink:0}.hints-title[data-v-22065a6e]{font-weight:600;font-size:.95rem;flex:1;color:hsl(var(--bc) / .85)}.expand-icon[data-v-22065a6e],.collapse-icon[data-v-22065a6e]{width:1.25rem;height:1.25rem;flex-shrink:0;color:hsl(var(--bc) / .6);transition:transform .2s ease}.hints-expanded[data-v-22065a6e]{background:hsl(var(--b2));border:1px solid hsl(var(--bc) / .15);border-radius:.5rem;overflow:hidden;box-shadow:0 4px 16px #00000026;animation:expandHints-22065a6e .3s ease}@keyframes expandHints-22065a6e{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.hints-header[data-v-22065a6e]{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.25rem;cursor:pointer;border-bottom:1px solid hsl(var(--bc) / .1);background:hsl(var(--b3))}.hints-header[data-v-22065a6e]:hover{background:hsl(var(--b2))}.hints-header-left[data-v-22065a6e]{display:flex;align-items:center;gap:.75rem}.hints-content[data-v-22065a6e]{padding:1.5rem;max-height:70vh;overflow-y:auto}.hint-section[data-v-22065a6e]{margin-bottom:2rem;padding-bottom:2rem;border-bottom:1px solid hsl(var(--bc) / .1)}.hint-section[data-v-22065a6e]:last-child{margin-bottom:0;padding-bottom:0;border-bottom:none}.hint-section-header[data-v-22065a6e]{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.hint-icon[data-v-22065a6e]{font-size:1.5rem;flex-shrink:0}.hint-section-title[data-v-22065a6e]{font-size:1.1rem;font-weight:600;color:hsl(var(--bc));margin:0}.hint-description[data-v-22065a6e]{margin:0 0 1rem;color:hsl(var(--bc) / .7);font-size:.9rem;line-height:1.5}.hint-subsection[data-v-22065a6e]{margin-bottom:1.25rem}.hint-subsection[data-v-22065a6e]:last-child{margin-bottom:0}.subsection-title[data-v-22065a6e]{font-size:.95rem;font-weight:600;color:hsl(var(--bc) / .9);margin:0 0 .5rem}.subsection-text[data-v-22065a6e]{margin:0 0 .75rem;color:hsl(var(--bc) / .7);font-size:.875rem;line-height:1.5}.code-block-wrapper[data-v-22065a6e]{background:hsl(var(--b3));border:1px solid hsl(var(--bc) / .1);border-radius:.5rem;overflow:hidden;margin:.5rem 0}.code-block-header[data-v-22065a6e]{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;background:hsl(var(--b2));border-bottom:1px solid hsl(var(--bc) / .1)}.code-language[data-v-22065a6e]{font-size:.75rem;font-family:Courier New,Courier,monospace;color:hsl(var(--bc) / .6);text-transform:uppercase}.copy-button[data-v-22065a6e]{padding:.25rem .5rem;font-size:.75rem;background:transparent;border:1px solid hsl(var(--bc) / .2);border-radius:.25rem;cursor:pointer;color:hsl(var(--bc) / .7);transition:all .2s ease}.copy-button[data-v-22065a6e]:hover{background:hsl(var(--bc) / .1);border-color:hsl(var(--bc) / .3);color:hsl(var(--bc))}.code-block[data-v-22065a6e]{padding:.75rem;margin:0;overflow-x:auto;font-family:Courier New,Courier,monospace;font-size:.8rem;line-height:1.5;color:hsl(var(--bc));background:hsl(var(--b3))}.code-block code[data-v-22065a6e]{font-family:inherit;white-space:pre}.simple-code[data-v-22065a6e]{background:hsl(var(--b3));border:1px solid hsl(var(--bc) / .1);border-radius:.5rem;padding:.75rem;margin:.5rem 0}.simple-code pre[data-v-22065a6e]{margin:0;font-family:Courier New,Courier,monospace;font-size:.8rem;overflow-x:auto}.hint-list[data-v-22065a6e]{margin:.5rem 0;padding-left:1.5rem;color:hsl(var(--bc) / .8);font-size:.875rem;line-height:1.6}.hint-list li[data-v-22065a6e]{margin-bottom:.5rem}.hint-list li[data-v-22065a6e]:last-child{margin-bottom:0}.hints-content[data-v-22065a6e]::-webkit-scrollbar{width:8px}.hints-content[data-v-22065a6e]::-webkit-scrollbar-track{background:hsl(var(--b3));border-radius:.25rem}.hints-content[data-v-22065a6e]::-webkit-scrollbar-thumb{background:hsl(var(--bc) / .3);border-radius:.25rem}.hints-content[data-v-22065a6e]::-webkit-scrollbar-thumb:hover{background:hsl(var(--bc) / .5)}@keyframes hubGlow-a9365f07{0%,to{filter:drop-shadow(0 4px 8px oklch(var(--p) / .15)) drop-shadow(0 2px 4px oklch(var(--p) / .1))}50%{filter:drop-shadow(0 6px 16px oklch(var(--p) / .3)) drop-shadow(0 3px 8px oklch(var(--p) / .15))}}.hub-glow[data-v-a9365f07]{animation:hubGlow-a9365f07 3s ease-in-out infinite}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}}[data-theme=light]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}[data-theme=dark]{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}[data-theme=cupcake]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 15.2344% .017892 200.026556;--sc: 15.787% .020249 356.29965;--ac: 15.8762% .029206 78.618794;--nc: 84.7148% .013247 313.189598;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--p: 76.172% .089459 200.026556;--s: 78.9351% .101246 356.29965;--a: 79.3811% .146032 78.618794;--n: 23.5742% .066235 313.189598;--b1: 97.7882% .00418 56.375637;--b2: 93.9822% .007638 61.449292;--b3: 91.5861% .006811 53.440502;--bc: 23.5742% .066235 313.189598;--rounded-btn: 1.9rem;--tab-border: 2px;--tab-radius: .7rem}[data-theme=bumblebee]{color-scheme:light;--b2: 93% 0 0;--b3: 86% 0 0;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--bc: 20% 0 0;--ac: 16.254% .0314 56.52;--nc: 82.55% .015 281.99;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 89.51% .2132 96.61;--pc: 38.92% .046 96.61;--s: 80.39% .194 70.76;--sc: 39.38% .068 70.76;--a: 81.27% .157 56.52;--n: 12.75% .075 281.99;--b1: 100% 0 0}[data-theme=emerald]{color-scheme:light;--b2: 93% 0 0;--b3: 86% 0 0;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 76.6626% .135433 153.450024;--pc: 33.3872% .040618 162.240129;--s: 61.3028% .202368 261.294233;--sc: 100% 0 0;--a: 72.7725% .149783 33.200363;--ac: 0% 0 0;--n: 35.5192% .032071 262.988584;--nc: 98.4625% .001706 247.838921;--b1: 100% 0 0;--bc: 35.5192% .032071 262.988584;--animation-btn: 0;--animation-input: 0;--btn-focus-scale: 1}[data-theme=corporate]{color-scheme:light;--b2: 93% 0 0;--b3: 86% 0 0;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 12.078% .0456 269.1;--sc: 13.0739% .010951 256.688055;--ac: 15.3934% .022799 163.57888;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--border-btn: 1px;--tab-border: 1px;--p: 60.39% .228 269.1;--s: 65.3694% .054756 256.688055;--a: 76.9669% .113994 163.57888;--n: 22.3899% .031305 278.07229;--nc: 95.8796% .008588 247.915135;--b1: 100% 0 0;--bc: 22.3899% .031305 278.07229;--rounded-box: .25rem;--rounded-btn: .125rem;--rounded-badge: .125rem;--tab-radius: .25rem;--animation-btn: 0;--animation-input: 0;--btn-focus-scale: 1}[data-theme=synthwave]{color-scheme:dark;--b2: 20.2941% .076211 287.835609;--b3: 18.7665% .070475 287.835609;--pc: 14.4421% .031903 342.009383;--sc: 15.6543% .02362 227.382405;--ac: 17.608% .0412 93.72;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 72.2105% .159514 342.009383;--s: 78.2714% .118101 227.382405;--a: 88.04% .206 93.72;--n: 25.5554% .103537 286.507967;--nc: 97.9365% .00819 301.358346;--b1: 21.8216% .081948 287.835609;--bc: 97.9365% .00819 301.358346;--in: 76.5197% .12273 231.831603;--inc: 23.5017% .096418 290.329844;--su: 86.0572% .115038 178.624677;--suc: 23.5017% .096418 290.329844;--wa: 85.531% .122117 93.722227;--wac: 23.5017% .096418 290.329844;--er: 73.7005% .121339 32.639257;--erc: 23.5017% .096418 290.329844}[data-theme=retro]{color-scheme:light;--inc: 90.923% .043042 262.880917;--suc: 12.541% .033982 149.213788;--wac: 13.3168% .031484 58.31834;--erc: 13.144% .0398 27.33;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--p: 76.8664% .104092 22.664655;--pc: 26.5104% .006243 .522862;--s: 80.7415% .052534 159.094608;--sc: 26.5104% .006243 .522862;--a: 70.3919% .125455 52.953428;--ac: 26.5104% .006243 .522862;--n: 28.4181% .009519 355.534017;--nc: 92.5604% .025113 89.217311;--b1: 91.6374% .034554 90.51575;--b2: 88.2722% .049418 91.774344;--b3: 84.133% .065952 90.856665;--bc: 26.5104% .006243 .522862;--in: 54.615% .215208 262.880917;--su: 62.7052% .169912 149.213788;--wa: 66.584% .157422 58.31834;--er: 65.72% .199 27.33;--rounded-box: .4rem;--rounded-btn: .4rem;--rounded-badge: .4rem;--tab-radius: .4rem}[data-theme=cyberpunk]{color-scheme:light;--b2: 87.8943% .16647 104.32;--b3: 81.2786% .15394 104.32;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--bc: 18.902% .0358 104.32;--pc: 14.844% .0418 6.35;--sc: 16.666% .0368 204.72;--ac: 14.372% .04352 310.43;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;--p: 74.22% .209 6.35;--s: 83.33% .184 204.72;--a: 71.86% .2176 310.43;--n: 23.04% .065 269.31;--nc: 94.51% .179 104.32;--b1: 94.51% .179 104.32;--rounded-box: 0;--rounded-btn: 0;--rounded-badge: 0;--tab-radius: 0}[data-theme=valentine]{color-scheme:light;--b2: 88.0567% .024834 337.06289;--b3: 81.4288% .022964 337.06289;--pc: 13.7239% .030755 15.066527;--sc: 14.3942% .029258 293.189609;--ac: 14.2537% .014961 197.828857;--inc: 90.923% .043042 262.880917;--suc: 12.541% .033982 149.213788;--wac: 13.3168% .031484 58.31834;--erc: 14.614% .0414 27.33;--rounded-box: 1rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--p: 68.6197% .153774 15.066527;--s: 71.971% .14629 293.189609;--a: 71.2685% .074804 197.828857;--n: 54.6053% .143342 358.004839;--nc: 90.2701% .037202 336.955191;--b1: 94.6846% .026703 337.06289;--bc: 37.3085% .081131 4.606426;--in: 54.615% .215208 262.880917;--su: 62.7052% .169912 149.213788;--wa: 66.584% .157422 58.31834;--er: 73.07% .207 27.33;--rounded-btn: 1.9rem;--tab-radius: .7rem}[data-theme=halloween]{color-scheme:dark;--b2: 23.0416% 0 0;--b3: 21.3072% 0 0;--bc: 84.9552% 0 0;--sc: 89.196% .0496 305.03;--nc: 84.8742% .009322 65.681484;--inc: 90.923% .043042 262.880917;--suc: 12.541% .033982 149.213788;--wac: 13.3168% .031484 58.31834;--erc: 13.144% .0398 27.33;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 77.48% .204 60.62;--pc: 19.6935% .004671 196.779412;--s: 45.98% .248 305.03;--a: 64.8% .223 136.073479;--ac: 0% 0 0;--n: 24.371% .046608 65.681484;--b1: 24.7759% 0 0;--in: 54.615% .215208 262.880917;--su: 62.7052% .169912 149.213788;--wa: 66.584% .157422 58.31834;--er: 65.72% .199 27.33}[data-theme=garden]{color-scheme:light;--b2: 86.4453% .002011 17.197414;--b3: 79.9386% .00186 17.197414;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--sc: 89.699% .022197 355.095988;--ac: 11.2547% .010859 154.390187;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 62.45% .278 3.83636;--pc: 100% 0 0;--s: 48.4952% .110985 355.095988;--a: 56.2735% .054297 154.390187;--n: 24.1559% .049362 89.070594;--nc: 92.9519% .002163 17.197414;--b1: 92.9519% .002163 17.197414;--bc: 16.9617% .001664 17.32068}[data-theme=forest]{color-scheme:dark;--b2: 17.522% .007709 17.911578;--b3: 16.2032% .007129 17.911578;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--bc: 83.7682% .001658 17.911578;--sc: 13.9553% .027077 168.327128;--ac: 14.1257% .02389 185.713193;--nc: 86.1397% .007806 171.364646;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 68.6283% .185567 148.958922;--pc: 0% 0 0;--s: 69.7764% .135385 168.327128;--a: 70.6285% .119451 185.713193;--n: 30.6985% .039032 171.364646;--b1: 18.8409% .00829 17.911578;--rounded-btn: 1.9rem}[data-theme=aqua]{color-scheme:dark;--b2: 45.3464% .118611 261.181672;--b3: 41.9333% .109683 261.181672;--bc: 89.7519% .025508 261.181672;--sc: 12.1365% .02175 309.782946;--ac: 18.6854% .020445 94.555431;--nc: 12.2124% .023402 243.760661;--inc: 90.923% .043042 262.880917;--suc: 12.541% .033982 149.213788;--wac: 13.3168% .031484 58.31834;--erc: 14.79% .038 27.33;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 85.6617% .14498 198.6458;--pc: 40.1249% .068266 197.603872;--s: 60.6827% .108752 309.782946;--a: 93.4269% .102225 94.555431;--n: 61.0622% .117009 243.760661;--b1: 48.7596% .127539 261.181672;--in: 54.615% .215208 262.880917;--su: 62.7052% .169912 149.213788;--wa: 66.584% .157422 58.31834;--er: 73.95% .19 27.33}[data-theme=lofi]{color-scheme:light;--inc: 15.908% .0206 205.9;--suc: 18.026% .0306 164.14;--wac: 17.674% .027 79.94;--erc: 15.732% .03 28.47;--border-btn: 1px;--tab-border: 1px;--p: 15.9066% 0 0;--pc: 100% 0 0;--s: 21.455% .001566 17.278957;--sc: 100% 0 0;--a: 26.8618% 0 0;--ac: 100% 0 0;--n: 0% 0 0;--nc: 100% 0 0;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.268% .001082 17.17934;--bc: 0% 0 0;--in: 79.54% .103 205.9;--su: 90.13% .153 164.14;--wa: 88.37% .135 79.94;--er: 78.66% .15 28.47;--rounded-box: .25rem;--rounded-btn: .125rem;--rounded-badge: .125rem;--tab-radius: .125rem;--animation-btn: 0;--animation-input: 0;--btn-focus-scale: 1}[data-theme=pastel]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--bc: 20% 0 0;--pc: 16.6166% .006979 316.8737;--sc: 17.6153% .009839 8.688364;--ac: 17.8419% .012056 170.923263;--nc: 14.2681% .014702 228.183906;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--p: 83.0828% .034896 316.8737;--s: 88.0763% .049197 8.688364;--a: 89.2096% .06028 170.923263;--n: 71.3406% .07351 228.183906;--b1: 100% 0 0;--b2: 98.4625% .001706 247.838921;--b3: 87.1681% .009339 258.338227;--rounded-btn: 1.9rem;--tab-radius: .7rem}[data-theme=fantasy]{color-scheme:light;--b2: 93% 0 0;--b3: 86% 0 0;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 87.49% .0378 325.02;--sc: 90.784% .0324 241.36;--ac: 15.196% .0408 56.72;--nc: 85.5616% .005919 256.847952;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 37.45% .189 325.02;--s: 53.92% .162 241.36;--a: 75.98% .204 56.72;--n: 27.8078% .029596 256.847952;--b1: 100% 0 0;--bc: 27.8078% .029596 256.847952}[data-theme=wireframe]{color-scheme:light;--bc: 20% 0 0;--pc: 15.6521% 0 0;--sc: 15.6521% 0 0;--ac: 15.6521% 0 0;--nc: 18.8014% 0 0;--inc: 89.0403% .062643 264.052021;--suc: 90.395% .035372 142.495339;--wac: 14.1626% .019994 108.702381;--erc: 12.5591% .051537 29.233885;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;font-family:Chalkboard,comic sans ms,"sans-serif";--p: 78.2604% 0 0;--s: 78.2604% 0 0;--a: 78.2604% 0 0;--n: 94.007% 0 0;--b1: 100% 0 0;--b2: 94.9119% 0 0;--b3: 89.7547% 0 0;--in: 45.2014% .313214 264.052021;--su: 51.9752% .176858 142.495339;--wa: 70.8131% .099969 108.702381;--er: 62.7955% .257683 29.233885;--rounded-box: .2rem;--rounded-btn: .2rem;--rounded-badge: .2rem;--tab-radius: .2rem}[data-theme=black]{color-scheme:dark;--pc: 86.736% 0 0;--sc: 86.736% 0 0;--ac: 86.736% 0 0;--nc: 86.736% 0 0;--inc: 89.0403% .062643 264.052021;--suc: 90.395% .035372 142.495339;--wac: 19.3597% .042201 109.769232;--erc: 12.5591% .051537 29.233885;--border-btn: 1px;--tab-border: 1px;--p: 33.6799% 0 0;--s: 33.6799% 0 0;--a: 33.6799% 0 0;--b1: 0% 0 0;--b2: 19.1251% 0 0;--b3: 26.8618% 0 0;--bc: 87.6096% 0 0;--n: 33.6799% 0 0;--in: 45.2014% .313214 264.052021;--su: 51.9752% .176858 142.495339;--wa: 96.7983% .211006 109.769232;--er: 62.7955% .257683 29.233885;--rounded-box: 0;--rounded-btn: 0;--rounded-badge: 0;--animation-btn: 0;--animation-input: 0;--btn-focus-scale: 1;--tab-radius: 0}[data-theme=luxury]{color-scheme:dark;--pc: 20% 0 0;--sc: 85.5163% .012821 261.069149;--ac: 87.3349% .010348 338.82597;--inc: 15.8122% .024356 237.133883;--suc: 15.6239% .038579 132.154381;--wac: 17.2255% .027305 102.89115;--erc: 14.3506% .035271 22.568916;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 100% 0 0;--s: 27.5815% .064106 261.069149;--a: 36.6744% .051741 338.82597;--n: 24.27% .057015 59.825019;--nc: 93.2033% .089631 90.861683;--b1: 14.0765% .004386 285.822869;--b2: 20.2191% .004211 308.22937;--b3: 29.8961% .003818 308.318612;--bc: 75.6879% .123666 76.890484;--in: 79.0612% .121778 237.133883;--su: 78.1197% .192894 132.154381;--wa: 86.1274% .136524 102.89115;--er: 71.7531% .176357 22.568916}[data-theme=dracula]{color-scheme:dark;--b2: 26.8053% .020556 277.508664;--b3: 24.7877% .019009 277.508664;--pc: 15.0922% .036614 346.812432;--sc: 14.8405% .029709 301.883095;--ac: 16.6785% .024826 66.558491;--nc: 87.8891% .006515 275.524078;--inc: 17.6526% .018676 212.846491;--suc: 17.4199% .043903 148.024881;--wac: 19.1068% .026849 112.757109;--erc: 13.6441% .041266 24.430965;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 75.4611% .18307 346.812432;--s: 74.2023% .148546 301.883095;--a: 83.3927% .124132 66.558491;--n: 39.4456% .032576 275.524078;--b1: 28.8229% .022103 277.508664;--bc: 97.7477% .007913 106.545019;--in: 88.263% .09338 212.846491;--su: 87.0995% .219516 148.024881;--wa: 95.5338% .134246 112.757109;--er: 68.2204% .206328 24.430965}[data-theme=cmyk]{color-scheme:light;--b2: 93% 0 0;--b3: 86% 0 0;--bc: 20% 0 0;--pc: 14.3544% .02666 239.443325;--sc: 12.8953% .040552 359.339283;--ac: 18.8458% .037948 105.306968;--nc: 84.3557% 0 0;--inc: 13.6952% .0189 217.284104;--suc: 89.3898% .032505 321.406278;--wac: 14.2473% .031969 52.023412;--erc: 12.4027% .041677 28.717543;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 71.7722% .133298 239.443325;--s: 64.4766% .202758 359.339283;--a: 94.2289% .189741 105.306968;--n: 21.7787% 0 0;--b1: 100% 0 0;--in: 68.4759% .094499 217.284104;--su: 46.949% .162524 321.406278;--wa: 71.2364% .159843 52.023412;--er: 62.0133% .208385 28.717543}[data-theme=autumn]{color-scheme:light;--b2: 89.1077% 0 0;--b3: 82.4006% 0 0;--bc: 19.1629% 0 0;--pc: 88.1446% .032232 17.530175;--sc: 12.3353% .033821 23.865865;--ac: 14.6851% .018999 60.729616;--nc: 90.8734% .007475 51.902819;--inc: 13.8449% .019596 207.284192;--suc: 12.199% .016032 174.616213;--wac: 14.0163% .032982 56.844303;--erc: 90.614% .0482 24.16;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 40.7232% .16116 17.530175;--s: 61.6763% .169105 23.865865;--a: 73.4253% .094994 60.729616;--n: 54.3672% .037374 51.902819;--b1: 95.8147% 0 0;--in: 69.2245% .097979 207.284192;--su: 60.9951% .080159 174.616213;--wa: 70.0817% .164909 56.844303;--er: 53.07% .241 24.16}[data-theme=business]{color-scheme:dark;--b2: 22.6487% 0 0;--b3: 20.944% 0 0;--bc: 84.8707% 0 0;--pc: 88.3407% .019811 251.473931;--sc: 12.8185% .005481 229.389418;--ac: 13.4542% .033545 35.791525;--nc: 85.4882% .00265 253.041249;--inc: 12.5233% .028702 240.033697;--suc: 14.0454% .018919 156.59611;--wac: 15.4965% .023141 81.519177;--erc: 90.3221% .029356 29.674507;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 41.7036% .099057 251.473931;--s: 64.0924% .027405 229.389418;--a: 67.271% .167726 35.791525;--n: 27.441% .01325 253.041249;--b1: 24.3535% 0 0;--in: 62.6163% .143511 240.033697;--su: 70.2268% .094594 156.59611;--wa: 77.4824% .115704 81.519177;--er: 51.6105% .14678 29.674507;--rounded-box: .25rem;--rounded-btn: .125rem;--rounded-badge: .125rem}[data-theme=acid]{color-scheme:light;--b2: 91.6146% 0 0;--b3: 84.7189% 0 0;--bc: 19.7021% 0 0;--pc: 14.38% .0714 330.759573;--sc: 14.674% .0448 48.250878;--ac: 18.556% .0528 122.962951;--nc: 84.262% .0256 278.68;--inc: 12.144% .0454 252.05;--suc: 17.144% .0532 158.53;--wac: 18.202% .0424 100.5;--erc: 12.968% .0586 29.349188;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--p: 71.9% .357 330.759573;--s: 73.37% .224 48.250878;--a: 92.78% .264 122.962951;--n: 21.31% .128 278.68;--b1: 98.5104% 0 0;--in: 60.72% .227 252.05;--su: 85.72% .266 158.53;--wa: 91.01% .212 100.5;--er: 64.84% .293 29.349188;--rounded-box: 1.25rem;--rounded-btn: 1rem;--rounded-badge: 1rem;--tab-radius: .7rem}[data-theme=lemonade]{color-scheme:light;--b2: 91.8003% .0186 123.72;--b3: 84.8906% .0172 123.72;--bc: 19.742% .004 123.72;--pc: 11.784% .0398 134.6;--sc: 15.55% .0392 111.09;--ac: 17.078% .0402 100.73;--nc: 86.196% .015 108.6;--inc: 17.238% .0094 224.14;--suc: 17.238% .0094 157.85;--wac: 17.238% .0094 102.15;--erc: 17.238% .0094 25.85;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 58.92% .199 134.6;--s: 77.75% .196 111.09;--a: 85.39% .201 100.73;--n: 30.98% .075 108.6;--b1: 98.71% .02 123.72;--in: 86.19% .047 224.14;--su: 86.19% .047 157.85;--wa: 86.19% .047 102.15;--er: 86.19% .047 25.85}[data-theme=night]{color-scheme:dark;--b2: 19.3144% .037037 265.754874;--b3: 17.8606% .034249 265.754874;--bc: 84.1536% .007965 265.754874;--pc: 15.0703% .027798 232.66148;--sc: 13.6023% .031661 276.934902;--ac: 14.4721% .035244 350.048739;--nc: 85.5899% .00737 260.030984;--suc: 15.6904% .026506 181.911977;--wac: 16.6486% .027912 82.95003;--erc: 14.3572% .034051 13.11834;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 75.3513% .138989 232.66148;--s: 68.0113% .158303 276.934902;--a: 72.3603% .176218 350.048739;--n: 27.9495% .036848 260.030984;--b1: 20.7682% .039824 265.754874;--in: 68.4553% .148062 237.25135;--inc: 0% 0 0;--su: 78.452% .132529 181.911977;--wa: 83.2428% .139558 82.95003;--er: 71.7858% .170255 13.11834}[data-theme=coffee]{color-scheme:dark;--b2: 20.1585% .021457 329.708637;--b3: 18.6412% .019842 329.708637;--pc: 14.3993% .024765 62.756393;--sc: 86.893% .00597 199.19444;--ac: 88.5243% .014881 224.389184;--nc: 83.3022% .003149 326.261446;--inc: 15.898% .012774 184.558367;--suc: 14.9445% .014491 131.116276;--wac: 17.6301% .028162 87.722413;--erc: 15.4637% .025644 31.871922;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 71.9967% .123825 62.756393;--s: 34.465% .029849 199.19444;--a: 42.6213% .074405 224.389184;--n: 16.5109% .015743 326.261446;--b1: 21.6758% .023072 329.708637;--bc: 72.3547% .092794 79.129387;--in: 79.4902% .063869 184.558367;--su: 74.7224% .072456 131.116276;--wa: 88.1503% .140812 87.722413;--er: 77.3187% .12822 31.871922}[data-theme=winter]{color-scheme:light;--pc: 91.372% .051 257.57;--sc: 88.5103% .03222 282.339433;--ac: 11.988% .038303 335.171434;--nc: 83.9233% .012704 257.651965;--inc: 17.6255% .017178 214.515264;--suc: 16.0988% .015404 197.823719;--wac: 17.8345% .009167 71.47031;--erc: 14.6185% .022037 20.076293;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 56.86% .255 257.57;--s: 42.5516% .161098 282.339433;--a: 59.9398% .191515 335.171434;--n: 19.6166% .063518 257.651965;--b1: 100% 0 0;--b2: 97.4663% .011947 259.822565;--b3: 93.2686% .016223 262.751375;--bc: 41.8869% .053885 255.824911;--in: 88.1275% .085888 214.515264;--su: 80.4941% .077019 197.823719;--wa: 89.1725% .045833 71.47031;--er: 73.0926% .110185 20.076293}[data-theme=dim]{color-scheme:dark;--pc: 17.2267% .028331 139.549991;--sc: 14.6752% .033181 35.353059;--ac: 14.8459% .026728 311.37924;--inc: 17.2157% .028409 206.182959;--suc: 17.2343% .028437 166.534048;--wac: 17.2327% .028447 94.818679;--erc: 16.4838% .019914 33.756357;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 86.1335% .141656 139.549991;--s: 73.3759% .165904 35.353059;--a: 74.2296% .133641 311.37924;--n: 24.7311% .020483 264.094728;--nc: 82.9011% .031335 222.959324;--b1: 30.8577% .023243 264.149498;--b2: 28.0368% .01983 264.182074;--b3: 26.3469% .018403 262.177739;--bc: 82.9011% .031335 222.959324;--in: 86.0785% .142046 206.182959;--su: 86.1717% .142187 166.534048;--wa: 86.1634% .142236 94.818679;--er: 82.4189% .09957 33.756357}[data-theme=nord]{color-scheme:light;--pc: 11.8872% .015449 254.027774;--sc: 13.9303% .011822 248.687186;--ac: 15.4929% .01245 217.469017;--inc: 13.8414% .012499 332.664922;--suc: 15.3654% .01498 131.063061;--wac: 17.0972% .017847 84.093335;--erc: 12.122% .024119 15.341883;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--p: 59.4359% .077246 254.027774;--s: 69.6516% .059108 248.687186;--a: 77.4643% .062249 217.469017;--n: 45.229% .035214 264.1312;--nc: 89.9258% .016374 262.749256;--b1: 95.1276% .007445 260.731539;--b2: 93.2996% .010389 261.788485;--b3: 89.9258% .016374 262.749256;--bc: 32.4374% .022945 264.182036;--in: 69.2072% .062496 332.664922;--su: 76.827% .074899 131.063061;--wa: 85.4862% .089234 84.093335;--er: 60.61% .120594 15.341883;--rounded-box: .4rem;--rounded-btn: .2rem;--rounded-badge: .4rem;--tab-radius: .2rem}[data-theme=sunset]{color-scheme:dark;--pc: 14.9408% .031656 39.94703;--sc: 14.5075% .035531 2.72034;--ac: 14.2589% .033336 299.844533;--inc: 17.1119% .017054 206.015183;--suc: 17.1122% .017172 144.77874;--wac: 17.1139% .016961 74.427797;--erc: 17.1023% .015778 16.886379;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--p: 74.7039% .158278 39.94703;--s: 72.5375% .177654 2.72034;--a: 71.2947% .166678 299.844533;--n: 26% .019 237.69;--nc: 70% .019 237.69;--b1: 22% .019 237.69;--b2: 20% .019 237.69;--b3: 18% .019 237.69;--bc: 77.3835% .043586 245.096534;--in: 85.5596% .085271 206.015183;--su: 85.5609% .08586 144.77874;--wa: 85.5695% .084806 74.427797;--er: 85.5116% .07889 16.886379;--rounded-box: 1.2rem;--rounded-btn: .8rem;--rounded-badge: .4rem;--tab-radius: .7rem}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"β€œ""”""β€˜""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows) / 10%),0 3px rgb(var(--tw-prose-kbd-shadows) / 10%);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:"`"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body: #374151;--tw-prose-headings: #111827;--tw-prose-lead: #4b5563;--tw-prose-links: #111827;--tw-prose-bold: #111827;--tw-prose-counters: #6b7280;--tw-prose-bullets: #d1d5db;--tw-prose-hr: #e5e7eb;--tw-prose-quotes: #111827;--tw-prose-quote-borders: #e5e7eb;--tw-prose-captions: #6b7280;--tw-prose-kbd: #111827;--tw-prose-kbd-shadows: 17 24 39;--tw-prose-code: #111827;--tw-prose-pre-code: #e5e7eb;--tw-prose-pre-bg: #1f2937;--tw-prose-th-borders: #d1d5db;--tw-prose-td-borders: #e5e7eb;--tw-prose-invert-body: #d1d5db;--tw-prose-invert-headings: #fff;--tw-prose-invert-lead: #9ca3af;--tw-prose-invert-links: #fff;--tw-prose-invert-bold: #fff;--tw-prose-invert-counters: #9ca3af;--tw-prose-invert-bullets: #4b5563;--tw-prose-invert-hr: #374151;--tw-prose-invert-quotes: #f3f4f6;--tw-prose-invert-quote-borders: #374151;--tw-prose-invert-captions: #9ca3af;--tw-prose-invert-kbd: #fff;--tw-prose-invert-kbd-shadows: 255 255 255;--tw-prose-invert-code: #fff;--tw-prose-invert-pre-code: #d1d5db;--tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);--tw-prose-invert-th-borders: #4b5563;--tw-prose-invert-td-borders: #374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box, 1rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width: 640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar{position:relative;display:inline-flex}.avatar>div{display:block;aspect-ratio:1 / 1;overflow:hidden}.avatar img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:-moz-fit-content;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.breadcrumbs{max-width:100%;overflow-x:auto;padding-top:.5rem;padding-bottom:.5rem}.breadcrumbs>ul,.breadcrumbs>ol{display:flex;align-items:center;white-space:nowrap;min-height:-moz-min-content;min-height:min-content}.breadcrumbs>ul>li,.breadcrumbs>ol>li{display:flex;align-items:center}.breadcrumbs>ul>li>a,.breadcrumbs>ol>li>a{display:flex;cursor:pointer;align-items:center}@media (hover:hover){.breadcrumbs>ul>li>a:hover,.breadcrumbs>ol>li>a:hover{text-decoration-line:underline}.link-hover:hover{text-decoration-line:underline}.checkbox-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.checkbox-warning:hover{--tw-border-opacity: 1;border-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-border-opacity)))}.checkbox-info:hover{--tw-border-opacity: 1;border-color:var(--fallback-in,oklch(var(--in)/var(--tw-border-opacity)))}.checkbox-error:hover{--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity)))}.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.radio-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.tab:hover{--tw-text-opacity: 1}.tabs-boxed :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):hover,.tabs-boxed :is(input:checked):hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.hover:hover,.table-zebra tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}.btn-square{height:3rem;width:3rem;padding:0}.btn-circle{height:3rem;width:3rem;border-radius:9999px;padding:0}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;padding:var(--padding-card, 2rem);gap:.5rem}.card-body :where(p){flex-grow:1}.card-actions{display:flex;flex-wrap:wrap;align-items:flex-start;gap:.5rem}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.collapse:not(td):not(tr):not(colgroup){visibility:visible}.collapse{position:relative;display:grid;overflow:hidden;grid-template-rows:max-content 0fr;transition:grid-template-rows .2s;width:100%;border-radius:var(--rounded-box, 1rem)}.collapse-title,.collapse>input[type=checkbox],.collapse>input[type=radio],.collapse-content{grid-column-start:1;grid-row-start:1}.collapse>input[type=checkbox],.collapse>input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){height:100%;width:100%;z-index:1}.collapse-content{visibility:hidden;grid-column-start:1;grid-row-start:2;min-height:0px;transition:visibility .2s;transition:padding .2s ease-out,background-color .2s ease-out;padding-left:1rem;padding-right:1rem;cursor:unset}.collapse[open],.collapse-open,.collapse:focus:not(.collapse-close){grid-template-rows:max-content 1fr}.collapse:not(.collapse-close):has(>input[type=checkbox]:checked),.collapse:not(.collapse-close):has(>input[type=radio]:checked){grid-template-rows:max-content 1fr}.collapse[open]>.collapse-content,.collapse-open>.collapse-content,.collapse:focus:not(.collapse-close)>.collapse-content,.collapse:not(.collapse-close)>input[type=checkbox]:checked~.collapse-content,.collapse:not(.collapse-close)>input[type=radio]:checked~.collapse-content{visibility:visible;min-height:-moz-fit-content;min-height:fit-content}.diff{position:relative;display:grid;width:100%;overflow:hidden;direction:ltr;container-type:inline-size;grid-template-columns:auto 1fr}.divider{display:flex;flex-direction:row;align-items:center;align-self:stretch;margin-top:1rem;margin-bottom:1rem;height:1rem;white-space:nowrap}.divider:before,.divider:after{height:.125rem;width:100%;flex-grow:1;--tw-content: "";content:var(--tw-content);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.drawer{position:relative;display:grid;grid-auto-columns:max-content auto;width:100%}.drawer-content{grid-column-start:2;grid-row-start:1;min-width:0px}.drawer-side{pointer-events:none;position:fixed;inset-inline-start:0px;top:0;grid-column-start:1;grid-row-start:1;display:grid;width:100%;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr));align-items:flex-start;justify-items:start;overflow-x:hidden;overflow-y:hidden;overscroll-behavior:contain;height:100vh;height:100dvh}.drawer-side>.drawer-overlay{position:sticky;top:0;place-self:stretch;cursor:pointer;background-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s}.drawer-side>*{grid-column-start:1;grid-row-start:1}.drawer-side>*:not(.drawer-overlay){transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.3s;will-change:transform;transform:translate(-100%)}[dir=rtl] .drawer-side>*:not(.drawer-overlay){transform:translate(100%)}.drawer-toggle{position:fixed;height:0px;width:0px;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible;overflow-y:auto}.drawer-toggle:checked~.drawer-side>*:not(.drawer-overlay){transform:translate(0)}.drawer-end{grid-auto-columns:auto max-content}.drawer-end>.drawer-toggle~.drawer-content{grid-column-start:1}.drawer-end>.drawer-toggle~.drawer-side{grid-column-start:2;justify-items:end}.drawer-end>.drawer-toggle~.drawer-side>*:not(.drawer-overlay){transform:translate(100%)}[dir=rtl] .drawer-end>.drawer-toggle~.drawer-side>*:not(.drawer-overlay){transform:translate(-100%)}.drawer-end>.drawer-toggle:checked~.drawer-side>*:not(.drawer-overlay){transform:translate(0)}.dropdown{position:relative;display:inline-block}.dropdown>*:not(summary):focus{outline:2px solid transparent;outline-offset:2px}.dropdown .dropdown-content{position:absolute}.dropdown:is(:not(details)) .dropdown-content{visibility:hidden;opacity:0;transform-origin:top;--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s}.dropdown-end .dropdown-content{inset-inline-end:0px}.dropdown-left .dropdown-content{bottom:auto;inset-inline-end:100%;top:0;transform-origin:right}.dropdown-right .dropdown-content{bottom:auto;inset-inline-start:100%;top:0;transform-origin:left}.dropdown-bottom .dropdown-content{bottom:auto;top:100%;transform-origin:top}.dropdown-top .dropdown-content{bottom:100%;top:auto;transform-origin:bottom}.dropdown-end.dropdown-right .dropdown-content,.dropdown-end.dropdown-left .dropdown-content{bottom:0;top:auto}.dropdown.dropdown-open .dropdown-content,.dropdown:not(.dropdown-hover):focus .dropdown-content,.dropdown:focus-within .dropdown-content{visibility:visible;opacity:1}@media (hover: hover){.dropdown.dropdown-hover:hover .dropdown-content{visibility:visible;opacity:1}.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline:hover{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-outline.btn-success:hover{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}}.btn-outline.btn-info:hover{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}}.btn-outline.btn-warning:hover{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}}.btn-outline.btn-error:hover{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.dropdown.dropdown-hover:hover .dropdown-content{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid transparent;outline-offset:2px}@supports (color: oklch(0% 0 0)){:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}.tab[disabled],.tab[disabled]:hover{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}}.dropdown:is(details) summary::-webkit-details-marker{display:none}.file-input{height:3rem;flex-shrink:1;padding-inline-end:1rem;font-size:1rem;line-height:2;line-height:1.5rem;overflow:hidden;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 0;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.file-input::file-selector-button{margin-inline-end:1rem;display:inline-flex;height:100%;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:1em;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;border-style:solid;--tw-border-opacity: 1;border-color:var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));font-weight:600;text-transform:uppercase;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));text-decoration-line:none;border-width:var(--border-btn, 1px);animation:button-pop var(--animation-btn, .25s) ease-out}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.form-control{display:flex;flex-direction:column}.label{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.indicator{position:relative;display:inline-flex;width:-moz-max-content;width:max-content}.indicator :where(.indicator-item){z-index:1;position:absolute;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));white-space:nowrap}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.input-lg[type=number]::-webkit-inner-spin-button{margin-top:-1.5rem;margin-bottom:-1.5rem;margin-inline-end:-1.5rem}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.kbd{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:.5rem;padding-right:.5rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));border-bottom-width:2px;min-height:2.2em;min-width:2.2em}.link{cursor:pointer;text-decoration-line:underline}.link-hover{text-decoration-line:none}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){position:relative;white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem}.menu :where(li:not(.menu-title)>*:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){display:grid;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){position:relative;display:flex;flex-shrink:0;flex-direction:column;flex-wrap:wrap;align-items:stretch}:where(.menu li) .badge{justify-self:end}.mockup-code{position:relative;overflow:hidden;overflow-x:auto;min-width:18rem;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));padding-top:1.25rem;padding-bottom:1.25rem;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));direction:ltr}.mockup-code pre[data-prefix]:before{content:attr(data-prefix);display:inline-block;text-align:right;width:2rem;opacity:.5}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:#00000040 0 25px 50px -12px;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-action{display:flex;margin-top:1.5rem;justify-content:flex-end}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.navbar{display:flex;align-items:center;padding:var(--navbar-padding, .5rem);min-height:4rem;width:100%}:where(.navbar>*:not(script,style)){display:inline-flex;align-items:center}.navbar-start{width:50%;justify-content:flex-start}.navbar-center{flex-shrink:0}.navbar-end{width:50%;justify-content:flex-end}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.radial-progress{position:relative;display:inline-grid;height:var(--size);width:var(--size);place-content:center;border-radius:9999px;background-color:transparent;vertical-align:middle;box-sizing:content-box;--value: 0;--size: 5rem;--thickness: calc(var(--size) / 10)}.radial-progress::-moz-progress-bar{-moz-appearance:none;-webkit-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-value{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress::-webkit-progress-bar{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.radial-progress:before,.radial-progress:after{position:absolute;border-radius:9999px;content:""}.radial-progress:before{top:0;right:0;bottom:0;left:0;background:radial-gradient(farthest-side,currentColor 98%,#0000) top/var(--thickness) var(--thickness) no-repeat,conic-gradient(currentColor calc(var(--value) * 1%),#0000 0);-webkit-mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)));mask:radial-gradient(farthest-side,#0000 calc(99% - var(--thickness)),#000 calc(100% - var(--thickness)))}.radial-progress:after{inset:calc(50% - var(--thickness) / 2);transform:rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%));background-color:currentColor}.radio{flex-shrink:0;--chkbg: var(--bc);height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:9999px;border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.stats{display:inline-grid;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}:where(.stats){grid-auto-flow:column;overflow-x:auto}.stat{display:inline-grid;width:100%;grid-template-columns:repeat(1,1fr);-moz-column-gap:1rem;column-gap:1rem;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .1;padding:1rem 1.5rem}.stat-figure{grid-column-start:2;grid-row:span 3 / span 3;grid-row-start:1;place-self:center;justify-self:end}.stat-title{grid-column-start:1;white-space:nowrap;color:var(--fallback-bc,oklch(var(--bc)/.6))}.stat-value{grid-column-start:1;white-space:nowrap;font-size:2.25rem;line-height:2.5rem;font-weight:800}.stat-desc{grid-column-start:1;white-space:nowrap;font-size:.75rem;line-height:1rem;color:var(--fallback-bc,oklch(var(--bc)/.6))}.steps{display:inline-grid;grid-auto-flow:column;overflow:hidden;overflow-x:auto;counter-reset:step;grid-auto-columns:1fr}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.steps .\!step{display:grid!important;grid-template-columns:repeat(1,minmax(0,1fr))!important;grid-template-columns:auto!important;grid-template-rows:repeat(2,minmax(0,1fr))!important;grid-template-rows:40px 1fr!important;place-items:center!important;text-align:center!important;min-width:4rem!important}.tabs{display:grid;align-items:flex-end}.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])),.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])){border-bottom-color:transparent}.tab{position:relative;grid-row-start:1;display:inline-flex;height:2rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem;--tw-text-opacity: .5;--tab-color: var(--fallback-bc,oklch(var(--bc)/1));--tab-bg: var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));color:var(--tab-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem)}.tab:is(input[type=radio]){width:auto;border-bottom-right-radius:0;border-bottom-left-radius:0}.tab:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}:checked+.tab-content:nth-child(2),:is(.tab-active,[aria-selected=true])+.tab-content:nth-child(2){border-start-start-radius:0px}input.tab:checked+.tab-content,:is(.tab-active,[aria-selected=true])+.tab-content{display:block}.table{position:relative;width:100%;border-radius:var(--rounded-box, 1rem);text-align:left;font-size:.875rem;line-height:1.25rem}.table :where(.table-pin-rows thead tr){position:sticky;top:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-rows tfoot tr){position:sticky;bottom:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-cols tr th){position:sticky;left:0;right:0;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table-zebra tbody tr:nth-child(2n) :where(.table-pin-cols tr th){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.textarea{min-height:3rem;flex-shrink:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.toast{position:fixed;display:flex;min-width:-moz-fit-content;min-width:fit-content;flex-direction:column;white-space:nowrap;gap:.5rem;padding:1rem}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.alert-info{border-color:var(--fallback-in,oklch(var(--in)/.2));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.alert-success{border-color:var(--fallback-su,oklch(var(--su)/.2));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-su,oklch(var(--su)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.alert-warning{border-color:var(--fallback-wa,oklch(var(--wa)/.2));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));--alert-bg: var(--fallback-wa,oklch(var(--wa)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.alert-error{border-color:var(--fallback-er,oklch(var(--er)/.2));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-er,oklch(var(--er)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.avatar-group :where(.avatar){overflow:hidden;border-radius:9999px;border-width:4px;--tw-border-opacity: 1;border-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-border-opacity)))}.badge-neutral{--tw-border-opacity: 1;border-color:var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.badge-primary{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.badge-secondary{--tw-border-opacity: 1;border-color:var(--fallback-s,oklch(var(--s)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.badge-info{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.badge-success{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.badge-warning{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.badge-error{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.badge-ghost{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.badge-outline{border-color:currentColor;--tw-border-opacity: .5;background-color:transparent;color:currentColor}.badge-outline.badge-neutral{--tw-text-opacity: 1;color:var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}.breadcrumbs>ul>li>a:focus,.breadcrumbs>ol>li>a:focus{outline:2px solid transparent;outline-offset:2px}.breadcrumbs>ul>li>a:focus-visible,.breadcrumbs>ol>li>a:focus-visible{outline:2px solid currentColor;outline-offset:2px}.breadcrumbs>ul>li+*:before,.breadcrumbs>ol>li+*:before{content:"";margin-left:.5rem;margin-right:.75rem;display:block;height:.375rem;width:.375rem;--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:.4;border-top:1px solid;border-right:1px solid;background-color:transparent}[dir=rtl] .breadcrumbs>ul>li+*:before,[dir=rtl] .breadcrumbs>ol>li+*:before{--tw-rotate: -135deg}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}.btn-neutral{--btn-color: var(--fallback-n)}.btn-success{--btn-color: var(--fallback-su)}.btn-warning{--btn-color: var(--fallback-wa)}.btn-error{--btn-color: var(--fallback-er)}.prose :where(code):not(:where([class~=not-prose] *,pre *)){background-color:var(--fallback-b3,oklch(var(--b3)/1))}}@supports (color: color-mix(in oklab,black,black)){.btn-active{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b3)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b3)) / var(--tw-border-opacity, 1)) 90%,black)}.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}.btn-neutral{--btn-color: var(--n)}.btn-success{--btn-color: var(--su)}.btn-warning{--btn-color: var(--wa)}.btn-error{--btn-color: var(--er)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn-neutral{--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));outline-color:var(--fallback-n,oklch(var(--n)/1))}.btn-success{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));outline-color:var(--fallback-su,oklch(var(--su)/1))}.btn-warning{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));outline-color:var(--fallback-wa,oklch(var(--wa)/1))}.btn-error{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));outline-color:var(--fallback-er,oklch(var(--er)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-link.btn-active{border-color:transparent;background-color:transparent;text-decoration-line:underline}.btn-outline{border-color:currentColor;background-color:transparent;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-outline.btn-active{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card.\!compact .card-body{padding:1rem!important;font-size:.875rem!important;line-height:1.25rem!important}.card-title{display:flex;align-items:center;gap:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}.checkbox-primary{--chkbg: var(--fallback-p,oklch(var(--p)/1));--chkfg: var(--fallback-pc,oklch(var(--pc)/1));--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.checkbox-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.checkbox-primary:checked,.checkbox-primary[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.checkbox-warning{--chkbg: var(--fallback-wa,oklch(var(--wa)/1));--chkfg: var(--fallback-wac,oklch(var(--wac)/1));--tw-border-opacity: 1;border-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-border-opacity)))}.checkbox-warning:focus-visible{outline-color:var(--fallback-wa,oklch(var(--wa)/1))}.checkbox-warning:checked,.checkbox-warning[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.checkbox-info{--chkbg: var(--fallback-in,oklch(var(--in)/1));--chkfg: var(--fallback-inc,oklch(var(--inc)/1));--tw-border-opacity: 1;border-color:var(--fallback-in,oklch(var(--in)/var(--tw-border-opacity)))}.checkbox-info:focus-visible{outline-color:var(--fallback-in,oklch(var(--in)/1))}.checkbox-info:checked,.checkbox-info[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-in,oklch(var(--in)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.checkbox-error{--chkbg: var(--fallback-er,oklch(var(--er)/1));--chkfg: var(--fallback-erc,oklch(var(--erc)/1));--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity)))}.checkbox-error:focus-visible{outline-color:var(--fallback-er,oklch(var(--er)/1))}.checkbox-error:checked,.checkbox-error[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}details.collapse{width:100%}details.collapse summary{position:relative;display:block;outline:2px solid transparent;outline-offset:2px}details.collapse summary::-webkit-details-marker{display:none}.collapse:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:has(.collapse-title:focus-visible),.collapse:has(>input[type=checkbox]:focus-visible),.collapse:has(>input[type=radio]:focus-visible){outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse-arrow>.collapse-title:after{position:absolute;display:block;height:.5rem;width:.5rem;--tw-translate-y: -100%;--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.15s;transition-duration:.2s;top:1.9rem;inset-inline-end:1.4rem;content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.collapse-plus>.collapse-title:after{position:absolute;display:block;height:.5rem;width:.5rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.3s;top:.9rem;inset-inline-end:1.4rem;content:"+";pointer-events:none}.collapse:not(.collapse-open):not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-open):not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-open):not(.collapse-close)>.collapse-title{cursor:pointer}.collapse:focus:not(.collapse-open):not(.collapse-close):not(.collapse[open])>.collapse-title{cursor:unset}.collapse-title{position:relative}.collapse-title,:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){padding:1rem;padding-inline-end:3rem;min-height:3.75rem;transition:background-color .2s ease-out}.collapse[open]>:where(.collapse-content),.collapse-open>:where(.collapse-content),.collapse:focus:not(.collapse-close)>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input[type=checkbox]:checked~.collapse-content),.collapse:not(.collapse-close)>:where(input[type=radio]:checked~.collapse-content){padding-bottom:1rem;transition:padding .2s ease-out,background-color .2s ease-out}.collapse[open].collapse-arrow>.collapse-title:after,.collapse-open.collapse-arrow>.collapse-title:after,.collapse-arrow:focus:not(.collapse-close)>.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{--tw-translate-y: -50%;--tw-rotate: 225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.collapse[open].collapse-plus>.collapse-title:after,.collapse-open.collapse-plus>.collapse-title:after,.collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{content:"βˆ’"}.divider:not(:empty){gap:1rem}.drawer-toggle:checked~.drawer-side>.drawer-overlay{background-color:#0006}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-style:solid;outline-width:2px;outline-offset:2px}.dropdown.dropdown-open .dropdown-content,.dropdown:focus .dropdown-content,.dropdown:focus-within .dropdown-content{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.file-input-bordered{--tw-border-opacity: .2}.file-input:focus{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.file-input-disabled,.file-input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));--tw-text-opacity: .2}.file-input-disabled::-moz-placeholder,.file-input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.file-input-disabled::placeholder,.file-input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.file-input-disabled::file-selector-button,.file-input[disabled]::file-selector-button{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.label-text{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.label-text-alt{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input-error{--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity)))}.input-error:focus,.input-error:focus-within{--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity)));outline-color:var(--fallback-er,oklch(var(--er)/1))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::-moz-placeholder,.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.join-item:focus{isolation:isolate}.link-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){@media (hover:hover){.link-primary:hover{color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 80%,black)}}}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!loading{pointer-events:none!important;display:inline-block!important;aspect-ratio:1 / 1!important;width:1.5rem!important;background-color:currentColor!important;-webkit-mask-size:100%!important;mask-size:100%!important;-webkit-mask-repeat:no-repeat!important;mask-repeat:no-repeat!important;-webkit-mask-position:center!important;mask-position:center!important;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important;mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}.loading-xs{width:1rem}.loading-sm{width:1.25rem}.loading-md{width:1.5rem}.loading-lg{width:2.5rem}:where(.menu li:empty){--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;margin:.5rem 1rem;height:1px}.menu :where(li ul):before{position:absolute;bottom:.75rem;inset-inline-start:0px;top:.75rem;width:1px;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;content:""}.menu :where(li:not(.menu-title)>*:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn, .5rem);padding:.5rem 1rem;text-align:start;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;text-wrap:balance}:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible{cursor:pointer;background-color:var(--fallback-bc,oklch(var(--bc)/.1));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));outline:2px solid transparent;outline-offset:2px}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>details>summary):after,.menu :where(li>.menu-dropdown-toggle):after{justify-self:end;display:block;margin-top:-.5rem;height:.5rem;width:.5rem;transform:rotate(45deg);transition-property:transform,margin-top;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{transform:rotate(225deg);margin-top:0}.menu-title{padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.4))}.mockup-code:before{content:"";margin-bottom:1rem;display:block;height:.75rem;width:.75rem;border-radius:9999px;opacity:.3;box-shadow:1.4em 0,2.8em 0,4.2em 0}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-phone .display{overflow:hidden;border-radius:40px;margin-top:-25px}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-backdrop{z-index:-1;grid-column-start:1;grid-row-start:1;display:grid;align-self:stretch;justify-self:stretch;color:transparent}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-action>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.modal-action:where([dir=rtl],[dir=rtl] *)>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 1}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress-primary::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)))}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress-primary:indeterminate{--progress-color: var(--fallback-p,oklch(var(--p)/1))}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress-primary::-webkit-progress-value{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)))}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}.radio:focus{box-shadow:none}.radio:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.radio:checked,.radio[aria-checked=true]{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-image:none;animation:radiomark var(--animation-input, .2s) ease-out;box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}.radio-primary{--chkbg: var(--p);--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.radio-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.radio-primary:checked,.radio-primary[aria-checked=true]{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.radio:disabled{cursor:not-allowed;opacity:.2}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}:where(.stats)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}[dir=rtl] .stats>*:not([hidden])~*:not([hidden]){--tw-divide-x-reverse: 1}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .\!step:before{top:0!important;grid-column-start:1!important;grid-row-start:1!important;height:.5rem!important;width:100%!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;--tw-bg-opacity: 1 !important;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))!important;--tw-text-opacity: 1 !important;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))!important;content:""!important;margin-inline-start:-100%!important}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .\!step:after{content:counter(step)!important;counter-increment:step!important;z-index:1!important;position:relative!important;grid-column-start:1!important;grid-row-start:1!important;display:grid!important;height:2rem!important;width:2rem!important;place-items:center!important;place-self:center!important;border-radius:9999px!important;--tw-bg-opacity: 1 !important;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))!important;--tw-text-opacity: 1 !important;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))!important}.steps .step:first-child:before{content:none}.steps .\!step:first-child:before{content:none!important}.steps .step[data-content]:after{content:attr(data-content)}.steps .\!step[data-content]:after{content:attr(data-content)!important}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.steps .step-primary+.step-primary:before,.steps .step-primary:after{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after{--tw-bg-opacity: 1;background-color:var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.steps .step-accent+.step-accent:before,.steps .step-accent:after{--tw-bg-opacity: 1;background-color:var(--fallback-a,oklch(var(--a)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.steps .step-info+.step-info:before{--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)))}.steps .step-info:after{--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.steps .step-success+.step-success:before{--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)))}.steps .step-success:after{--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.steps .step-warning+.step-warning:before{--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)))}.steps .step-warning:after{--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.steps .step-error+.step-error:before{--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)))}.steps .step-error:after{--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tab:is(input:checked){border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 1;--tw-text-opacity: 1}.tab:focus{outline:2px solid transparent;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.tabs-bordered>.tab{border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;border-style:solid;border-bottom-width:calc(var(--tab-border, 1px) + 1px)}.tabs-lifted>.tab{border:var(--tab-border, 1px) solid transparent;border-width:0 0 var(--tab-border, 1px) 0;border-start-start-radius:var(--tab-radius, .5rem);border-start-end-radius:var(--tab-radius, .5rem);border-bottom-color:var(--tab-border-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem);padding-top:var(--tab-border, 1px)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-width:var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);border-inline-start-color:var(--tab-border-color);border-inline-end-color:var(--tab-border-color);border-top-color:var(--tab-border-color);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border, 1px);padding-top:0}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{z-index:1;content:"";display:block;position:absolute;width:calc(100% + var(--tab-radius, .5rem) * 2);height:var(--tab-radius, .5rem);bottom:0;background-size:var(--tab-radius, .5rem);background-position:top left,top right;background-repeat:no-repeat;--tab-grad: calc(69% - var(--tab-border, 1px));--radius-start: radial-gradient( circle at top left, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );--radius-end: radial-gradient( circle at top right, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );background-image:var(--radius-start),var(--radius-end)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:top right}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:top left}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-start);background-position:top left}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:top right}.tabs-lifted>:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled])+.tabs-lifted :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before{background-image:var(--radius-end);background-position:top right}.tabs-boxed{border-radius:var(--rounded-btn, .5rem);--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding:.25rem}.tabs-boxed .tab{border-radius:var(--rounded-btn, .5rem)}.tabs-boxed :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-boxed :is(input:checked){--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.table:where([dir=rtl],[dir=rtl] *){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.table :where(thead tr,tbody tr:not(:last-child),tbody tr:first-child:last-child){border-bottom-width:1px;--tw-border-opacity: 1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.table :where(thead,tfoot){white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.6))}.table :where(tfoot){border-top-width:1px;--tw-border-opacity: 1;border-top-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.textarea-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea-disabled,.textarea:disabled,.textarea[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.textarea-disabled::-moz-placeholder,.textarea:disabled::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.textarea-disabled::placeholder,.textarea:disabled::placeholder,.textarea[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.toast>*{animation:toast-pop .25s ease-out}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle-primary:focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.toggle-primary:checked,.toggle-primary[aria-checked=true]{border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.toggle-success:focus-visible{outline-color:var(--fallback-su,oklch(var(--su)/1))}.toggle-success:checked,.toggle-success[aria-checked=true]{border-color:var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.toggle-warning:focus-visible{outline-color:var(--fallback-wa,oklch(var(--wa)/1))}.toggle-warning:checked,.toggle-warning[aria-checked=true]{border-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.toggle-info:focus-visible{outline-color:var(--fallback-in,oklch(var(--in)/1))}.toggle-info:checked,.toggle-info[aria-checked=true]{border-color:var(--fallback-in,oklch(var(--in)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}:root .prose{--tw-prose-body: var(--fallback-bc,oklch(var(--bc)/.8));--tw-prose-headings: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-lead: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-links: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-bold: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-counters: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-bullets: var(--fallback-bc,oklch(var(--bc)/.5));--tw-prose-hr: var(--fallback-bc,oklch(var(--bc)/.2));--tw-prose-quotes: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-quote-borders: var(--fallback-bc,oklch(var(--bc)/.2));--tw-prose-captions: var(--fallback-bc,oklch(var(--bc)/.5));--tw-prose-code: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-pre-code: var(--fallback-nc,oklch(var(--nc)/1));--tw-prose-pre-bg: var(--fallback-n,oklch(var(--n)/1));--tw-prose-th-borders: var(--fallback-bc,oklch(var(--bc)/.5));--tw-prose-td-borders: var(--fallback-bc,oklch(var(--bc)/.2));--tw-prose-kbd: var(--fallback-bc,oklch(var(--bc)/.8))}.prose :where(code):not(:where([class~=not-prose] *,pre *)){padding:1px 8px;border-radius:var(--rounded-badge);font-weight:initial;background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{display:none}.prose pre code{border-radius:0;padding:0}.prose :where(tbody tr,thead):not(:where([class~=not-prose] *)){border-bottom-color:var(--fallback-bc,oklch(var(--bc)/.2))}.glass,.glass.btn-active{border:none;-webkit-backdrop-filter:blur(var(--glass-blur, 40px));backdrop-filter:blur(var(--glass-blur, 40px));background-color:transparent;background-image:linear-gradient(135deg,rgb(255 255 255 / var(--glass-opacity, 30%)),#0000),linear-gradient(var(--glass-reflex-degree, 100deg),rgb(255 255 255 / var(--glass-reflex-opacity, 10%)) 25%,rgb(0 0 0 / 0%) 25%);box-shadow:0 0 0 1px rgb(255 255 255 / var(--glass-border-opacity, 10%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px rgb(0 0 0 / var(--glass-text-shadow-opacity, 5%))}@media (hover: hover){.glass.btn-active{border:none;-webkit-backdrop-filter:blur(var(--glass-blur, 40px));backdrop-filter:blur(var(--glass-blur, 40px));background-color:transparent;background-image:linear-gradient(135deg,rgb(255 255 255 / var(--glass-opacity, 30%)),#0000),linear-gradient(var(--glass-reflex-degree, 100deg),rgb(255 255 255 / var(--glass-reflex-opacity, 10%)) 25%,rgb(0 0 0 / 0%) 25%);box-shadow:0 0 0 1px rgb(255 255 255 / var(--glass-border-opacity, 10%)) inset,0 0 0 2px #0000000d;text-shadow:0 1px rgb(0 0 0 / var(--glass-text-shadow-opacity, 5%))}}.artboard.phone-1.horizontal,.artboard.phone-1.artboard-horizontal{width:568px;height:320px}.artboard.phone-2.horizontal,.artboard.phone-2.artboard-horizontal{width:667px;height:375px}.artboard.phone-3.horizontal,.artboard.phone-3.artboard-horizontal{width:736px;height:414px}.artboard.phone-4.horizontal,.artboard.phone-4.artboard-horizontal{width:812px;height:375px}.artboard.phone-5.horizontal,.artboard.phone-5.artboard-horizontal{width:896px;height:414px}.artboard.phone-6.horizontal,.artboard.phone-6.artboard-horizontal{width:1024px;height:320px}.badge-xs{height:.75rem;font-size:.75rem;line-height:.75rem;padding-left:.313rem;padding-right:.313rem}.badge-sm{height:1rem;font-size:.75rem;line-height:1rem;padding-left:.438rem;padding-right:.438rem}.badge-lg{height:1.5rem;font-size:1rem;line-height:1.5rem;padding-left:.688rem;padding-right:.688rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-square:where(.btn-md){height:3rem;width:3rem;padding:0}.btn-square:where(.btn-lg){height:4rem;width:4rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-md){height:3rem;width:3rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-lg){height:4rem;width:4rem;border-radius:9999px;padding:0}[type=checkbox].checkbox-xs{height:1rem;width:1rem}[type=checkbox].checkbox-sm{height:1.25rem;width:1.25rem}.drawer-open>.drawer-toggle{display:none}.drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;position:sticky;display:block;width:auto;overscroll-behavior:auto}.drawer-open>.drawer-toggle~.drawer-side>*:not(.drawer-overlay){transform:translate(0)}[dir=rtl] .drawer-open>.drawer-toggle~.drawer-side>*:not(.drawer-overlay){transform:translate(0)}.drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}.drawer-open>.drawer-side{overflow-y:auto}html:has(.drawer-toggle:checked){overflow-y:hidden;scrollbar-gutter:stable}.indicator :where(.indicator-item){bottom:auto;inset-inline-end:0px;inset-inline-start:auto;top:0;--tw-translate-y: -50%;--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item):where([dir=rtl],[dir=rtl] *){--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-start){inset-inline-end:auto;inset-inline-start:0px;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-start):where([dir=rtl],[dir=rtl] *){--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-center){inset-inline-end:50%;inset-inline-start:50%;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-center):where([dir=rtl],[dir=rtl] *){--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-end){inset-inline-end:0px;inset-inline-start:auto;--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-end):where([dir=rtl],[dir=rtl] *){--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-bottom){bottom:0;top:auto;--tw-translate-y: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-middle){bottom:50%;top:50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.indicator :where(.indicator-item.indicator-top){bottom:auto;top:0;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.input-lg{height:4rem;padding-left:1.5rem;padding-right:1.5rem;font-size:1.125rem;line-height:1.75rem;line-height:2}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.kbd-xs{padding-left:.25rem;padding-right:.25rem;font-size:.75rem;line-height:1rem;min-height:1.2em;min-width:1.2em}.menu-horizontal{display:inline-flex;flex-direction:row}.menu-horizontal>li:not(.menu-title)>details>ul{position:absolute}.modal-bottom{place-items:end}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.stats-horizontal{grid-auto-flow:column}.stats-vertical{grid-auto-flow:row}.steps-horizontal .\!step{display:grid!important;grid-template-columns:repeat(1,minmax(0,1fr))!important;grid-template-rows:repeat(2,minmax(0,1fr))!important;place-items:center!important;text-align:center!important}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .\!step{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;grid-template-rows:repeat(1,minmax(0,1fr))!important}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.tabs-md :where(.tab){height:2rem;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem}.tabs-lg :where(.tab){height:3rem;font-size:1.125rem;line-height:1.75rem;line-height:2;--tab-padding: 1.25rem}.tabs-sm :where(.tab){height:1.5rem;font-size:.875rem;line-height:.75rem;--tab-padding: .75rem}.tabs-xs :where(.tab){height:1.25rem;font-size:.75rem;line-height:.75rem;--tab-padding: .5rem}:where(.toast){bottom:0;inset-inline-end:0px;inset-inline-start:auto;top:auto;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-start){inset-inline-end:auto;inset-inline-start:0px;--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-center){inset-inline-end:50%;inset-inline-start:50%;--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-center):where([dir=rtl],[dir=rtl] *){--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-end){inset-inline-end:0px;inset-inline-start:auto;--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-bottom){bottom:0;top:auto;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-middle){bottom:auto;top:50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.toast:where(.toast-top){bottom:auto;top:0;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}[type=checkbox].toggle-sm{--handleoffset: .75rem;height:1.25rem;width:2rem}.tooltip{position:relative;display:inline-block;--tooltip-offset: calc(100% + 1px + var(--tooltip-tail, 0px))}.tooltip:before{position:absolute;pointer-events:none;z-index:1;content:var(--tw-content);--tw-content: attr(data-tip)}.tooltip:before,.tooltip-top:before{transform:translate(-50%);top:auto;left:50%;right:auto;bottom:var(--tooltip-offset)}.tooltip-bottom:before{transform:translate(-50%);top:var(--tooltip-offset);left:50%;right:auto;bottom:auto}.tooltip-left:before{transform:translateY(-50%);top:50%;left:auto;right:var(--tooltip-offset);bottom:auto}.tooltip-right:before{transform:translateY(-50%);top:50%;left:var(--tooltip-offset);right:auto;bottom:auto}.avatar.online:before{content:"";position:absolute;z-index:10;display:block;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));outline-style:solid;outline-width:2px;outline-color:var(--fallback-b1,oklch(var(--b1)/1));width:15%;height:15%;top:7%;right:7%}.avatar.offline:before{content:"";position:absolute;z-index:10;display:block;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));outline-style:solid;outline-width:2px;outline-color:var(--fallback-b1,oklch(var(--b1)/1));width:15%;height:15%;top:7%;right:7%}.card-compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{padding:var(--padding-card, 2rem);font-size:1rem;line-height:1.5rem}.card-normal .card-title{margin-bottom:.75rem}.drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:transparent}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.menu-horizontal>li:not(.menu-title)>details>ul{margin-inline-start:0px;margin-top:1rem;padding-top:.5rem;padding-bottom:.5rem;padding-inline-end:.5rem}.menu-horizontal>li>details>ul:before{content:none}:where(.menu-horizontal>li:not(.menu-title)>details>ul){border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.menu-xs .menu-title{padding:.25rem .5rem}.menu-sm :where(li:not(.menu-title)>*:not(ul,details,.menu-title)),.menu-sm :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn, .5rem);padding:.25rem .75rem;font-size:.875rem;line-height:1.25rem}.menu-sm .menu-title{padding:.5rem .75rem}.menu-md .menu-title{padding:.5rem 1rem}.menu-lg .menu-title{padding:.75rem 1.5rem}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y: -2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y: 2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.stats-horizontal>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.stats-horizontal{overflow-x:auto}.stats-horizontal:where([dir=rtl],[dir=rtl] *){--tw-divide-x-reverse: 1}.stats-vertical>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(0px * var(--tw-divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.stats-vertical{overflow-y:auto}.steps-horizontal .\!step{grid-template-rows:40px 1fr!important;grid-template-columns:auto!important;min-width:4rem!important}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .\!step:before{height:.5rem!important;width:100%!important;--tw-translate-x: 0px !important;--tw-translate-y: 0px !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;content:""!important;margin-inline-start:-100%!important}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .\!step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .\!step{gap:.5rem!important;grid-template-columns:40px 1fr!important;grid-template-rows:auto!important;min-height:4rem!important;justify-items:start!important}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .\!step:before{height:100%!important;width:.5rem!important;--tw-translate-x: -50% !important;--tw-translate-y: -50% !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;margin-inline-start:50%!important}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .\!step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50% !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.table-sm :not(thead):not(tfoot) tr{font-size:.875rem;line-height:1.25rem}.table-sm :where(th,td){padding:.5rem .75rem}.tooltip{position:relative;display:inline-block;text-align:center;--tooltip-tail: .1875rem;--tooltip-color: var(--fallback-n,oklch(var(--n)/1));--tooltip-text-color: var(--fallback-nc,oklch(var(--nc)/1));--tooltip-tail-offset: calc(100% + .0625rem - var(--tooltip-tail))}.tooltip:before,.tooltip:after{opacity:0;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-delay:.1s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.tooltip:after{position:absolute;content:"";border-style:solid;border-width:var(--tooltip-tail, 0);width:0;height:0;display:block}.tooltip:before{max-width:20rem;white-space:normal;border-radius:.25rem;padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;background-color:var(--tooltip-color);color:var(--tooltip-text-color);width:-moz-max-content;width:max-content}.tooltip.tooltip-open:before{opacity:1;transition-delay:75ms}.tooltip.tooltip-open:after{opacity:1;transition-delay:75ms}.tooltip:hover:before{opacity:1;transition-delay:75ms}.tooltip:hover:after{opacity:1;transition-delay:75ms}.tooltip:has(:focus-visible):after,.tooltip:has(:focus-visible):before{opacity:1;transition-delay:75ms}.tooltip:not([data-tip]):hover:before,.tooltip:not([data-tip]):hover:after{visibility:hidden;opacity:0}.tooltip:after,.tooltip-top:after{transform:translate(-50%);border-color:var(--tooltip-color) transparent transparent transparent;top:auto;left:50%;right:auto;bottom:var(--tooltip-tail-offset)}.tooltip-bottom:after{transform:translate(-50%);border-color:transparent transparent var(--tooltip-color) transparent;top:var(--tooltip-tail-offset);left:50%;right:auto;bottom:auto}.tooltip-left:after{transform:translateY(-50%);border-color:transparent transparent transparent var(--tooltip-color);top:50%;left:auto;right:calc(var(--tooltip-tail-offset) + .0625rem);bottom:auto}.tooltip-right:after{transform:translateY(-50%);border-color:transparent var(--tooltip-color) transparent transparent;top:50%;left:calc(var(--tooltip-tail-offset) + .0625rem);right:auto;bottom:auto}.btn-primary{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-primary[disabled],.btn-primary:disabled{pointer-events:none}:where(.btn-primary:is(input[type=checkbox])),:where(.btn-primary:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn-primary:is(input[type=checkbox]):after,.btn-primary:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}@media (hover: hover){.btn-primary:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-primary:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn-primary:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn-primary.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-primary[disabled]:hover,.btn-primary:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn-primary:is(input[type=checkbox]:checked):hover,.btn-primary:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}}@media (prefers-reduced-motion: no-preference){.btn-primary{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn-primary:active:hover,.btn-primary:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn-primary{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn-primary:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-primary.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-primary.btn-disabled,.btn-primary[disabled],.btn-primary:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn-primary:is(input[type=checkbox]:checked),.btn-primary:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-primary:is(input[type=checkbox]:checked):focus-visible,.btn-primary:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}.join>:where(*:not(:first-child)):is(.btn-primary){margin-inline-start:calc(var(--border-btn) * -1)}.join.join-vertical>:where(*:not(:first-child)):is(.btn-primary){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)):is(.btn-primary){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.btn-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.btn-primary:hover{opacity:.9}.card-compact{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card-compact:focus{outline:2px solid transparent;outline-offset:2px}.card-compact figure{display:flex;align-items:center;justify-content:center}.card-compact.image-full{display:grid}.card-compact.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card-compact.image-full:before,.card-compact.image-full>*{grid-column-start:1;grid-row-start:1}.card-compact.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card-compact.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.card-compact :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card-compact :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card-compact:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card-compact.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card-compact.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-compact.image-full :where(figure){overflow:hidden;border-radius:inherit}.card-compact{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)));--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.left-3{left:.75rem}.left-4{left:1rem}.left-5{left:1.25rem}.right-0{right:0}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:.75rem}.top-full{top:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[10\]{z-index:10}.z-\[1\]{z-index:1}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-12{margin-left:3rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.\!h-9{height:2.25rem!important}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-36{height:9rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.\!min-h-\[2\.25rem\]{min-height:2.25rem!important}.min-h-0{min-height:0px}.min-h-\[520px\]{min-height:520px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[500px\]{width:500px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-64{min-width:16rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[150px\]{min-width:150px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[240px\]{max-width:240px}.max-w-\[260px\]{max-width:260px}.max-w-\[300px\]{max-width:300px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.grid-rows-\[auto_1fr\]{grid-template-rows:auto 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-2{row-gap:.5rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-base-300>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-divide-opacity, 1)))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-badge{border-radius:var(--rounded-badge, 1.9rem)}.rounded-box{border-radius:var(--rounded-box, 1rem)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-base-200{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity, 1)))}.border-base-300{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity, 1)))}.border-base-content\/10{border-color:var(--fallback-bc,oklch(var(--bc)/.1))}.border-current{border-color:currentColor}.border-error{--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity, 1)))}.border-error\/20{border-color:var(--fallback-er,oklch(var(--er)/.2))}.border-error\/30{border-color:var(--fallback-er,oklch(var(--er)/.3))}.border-primary\/30{border-color:var(--fallback-p,oklch(var(--p)/.3))}.border-success\/20{border-color:var(--fallback-su,oklch(var(--su)/.2))}.border-success\/30{border-color:var(--fallback-su,oklch(var(--su)/.3))}.border-warning{--tw-border-opacity: 1;border-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-border-opacity, 1)))}.border-warning\/30{border-color:var(--fallback-wa,oklch(var(--wa)/.3))}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-100\/20{background-color:var(--fallback-b1,oklch(var(--b1)/.2))}.bg-base-100\/50{background-color:var(--fallback-b1,oklch(var(--b1)/.5))}.bg-base-200{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.bg-base-200\/30{background-color:var(--fallback-b2,oklch(var(--b2)/.3))}.bg-base-200\/40{background-color:var(--fallback-b2,oklch(var(--b2)/.4))}.bg-base-200\/50{background-color:var(--fallback-b2,oklch(var(--b2)/.5))}.bg-base-200\/60{background-color:var(--fallback-b2,oklch(var(--b2)/.6))}.bg-base-300{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)))}.bg-base-300\/50{background-color:var(--fallback-b3,oklch(var(--b3)/.5))}.bg-base-content\/20{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.bg-base-content\/30{background-color:var(--fallback-bc,oklch(var(--bc)/.3))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-error{--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity, 1)))}.bg-error\/10{background-color:var(--fallback-er,oklch(var(--er)/.1))}.bg-error\/20{background-color:var(--fallback-er,oklch(var(--er)/.2))}.bg-error\/5{background-color:var(--fallback-er,oklch(var(--er)/.05))}.bg-neutral{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity, 1)))}.bg-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.bg-primary\/10{background-color:var(--fallback-p,oklch(var(--p)/.1))}.bg-success{--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity, 1)))}.bg-success\/10{background-color:var(--fallback-su,oklch(var(--su)/.1))}.bg-success\/20{background-color:var(--fallback-su,oklch(var(--su)/.2))}.bg-success\/5{background-color:var(--fallback-su,oklch(var(--su)/.05))}.bg-warning{--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity, 1)))}.bg-warning\/10{background-color:var(--fallback-wa,oklch(var(--wa)/.1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary\/10{--tw-gradient-from: var(--fallback-p,oklch(var(--p)/.1)) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-secondary\/10{--tw-gradient-to: var(--fallback-s,oklch(var(--s)/.1)) var(--tw-gradient-to-position)}.stroke-current{stroke:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.\!py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.\!pl-7{padding-left:1.75rem!important}.pb-3{padding-bottom:.75rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.not-italic{font-style:normal}.leading-\[1\.5rem\]{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity, 1)))}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-base-content\/20{color:var(--fallback-bc,oklch(var(--bc)/.2))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/40{color:var(--fallback-bc,oklch(var(--bc)/.4))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-base-content\/60{color:var(--fallback-bc,oklch(var(--bc)/.6))}.text-base-content\/70{color:var(--fallback-bc,oklch(var(--bc)/.7))}.text-base-content\/75{color:var(--fallback-bc,oklch(var(--bc)/.75))}.text-base-content\/80{color:var(--fallback-bc,oklch(var(--bc)/.8))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-error\/80{color:var(--fallback-er,oklch(var(--er)/.8))}.text-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity, 1)))}.text-inherit{color:inherit}.text-neutral-content{--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity, 1)))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-primary-content{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity, 1)))}.text-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity, 1)))}.text-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1)))}.text-success-content{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity, 1)))}.text-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity, 1)))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[padding\]{transition-property:padding;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.loading-dots:after{content:"";animation:dots 1.5s steps(5,end) infinite}@keyframes dots{0%,20%{content:""}40%{content:"."}60%{content:".."}80%,to{content:"..."}}html,body,#app{overflow-x:hidden;width:100%;max-width:100vw}.drawer-content{overflow-x:hidden;width:100%;max-width:100%}.server-list-move,.server-list-enter-active,.server-list-leave-active{transition:all .3s cubic-bezier(.4,0,.2,1)}.server-list-enter-from{opacity:0;transform:translateY(20px) scale(.95)}.server-list-leave-to{opacity:0;transform:translateY(-20px) scale(.95)}.server-list-leave-active{position:absolute}.secret-list-move,.secret-list-enter-active,.secret-list-leave-active{transition:all .25s ease-out}.secret-list-enter-from{opacity:0;transform:translate(-10px)}.secret-list-leave-to{opacity:0;transform:translate(10px)}.tool-call-move,.tool-call-enter-active,.tool-call-leave-active{transition:all .2s ease}.tool-call-enter-from{opacity:0;transform:translateY(-5px)}.tool-call-leave-to{opacity:0;transform:translateY(5px)}.repo-card-move,.repo-card-enter-active,.repo-card-leave-active{transition:all .3s cubic-bezier(.4,0,.2,1)}.repo-card-enter-from,.repo-card-leave-to{opacity:0;transform:scale(.9)}.repo-card-leave-active{position:absolute}.hover\:badge-error:hover{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.hover\:badge-error:hover.badge-outline{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}@media (min-width: 640px){.sm\:modal-middle{place-items:center}.sm\:modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}}@media (min-width: 1024px){.lg\:drawer-open>.drawer-toggle{display:none}.lg\:drawer-open>.drawer-toggle~.drawer-side{pointer-events:auto;visibility:visible;position:sticky;display:block;width:auto;overscroll-behavior:auto}.lg\:drawer-open>.drawer-toggle~.drawer-side>*:not(.drawer-overlay){transform:translate(0)}[dir=rtl] .lg\:drawer-open>.drawer-toggle~.drawer-side>*:not(.drawer-overlay){transform:translate(0)}.lg\:drawer-open>.drawer-toggle:checked~.drawer-side{pointer-events:auto;visibility:visible}.lg\:drawer-open>.drawer-side{overflow-y:auto}html:has(.lg\:drawer-open.lg\:drawer-open){overflow-y:auto;scrollbar-gutter:auto}.lg\:stats-horizontal{grid-auto-flow:column}.lg\:drawer-open>.drawer-toggle~.drawer-side>.drawer-overlay{cursor:default;background-color:transparent}.lg\:stats-horizontal>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.lg\:stats-horizontal{overflow-x:auto}.lg\:stats-horizontal:where([dir=rtl],[dir=rtl] *){--tw-divide-x-reverse: 1}}.last\:border-0:last-child{border-width:0px}.hover\:bg-base-200:hover{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.hover\:bg-base-200\/40:hover{background-color:var(--fallback-b2,oklch(var(--b2)/.4))}.hover\:bg-base-200\/50:hover{background-color:var(--fallback-b2,oklch(var(--b2)/.5))}.hover\:bg-base-200\/70:hover{background-color:var(--fallback-b2,oklch(var(--b2)/.7))}.hover\:bg-base-300:hover{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)))}.hover\:from-primary\/15:hover{--tw-gradient-from: var(--fallback-p,oklch(var(--p)/.15)) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.hover\:to-secondary\/15:hover{--tw-gradient-to: var(--fallback-s,oklch(var(--s)/.15)) var(--tw-gradient-to-position)}.hover\:text-base-content:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.group[open] .group-open\:rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:self-end{align-self:flex-end}}@media (min-width: 768px){.md\:inline{display:inline}.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-64{width:16rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[280px_1fr_280px\]{grid-template-columns:280px 1fr 280px}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:justify-between{justify-content:space-between}.lg\:pl-14{padding-left:3.5rem}.lg\:pl-4{padding-left:1rem}.lg\:pl-64{padding-left:16rem}.lg\:pr-0{padding-right:0}.lg\:text-left{text-align:left}.lg\:text-right{text-align:right}} diff --git a/web/frontend/dist/assets/index-myMLoUzQ.js b/web/frontend/dist/assets/index-myMLoUzQ.js deleted file mode 100644 index ecf8a9c1..00000000 --- a/web/frontend/dist/assets/index-myMLoUzQ.js +++ /dev/null @@ -1,75 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Activity-DhitPCWU.js","assets/Activity-7YqHqUto.css"])))=>i.map(i=>d[i]); -var Qd=Object.defineProperty;var tf=(e,t,s)=>t in e?Qd(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var xt=(e,t,s)=>tf(e,typeof t!="symbol"?t+"":t,s);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function s(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=s(i);fetch(i.href,o)}})();/** -* @vue/shared v3.5.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Dr(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const Bt={},nn=[],qe=()=>{},$c=()=>!1,mo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fr=e=>e.startsWith("onUpdate:"),Qt=Object.assign,Nr=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},ef=Object.prototype.hasOwnProperty,Rt=(e,t)=>ef.call(e,t),vt=Array.isArray,on=e=>ai(e)==="[object Map]",pn=e=>ai(e)==="[object Set]",Ca=e=>ai(e)==="[object Date]",kt=e=>typeof e=="function",Zt=e=>typeof e=="string",Ke=e=>typeof e=="symbol",Ht=e=>e!==null&&typeof e=="object",Lc=e=>(Ht(e)||kt(e))&&kt(e.then)&&kt(e.catch),Dc=Object.prototype.toString,ai=e=>Dc.call(e),sf=e=>ai(e).slice(8,-1),Fc=e=>ai(e)==="[object Object]",jr=e=>Zt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ln=Dr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),vo=e=>{const t=Object.create(null);return s=>t[s]||(t[s]=e(s))},nf=/-\w/g,Pe=vo(e=>e.replace(nf,t=>t.slice(1).toUpperCase())),of=/\B([A-Z])/g,Ps=vo(e=>e.replace(of,"-$1").toLowerCase()),yo=vo(e=>e.charAt(0).toUpperCase()+e.slice(1)),Fo=vo(e=>e?`on${yo(e)}`:""),os=(e,t)=>!Object.is(e,t),Fi=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Ui=e=>{const t=parseFloat(e);return isNaN(t)?e:t},rf=e=>{const t=Zt(e)?Number(e):NaN;return isNaN(t)?e:t};let Aa;const bo=()=>Aa||(Aa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function li(e){if(vt(e)){const t={};for(let s=0;s{if(s){const n=s.split(lf);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function yt(e){let t="";if(Zt(e))t=e;else if(vt(e))for(let s=0;sVs(s,t))}const zc=e=>!!(e&&e.__v_isRef===!0),z=e=>Zt(e)?e:e==null?"":vt(e)||Ht(e)&&(e.toString===Dc||!kt(e.toString))?zc(e)?z(e.value):JSON.stringify(e,Bc,2):String(e),Bc=(e,t)=>zc(t)?Bc(e,t.value):on(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,i],o)=>(s[No(n,o)+" =>"]=i,s),{})}:pn(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>No(s))}:Ke(t)?No(t):Ht(t)&&!vt(t)&&!Fc(t)?String(t):t,No=(e,t="")=>{var s;return Ke(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};/** -* @vue/reactivity v3.5.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let le;class Hc{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=le,!t&&le&&(this.index=(le.scopes||(le.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t0&&--this._on===0&&(le=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(Fn){let t=Fn;for(Fn=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;Dn;){let t=Dn;for(Dn=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Yc(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Gc(e){let t,s=e.depsTail,n=s;for(;n;){const i=n.prevDep;n.version===-1?(n===s&&(s=i),Wr(n),gf(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=i}e.deps=t,e.depsTail=s}function ar(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Zc(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Zc(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Zn)||(e.globalVersion=Zn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!ar(e))))return;e.flags|=2;const t=e.dep,s=Wt,n=Re;Wt=e,Re=!0;try{Yc(e);const i=e.fn(e._value);(t.version===0||os(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{Wt=s,Re=n,Gc(e),e.flags&=-3}}function Wr(e,t=!1){const{dep:s,prevSub:n,nextSub:i}=e;if(n&&(n.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let o=s.computed.deps;o;o=o.nextDep)Wr(o,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function gf(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let Re=!0;const Jc=[];function rs(){Jc.push(Re),Re=!1}function as(){const e=Jc.pop();Re=e===void 0?!0:e}function Ia(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=Wt;Wt=void 0;try{t()}finally{Wt=s}}}let Zn=0;class mf{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ur{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Wt||!Re||Wt===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==Wt)s=this.activeLink=new mf(Wt,this),Wt.deps?(s.prevDep=Wt.depsTail,Wt.depsTail.nextDep=s,Wt.depsTail=s):Wt.deps=Wt.depsTail=s,Xc(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=Wt.depsTail,s.nextDep=void 0,Wt.depsTail.nextDep=s,Wt.depsTail=s,Wt.deps===s&&(Wt.deps=n)}return s}trigger(t){this.version++,Zn++,this.notify(t)}notify(t){Br();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Hr()}}}function Xc(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Xc(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const Vi=new WeakMap,Hs=Symbol(""),lr=Symbol(""),Jn=Symbol("");function ce(e,t,s){if(Re&&Wt){let n=Vi.get(e);n||Vi.set(e,n=new Map);let i=n.get(s);i||(n.set(s,i=new Ur),i.map=n,i.key=s),i.track()}}function es(e,t,s,n,i,o){const r=Vi.get(e);if(!r){Zn++;return}const a=l=>{l&&l.trigger()};if(Br(),t==="clear")r.forEach(a);else{const l=vt(e),c=l&&jr(s);if(l&&s==="length"){const u=Number(n);r.forEach((f,h)=>{(h==="length"||h===Jn||!Ke(h)&&h>=u)&&a(f)})}else switch((s!==void 0||r.has(void 0))&&a(r.get(s)),c&&a(r.get(Jn)),t){case"add":l?c&&a(r.get("length")):(a(r.get(Hs)),on(e)&&a(r.get(lr)));break;case"delete":l||(a(r.get(Hs)),on(e)&&a(r.get(lr)));break;case"set":on(e)&&a(r.get(Hs));break}}Hr()}function vf(e,t){const s=Vi.get(e);return s&&s.get(t)}function Ys(e){const t=Mt(e);return t===e?t:(ce(t,"iterate",Jn),Me(e)?t:t.map(se))}function _o(e){return ce(e=Mt(e),"iterate",Jn),e}const yf={__proto__:null,[Symbol.iterator](){return zo(this,Symbol.iterator,se)},concat(...e){return Ys(this).concat(...e.map(t=>vt(t)?Ys(t):t))},entries(){return zo(this,"entries",e=>(e[1]=se(e[1]),e))},every(e,t){return Ye(this,"every",e,t,void 0,arguments)},filter(e,t){return Ye(this,"filter",e,t,s=>s.map(se),arguments)},find(e,t){return Ye(this,"find",e,t,se,arguments)},findIndex(e,t){return Ye(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ye(this,"findLast",e,t,se,arguments)},findLastIndex(e,t){return Ye(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ye(this,"forEach",e,t,void 0,arguments)},includes(...e){return Bo(this,"includes",e)},indexOf(...e){return Bo(this,"indexOf",e)},join(e){return Ys(this).join(e)},lastIndexOf(...e){return Bo(this,"lastIndexOf",e)},map(e,t){return Ye(this,"map",e,t,void 0,arguments)},pop(){return yn(this,"pop")},push(...e){return yn(this,"push",e)},reduce(e,...t){return Ma(this,"reduce",e,t)},reduceRight(e,...t){return Ma(this,"reduceRight",e,t)},shift(){return yn(this,"shift")},some(e,t){return Ye(this,"some",e,t,void 0,arguments)},splice(...e){return yn(this,"splice",e)},toReversed(){return Ys(this).toReversed()},toSorted(e){return Ys(this).toSorted(e)},toSpliced(...e){return Ys(this).toSpliced(...e)},unshift(...e){return yn(this,"unshift",e)},values(){return zo(this,"values",se)}};function zo(e,t,s){const n=_o(e),i=n[t]();return n!==e&&!Me(e)&&(i._next=i.next,i.next=()=>{const o=i._next();return o.value&&(o.value=s(o.value)),o}),i}const bf=Array.prototype;function Ye(e,t,s,n,i,o){const r=_o(e),a=r!==e&&!Me(e),l=r[t];if(l!==bf[t]){const f=l.apply(e,o);return a?se(f):f}let c=s;r!==e&&(a?c=function(f,h){return s.call(this,se(f),h,e)}:s.length>2&&(c=function(f,h){return s.call(this,f,h,e)}));const u=l.call(r,c,n);return a&&i?i(u):u}function Ma(e,t,s,n){const i=_o(e);let o=s;return i!==e&&(Me(e)?s.length>3&&(o=function(r,a,l){return s.call(this,r,a,l,e)}):o=function(r,a,l){return s.call(this,r,se(a),l,e)}),i[t](o,...n)}function Bo(e,t,s){const n=Mt(e);ce(n,"iterate",Jn);const i=n[t](...s);return(i===-1||i===!1)&&ci(s[0])?(s[0]=Mt(s[0]),n[t](...s)):i}function yn(e,t,s=[]){rs(),Br();const n=Mt(e)[t].apply(e,s);return Hr(),as(),n}const _f=Dr("__proto__,__v_isRef,__isVue"),Qc=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ke));function xf(e){Ke(e)||(e=String(e));const t=Mt(this);return ce(t,"has",e),t.hasOwnProperty(e)}class tu{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const i=this._isReadonly,o=this._isShallow;if(s==="__v_isReactive")return!i;if(s==="__v_isReadonly")return i;if(s==="__v_isShallow")return o;if(s==="__v_raw")return n===(i?o?Pf:iu:o?nu:su).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const r=vt(t);if(!i){let l;if(r&&(l=yf[s]))return l;if(s==="hasOwnProperty")return xf}const a=Reflect.get(t,s,Gt(t)?t:n);return(Ke(s)?Qc.has(s):_f(s))||(i||ce(t,"get",s),o)?a:Gt(a)?r&&jr(s)?a:a.value:Ht(a)?i?ru(a):us(a):a}}class eu extends tu{constructor(t=!1){super(!1,t)}set(t,s,n,i){let o=t[s];if(!this._isShallow){const l=Ms(o);if(!Me(n)&&!Ms(n)&&(o=Mt(o),n=Mt(n)),!vt(t)&&Gt(o)&&!Gt(n))return l||(o.value=n),!0}const r=vt(t)&&jr(s)?Number(s)e,vi=e=>Reflect.getPrototypeOf(e);function Af(e,t,s){return function(...n){const i=this.__v_raw,o=Mt(i),r=on(o),a=e==="entries"||e===Symbol.iterator&&r,l=e==="keys"&&r,c=i[e](...n),u=s?cr:t?qi:se;return!t&&ce(o,"iterate",l?lr:Hs),{next(){const{value:f,done:h}=c.next();return h?{value:f,done:h}:{value:a?[u(f[0]),u(f[1])]:u(f),done:h}},[Symbol.iterator](){return this}}}}function yi(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function If(e,t){const s={get(i){const o=this.__v_raw,r=Mt(o),a=Mt(i);e||(os(i,a)&&ce(r,"get",i),ce(r,"get",a));const{has:l}=vi(r),c=t?cr:e?qi:se;if(l.call(r,i))return c(o.get(i));if(l.call(r,a))return c(o.get(a));o!==r&&o.get(i)},get size(){const i=this.__v_raw;return!e&&ce(Mt(i),"iterate",Hs),i.size},has(i){const o=this.__v_raw,r=Mt(o),a=Mt(i);return e||(os(i,a)&&ce(r,"has",i),ce(r,"has",a)),i===a?o.has(i):o.has(i)||o.has(a)},forEach(i,o){const r=this,a=r.__v_raw,l=Mt(a),c=t?cr:e?qi:se;return!e&&ce(l,"iterate",Hs),a.forEach((u,f)=>i.call(o,c(u),c(f),r))}};return Qt(s,e?{add:yi("add"),set:yi("set"),delete:yi("delete"),clear:yi("clear")}:{add(i){!t&&!Me(i)&&!Ms(i)&&(i=Mt(i));const o=Mt(this);return vi(o).has.call(o,i)||(o.add(i),es(o,"add",i,i)),this},set(i,o){!t&&!Me(o)&&!Ms(o)&&(o=Mt(o));const r=Mt(this),{has:a,get:l}=vi(r);let c=a.call(r,i);c||(i=Mt(i),c=a.call(r,i));const u=l.call(r,i);return r.set(i,o),c?os(o,u)&&es(r,"set",i,o):es(r,"add",i,o),this},delete(i){const o=Mt(this),{has:r,get:a}=vi(o);let l=r.call(o,i);l||(i=Mt(i),l=r.call(o,i)),a&&a.call(o,i);const c=o.delete(i);return l&&es(o,"delete",i,void 0),c},clear(){const i=Mt(this),o=i.size!==0,r=i.clear();return o&&es(i,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(i=>{s[i]=Af(i,e,t)}),s}function Vr(e,t){const s=If(e,t);return(n,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?n:Reflect.get(Rt(s,i)&&i in n?s:n,i,o)}const Mf={get:Vr(!1,!1)},Ef={get:Vr(!1,!0)},Tf={get:Vr(!0,!1)};const su=new WeakMap,nu=new WeakMap,iu=new WeakMap,Pf=new WeakMap;function Of(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Rf(e){return e.__v_skip||!Object.isExtensible(e)?0:Of(sf(e))}function us(e){return Ms(e)?e:qr(e,!1,kf,Mf,su)}function ou(e){return qr(e,!1,Cf,Ef,nu)}function ru(e){return qr(e,!0,Sf,Tf,iu)}function qr(e,t,s,n,i){if(!Ht(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=Rf(e);if(o===0)return e;const r=i.get(e);if(r)return r;const a=new Proxy(e,o===2?n:s);return i.set(e,a),a}function As(e){return Ms(e)?As(e.__v_raw):!!(e&&e.__v_isReactive)}function Ms(e){return!!(e&&e.__v_isReadonly)}function Me(e){return!!(e&&e.__v_isShallow)}function ci(e){return e?!!e.__v_raw:!1}function Mt(e){const t=e&&e.__v_raw;return t?Mt(t):e}function Kr(e){return!Rt(e,"__v_skip")&&Object.isExtensible(e)&&Nc(e,"__v_skip",!0),e}const se=e=>Ht(e)?us(e):e,qi=e=>Ht(e)?ru(e):e;function Gt(e){return e?e.__v_isRef===!0:!1}function X(e){return au(e,!1)}function Yr(e){return au(e,!0)}function au(e,t){return Gt(e)?e:new $f(e,t)}class $f{constructor(t,s){this.dep=new Ur,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:Mt(t),this._value=s?t:se(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||Me(t)||Ms(t);t=n?t:Mt(t),os(t,s)&&(this._rawValue=t,this._value=n?t:se(t),this.dep.trigger())}}function ct(e){return Gt(e)?e.value:e}const Lf={get:(e,t,s)=>t==="__v_raw"?e:ct(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const i=e[t];return Gt(i)&&!Gt(s)?(i.value=s,!0):Reflect.set(e,t,s,n)}};function lu(e){return As(e)?e:new Proxy(e,Lf)}function Df(e){const t=vt(e)?new Array(e.length):{};for(const s in e)t[s]=Nf(e,s);return t}class Ff{constructor(t,s,n){this._object=t,this._key=s,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return vf(Mt(this._object),this._key)}}function Nf(e,t,s){const n=e[t];return Gt(n)?n:new Ff(e,t,s)}class jf{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Ur(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Zn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&Wt!==this)return Kc(this,!0),!0}get value(){const t=this.dep.track();return Zc(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function zf(e,t,s=!1){let n,i;return kt(e)?n=e:(n=e.get,i=e.set),new jf(n,i,s)}const bi={},Ki=new WeakMap;let Ns;function Bf(e,t=!1,s=Ns){if(s){let n=Ki.get(s);n||Ki.set(s,n=[]),n.push(e)}}function Hf(e,t,s=Bt){const{immediate:n,deep:i,once:o,scheduler:r,augmentJob:a,call:l}=s,c=E=>i?E:Me(E)||i===!1||i===0?ss(E,1):ss(E);let u,f,h,g,y=!1,v=!1;if(Gt(e)?(f=()=>e.value,y=Me(e)):As(e)?(f=()=>c(e),y=!0):vt(e)?(v=!0,y=e.some(E=>As(E)||Me(E)),f=()=>e.map(E=>{if(Gt(E))return E.value;if(As(E))return c(E);if(kt(E))return l?l(E,2):E()})):kt(e)?t?f=l?()=>l(e,2):e:f=()=>{if(h){rs();try{h()}finally{as()}}const E=Ns;Ns=u;try{return l?l(e,3,[g]):e(g)}finally{Ns=E}}:f=qe,t&&i){const E=f,B=i===!0?1/0:i;f=()=>ss(E(),B)}const b=Uc(),S=()=>{u.stop(),b&&b.active&&Nr(b.effects,u)};if(o&&t){const E=t;t=(...B)=>{E(...B),S()}}let _=v?new Array(e.length).fill(bi):bi;const k=E=>{if(!(!(u.flags&1)||!u.dirty&&!E))if(t){const B=u.run();if(i||y||(v?B.some((L,U)=>os(L,_[U])):os(B,_))){h&&h();const L=Ns;Ns=u;try{const U=[B,_===bi?void 0:v&&_[0]===bi?[]:_,g];_=B,l?l(t,3,U):t(...U)}finally{Ns=L}}}else u.run()};return a&&a(k),u=new Vc(f),u.scheduler=r?()=>r(k,!1):k,g=E=>Bf(E,!1,u),h=u.onStop=()=>{const E=Ki.get(u);if(E){if(l)l(E,4);else for(const B of E)B();Ki.delete(u)}},t?n?k(!0):_=u.run():r?r(k.bind(null,!0),!0):u.run(),S.pause=u.pause.bind(u),S.resume=u.resume.bind(u),S.stop=S,S}function ss(e,t=1/0,s){if(t<=0||!Ht(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,Gt(e))ss(e.value,t,s);else if(vt(e))for(let n=0;n{ss(n,t,s)});else if(Fc(e)){for(const n in e)ss(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&ss(e[n],t,s)}return e}/** -* @vue/runtime-core v3.5.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ui(e,t,s,n){try{return n?e(...n):e()}catch(i){xo(i,t,s)}}function $e(e,t,s,n){if(kt(e)){const i=ui(e,t,s,n);return i&&Lc(i)&&i.catch(o=>{xo(o,t,s)}),i}if(vt(e)){const i=[];for(let o=0;o>>1,i=pe[n],o=Xn(i);o=Xn(s)?pe.push(e):pe.splice(Uf(t),0,e),e.flags|=1,uu()}}function uu(){Yi||(Yi=cu.then(fu))}function Vf(e){vt(e)?rn.push(...e):xs&&e.id===-1?xs.splice(Qs+1,0,e):e.flags&1||(rn.push(e),e.flags|=1),uu()}function Ea(e,t,s=Be+1){for(;sXn(s)-Xn(n));if(rn.length=0,xs){xs.push(...t);return}for(xs=t,Qs=0;Qse.id==null?e.flags&2?-1:1/0:e.id;function fu(e){try{for(Be=0;Be{n._d&&Xi(-1);const o=Gi(t);let r;try{r=e(...i)}finally{Gi(o),n._d&&Xi(1)}return r};return n._n=!0,n._c=!0,n._d=!0,n}function Lt(e,t){if(ke===null)return e;const s=Ao(ke),n=e.dirs||(e.dirs=[]);for(let i=0;ie.__isTeleport,js=Symbol("_leaveCb"),_i=Symbol("_enterCb");function Yf(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return fs(()=>{e.isMounted=!0}),bu(()=>{e.isUnmounting=!0}),e}const Se=[Function,Array],Gf={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Se,onEnter:Se,onAfterEnter:Se,onEnterCancelled:Se,onBeforeLeave:Se,onLeave:Se,onAfterLeave:Se,onLeaveCancelled:Se,onBeforeAppear:Se,onAppear:Se,onAfterAppear:Se,onAppearCancelled:Se};function Zf(e,t){const{leavingVNodes:s}=e;let n=s.get(t.type);return n||(n=Object.create(null),s.set(t.type,n)),n}function ur(e,t,s,n,i){const{appear:o,mode:r,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:h,onLeave:g,onAfterLeave:y,onLeaveCancelled:v,onBeforeAppear:b,onAppear:S,onAfterAppear:_,onAppearCancelled:k}=t,E=String(e.key),B=Zf(s,e),L=(T,I)=>{T&&$e(T,n,9,I)},U=(T,I)=>{const H=I[1];L(T,I),vt(T)?T.every(R=>R.length<=1)&&H():T.length<=1&&H()},V={mode:r,persisted:a,beforeEnter(T){let I=l;if(!s.isMounted)if(o)I=b||l;else return;T[js]&&T[js](!0);const H=B[E];H&&tn(e,H)&&H.el[js]&&H.el[js](),L(I,[T])},enter(T){let I=c,H=u,R=f;if(!s.isMounted)if(o)I=S||c,H=_||u,R=k||f;else return;let at=!1;const F=T[_i]=N=>{at||(at=!0,N?L(R,[T]):L(H,[T]),V.delayedLeave&&V.delayedLeave(),T[_i]=void 0)};I?U(I,[T,F]):F()},leave(T,I){const H=String(e.key);if(T[_i]&&T[_i](!0),s.isUnmounting)return I();L(h,[T]);let R=!1;const at=T[js]=F=>{R||(R=!0,I(),F?L(v,[T]):L(y,[T]),T[js]=void 0,B[H]===e&&delete B[H])};B[H]=e,g?U(g,[T,at]):at()},clone(T){return ur(T,t,s,n)}};return V}function Qn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Qn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function pu(e,t=!1,s){let n=[],i=0;for(let o=0;o1)for(let o=0;oNn(y,t&&(vt(t)?t[v]:t),s,n,i));return}if(jn(n)&&!i){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&Nn(e,t,s,n.component.subTree);return}const o=n.shapeFlag&4?Ao(n.component):n.el,r=i?null:o,{i:a,r:l}=e,c=t&&t.r,u=a.refs===Bt?a.refs={}:a.refs,f=a.setupState,h=Mt(f),g=f===Bt?$c:y=>Rt(h,y);if(c!=null&&c!==l){if(Ta(t),Zt(c))u[c]=null,g(c)&&(f[c]=null);else if(Gt(c)){c.value=null;const y=t;y.k&&(u[y.k]=null)}}if(kt(l))ui(l,a,12,[r,u]);else{const y=Zt(l),v=Gt(l);if(y||v){const b=()=>{if(e.f){const S=y?g(l)?f[l]:u[l]:l.value;if(i)vt(S)&&Nr(S,o);else if(vt(S))S.includes(o)||S.push(o);else if(y)u[l]=[o],g(l)&&(f[l]=u[l]);else{const _=[o];l.value=_,e.k&&(u[e.k]=_)}}else y?(u[l]=r,g(l)&&(f[l]=r)):v&&(l.value=r,e.k&&(u[e.k]=r))};if(r){const S=()=>{b(),Zi.delete(e)};S.id=-1,Zi.set(e,S),xe(S,s)}else Ta(e),b()}}}function Ta(e){const t=Zi.get(e);t&&(t.flags|=8,Zi.delete(e))}bo().requestIdleCallback;bo().cancelIdleCallback;const jn=e=>!!e.type.__asyncLoader,mu=e=>e.type.__isKeepAlive;function Jf(e,t){vu(e,"a",t)}function Xf(e,t){vu(e,"da",t)}function vu(e,t,s=ue){const n=e.__wdc||(e.__wdc=()=>{let i=s;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(wo(t,n,s),s){let i=s.parent;for(;i&&i.parent;)mu(i.parent.vnode)&&Qf(n,t,s,i),i=i.parent}}function Qf(e,t,s,n){const i=wo(t,e,n,!0);gn(()=>{Nr(n[t],i)},s)}function wo(e,t,s=ue,n=!1){if(s){const i=s[e]||(s[e]=[]),o=t.__weh||(t.__weh=(...r)=>{rs();const a=fi(s),l=$e(t,s,e,r);return a(),as(),l});return n?i.unshift(o):i.push(o),o}}const ds=e=>(t,s=ue)=>{(!ti||e==="sp")&&wo(e,(...n)=>t(...n),s)},th=ds("bm"),fs=ds("m"),eh=ds("bu"),yu=ds("u"),bu=ds("bum"),gn=ds("um"),sh=ds("sp"),nh=ds("rtg"),ih=ds("rtc");function oh(e,t=ue){wo("ec",e,t)}const rh="components";function ko(e,t){return lh(rh,e,!0,t)||e}const ah=Symbol.for("v-ndc");function lh(e,t,s=!0,n=!1){const i=ke||ue;if(i){const o=i.type;{const a=Zh(o,!1);if(a&&(a===t||a===Pe(t)||a===yo(Pe(t))))return o}const r=Pa(i[e]||o[e],t)||Pa(i.appContext[e],t);return!r&&n?o:r}}function Pa(e,t){return e&&(e[t]||e[Pe(t)]||e[yo(Pe(t))])}function Vt(e,t,s,n){let i;const o=s&&s[n],r=vt(e);if(r||Zt(e)){const a=r&&As(e);let l=!1,c=!1;a&&(l=!Me(e),c=Ms(e),e=_o(e)),i=new Array(e.length);for(let u=0,f=e.length;ut(a,l,void 0,o&&o[l]));else{const a=Object.keys(e);i=new Array(a.length);for(let l=0,c=a.length;le?ju(e)?Ao(e):dr(e.parent):null,zn=Qt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>dr(e.parent),$root:e=>dr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>xu(e),$forceUpdate:e=>e.f||(e.f=()=>{Gr(e.update)}),$nextTick:e=>e.n||(e.n=di.bind(e.proxy)),$watch:e=>Th.bind(e)}),Ho=(e,t)=>e!==Bt&&!e.__isScriptSetup&&Rt(e,t),ch={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:i,props:o,accessCache:r,type:a,appContext:l}=e;let c;if(t[0]!=="$"){const g=r[t];if(g!==void 0)switch(g){case 1:return n[t];case 2:return i[t];case 4:return s[t];case 3:return o[t]}else{if(Ho(n,t))return r[t]=1,n[t];if(i!==Bt&&Rt(i,t))return r[t]=2,i[t];if((c=e.propsOptions[0])&&Rt(c,t))return r[t]=3,o[t];if(s!==Bt&&Rt(s,t))return r[t]=4,s[t];fr&&(r[t]=0)}}const u=zn[t];let f,h;if(u)return t==="$attrs"&&ce(e.attrs,"get",""),u(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(s!==Bt&&Rt(s,t))return r[t]=4,s[t];if(h=l.config.globalProperties,Rt(h,t))return h[t]},set({_:e},t,s){const{data:n,setupState:i,ctx:o}=e;return Ho(i,t)?(i[t]=s,!0):n!==Bt&&Rt(n,t)?(n[t]=s,!0):Rt(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:i,propsOptions:o,type:r}},a){let l,c;return!!(s[a]||e!==Bt&&a[0]!=="$"&&Rt(e,a)||Ho(t,a)||(l=o[0])&&Rt(l,a)||Rt(n,a)||Rt(zn,a)||Rt(i.config.globalProperties,a)||(c=r.__cssModules)&&c[a])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:Rt(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function Oa(e){return vt(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let fr=!0;function uh(e){const t=xu(e),s=e.proxy,n=e.ctx;fr=!1,t.beforeCreate&&Ra(t.beforeCreate,e,"bc");const{data:i,computed:o,methods:r,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:h,beforeUpdate:g,updated:y,activated:v,deactivated:b,beforeDestroy:S,beforeUnmount:_,destroyed:k,unmounted:E,render:B,renderTracked:L,renderTriggered:U,errorCaptured:V,serverPrefetch:T,expose:I,inheritAttrs:H,components:R,directives:at,filters:F}=t;if(c&&dh(c,n,null),r)for(const W in r){const Y=r[W];kt(Y)&&(n[W]=Y.bind(s))}if(i){const W=i.call(s,s);Ht(W)&&(e.data=us(W))}if(fr=!0,o)for(const W in o){const Y=o[W],st=kt(Y)?Y.bind(s,s):kt(Y.get)?Y.get.bind(s,s):qe,At=!kt(Y)&&kt(Y.set)?Y.set.bind(s):qe,K=ot({get:st,set:At});Object.defineProperty(n,W,{enumerable:!0,configurable:!0,get:()=>K.value,set:O=>K.value=O})}if(a)for(const W in a)_u(a[W],n,s,W);if(l){const W=kt(l)?l.call(s):l;Reflect.ownKeys(W).forEach(Y=>{Ni(Y,W[Y])})}u&&Ra(u,e,"c");function P(W,Y){vt(Y)?Y.forEach(st=>W(st.bind(s))):Y&&W(Y.bind(s))}if(P(th,f),P(fs,h),P(eh,g),P(yu,y),P(Jf,v),P(Xf,b),P(oh,V),P(ih,L),P(nh,U),P(bu,_),P(gn,E),P(sh,T),vt(I))if(I.length){const W=e.exposed||(e.exposed={});I.forEach(Y=>{Object.defineProperty(W,Y,{get:()=>s[Y],set:st=>s[Y]=st,enumerable:!0})})}else e.exposed||(e.exposed={});B&&e.render===qe&&(e.render=B),H!=null&&(e.inheritAttrs=H),R&&(e.components=R),at&&(e.directives=at),T&&gu(e)}function dh(e,t,s=qe){vt(e)&&(e=hr(e));for(const n in e){const i=e[n];let o;Ht(i)?"default"in i?o=Ee(i.from||n,i.default,!0):o=Ee(i.from||n):o=Ee(i),Gt(o)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>o.value,set:r=>o.value=r}):t[n]=o}}function Ra(e,t,s){$e(vt(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function _u(e,t,s,n){let i=n.includes(".")?$u(s,n):()=>s[n];if(Zt(e)){const o=t[e];kt(o)&&ve(i,o)}else if(kt(e))ve(i,e.bind(s));else if(Ht(e))if(vt(e))e.forEach(o=>_u(o,t,s,n));else{const o=kt(e.handler)?e.handler.bind(s):t[e.handler];kt(o)&&ve(i,o,e)}}function xu(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,a=o.get(t);let l;return a?l=a:!i.length&&!s&&!n?l=t:(l={},i.length&&i.forEach(c=>Ji(l,c,r,!0)),Ji(l,t,r)),Ht(t)&&o.set(t,l),l}function Ji(e,t,s,n=!1){const{mixins:i,extends:o}=t;o&&Ji(e,o,s,!0),i&&i.forEach(r=>Ji(e,r,s,!0));for(const r in t)if(!(n&&r==="expose")){const a=fh[r]||s&&s[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const fh={data:$a,props:La,emits:La,methods:In,computed:In,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:In,directives:In,watch:ph,provide:$a,inject:hh};function $a(e,t){return t?e?function(){return Qt(kt(e)?e.call(this,this):e,kt(t)?t.call(this,this):t)}:t:e}function hh(e,t){return In(hr(e),hr(t))}function hr(e){if(vt(e)){const t={};for(let s=0;s1)return s&&kt(t)?t.call(n&&n.proxy):t}}function vh(){return!!(Qr()||Ws)}const ku={},Su=()=>Object.create(ku),Cu=e=>Object.getPrototypeOf(e)===ku;function yh(e,t,s,n=!1){const i={},o=Su();e.propsDefaults=Object.create(null),Au(e,t,i,o);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);s?e.props=n?i:ou(i):e.type.props?e.props=i:e.props=o,e.attrs=o}function bh(e,t,s,n){const{props:i,attrs:o,vnode:{patchFlag:r}}=e,a=Mt(i),[l]=e.propsOptions;let c=!1;if((n||r>0)&&!(r&16)){if(r&8){const u=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[h,g]=Iu(f,t,!0);Qt(r,h),g&&a.push(...g)};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!o&&!l)return Ht(e)&&n.set(e,nn),nn;if(vt(o))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Jr=e=>vt(e)?e.map(Ue):[Ue(e)],xh=(e,t,s)=>{if(t._n)return t;const n=$t((...i)=>Jr(t(...i)),s);return n._c=!1,n},Mu=(e,t,s)=>{const n=e._ctx;for(const i in e){if(Zr(i))continue;const o=e[i];if(kt(o))t[i]=xh(i,o,n);else if(o!=null){const r=Jr(o);t[i]=()=>r}}},Eu=(e,t)=>{const s=Jr(t);e.slots.default=()=>s},Tu=(e,t,s)=>{for(const n in t)(s||!Zr(n))&&(e[n]=t[n])},wh=(e,t,s)=>{const n=e.slots=Su();if(e.vnode.shapeFlag&32){const i=t._;i?(Tu(n,t,s),s&&Nc(n,"_",i,!0)):Mu(t,n)}else t&&Eu(e,t)},kh=(e,t,s)=>{const{vnode:n,slots:i}=e;let o=!0,r=Bt;if(n.shapeFlag&32){const a=t._;a?s&&a===1?o=!1:Tu(i,t,s):(o=!t.$stable,Mu(t,i)),r=t}else t&&(Eu(e,t),r={default:1});if(o)for(const a in i)!Zr(a)&&r[a]==null&&delete i[a]},xe=Nh;function Sh(e){return Ch(e)}function Ch(e,t){const s=bo();s.__VUE__=!0;const{insert:n,remove:i,patchProp:o,createElement:r,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:h,setScopeId:g=qe,insertStaticContent:y}=e,v=(m,p,A,$=null,C=null,D=null,et=void 0,tt=null,Q=!!p.dynamicChildren)=>{if(m===p)return;m&&!tn(m,p)&&($=j(m),O(m,C,D,!0),m=null),p.patchFlag===-2&&(Q=!1,p.dynamicChildren=null);const{type:G,ref:gt,shapeFlag:lt}=p;switch(G){case Co:b(m,p,A,$);break;case ls:S(m,p,A,$);break;case ji:m==null&&_(p,A,$,et);break;case wt:R(m,p,A,$,C,D,et,tt,Q);break;default:lt&1?B(m,p,A,$,C,D,et,tt,Q):lt&6?at(m,p,A,$,C,D,et,tt,Q):(lt&64||lt&128)&&G.process(m,p,A,$,C,D,et,tt,Q,ut)}gt!=null&&C?Nn(gt,m&&m.ref,D,p||m,!p):gt==null&&m&&m.ref!=null&&Nn(m.ref,null,D,m,!0)},b=(m,p,A,$)=>{if(m==null)n(p.el=a(p.children),A,$);else{const C=p.el=m.el;p.children!==m.children&&c(C,p.children)}},S=(m,p,A,$)=>{m==null?n(p.el=l(p.children||""),A,$):p.el=m.el},_=(m,p,A,$)=>{[m.el,m.anchor]=y(m.children,p,A,$,m.el,m.anchor)},k=({el:m,anchor:p},A,$)=>{let C;for(;m&&m!==p;)C=h(m),n(m,A,$),m=C;n(p,A,$)},E=({el:m,anchor:p})=>{let A;for(;m&&m!==p;)A=h(m),i(m),m=A;i(p)},B=(m,p,A,$,C,D,et,tt,Q)=>{p.type==="svg"?et="svg":p.type==="math"&&(et="mathml"),m==null?L(p,A,$,C,D,et,tt,Q):T(m,p,C,D,et,tt,Q)},L=(m,p,A,$,C,D,et,tt)=>{let Q,G;const{props:gt,shapeFlag:lt,transition:ft,dirs:_t}=m;if(Q=m.el=r(m.type,D,gt&>.is,gt),lt&8?u(Q,m.children):lt&16&&V(m.children,Q,null,$,C,Wo(m,D),et,tt),_t&&Os(m,null,$,"created"),U(Q,m,m.scopeId,et,$),gt){for(const Nt in gt)Nt!=="value"&&!Ln(Nt)&&o(Q,Nt,null,gt[Nt],D,$);"value"in gt&&o(Q,"value",null,gt.value,D),(G=gt.onVnodeBeforeMount)&&Fe(G,$,m)}_t&&Os(m,null,$,"beforeMount");const It=Ah(C,ft);It&&ft.beforeEnter(Q),n(Q,p,A),((G=gt&>.onVnodeMounted)||It||_t)&&xe(()=>{G&&Fe(G,$,m),It&&ft.enter(Q),_t&&Os(m,null,$,"mounted")},C)},U=(m,p,A,$,C)=>{if(A&&g(m,A),$)for(let D=0;D<$.length;D++)g(m,$[D]);if(C){let D=C.subTree;if(p===D||Du(D.type)&&(D.ssContent===p||D.ssFallback===p)){const et=C.vnode;U(m,et,et.scopeId,et.slotScopeIds,C.parent)}}},V=(m,p,A,$,C,D,et,tt,Q=0)=>{for(let G=Q;G{const tt=p.el=m.el;let{patchFlag:Q,dynamicChildren:G,dirs:gt}=p;Q|=m.patchFlag&16;const lt=m.props||Bt,ft=p.props||Bt;let _t;if(A&&Rs(A,!1),(_t=ft.onVnodeBeforeUpdate)&&Fe(_t,A,p,m),gt&&Os(p,m,A,"beforeUpdate"),A&&Rs(A,!0),(lt.innerHTML&&ft.innerHTML==null||lt.textContent&&ft.textContent==null)&&u(tt,""),G?I(m.dynamicChildren,G,tt,A,$,Wo(p,C),D):et||Y(m,p,tt,null,A,$,Wo(p,C),D,!1),Q>0){if(Q&16)H(tt,lt,ft,A,C);else if(Q&2&<.class!==ft.class&&o(tt,"class",null,ft.class,C),Q&4&&o(tt,"style",lt.style,ft.style,C),Q&8){const It=p.dynamicProps;for(let Nt=0;Nt{_t&&Fe(_t,A,p,m),gt&&Os(p,m,A,"updated")},$)},I=(m,p,A,$,C,D,et)=>{for(let tt=0;tt{if(p!==A){if(p!==Bt)for(const D in p)!Ln(D)&&!(D in A)&&o(m,D,p[D],null,C,$);for(const D in A){if(Ln(D))continue;const et=A[D],tt=p[D];et!==tt&&D!=="value"&&o(m,D,tt,et,C,$)}"value"in A&&o(m,"value",p.value,A.value,C)}},R=(m,p,A,$,C,D,et,tt,Q)=>{const G=p.el=m?m.el:a(""),gt=p.anchor=m?m.anchor:a("");let{patchFlag:lt,dynamicChildren:ft,slotScopeIds:_t}=p;_t&&(tt=tt?tt.concat(_t):_t),m==null?(n(G,A,$),n(gt,A,$),V(p.children||[],A,gt,C,D,et,tt,Q)):lt>0&<&64&&ft&&m.dynamicChildren?(I(m.dynamicChildren,ft,A,C,D,et,tt),(p.key!=null||C&&p===C.subTree)&&Pu(m,p,!0)):Y(m,p,A,gt,C,D,et,tt,Q)},at=(m,p,A,$,C,D,et,tt,Q)=>{p.slotScopeIds=tt,m==null?p.shapeFlag&512?C.ctx.activate(p,A,$,et,Q):F(p,A,$,C,D,et,Q):N(m,p,Q)},F=(m,p,A,$,C,D,et)=>{const tt=m.component=Vh(m,$,C);if(mu(m)&&(tt.ctx.renderer=ut),qh(tt,!1,et),tt.asyncDep){if(C&&C.registerDep(tt,P,et),!m.el){const Q=tt.subTree=ht(ls);S(null,Q,p,A),m.placeholder=Q.el}}else P(tt,m,p,A,C,D,et)},N=(m,p,A)=>{const $=p.component=m.component;if(Dh(m,p,A))if($.asyncDep&&!$.asyncResolved){W($,p,A);return}else $.next=p,$.update();else p.el=m.el,$.vnode=p},P=(m,p,A,$,C,D,et)=>{const tt=()=>{if(m.isMounted){let{next:lt,bu:ft,u:_t,parent:It,vnode:Nt}=m;{const ae=Ou(m);if(ae){lt&&(lt.el=Nt.el,W(m,lt,et)),ae.asyncDep.then(()=>{m.isUnmounted||tt()});return}}let Et=lt,oe;Rs(m,!1),lt?(lt.el=Nt.el,W(m,lt,et)):lt=Nt,ft&&Fi(ft),(oe=lt.props&<.props.onVnodeBeforeUpdate)&&Fe(oe,It,lt,Nt),Rs(m,!0);const re=Na(m),fe=m.subTree;m.subTree=re,v(fe,re,f(fe.el),j(fe),m,C,D),lt.el=re.el,Et===null&&Fh(m,re.el),_t&&xe(_t,C),(oe=lt.props&<.props.onVnodeUpdated)&&xe(()=>Fe(oe,It,lt,Nt),C)}else{let lt;const{el:ft,props:_t}=p,{bm:It,m:Nt,parent:Et,root:oe,type:re}=m,fe=jn(p);Rs(m,!1),It&&Fi(It),!fe&&(lt=_t&&_t.onVnodeBeforeMount)&&Fe(lt,Et,p),Rs(m,!0);{oe.ce&&oe.ce._def.shadowRoot!==!1&&oe.ce._injectChildStyle(re);const ae=m.subTree=Na(m);v(null,ae,A,$,m,C,D),p.el=ae.el}if(Nt&&xe(Nt,C),!fe&&(lt=_t&&_t.onVnodeMounted)){const ae=p;xe(()=>Fe(lt,Et,ae),C)}(p.shapeFlag&256||Et&&jn(Et.vnode)&&Et.vnode.shapeFlag&256)&&m.a&&xe(m.a,C),m.isMounted=!0,p=A=$=null}};m.scope.on();const Q=m.effect=new Vc(tt);m.scope.off();const G=m.update=Q.run.bind(Q),gt=m.job=Q.runIfDirty.bind(Q);gt.i=m,gt.id=m.uid,Q.scheduler=()=>Gr(gt),Rs(m,!0),G()},W=(m,p,A)=>{p.component=m;const $=m.vnode.props;m.vnode=p,m.next=null,bh(m,p.props,$,A),kh(m,p.children,A),rs(),Ea(m),as()},Y=(m,p,A,$,C,D,et,tt,Q=!1)=>{const G=m&&m.children,gt=m?m.shapeFlag:0,lt=p.children,{patchFlag:ft,shapeFlag:_t}=p;if(ft>0){if(ft&128){At(G,lt,A,$,C,D,et,tt,Q);return}else if(ft&256){st(G,lt,A,$,C,D,et,tt,Q);return}}_t&8?(gt&16&&Ct(G,C,D),lt!==G&&u(A,lt)):gt&16?_t&16?At(G,lt,A,$,C,D,et,tt,Q):Ct(G,C,D,!0):(gt&8&&u(A,""),_t&16&&V(lt,A,$,C,D,et,tt,Q))},st=(m,p,A,$,C,D,et,tt,Q)=>{m=m||nn,p=p||nn;const G=m.length,gt=p.length,lt=Math.min(G,gt);let ft;for(ft=0;ftgt?Ct(m,C,D,!0,!1,lt):V(p,A,$,C,D,et,tt,Q,lt)},At=(m,p,A,$,C,D,et,tt,Q)=>{let G=0;const gt=p.length;let lt=m.length-1,ft=gt-1;for(;G<=lt&&G<=ft;){const _t=m[G],It=p[G]=Q?ws(p[G]):Ue(p[G]);if(tn(_t,It))v(_t,It,A,null,C,D,et,tt,Q);else break;G++}for(;G<=lt&&G<=ft;){const _t=m[lt],It=p[ft]=Q?ws(p[ft]):Ue(p[ft]);if(tn(_t,It))v(_t,It,A,null,C,D,et,tt,Q);else break;lt--,ft--}if(G>lt){if(G<=ft){const _t=ft+1,It=_tft)for(;G<=lt;)O(m[G],C,D,!0),G++;else{const _t=G,It=G,Nt=new Map;for(G=It;G<=ft;G++){const it=p[G]=Q?ws(p[G]):Ue(p[G]);it.key!=null&&Nt.set(it.key,G)}let Et,oe=0;const re=ft-It+1;let fe=!1,ae=0;const Z=new Array(re);for(G=0;G=re){O(it,C,D,!0);continue}let q;if(it.key!=null)q=Nt.get(it.key);else for(Et=It;Et<=ft;Et++)if(Z[Et-It]===0&&tn(it,p[Et])){q=Et;break}q===void 0?O(it,C,D,!0):(Z[q-It]=G+1,q>=ae?ae=q:fe=!0,v(it,p[q],A,null,C,D,et,tt,Q),oe++)}const M=fe?Ih(Z):nn;for(Et=M.length-1,G=re-1;G>=0;G--){const it=It+G,q=p[it],jt=p[it+1],zt=it+1{const{el:D,type:et,transition:tt,children:Q,shapeFlag:G}=m;if(G&6){K(m.component.subTree,p,A,$);return}if(G&128){m.suspense.move(p,A,$);return}if(G&64){et.move(m,p,A,ut);return}if(et===wt){n(D,p,A);for(let lt=0;lttt.enter(D),C);else{const{leave:lt,delayLeave:ft,afterLeave:_t}=tt,It=()=>{m.ctx.isUnmounted?i(D):n(D,p,A)},Nt=()=>{D._isLeaving&&D[js](!0),lt(D,()=>{It(),_t&&_t()})};ft?ft(D,It,Nt):Nt()}else n(D,p,A)},O=(m,p,A,$=!1,C=!1)=>{const{type:D,props:et,ref:tt,children:Q,dynamicChildren:G,shapeFlag:gt,patchFlag:lt,dirs:ft,cacheIndex:_t}=m;if(lt===-2&&(C=!1),tt!=null&&(rs(),Nn(tt,null,A,m,!0),as()),_t!=null&&(p.renderCache[_t]=void 0),gt&256){p.ctx.deactivate(m);return}const It=gt&1&&ft,Nt=!jn(m);let Et;if(Nt&&(Et=et&&et.onVnodeBeforeUnmount)&&Fe(Et,p,m),gt&6)Pt(m.component,A,$);else{if(gt&128){m.suspense.unmount(A,$);return}It&&Os(m,null,p,"beforeUnmount"),gt&64?m.type.remove(m,p,A,ut,$):G&&!G.hasOnce&&(D!==wt||lt>0&<&64)?Ct(G,p,A,!1,!0):(D===wt&<&384||!C&>&16)&&Ct(Q,p,A),$&&bt(m)}(Nt&&(Et=et&&et.onVnodeUnmounted)||It)&&xe(()=>{Et&&Fe(Et,p,m),It&&Os(m,null,p,"unmounted")},A)},bt=m=>{const{type:p,el:A,anchor:$,transition:C}=m;if(p===wt){dt(A,$);return}if(p===ji){E(m);return}const D=()=>{i(A),C&&!C.persisted&&C.afterLeave&&C.afterLeave()};if(m.shapeFlag&1&&C&&!C.persisted){const{leave:et,delayLeave:tt}=C,Q=()=>et(A,D);tt?tt(m.el,D,Q):Q()}else D()},dt=(m,p)=>{let A;for(;m!==p;)A=h(m),i(m),m=A;i(p)},Pt=(m,p,A)=>{const{bum:$,scope:C,job:D,subTree:et,um:tt,m:Q,a:G}=m;Fa(Q),Fa(G),$&&Fi($),C.stop(),D&&(D.flags|=8,O(et,m,p,A)),tt&&xe(tt,p),xe(()=>{m.isUnmounted=!0},p)},Ct=(m,p,A,$=!1,C=!1,D=0)=>{for(let et=D;et{if(m.shapeFlag&6)return j(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const p=h(m.anchor||m.el),A=p&&p[qf];return A?h(A):p};let rt=!1;const nt=(m,p,A)=>{m==null?p._vnode&&O(p._vnode,null,null,!0):v(p._vnode||null,m,p,null,null,null,A),p._vnode=m,rt||(rt=!0,Ea(),du(),rt=!1)},ut={p:v,um:O,m:K,r:bt,mt:F,mc:V,pc:Y,pbc:I,n:j,o:e};return{render:nt,hydrate:void 0,createApp:mh(nt)}}function Wo({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Rs({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ah(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Pu(e,t,s=!1){const n=e.children,i=t.children;if(vt(n)&&vt(i))for(let o=0;o>1,e[s[a]]0&&(t[n]=s[o-1]),s[o]=n)}}for(o=s.length,r=s[o-1];o-- >0;)s[o]=r,r=t[r];return s}function Ou(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ou(t)}function Fa(e){if(e)for(let t=0;tEe(Mh);function ve(e,t,s){return Ru(e,t,s)}function Ru(e,t,s=Bt){const{immediate:n,deep:i,flush:o,once:r}=s,a=Qt({},s),l=t&&n||!t&&o!=="post";let c;if(ti){if(o==="sync"){const g=Eh();c=g.__watcherHandles||(g.__watcherHandles=[])}else if(!l){const g=()=>{};return g.stop=qe,g.resume=qe,g.pause=qe,g}}const u=ue;a.call=(g,y,v)=>$e(g,u,y,v);let f=!1;o==="post"?a.scheduler=g=>{xe(g,u&&u.suspense)}:o!=="sync"&&(f=!0,a.scheduler=(g,y)=>{y?g():Gr(g)}),a.augmentJob=g=>{t&&(g.flags|=4),f&&(g.flags|=2,u&&(g.id=u.uid,g.i=u))};const h=Hf(e,t,a);return ti&&(c?c.push(h):l&&h()),h}function Th(e,t,s){const n=this.proxy,i=Zt(e)?e.includes(".")?$u(n,e):()=>n[e]:e.bind(n,n);let o;kt(t)?o=t:(o=t.handler,s=t);const r=fi(this),a=Ru(i,o.bind(n),s);return r(),a}function $u(e,t){const s=t.split(".");return()=>{let n=e;for(let i=0;it==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Pe(t)}Modifiers`]||e[`${Ps(t)}Modifiers`];function Oh(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||Bt;let i=s;const o=t.startsWith("update:"),r=o&&Ph(n,t.slice(7));r&&(r.trim&&(i=s.map(u=>Zt(u)?u.trim():u)),r.number&&(i=s.map(Ui)));let a,l=n[a=Fo(t)]||n[a=Fo(Pe(t))];!l&&o&&(l=n[a=Fo(Ps(t))]),l&&$e(l,e,6,i);const c=n[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,$e(c,e,6,i)}}const Rh=new WeakMap;function Lu(e,t,s=!1){const n=s?Rh:t.emitsCache,i=n.get(e);if(i!==void 0)return i;const o=e.emits;let r={},a=!1;if(!kt(e)){const l=c=>{const u=Lu(c,t,!0);u&&(a=!0,Qt(r,u))};!s&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!a?(Ht(e)&&n.set(e,null),null):(vt(o)?o.forEach(l=>r[l]=null):Qt(r,o),Ht(e)&&n.set(e,r),r)}function So(e,t){return!e||!mo(t)?!1:(t=t.slice(2).replace(/Once$/,""),Rt(e,t[0].toLowerCase()+t.slice(1))||Rt(e,Ps(t))||Rt(e,t))}function Na(e){const{type:t,vnode:s,proxy:n,withProxy:i,propsOptions:[o],slots:r,attrs:a,emit:l,render:c,renderCache:u,props:f,data:h,setupState:g,ctx:y,inheritAttrs:v}=e,b=Gi(e);let S,_;try{if(s.shapeFlag&4){const E=i||n,B=E;S=Ue(c.call(B,E,u,f,g,h,y)),_=a}else{const E=t;S=Ue(E.length>1?E(f,{attrs:a,slots:r,emit:l}):E(f,null)),_=t.props?a:$h(a)}}catch(E){Bn.length=0,xo(E,e,1),S=ht(ls)}let k=S;if(_&&v!==!1){const E=Object.keys(_),{shapeFlag:B}=k;E.length&&B&7&&(o&&E.some(Fr)&&(_=Lh(_,o)),k=qs(k,_,!1,!0))}return s.dirs&&(k=qs(k,null,!1,!0),k.dirs=k.dirs?k.dirs.concat(s.dirs):s.dirs),s.transition&&Qn(k,s.transition),S=k,Gi(b),S}const $h=e=>{let t;for(const s in e)(s==="class"||s==="style"||mo(s))&&((t||(t={}))[s]=e[s]);return t},Lh=(e,t)=>{const s={};for(const n in e)(!Fr(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function Dh(e,t,s){const{props:n,children:i,component:o}=e,{props:r,children:a,patchFlag:l}=t,c=o.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&l>=0){if(l&1024)return!0;if(l&16)return n?ja(n,r,c):!!r;if(l&8){const u=t.dynamicProps;for(let f=0;fe.__isSuspense;function Nh(e,t){t&&t.pendingBranch?vt(e)?t.effects.push(...e):t.effects.push(e):Vf(e)}const wt=Symbol.for("v-fgt"),Co=Symbol.for("v-txt"),ls=Symbol.for("v-cmt"),ji=Symbol.for("v-stc"),Bn=[];let ge=null;function x(e=!1){Bn.push(ge=e?null:[])}function jh(){Bn.pop(),ge=Bn[Bn.length-1]||null}let ln=1;function Xi(e,t=!1){ln+=e,e<0&&ge&&t&&(ge.hasOnce=!0)}function Fu(e){return e.dynamicChildren=ln>0?ge||nn:null,jh(),ln>0&&ge&&ge.push(e),e}function w(e,t,s,n,i,o){return Fu(d(e,t,s,n,i,o,!0))}function is(e,t,s,n,i){return Fu(ht(e,t,s,n,i,!0))}function Qi(e){return e?e.__v_isVNode===!0:!1}function tn(e,t){return e.type===t.type&&e.key===t.key}const Nu=({key:e})=>e??null,zi=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Zt(e)||Gt(e)||kt(e)?{i:ke,r:e,k:t,f:!!s}:e:null);function d(e,t=null,s=null,n=0,i=null,o=e===wt?0:1,r=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Nu(t),ref:t&&zi(t),scopeId:hu,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:n,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:ke};return a?(Xr(l,s),o&128&&e.normalize(l)):s&&(l.shapeFlag|=Zt(s)?8:16),ln>0&&!r&&ge&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&ge.push(l),l}const ht=zh;function zh(e,t=null,s=null,n=0,i=null,o=!1){if((!e||e===ah)&&(e=ls),Qi(e)){const a=qs(e,t,!0);return s&&Xr(a,s),ln>0&&!o&&ge&&(a.shapeFlag&6?ge[ge.indexOf(e)]=a:ge.push(a)),a.patchFlag=-2,a}if(Jh(e)&&(e=e.__vccOpts),t){t=Bh(t);let{class:a,style:l}=t;a&&!Zt(a)&&(t.class=yt(a)),Ht(l)&&(ci(l)&&!vt(l)&&(l=Qt({},l)),t.style=li(l))}const r=Zt(e)?1:Du(e)?128:Kf(e)?64:Ht(e)?4:kt(e)?2:0;return d(e,t,s,n,i,r,o,!0)}function Bh(e){return e?ci(e)||Cu(e)?Qt({},e):e:null}function qs(e,t,s=!1,n=!1){const{props:i,ref:o,patchFlag:r,children:a,transition:l}=e,c=t?Hh(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Nu(c),ref:t&&t.ref?s&&o?vt(o)?o.concat(zi(t)):[o,zi(t)]:zi(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==wt?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qs(e.ssContent),ssFallback:e.ssFallback&&qs(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&n&&Qn(u,l.clone(u)),u}function mt(e=" ",t=0){return ht(Co,null,e,t)}function Ve(e,t){const s=ht(ji,null,e);return s.staticCount=t,s}function J(e="",t=!1){return t?(x(),is(ls,null,e)):ht(ls,null,e)}function Ue(e){return e==null||typeof e=="boolean"?ht(ls):vt(e)?ht(wt,null,e.slice()):Qi(e)?ws(e):ht(Co,null,String(e))}function ws(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qs(e)}function Xr(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(vt(t))s=16;else if(typeof t=="object")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),Xr(e,i()),i._c&&(i._d=!0));return}else{s=32;const i=t._;!i&&!Cu(t)?t._ctx=ke:i===3&&ke&&(ke.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else kt(t)?(t={default:t,_ctx:ke},s=32):(t=String(t),n&64?(s=16,t=[mt(t)]):s=8);e.children=t,e.shapeFlag|=s}function Hh(...e){const t={};for(let s=0;sue||ke;let to,gr;{const e=bo(),t=(s,n)=>{let i;return(i=e[s])||(i=e[s]=[]),i.push(n),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};to=t("__VUE_INSTANCE_SETTERS__",s=>ue=s),gr=t("__VUE_SSR_SETTERS__",s=>ti=s)}const fi=e=>{const t=ue;return to(e),e.scope.on(),()=>{e.scope.off(),to(t)}},za=()=>{ue&&ue.scope.off(),to(null)};function ju(e){return e.vnode.shapeFlag&4}let ti=!1;function qh(e,t=!1,s=!1){t&&gr(t);const{props:n,children:i}=e.vnode,o=ju(e);yh(e,n,o,t),wh(e,i,s||t);const r=o?Kh(e,t):void 0;return t&&gr(!1),r}function Kh(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ch);const{setup:n}=s;if(n){rs();const i=e.setupContext=n.length>1?Gh(e):null,o=fi(e),r=ui(n,e,0,[e.props,i]),a=Lc(r);if(as(),o(),(a||e.sp)&&!jn(e)&&gu(e),a){if(r.then(za,za),t)return r.then(l=>{Ba(e,l)}).catch(l=>{xo(l,e,0)});e.asyncDep=r}else Ba(e,r)}else zu(e)}function Ba(e,t,s){kt(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ht(t)&&(e.setupState=lu(t)),zu(e)}function zu(e,t,s){const n=e.type;e.render||(e.render=n.render||qe);{const i=fi(e);rs();try{uh(e)}finally{as(),i()}}}const Yh={get(e,t){return ce(e,"get",""),e[t]}};function Gh(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Yh),slots:e.slots,emit:e.emit,expose:t}}function Ao(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(lu(Kr(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in zn)return zn[s](e)},has(t,s){return s in t||s in zn}})):e.proxy}function Zh(e,t=!0){return kt(e)?e.displayName||e.name:e.name||t&&e.__name}function Jh(e){return kt(e)&&"__vccOpts"in e}const ot=(e,t)=>zf(e,t,ti);function ee(e,t,s){const n=(o,r,a)=>{Xi(-1);try{return ht(o,r,a)}finally{Xi(1)}},i=arguments.length;return i===2?Ht(t)&&!vt(t)?Qi(t)?n(e,null,[t]):n(e,t):n(e,null,t):(i>3?s=Array.prototype.slice.call(arguments,2):i===3&&Qi(s)&&(s=[s]),n(e,t,s))}function tS(e,t){const s=e.memo;if(s.length!=t.length)return!1;for(let n=0;n0&&ge&&ge.push(e),!0}const Bu="3.5.21";/** -* @vue/runtime-dom v3.5.21 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let mr;const Ha=typeof window<"u"&&window.trustedTypes;if(Ha)try{mr=Ha.createPolicy("vue",{createHTML:e=>e})}catch{}const Hu=mr?e=>mr.createHTML(e):e=>e,Xh="http://www.w3.org/2000/svg",Qh="http://www.w3.org/1998/Math/MathML",Qe=typeof document<"u"?document:null,Wa=Qe&&Qe.createElement("template"),tp={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const i=t==="svg"?Qe.createElementNS(Xh,e):t==="mathml"?Qe.createElementNS(Qh,e):s?Qe.createElement(e,{is:s}):Qe.createElement(e);return e==="select"&&n&&n.multiple!=null&&i.setAttribute("multiple",n.multiple),i},createText:e=>Qe.createTextNode(e),createComment:e=>Qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,i,o){const r=s?s.previousSibling:t.lastChild;if(i&&(i===o||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),s),!(i===o||!(i=i.nextSibling)););else{Wa.innerHTML=Hu(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const a=Wa.content;if(n==="svg"||n==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,s)}return[r?r.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},ms="transition",bn="animation",cn=Symbol("_vtc"),Wu={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ep=Qt({},Gf,Wu),$s=(e,t=[])=>{vt(e)?e.forEach(s=>s(...t)):e&&e(...t)},Ua=e=>e?vt(e)?e.some(t=>t.length>1):e.length>1:!1;function sp(e){const t={};for(const R in e)R in Wu||(t[R]=e[R]);if(e.css===!1)return t;const{name:s="v",type:n,duration:i,enterFromClass:o=`${s}-enter-from`,enterActiveClass:r=`${s}-enter-active`,enterToClass:a=`${s}-enter-to`,appearFromClass:l=o,appearActiveClass:c=r,appearToClass:u=a,leaveFromClass:f=`${s}-leave-from`,leaveActiveClass:h=`${s}-leave-active`,leaveToClass:g=`${s}-leave-to`}=e,y=np(i),v=y&&y[0],b=y&&y[1],{onBeforeEnter:S,onEnter:_,onEnterCancelled:k,onLeave:E,onLeaveCancelled:B,onBeforeAppear:L=S,onAppear:U=_,onAppearCancelled:V=k}=t,T=(R,at,F,N)=>{R._enterCancelled=N,bs(R,at?u:a),bs(R,at?c:r),F&&F()},I=(R,at)=>{R._isLeaving=!1,bs(R,f),bs(R,g),bs(R,h),at&&at()},H=R=>(at,F)=>{const N=R?U:_,P=()=>T(at,R,F);$s(N,[at,P]),Va(()=>{bs(at,R?l:o),je(at,R?u:a),Ua(N)||qa(at,n,v,P)})};return Qt(t,{onBeforeEnter(R){$s(S,[R]),je(R,o),je(R,r)},onBeforeAppear(R){$s(L,[R]),je(R,l),je(R,c)},onEnter:H(!1),onAppear:H(!0),onLeave(R,at){R._isLeaving=!0;const F=()=>I(R,at);je(R,f),R._enterCancelled?(je(R,h),vr()):(vr(),je(R,h)),Va(()=>{R._isLeaving&&(bs(R,f),je(R,g),Ua(E)||qa(R,n,b,F))}),$s(E,[R,F])},onEnterCancelled(R){T(R,!1,void 0,!0),$s(k,[R])},onAppearCancelled(R){T(R,!0,void 0,!0),$s(V,[R])},onLeaveCancelled(R){I(R),$s(B,[R])}})}function np(e){if(e==null)return null;if(Ht(e))return[Uo(e.enter),Uo(e.leave)];{const t=Uo(e);return[t,t]}}function Uo(e){return rf(e)}function je(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.add(s)),(e[cn]||(e[cn]=new Set)).add(t)}function bs(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.remove(n));const s=e[cn];s&&(s.delete(t),s.size||(e[cn]=void 0))}function Va(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ip=0;function qa(e,t,s,n){const i=e._endId=++ip,o=()=>{i===e._endId&&n()};if(s!=null)return setTimeout(o,s);const{type:r,timeout:a,propCount:l}=Uu(e,t);if(!r)return n();const c=r+"end";let u=0;const f=()=>{e.removeEventListener(c,h),o()},h=g=>{g.target===e&&++u>=l&&f()};setTimeout(()=>{u(s[y]||"").split(", "),i=n(`${ms}Delay`),o=n(`${ms}Duration`),r=Ka(i,o),a=n(`${bn}Delay`),l=n(`${bn}Duration`),c=Ka(a,l);let u=null,f=0,h=0;t===ms?r>0&&(u=ms,f=r,h=o.length):t===bn?c>0&&(u=bn,f=c,h=l.length):(f=Math.max(r,c),u=f>0?r>c?ms:bn:null,h=u?u===ms?o.length:l.length:0);const g=u===ms&&/\b(?:transform|all)(?:,|$)/.test(n(`${ms}Property`).toString());return{type:u,timeout:f,propCount:h,hasTransform:g}}function Ka(e,t){for(;e.lengthYa(s)+Ya(e[n])))}function Ya(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function vr(){return document.body.offsetHeight}function op(e,t,s){const n=e[cn];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const eo=Symbol("_vod"),Vu=Symbol("_vsh"),Ce={name:"show",beforeMount(e,{value:t},{transition:s}){e[eo]=e.style.display==="none"?"":e.style.display,s&&t?s.beforeEnter(e):_n(e,t)},mounted(e,{value:t},{transition:s}){s&&t&&s.enter(e)},updated(e,{value:t,oldValue:s},{transition:n}){!t!=!s&&(n?t?(n.beforeEnter(e),_n(e,!0),n.enter(e)):n.leave(e,()=>{_n(e,!1)}):_n(e,t))},beforeUnmount(e,{value:t}){_n(e,t)}};function _n(e,t){e.style.display=t?e[eo]:"none",e[Vu]=!t}const rp=Symbol(""),ap=/(?:^|;)\s*display\s*:/;function lp(e,t,s){const n=e.style,i=Zt(s);let o=!1;if(s&&!i){if(t)if(Zt(t))for(const r of t.split(";")){const a=r.slice(0,r.indexOf(":")).trim();s[a]==null&&Bi(n,a,"")}else for(const r in t)s[r]==null&&Bi(n,r,"");for(const r in s)r==="display"&&(o=!0),Bi(n,r,s[r])}else if(i){if(t!==s){const r=n[rp];r&&(s+=";"+r),n.cssText=s,o=ap.test(s)}}else t&&e.removeAttribute("style");eo in e&&(e[eo]=o?n.display:"",e[Vu]&&(n.display="none"))}const Ga=/\s*!important$/;function Bi(e,t,s){if(vt(s))s.forEach(n=>Bi(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=cp(e,t);Ga.test(s)?e.setProperty(Ps(n),s.replace(Ga,""),"important"):e[n]=s}}const Za=["Webkit","Moz","ms"],Vo={};function cp(e,t){const s=Vo[t];if(s)return s;let n=Pe(t);if(n!=="filter"&&n in e)return Vo[t]=n;n=yo(n);for(let i=0;iqo||(hp.then(()=>qo=0),qo=Date.now());function gp(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;$e(mp(n,s.value),t,5,[n])};return s.value=e,s.attached=pp(),s}function mp(e,t){if(vt(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>i=>!i._stopped&&n&&n(i))}else return t}const sl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,vp=(e,t,s,n,i,o)=>{const r=i==="svg";t==="class"?op(e,n,r):t==="style"?lp(e,s,n):mo(t)?Fr(t)||dp(e,t,s,n,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):yp(e,t,n,r))?(Qa(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Xa(e,t,n,r,o,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Zt(n))?Qa(e,Pe(t),n,o,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Xa(e,t,n,r))};function yp(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&sl(t)&&kt(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return sl(t)&&Zt(s)?!1:t in e}const qu=new WeakMap,Ku=new WeakMap,so=Symbol("_moveCb"),nl=Symbol("_enterCb"),bp=e=>(delete e.props.mode,e),_p=bp({name:"TransitionGroup",props:Qt({},ep,{tag:String,moveClass:String}),setup(e,{slots:t}){const s=Qr(),n=Yf();let i,o;return yu(()=>{if(!i.length)return;const r=e.moveClass||`${e.name||"v"}-move`;if(!Cp(i[0].el,s.vnode.el,r)){i=[];return}i.forEach(wp),i.forEach(kp);const a=i.filter(Sp);vr(),a.forEach(l=>{const c=l.el,u=c.style;je(c,r),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[so]=h=>{h&&h.target!==c||(!h||h.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",f),c[so]=null,bs(c,r))};c.addEventListener("transitionend",f)}),i=[]}),()=>{const r=Mt(e),a=sp(r);let l=r.tag||wt;if(i=[],o)for(let c=0;c{a.split(/\s+/).forEach(l=>l&&n.classList.remove(l))}),s.split(/\s+/).forEach(a=>a&&n.classList.add(a)),n.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(n);const{hasTransform:r}=Uu(n);return o.removeChild(n),r}const Es=e=>{const t=e.props["onUpdate:modelValue"]||!1;return vt(t)?s=>Fi(t,s):t};function Ap(e){e.target.composing=!0}function il(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Te=Symbol("_assign"),Oe={created(e,{modifiers:{lazy:t,trim:s,number:n}},i){e[Te]=Es(i);const o=n||i.props&&i.props.type==="number";ns(e,t?"change":"input",r=>{if(r.target.composing)return;let a=e.value;s&&(a=a.trim()),o&&(a=Ui(a)),e[Te](a)}),s&&ns(e,"change",()=>{e.value=e.value.trim()}),t||(ns(e,"compositionstart",Ap),ns(e,"compositionend",il),ns(e,"change",il))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:i,number:o}},r){if(e[Te]=Es(r),e.composing)return;const a=(o||e.type==="number")&&!/^0\d/.test(e.value)?Ui(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(n&&t===s||i&&e.value.trim()===l)||(e.value=l))}},Mn={deep:!0,created(e,t,s){e[Te]=Es(s),ns(e,"change",()=>{const n=e._modelValue,i=un(e),o=e.checked,r=e[Te];if(vt(n)){const a=zr(n,i),l=a!==-1;if(o&&!l)r(n.concat(i));else if(!o&&l){const c=[...n];c.splice(a,1),r(c)}}else if(pn(n)){const a=new Set(n);o?a.add(i):a.delete(i),r(a)}else r(Yu(e,o))})},mounted:ol,beforeUpdate(e,t,s){e[Te]=Es(s),ol(e,t,s)}};function ol(e,{value:t,oldValue:s},n){e._modelValue=t;let i;if(vt(t))i=zr(t,n.props.value)>-1;else if(pn(t))i=t.has(n.props.value);else{if(t===s)return;i=Vs(t,Yu(e,!0))}e.checked!==i&&(e.checked=i)}const yr={created(e,{value:t},s){e.checked=Vs(t,s.props.value),e[Te]=Es(s),ns(e,"change",()=>{e[Te](un(e))})},beforeUpdate(e,{value:t,oldValue:s},n){e[Te]=Es(n),t!==s&&(e.checked=Vs(t,n.props.value))}},br={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const i=pn(t);ns(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>s?Ui(un(r)):un(r));e[Te](e.multiple?i?new Set(o):o:o[0]),e._assigning=!0,di(()=>{e._assigning=!1})}),e[Te]=Es(n)},mounted(e,{value:t}){rl(e,t)},beforeUpdate(e,t,s){e[Te]=Es(s)},updated(e,{value:t}){e._assigning||rl(e,t)}};function rl(e,t){const s=e.multiple,n=vt(t);if(!(s&&!n&&!pn(t))){for(let i=0,o=e.options.length;iString(c)===String(a)):r.selected=zr(t,a)>-1}else r.selected=t.has(a);else if(Vs(un(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function un(e){return"_value"in e?e._value:e.value}function Yu(e,t){const s=t?"_trueValue":"_falseValue";return s in e?e[s]:t}const eS={created(e,t,s){xi(e,t,s,null,"created")},mounted(e,t,s){xi(e,t,s,null,"mounted")},beforeUpdate(e,t,s,n){xi(e,t,s,n,"beforeUpdate")},updated(e,t,s,n){xi(e,t,s,n,"updated")}};function Ip(e,t){switch(e){case"SELECT":return br;case"TEXTAREA":return Oe;default:switch(t){case"checkbox":return Mn;case"radio":return yr;default:return Oe}}}function xi(e,t,s,n,i){const r=Ip(e.tagName,s.props&&s.props.type)[i];r&&r(e,t,s,n)}const Mp=["ctrl","shift","alt","meta"],Ep={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Mp.some(s=>e[`${s}Key`]&&!t.includes(s))},mn=(e,t)=>{const s=e._withMods||(e._withMods={}),n=t.join(".");return s[n]||(s[n]=(i,...o)=>{for(let r=0;r{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=i=>{if(!("key"in i))return;const o=Ps(i.key);if(t.some(r=>r===o||Tp[r]===o))return e(i)})},Pp=Qt({patchProp:vp},tp);let al;function Op(){return al||(al=Sh(Pp))}const Rp=(...e)=>{const t=Op().createApp(...e),{mount:s}=t;return t.mount=n=>{const i=Lp(n);if(!i)return;const o=t._component;!kt(o)&&!o.render&&!o.template&&(o.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=s(i,!1,$p(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t};function $p(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Lp(e){return Zt(e)?document.querySelector(e):e}/*! - * pinia v2.3.1 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */let Zu;const Io=e=>Zu=e,Ju=Symbol();function _r(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Hn;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Hn||(Hn={}));function Dp(){const e=Wc(!0),t=e.run(()=>X({}));let s=[],n=[];const i=Kr({install(o){Io(i),i._a=o,o.provide(Ju,i),o.config.globalProperties.$pinia=i,n.forEach(r=>s.push(r)),n=[]},use(o){return this._a?s.push(o):n.push(o),this},_p:s,_a:null,_e:e,_s:new Map,state:t});return i}const Xu=()=>{};function ll(e,t,s,n=Xu){e.push(t);const i=()=>{const o=e.indexOf(t);o>-1&&(e.splice(o,1),n())};return!s&&Uc()&&pf(i),i}function Gs(e,...t){e.slice().forEach(s=>{s(...t)})}const Fp=e=>e(),cl=Symbol(),Ko=Symbol();function xr(e,t){e instanceof Map&&t instanceof Map?t.forEach((s,n)=>e.set(n,s)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const s in t){if(!t.hasOwnProperty(s))continue;const n=t[s],i=e[s];_r(i)&&_r(n)&&e.hasOwnProperty(s)&&!Gt(n)&&!As(n)?e[s]=xr(i,n):e[s]=n}return e}const Np=Symbol();function jp(e){return!_r(e)||!e.hasOwnProperty(Np)}const{assign:_s}=Object;function zp(e){return!!(Gt(e)&&e.effect)}function Bp(e,t,s,n){const{state:i,actions:o,getters:r}=t,a=s.state.value[e];let l;function c(){a||(s.state.value[e]=i?i():{});const u=Df(s.state.value[e]);return _s(u,o,Object.keys(r||{}).reduce((f,h)=>(f[h]=Kr(ot(()=>{Io(s);const g=s._s.get(e);return r[h].call(g,g)})),f),{}))}return l=Qu(e,c,t,s,n,!0),l}function Qu(e,t,s={},n,i,o){let r;const a=_s({actions:{}},s),l={deep:!0};let c,u,f=[],h=[],g;const y=n.state.value[e];!o&&!y&&(n.state.value[e]={}),X({});let v;function b(V){let T;c=u=!1,typeof V=="function"?(V(n.state.value[e]),T={type:Hn.patchFunction,storeId:e,events:g}):(xr(n.state.value[e],V),T={type:Hn.patchObject,payload:V,storeId:e,events:g});const I=v=Symbol();di().then(()=>{v===I&&(c=!0)}),u=!0,Gs(f,T,n.state.value[e])}const S=o?function(){const{state:T}=s,I=T?T():{};this.$patch(H=>{_s(H,I)})}:Xu;function _(){r.stop(),f=[],h=[],n._s.delete(e)}const k=(V,T="")=>{if(cl in V)return V[Ko]=T,V;const I=function(){Io(n);const H=Array.from(arguments),R=[],at=[];function F(W){R.push(W)}function N(W){at.push(W)}Gs(h,{args:H,name:I[Ko],store:B,after:F,onError:N});let P;try{P=V.apply(this&&this.$id===e?this:B,H)}catch(W){throw Gs(at,W),W}return P instanceof Promise?P.then(W=>(Gs(R,W),W)).catch(W=>(Gs(at,W),Promise.reject(W))):(Gs(R,P),P)};return I[cl]=!0,I[Ko]=T,I},E={_p:n,$id:e,$onAction:ll.bind(null,h),$patch:b,$reset:S,$subscribe(V,T={}){const I=ll(f,V,T.detached,()=>H()),H=r.run(()=>ve(()=>n.state.value[e],R=>{(T.flush==="sync"?u:c)&&V({storeId:e,type:Hn.direct,events:g},R)},_s({},l,T)));return I},$dispose:_},B=us(E);n._s.set(e,B);const U=(n._a&&n._a.runWithContext||Fp)(()=>n._e.run(()=>(r=Wc()).run(()=>t({action:k}))));for(const V in U){const T=U[V];if(Gt(T)&&!zp(T)||As(T))o||(y&&jp(T)&&(Gt(T)?T.value=y[V]:xr(T,y[V])),n.state.value[e][V]=T);else if(typeof T=="function"){const I=k(T,V);U[V]=I,a.actions[V]=T}}return _s(B,U),_s(Mt(B),U),Object.defineProperty(B,"$state",{get:()=>n.state.value[e],set:V=>{b(T=>{_s(T,V)})}}),n._p.forEach(V=>{_s(B,r.run(()=>V({store:B,app:n._a,pinia:n,options:a})))}),y&&o&&s.hydrate&&s.hydrate(B.$state,y),c=!0,u=!0,B}/*! #__NO_SIDE_EFFECTS__ */function Mo(e,t,s){let n,i;const o=typeof t=="function";typeof e=="string"?(n=e,i=o?s:t):(i=e,n=e.id);function r(a,l){const c=vh();return a=a||(c?Ee(Ju,null):null),a&&Io(a),a=Zu,a._s.has(n)||(o?Qu(n,t,i,a):Bp(n,i,a)),a._s.get(n)}return r.$id=n,r}const td="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgdmlld0JveD0iMCAwIDEyMCAxMjAiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImxvZ28uc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjQuMiAoZWJmMGU5NDAsIDIwMjUtMDUtMDgpIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNSI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE2IgogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2NjZmZkZDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AxNiIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwNjY0NDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AxNyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDE2IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTciCiAgICAgICBjeD0iMjguOTY2NjczIgogICAgICAgY3k9IjIzLjY0MDUzNyIKICAgICAgIGZ4PSIyOC45NjY2NzMiCiAgICAgICBmeT0iMjMuNjQwNTM3IgogICAgICAgcj0iMzEuOTAxNTAyIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjU1NjE0NSwyLjQwMTg4MjksLTEuNTMxMTUyLDAuOTkyMDExMTUsMTMuNTMzMjY4LC05NC43MjIzOTIpIgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIC8+CiAgPC9kZWZzPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3NSIKICAgICBwYWdlY29sb3I9IiM1MDUwNTAiCiAgICAgYm9yZGVyY29sb3I9IiNlZWVlZWUiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIwIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iIzUwNTA1MCIKICAgICBpbmtzY2FwZTp6b29tPSI2LjI5ODUxNTkiCiAgICAgaW5rc2NhcGU6Y3g9IjYwLjU2OTgyNCIKICAgICBpbmtzY2FwZTpjeT0iNTcuNTUzMjQxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTQ4OCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI5NTYiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI1IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNSIgLz4KICA8dGl0bGUKICAgICBpZD0idGl0bGUxIj5tY3Bwcm94eSBzaGllbGQgbG9nbzwvdGl0bGU+CiAgPGRlc2MKICAgICBpZD0iZGVzYzEiPkJsdWUgc2hpZWxkIHdpdGggTUNQIGNpcmNsZXMgYmVuZWF0aDwvZGVzYz4KICA8cGF0aAogICAgIGQ9Ik0gNjEuMDc2Nzk1LC0wLjEyMDIwMTA2IDI1LjY2OTQ0OCwxMi44MjMyNzQgViAzOC43MTAyMyBjIDAsMjIuNjUxMDg0IDE0LjY0OTc5LDQ2LjMzNzY1MiAzNS40MDczNDcsNTEuNzczOTEzIEMgODEuODM0MzUxLDg1LjA0Nzg4MiA5Ni40ODQxNDEsNjEuMzYxMzE0IDk2LjQ4NDE0MSwzOC43MTAyMyBWIDEyLjgyMzI3NCBaIgogICAgIGZpbGw9IiMwMDdiZmYiCiAgICAgaWQ9InBhdGgxIgogICAgIHN0eWxlPSJmaWxsOnVybCgjcmFkaWFsR3JhZGllbnQxNyk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlLXdpZHRoOjQuMzcwMjtzdHJva2UtZGFzaGFycmF5Om5vbmUiCiAgICAgaW5rc2NhcGU6dHJhbnNmb3JtLWNlbnRlci14PSItMy42MDYwMTA1IgogICAgIGlua3NjYXBlOnRyYW5zZm9ybS1jZW50ZXIteT0iNC42MDc2Nzk1IiAvPgogIDwhLS0gTUNQIGNpcmNsZXMgLS0+CiAgPGVsbGlwc2UKICAgICBjeD0iMjcuMjE4MTQyIgogICAgIGN5PSI5OS4yMzk1NzEiCiAgICAgZmlsbD0iIzAwN2JmZiIKICAgICBpZD0iY2lyY2xlMSIKICAgICByeD0iMTYuNjQ4ODYxIgogICAgIHJ5PSIxNy42NTE5MiIKICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuNzE0MzE7ZmlsbDojMDA1NTMzO2ZpbGwtb3BhY2l0eToxIiAvPgogIDxlbGxpcHNlCiAgICAgY3g9IjYwLjUxNTg1OCIKICAgICBjeT0iOTkuMjM5NTcxIgogICAgIGZpbGw9IiMwMDdiZmYiCiAgICAgaWQ9ImNpcmNsZTIiCiAgICAgcng9IjE2LjY0ODg2MSIKICAgICByeT0iMTcuNjUxOTIiCiAgICAgc3R5bGU9InN0cm9rZS13aWR0aDoxLjcxNDMxO2ZpbGw6IzAwNTUzMztmaWxsLW9wYWNpdHk6MSIgLz4KICA8ZWxsaXBzZQogICAgIGN4PSI5My44MTM1ODMiCiAgICAgY3k9Ijk5LjIzOTU3MSIKICAgICBmaWxsPSIjMDA3YmZmIgogICAgIGlkPSJjaXJjbGUzIgogICAgIHJ4PSIxNi42NDg4NjEiCiAgICAgcnk9IjE3LjY1MTkyIgogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MS43MTQzMTtmaWxsOiMwMDU1MzM7ZmlsbC1vcGFjaXR5OjEiIC8+CiAgPCEtLSBMZXR0ZXJzIC0tPgogIDx0ZXh0CiAgICAgeD0iMjguMDI2MDciCiAgICAgeT0iMTAzLjIzNTkzIgogICAgIHRleHQtYW5jaG9yPSJtaWRkbGUiCiAgICAgZm9udC1mYW1pbHk9IkFyaWFsIgogICAgIGZvbnQtc2l6ZT0iMTcuMTQzMXB4IgogICAgIGZpbGw9IiNmZmZmZmYiCiAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCiAgICAgaWQ9InRleHQzIgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMC45NzExNzIyMywxLjAyOTY4MzUpIgogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MS43MTQzMSI+TTwvdGV4dD4KICA8dGV4dAogICAgIHg9IjYyLjMxMjE4IgogICAgIHk9IjEwMy4yMzU5MyIKICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIgogICAgIGZvbnQtZmFtaWx5PSJBcmlhbCIKICAgICBmb250LXNpemU9IjE3LjE0MzFweCIKICAgICBmaWxsPSIjZmZmZmZmIgogICAgIGZvbnQtd2VpZ2h0PSJib2xkIgogICAgIGlkPSJ0ZXh0NCIKICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOTcxMTcyMjMsMS4wMjk2ODM1KSIKICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuNzE0MzEiPkM8L3RleHQ+CiAgPHRleHQKICAgICB4PSI5Ni41OTgyODkiCiAgICAgeT0iMTAzLjIzNTkzIgogICAgIHRleHQtYW5jaG9yPSJtaWRkbGUiCiAgICAgZm9udC1mYW1pbHk9IkFyaWFsIgogICAgIGZvbnQtc2l6ZT0iMTcuMTQzMXB4IgogICAgIGZpbGw9IiNmZmZmZmYiCiAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCiAgICAgaWQ9InRleHQ1IgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMC45NzExNzIyMywxLjAyOTY4MzUpIgogICAgIHN0eWxlPSJzdHJva2Utd2lkdGg6MS43MTQzMSI+UDwvdGV4dD4KPC9zdmc+Cg==";/*! - * vue-router v4.5.1 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */const en=typeof document<"u";function ed(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Hp(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&ed(e.default)}const Ot=Object.assign;function Yo(e,t){const s={};for(const n in t){const i=t[n];s[n]=Le(i)?i.map(e):e(i)}return s}const Wn=()=>{},Le=Array.isArray,sd=/#/g,Wp=/&/g,Up=/\//g,Vp=/=/g,qp=/\?/g,nd=/\+/g,Kp=/%5B/g,Yp=/%5D/g,id=/%5E/g,Gp=/%60/g,od=/%7B/g,Zp=/%7C/g,rd=/%7D/g,Jp=/%20/g;function ta(e){return encodeURI(""+e).replace(Zp,"|").replace(Kp,"[").replace(Yp,"]")}function Xp(e){return ta(e).replace(od,"{").replace(rd,"}").replace(id,"^")}function wr(e){return ta(e).replace(nd,"%2B").replace(Jp,"+").replace(sd,"%23").replace(Wp,"%26").replace(Gp,"`").replace(od,"{").replace(rd,"}").replace(id,"^")}function Qp(e){return wr(e).replace(Vp,"%3D")}function tg(e){return ta(e).replace(sd,"%23").replace(qp,"%3F")}function eg(e){return e==null?"":tg(e).replace(Up,"%2F")}function ei(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const sg=/\/$/,ng=e=>e.replace(sg,"");function Go(e,t,s="/"){let n,i={},o="",r="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(n=t.slice(0,l),o=t.slice(l+1,a>-1?a:t.length),i=e(o)),a>-1&&(n=n||t.slice(0,a),r=t.slice(a,t.length)),n=ag(n??t,s),{fullPath:n+(o&&"?")+o+r,path:n,query:i,hash:ei(r)}}function ig(e,t){const s=t.query?e(t.query):"";return t.path+(s&&"?")+s+(t.hash||"")}function ul(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function og(e,t,s){const n=t.matched.length-1,i=s.matched.length-1;return n>-1&&n===i&&dn(t.matched[n],s.matched[i])&&ad(t.params,s.params)&&e(t.query)===e(s.query)&&t.hash===s.hash}function dn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ad(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const s in e)if(!rg(e[s],t[s]))return!1;return!0}function rg(e,t){return Le(e)?dl(e,t):Le(t)?dl(t,e):e===t}function dl(e,t){return Le(t)?e.length===t.length&&e.every((s,n)=>s===t[n]):e.length===1&&e[0]===t}function ag(e,t){if(e.startsWith("/"))return e;if(!e)return t;const s=t.split("/"),n=e.split("/"),i=n[n.length-1];(i===".."||i===".")&&n.push("");let o=s.length-1,r,a;for(r=0;r1&&o--;else break;return s.slice(0,o).join("/")+"/"+n.slice(r).join("/")}const vs={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var si;(function(e){e.pop="pop",e.push="push"})(si||(si={}));var Un;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Un||(Un={}));function lg(e){if(!e)if(en){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ng(e)}const cg=/^[^#]+#/;function ug(e,t){return e.replace(cg,"#")+t}function dg(e,t){const s=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-s.left-(t.left||0),top:n.top-s.top-(t.top||0)}}const Eo=()=>({left:window.scrollX,top:window.scrollY});function fg(e){let t;if("el"in e){const s=e.el,n=typeof s=="string"&&s.startsWith("#"),i=typeof s=="string"?n?document.getElementById(s.slice(1)):document.querySelector(s):s;if(!i)return;t=dg(i,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function fl(e,t){return(history.state?history.state.position-t:-1)+e}const kr=new Map;function hg(e,t){kr.set(e,t)}function pg(e){const t=kr.get(e);return kr.delete(e),t}let gg=()=>location.protocol+"//"+location.host;function ld(e,t){const{pathname:s,search:n,hash:i}=t,o=e.indexOf("#");if(o>-1){let a=i.includes(e.slice(o))?e.slice(o).length:1,l=i.slice(a);return l[0]!=="/"&&(l="/"+l),ul(l,"")}return ul(s,e)+n+i}function mg(e,t,s,n){let i=[],o=[],r=null;const a=({state:h})=>{const g=ld(e,location),y=s.value,v=t.value;let b=0;if(h){if(s.value=g,t.value=h,r&&r===y){r=null;return}b=v?h.position-v.position:0}else n(g);i.forEach(S=>{S(s.value,y,{delta:b,type:si.pop,direction:b?b>0?Un.forward:Un.back:Un.unknown})})};function l(){r=s.value}function c(h){i.push(h);const g=()=>{const y=i.indexOf(h);y>-1&&i.splice(y,1)};return o.push(g),g}function u(){const{history:h}=window;h.state&&h.replaceState(Ot({},h.state,{scroll:Eo()}),"")}function f(){for(const h of o)h();o=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",u)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",u,{passive:!0}),{pauseListeners:l,listen:c,destroy:f}}function hl(e,t,s,n=!1,i=!1){return{back:e,current:t,forward:s,replaced:n,position:window.history.length,scroll:i?Eo():null}}function vg(e){const{history:t,location:s}=window,n={value:ld(e,s)},i={value:t.state};i.value||o(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(l,c,u){const f=e.indexOf("#"),h=f>-1?(s.host&&document.querySelector("base")?e:e.slice(f))+l:gg()+e+l;try{t[u?"replaceState":"pushState"](c,"",h),i.value=c}catch(g){console.error(g),s[u?"replace":"assign"](h)}}function r(l,c){const u=Ot({},t.state,hl(i.value.back,l,i.value.forward,!0),c,{position:i.value.position});o(l,u,!0),n.value=l}function a(l,c){const u=Ot({},i.value,t.state,{forward:l,scroll:Eo()});o(u.current,u,!0);const f=Ot({},hl(n.value,l,null),{position:u.position+1},c);o(l,f,!1),n.value=l}return{location:n,state:i,push:a,replace:r}}function yg(e){e=lg(e);const t=vg(e),s=mg(e,t.state,t.location,t.replace);function n(o,r=!0){r||s.pauseListeners(),history.go(o)}const i=Ot({location:"",base:e,go:n,createHref:ug.bind(null,e)},t,s);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>t.state.value}),i}function bg(e){return typeof e=="string"||e&&typeof e=="object"}function cd(e){return typeof e=="string"||typeof e=="symbol"}const ud=Symbol("");var pl;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(pl||(pl={}));function fn(e,t){return Ot(new Error,{type:e,[ud]:!0},t)}function Ge(e,t){return e instanceof Error&&ud in e&&(t==null||!!(e.type&t))}const gl="[^/]+?",_g={sensitive:!1,strict:!1,start:!0,end:!0},xg=/[.+*?^${}()[\]/\\]/g;function wg(e,t){const s=Ot({},_g,t),n=[];let i=s.start?"^":"";const o=[];for(const c of e){const u=c.length?[]:[90];s.strict&&!c.length&&(i+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function dd(e,t){let s=0;const n=e.score,i=t.score;for(;s0&&t[t.length-1]<0}const Sg={type:0,value:""},Cg=/[a-zA-Z0-9_]/;function Ag(e){if(!e)return[[]];if(e==="/")return[[Sg]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${s})/"${c}": ${g}`)}let s=0,n=s;const i=[];let o;function r(){o&&i.push(o),o=[]}let a=0,l,c="",u="";function f(){c&&(s===0?o.push({type:0,value:c}):s===1||s===2||s===3?(o.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:c,regexp:u,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),c="")}function h(){c+=l}for(;a{r(k)}:Wn}function r(f){if(cd(f)){const h=n.get(f);h&&(n.delete(f),s.splice(s.indexOf(h),1),h.children.forEach(r),h.alias.forEach(r))}else{const h=s.indexOf(f);h>-1&&(s.splice(h,1),f.record.name&&n.delete(f.record.name),f.children.forEach(r),f.alias.forEach(r))}}function a(){return s}function l(f){const h=Pg(f,s);s.splice(h,0,f),f.record.name&&!bl(f)&&n.set(f.record.name,f)}function c(f,h){let g,y={},v,b;if("name"in f&&f.name){if(g=n.get(f.name),!g)throw fn(1,{location:f});b=g.record.name,y=Ot(vl(h.params,g.keys.filter(k=>!k.optional).concat(g.parent?g.parent.keys.filter(k=>k.optional):[]).map(k=>k.name)),f.params&&vl(f.params,g.keys.map(k=>k.name))),v=g.stringify(y)}else if(f.path!=null)v=f.path,g=s.find(k=>k.re.test(v)),g&&(y=g.parse(v),b=g.record.name);else{if(g=h.name?n.get(h.name):s.find(k=>k.re.test(h.path)),!g)throw fn(1,{location:f,currentLocation:h});b=g.record.name,y=Ot({},h.params,f.params),v=g.stringify(y)}const S=[];let _=g;for(;_;)S.unshift(_.record),_=_.parent;return{name:b,path:v,params:y,matched:S,meta:Tg(S)}}e.forEach(f=>o(f));function u(){s.length=0,n.clear()}return{addRoute:o,resolve:c,removeRoute:r,clearRoutes:u,getRoutes:a,getRecordMatcher:i}}function vl(e,t){const s={};for(const n of t)n in e&&(s[n]=e[n]);return s}function yl(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Eg(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Eg(e){const t={},s=e.props||!1;if("component"in e)t.default=s;else for(const n in e.components)t[n]=typeof s=="object"?s[n]:s;return t}function bl(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Tg(e){return e.reduce((t,s)=>Ot(t,s.meta),{})}function _l(e,t){const s={};for(const n in e)s[n]=n in t?t[n]:e[n];return s}function Pg(e,t){let s=0,n=t.length;for(;s!==n;){const o=s+n>>1;dd(e,t[o])<0?n=o:s=o+1}const i=Og(e);return i&&(n=t.lastIndexOf(i,n-1)),n}function Og(e){let t=e;for(;t=t.parent;)if(fd(t)&&dd(e,t)===0)return t}function fd({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Rg(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let i=0;io&&wr(o)):[n&&wr(n)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+s,o!=null&&(t+="="+o))})}return t}function $g(e){const t={};for(const s in e){const n=e[s];n!==void 0&&(t[s]=Le(n)?n.map(i=>i==null?null:""+i):n==null?n:""+n)}return t}const Lg=Symbol(""),wl=Symbol(""),To=Symbol(""),ea=Symbol(""),Sr=Symbol("");function xn(){let e=[];function t(n){return e.push(n),()=>{const i=e.indexOf(n);i>-1&&e.splice(i,1)}}function s(){e=[]}return{add:t,list:()=>e.slice(),reset:s}}function ks(e,t,s,n,i,o=r=>r()){const r=n&&(n.enterCallbacks[i]=n.enterCallbacks[i]||[]);return()=>new Promise((a,l)=>{const c=h=>{h===!1?l(fn(4,{from:s,to:t})):h instanceof Error?l(h):bg(h)?l(fn(2,{from:t,to:h})):(r&&n.enterCallbacks[i]===r&&typeof h=="function"&&r.push(h),a())},u=o(()=>e.call(n&&n.instances[i],t,s,c));let f=Promise.resolve(u);e.length<3&&(f=f.then(c)),f.catch(h=>l(h))})}function Zo(e,t,s,n,i=o=>o()){const o=[];for(const r of e)for(const a in r.components){let l=r.components[a];if(!(t!=="beforeRouteEnter"&&!r.instances[a]))if(ed(l)){const u=(l.__vccOpts||l)[t];u&&o.push(ks(u,s,n,r,a,i))}else{let c=l();o.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${a}" at "${r.path}"`);const f=Hp(u)?u.default:u;r.mods[a]=u,r.components[a]=f;const g=(f.__vccOpts||f)[t];return g&&ks(g,s,n,r,a,i)()}))}}return o}function kl(e){const t=Ee(To),s=Ee(ea),n=ot(()=>{const l=ct(e.to);return t.resolve(l)}),i=ot(()=>{const{matched:l}=n.value,{length:c}=l,u=l[c-1],f=s.matched;if(!u||!f.length)return-1;const h=f.findIndex(dn.bind(null,u));if(h>-1)return h;const g=Sl(l[c-2]);return c>1&&Sl(u)===g&&f[f.length-1].path!==g?f.findIndex(dn.bind(null,l[c-2])):h}),o=ot(()=>i.value>-1&&zg(s.params,n.value.params)),r=ot(()=>i.value>-1&&i.value===s.matched.length-1&&ad(s.params,n.value.params));function a(l={}){if(jg(l)){const c=t[ct(e.replace)?"replace":"push"](ct(e.to)).catch(Wn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:n,href:ot(()=>n.value.href),isActive:o,isExactActive:r,navigate:a}}function Dg(e){return e.length===1?e[0]:e}const Fg=ie({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:kl,setup(e,{slots:t}){const s=us(kl(e)),{options:n}=Ee(To),i=ot(()=>({[Cl(e.activeClass,n.linkActiveClass,"router-link-active")]:s.isActive,[Cl(e.exactActiveClass,n.linkExactActiveClass,"router-link-exact-active")]:s.isExactActive}));return()=>{const o=t.default&&Dg(t.default(s));return e.custom?o:ee("a",{"aria-current":s.isExactActive?e.ariaCurrentValue:null,href:s.href,onClick:s.navigate,class:i.value},o)}}}),Ng=Fg;function jg(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function zg(e,t){for(const s in t){const n=t[s],i=e[s];if(typeof n=="string"){if(n!==i)return!1}else if(!Le(i)||i.length!==n.length||n.some((o,r)=>o!==i[r]))return!1}return!0}function Sl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Cl=(e,t,s)=>e??t??s,Bg=ie({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:s}){const n=Ee(Sr),i=ot(()=>e.route||n.value),o=Ee(wl,0),r=ot(()=>{let c=ct(o);const{matched:u}=i.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),a=ot(()=>i.value.matched[r.value]);Ni(wl,ot(()=>r.value+1)),Ni(Lg,a),Ni(Sr,i);const l=X();return ve(()=>[l.value,a.value,e.name],([c,u,f],[h,g,y])=>{u&&(u.instances[f]=c,g&&g!==u&&c&&c===h&&(u.leaveGuards.size||(u.leaveGuards=g.leaveGuards),u.updateGuards.size||(u.updateGuards=g.updateGuards))),c&&u&&(!g||!dn(u,g)||!h)&&(u.enterCallbacks[f]||[]).forEach(v=>v(c))},{flush:"post"}),()=>{const c=i.value,u=e.name,f=a.value,h=f&&f.components[u];if(!h)return Al(s.default,{Component:h,route:c});const g=f.props[u],y=g?g===!0?c.params:typeof g=="function"?g(c):g:null,b=ee(h,Ot({},y,t,{onVnodeUnmounted:S=>{S.component.isUnmounted&&(f.instances[u]=null)},ref:l}));return Al(s.default,{Component:b,route:c})||b}}});function Al(e,t){if(!e)return null;const s=e(t);return s.length===1?s[0]:s}const Hg=Bg;function Wg(e){const t=Mg(e.routes,e),s=e.parseQuery||Rg,n=e.stringifyQuery||xl,i=e.history,o=xn(),r=xn(),a=xn(),l=Yr(vs);let c=vs;en&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=Yo.bind(null,j=>""+j),f=Yo.bind(null,eg),h=Yo.bind(null,ei);function g(j,rt){let nt,ut;return cd(j)?(nt=t.getRecordMatcher(j),ut=rt):ut=j,t.addRoute(ut,nt)}function y(j){const rt=t.getRecordMatcher(j);rt&&t.removeRoute(rt)}function v(){return t.getRoutes().map(j=>j.record)}function b(j){return!!t.getRecordMatcher(j)}function S(j,rt){if(rt=Ot({},rt||l.value),typeof j=="string"){const A=Go(s,j,rt.path),$=t.resolve({path:A.path},rt),C=i.createHref(A.fullPath);return Ot(A,$,{params:h($.params),hash:ei(A.hash),redirectedFrom:void 0,href:C})}let nt;if(j.path!=null)nt=Ot({},j,{path:Go(s,j.path,rt.path).path});else{const A=Ot({},j.params);for(const $ in A)A[$]==null&&delete A[$];nt=Ot({},j,{params:f(A)}),rt.params=f(rt.params)}const ut=t.resolve(nt,rt),St=j.hash||"";ut.params=u(h(ut.params));const m=ig(n,Ot({},j,{hash:Xp(St),path:ut.path})),p=i.createHref(m);return Ot({fullPath:m,hash:St,query:n===xl?$g(j.query):j.query||{}},ut,{redirectedFrom:void 0,href:p})}function _(j){return typeof j=="string"?Go(s,j,l.value.path):Ot({},j)}function k(j,rt){if(c!==j)return fn(8,{from:rt,to:j})}function E(j){return U(j)}function B(j){return E(Ot(_(j),{replace:!0}))}function L(j){const rt=j.matched[j.matched.length-1];if(rt&&rt.redirect){const{redirect:nt}=rt;let ut=typeof nt=="function"?nt(j):nt;return typeof ut=="string"&&(ut=ut.includes("?")||ut.includes("#")?ut=_(ut):{path:ut},ut.params={}),Ot({query:j.query,hash:j.hash,params:ut.path!=null?{}:j.params},ut)}}function U(j,rt){const nt=c=S(j),ut=l.value,St=j.state,m=j.force,p=j.replace===!0,A=L(nt);if(A)return U(Ot(_(A),{state:typeof A=="object"?Ot({},St,A.state):St,force:m,replace:p}),rt||nt);const $=nt;$.redirectedFrom=rt;let C;return!m&&og(n,ut,nt)&&(C=fn(16,{to:$,from:ut}),K(ut,ut,!0,!1)),(C?Promise.resolve(C):I($,ut)).catch(D=>Ge(D)?Ge(D,2)?D:At(D):Y(D,$,ut)).then(D=>{if(D){if(Ge(D,2))return U(Ot({replace:p},_(D.to),{state:typeof D.to=="object"?Ot({},St,D.to.state):St,force:m}),rt||$)}else D=R($,ut,!0,p,St);return H($,ut,D),D})}function V(j,rt){const nt=k(j,rt);return nt?Promise.reject(nt):Promise.resolve()}function T(j){const rt=dt.values().next().value;return rt&&typeof rt.runWithContext=="function"?rt.runWithContext(j):j()}function I(j,rt){let nt;const[ut,St,m]=Ug(j,rt);nt=Zo(ut.reverse(),"beforeRouteLeave",j,rt);for(const A of ut)A.leaveGuards.forEach($=>{nt.push(ks($,j,rt))});const p=V.bind(null,j,rt);return nt.push(p),Ct(nt).then(()=>{nt=[];for(const A of o.list())nt.push(ks(A,j,rt));return nt.push(p),Ct(nt)}).then(()=>{nt=Zo(St,"beforeRouteUpdate",j,rt);for(const A of St)A.updateGuards.forEach($=>{nt.push(ks($,j,rt))});return nt.push(p),Ct(nt)}).then(()=>{nt=[];for(const A of m)if(A.beforeEnter)if(Le(A.beforeEnter))for(const $ of A.beforeEnter)nt.push(ks($,j,rt));else nt.push(ks(A.beforeEnter,j,rt));return nt.push(p),Ct(nt)}).then(()=>(j.matched.forEach(A=>A.enterCallbacks={}),nt=Zo(m,"beforeRouteEnter",j,rt,T),nt.push(p),Ct(nt))).then(()=>{nt=[];for(const A of r.list())nt.push(ks(A,j,rt));return nt.push(p),Ct(nt)}).catch(A=>Ge(A,8)?A:Promise.reject(A))}function H(j,rt,nt){a.list().forEach(ut=>T(()=>ut(j,rt,nt)))}function R(j,rt,nt,ut,St){const m=k(j,rt);if(m)return m;const p=rt===vs,A=en?history.state:{};nt&&(ut||p?i.replace(j.fullPath,Ot({scroll:p&&A&&A.scroll},St)):i.push(j.fullPath,St)),l.value=j,K(j,rt,nt,p),At()}let at;function F(){at||(at=i.listen((j,rt,nt)=>{if(!Pt.listening)return;const ut=S(j),St=L(ut);if(St){U(Ot(St,{replace:!0,force:!0}),ut).catch(Wn);return}c=ut;const m=l.value;en&&hg(fl(m.fullPath,nt.delta),Eo()),I(ut,m).catch(p=>Ge(p,12)?p:Ge(p,2)?(U(Ot(_(p.to),{force:!0}),ut).then(A=>{Ge(A,20)&&!nt.delta&&nt.type===si.pop&&i.go(-1,!1)}).catch(Wn),Promise.reject()):(nt.delta&&i.go(-nt.delta,!1),Y(p,ut,m))).then(p=>{p=p||R(ut,m,!1),p&&(nt.delta&&!Ge(p,8)?i.go(-nt.delta,!1):nt.type===si.pop&&Ge(p,20)&&i.go(-1,!1)),H(ut,m,p)}).catch(Wn)}))}let N=xn(),P=xn(),W;function Y(j,rt,nt){At(j);const ut=P.list();return ut.length?ut.forEach(St=>St(j,rt,nt)):console.error(j),Promise.reject(j)}function st(){return W&&l.value!==vs?Promise.resolve():new Promise((j,rt)=>{N.add([j,rt])})}function At(j){return W||(W=!j,F(),N.list().forEach(([rt,nt])=>j?nt(j):rt()),N.reset()),j}function K(j,rt,nt,ut){const{scrollBehavior:St}=e;if(!en||!St)return Promise.resolve();const m=!nt&&pg(fl(j.fullPath,0))||(ut||!nt)&&history.state&&history.state.scroll||null;return di().then(()=>St(j,rt,m)).then(p=>p&&fg(p)).catch(p=>Y(p,j,rt))}const O=j=>i.go(j);let bt;const dt=new Set,Pt={currentRoute:l,listening:!0,addRoute:g,removeRoute:y,clearRoutes:t.clearRoutes,hasRoute:b,getRoutes:v,resolve:S,options:e,push:E,replace:B,go:O,back:()=>O(-1),forward:()=>O(1),beforeEach:o.add,beforeResolve:r.add,afterEach:a.add,onError:P.add,isReady:st,install(j){const rt=this;j.component("RouterLink",Ng),j.component("RouterView",Hg),j.config.globalProperties.$router=rt,Object.defineProperty(j.config.globalProperties,"$route",{enumerable:!0,get:()=>ct(l)}),en&&!bt&&l.value===vs&&(bt=!0,E(i.location).catch(St=>{}));const nt={};for(const St in vs)Object.defineProperty(nt,St,{get:()=>l.value[St],enumerable:!0});j.provide(To,rt),j.provide(ea,ou(nt)),j.provide(Sr,l);const ut=j.unmount;dt.add(j),j.unmount=function(){dt.delete(j),dt.size<1&&(c=vs,at&&at(),at=null,l.value=vs,bt=!1,W=!1),ut()}}};function Ct(j){return j.reduce((rt,nt)=>rt.then(()=>T(nt)),Promise.resolve())}return Pt}function Ug(e,t){const s=[],n=[],i=[],o=Math.max(t.matched.length,e.matched.length);for(let r=0;rdn(c,a))?n.push(a):s.push(a));const l=e.matched[r];l&&(t.matched.find(c=>dn(c,l))||i.push(l))}return[s,n,i]}function hd(){return Ee(To)}function Vg(e){return Ee(ea)}class qg{constructor(){xt(this,"baseUrl","");xt(this,"apiKey","");xt(this,"initialized",!1);xt(this,"eventListeners",[]);this.baseUrl="",this.initializeAPIKey()}initializeAPIKey(){this.initialized=!0;const t=new URLSearchParams(window.location.search),s=t.get("apikey");if(s){this.apiKey=s,localStorage.setItem("mcpproxy-api-key",s),console.log("API key from URL (updating storage):",this.apiKey.substring(0,8)+"..."),t.delete("apikey");const n=window.location.pathname+(t.toString()?"?"+t.toString():"");window.history.replaceState({},"",n)}else{const n=localStorage.getItem("mcpproxy-api-key");n?(this.apiKey=n,console.log("API key from localStorage:",this.apiKey.substring(0,8)+"...")):console.log("No API key found in URL or localStorage")}}reinitializeAPIKey(){this.initialized=!1,this.initializeAPIKey()}hasAPIKey(){return!!this.apiKey}getAPIKeyPreview(){return this.apiKey?this.apiKey.substring(0,8)+"...":"none"}clearAPIKey(){this.apiKey="",localStorage.removeItem("mcpproxy-api-key"),console.log("API key cleared from memory and localStorage")}setAPIKey(t){this.apiKey=t,t?(localStorage.setItem("mcpproxy-api-key",t),console.log("API key set and stored:",t.substring(0,8)+"...")):(localStorage.removeItem("mcpproxy-api-key"),console.log("API key cleared"))}addEventListener(t){return this.eventListeners.push(t),()=>{const s=this.eventListeners.indexOf(t);s>-1&&this.eventListeners.splice(s,1)}}emitAuthError(t,s){const n={type:"auth-error",error:t,status:s};this.eventListeners.forEach(i=>{try{i(n)}catch(o){console.error("Error in API event listener:",o)}})}async validateAPIKey(){if(!this.apiKey)return!1;try{return(await this.getServers()).success}catch(t){return console.warn("API key validation failed:",t),!1}}async request(t,s={}){var n;this.initialized||(console.log("API service not initialized, initializing now..."),this.initializeAPIKey());try{const i={"Content-Type":"application/json","X-MCPProxy-Client":"webui/web"};s.headers&&(s.headers instanceof Headers?s.headers.forEach((a,l)=>{i[l]=a}):Array.isArray(s.headers)?s.headers.forEach(([a,l])=>{i[a]=l}):Object.assign(i,s.headers)),this.apiKey?(i["X-API-Key"]=this.apiKey,console.log(`API request to ${t} with API key: ${this.getAPIKeyPreview()}`)):(console.log(`API request to ${t} without API key - initialized: ${this.initialized}`),console.log("Current URL search params:",window.location.search),console.log("LocalStorage API key:",((n=localStorage.getItem("mcpproxy-api-key"))==null?void 0:n.substring(0,8))+"..."));const o=await fetch(`${this.baseUrl}${t}`,{...s,headers:i});if(!o.ok){const l=(await o.json().catch(()=>({}))).error||`HTTP ${o.status}: ${o.statusText}`;throw console.error(`API request failed: ${l}`),(o.status===401||o.status===403)&&(console.error("Authentication failed - API key may be invalid or missing"),this.emitAuthError(l,o.status)),new Error(l)}if(o.status===204)return console.log(`API request to ${t} succeeded (204 No Content)`),{success:!0};const r=await o.json();return console.log(`API request to ${t} succeeded`),r}catch(i){return console.error("API request failed:",i),{success:!1,error:i instanceof Error?i.message:"Unknown error"}}}async getStatus(){return this.request("/api/v1/status")}async getRouting(){return this.request("/api/v1/routing")}async getServers(){return this.request("/api/v1/servers")}async enableServer(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/enable`,{method:"POST"})}async disableServer(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/disable`,{method:"POST"})}async restartServer(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/restart`,{method:"POST"})}async triggerOAuthLogin(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/login`,{method:"POST"})}async triggerOAuthLogout(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/logout`,{method:"POST"})}async quarantineServer(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/quarantine`,{method:"POST"})}async unquarantineServer(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/unquarantine`,{method:"POST"})}async discoverServerTools(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/discover-tools`,{method:"POST"})}async deleteServer(t){return this.callTool("upstream_servers",{operation:"remove",name:t})}async getServerTools(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/tools`)}async getToolApprovals(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/tools/export`)}async getToolDiff(t,s){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/tools/${encodeURIComponent(s)}/diff`)}async approveTools(t,s){const n=s&&s.length>0?{tools:s}:{approve_all:!0};return this.request(`/api/v1/servers/${encodeURIComponent(t)}/tools/approve`,{method:"POST",body:JSON.stringify(n)})}async getServerLogs(t,s){const n=s?`?tail=${s}`:"";return this.request(`/api/v1/servers/${encodeURIComponent(t)}/logs${n}`)}async searchTools(t,s=10){const n=new URLSearchParams({q:t,limit:s.toString()});return this.request(`/api/v1/index/search?${n}`)}createEventSource(){const t=this.apiKey?`${this.baseUrl}/events?apikey=${encodeURIComponent(this.apiKey)}`:`${this.baseUrl}/events`;return console.log("Creating EventSource:",{hasApiKey:!!this.apiKey,apiKeyPreview:this.getAPIKeyPreview(),url:this.apiKey?t.replace(this.apiKey,this.getAPIKeyPreview()):t}),new EventSource(t)}async getSecretRefs(){return this.request("/api/v1/secrets/refs")}async getConfigSecrets(){return this.request("/api/v1/secrets/config")}async runMigrationAnalysis(){return this.request("/api/v1/secrets/migrate",{method:"POST"})}async setSecret(t,s,n="keyring"){return this.request("/api/v1/secrets",{method:"POST",body:JSON.stringify({name:t,value:s,type:n})})}async deleteSecret(t,s="keyring"){const n=`/api/v1/secrets/${encodeURIComponent(t)}?type=${encodeURIComponent(s)}`;return this.request(n,{method:"DELETE"})}async getDockerStatus(){return this.request("/api/v1/docker/status")}async getDiagnostics(){return this.request("/api/v1/diagnostics")}async getServerDiagnostic(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/diagnostics`)}async invokeDiagnosticFix(t){return this.request("/api/v1/diagnostics/fix",{method:"POST",body:JSON.stringify(t)})}async getToolCalls(t){const s=new URLSearchParams;t!=null&&t.limit&&s.set("limit",t.limit.toString()),t!=null&&t.offset&&s.set("offset",t.offset.toString());const n=`/api/v1/tool-calls${s.toString()?"?"+s.toString():""}`;return this.request(n)}async getToolCallDetail(t){return this.request(`/api/v1/tool-calls/${encodeURIComponent(t)}`)}async getServerToolCalls(t,s){const n=`/api/v1/servers/${encodeURIComponent(t)}/tool-calls${s?`?limit=${s}`:""}`;return this.request(n)}async replayToolCall(t,s){return this.request(`/api/v1/tool-calls/${encodeURIComponent(t)}/replay`,{method:"POST",body:JSON.stringify({arguments:s})})}async getSessions(t){const s=`/api/v1/sessions${t?`?limit=${t}`:""}`;return this.request(s)}async getSessionDetail(t){return this.request(`/api/v1/sessions/${encodeURIComponent(t)}`)}async getConfig(){return this.request("/api/v1/config")}async validateConfig(t){return this.request("/api/v1/config/validate",{method:"POST",body:JSON.stringify(t)})}async applyConfig(t){return this.request("/api/v1/config/apply",{method:"POST",body:JSON.stringify(t)})}async setDockerIsolationEnabled(t){return this.request("/api/v1/config/docker-isolation",{method:"PATCH",body:JSON.stringify({enabled:t})})}async getTokenStats(){return this.request("/api/v1/stats/tokens")}async callTool(t,s){return this.request("/api/v1/tools/call",{method:"POST",body:JSON.stringify({tool_name:t,arguments:s})})}async listRegistries(){return this.request("/api/v1/registries")}async searchRegistryServers(t,s){const n=new URLSearchParams;s!=null&&s.query&&n.append("q",s.query),s!=null&&s.tag&&n.append("tag",s.tag),s!=null&&s.limit&&n.append("limit",s.limit.toString());const i=`/api/v1/registries/${encodeURIComponent(t)}/servers${n.toString()?"?"+n.toString():""}`;return this.request(i)}async addServerFromRepository(t){const s={operation:"add",name:t.id,enabled:!0,protocol:"stdio"};if(t.installCmd){const n=t.installCmd.split(" ");s.command=n[0],n.length>1&&(s.args_json=JSON.stringify(n.slice(1)))}else t.url?(s.protocol="http",s.url=t.url):t.connectUrl&&(s.protocol="http",s.url=t.connectUrl);return this.callTool("upstream_servers",s)}async getInfo(t){const s=t!=null&&t.refresh?"/api/v1/info?refresh=true":"/api/v1/info";return this.request(s)}async getActivities(t){const s=new URLSearchParams;t&&Object.entries(t).forEach(([i,o])=>{o!==void 0&&o!==""&&s.append(i,String(o))});const n=`/api/v1/activity${s.toString()?"?"+s.toString():""}`;return this.request(n)}async getActivityDetail(t){return this.request(`/api/v1/activity/${encodeURIComponent(t)}`)}async getActivitySummary(t="24h"){return this.request(`/api/v1/activity/summary?period=${t}`)}getActivityExportUrl(t){const s=new URLSearchParams;return s.append("format",t.format),this.apiKey&&s.append("apikey",this.apiKey),Object.entries(t).forEach(([n,i])=>{n!=="format"&&i!==void 0&&i!==""&&s.append(n,String(i))}),`${this.baseUrl}/api/v1/activity/export?${s.toString()}`}async importServersFromJSON(t){const s=`/api/v1/servers/import/json${t.preview?"?preview=true":""}`;return this.request(s,{method:"POST",body:JSON.stringify({content:t.content,format:t.format,server_names:t.server_names})})}async importServersFromFile(t,s){var r;const n=new FormData;n.append("file",t);const i=new URLSearchParams;s!=null&&s.preview&&i.append("preview","true"),s!=null&&s.format&&i.append("format",s.format),(r=s==null?void 0:s.server_names)!=null&&r.length&&i.append("server_names",s.server_names.join(","));const o=`/api/v1/servers/import${i.toString()?"?"+i.toString():""}`;try{const a={};this.apiKey&&(a["X-API-Key"]=this.apiKey);const l=await fetch(`${this.baseUrl}${o}`,{method:"POST",headers:a,body:n});if(!l.ok){const f=(await l.json().catch(()=>({}))).error||`HTTP ${l.status}: ${l.statusText}`;throw new Error(f)}return await l.json()}catch(a){return{success:!1,error:a instanceof Error?a.message:"Unknown error"}}}async getCanonicalConfigPaths(){return this.request("/api/v1/servers/import/paths")}async importServersFromPath(t){const s=[];t.preview&&s.push("preview=true"),t.skip_quarantine&&s.push("skip_quarantine=true");const n=`/api/v1/servers/import/path${s.length?"?"+s.join("&"):""}`;return this.request(n,{method:"POST",body:JSON.stringify({path:t.path,format:t.format,server_names:t.server_names,rename:t.rename})})}async listAgentTokens(){return this.request("/api/v1/tokens")}async createAgentToken(t){return this.request("/api/v1/tokens",{method:"POST",body:JSON.stringify(t)})}async revokeAgentToken(t){return this.request(`/api/v1/tokens/${encodeURIComponent(t)}`,{method:"DELETE"})}async regenerateAgentToken(t){return this.request(`/api/v1/tokens/${encodeURIComponent(t)}/regenerate`,{method:"POST"})}async adminEnableServer(t){return this.request(`/api/v1/admin/servers/${encodeURIComponent(t)}/enable`,{method:"POST",credentials:"include"})}async adminDisableServer(t){return this.request(`/api/v1/admin/servers/${encodeURIComponent(t)}/disable`,{method:"POST",credentials:"include"})}async adminRestartServer(t){return this.request(`/api/v1/admin/servers/${encodeURIComponent(t)}/restart`,{method:"POST",credentials:"include"})}async listUserTokens(){return this.request("/api/v1/user/tokens",{credentials:"include"})}async createUserToken(t){return this.request("/api/v1/user/tokens",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"},credentials:"include"})}async revokeUserToken(t){return this.request(`/api/v1/user/tokens/${encodeURIComponent(t)}`,{method:"DELETE",credentials:"include"})}async regenerateUserToken(t){return this.request(`/api/v1/user/tokens/${encodeURIComponent(t)}/regenerate`,{method:"POST",credentials:"include"})}async submitFeedback(t){return this.request("/api/v1/feedback",{method:"POST",body:JSON.stringify(t)})}async getConnectStatus(){return this.request("/api/v1/connect")}async connectClient(t,s="mcpproxy",n=!1){return this.request(`/api/v1/connect/${encodeURIComponent(t)}`,{method:"POST",body:JSON.stringify({server_name:s,force:n})})}async disconnectClient(t,s="mcpproxy"){return this.request(`/api/v1/connect/${encodeURIComponent(t)}`,{method:"DELETE",body:JSON.stringify({server_name:s})})}async getOnboardingState(){return this.request("/api/v1/onboarding/state")}async markOnboardingState(t){return this.request("/api/v1/onboarding/mark",{method:"POST",body:JSON.stringify(t)})}async listScanners(){return this.request("/api/v1/security/scanners")}async installScanner(t){return this.request(`/api/v1/security/scanners/${encodeURIComponent(t)}/enable`,{method:"POST"})}async removeScanner(t){return this.request(`/api/v1/security/scanners/${encodeURIComponent(t)}/disable`,{method:"POST"})}async configureScanner(t,s,n){const i={env:s};return n&&(i.docker_image=n),this.request(`/api/v1/security/scanners/${encodeURIComponent(t)}/config`,{method:"PUT",body:JSON.stringify(i)})}async getScannerStatus(t){return this.request(`/api/v1/security/scanners/${encodeURIComponent(t)}/status`)}async startScan(t,s=!1,n=[]){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/scan`,{method:"POST",body:JSON.stringify({dry_run:s,scanner_ids:n})})}async getScanStatus(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/scan/status`)}async getScanReport(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/scan/report`)}async getScanFiles(t,s=100,n=0,i=1,o=!1){const r=new URLSearchParams({limit:String(s),offset:String(n),pass:String(i)});return o&&r.set("suspicious_only","true"),this.request(`/api/v1/servers/${encodeURIComponent(t)}/scan/files?${r.toString()}`)}async cancelScan(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/scan/cancel`,{method:"POST"})}async securityApprove(t,s=!1){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/security/approve`,{method:"POST",body:JSON.stringify({force:s})})}async securityReject(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/security/reject`,{method:"POST"})}async checkIntegrity(t){return this.request(`/api/v1/servers/${encodeURIComponent(t)}/integrity`)}async getSecurityOverview(){return this.request("/api/v1/security/overview")}async scanAll(t=[]){return this.request("/api/v1/security/scan-all",{method:"POST",body:JSON.stringify({scanner_ids:t})})}async getQueueProgress(){return this.request("/api/v1/security/queue")}async cancelAllScans(){return this.request("/api/v1/security/cancel-all",{method:"POST"})}async listScanHistory(t){const s=new URLSearchParams;t!=null&&t.sort&&s.set("sort",t.sort),t!=null&&t.order&&s.set("order",t.order),t!=null&&t.limit&&s.set("limit",String(t.limit)),t!=null&&t.offset&&s.set("offset",String(t.offset)),t!=null&&t.status&&s.set("status",t.status);const n=s.toString();return this.request(`/api/v1/security/scans${n?"?"+n:""}`)}async getScanReportByJobId(t){return this.request(`/api/v1/security/scans/${encodeURIComponent(t)}/report`)}async testConnection(){try{return(await this.getServers()).success}catch{return!1}}}const pt=new qg,hs=Mo("system",()=>{const e=X(null),t=X(null),s=X(!1),n=X("corporate"),i=X((()=>{try{return localStorage.getItem("mcpproxy-sidebar-collapsed")==="1"}catch{return!1}})()),o=X([]),r=X(null),a=X(null),l=X(!1),c=X(null),u=[{name:"light",displayName:"Light",dark:!1},{name:"dark",displayName:"Dark",dark:!0},{name:"corporate",displayName:"Corporate",dark:!1},{name:"business",displayName:"Business",dark:!0},{name:"emerald",displayName:"Emerald",dark:!1},{name:"forest",displayName:"Forest",dark:!0},{name:"aqua",displayName:"Aqua",dark:!1},{name:"lofi",displayName:"Lo-Fi",dark:!1},{name:"pastel",displayName:"Pastel",dark:!1},{name:"fantasy",displayName:"Fantasy",dark:!1},{name:"wireframe",displayName:"Wireframe",dark:!1},{name:"luxury",displayName:"Luxury",dark:!0},{name:"dracula",displayName:"Dracula",dark:!0},{name:"synthwave",displayName:"Synthwave",dark:!0},{name:"cyberpunk",displayName:"Cyberpunk",dark:!0}],f=ot(()=>{var F,N,P;return((F=e.value)==null?void 0:F.running)!==void 0?e.value.running:((P=(N=e.value)==null?void 0:N.status)==null?void 0:P.running)!==void 0?e.value.status.running:!1}),h=ot(()=>{var F;return((F=e.value)==null?void 0:F.listen_addr)??""}),g=ot(()=>{var F;return((F=e.value)==null?void 0:F.upstream_stats)??{connected_servers:0,total_servers:0,total_tools:0}}),y=ot(()=>u.find(F=>F.name===n.value)||u[0]),v=ot(()=>{var F;return((F=r.value)==null?void 0:F.version)??""}),b=ot(()=>{var F,N;return((N=(F=r.value)==null?void 0:F.update)==null?void 0:N.available)??!1}),S=ot(()=>{var F,N;return((N=(F=r.value)==null?void 0:F.update)==null?void 0:N.latest_version)??""}),_=ot(()=>{var F,N;return((F=a.value)==null?void 0:F.routing_mode)??((N=e.value)==null?void 0:N.routing_mode)??"retrieve_tools"});function k(){t.value&&t.value.close(),console.log("Attempting to connect EventSource..."),console.log("API key status:",{hasApiKey:pt.hasAPIKey(),apiKeyPreview:pt.getAPIKeyPreview()});const F=pt.createEventSource();t.value=F,F.onopen=()=>{s.value=!0,console.log("EventSource connected successfully")},F.onmessage=N=>{var P,W;try{const Y=JSON.parse(N.data);e.value=Y,console.log("SSE Status Update:",{topLevelRunning:Y.running,nestedStatusRunning:(P=Y.status)==null?void 0:P.running,listen_addr:Y.listen_addr,timestamp:Y.timestamp,finalRunningValue:Y.running!==void 0?Y.running:((W=Y.status)==null?void 0:W.running)??!1})}catch(Y){console.error("Failed to parse SSE message:",Y)}},F.addEventListener("status",N=>{var P,W;try{const Y=JSON.parse(N.data);e.value=Y,console.log("SSE Status Event Update:",{topLevelRunning:Y.running,nestedStatusRunning:(P=Y.status)==null?void 0:P.running,listen_addr:Y.listen_addr,timestamp:Y.timestamp,finalRunningValue:Y.running!==void 0?Y.running:((W=Y.status)==null?void 0:W.running)??!1})}catch(Y){console.error("Failed to parse SSE status event:",Y)}}),F.addEventListener("servers.changed",N=>{try{const P=JSON.parse(N.data);console.log("SSE servers.changed event received:",P),window.dispatchEvent(new CustomEvent("mcpproxy:servers-changed",{detail:P}))}catch(P){console.error("Failed to parse SSE servers.changed event:",P)}}),F.addEventListener("config.reloaded",N=>{try{const P=JSON.parse(N.data);console.log("SSE config.reloaded event received:",P),window.dispatchEvent(new CustomEvent("mcpproxy:config-reloaded",{detail:P}))}catch(P){console.error("Failed to parse SSE config.reloaded event:",P)}}),F.addEventListener("config.saved",N=>{try{const P=JSON.parse(N.data);console.log("SSE config.saved event received:",P),window.dispatchEvent(new CustomEvent("mcpproxy:config-saved",{detail:P}))}catch(P){console.error("Failed to parse SSE config.saved event:",P)}}),F.addEventListener("security.scanner_changed",N=>{try{const P=JSON.parse(N.data);window.dispatchEvent(new CustomEvent("mcpproxy:scanner-changed",{detail:P}))}catch(P){console.error("Failed to parse SSE security.scanner_changed event:",P)}}),F.addEventListener("activity.tool_call.started",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.tool_call.started event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity-started",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.tool_call.started event:",P)}}),F.addEventListener("activity.tool_call.completed",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.tool_call.completed event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity-completed",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.tool_call.completed event:",P)}}),F.addEventListener("activity.policy_decision",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.policy_decision event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity-policy",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.policy_decision event:",P)}}),F.addEventListener("activity",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity",{detail:W}))}catch(P){console.error("Failed to parse SSE activity event:",P)}}),F.addEventListener("activity.internal_tool_call.completed",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.internal_tool_call.completed event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity-completed",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.internal_tool_call.completed event:",P)}}),F.addEventListener("activity.system.start",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.system_start event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.system_start event:",P)}}),F.addEventListener("activity.system.stop",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.system_stop event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.system_stop event:",P)}}),F.addEventListener("activity.config_change",N=>{try{const P=JSON.parse(N.data);console.log("SSE activity.config_change event received:",P);const W=P.payload||P;window.dispatchEvent(new CustomEvent("mcpproxy:activity",{detail:W}))}catch(P){console.error("Failed to parse SSE activity.config_change event:",P)}}),F.onerror=N=>{s.value=!1,console.error("EventSource error occurred:",N),F.readyState===EventSource.CLOSED&&(console.error("EventSource connection closed - possible authentication failure"),pt.hasAPIKey()&&(console.log("Attempting to reinitialize API key and retry connection..."),pt.reinitializeAPIKey())),setTimeout(()=>{console.log("Retrying EventSource connection in 5 seconds..."),k()},5e3)}}function E(){t.value&&(t.value.close(),t.value=null),s.value=!1}function B(F){u.find(P=>P.name===F)&&(n.value=F,document.documentElement.setAttribute("data-theme",F),localStorage.setItem("mcpproxy-theme",F))}function L(){const F=localStorage.getItem("mcpproxy-theme");F&&u.find(N=>N.name===F)?B(F):B("corporate")}function U(){i.value=!i.value;try{localStorage.setItem("mcpproxy-sidebar-collapsed",i.value?"1":"0")}catch{}}function V(F){const N=Math.random().toString(36).substr(2,9),P={...F,id:N,duration:F.duration??5e3};return o.value.push(P),P.duration&&P.duration>0&&setTimeout(()=>{T(N)},P.duration),N}function T(F){const N=o.value.findIndex(P=>P.id===F);N>-1&&o.value.splice(N,1)}function I(){o.value=[]}async function H(){var F;try{const N=await pt.getInfo();N.success&&N.data&&(r.value=N.data,(F=N.data.update)!=null&&F.checked_at&&(c.value=N.data.update.checked_at))}catch(N){console.error("Failed to fetch info:",N)}}async function R(){var F,N,P;if(l.value)return{ok:!1,error:"already checking"};l.value=!0;try{const W=await pt.getInfo({refresh:!0});if(W.success&&W.data){r.value=W.data,c.value=((F=W.data.update)==null?void 0:F.checked_at)??new Date().toISOString();const st=(N=W.data.update)==null?void 0:N.check_error;return st?(V({type:"error",title:"Update check failed",message:st}),{ok:!1,error:st}):((P=W.data.update)!=null&&P.available?V({type:"info",title:"Update available",message:W.data.update.latest_version||""}):V({type:"success",title:"You are running the latest version."}),{ok:!0})}const Y=W.error||"Request failed";return V({type:"error",title:"Update check failed",message:Y}),{ok:!1,error:Y}}catch(W){const Y=W instanceof Error?W.message:String(W);return console.error("Failed to check for updates:",W),V({type:"error",title:"Update check failed",message:Y}),{ok:!1,error:Y}}finally{l.value=!1}}async function at(){try{const F=await pt.getRouting();F.success&&F.data&&(a.value=F.data)}catch(F){console.error("Failed to fetch routing:",F)}}return L(),{status:e,connected:s,currentTheme:n,toasts:o,themes:u,info:r,routing:a,checkingForUpdates:l,updateCheckedAt:c,isRunning:f,listenAddr:h,upstreamStats:g,currentThemeConfig:y,version:v,updateAvailable:b,latestVersion:S,routingMode:_,sidebarCollapsed:i,connectEventSource:k,disconnectEventSource:E,setTheme:B,loadTheme:L,toggleSidebar:U,addToast:V,removeToast:T,clearToasts:I,fetchInfo:H,fetchRouting:at,checkForUpdates:R}}),wi="/api/v1",Jo={async getMe(){try{const e=await fetch(`${wi}/auth/me`,{credentials:"include"});if(e.status===401)return null;if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}catch{return null}},async generateToken(){const e=await fetch(`${wi}/auth/token`,{method:"POST",credentials:"include"});if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()},async logout(){await fetch(`${wi}/auth/logout`,{method:"POST",credentials:"include"})},getLoginUrl(e){const t=new URLSearchParams;return e&&t.set("redirect_uri",e),`${wi}/auth/login${t.toString()?"?"+t.toString():""}`}},Po=Mo("auth",()=>{const e=X(null),t=X(!0),s=X(!1),n=ot(()=>!!e.value),i=ot(()=>{var c;return((c=e.value)==null?void 0:c.role)==="admin"}),o=ot(()=>{var c,u;return((c=e.value)==null?void 0:c.display_name)||((u=e.value)==null?void 0:u.email)||""});async function r(){var c;t.value=!0;try{const u=await pt.getStatus();s.value=((c=u.data)==null?void 0:c.edition)==="server",s.value&&(e.value=await Jo.getMe())}catch{e.value=null}finally{t.value=!1}}async function a(){await Jo.logout(),e.value=null}function l(){window.location.href=Jo.getLoginUrl(window.location.pathname)}return{user:e,loading:t,isTeamsEdition:s,isAuthenticated:n,isAdmin:i,displayName:o,checkAuth:r,logout:a,login:l}}),Kg=Object.freeze(Object.defineProperty({__proto__:null,useAuthStore:Po},Symbol.toStringTag,{value:"Module"})),sa=Mo("onboarding",()=>{const e=X(null),t=X(!1),s=X(null),n=X(!1),i=ot(()=>{var L;return((L=e.value)==null?void 0:L.should_show_wizard)??!1}),o=ot(()=>{var L;return((L=e.value)==null?void 0:L.has_connected_client)??!1}),r=ot(()=>{var L;return((L=e.value)==null?void 0:L.has_configured_server)??!1}),a=ot(()=>{var L;return((L=e.value)==null?void 0:L.state.engaged)??!1}),l=ot(()=>{var L;return((L=e.value)==null?void 0:L.first_mcp_client_ever)??!1}),c=ot(()=>{var L;return((L=e.value)==null?void 0:L.mcp_clients_seen_ever)??[]}),u=ot(()=>{var L;return((L=e.value)==null?void 0:L.incomplete_tab_count)??0}),f=ot(()=>{const L=[];return o.value||L.push("connect"),r.value||L.push("server"),L});async function h(){t.value=!0,s.value=null;try{const L=await pt.getOnboardingState();return L.success&&L.data?(e.value=L.data,L.data):(s.value=L.error??"Failed to fetch onboarding state",null)}catch(L){return s.value=L.message,null}finally{t.value=!1}}async function g(L){s.value=null;try{const U=await pt.markOnboardingState(L);return U.success&&U.data?(e.value=U.data,U.data):(s.value=U.error??"Failed to update onboarding state",null)}catch(U){return s.value=U.message,null}}async function y(){var L;(L=e.value)!=null&&L.state.first_shown_at||await g({mark_shown:!0})}async function v(){await g({connect_step_status:"completed"})}async function b(){await g({connect_step_status:"skipped"})}async function S(){await g({server_step_status:"completed"})}async function _(){await g({server_step_status:"skipped"})}async function k(){await g({engaged:!0})}function E(){n.value=!0,y()}function B(){n.value=!1}return{state:e,loading:t,error:s,wizardOpen:n,shouldShowWizard:i,hasConnectedClient:o,hasConfiguredServer:r,isEngaged:a,firstMCPClientEver:l,mcpClientsSeenEver:c,incompleteTabCount:u,visibleSteps:f,fetchState:h,mark:g,markShown:y,markConnectCompleted:v,markConnectSkipped:b,markServerCompleted:S,markServerSkipped:_,markEngaged:k,openWizard:E,closeWizard:B}}),Yg={class:"drawer-side z-40"},Gg={class:"min-w-0"},Zg={key:0,class:"badge badge-xs badge-primary"},Jg={key:1,class:"px-3 py-2 border-b border-base-300 flex items-center gap-2","data-testid":"sidebar-version-block"},Xg={class:"font-mono text-xs text-base-content/60 shrink-0","data-testid":"sidebar-version"},Qg=["title"],tm=["disabled","title","aria-label"],em={key:0,class:"w-3.5 h-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},sm={key:1,class:"loading loading-spinner loading-xs"},nm={class:"truncate"},im={class:"menu menu-sm gap-0.5 p-0"},om={key:0,class:"menu-title px-3 !py-1"},rm={class:"menu menu-sm gap-0.5 p-0"},am={key:0,class:"menu-title px-3 !py-1"},lm={class:"menu menu-sm gap-0.5 p-0 mb-1"},cm=["title"],um={class:"relative inline-flex items-center justify-center"},dm={key:0,class:"absolute inline-flex h-5 w-5 rounded-full bg-primary opacity-30 animate-ping","aria-hidden":"true"},fm={class:"flex-1"},hm={key:0},pm={key:1,class:"inline-flex items-center gap-1"},gm={class:"menu menu-sm gap-0.5 p-0"},mm={key:0,class:"mt-5 mb-1 px-3 text-[10px] font-semibold uppercase tracking-[0.12em] text-base-content/40"},vm={key:1,class:"mt-3 mb-1 mx-auto w-6 h-px bg-base-300"},ym={class:"menu menu-sm gap-0.5 p-0"},bm={key:2,class:"mt-5 mb-1 px-3 text-[10px] font-semibold uppercase tracking-[0.12em] text-base-content/40"},_m={key:3,class:"mt-3 mb-1 mx-auto w-6 h-px bg-base-300"},xm={class:"menu menu-sm gap-0.5 p-0"},wm={class:"text-[13px]"},km={class:"text-[13px]"},Sm={key:2,class:"px-4 py-3 border-t border-base-300"},Cm={class:"flex items-center justify-between"},Am={class:"flex items-center gap-2 min-w-0"},Im={class:"avatar placeholder"},Mm={class:"bg-primary text-primary-content rounded-full w-8"},Em={class:"text-xs"},Tm={class:"min-w-0"},Pm={class:"text-sm font-medium truncate"},Om={key:0,class:"text-xs text-base-content/50 truncate"},Rm=["title"],$m={tabindex:"0",class:"dropdown-content z-[1] menu p-2 shadow-2xl bg-base-300 rounded-box w-64 max-h-96 overflow-y-auto mb-2"},Lm=["onClick"],Dm=["data-theme"],Fm=ie({__name:"SidebarNav",setup(e){const t=Vg(),s=hd(),n=hs(),i=Po(),o=sa(),r=ot(()=>o.incompleteTabCount),a=ot(()=>r.value>0),l=ot(()=>a.value?`Setup (${r.value} step${r.value===1?"":"s"} remaining)`:"Setup βœ“");function c(){t.path!=="/"?s.push("/").then(()=>o.openWizard()):o.openWizard()}fs(()=>{i.isTeamsEdition||o.fetchState()});const u=ot(()=>n.sidebarCollapsed),f=ot(()=>n.version.replace(/^v/i,"")),h=ot(()=>{const Y=n.version;return Y?`MCPProxy ${Y}`:"MCPProxy"}),g=ot(()=>{const Y=n.latestVersion;return Y?`Latest release: ${Y}`:"Update available"}),y=ot(()=>n.updateAvailable?"Update available β€” view release":"Check for updates"),v=ot(()=>n.checkingForUpdates?"Checking…":n.updateAvailable?"View release":"Check"),b=ot(()=>{const Y=n.updateCheckedAt;return Y?`Last checked ${new Date(Y).toLocaleString()}`:"Check for updates on GitHub"});async function S(){var st,At;const Y=(At=(st=n.info)==null?void 0:st.update)==null?void 0:At.release_url;if(n.updateAvailable&&Y){window.open(Y,"_blank","noopener,noreferrer");return}await n.checkForUpdates()}const _={fill:"none",stroke:"currentColor","stroke-width":1.6,"stroke-linecap":"round","stroke-linejoin":"round",viewBox:"0 0 24 24"},k=Y=>st=>ee("svg",{..._,...st},[ee("path",{d:Y})]),E=k("M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"),B=k("M4 7a2 2 0 012-2h12a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V7zm0 8a2 2 0 012-2h12a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zm4-6h.01M8 17h.01"),L=k("M12 11v3m-3-3a3 3 0 116 0m-9 3v6a1 1 0 001 1h10a1 1 0 001-1v-6a1 1 0 00-1-1H6a1 1 0 00-1 1z"),U=k("M15 7a4 4 0 11-8 0 4 4 0 018 0zM15 7l6 6m-3-3l3 3-2 2m-4-4l2-2"),V=k("M4 12h3l3-8 4 16 3-8h3"),T=k("M12 3l8 3v6c0 5-3.5 8.5-8 9-4.5-.5-8-4-8-9V6l8-3zm-3 9l2 2 4-4"),I=k("M4 4.5A2.5 2.5 0 016.5 2H19v16H6.5a2.5 2.5 0 000 5H19v2H6.5A2.5 2.5 0 014 22.5v-18z"),H=k("M10.3 3.6a1.5 1.5 0 013.4 0l.2 1.1a7 7 0 011.9.8l1-.6a1.5 1.5 0 012.1 2.1l-.6 1a7 7 0 01.8 1.9l1.1.2a1.5 1.5 0 010 3.4l-1.1.2a7 7 0 01-.8 1.9l.6 1a1.5 1.5 0 01-2.1 2.1l-1-.6a7 7 0 01-1.9.8l-.2 1.1a1.5 1.5 0 01-3.4 0l-.2-1.1a7 7 0 01-1.9-.8l-1 .6a1.5 1.5 0 01-2.1-2.1l.6-1a7 7 0 01-.8-1.9l-1.1-.2a1.5 1.5 0 010-3.4l1.1-.2a7 7 0 01.8-1.9l-.6-1a1.5 1.5 0 012.1-2.1l1 .6a7 7 0 011.9-.8l.2-1.1zM12 9a3 3 0 100 6 3 3 0 000-6z"),R=k("M12 3l1.6 4.6L18 9l-4.4 1.4L12 15l-1.6-4.6L6 9l4.4-1.4L12 3zm6 11l.8 2.4L21 17l-2.2.6L18 20l-.8-2.4L15 17l2.2-.6L18 14zM6 14l.8 2.4L9 17l-2.2.6L6 20l-.8-2.4L3 17l2.2-.6L6 14z"),at=[{name:"My Servers",path:"/my/servers"},{name:"My Activity",path:"/my/activity"},{name:"Agent Tokens",path:"/my/tokens"},{name:"Diagnostics",path:"/my/diagnostics"},{name:"Search",path:"/search"}],F=[{name:"Dashboard",path:"/admin/dashboard"},{name:"Server Management",path:"/admin/servers"},{name:"Activity (All)",path:"/activity"},{name:"Users",path:"/admin/users"},{name:"Sessions",path:"/sessions"},{name:"Configuration",path:"/settings"}],N=ot(()=>{const Y=i.displayName;if(!Y)return"?";const st=Y.split(/[\s@]+/);return st.length>=2?(st[0][0]+st[1][0]).toUpperCase():Y.substring(0,2).toUpperCase()});function P(Y){return Y==="/"?t.path==="/":t.path.startsWith(Y)}async function W(){await i.logout(),s.push("/login")}return(Y,st)=>{var K;const At=ko("router-link");return x(),w("div",Yg,[st[15]||(st[15]=d("label",{for:"sidebar-drawer","aria-label":"close sidebar",class:"drawer-overlay"},null,-1)),d("aside",{class:yt(["bg-base-100 h-screen flex flex-col border-r border-base-300 fixed transition-[width] duration-200 ease-out",u.value?"w-14":"w-64"])},[d("div",{class:yt(["border-b border-base-300 flex items-center",u.value?"px-2 py-4 justify-center":"px-4 py-4 justify-between"])},[ht(At,{to:"/",class:"flex items-center gap-2 min-w-0",title:h.value},{default:$t(()=>[st[3]||(st[3]=d("img",{src:td,alt:"MCPProxy Logo",class:"w-8 h-8 shrink-0"},null,-1)),Lt(d("div",Gg,[st[2]||(st[2]=d("span",{class:"text-lg font-bold truncate block leading-tight"},"MCPProxy",-1)),ct(i).isTeamsEdition?(x(),w("span",Zg,"Server")):J("",!0)],512),[[Ce,!u.value]])]),_:1},8,["title"]),Lt(d("button",{onClick:st[0]||(st[0]=(...O)=>ct(n).toggleSidebar&&ct(n).toggleSidebar(...O)),class:"btn btn-ghost btn-xs btn-square text-base-content/40 hover:text-base-content","aria-label":"Collapse sidebar",title:"Collapse sidebar"},[...st[4]||(st[4]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11 19l-7-7 7-7m8 14l-7-7 7-7"})],-1)])],512),[[Ce,!u.value]])],2),u.value?(x(),w("button",{key:0,onClick:st[1]||(st[1]=(...O)=>ct(n).toggleSidebar&&ct(n).toggleSidebar(...O)),class:"mx-auto mt-2 mb-1 btn btn-ghost btn-xs btn-square text-base-content/40 hover:text-base-content","aria-label":"Expand sidebar",title:"Expand sidebar"},[...st[5]||(st[5]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 5l7 7-7 7M5 5l7 7-7 7"})],-1)])])):J("",!0),!u.value&&ct(n).version?(x(),w("div",Jg,[d("span",Xg," v"+z(f.value),1),ct(n).updateAvailable?(x(),w("span",{key:0,class:"badge badge-xs badge-primary shrink-0",title:g.value}," update ",8,Qg)):J("",!0),d("button",{type:"button",onClick:S,disabled:ct(n).checkingForUpdates,class:"btn btn-ghost btn-xs ml-auto gap-1 px-1.5 font-normal text-[11px] text-base-content/70 hover:text-base-content","data-testid":"sidebar-check-updates",title:b.value,"aria-label":y.value},[ct(n).checkingForUpdates?(x(),w("span",sm)):(x(),w("svg",em,[...st[6]||(st[6]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0A8.003 8.003 0 014.582 15H9"},null,-1)])])),d("span",nm,z(v.value),1)],8,tm)])):J("",!0),d("nav",{class:yt(["flex-1 overflow-y-auto overflow-x-hidden",u.value?"px-2 py-2":"px-3 py-3"])},[ct(i).isTeamsEdition?(x(),w(wt,{key:0},[d("ul",im,[ct(i).isAdmin&&!u.value?(x(),w("li",om,[...st[7]||(st[7]=[d("span",{class:"text-[10px] font-semibold uppercase tracking-[0.12em] text-base-content/40"},"My Workspace",-1)])])):J("",!0),(x(),w(wt,null,Vt(at,O=>d("li",{key:O.path},[ht(At,{to:O.path,class:yt([{active:P(O.path)},"rounded-lg"]),title:u.value?O.name:""},{default:$t(()=>[d("span",{class:yt(u.value?"mx-auto":"")},z(O.name),3)]),_:2},1032,["to","class","title"])])),64))]),ct(i).isAdmin?(x(),w(wt,{key:0},[st[9]||(st[9]=d("div",{class:"divider my-2 px-2"},null,-1)),d("ul",rm,[u.value?J("",!0):(x(),w("li",am,[...st[8]||(st[8]=[d("span",{class:"text-[10px] font-semibold uppercase tracking-[0.12em] text-base-content/40"},"Administration",-1)])])),(x(),w(wt,null,Vt(F,O=>d("li",{key:O.path},[ht(At,{to:O.path,class:yt([{active:P(O.path)},"rounded-lg"]),title:u.value?O.name:""},{default:$t(()=>[d("span",{class:yt(u.value?"mx-auto":"")},z(O.name),3)]),_:2},1032,["to","class","title"])])),64))])],64)):J("",!0)],64)):(x(),w(wt,{key:1},[d("ul",lm,[d("li",null,[d("a",{href:"#",class:yt(["rounded-lg font-medium relative group",a.value?"bg-gradient-to-r from-primary/10 to-secondary/10 hover:from-primary/15 hover:to-secondary/15":"text-base-content/60"]),title:u.value?l.value:"","data-test":"sidebar-setup",onClick:mn(c,["prevent"])},[d("span",um,[ht(ct(R),{class:yt(["w-5 h-5 shrink-0",a.value?"text-primary":"text-base-content/40"])},null,8,["class"]),a.value?(x(),w("span",dm)):J("",!0)]),Lt(d("span",fm,[a.value?(x(),w("span",hm,"Setup")):(x(),w("span",pm,[...st[10]||(st[10]=[d("span",null,"Setup",-1),d("span",{class:"text-success text-xs"},"βœ“",-1)])]))],512),[[Ce,!u.value]]),a.value&&r.value>0?(x(),w("span",{key:0,class:yt(["badge badge-primary badge-sm",u.value?"absolute -top-1 -right-1 badge-xs":""]),"data-test":"sidebar-setup-badge"},z(r.value),3)):J("",!0)],10,cm)])]),d("ul",gm,[d("li",null,[ht(At,{to:"/",class:yt([{active:P("/")},"rounded-lg font-medium"]),title:u.value?"Dashboard":""},{default:$t(()=>[ht(ct(E),{class:"w-5 h-5 shrink-0"}),Lt(d("span",null,"Dashboard",512),[[Ce,!u.value]])]),_:1},8,["class","title"])])]),u.value?(x(),w("div",vm)):(x(),w("div",mm," Workspace ")),d("ul",ym,[d("li",null,[ht(At,{to:"/servers",class:yt([{active:P("/servers")},"rounded-lg font-medium"]),title:u.value?"Servers":""},{default:$t(()=>[ht(ct(B),{class:"w-5 h-5 shrink-0"}),Lt(d("span",null,"Servers",512),[[Ce,!u.value]])]),_:1},8,["class","title"])]),d("li",null,[ht(At,{to:"/secrets",class:yt([{active:P("/secrets")},"rounded-lg font-medium"]),title:u.value?"Secrets":""},{default:$t(()=>[ht(ct(L),{class:"w-5 h-5 shrink-0"}),Lt(d("span",null,"Secrets",512),[[Ce,!u.value]])]),_:1},8,["class","title"])]),d("li",null,[ht(At,{to:"/tokens",class:yt([{active:P("/tokens")},u.value?"rounded-lg":"rounded-lg !pl-7 text-[13px] text-base-content/75"]),title:u.value?"Agent Tokens":""},{default:$t(()=>[ht(ct(U),{class:yt(["w-4 h-4 shrink-0",u.value?"w-5 h-5":""])},null,8,["class"]),Lt(d("span",null,"Agent Tokens",512),[[Ce,!u.value]])]),_:1},8,["class","title"])]),d("li",null,[ht(At,{to:"/activity",class:yt([{active:P("/activity")},"rounded-lg font-medium"]),title:u.value?"Activity Log":""},{default:$t(()=>[ht(ct(V),{class:"w-5 h-5 shrink-0"}),Lt(d("span",null,"Activity Log",512),[[Ce,!u.value]])]),_:1},8,["class","title"])]),d("li",null,[ht(At,{to:"/security",class:yt([{active:P("/security")},"rounded-lg font-medium"]),title:u.value?"Security Scanners":""},{default:$t(()=>[ht(ct(T),{class:"w-5 h-5 shrink-0"}),Lt(d("span",null,"Security Scanners",512),[[Ce,!u.value]])]),_:1},8,["class","title"])])]),u.value?(x(),w("div",_m)):(x(),w("div",bm," System ")),d("ul",xm,[d("li",null,[ht(At,{to:"/repositories",class:yt([{active:P("/repositories")},"rounded-lg text-base-content/70"]),title:u.value?"Repositories":""},{default:$t(()=>[ht(ct(I),{class:"w-5 h-5 shrink-0"}),Lt(d("span",wm,"Repositories",512),[[Ce,!u.value]])]),_:1},8,["class","title"])]),d("li",null,[ht(At,{to:"/settings",class:yt([{active:P("/settings")},"rounded-lg text-base-content/70"]),title:u.value?"Configuration":""},{default:$t(()=>[ht(ct(H),{class:"w-5 h-5 shrink-0"}),Lt(d("span",km,"Configuration",512),[[Ce,!u.value]])]),_:1},8,["class","title"])])])],64))],2),ct(i).isTeamsEdition&&ct(i).isAuthenticated&&!u.value?(x(),w("div",Sm,[d("div",Cm,[d("div",Am,[d("div",Im,[d("div",Mm,[d("span",Em,z(N.value),1)])]),d("div",Tm,[d("div",Pm,z(ct(i).displayName),1),(K=ct(i).user)!=null&&K.email?(x(),w("div",Om,z(ct(i).user.email),1)):J("",!0)])]),d("button",{onClick:W,class:"btn btn-ghost btn-xs",title:"Sign out"},[...st[11]||(st[11]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})],-1)])])])])):J("",!0),d("div",{class:yt(["border-t border-base-300 py-2",u.value?"px-1":"px-3"])},[d("div",{class:yt(["flex items-stretch gap-1",u.value?"flex-col":""])},[d("div",{class:yt(["dropdown dropdown-top",u.value?"":"dropdown-end flex-1"])},[d("div",{tabindex:"0",role:"button",class:yt(["btn btn-ghost btn-sm font-normal",u.value?"btn-square w-full":"w-full justify-start gap-2 px-2"]),title:u.value?"Theme":""},[st[12]||(st[12]=d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"})],-1)),Lt(d("span",null,"Theme",512),[[Ce,!u.value]])],10,Rm),d("ul",$m,[st[13]||(st[13]=d("li",{class:"menu-title"},[d("span",null,"Choose theme")],-1)),(x(!0),w(wt,null,Vt(ct(n).themes,O=>(x(),w("li",{key:O.name},[d("a",{onClick:bt=>ct(n).setTheme(O.name),class:yt({active:ct(n).currentTheme===O.name})},[d("span",{"data-theme":O.name,class:"bg-base-100 rounded-badge w-4 h-4 mr-2"},null,8,Dm),mt(" "+z(O.displayName),1)],10,Lm)]))),128))])],2),ct(i).isTeamsEdition?J("",!0):(x(),is(At,{key:0,to:"/feedback",class:yt(["btn btn-ghost btn-sm !h-9 !min-h-[2.25rem] px-0 flex items-center justify-center",[{"btn-active":P("/feedback")},u.value?"w-full":"w-9"]]),title:"Send feedback","aria-label":"Send feedback"},{default:$t(()=>[...st[14]||(st[14]=[d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor","stroke-width":"1.8",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z"})],-1)])]),_:1},8,["class"]))],2)],2)],2)])}}}),hi=(e,t)=>{const s=e.__vccOpts||e;for(const[n,i]of t)s[n]=i;return s},Nm=hi(Fm,[["__scopeId","data-v-288e07db"]]);function Il(e){return e.connected}const pi=Mo("servers",()=>{const e=X([]),t=X({loading:!1,error:null}),s=ot(()=>({total:e.value.length,connected:e.value.filter(Il).length,enabled:e.value.filter(T=>T.enabled).length,quarantined:e.value.filter(T=>T.quarantined).length})),n=ot(()=>e.value.filter(Il)),i=ot(()=>e.value.filter(T=>T.enabled)),o=ot(()=>e.value.filter(T=>T.quarantined)),r=ot(()=>e.value.filter(T=>T.enabled).reduce((T,I)=>T+I.tool_count,0));function a(T,I){const H=new Map(T.map(F=>[F.name,F])),R=new Map(I.map(F=>[F.name,F])),at=[];return I.forEach(F=>{const N=H.get(F.name);if(N){let P=!1;!("last_error"in F)&&N.last_error&&(delete N.last_error,P=!0),Object.assign(N,F),P=!0,P&&console.log(`Server ${N.name} updated with changes`),at.push(N)}else console.log(`New server added: ${F.name}`),at.push(F)}),T.forEach(F=>{R.has(F.name)||console.log(`Server removed: ${F.name}`)}),at.sort((F,N)=>F.name.localeCompare(N.name))}async function l(T=!1){T||(t.value={loading:!0,error:null});try{const I=await pt.getServers();I.success&&I.data?e.value=a(e.value,I.data.servers):t.value.error=I.error||"Failed to fetch servers"}catch(I){t.value.error=I instanceof Error?I.message:"Unknown error"}finally{T||(t.value.loading=!1)}}async function c(T){try{const I=e.value.find(R=>R.name===T);I&&(I.enabled=!0,I.connecting=!0,I.connected=!1);const H=await pt.enableServer(T);if(H.success)return!0;throw I&&(I.enabled=!1,I.connecting=!1),new Error(H.error||"Failed to enable server")}catch(I){console.error("Failed to enable server:",I);const H=e.value.find(R=>R.name===T);throw H&&(H.enabled=!1,H.connecting=!1),I}}async function u(T){try{const I=e.value.find(R=>R.name===T);I&&(I.enabled=!1,I.connecting=!1,I.connected=!1);const H=await pt.disableServer(T);if(H.success)return!0;throw I&&(I.enabled=!0),new Error(H.error||"Failed to disable server")}catch(I){console.error("Failed to disable server:",I);const H=e.value.find(R=>R.name===T);throw H&&(H.enabled=!0),I}}async function f(T){try{const I=await pt.restartServer(T);if(I.success){const H=e.value.find(R=>R.name===T);return H&&(H.connecting=!0,H.connected=!1),!0}else throw new Error(I.error||"Failed to restart server")}catch(I){throw console.error("Failed to restart server:",I),I}}async function h(T){try{const I=await pt.triggerOAuthLogin(T);if(I.success)return!0;throw new Error(I.error||"Failed to trigger OAuth login")}catch(I){throw console.error("Failed to trigger OAuth login:",I),I}}async function g(T){try{const I=e.value.find(R=>R.name===T);I&&(I.authenticated=!1);const H=await pt.triggerOAuthLogout(T);if(H.success)return!0;throw I&&(I.authenticated=!0),new Error(H.error||"Failed to trigger OAuth logout")}catch(I){console.error("Failed to trigger OAuth logout:",I);const H=e.value.find(R=>R.name===T);throw H&&(H.authenticated=!0),I}}async function y(T){try{const I=await pt.quarantineServer(T);if(I.success){const H=e.value.find(R=>R.name===T);return H&&(H.quarantined=!0),!0}else throw new Error(I.error||"Failed to quarantine server")}catch(I){throw console.error("Failed to quarantine server:",I),I}}async function v(T){try{const I=await pt.unquarantineServer(T);if(I.success){const H=e.value.find(R=>R.name===T);return H&&(H.quarantined=!1),!0}else throw new Error(I.error||"Failed to unquarantine server")}catch(I){throw console.error("Failed to unquarantine server:",I),I}}async function b(T,I=!1){try{const H=await pt.securityApprove(T,I);if(H.success){const R=e.value.find(at=>at.name===T);return R&&(R.quarantined=!1),!0}else throw new Error(H.error||"Failed to approve server")}catch(H){throw console.error("Failed to approve server via security scanner:",H),H}}async function S(T){try{const I=await pt.deleteServer(T);if(I.success)return e.value=e.value.filter(H=>H.name!==T),!0;throw new Error(I.error||"Failed to delete server")}catch(I){throw console.error("Failed to delete server:",I),I}}function _(T){T.upstream_stats&&l()}async function k(T){try{const I=await pt.callTool("upstream_servers",T);if(I.success)return await l(),!0;throw new Error(I.error||"Failed to add server")}catch(I){throw console.error("Failed to add server:",I),I}}function E(T){return e.value.find(I=>I.name===T)}function B(){window.addEventListener("mcpproxy:servers-changed",U),window.addEventListener("mcpproxy:config-reloaded",V)}function L(){window.removeEventListener("mcpproxy:servers-changed",U),window.removeEventListener("mcpproxy:config-reloaded",V)}function U(T){console.log("Servers changed event received, updating in background...",T.detail),l(!0)}function V(T){console.log("Config reloaded event received, updating in background...",T.detail),l(!0)}return B(),{servers:e,loading:t,serverCount:s,connectedServers:n,enabledServers:i,quarantinedServers:o,totalTools:r,fetchServers:l,enableServer:c,disableServer:u,restartServer:f,triggerOAuthLogin:h,triggerOAuthLogout:g,quarantineServer:y,unquarantineServer:v,securityApproveServer:b,deleteServer:S,updateServerStatus:_,getServerByName:E,addServer:k,cleanupEventListeners:L}}),jm=["open"],zm={class:"modal-box max-w-3xl"},Bm={class:"tabs tabs-boxed mb-4"},Hm={key:0},Wm={class:"form-control mb-4"},Um={class:"flex gap-4"},Vm={class:"flex items-center space-x-2 cursor-pointer"},qm={class:"flex items-center space-x-2 cursor-pointer"},Km={class:"form-control mb-4"},Ym={key:0,class:"space-y-4"},Gm={class:"form-control"},Zm={key:1,class:"space-y-4"},Jm={class:"form-control"},Xm={key:0,class:"form-control"},Qm={class:"form-control"},tv={class:"form-control"},ev={class:"form-control"},sv={class:"space-y-3"},nv={class:"form-control"},iv={class:"label cursor-pointer justify-start space-x-3"},ov={class:"form-control"},rv={class:"label cursor-pointer justify-start space-x-3"},av={class:"form-control"},lv={class:"label cursor-pointer justify-start space-x-3"},cv=["disabled"],uv={class:"form-control"},dv={class:"label cursor-pointer justify-start space-x-3"},fv={key:2,class:"alert alert-error mt-4"},hv={class:"modal-action"},pv=["disabled"],gv={key:0,class:"loading loading-spinner loading-sm"},mv={key:1},vv={class:"flex gap-2 mb-4"},yv={key:0,class:"form-control mb-4"},bv={key:0,class:"mt-3 p-3 bg-base-200 rounded-lg"},_v={class:"space-y-2"},xv={class:"flex-1 min-w-0"},wv={class:"flex items-center gap-2"},kv={class:"font-medium text-sm"},Sv={key:0,class:"badge badge-success badge-xs"},Cv={key:1,class:"badge badge-ghost badge-xs"},Av=["title"],Iv=["onClick","disabled"],Mv={key:0,class:"loading loading-spinner loading-xs"},Ev={key:1},Tv={key:1,class:"form-control mb-4"},Pv={key:0,class:"mt-2 p-3 bg-error/10 border border-error/30 rounded-lg"},Ov={class:"flex items-start gap-2 text-error"},Rv={class:"text-sm mt-1"},$v={key:0,class:"text-xs mt-1 opacity-70"},Lv={key:0},Dv={key:1,class:"text-xs mt-2 text-warning"},Fv={class:"form-control mb-4"},Nv={key:2,class:"flex justify-center py-4"},jv={key:3,class:"space-y-4"},zv={class:"alert alert-info"},Bv={class:"stats shadow w-full"},Hv={class:"stat"},Wv={class:"stat-value text-lg"},Uv={class:"stat"},Vv={class:"stat-value text-lg text-success"},qv={key:0,class:"stat"},Kv={class:"stat-value text-lg text-warning"},Yv={key:0,class:"alert alert-warning"},Gv={class:"text-sm mt-1"},Zv={key:1,class:"space-y-2"},Jv={class:"flex justify-between items-center"},Xv={class:"flex items-center gap-2 cursor-pointer"},Qv=["checked"],ty={class:"max-h-64 overflow-y-auto space-y-2"},ey=["checked","onChange"],sy={class:"flex-1"},ny={class:"font-medium"},iy={class:"text-sm opacity-70"},oy={class:"badge badge-sm mr-1"},ry={key:0},ay={key:1},ly={key:0,class:"text-xs text-warning mt-1"},cy={key:2,class:"collapse collapse-arrow bg-base-200"},uy={class:"collapse-title font-medium"},dy={class:"collapse-content"},fy={class:"font-medium"},hy={class:"text-sm text-warning"},py={key:4,class:"alert alert-error mt-4"},gy={key:5,class:"alert alert-error mt-4"},my={class:"text-sm mt-1 list-disc list-inside"},vy={class:"modal-action"},yy=["disabled"],by={key:0,class:"loading loading-spinner loading-sm"},na=ie({__name:"AddServerModal",props:{show:{type:Boolean}},emits:["close","added"],setup(e,{emit:t}){const s=e,n=t,i=pi(),o=hs(),r=X("manual"),a=us({type:"stdio",name:"",url:"",command:"",customCommand:"",argsText:"",envText:"",workingDir:"",enabled:!0,quarantined:!0,isolated:!1,idleOnInactivity:!1}),l=X(!1),c=X(""),u=X("file"),f=X(""),h=X(""),g=X(null),y=X(!1),v=X(null),b=X(""),S=X(!1),_=X(new Set),k=X(null),E=X([]),B=X(null),L=X(null),U=X(null),V=X(null);let T=null;const I=ot(()=>f.value?Math.max(f.value.split(` -`).length,10):10),H=ot(()=>{var m;return(m=v.value)!=null&&m.imported.length?v.value.imported.every(p=>_.value.has(p.name)):!1}),R=[/missing command field/i,/missing url field/i];function at(m){var p;return(p=m.warnings)!=null&&p.length?m.warnings.some(A=>R.some($=>$.test(A))):!1}const F=ot(()=>{var m;return(m=v.value)!=null&&m.imported?v.value.imported.filter(p=>_.value.has(p.name)&&at(p)):[]}),N=ot(()=>!v.value||_.value.size===0?!1:F.value.length===0);ve(()=>a.type,m=>{m!=="stdio"&&(a.isolated=!1)}),ve(()=>s.show,m=>{m&&(r.value="manual")}),ve(f,()=>{u.value==="paste"&&f.value.trim()&&K()}),ve(h,()=>{(f.value.trim()||g.value)&&bt()});function P(){return a.argsText.trim()?a.argsText.split(` -`).map(m=>m.trim()).filter(m=>m):[]}function W(){if(!a.envText.trim())return{};const m={};return a.envText.split(` -`).forEach(p=>{const A=p.trim();if(!A)return;const[$,...C]=A.split("=");$&&C.length>0&&(m[$.trim()]=C.join("=").trim())}),m}function Y(m){const p=m.trim();if(!p)return{valid:!0};if(p.startsWith("[")||p.includes("=")&&!p.includes(":"))return{valid:!0};try{return JSON.parse(p),{valid:!0}}catch($){if($ instanceof SyntaxError){const C=$.message;let D,et,tt;const Q=C.match(/position (\d+)/),G=C.match(/line (\d+) column (\d+)/);if(G)D=parseInt(G[1],10),et=parseInt(G[2],10);else if(Q){const lt=parseInt(Q[1],10),ft=p.substring(0,lt).split(` -`);D=ft.length,et=ft[ft.length-1].length+1}return(C.includes("Unexpected token")||C.includes("Expected"))&&(p.match(/,\s*[}\]]/)?tt='Check for trailing commas before closing braces or brackets (e.g., "value",} should be "value"})':p.includes("\\")&&!p.includes("\\\\")&&!p.match(/\\[nrt"\\\/bfu]/)?tt='Check for unescaped backslashes. In JSON, backslashes must be escaped as \\\\ (e.g., "C:\\\\" instead of "C:\\")':p.includes("'")&&(tt="JSON requires double quotes for strings. Replace single quotes with double quotes.")),{valid:!1,error:{message:C.replace(/^JSON\.parse: /,"").replace(/^Unexpected token/,"Unexpected character").replace(/ in JSON at position \d+$/,""),line:D,column:et,hint:tt}}}return{valid:!1,error:{message:"Invalid content format"}}}}async function st(){c.value="",l.value=!0;try{const m=a.command==="custom"?a.customCommand:a.command,p=P(),A=W(),$={operation:"add",name:a.name,protocol:a.type,enabled:a.enabled,quarantined:a.quarantined};a.type==="http"?$.url=a.url:($.command=m,p.length>0&&($.args_json=JSON.stringify(p)),Object.keys(A).length>0&&($.env_json=JSON.stringify(A)),a.workingDir&&($.working_dir=a.workingDir),a.isolated&&($.isolation_json=JSON.stringify({enabled:!0}))),await i.addServer($),o.addToast({type:"success",title:"Server Added",message:`${a.name} has been added successfully`}),n("added"),St()}catch(m){c.value=m instanceof Error?m.message:"Failed to add server"}finally{l.value=!1}}function At(m){const p=m.target;p.files&&p.files.length>0&&(g.value=p.files[0],bt())}function K(){T&&clearTimeout(T),T=setTimeout(()=>{bt()},500)}function O(){U.value&&V.value&&(V.value.scrollTop=U.value.scrollTop)}async function bt(){b.value="",v.value=null,_.value.clear(),k.value=null,L.value=null,u.value==="file"&&g.value?await dt():u.value==="paste"&&f.value.trim()&&await Pt()}async function dt(){if(g.value){y.value=!0;try{const m=await pt.importServersFromFile(g.value,{format:h.value||void 0,preview:!0});m.success&&m.data?(v.value=m.data,m.data.imported.forEach(p=>_.value.add(p.name))):b.value=m.error||"Failed to preview import"}catch(m){b.value=m instanceof Error?m.message:"Failed to preview import"}finally{y.value=!1}}}async function Pt(){if(!f.value.trim())return;const m=Y(f.value);if(!m.valid){k.value=m.error||{message:"Invalid content"},v.value=null;return}k.value=null,y.value=!0;try{const p=await pt.importServersFromJSON({content:f.value,format:h.value||void 0,preview:!0});p.success&&p.data?(v.value=p.data,p.data.imported.forEach(A=>_.value.add(A.name))):b.value=p.error||"Failed to preview import"}catch(p){b.value=p instanceof Error?p.message:"Failed to preview import"}finally{y.value=!1}}function Ct(m){_.value.has(m)?_.value.delete(m):_.value.add(m)}function j(){var m;H.value?_.value.clear():(m=v.value)==null||m.imported.forEach(p=>_.value.add(p.name))}async function rt(){if(!(!v.value||_.value.size===0)){S.value=!0,b.value="";try{const m=Array.from(_.value);let p;if(L.value?p=await pt.importServersFromPath({path:L.value.path,format:L.value.format,server_names:m,preview:!1}):u.value==="file"&&g.value?p=await pt.importServersFromFile(g.value,{format:h.value||void 0,server_names:m,preview:!1}):p=await pt.importServersFromJSON({content:f.value,format:h.value||void 0,server_names:m,preview:!1}),p.success&&p.data){const A=p.data.summary.imported;o.addToast({type:"success",title:"Import Successful",message:`${A} server${A!==1?"s":""} imported successfully`}),n("added"),St()}else b.value=p.error||"Failed to import servers"}catch(m){b.value=m instanceof Error?m.message:"Failed to import servers"}finally{S.value=!1}}}async function nt(){try{const m=await pt.getCanonicalConfigPaths();m.success&&m.data&&(E.value=m.data.paths.sort((p,A)=>p.exists!==A.exists?p.exists?-1:1:p.name.localeCompare(A.name)))}catch(m){console.error("Failed to load canonical config paths:",m)}}async function ut(m){B.value=m.path,b.value="";try{const p=await pt.importServersFromPath({path:m.path,format:m.format,preview:!0});if(!p.success||!p.data){b.value=p.error||"Failed to preview import";return}v.value=p.data,L.value={path:m.path,format:m.format},_.value.clear(),p.data.imported.forEach(A=>_.value.add(A.name))}catch(p){b.value=p instanceof Error?p.message:"Failed to import from config"}finally{B.value=null}}ve(()=>s.show,m=>{m&&nt()});function St(){a.type="stdio",a.name="",a.url="",a.command="",a.customCommand="",a.argsText="",a.envText="",a.workingDir="",a.enabled=!0,a.quarantined=!0,a.isolated=!1,a.idleOnInactivity=!1,c.value="",u.value="file",f.value="",h.value="",g.value=null,v.value=null,b.value="",k.value=null,_.value.clear(),L.value=null,r.value="manual",n("close")}return(m,p)=>{var A,$;return x(),w("dialog",{open:m.show,class:"modal"},[d("div",zm,[p[65]||(p[65]=d("h3",{class:"font-bold text-lg mb-4"},"Add New Server",-1)),d("div",Bm,[d("a",{class:yt(["tab",r.value==="manual"?"tab-active":""]),onClick:p[0]||(p[0]=C=>r.value="manual")}," Manual ",2),d("a",{class:yt(["tab",r.value==="import"?"tab-active":""]),onClick:p[1]||(p[1]=C=>r.value="import")}," Import ",2)]),r.value==="manual"?(x(),w("div",Hm,[d("form",{onSubmit:mn(st,["prevent"])},[d("div",Wm,[p[21]||(p[21]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Server Type")],-1)),d("div",Um,[d("label",Vm,[Lt(d("input",{type:"radio",name:"serverType",value:"stdio","onUpdate:modelValue":p[2]||(p[2]=C=>a.type=C),class:"radio radio-primary"},null,512),[[yr,a.type]]),p[19]||(p[19]=d("span",null,"stdio (Local Command)",-1))]),d("label",qm,[Lt(d("input",{type:"radio",name:"serverType",value:"http","onUpdate:modelValue":p[3]||(p[3]=C=>a.type=C),class:"radio radio-primary"},null,512),[[yr,a.type]]),p[20]||(p[20]=d("span",null,"HTTP/HTTPS (Remote)",-1))])])]),d("div",Km,[p[22]||(p[22]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Server Name")],-1)),Lt(d("input",{type:"text","onUpdate:modelValue":p[4]||(p[4]=C=>a.name=C),placeholder:"e.g., github-server",class:"input input-bordered",required:""},null,512),[[Oe,a.name]])]),a.type==="http"?(x(),w("div",Ym,[d("div",Gm,[p[23]||(p[23]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"URL")],-1)),Lt(d("input",{type:"url","onUpdate:modelValue":p[5]||(p[5]=C=>a.url=C),placeholder:"https://api.example.com/mcp",class:"input input-bordered",required:""},null,512),[[Oe,a.url]])])])):J("",!0),a.type==="stdio"?(x(),w("div",Zm,[d("div",Jm,[p[25]||(p[25]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Command")],-1)),Lt(d("select",{"onUpdate:modelValue":p[6]||(p[6]=C=>a.command=C),class:"select select-bordered",required:""},[...p[24]||(p[24]=[Ve('',6)])],512),[[br,a.command]])]),a.command==="custom"?(x(),w("div",Xm,[p[26]||(p[26]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Custom Command Path")],-1)),Lt(d("input",{type:"text","onUpdate:modelValue":p[7]||(p[7]=C=>a.customCommand=C),placeholder:"/usr/local/bin/my-mcp-server",class:"input input-bordered",required:""},null,512),[[Oe,a.customCommand]])])):J("",!0),d("div",Qm,[p[27]||(p[27]=Ve('',1)),Lt(d("textarea",{"onUpdate:modelValue":p[8]||(p[8]=C=>a.argsText=C),placeholder:"@modelcontextprotocol/server-filesystem",class:"textarea textarea-bordered h-24",rows:"3"},null,512),[[Oe,a.argsText]])]),d("div",tv,[p[28]||(p[28]=Ve('',1)),Lt(d("textarea",{"onUpdate:modelValue":p[9]||(p[9]=C=>a.envText=C),placeholder:`API_KEY=your-key -DEBUG=true`,class:"textarea textarea-bordered h-24",rows:"3"},null,512),[[Oe,a.envText]])]),d("div",ev,[p[29]||(p[29]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Working Directory (Optional)")],-1)),Lt(d("input",{type:"text","onUpdate:modelValue":p[10]||(p[10]=C=>a.workingDir=C),placeholder:"/path/to/project",class:"input input-bordered"},null,512),[[Oe,a.workingDir]])])])):J("",!0),p[40]||(p[40]=d("div",{class:"divider mt-6"},"Options",-1)),d("div",sv,[d("div",nv,[d("label",iv,[Lt(d("input",{type:"checkbox","onUpdate:modelValue":p[11]||(p[11]=C=>a.enabled=C),class:"toggle toggle-primary"},null,512),[[Mn,a.enabled]]),p[30]||(p[30]=d("span",{class:"label-text font-semibold"},"Enabled",-1)),p[31]||(p[31]=d("div",{class:"tooltip tooltip-right","data-tip":"Start this server immediately after adding"},[d("svg",{class:"w-4 h-4 opacity-60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1))])]),d("div",ov,[d("label",rv,[Lt(d("input",{type:"checkbox","onUpdate:modelValue":p[12]||(p[12]=C=>a.quarantined=C),class:"toggle toggle-warning"},null,512),[[Mn,a.quarantined]]),p[32]||(p[32]=d("span",{class:"label-text font-semibold"},"Quarantined",-1)),p[33]||(p[33]=d("div",{class:"tooltip tooltip-right","data-tip":"Prevent tool execution until security review is complete. Recommended for new servers."},[d("svg",{class:"w-4 h-4 opacity-60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1))])]),d("div",av,[d("label",lv,[Lt(d("input",{type:"checkbox","onUpdate:modelValue":p[13]||(p[13]=C=>a.isolated=C),class:"toggle toggle-info",disabled:a.type!=="stdio"},null,8,cv),[[Mn,a.isolated]]),p[34]||(p[34]=d("span",{class:"label-text font-semibold"},"Docker Isolation",-1)),p[35]||(p[35]=d("div",{class:"tooltip tooltip-right","data-tip":"Run stdio server in isolated Docker container for enhanced security (stdio only)"},[d("svg",{class:"w-4 h-4 opacity-60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1))])]),d("div",uv,[d("label",dv,[Lt(d("input",{type:"checkbox","onUpdate:modelValue":p[14]||(p[14]=C=>a.idleOnInactivity=C),class:"toggle toggle-success",disabled:""},null,512),[[Mn,a.idleOnInactivity]]),p[36]||(p[36]=d("span",{class:"label-text font-semibold opacity-50"},"Idle on Inactivity",-1)),p[37]||(p[37]=d("div",{class:"tooltip tooltip-right","data-tip":"Future feature: Automatically stop server after period of inactivity to save resources"},[d("svg",{class:"w-4 h-4 opacity-60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})])],-1))]),p[38]||(p[38]=d("span",{class:"text-xs opacity-50 ml-12"},"Coming soon",-1))])]),c.value?(x(),w("div",fv,[p[39]||(p[39]=d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),d("span",null,z(c.value),1)])):J("",!0),d("div",hv,[d("button",{type:"button",onClick:St,class:"btn btn-ghost"},"Cancel"),d("button",{type:"submit",class:"btn btn-primary",disabled:l.value},[l.value?(x(),w("span",gv)):J("",!0),mt(" "+z(l.value?"Adding...":"Add Server"),1)],8,pv)])],32)])):J("",!0),r.value==="import"?(x(),w("div",mv,[d("div",vv,[d("button",{class:yt(["btn btn-sm",u.value==="file"?"btn-primary":"btn-outline"]),onClick:p[15]||(p[15]=C=>u.value="file")}," Upload File ",2),d("button",{class:yt(["btn btn-sm",u.value==="paste"?"btn-primary":"btn-outline"]),onClick:p[16]||(p[16]=C=>u.value="paste")}," Paste Content ",2)]),u.value==="file"?(x(),w("div",yv,[p[42]||(p[42]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Configuration File")],-1)),d("input",{type:"file",accept:".json,.toml",onChange:At,class:"file-input file-input-bordered w-full"},null,32),p[43]||(p[43]=d("label",{class:"label"},[d("span",{class:"label-text-alt"},"Supports Claude Desktop, Claude Code, Cursor IDE, Codex CLI, and Gemini CLI configs")],-1)),E.value.length>0?(x(),w("div",bv,[p[41]||(p[41]=d("div",{class:"text-sm font-semibold mb-2 flex items-center gap-2"},[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})]),mt(" Quick Import - Found Configs ")],-1)),d("div",_v,[(x(!0),w(wt,null,Vt(E.value,C=>(x(),w("div",{key:C.path,class:yt(["flex items-center justify-between p-2 rounded",C.exists?"bg-success/10 border border-success/30":"bg-base-300/50"])},[d("div",xv,[d("div",wv,[d("span",kv,z(C.name),1),C.exists?(x(),w("span",Sv,"Found")):(x(),w("span",Cv,"Not found"))]),d("div",{class:"text-xs text-base-content/60 truncate",title:C.path},z(C.path),9,Av)]),C.exists?(x(),w("button",{key:0,onClick:D=>ut(C),class:"btn btn-primary btn-xs ml-2",disabled:B.value===C.path},[B.value===C.path?(x(),w("span",Mv)):(x(),w("span",Ev,"Import"))],8,Iv)):J("",!0)],2))),128))])])):J("",!0)])):J("",!0),u.value==="paste"?(x(),w("div",Tv,[p[47]||(p[47]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Configuration Content")],-1)),d("div",{class:yt(["flex border rounded-lg overflow-hidden h-48",k.value?"border-error":"border-base-300"])},[d("div",{ref_key:"lineNumbersRef",ref:V,class:"bg-base-200 text-base-content/50 text-right select-none py-2 px-2 font-mono text-sm overflow-hidden border-r border-base-300",style:{"min-width":"3rem"}},[(x(!0),w(wt,null,Vt(I.value,C=>{var D;return x(),w("div",{key:C,class:yt(["leading-[1.5rem]",{"text-error font-bold":((D=k.value)==null?void 0:D.line)===C}])},z(C),3)}),128))],512),Lt(d("textarea",{ref_key:"textareaRef",ref:U,"onUpdate:modelValue":p[17]||(p[17]=C=>f.value=C),placeholder:`Paste JSON or TOML configuration here... - -Example (Claude Desktop): -{ - "mcpServers": { - "github": { - "command": "uvx", - "args": ["mcp-server-github"] - } - } -}`,class:"flex-1 bg-base-100 font-mono text-sm resize-none border-0 focus:outline-none py-2 px-3 leading-[1.5rem]",onInput:K,onScroll:O},null,544),[[Oe,f.value]])],2),k.value?(x(),w("div",Pv,[d("div",Ov,[p[46]||(p[46]=d("svg",{class:"w-5 h-5 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),d("div",null,[p[45]||(p[45]=d("div",{class:"font-semibold"},"Invalid JSON Syntax",-1)),d("div",Rv,z(k.value.message),1),k.value.line?(x(),w("div",$v,[mt(" Line "+z(k.value.line),1),k.value.column?(x(),w("span",Lv,", Column "+z(k.value.column),1)):J("",!0)])):J("",!0),k.value.hint?(x(),w("div",Dv,[p[44]||(p[44]=d("strong",null,"Hint:",-1)),mt(" "+z(k.value.hint),1)])):J("",!0)])])])):J("",!0)])):J("",!0),d("div",Fv,[p[49]||(p[49]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Format (Optional)")],-1)),Lt(d("select",{"onUpdate:modelValue":p[18]||(p[18]=C=>h.value=C),class:"select select-bordered select-sm"},[...p[48]||(p[48]=[Ve('',6)])],512),[[br,h.value]])]),y.value?(x(),w("div",Nv,[...p[50]||(p[50]=[d("span",{class:"loading loading-spinner loading-md"},null,-1),d("span",{class:"ml-2"},"Loading preview...",-1)])])):J("",!0),v.value&&!y.value?(x(),w("div",jv,[d("div",zv,[p[52]||(p[52]=d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),d("span",null,[p[51]||(p[51]=mt("Detected format: ",-1)),d("strong",null,z(v.value.format_name),1)])]),d("div",Bv,[d("div",Hv,[p[53]||(p[53]=d("div",{class:"stat-title"},"Total",-1)),d("div",Wv,z(v.value.summary.total),1)]),d("div",Uv,[p[54]||(p[54]=d("div",{class:"stat-title"},"Will Import",-1)),d("div",Vv,z(v.value.summary.imported),1)]),v.value.summary.skipped>0?(x(),w("div",qv,[p[55]||(p[55]=d("div",{class:"stat-title"},"Skipped",-1)),d("div",Kv,z(v.value.summary.skipped),1)])):J("",!0)]),((A=v.value.warnings)==null?void 0:A.length)>0?(x(),w("div",Yv,[p[57]||(p[57]=d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),d("div",null,[p[56]||(p[56]=d("div",{class:"font-bold"},"Warnings",-1)),d("ul",Gv,[(x(!0),w(wt,null,Vt(v.value.warnings,(C,D)=>(x(),w("li",{key:D},z(C),1))),128))])])])):J("",!0),v.value.imported.length>0?(x(),w("div",Zv,[d("div",Jv,[p[59]||(p[59]=d("span",{class:"font-semibold"},"Servers to Import",-1)),d("label",Xv,[d("input",{type:"checkbox",class:"checkbox checkbox-sm",checked:H.value,onChange:j},null,40,Qv),p[58]||(p[58]=d("span",{class:"text-sm"},"Select All",-1))])]),d("div",ty,[(x(!0),w(wt,null,Vt(v.value.imported,C=>{var D,et;return x(),w("div",{key:C.name,class:"flex items-center gap-3 p-3 bg-base-200 rounded-lg"},[d("input",{type:"checkbox",class:"checkbox checkbox-primary",checked:_.value.has(C.name),onChange:tt=>Ct(C.name)},null,40,ey),d("div",sy,[d("div",ny,z(C.name),1),d("div",iy,[d("span",oy,z(C.protocol),1),C.command?(x(),w("span",ry,z(C.command)+" "+z((D=C.args)==null?void 0:D.join(" ")),1)):C.url?(x(),w("span",ay,z(C.url),1)):J("",!0)]),(et=C.warnings)!=null&&et.length?(x(),w("div",ly,z(C.warnings.join(", ")),1)):J("",!0)])])}),128))])])):J("",!0),(($=v.value.skipped)==null?void 0:$.length)>0?(x(),w("div",cy,[p[60]||(p[60]=d("input",{type:"checkbox"},null,-1)),d("div",uy," Skipped Servers ("+z(v.value.skipped.length)+") ",1),d("div",dy,[(x(!0),w(wt,null,Vt(v.value.skipped,C=>(x(),w("div",{key:C.name,class:"py-2 border-b border-base-300 last:border-0"},[d("div",fy,z(C.name),1),d("div",hy,z(C.reason),1)]))),128))])])):J("",!0)])):J("",!0),b.value?(x(),w("div",py,[p[61]||(p[61]=d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),d("span",null,z(b.value),1)])):J("",!0),F.value.length>0?(x(),w("div",gy,[p[64]||(p[64]=d("svg",{class:"w-5 h-5 flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),d("div",null,[p[62]||(p[62]=d("div",{class:"font-bold"},"Cannot import servers with critical errors",-1)),d("ul",my,[(x(!0),w(wt,null,Vt(F.value,C=>{var D;return x(),w("li",{key:C.name},[d("strong",null,z(C.name)+":",1),mt(" "+z((D=C.warnings)==null?void 0:D.filter(et=>/missing (command|url) field/i.test(et)).join(", ")),1)])}),128))]),p[63]||(p[63]=d("div",{class:"text-sm mt-2"},"Deselect these servers or fix the configuration before importing.",-1))])])):J("",!0),d("div",vy,[d("button",{type:"button",onClick:St,class:"btn btn-ghost"},"Cancel"),d("button",{onClick:rt,class:"btn btn-primary",disabled:S.value||!N.value},[S.value?(x(),w("span",by)):J("",!0),mt(" "+z(S.value?"Importing...":`Import ${_.value.size} Server${_.value.size!==1?"s":""}`),1)],8,yy)])])):J("",!0)]),d("form",{method:"dialog",class:"modal-backdrop",onClick:St},[...p[66]||(p[66]=[d("button",null,"close",-1)])])],8,jm)}}}),_y={class:"bg-base-100 border-b border-base-300 sticky top-0 z-30"},xy={class:"flex items-center justify-between px-6 py-4 max-w-full"},wy={class:"flex items-center space-x-3 flex-1 min-w-0 overflow-x-hidden"},ky={class:"flex items-center space-x-2 flex-1 max-w-2xl min-w-0"},Sy={class:"relative flex-1"},Cy=["disabled"],Ay={class:"hidden sm:inline ml-2"},Iy={class:"hidden md:flex items-center space-x-3 flex-shrink-0"},My={class:"flex items-center space-x-2 px-3 py-2 bg-base-200 rounded-lg text-sm"},Ey={class:"font-bold"},Ty={class:"flex items-center space-x-2 px-3 py-2 bg-base-200 rounded-lg text-sm"},Py={class:"font-bold"},Oy={class:"flex items-center space-x-2 px-3 py-2 bg-base-200 rounded-lg text-sm"},Ry={class:"font-medium"},$y={key:0,class:"relative"},Ly={class:"text-xs font-mono"},Dy={key:0,class:"absolute right-0 top-full mt-2 p-3 shadow-lg bg-base-100 rounded-box w-96 border border-base-300 z-50"},Fy={class:"space-y-1"},Ny={class:"min-w-0 flex-1"},jy={class:"flex items-center space-x-2"},zy={class:"text-xs font-mono truncate"},By={key:0,class:"badge badge-xs badge-primary"},Hy={class:"text-xs opacity-50 mt-0.5"},Wy=["onClick","data-tip"],Uy={key:0,class:"w-3.5 h-3.5 text-success",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Vy={key:1,class:"w-3.5 h-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},qy=ie({__name:"TopHeader",setup(e){const t=hd(),s=hs(),n=pi(),i=Po(),o=ot(()=>i.isTeamsEdition?"Add Personal Server":"Add Server"),r=ot(()=>{switch(s.routingMode){case"direct":return"Direct";case"code_execution":return"Code Exec";default:return"Retrieve"}}),a=X(""),l=X(!1),c=X(!1),u=ot(()=>{const y=s.listenAddr;if(!y)return[];const v=`http://${y}`,b=s.routingMode;return[{path:"/mcp",url:`${v}/mcp`,description:`Default endpoint (${b==="direct"?"direct":b==="code_execution"?"code execution":"retrieve tools"} mode)`,isDefault:!0,copyTooltip:"Copy URL"},{path:"/mcp/call",url:`${v}/mcp/call`,description:"Retrieve tools + call_tool_read/write/destructive",isDefault:!1,copyTooltip:"Copy URL"},{path:"/mcp/all",url:`${v}/mcp/all`,description:"Direct access to all tools (serverName__toolName)",isDefault:!1,copyTooltip:"Copy URL"},{path:"/mcp/code",url:`${v}/mcp/code`,description:"Code execution + retrieve_tools for discovery",isDefault:!1,copyTooltip:"Copy URL"}]});async function f(y){try{await navigator.clipboard.writeText(y.url),y.copyTooltip="Copied!",setTimeout(()=>{y.copyTooltip="Copy URL"},2e3)}catch(v){console.error("Failed to copy:",v),y.copyTooltip="Failed",setTimeout(()=>{y.copyTooltip="Copy URL"},2e3)}}function h(){a.value.trim()&&t.push({path:"/search",query:{q:a.value}})}function g(){n.fetchServers()}return(y,v)=>(x(),w("header",_y,[d("div",xy,[d("div",wy,[v[7]||(v[7]=d("label",{for:"sidebar-drawer",class:"btn btn-ghost btn-square lg:hidden"},[d("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})])],-1)),d("div",ky,[d("div",Sy,[Lt(d("input",{type:"text",placeholder:"Search tools, servers...",class:"input input-bordered w-full pr-3","onUpdate:modelValue":v[0]||(v[0]=b=>a.value=b),onKeydown:Gu(h,["enter"])},null,544),[[Oe,a.value]])]),d("button",{onClick:h,class:"btn btn-primary",disabled:!a.value.trim()},[...v[5]||(v[5]=[d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1),d("span",{class:"hidden sm:inline ml-2"},"Search",-1)])],8,Cy)]),d("button",{onClick:v[1]||(v[1]=b=>l.value=!0),class:"btn btn-primary"},[v[6]||(v[6]=d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1)),d("span",Ay,z(o.value),1)])]),d("div",Iy,[d("div",My,[d("div",{class:yt(["w-2 h-2 rounded-full",ct(s).isRunning?"bg-success animate-pulse":"bg-error"])},null,2),d("span",Ey,z(ct(n).serverCount.connected),1),v[8]||(v[8]=d("span",{class:"opacity-60"},"/",-1)),d("span",null,z(ct(n).serverCount.total),1),v[9]||(v[9]=d("span",{class:"text-xs opacity-60"},"Servers",-1))]),d("div",Ty,[d("span",Py,z(ct(n).totalTools),1),v[10]||(v[10]=d("span",{class:"text-xs opacity-60"},"Tools",-1))]),d("div",Oy,[v[11]||(v[11]=d("span",{class:"text-xs opacity-60"},"Mode:",-1)),d("span",Ry,z(r.value),1)]),ct(s).listenAddr?(x(),w("div",$y,[d("button",{onClick:v[2]||(v[2]=b=>c.value=!c.value),class:"flex items-center space-x-2 px-3 py-2 bg-base-200 rounded-lg cursor-pointer hover:bg-base-300 transition-colors"},[v[13]||(v[13]=d("span",{class:"text-xs font-medium opacity-60"},"MCP:",-1)),d("code",Ly,z(ct(s).listenAddr),1),(x(),w("svg",{class:yt(["w-3 h-3 opacity-60 transition-transform",{"rotate-180":c.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...v[12]||(v[12]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"},null,-1)])],2))]),c.value?(x(),w("div",Dy,[v[16]||(v[16]=d("div",{class:"text-xs font-semibold opacity-60 mb-2 px-1"},"MCP Endpoints",-1)),d("div",Fy,[(x(!0),w(wt,null,Vt(u.value,b=>(x(),w("div",{key:b.path,class:"flex items-center justify-between px-2 py-1.5 rounded hover:bg-base-200 group"},[d("div",Ny,[d("div",jy,[d("code",zy,z(b.url),1),b.isDefault?(x(),w("span",By,"default")):J("",!0)]),d("div",Hy,z(b.description),1)]),d("button",{onClick:mn(S=>f(b),["stop"]),class:"btn btn-ghost btn-xs p-1 opacity-0 group-hover:opacity-100 transition-opacity tooltip tooltip-left flex-shrink-0 ml-2","data-tip":b.copyTooltip},[b.copyTooltip==="Copied!"?(x(),w("svg",Uy,[...v[14]||(v[14]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"},null,-1)])])):(x(),w("svg",Vy,[...v[15]||(v[15]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])]))],8,Wy)]))),128))])])):J("",!0),c.value?(x(),w("div",{key:1,class:"fixed inset-0 z-40",onClick:v[3]||(v[3]=b=>c.value=!1)})):J("",!0)])):J("",!0)])]),ht(na,{show:l.value,onClose:v[4]||(v[4]=b=>l.value=!1),onAdded:g},null,8,["show"])]))}}),Ky={class:"toast toast-end z-50"},Yy={key:0,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Gy={key:1,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Zy={key:2,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Jy={key:3,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Xy={class:"flex-1"},Qy={class:"font-bold"},tb={key:0,class:"text-sm opacity-90"},eb=["onClick"],sb=ie({__name:"ToastContainer",setup(e){const t=hs();return(s,n)=>(x(),w("div",Ky,[ht(xp,{name:"toast",tag:"div"},{default:$t(()=>[(x(!0),w(wt,null,Vt(ct(t).toasts,i=>(x(),w("div",{key:i.id,class:yt([["alert",i.type==="success"?"alert-success":i.type==="error"?"alert-error":i.type==="warning"?"alert-warning":"alert-info"],"mb-2 shadow-lg"])},[i.type==="success"?(x(),w("svg",Yy,[...n[0]||(n[0]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"},null,-1)])])):i.type==="error"?(x(),w("svg",Gy,[...n[1]||(n[1]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"},null,-1)])])):i.type==="warning"?(x(),w("svg",Zy,[...n[2]||(n[2]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"},null,-1)])])):(x(),w("svg",Jy,[...n[3]||(n[3]=[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),d("div",Xy,[d("div",Qy,z(i.title),1),i.message?(x(),w("div",tb,z(i.message),1)):J("",!0)]),d("button",{onClick:o=>ct(t).removeToast(i.id),class:"btn btn-sm btn-ghost btn-circle"},[...n[4]||(n[4]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,eb)],2))),128))]),_:1})]))}}),nb=hi(sb,[["__scopeId","data-v-b6801221"]]),ib={key:0,class:"fixed bottom-4 left-4 alert alert-warning shadow-lg max-w-sm z-40"},ob=ie({__name:"ConnectionStatus",setup(e){const t=hs();return(s,n)=>ct(t).connected?J("",!0):(x(),w("div",ib,[...n[0]||(n[0]=[d("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})],-1),d("div",null,[d("h3",{class:"font-bold"},"Connection Lost"),d("div",{class:"text-xs"},"Reconnecting to server...")],-1)])]))}}),rb={key:0,class:"modal modal-open"},ab={class:"modal-box max-w-2xl"},lb={class:"form-control mb-6"},cb={class:"input-group"},ub=["disabled"],db={key:0,class:"loading loading-spinner loading-sm"},fb={key:0,class:"label"},hb={class:"label-text-alt text-error"},pb={class:"mb-6"},gb={class:"stats stats-vertical lg:stats-horizontal shadow"},mb={class:"stat"},vb={class:"stat-value text-sm font-mono"},yb={class:"stat-desc"},bb={class:"modal-action"},_b=ie({__name:"AuthErrorModal",props:{show:{type:Boolean},canClose:{type:Boolean,default:!1},lastError:{}},emits:["close","authenticated","refresh"],setup(e,{emit:t}){const s=e,n=t,i=X(""),o=X(""),r=X(!1),a=ot(()=>pt.hasAPIKey()?pt.getAPIKeyPreview():"none"),l=ot(()=>{var g,y;return pt.hasAPIKey()?(g=s.lastError)!=null&&g.includes("401")||(y=s.lastError)!=null&&y.includes("403")?"Invalid or expired":"Set but validation failed":"No API key set"});function c(){o.value=""}async function u(){if(!i.value.trim()){o.value="Please enter an API key";return}r.value=!0,o.value="";try{pt.setAPIKey(i.value.trim()),await pt.validateAPIKey()?(console.log("API key validation successful"),i.value="",n("authenticated")):o.value="Invalid API key - please check and try again"}catch(g){console.error("API key validation error:",g),o.value=g instanceof Error?g.message:"Validation failed"}finally{r.value=!1}}function f(){pt.reinitializeAPIKey(),n("refresh")}function h(){s.canClose&&n("close")}return fs(()=>{i.value="",o.value=""}),(g,y)=>g.show?(x(),w("div",rb,[d("div",ab,[y[4]||(y[4]=Ve('

πŸ”’ Authentication Required

The API key is invalid or missing. You need an API key to access the MCPProxy web interface.

How to get the API key:

  1. Using Tray: Right-click the MCPProxy tray icon and select "Open Web UI"
  2. From Logs: Check mcpproxy startup logs for the API key, then add ?apikey=YOUR_KEY to the URL
  3. Manual Entry: Enter your API key below if you have it
',2)),d("div",lb,[y[1]||(y[1]=d("label",{class:"label"},[d("span",{class:"label-text font-semibold"},"Enter API Key (optional)")],-1)),d("div",cb,[Lt(d("input",{"onUpdate:modelValue":y[0]||(y[0]=v=>i.value=v),type:"password",placeholder:"Enter your API key...",class:yt(["input input-bordered flex-1",{"input-error":o.value}]),onKeyup:Gu(u,["enter"]),onInput:c},null,34),[[Oe,i.value]]),d("button",{class:"btn btn-primary",disabled:!i.value.trim()||r.value,onClick:u},[r.value?(x(),w("span",db)):J("",!0),mt(" "+z(r.value?"Validating...":"Set Key"),1)],8,ub)]),o.value?(x(),w("div",fb,[d("span",hb,z(o.value),1)])):J("",!0)]),d("div",pb,[d("div",gb,[d("div",mb,[y[2]||(y[2]=d("div",{class:"stat-title"},"Current API Key",-1)),d("div",vb,z(a.value),1),d("div",yb,z(l.value),1)])])]),d("div",bb,[d("button",{class:"btn btn-ghost",onClick:f},[...y[3]||(y[3]=[d("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4 mr-2",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1),mt(" Refresh & Retry ",-1)])]),g.canClose?(x(),w("button",{key:0,class:"btn btn-outline",onClick:h}," Continue Without Auth ")):J("",!0)])]),y[5]||(y[5]=d("div",{class:"modal-backdrop bg-black bg-opacity-50"},null,-1))])):J("",!0)}}),xb=hi(_b,[["__scopeId","data-v-54026b07"]]),wb={id:"app",class:"drawer lg:drawer-open"},kb={class:"overflow-y-auto p-6"},Sb=ie({__name:"App",setup(e){const t=hs(),s=pi(),n=Po(),i=us({show:!1,canClose:!0,lastError:""});let o=null;function r(){i.show=!1,i.lastError=""}function a(){i.show=!1,i.lastError="",t.connectEventSource(),s.fetchServers()}function l(){i.show=!1,i.lastError="",t.connectEventSource(),s.fetchServers()}function c(u){console.log("Global auth error received:",u),i.lastError=u.error,i.show=!0}return fs(async()=>{await n.checkAuth(),o=pt.addEventListener(c),t.connectEventSource(),s.fetchServers(),t.fetchInfo(),t.fetchRouting()}),gn(()=>{t.disconnectEventSource(),o&&o()}),(u,f)=>{const h=ko("router-view");return x(),w("div",wb,[f[0]||(f[0]=d("input",{id:"sidebar-drawer",type:"checkbox",class:"drawer-toggle"},null,-1)),d("div",{class:yt(["drawer-content grid grid-rows-[auto_1fr] h-screen bg-base-200 transition-[padding] duration-200 ease-out",ct(t).sidebarCollapsed?"lg:pl-14":"lg:pl-64"])},[ht(qy),d("main",kb,[ht(h)])],2),ht(Nm),ht(nb),ht(ob),ht(xb,{show:i.show,"can-close":i.canClose,"last-error":i.lastError,onClose:r,onAuthenticated:a,onRefresh:l},null,8,["show","can-close","last-error"])])}}}),Cb="modulepreload",Ab=function(e){return"/ui/"+e},Ml={},Kt=function(t,s,n){let i=Promise.resolve();if(s&&s.length>0){document.getElementsByTagName("link");const r=document.querySelector("meta[property=csp-nonce]"),a=(r==null?void 0:r.nonce)||(r==null?void 0:r.getAttribute("nonce"));i=Promise.allSettled(s.map(l=>{if(l=Ab(l),l in Ml)return;Ml[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":Cb,c||(f.as="script"),f.crossOrigin="",f.href=l,a&&f.setAttribute("nonce",a),document.head.appendChild(f),c)return new Promise((h,g)=>{f.addEventListener("load",h),f.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${l}`)))})}))}function o(r){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=r,window.dispatchEvent(a),!a.defaultPrevented)throw r}return i.then(r=>{for(const a of r||[])a.status==="rejected"&&o(a.reason);return t().catch(o)})},Cr=X(null),pd=X(!0),Ar=X(!1),gd=X(0),Ir=X(0);let sn=null;async function no(){return sn||(sn=(async()=>{try{const e=await pt.getSecurityOverview(),t=(e==null?void 0:e.data)??{},s=t.scanners_enabled??t.scanners_installed??0;Cr.value=typeof s=="number"?s:0,pd.value=t.docker_available!==!1;const n=t.findings_by_severity??{};gd.value=typeof n.total=="number"?n.total:0,Ir.value=typeof t.total_scans=="number"?t.total_scans:0,Ar.value=!0}catch{}finally{sn=null}})(),sn)}function Ib(){return!Ar.value&&!sn&&no(),{enabledCount:Cr,dockerAvailable:pd,loaded:Ar,totalFindings:gd,totalScans:Ir,hasEnabledScanners:()=>(Cr.value??0)>0,hasAnyScans:()=>Ir.value>0,refresh:no}}const Mb={key:0,class:"hints-panel-wrapper"},Eb={class:"hints-title"},Tb={key:1,class:"hints-expanded"},Pb={class:"hints-content"},Ob={class:"hint-section-header"},Rb={class:"hint-icon"},$b={class:"hint-section-title"},Lb={key:0,class:"hint-description"},Db={key:0,class:"subsection-title"},Fb={key:1,class:"subsection-text"},Nb={key:2,class:"code-block-wrapper"},jb={class:"code-block-header"},zb={class:"code-language"},Bb=["onClick"],Hb={class:"code-block"},Wb={key:3,class:"simple-code"},Ub={key:4,class:"hint-list"},Vb=ie({__name:"CollapsibleHintsPanel",props:{hints:{},defaultExpanded:{type:Boolean,default:!1}},setup(e){const t=e,s=X(t.defaultExpanded),n=()=>{s.value=!s.value},i=()=>{if(t.hints.length===0)return"";const r=t.hints.map(f=>f.title).join(", "),a=[],l=t.hints.some(f=>f.title.toLowerCase().includes("llm")||f.title.toLowerCase().includes("agent")),c=t.hints.some(f=>f.title.toLowerCase().includes("cli")||f.title.toLowerCase().includes("command"));return t.hints.some(f=>f.title.toLowerCase().includes("manage")||f.title.toLowerCase().includes("add"))&&a.push("Manage Servers"),c&&a.push("CLI"),l&&a.push("LLM"),a.length>0?a.join(", "):r.split(",")[0]},o=async r=>{try{await navigator.clipboard.writeText(r)}catch(a){console.error("Failed to copy:",a)}};return(r,a)=>r.hints.length>0?(x(),w("div",Mb,[s.value?(x(),w("div",Tb,[d("div",{class:"hints-header",onClick:n},[...a[2]||(a[2]=[Ve('
πŸ’‘Hints
',2)])]),d("div",Pb,[(x(!0),w(wt,null,Vt(r.hints,(l,c)=>(x(),w("div",{key:c,class:"hint-section"},[d("div",Ob,[d("span",Rb,z(l.icon),1),d("h3",$b,z(l.title),1)]),l.description?(x(),w("p",Lb,z(l.description),1)):J("",!0),(x(!0),w(wt,null,Vt(l.sections,(u,f)=>(x(),w("div",{key:f,class:"hint-subsection"},[u.title?(x(),w("h4",Db,z(u.title),1)):J("",!0),u.text?(x(),w("p",Fb,z(u.text),1)):J("",!0),u.codeBlock?(x(),w("div",Nb,[d("div",jb,[d("span",zb,z(u.codeBlock.language||"bash"),1),d("button",{onClick:mn(h=>o(u.codeBlock.code),["stop"]),class:"copy-button",title:"Copy to clipboard"}," πŸ“‹ Copy ",8,Bb)]),d("pre",Hb,[d("code",null,z(u.codeBlock.code),1)])])):J("",!0),u.code?(x(),w("div",Wb,[d("pre",null,[d("code",null,z(u.code),1)])])):J("",!0),u.list?(x(),w("ul",Ub,[(x(!0),w(wt,null,Vt(u.list,(h,g)=>(x(),w("li",{key:g},z(h),1))),128))])):J("",!0)]))),128))]))),128))])])):(x(),w("div",{key:0,onClick:n,class:"hints-collapsed"},[a[0]||(a[0]=d("span",{class:"bulb-icon"},"πŸ’‘",-1)),d("span",Eb,"Hints: "+z(i()),1),a[1]||(a[1]=d("svg",{class:"expand-icon",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 9l-7 7-7-7"})],-1))]))])):J("",!0)}}),qb=hi(Vb,[["__scopeId","data-v-22065a6e"]]),Kb={key:0,class:"alert alert-info"},El="telemetry-banner-dismissed",Yb=ie({__name:"TelemetryBanner",setup(e){const t=X(!1);fs(()=>{t.value=!localStorage.getItem(El)});function s(){t.value=!1,localStorage.setItem(El,"true")}return(n,i)=>t.value?(x(),w("div",Kb,[i[1]||(i[1]=d("svg",{class:"w-6 h-6 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),i[2]||(i[2]=d("div",{class:"flex-1"},[d("span",null,"MCPProxy sends anonymous usage statistics to help improve the product. No personal data is collected. "),d("a",{href:"https://mcpproxy.app/telemetry",target:"_blank",rel:"noopener noreferrer",class:"link link-hover underline"},"Learn more")],-1)),d("button",{class:"btn btn-sm btn-ghost",onClick:s,"aria-label":"Dismiss"},[...i[0]||(i[0]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])])):J("",!0)}});/*! - * @kurkle/color v0.3.4 - * https://github.com/kurkle/color#readme - * (c) 2024 Jukka Kurkela - * Released under the MIT License - */function gi(e){return e+.5|0}const Ss=(e,t,s)=>Math.max(Math.min(e,s),t);function En(e){return Ss(gi(e*2.55),0,255)}function Is(e){return Ss(gi(e*255),0,255)}function ts(e){return Ss(gi(e/2.55)/100,0,1)}function Tl(e){return Ss(gi(e*100),0,100)}const Ae={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Mr=[..."0123456789ABCDEF"],Gb=e=>Mr[e&15],Zb=e=>Mr[(e&240)>>4]+Mr[e&15],ki=e=>(e&240)>>4===(e&15),Jb=e=>ki(e.r)&&ki(e.g)&&ki(e.b)&&ki(e.a);function Xb(e){var t=e.length,s;return e[0]==="#"&&(t===4||t===5?s={r:255&Ae[e[1]]*17,g:255&Ae[e[2]]*17,b:255&Ae[e[3]]*17,a:t===5?Ae[e[4]]*17:255}:(t===7||t===9)&&(s={r:Ae[e[1]]<<4|Ae[e[2]],g:Ae[e[3]]<<4|Ae[e[4]],b:Ae[e[5]]<<4|Ae[e[6]],a:t===9?Ae[e[7]]<<4|Ae[e[8]]:255})),s}const Qb=(e,t)=>e<255?t(e):"";function t0(e){var t=Jb(e)?Gb:Zb;return e?"#"+t(e.r)+t(e.g)+t(e.b)+Qb(e.a,t):void 0}const e0=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function md(e,t,s){const n=t*Math.min(s,1-s),i=(o,r=(o+e/30)%12)=>s-n*Math.max(Math.min(r-3,9-r,1),-1);return[i(0),i(8),i(4)]}function s0(e,t,s){const n=(i,o=(i+e/60)%6)=>s-s*t*Math.max(Math.min(o,4-o,1),0);return[n(5),n(3),n(1)]}function n0(e,t,s){const n=md(e,1,.5);let i;for(t+s>1&&(i=1/(t+s),t*=i,s*=i),i=0;i<3;i++)n[i]*=1-t-s,n[i]+=t;return n}function i0(e,t,s,n,i){return e===i?(t-s)/n+(t.5?u/(2-o-r):u/(o+r),l=i0(s,n,i,u,o),l=l*60+.5),[l|0,c||0,a]}function oa(e,t,s,n){return(Array.isArray(t)?e(t[0],t[1],t[2]):e(t,s,n)).map(Is)}function ra(e,t,s){return oa(md,e,t,s)}function o0(e,t,s){return oa(n0,e,t,s)}function r0(e,t,s){return oa(s0,e,t,s)}function vd(e){return(e%360+360)%360}function a0(e){const t=e0.exec(e);let s=255,n;if(!t)return;t[5]!==n&&(s=t[6]?En(+t[5]):Is(+t[5]));const i=vd(+t[2]),o=+t[3]/100,r=+t[4]/100;return t[1]==="hwb"?n=o0(i,o,r):t[1]==="hsv"?n=r0(i,o,r):n=ra(i,o,r),{r:n[0],g:n[1],b:n[2],a:s}}function l0(e,t){var s=ia(e);s[0]=vd(s[0]+t),s=ra(s),e.r=s[0],e.g=s[1],e.b=s[2]}function c0(e){if(!e)return;const t=ia(e),s=t[0],n=Tl(t[1]),i=Tl(t[2]);return e.a<255?`hsla(${s}, ${n}%, ${i}%, ${ts(e.a)})`:`hsl(${s}, ${n}%, ${i}%)`}const Pl={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},Ol={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function u0(){const e={},t=Object.keys(Ol),s=Object.keys(Pl);let n,i,o,r,a;for(n=0;n>16&255,o>>8&255,o&255]}return e}let Si;function d0(e){Si||(Si=u0(),Si.transparent=[0,0,0,0]);const t=Si[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}const f0=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function h0(e){const t=f0.exec(e);let s=255,n,i,o;if(t){if(t[7]!==n){const r=+t[7];s=t[8]?En(r):Ss(r*255,0,255)}return n=+t[1],i=+t[3],o=+t[5],n=255&(t[2]?En(n):Ss(n,0,255)),i=255&(t[4]?En(i):Ss(i,0,255)),o=255&(t[6]?En(o):Ss(o,0,255)),{r:n,g:i,b:o,a:s}}}function p0(e){return e&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${ts(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`)}const Xo=e=>e<=.0031308?e*12.92:Math.pow(e,1/2.4)*1.055-.055,Zs=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);function g0(e,t,s){const n=Zs(ts(e.r)),i=Zs(ts(e.g)),o=Zs(ts(e.b));return{r:Is(Xo(n+s*(Zs(ts(t.r))-n))),g:Is(Xo(i+s*(Zs(ts(t.g))-i))),b:Is(Xo(o+s*(Zs(ts(t.b))-o))),a:e.a+s*(t.a-e.a)}}function Ci(e,t,s){if(e){let n=ia(e);n[t]=Math.max(0,Math.min(n[t]+n[t]*s,t===0?360:1)),n=ra(n),e.r=n[0],e.g=n[1],e.b=n[2]}}function yd(e,t){return e&&Object.assign(t||{},e)}function Rl(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=Is(e[3]))):(t=yd(e,{r:0,g:0,b:0,a:1}),t.a=Is(t.a)),t}function m0(e){return e.charAt(0)==="r"?h0(e):a0(e)}class ni{constructor(t){if(t instanceof ni)return t;const s=typeof t;let n;s==="object"?n=Rl(t):s==="string"&&(n=Xb(t)||d0(t)||m0(t)),this._rgb=n,this._valid=!!n}get valid(){return this._valid}get rgb(){var t=yd(this._rgb);return t&&(t.a=ts(t.a)),t}set rgb(t){this._rgb=Rl(t)}rgbString(){return this._valid?p0(this._rgb):void 0}hexString(){return this._valid?t0(this._rgb):void 0}hslString(){return this._valid?c0(this._rgb):void 0}mix(t,s){if(t){const n=this.rgb,i=t.rgb;let o;const r=s===o?.5:s,a=2*r-1,l=n.a-i.a,c=((a*l===-1?a:(a+l)/(1+a*l))+1)/2;o=1-c,n.r=255&c*n.r+o*i.r+.5,n.g=255&c*n.g+o*i.g+.5,n.b=255&c*n.b+o*i.b+.5,n.a=r*n.a+(1-r)*i.a,this.rgb=n}return this}interpolate(t,s){return t&&(this._rgb=g0(this._rgb,t._rgb,s)),this}clone(){return new ni(this.rgb)}alpha(t){return this._rgb.a=Is(t),this}clearer(t){const s=this._rgb;return s.a*=1-t,this}greyscale(){const t=this._rgb,s=gi(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=s,this}opaquer(t){const s=this._rgb;return s.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Ci(this._rgb,2,t),this}darken(t){return Ci(this._rgb,2,-t),this}saturate(t){return Ci(this._rgb,1,t),this}desaturate(t){return Ci(this._rgb,1,-t),this}rotate(t){return l0(this._rgb,t),this}}/*! - * Chart.js v4.5.0 - * https://www.chartjs.org - * (c) 2025 Chart.js Contributors - * Released under the MIT License - */function Ze(){}const v0=(()=>{let e=0;return()=>e++})();function de(e){return e==null}function ne(e){if(Array.isArray&&Array.isArray(e))return!0;const t=Object.prototype.toString.call(e);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function Tt(e){return e!==null&&Object.prototype.toString.call(e)==="[object Object]"}function cs(e){return(typeof e=="number"||e instanceof Number)&&isFinite(+e)}function Ne(e,t){return cs(e)?e:t}function Ft(e,t){return typeof e>"u"?t:e}const y0=(e,t)=>typeof e=="string"&&e.endsWith("%")?parseFloat(e)/100:+e/t,bd=(e,t)=>typeof e=="string"&&e.endsWith("%")?parseFloat(e)/100*t:+e;function Ut(e,t,s){if(e&&typeof e.call=="function")return e.apply(s,t)}function Dt(e,t,s,n){let i,o,r;if(ne(e))for(o=e.length,i=0;ie,x:e=>e.x,y:e=>e.y};function x0(e){const t=e.split("."),s=[];let n="";for(const i of t)n+=i,n.endsWith("\\")?n=n.slice(0,-1)+".":(s.push(n),n="");return s}function w0(e){const t=x0(e);return s=>{for(const n of t){if(n==="")break;s=s&&s[n]}return s}}function oi(e,t){return($l[t]||($l[t]=w0(t)))(e)}function aa(e){return e.charAt(0).toUpperCase()+e.slice(1)}const ro=e=>typeof e<"u",Ts=e=>typeof e=="function",Ll=(e,t)=>{if(e.size!==t.size)return!1;for(const s of e)if(!t.has(s))return!1;return!0};function k0(e){return e.type==="mouseup"||e.type==="click"||e.type==="contextmenu"}const qt=Math.PI,Jt=2*qt,ao=Number.POSITIVE_INFINITY,S0=qt/180,Xt=qt/2,Ls=qt/4,Dl=qt*2/3,Fl=Math.sign;function C0(e){const t=[],s=Math.sqrt(e);let n;for(n=1;ni-o).pop(),t}function A0(e){return typeof e=="symbol"||typeof e=="object"&&e!==null&&!(Symbol.toPrimitive in e||"toString"in e||"valueOf"in e)}function lo(e){return!A0(e)&&!isNaN(parseFloat(e))&&isFinite(e)}function Bs(e){return e*(qt/180)}function I0(e){return e*(180/qt)}function xd(e,t){const s=t.x-e.x,n=t.y-e.y,i=Math.sqrt(s*s+n*n);let o=Math.atan2(n,s);return o<-.5*qt&&(o+=Jt),{angle:o,distance:i}}function M0(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function We(e){return(e%Jt+Jt)%Jt}function co(e,t,s,n){const i=We(e),o=We(t),r=We(s),a=We(o-i),l=We(r-i),c=We(i-o),u=We(i-r);return i===o||i===r||n&&o===r||a>l&&c=Math.min(t,s)-n&&e<=Math.max(t,s)+n}function la(e,t,s){s=s||(r=>e[r]1;)o=i+n>>1,s(o)?i=o:n=o;return{lo:i,hi:n}}const Er=(e,t,s,n)=>la(e,s,n?i=>{const o=e[i][t];return oe[i][t]la(e,s,n=>e[n][t]>=s);function P0(e,t,s){let n=0,i=e.length;for(;nn&&e[i-1]>s;)i--;return n>0||i{const n="_onData"+aa(s),i=e[s];Object.defineProperty(e,s,{configurable:!0,enumerable:!1,value(...o){const r=i.apply(this,o);return e._chartjs.listeners.forEach(a=>{typeof a[n]=="function"&&a[n](...o)}),r}})})}function Nl(e,t){const s=e._chartjs;if(!s)return;const n=s.listeners,i=n.indexOf(t);i!==-1&&n.splice(i,1),!(n.length>0)&&(wd.forEach(o=>{delete e[o]}),delete e._chartjs)}function R0(e){const t=new Set(e);return t.size===e.length?e:Array.from(t)}const kd=function(){return typeof window>"u"?function(e){return e()}:window.requestAnimationFrame}();function Sd(e,t){let s=[],n=!1;return function(...i){s=i,n||(n=!0,kd.call(window,()=>{n=!1,e.apply(t,s)}))}}function $0(e,t){let s;return function(...n){return t?(clearTimeout(s),s=setTimeout(e,t,n)):e.apply(this,n),t}}const Cd=e=>e==="start"?"left":e==="end"?"right":"center",we=(e,t,s)=>e==="start"?t:e==="end"?s:(t+s)/2,L0=(e,t,s,n)=>e===(n?"left":"right")?s:e==="center"?(t+s)/2:t,Ai=e=>e===0||e===1,jl=(e,t,s)=>-(Math.pow(2,10*(e-=1))*Math.sin((e-t)*Jt/s)),zl=(e,t,s)=>Math.pow(2,-10*e)*Math.sin((e-t)*Jt/s)+1,qn={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>(e-=1)*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-((e-=1)*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>(e-=1)*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>-Math.cos(e*Xt)+1,easeOutSine:e=>Math.sin(e*Xt),easeInOutSine:e=>-.5*(Math.cos(qt*e)-1),easeInExpo:e=>e===0?0:Math.pow(2,10*(e-1)),easeOutExpo:e=>e===1?1:-Math.pow(2,-10*e)+1,easeInOutExpo:e=>Ai(e)?e:e<.5?.5*Math.pow(2,10*(e*2-1)):.5*(-Math.pow(2,-10*(e*2-1))+2),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1-(e-=1)*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>Ai(e)?e:jl(e,.075,.3),easeOutElastic:e=>Ai(e)?e:zl(e,.075,.3),easeInOutElastic(e){return Ai(e)?e:e<.5?.5*jl(e*2,.1125,.45):.5+.5*zl(e*2-1,.1125,.45)},easeInBack(e){return e*e*((1.70158+1)*e-1.70158)},easeOutBack(e){return(e-=1)*e*((1.70158+1)*e+1.70158)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?.5*(e*e*(((t*=1.525)+1)*e-t)):.5*((e-=2)*e*(((t*=1.525)+1)*e+t)+2)},easeInBounce:e=>1-qn.easeOutBounce(1-e),easeOutBounce(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},easeInOutBounce:e=>e<.5?qn.easeInBounce(e*2)*.5:qn.easeOutBounce(e*2-1)*.5+.5};function Ad(e){if(e&&typeof e=="object"){const t=e.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function Bl(e){return Ad(e)?e:new ni(e)}function Qo(e){return Ad(e)?e:new ni(e).saturate(.5).darken(.1).hexString()}const D0=["x","y","borderWidth","radius","tension"],F0=["color","borderColor","backgroundColor"];function N0(e){e.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>t!=="onProgress"&&t!=="onComplete"&&t!=="fn"}),e.set("animations",{colors:{type:"color",properties:F0},numbers:{type:"number",properties:D0}}),e.describe("animations",{_fallback:"animation"}),e.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>t|0}}}})}function j0(e){e.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const Hl=new Map;function z0(e,t){t=t||{};const s=e+JSON.stringify(t);let n=Hl.get(s);return n||(n=new Intl.NumberFormat(e,t),Hl.set(s,n)),n}function B0(e,t,s){return z0(t,s).format(e)}const H0={values(e){return ne(e)?e:""+e}};var W0={formatters:H0};function U0(e){e.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,s)=>s.lineWidth,tickColor:(t,s)=>s.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:W0.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),e.route("scale.ticks","color","","color"),e.route("scale.grid","color","","borderColor"),e.route("scale.border","color","","borderColor"),e.route("scale.title","color","","color"),e.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&t!=="callback"&&t!=="parser",_indexable:t=>t!=="borderDash"&&t!=="tickBorderDash"&&t!=="dash"}),e.describe("scales",{_fallback:"scale"}),e.describe("scale.ticks",{_scriptable:t=>t!=="backdropPadding"&&t!=="callback",_indexable:t=>t!=="backdropPadding"})}const Ks=Object.create(null),Tr=Object.create(null);function Kn(e,t){if(!t)return e;const s=t.split(".");for(let n=0,i=s.length;nn.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(n,i)=>Qo(i.backgroundColor),this.hoverBorderColor=(n,i)=>Qo(i.borderColor),this.hoverColor=(n,i)=>Qo(i.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(s)}set(t,s){return tr(this,t,s)}get(t){return Kn(this,t)}describe(t,s){return tr(Tr,t,s)}override(t,s){return tr(Ks,t,s)}route(t,s,n,i){const o=Kn(this,t),r=Kn(this,n),a="_"+s;Object.defineProperties(o,{[a]:{value:o[s],writable:!0},[s]:{enumerable:!0,get(){const l=this[a],c=r[i];return Tt(l)?Object.assign({},c,l):Ft(l,c)},set(l){this[a]=l}}})}apply(t){t.forEach(s=>s(this))}}var Yt=new V0({_scriptable:e=>!e.startsWith("on"),_indexable:e=>e!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[N0,j0,U0]);function q0(e){return!e||de(e.size)||de(e.family)?null:(e.style?e.style+" ":"")+(e.weight?e.weight+" ":"")+e.size+"px "+e.family}function Wl(e,t,s,n,i){let o=t[i];return o||(o=t[i]=e.measureText(i).width,s.push(i)),o>n&&(n=o),n}function Ds(e,t,s){const n=e.currentDevicePixelRatio,i=s!==0?Math.max(s/2,.5):0;return Math.round((t-i)*n)/n+i}function Ul(e,t){!t&&!e||(t=t||e.getContext("2d"),t.save(),t.resetTransform(),t.clearRect(0,0,e.width,e.height),t.restore())}function Vl(e,t,s,n){Id(e,t,s,n,null)}function Id(e,t,s,n,i){let o,r,a,l,c,u,f,h;const g=t.pointStyle,y=t.rotation,v=t.radius;let b=(y||0)*S0;if(g&&typeof g=="object"&&(o=g.toString(),o==="[object HTMLImageElement]"||o==="[object HTMLCanvasElement]")){e.save(),e.translate(s,n),e.rotate(b),e.drawImage(g,-g.width/2,-g.height/2,g.width,g.height),e.restore();return}if(!(isNaN(v)||v<=0)){switch(e.beginPath(),g){default:i?e.ellipse(s,n,i/2,v,0,0,Jt):e.arc(s,n,v,0,Jt),e.closePath();break;case"triangle":u=i?i/2:v,e.moveTo(s+Math.sin(b)*u,n-Math.cos(b)*v),b+=Dl,e.lineTo(s+Math.sin(b)*u,n-Math.cos(b)*v),b+=Dl,e.lineTo(s+Math.sin(b)*u,n-Math.cos(b)*v),e.closePath();break;case"rectRounded":c=v*.516,l=v-c,r=Math.cos(b+Ls)*l,f=Math.cos(b+Ls)*(i?i/2-c:l),a=Math.sin(b+Ls)*l,h=Math.sin(b+Ls)*(i?i/2-c:l),e.arc(s-f,n-a,c,b-qt,b-Xt),e.arc(s+h,n-r,c,b-Xt,b),e.arc(s+f,n+a,c,b,b+Xt),e.arc(s-h,n+r,c,b+Xt,b+qt),e.closePath();break;case"rect":if(!y){l=Math.SQRT1_2*v,u=i?i/2:l,e.rect(s-u,n-l,2*u,2*l);break}b+=Ls;case"rectRot":f=Math.cos(b)*(i?i/2:v),r=Math.cos(b)*v,a=Math.sin(b)*v,h=Math.sin(b)*(i?i/2:v),e.moveTo(s-f,n-a),e.lineTo(s+h,n-r),e.lineTo(s+f,n+a),e.lineTo(s-h,n+r),e.closePath();break;case"crossRot":b+=Ls;case"cross":f=Math.cos(b)*(i?i/2:v),r=Math.cos(b)*v,a=Math.sin(b)*v,h=Math.sin(b)*(i?i/2:v),e.moveTo(s-f,n-a),e.lineTo(s+f,n+a),e.moveTo(s+h,n-r),e.lineTo(s-h,n+r);break;case"star":f=Math.cos(b)*(i?i/2:v),r=Math.cos(b)*v,a=Math.sin(b)*v,h=Math.sin(b)*(i?i/2:v),e.moveTo(s-f,n-a),e.lineTo(s+f,n+a),e.moveTo(s+h,n-r),e.lineTo(s-h,n+r),b+=Ls,f=Math.cos(b)*(i?i/2:v),r=Math.cos(b)*v,a=Math.sin(b)*v,h=Math.sin(b)*(i?i/2:v),e.moveTo(s-f,n-a),e.lineTo(s+f,n+a),e.moveTo(s+h,n-r),e.lineTo(s-h,n+r);break;case"line":r=i?i/2:Math.cos(b)*v,a=Math.sin(b)*v,e.moveTo(s-r,n-a),e.lineTo(s+r,n+a);break;case"dash":e.moveTo(s,n),e.lineTo(s+Math.cos(b)*(i?i/2:v),n+Math.sin(b)*v);break;case!1:e.closePath();break}e.fill(),t.borderWidth>0&&e.stroke()}}function Md(e,t,s){return s=s||.5,!t||e&&e.x>t.left-s&&e.xt.top-s&&e.y0&&o.strokeColor!=="";let l,c;for(e.save(),e.font=i.string,K0(e,o),l=0;l+e||0;function da(e,t){const s={},n=Tt(t),i=n?Object.keys(t):t,o=Tt(e)?n?r=>Ft(e[r],e[t[r]]):r=>e[r]:()=>e;for(const r of i)s[r]=Q0(o(r));return s}function t1(e){return da(e,{top:"y",right:"x",bottom:"y",left:"x"})}function Yn(e){return da(e,["topLeft","topRight","bottomLeft","bottomRight"])}function De(e){const t=t1(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function be(e,t){e=e||{},t=t||Yt.font;let s=Ft(e.size,t.size);typeof s=="string"&&(s=parseInt(s,10));let n=Ft(e.style,t.style);n&&!(""+n).match(J0)&&(console.warn('Invalid font style specified: "'+n+'"'),n=void 0);const i={family:Ft(e.family,t.family),lineHeight:X0(Ft(e.lineHeight,t.lineHeight),s),size:s,style:n,weight:Ft(e.weight,t.weight),string:""};return i.string=q0(i),i}function Ii(e,t,s,n){let i,o,r;for(i=0,o=e.length;is&&a===0?0:a+l;return{min:r(n,-Math.abs(o)),max:r(i,o)}}function vn(e,t){return Object.assign(Object.create(e),t)}function fa(e,t=[""],s,n,i=()=>e[0]){const o=s||e;typeof n>"u"&&(n=Od("_fallback",e));const r={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:e,_rootScopes:o,_fallback:n,_getTarget:i,override:a=>fa([a,...e],t,o,n)};return new Proxy(r,{deleteProperty(a,l){return delete a[l],delete a._keys,delete e[0][l],!0},get(a,l){return Td(a,l,()=>c1(l,t,e,a))},getOwnPropertyDescriptor(a,l){return Reflect.getOwnPropertyDescriptor(a._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(e[0])},has(a,l){return Kl(a).includes(l)},ownKeys(a){return Kl(a)},set(a,l,c){const u=a._storage||(a._storage=i());return a[l]=u[l]=c,delete a._keys,!0}})}function hn(e,t,s,n){const i={_cacheable:!1,_proxy:e,_context:t,_subProxy:s,_stack:new Set,_descriptors:Ed(e,n),setContext:o=>hn(e,o,s,n),override:o=>hn(e.override(o),t,s,n)};return new Proxy(i,{deleteProperty(o,r){return delete o[r],delete e[r],!0},get(o,r,a){return Td(o,r,()=>n1(o,r,a))},getOwnPropertyDescriptor(o,r){return o._descriptors.allKeys?Reflect.has(e,r)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,r)},getPrototypeOf(){return Reflect.getPrototypeOf(e)},has(o,r){return Reflect.has(e,r)},ownKeys(){return Reflect.ownKeys(e)},set(o,r,a){return e[r]=a,delete o[r],!0}})}function Ed(e,t={scriptable:!0,indexable:!0}){const{_scriptable:s=t.scriptable,_indexable:n=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:s,indexable:n,isScriptable:Ts(s)?s:()=>s,isIndexable:Ts(n)?n:()=>n}}const s1=(e,t)=>e?e+aa(t):t,ha=(e,t)=>Tt(t)&&e!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Td(e,t,s){if(Object.prototype.hasOwnProperty.call(e,t)||t==="constructor")return e[t];const n=s();return e[t]=n,n}function n1(e,t,s){const{_proxy:n,_context:i,_subProxy:o,_descriptors:r}=e;let a=n[t];return Ts(a)&&r.isScriptable(t)&&(a=i1(t,a,e,s)),ne(a)&&a.length&&(a=o1(t,a,e,r.isIndexable)),ha(t,a)&&(a=hn(a,i,o&&o[t],r)),a}function i1(e,t,s,n){const{_proxy:i,_context:o,_subProxy:r,_stack:a}=s;if(a.has(e))throw new Error("Recursion detected: "+Array.from(a).join("->")+"->"+e);a.add(e);let l=t(o,r||n);return a.delete(e),ha(e,l)&&(l=pa(i._scopes,i,e,l)),l}function o1(e,t,s,n){const{_proxy:i,_context:o,_subProxy:r,_descriptors:a}=s;if(typeof o.index<"u"&&n(e))return t[o.index%t.length];if(Tt(t[0])){const l=t,c=i._scopes.filter(u=>u!==l);t=[];for(const u of l){const f=pa(c,i,e,u);t.push(hn(f,o,r&&r[e],a))}}return t}function Pd(e,t,s){return Ts(e)?e(t,s):e}const r1=(e,t)=>e===!0?t:typeof e=="string"?oi(t,e):void 0;function a1(e,t,s,n,i){for(const o of t){const r=r1(s,o);if(r){e.add(r);const a=Pd(r._fallback,s,i);if(typeof a<"u"&&a!==s&&a!==n)return a}else if(r===!1&&typeof n<"u"&&s!==n)return null}return!1}function pa(e,t,s,n){const i=t._rootScopes,o=Pd(t._fallback,s,n),r=[...e,...i],a=new Set;a.add(n);let l=ql(a,r,s,o||s,n);return l===null||typeof o<"u"&&o!==s&&(l=ql(a,r,o,l,n),l===null)?!1:fa(Array.from(a),[""],i,o,()=>l1(t,s,n))}function ql(e,t,s,n,i){for(;s;)s=a1(e,t,s,n,i);return s}function l1(e,t,s){const n=e._getTarget();t in n||(n[t]={});const i=n[t];return ne(i)&&Tt(s)?s:i||{}}function c1(e,t,s,n){let i;for(const o of t)if(i=Od(s1(o,e),s),typeof i<"u")return ha(e,i)?pa(s,n,e,i):i}function Od(e,t){for(const s of t){if(!s)continue;const n=s[e];if(typeof n<"u")return n}}function Kl(e){let t=e._keys;return t||(t=e._keys=u1(e._scopes)),t}function u1(e){const t=new Set;for(const s of e)for(const n of Object.keys(s).filter(i=>!i.startsWith("_")))t.add(n);return Array.from(t)}function ga(){return typeof window<"u"&&typeof document<"u"}function ma(e){let t=e.parentNode;return t&&t.toString()==="[object ShadowRoot]"&&(t=t.host),t}function fo(e,t,s){let n;return typeof e=="string"?(n=parseInt(e,10),e.indexOf("%")!==-1&&(n=n/100*t.parentNode[s])):n=e,n}const Oo=e=>e.ownerDocument.defaultView.getComputedStyle(e,null);function d1(e,t){return Oo(e).getPropertyValue(t)}const f1=["top","right","bottom","left"];function Us(e,t,s){const n={};s=s?"-"+s:"";for(let i=0;i<4;i++){const o=f1[i];n[o]=parseFloat(e[t+"-"+o+s])||0}return n.width=n.left+n.right,n.height=n.top+n.bottom,n}const h1=(e,t,s)=>(e>0||t>0)&&(!s||!s.shadowRoot);function p1(e,t){const s=e.touches,n=s&&s.length?s[0]:e,{offsetX:i,offsetY:o}=n;let r=!1,a,l;if(h1(i,o,e.target))a=i,l=o;else{const c=t.getBoundingClientRect();a=n.clientX-c.left,l=n.clientY-c.top,r=!0}return{x:a,y:l,box:r}}function zs(e,t){if("native"in e)return e;const{canvas:s,currentDevicePixelRatio:n}=t,i=Oo(s),o=i.boxSizing==="border-box",r=Us(i,"padding"),a=Us(i,"border","width"),{x:l,y:c,box:u}=p1(e,s),f=r.left+(u&&a.left),h=r.top+(u&&a.top);let{width:g,height:y}=t;return o&&(g-=r.width+a.width,y-=r.height+a.height),{x:Math.round((l-f)/g*s.width/n),y:Math.round((c-h)/y*s.height/n)}}function g1(e,t,s){let n,i;if(t===void 0||s===void 0){const o=e&&ma(e);if(!o)t=e.clientWidth,s=e.clientHeight;else{const r=o.getBoundingClientRect(),a=Oo(o),l=Us(a,"border","width"),c=Us(a,"padding");t=r.width-c.width-l.width,s=r.height-c.height-l.height,n=fo(a.maxWidth,o,"clientWidth"),i=fo(a.maxHeight,o,"clientHeight")}}return{width:t,height:s,maxWidth:n||ao,maxHeight:i||ao}}const Mi=e=>Math.round(e*10)/10;function m1(e,t,s,n){const i=Oo(e),o=Us(i,"margin"),r=fo(i.maxWidth,e,"clientWidth")||ao,a=fo(i.maxHeight,e,"clientHeight")||ao,l=g1(e,t,s);let{width:c,height:u}=l;if(i.boxSizing==="content-box"){const h=Us(i,"border","width"),g=Us(i,"padding");c-=g.width+h.width,u-=g.height+h.height}return c=Math.max(0,c-o.width),u=Math.max(0,n?c/n:u-o.height),c=Mi(Math.min(c,r,l.maxWidth)),u=Mi(Math.min(u,a,l.maxHeight)),c&&!u&&(u=Mi(c/2)),(t!==void 0||s!==void 0)&&n&&l.height&&u>l.height&&(u=l.height,c=Mi(Math.floor(u*n))),{width:c,height:u}}function Yl(e,t,s){const n=t||1,i=Math.floor(e.height*n),o=Math.floor(e.width*n);e.height=Math.floor(e.height),e.width=Math.floor(e.width);const r=e.canvas;return r.style&&(s||!r.style.height&&!r.style.width)&&(r.style.height=`${e.height}px`,r.style.width=`${e.width}px`),e.currentDevicePixelRatio!==n||r.height!==i||r.width!==o?(e.currentDevicePixelRatio=n,r.height=i,r.width=o,e.ctx.setTransform(n,0,0,n,0,0),!0):!1}const v1=function(){let e=!1;try{const t={get passive(){return e=!0,!1}};ga()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch{}return e}();function Gl(e,t){const s=d1(e,t),n=s&&s.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}const y1=function(e,t){return{x(s){return e+e+t-s},setWidth(s){t=s},textAlign(s){return s==="center"?s:s==="right"?"left":"right"},xPlus(s,n){return s-n},leftForLtr(s,n){return s-n}}},b1=function(){return{x(e){return e},setWidth(e){},textAlign(e){return e},xPlus(e,t){return e+t},leftForLtr(e,t){return e}}};function an(e,t,s){return e?y1(t,s):b1()}function Rd(e,t){let s,n;(t==="ltr"||t==="rtl")&&(s=e.canvas.style,n=[s.getPropertyValue("direction"),s.getPropertyPriority("direction")],s.setProperty("direction",t,"important"),e.prevTextDirection=n)}function $d(e,t){t!==void 0&&(delete e.prevTextDirection,e.canvas.style.setProperty("direction",t[0],t[1]))}function Ei(e,t,s){return e.options.clip?e[s]:t[s]}function _1(e,t){const{xScale:s,yScale:n}=e;return s&&n?{left:Ei(s,t,"left"),right:Ei(s,t,"right"),top:Ei(n,t,"top"),bottom:Ei(n,t,"bottom")}:t}function x1(e,t){const s=t._clip;if(s.disabled)return!1;const n=_1(t,e.chartArea);return{left:s.left===!1?0:n.left-(s.left===!0?0:s.left),right:s.right===!1?e.width:n.right+(s.right===!0?0:s.right),top:s.top===!1?0:n.top-(s.top===!0?0:s.top),bottom:s.bottom===!1?e.height:n.bottom+(s.bottom===!0?0:s.bottom)}}/*! - * Chart.js v4.5.0 - * https://www.chartjs.org - * (c) 2025 Chart.js Contributors - * Released under the MIT License - */class w1{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,s,n,i){const o=s.listeners[i],r=s.duration;o.forEach(a=>a({chart:t,initial:s.initial,numSteps:r,currentStep:Math.min(n-s.start,r)}))}_refresh(){this._request||(this._running=!0,this._request=kd.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let s=0;this._charts.forEach((n,i)=>{if(!n.running||!n.items.length)return;const o=n.items;let r=o.length-1,a=!1,l;for(;r>=0;--r)l=o[r],l._active?(l._total>n.duration&&(n.duration=l._total),l.tick(t),a=!0):(o[r]=o[o.length-1],o.pop());a&&(i.draw(),this._notify(i,n,t,"progress")),o.length||(n.running=!1,this._notify(i,n,t,"complete"),n.initial=!1),s+=o.length}),this._lastDate=t,s===0&&(this._running=!1)}_getAnims(t){const s=this._charts;let n=s.get(t);return n||(n={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},s.set(t,n)),n}listen(t,s,n){this._getAnims(t).listeners[s].push(n)}add(t,s){!s||!s.length||this._getAnims(t).items.push(...s)}has(t){return this._getAnims(t).items.length>0}start(t){const s=this._charts.get(t);s&&(s.running=!0,s.start=Date.now(),s.duration=s.items.reduce((n,i)=>Math.max(n,i._duration),0),this._refresh())}running(t){if(!this._running)return!1;const s=this._charts.get(t);return!(!s||!s.running||!s.items.length)}stop(t){const s=this._charts.get(t);if(!s||!s.items.length)return;const n=s.items;let i=n.length-1;for(;i>=0;--i)n[i].cancel();s.items=[],this._notify(t,s,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var Je=new w1;const Zl="transparent",k1={boolean(e,t,s){return s>.5?t:e},color(e,t,s){const n=Bl(e||Zl),i=n.valid&&Bl(t||Zl);return i&&i.valid?i.mix(n,s).hexString():t},number(e,t,s){return e+(t-e)*s}};class S1{constructor(t,s,n,i){const o=s[n];i=Ii([t.to,i,o,t.from]);const r=Ii([t.from,o,i]);this._active=!0,this._fn=t.fn||k1[t.type||typeof r],this._easing=qn[t.easing]||qn.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=s,this._prop=n,this._from=r,this._to=i,this._promises=void 0}active(){return this._active}update(t,s,n){if(this._active){this._notify(!1);const i=this._target[this._prop],o=n-this._start,r=this._duration-o;this._start=n,this._duration=Math.floor(Math.max(r,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=Ii([t.to,s,i,t.from]),this._from=Ii([t.from,i,s])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const s=t-this._start,n=this._duration,i=this._prop,o=this._from,r=this._loop,a=this._to;let l;if(this._active=o!==a&&(r||s1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[i]=this._fn(o,a,l)}wait(){const t=this._promises||(this._promises=[]);return new Promise((s,n)=>{t.push({res:s,rej:n})})}_notify(t){const s=t?"res":"rej",n=this._promises||[];for(let i=0;i{const o=t[i];if(!Tt(o))return;const r={};for(const a of s)r[a]=o[a];(ne(o.properties)&&o.properties||[i]).forEach(a=>{(a===i||!n.has(a))&&n.set(a,r)})})}_animateOptions(t,s){const n=s.options,i=A1(t,n);if(!i)return[];const o=this._createAnimations(i,n);return n.$shared&&C1(t.options.$animations,n).then(()=>{t.options=n},()=>{}),o}_createAnimations(t,s){const n=this._properties,i=[],o=t.$animations||(t.$animations={}),r=Object.keys(s),a=Date.now();let l;for(l=r.length-1;l>=0;--l){const c=r[l];if(c.charAt(0)==="$")continue;if(c==="options"){i.push(...this._animateOptions(t,s));continue}const u=s[c];let f=o[c];const h=n.get(c);if(f)if(h&&f.active()){f.update(h,u,a);continue}else f.cancel();if(!h||!h.duration){t[c]=u;continue}o[c]=f=new S1(h,t,c,u),i.push(f)}return i}update(t,s){if(this._properties.size===0){Object.assign(t,s);return}const n=this._createAnimations(t,s);if(n.length)return Je.add(this._chart,n),!0}}function C1(e,t){const s=[],n=Object.keys(t);for(let i=0;i0||!s&&o<0)return i.index}return null}function tc(e,t){const{chart:s,_cachedMeta:n}=e,i=s._stacks||(s._stacks={}),{iScale:o,vScale:r,index:a}=n,l=o.axis,c=r.axis,u=T1(o,r,n),f=t.length;let h;for(let g=0;gs[n].axis===t).shift()}function R1(e,t){return vn(e,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function $1(e,t,s){return vn(e,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:s,index:t,mode:"default",type:"data"})}function wn(e,t){const s=e.controller.index,n=e.vScale&&e.vScale.axis;if(n){t=t||e._parsed;for(const i of t){const o=i._stacks;if(!o||o[n]===void 0||o[n][s]===void 0)return;delete o[n][s],o[n]._visualValues!==void 0&&o[n]._visualValues[s]!==void 0&&delete o[n]._visualValues[s]}}}const nr=e=>e==="reset"||e==="none",ec=(e,t)=>t?e:Object.assign({},e),L1=(e,t,s)=>e&&!t.hidden&&t._stacked&&{keys:Dd(s,!0),values:null};class Gn{constructor(t,s){this.chart=t,this._ctx=t.ctx,this.index=s,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=er(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&wn(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,s=this._cachedMeta,n=this.getDataset(),i=(f,h,g,y)=>f==="x"?h:f==="r"?y:g,o=s.xAxisID=Ft(n.xAxisID,sr(t,"x")),r=s.yAxisID=Ft(n.yAxisID,sr(t,"y")),a=s.rAxisID=Ft(n.rAxisID,sr(t,"r")),l=s.indexAxis,c=s.iAxisID=i(l,o,r,a),u=s.vAxisID=i(l,r,o,a);s.xScale=this.getScaleForId(o),s.yScale=this.getScaleForId(r),s.rScale=this.getScaleForId(a),s.iScale=this.getScaleForId(c),s.vScale=this.getScaleForId(u)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const s=this._cachedMeta;return t===s.iScale?s.vScale:s.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&Nl(this._data,this),t._stacked&&wn(t)}_dataCheck(){const t=this.getDataset(),s=t.data||(t.data=[]),n=this._data;if(Tt(s)){const i=this._cachedMeta;this._data=E1(s,i)}else if(n!==s){if(n){Nl(n,this);const i=this._cachedMeta;wn(i),i._parsed=[]}s&&Object.isExtensible(s)&&O0(s,this),this._syncList=[],this._data=s}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const s=this._cachedMeta,n=this.getDataset();let i=!1;this._dataCheck();const o=s._stacked;s._stacked=er(s.vScale,s),s.stack!==n.stack&&(i=!0,wn(s),s.stack=n.stack),this._resyncElements(t),(i||o!==s._stacked)&&(tc(this,s._parsed),s._stacked=er(s.vScale,s))}configure(){const t=this.chart.config,s=t.datasetScopeKeys(this._type),n=t.getOptionScopes(this.getDataset(),s,!0);this.options=t.createResolver(n,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,s){const{_cachedMeta:n,_data:i}=this,{iScale:o,_stacked:r}=n,a=o.axis;let l=t===0&&s===i.length?!0:n._sorted,c=t>0&&n._parsed[t-1],u,f,h;if(this._parsing===!1)n._parsed=i,n._sorted=!0,h=i;else{ne(i[t])?h=this.parseArrayData(n,i,t,s):Tt(i[t])?h=this.parseObjectData(n,i,t,s):h=this.parsePrimitiveData(n,i,t,s);const g=()=>f[a]===null||c&&f[a]v||f=0;--h)if(!y()){this.updateRangeFromParsed(c,t,g,l);break}}return c}getAllParsedValues(t){const s=this._cachedMeta._parsed,n=[];let i,o,r;for(i=0,o=s.length;i=0&&tthis.getContext(n,i,s),v=c.resolveNamedOptions(h,g,y,f);return v.$shared&&(v.$shared=l,o[r]=Object.freeze(ec(v,l))),v}_resolveAnimations(t,s,n){const i=this.chart,o=this._cachedDataOpts,r=`animation-${s}`,a=o[r];if(a)return a;let l;if(i.options.animation!==!1){const u=this.chart.config,f=u.datasetAnimationScopeKeys(this._type,s),h=u.getOptionScopes(this.getDataset(),f);l=u.createResolver(h,this.getContext(t,n,s))}const c=new Ld(i,l&&l.animations);return l&&l._cacheable&&(o[r]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,s){return!s||nr(t)||this.chart._animationsDisabled}_getSharedOptions(t,s){const n=this.resolveDataElementOptions(t,s),i=this._sharedOptions,o=this.getSharedOptions(n),r=this.includeOptions(s,o)||o!==i;return this.updateSharedOptions(o,s,n),{sharedOptions:o,includeOptions:r}}updateElement(t,s,n,i){nr(i)?Object.assign(t,n):this._resolveAnimations(s,i).update(t,n)}updateSharedOptions(t,s,n){t&&!nr(s)&&this._resolveAnimations(void 0,s).update(t,n)}_setStyle(t,s,n,i){t.active=i;const o=this.getStyle(s,i);this._resolveAnimations(s,n,i).update(t,{options:!i&&this.getSharedOptions(o)||o})}removeHoverStyle(t,s,n){this._setStyle(t,n,"active",!1)}setHoverStyle(t,s,n){this._setStyle(t,n,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const s=this._data,n=this._cachedMeta.data;for(const[a,l,c]of this._syncList)this[a](l,c);this._syncList=[];const i=n.length,o=s.length,r=Math.min(o,i);r&&this.parse(0,r),o>i?this._insertElements(i,o-i,t):o{for(c.length+=s,a=c.length-1;a>=r;a--)c[a]=c[a-s]};for(l(o),a=t;aco(k,a,l,!0)?1:Math.max(E,E*s,B,B*s),y=(k,E,B)=>co(k,a,l,!0)?-1:Math.min(E,E*s,B,B*s),v=g(0,c,f),b=g(Xt,u,h),S=y(qt,c,f),_=y(qt+Xt,u,h);n=(v-S)/2,i=(b-_)/2,o=-(v+S)/2,r=-(b+_)/2}return{ratioX:n,ratioY:i,offsetX:o,offsetY:r}}class Pn extends Gn{constructor(t,s){super(t,s),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,s){const n=this.getDataset().data,i=this._cachedMeta;if(this._parsing===!1)i._parsed=n;else{let o=l=>+n[l];if(Tt(n[t])){const{key:l="value"}=this._parsing;o=c=>+oi(n[c],l)}let r,a;for(r=t,a=t+s;r0&&!isNaN(t)?Jt*(Math.abs(t)/s):0}getLabelAndValue(t){const s=this._cachedMeta,n=this.chart,i=n.data.labels||[],o=B0(s._parsed[t],n.options.locale);return{label:i[t]||"",value:o}}getMaxBorderWidth(t){let s=0;const n=this.chart;let i,o,r,a,l;if(!t){for(i=0,o=n.data.datasets.length;it!=="spacing",_indexable:t=>t!=="spacing"&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),xt(Pn,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const s=t.data;if(s.labels.length&&s.datasets.length){const{labels:{pointStyle:n,color:i}}=t.legend.options;return s.labels.map((o,r)=>{const l=t.getDatasetMeta(0).controller.getStyle(r);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:i,lineWidth:l.borderWidth,pointStyle:n,hidden:!t.getDataVisibility(r),index:r}})}return[]}},onClick(t,s,n){n.chart.toggleDataVisibility(s.index),n.chart.update()}}}});class Or extends Pn{}xt(Or,"id","pie"),xt(Or,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});function Fs(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class va{constructor(t){xt(this,"options");this.options=t||{}}static override(t){Object.assign(va.prototype,t)}init(){}formats(){return Fs()}parse(){return Fs()}format(){return Fs()}add(){return Fs()}diff(){return Fs()}startOf(){return Fs()}endOf(){return Fs()}}var F1={_date:va};function N1(e,t,s,n){const{controller:i,data:o,_sorted:r}=e,a=i._cachedMeta.iScale,l=e.dataset&&e.dataset.options?e.dataset.options.spanGaps:null;if(a&&t===a.axis&&t!=="r"&&r&&o.length){const c=a._reversePixels?T0:Er;if(n){if(i._sharedOptions){const u=o[0],f=typeof u.getRange=="function"&&u.getRange(t);if(f){const h=c(o,t,s-f),g=c(o,t,s+f);return{lo:h.lo,hi:g.hi}}}}else{const u=c(o,t,s);if(l){const{vScale:f}=i._cachedMeta,{_parsed:h}=e,g=h.slice(0,u.lo+1).reverse().findIndex(v=>!de(v[f.axis]));u.lo-=Math.max(0,g);const y=h.slice(u.hi).findIndex(v=>!de(v[f.axis]));u.hi+=Math.max(0,y)}return u}}return{lo:0,hi:o.length-1}}function Ro(e,t,s,n,i){const o=e.getSortedVisibleDatasetMetas(),r=s[t];for(let a=0,l=o.length;a{l[r]&&l[r](t[s],i)&&(o.push({element:l,datasetIndex:c,index:u}),a=a||l.inRange(t.x,t.y,i))}),n&&!a?[]:o}var H1={modes:{index(e,t,s,n){const i=zs(t,e),o=s.axis||"x",r=s.includeInvisible||!1,a=s.intersect?ir(e,i,o,n,r):or(e,i,o,!1,n,r),l=[];return a.length?(e.getSortedVisibleDatasetMetas().forEach(c=>{const u=a[0].index,f=c.data[u];f&&!f.skip&&l.push({element:f,datasetIndex:c.index,index:u})}),l):[]},dataset(e,t,s,n){const i=zs(t,e),o=s.axis||"xy",r=s.includeInvisible||!1;let a=s.intersect?ir(e,i,o,n,r):or(e,i,o,!1,n,r);if(a.length>0){const l=a[0].datasetIndex,c=e.getDatasetMeta(l).data;a=[];for(let u=0;us.pos===t)}function nc(e,t){return e.filter(s=>Fd.indexOf(s.pos)===-1&&s.box.axis===t)}function Sn(e,t){return e.sort((s,n)=>{const i=t?n:s,o=t?s:n;return i.weight===o.weight?i.index-o.index:i.weight-o.weight})}function W1(e){const t=[];let s,n,i,o,r,a;for(s=0,n=(e||[]).length;sc.box.fullSize),!0),n=Sn(kn(t,"left"),!0),i=Sn(kn(t,"right")),o=Sn(kn(t,"top"),!0),r=Sn(kn(t,"bottom")),a=nc(t,"x"),l=nc(t,"y");return{fullSize:s,leftAndTop:n.concat(o),rightAndBottom:i.concat(l).concat(r).concat(a),chartArea:kn(t,"chartArea"),vertical:n.concat(i).concat(l),horizontal:o.concat(r).concat(a)}}function ic(e,t,s,n){return Math.max(e[s],t[s])+Math.max(e[n],t[n])}function Nd(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function K1(e,t,s,n){const{pos:i,box:o}=s,r=e.maxPadding;if(!Tt(i)){s.size&&(e[i]-=s.size);const f=n[s.stack]||{size:0,count:1};f.size=Math.max(f.size,s.horizontal?o.height:o.width),s.size=f.size/f.count,e[i]+=s.size}o.getPadding&&Nd(r,o.getPadding());const a=Math.max(0,t.outerWidth-ic(r,e,"left","right")),l=Math.max(0,t.outerHeight-ic(r,e,"top","bottom")),c=a!==e.w,u=l!==e.h;return e.w=a,e.h=l,s.horizontal?{same:c,other:u}:{same:u,other:c}}function Y1(e){const t=e.maxPadding;function s(n){const i=Math.max(t[n]-e[n],0);return e[n]+=i,i}e.y+=s("top"),e.x+=s("left"),s("right"),s("bottom")}function G1(e,t){const s=t.maxPadding;function n(i){const o={left:0,top:0,right:0,bottom:0};return i.forEach(r=>{o[r]=Math.max(t[r],s[r])}),o}return n(e?["left","right"]:["top","bottom"])}function On(e,t,s,n){const i=[];let o,r,a,l,c,u;for(o=0,r=e.length,c=0;o{typeof v.beforeLayout=="function"&&v.beforeLayout()});const u=l.reduce((v,b)=>b.box.options&&b.box.options.display===!1?v:v+1,0)||1,f=Object.freeze({outerWidth:t,outerHeight:s,padding:i,availableWidth:o,availableHeight:r,vBoxMaxWidth:o/2/u,hBoxMaxHeight:r/2}),h=Object.assign({},i);Nd(h,De(n));const g=Object.assign({maxPadding:h,w:o,h:r,x:i.left,y:i.top},i),y=V1(l.concat(c),f);On(a.fullSize,g,f,y),On(l,g,f,y),On(c,g,f,y)&&On(l,g,f,y),Y1(g),oc(a.leftAndTop,g,f,y),g.x+=g.w,g.y+=g.h,oc(a.rightAndBottom,g,f,y),e.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},Dt(a.chartArea,v=>{const b=v.box;Object.assign(b,e.chartArea),b.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})})}};class jd{acquireContext(t,s){}releaseContext(t){return!1}addEventListener(t,s,n){}removeEventListener(t,s,n){}getDevicePixelRatio(){return 1}getMaximumSize(t,s,n,i){return s=Math.max(0,s||t.width),n=n||t.height,{width:s,height:Math.max(0,i?Math.floor(s/i):n)}}isAttached(t){return!0}updateConfig(t){}}class Z1 extends jd{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const Hi="$chartjs",J1={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},rc=e=>e===null||e==="";function X1(e,t){const s=e.style,n=e.getAttribute("height"),i=e.getAttribute("width");if(e[Hi]={initial:{height:n,width:i,style:{display:s.display,height:s.height,width:s.width}}},s.display=s.display||"block",s.boxSizing=s.boxSizing||"border-box",rc(i)){const o=Gl(e,"width");o!==void 0&&(e.width=o)}if(rc(n))if(e.style.height==="")e.height=e.width/(t||2);else{const o=Gl(e,"height");o!==void 0&&(e.height=o)}return e}const zd=v1?{passive:!0}:!1;function Q1(e,t,s){e&&e.addEventListener(t,s,zd)}function t_(e,t,s){e&&e.canvas&&e.canvas.removeEventListener(t,s,zd)}function e_(e,t){const s=J1[e.type]||e.type,{x:n,y:i}=zs(e,t);return{type:s,chart:t,native:e,x:n!==void 0?n:null,y:i!==void 0?i:null}}function ho(e,t){for(const s of e)if(s===t||s.contains(t))return!0}function s_(e,t,s){const n=e.canvas,i=new MutationObserver(o=>{let r=!1;for(const a of o)r=r||ho(a.addedNodes,n),r=r&&!ho(a.removedNodes,n);r&&s()});return i.observe(document,{childList:!0,subtree:!0}),i}function n_(e,t,s){const n=e.canvas,i=new MutationObserver(o=>{let r=!1;for(const a of o)r=r||ho(a.removedNodes,n),r=r&&!ho(a.addedNodes,n);r&&s()});return i.observe(document,{childList:!0,subtree:!0}),i}const ri=new Map;let ac=0;function Bd(){const e=window.devicePixelRatio;e!==ac&&(ac=e,ri.forEach((t,s)=>{s.currentDevicePixelRatio!==e&&t()}))}function i_(e,t){ri.size||window.addEventListener("resize",Bd),ri.set(e,t)}function o_(e){ri.delete(e),ri.size||window.removeEventListener("resize",Bd)}function r_(e,t,s){const n=e.canvas,i=n&&ma(n);if(!i)return;const o=Sd((a,l)=>{const c=i.clientWidth;s(a,l),c{const l=a[0],c=l.contentRect.width,u=l.contentRect.height;c===0&&u===0||o(c,u)});return r.observe(i),i_(e,o),r}function rr(e,t,s){s&&s.disconnect(),t==="resize"&&o_(e)}function a_(e,t,s){const n=e.canvas,i=Sd(o=>{e.ctx!==null&&s(e_(o,e))},e);return Q1(n,t,i),i}class l_ extends jd{acquireContext(t,s){const n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(X1(t,s),n):null}releaseContext(t){const s=t.canvas;if(!s[Hi])return!1;const n=s[Hi].initial;["height","width"].forEach(o=>{const r=n[o];de(r)?s.removeAttribute(o):s.setAttribute(o,r)});const i=n.style||{};return Object.keys(i).forEach(o=>{s.style[o]=i[o]}),s.width=s.width,delete s[Hi],!0}addEventListener(t,s,n){this.removeEventListener(t,s);const i=t.$proxies||(t.$proxies={}),r={attach:s_,detach:n_,resize:r_}[s]||a_;i[s]=r(t,s,n)}removeEventListener(t,s){const n=t.$proxies||(t.$proxies={}),i=n[s];if(!i)return;({attach:rr,detach:rr,resize:rr}[s]||t_)(t,s,i),n[s]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,s,n,i){return m1(t,s,n,i)}isAttached(t){const s=t&&ma(t);return!!(s&&s.isConnected)}}function c_(e){return!ga()||typeof OffscreenCanvas<"u"&&e instanceof OffscreenCanvas?Z1:l_}var Di;let mi=(Di=class{constructor(){xt(this,"x");xt(this,"y");xt(this,"active",!1);xt(this,"options");xt(this,"$animations")}tooltipPosition(t){const{x:s,y:n}=this.getProps(["x","y"],t);return{x:s,y:n}}hasValue(){return lo(this.x)&&lo(this.y)}getProps(t,s){const n=this.$animations;if(!s||!n)return this;const i={};return t.forEach(o=>{i[o]=n[o]&&n[o].active()?n[o]._to:this[o]}),i}},xt(Di,"defaults",{}),xt(Di,"defaultRoutes"),Di);function u_(e,t){const s=e.options.ticks,n=d_(e),i=Math.min(s.maxTicksLimit||n,n),o=s.major.enabled?h_(t):[],r=o.length,a=o[0],l=o[r-1],c=[];if(r>i)return p_(t,c,o,r/i),c;const u=f_(o,t,i);if(r>0){let f,h;const g=r>1?Math.round((l-a)/(r-1)):null;for(Pi(t,c,u,de(g)?0:a-g,a),f=0,h=r-1;fi)return l}return Math.max(i,1)}function h_(e){const t=[];let s,n;for(s=0,n=e.length;se==="left"?"right":e==="right"?"left":e,lc=(e,t,s)=>t==="top"||t==="left"?e[t]+s:e[t]-s,cc=(e,t)=>Math.min(t||e,e);function uc(e,t){const s=[],n=e.length/t,i=e.length;let o=0;for(;or+a)))return l}function y_(e,t){Dt(e,s=>{const n=s.gc,i=n.length/2;let o;if(i>t){for(o=0;on?n:s,n=i&&s>n?s:n,{min:Ne(s,Ne(n,s)),max:Ne(n,Ne(s,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){Ut(this.options.beforeUpdate,[this])}update(t,s,n){const{beginAtZero:i,grace:o,ticks:r}=this.options,a=r.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=s,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=e1(this,o,i),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=a=o||n<=1||!this.isHorizontal()){this.labelRotation=i;return}const u=this._getLabelSizes(),f=u.widest.width,h=u.highest.height,g=Ie(this.chart.width-f,0,this.maxWidth);a=t.offset?this.maxWidth/n:g/(n-1),f+6>a&&(a=g/(n-(t.offset?.5:1)),l=this.maxHeight-Cn(t.grid)-s.padding-dc(t.title,this.chart.options.font),c=Math.sqrt(f*f+h*h),r=I0(Math.min(Math.asin(Ie((u.highest.height+6)/a,-1,1)),Math.asin(Ie(l/c,-1,1))-Math.asin(Ie(h/c,-1,1)))),r=Math.max(i,Math.min(o,r))),this.labelRotation=r}afterCalculateLabelRotation(){Ut(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){Ut(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:s,options:{ticks:n,title:i,grid:o}}=this,r=this._isVisible(),a=this.isHorizontal();if(r){const l=dc(i,s.options.font);if(a?(t.width=this.maxWidth,t.height=Cn(o)+l):(t.height=this.maxHeight,t.width=Cn(o)+l),n.display&&this.ticks.length){const{first:c,last:u,widest:f,highest:h}=this._getLabelSizes(),g=n.padding*2,y=Bs(this.labelRotation),v=Math.cos(y),b=Math.sin(y);if(a){const S=n.mirror?0:b*f.width+v*h.height;t.height=Math.min(this.maxHeight,t.height+S+g)}else{const S=n.mirror?0:v*f.width+b*h.height;t.width=Math.min(this.maxWidth,t.width+S+g)}this._calculatePadding(c,u,b,v)}}this._handleMargins(),a?(this.width=this._length=s.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=s.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,s,n,i){const{ticks:{align:o,padding:r},position:a}=this.options,l=this.labelRotation!==0,c=a!=="top"&&this.axis==="x";if(this.isHorizontal()){const u=this.getPixelForTick(0)-this.left,f=this.right-this.getPixelForTick(this.ticks.length-1);let h=0,g=0;l?c?(h=i*t.width,g=n*s.height):(h=n*t.height,g=i*s.width):o==="start"?g=s.width:o==="end"?h=t.width:o!=="inner"&&(h=t.width/2,g=s.width/2),this.paddingLeft=Math.max((h-u+r)*this.width/(this.width-u),0),this.paddingRight=Math.max((g-f+r)*this.width/(this.width-f),0)}else{let u=s.height/2,f=t.height/2;o==="start"?(u=0,f=t.height):o==="end"&&(u=s.height,f=0),this.paddingTop=u+r,this.paddingBottom=f+r}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){Ut(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:s}=this.options;return s==="top"||s==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let s,n;for(s=0,n=t.length;s({width:r[T]||0,height:a[T]||0});return{first:V(0),last:V(s-1),widest:V(L),highest:V(U),widths:r,heights:a}}getLabelForValue(t){return t}getPixelForValue(t,s){return NaN}getValueForPixel(t){}getPixelForTick(t){const s=this.ticks;return t<0||t>s.length-1?null:this.getPixelForValue(s[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const s=this._startPixel+t*this._length;return E0(this._alignToPixels?Ds(this.chart,s,0):s)}getDecimalForPixel(t){const s=(t-this._startPixel)/this._length;return this._reversePixels?1-s:s}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:s}=this;return t<0&&s<0?s:t>0&&s>0?t:0}getContext(t){const s=this.ticks||[];if(t>=0&&ta*i?a/n:l/i:l*i0}_computeGridLineItems(t){const s=this.axis,n=this.chart,i=this.options,{grid:o,position:r,border:a}=i,l=o.offset,c=this.isHorizontal(),f=this.ticks.length+(l?1:0),h=Cn(o),g=[],y=a.setContext(this.getContext()),v=y.display?y.width:0,b=v/2,S=function(P){return Ds(n,P,v)};let _,k,E,B,L,U,V,T,I,H,R,at;if(r==="top")_=S(this.bottom),U=this.bottom-h,T=_-b,H=S(t.top)+b,at=t.bottom;else if(r==="bottom")_=S(this.top),H=t.top,at=S(t.bottom)-b,U=_+b,T=this.top+h;else if(r==="left")_=S(this.right),L=this.right-h,V=_-b,I=S(t.left)+b,R=t.right;else if(r==="right")_=S(this.left),I=t.left,R=S(t.right)-b,L=_+b,V=this.left+h;else if(s==="x"){if(r==="center")_=S((t.top+t.bottom)/2+.5);else if(Tt(r)){const P=Object.keys(r)[0],W=r[P];_=S(this.chart.scales[P].getPixelForValue(W))}H=t.top,at=t.bottom,U=_+b,T=U+h}else if(s==="y"){if(r==="center")_=S((t.left+t.right)/2);else if(Tt(r)){const P=Object.keys(r)[0],W=r[P];_=S(this.chart.scales[P].getPixelForValue(W))}L=_-b,V=L-h,I=t.left,R=t.right}const F=Ft(i.ticks.maxTicksLimit,f),N=Math.max(1,Math.ceil(f/F));for(k=0;k0&&(Ct-=dt/2);break}K={left:Ct,top:Pt,width:dt+O.width,height:bt+O.height,color:N.backdropColor}}b.push({label:E,font:T,textOffset:R,options:{rotation:v,color:W,strokeColor:Y,strokeWidth:st,textAlign:At,textBaseline:at,translation:[B,L],backdrop:K}})}return b}_getXAxisLabelAlignment(){const{position:t,ticks:s}=this.options;if(-Bs(this.labelRotation))return t==="top"?"left":"right";let i="center";return s.align==="start"?i="left":s.align==="end"?i="right":s.align==="inner"&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:s,ticks:{crossAlign:n,mirror:i,padding:o}}=this.options,r=this._getLabelSizes(),a=t+o,l=r.widest.width;let c,u;return s==="left"?i?(u=this.right+o,n==="near"?c="left":n==="center"?(c="center",u+=l/2):(c="right",u+=l)):(u=this.right-a,n==="near"?c="right":n==="center"?(c="center",u-=l/2):(c="left",u=this.left)):s==="right"?i?(u=this.left+o,n==="near"?c="right":n==="center"?(c="center",u-=l/2):(c="left",u-=l)):(u=this.left+a,n==="near"?c="left":n==="center"?(c="center",u+=l/2):(c="right",u=this.right)):c="right",{textAlign:c,x:u}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,s=this.options.position;if(s==="left"||s==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(s==="top"||s==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){const{ctx:t,options:{backgroundColor:s},left:n,top:i,width:o,height:r}=this;s&&(t.save(),t.fillStyle=s,t.fillRect(n,i,o,r),t.restore())}getLineWidthForValue(t){const s=this.options.grid;if(!this._isVisible()||!s.display)return 0;const i=this.ticks.findIndex(o=>o.value===t);return i>=0?s.setContext(this.getContext(i)).lineWidth:0}drawGrid(t){const s=this.options.grid,n=this.ctx,i=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let o,r;const a=(l,c,u)=>{!u.width||!u.color||(n.save(),n.lineWidth=u.width,n.strokeStyle=u.color,n.setLineDash(u.borderDash||[]),n.lineDashOffset=u.borderDashOffset,n.beginPath(),n.moveTo(l.x,l.y),n.lineTo(c.x,c.y),n.stroke(),n.restore())};if(s.display)for(o=0,r=i.length;o{this.draw(o)}}]:[{z:n,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:i,draw:()=>{this.drawBorder()}},{z:s,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){const s=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+"AxisID",i=[];let o,r;for(o=0,r=s.length;o{const n=s.split("."),i=n.pop(),o=[e].concat(n).join("."),r=t[s].split("."),a=r.pop(),l=r.join(".");Yt.route(o,i,l,a)})}function C_(e){return"id"in e&&"defaults"in e}class A_{constructor(){this.controllers=new Oi(Gn,"datasets",!0),this.elements=new Oi(mi,"elements"),this.plugins=new Oi(Object,"plugins"),this.scales=new Oi($o,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,s,n){[...s].forEach(i=>{const o=n||this._getRegistryForType(i);n||o.isForType(i)||o===this.plugins&&i.id?this._exec(t,o,i):Dt(i,r=>{const a=n||this._getRegistryForType(r);this._exec(t,a,r)})})}_exec(t,s,n){const i=aa(t);Ut(n["before"+i],[],n),s[t](n),Ut(n["after"+i],[],n)}_getRegistryForType(t){for(let s=0;so.filter(a=>!r.some(l=>a.plugin.id===l.plugin.id));this._notify(i(s,n),t,"stop"),this._notify(i(n,s),t,"start")}}function M_(e){const t={},s=[],n=Object.keys(He.plugins.items);for(let o=0;o1&&fc(e[0].toLowerCase());if(n)return n}throw new Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function hc(e,t,s){if(s[t+"AxisID"]===e)return{axis:t}}function L_(e,t){if(t.data&&t.data.datasets){const s=t.data.datasets.filter(n=>n.xAxisID===e||n.yAxisID===e);if(s.length)return hc(e,"x",s[0])||hc(e,"y",s[0])}return{}}function D_(e,t){const s=Ks[e.type]||{scales:{}},n=t.scales||{},i=Rr(e.type,t),o=Object.create(null);return Object.keys(n).forEach(r=>{const a=n[r];if(!Tt(a))return console.error(`Invalid scale configuration for scale: ${r}`);if(a._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${r}`);const l=$r(r,a,L_(r,e),Yt.scales[a.type]),c=R_(l,i),u=s.scales||{};o[r]=Vn(Object.create(null),[{axis:l},a,u[l],u[c]])}),e.data.datasets.forEach(r=>{const a=r.type||e.type,l=r.indexAxis||Rr(a,t),u=(Ks[a]||{}).scales||{};Object.keys(u).forEach(f=>{const h=O_(f,l),g=r[h+"AxisID"]||h;o[g]=o[g]||Object.create(null),Vn(o[g],[{axis:h},n[g],u[f]])})}),Object.keys(o).forEach(r=>{const a=o[r];Vn(a,[Yt.scales[a.type],Yt.scale])}),o}function Hd(e){const t=e.options||(e.options={});t.plugins=Ft(t.plugins,{}),t.scales=D_(e,t)}function Wd(e){return e=e||{},e.datasets=e.datasets||[],e.labels=e.labels||[],e}function F_(e){return e=e||{},e.data=Wd(e.data),Hd(e),e}const pc=new Map,Ud=new Set;function Ri(e,t){let s=pc.get(e);return s||(s=t(),pc.set(e,s),Ud.add(s)),s}const An=(e,t,s)=>{const n=oi(t,s);n!==void 0&&e.add(n)};class N_{constructor(t){this._config=F_(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=Wd(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),Hd(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Ri(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,s){return Ri(`${t}.transition.${s}`,()=>[[`datasets.${t}.transitions.${s}`,`transitions.${s}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,s){return Ri(`${t}-${s}`,()=>[[`datasets.${t}.elements.${s}`,`datasets.${t}`,`elements.${s}`,""]])}pluginScopeKeys(t){const s=t.id,n=this.type;return Ri(`${n}-plugin-${s}`,()=>[[`plugins.${s}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,s){const n=this._scopeCache;let i=n.get(t);return(!i||s)&&(i=new Map,n.set(t,i)),i}getOptionScopes(t,s,n){const{options:i,type:o}=this,r=this._cachedScopes(t,n),a=r.get(s);if(a)return a;const l=new Set;s.forEach(u=>{t&&(l.add(t),u.forEach(f=>An(l,t,f))),u.forEach(f=>An(l,i,f)),u.forEach(f=>An(l,Ks[o]||{},f)),u.forEach(f=>An(l,Yt,f)),u.forEach(f=>An(l,Tr,f))});const c=Array.from(l);return c.length===0&&c.push(Object.create(null)),Ud.has(s)&&r.set(s,c),c}chartOptionScopes(){const{options:t,type:s}=this;return[t,Ks[s]||{},Yt.datasets[s]||{},{type:s},Yt,Tr]}resolveNamedOptions(t,s,n,i=[""]){const o={$shared:!0},{resolver:r,subPrefixes:a}=gc(this._resolverCache,t,i);let l=r;if(z_(r,s)){o.$shared=!1,n=Ts(n)?n():n;const c=this.createResolver(t,n,a);l=hn(r,n,c)}for(const c of s)o[c]=l[c];return o}createResolver(t,s,n=[""],i){const{resolver:o}=gc(this._resolverCache,t,n);return Tt(s)?hn(o,s,void 0,i):o}}function gc(e,t,s){let n=e.get(t);n||(n=new Map,e.set(t,n));const i=s.join();let o=n.get(i);return o||(o={resolver:fa(t,s),subPrefixes:s.filter(a=>!a.toLowerCase().includes("hover"))},n.set(i,o)),o}const j_=e=>Tt(e)&&Object.getOwnPropertyNames(e).some(t=>Ts(e[t]));function z_(e,t){const{isScriptable:s,isIndexable:n}=Ed(e);for(const i of t){const o=s(i),r=n(i),a=(r||o)&&e[i];if(o&&(Ts(a)||j_(a))||r&&ne(a))return!0}return!1}var B_="4.5.0";const H_=["top","bottom","left","right","chartArea"];function mc(e,t){return e==="top"||e==="bottom"||H_.indexOf(e)===-1&&t==="x"}function vc(e,t){return function(s,n){return s[e]===n[e]?s[t]-n[t]:s[e]-n[e]}}function yc(e){const t=e.chart,s=t.options.animation;t.notifyPlugins("afterRender"),Ut(s&&s.onComplete,[e],t)}function W_(e){const t=e.chart,s=t.options.animation;Ut(s&&s.onProgress,[e],t)}function Vd(e){return ga()&&typeof e=="string"?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}const Wi={},bc=e=>{const t=Vd(e);return Object.values(Wi).filter(s=>s.canvas===t).pop()};function U_(e,t,s){const n=Object.keys(e);for(const i of n){const o=+i;if(o>=t){const r=e[i];delete e[i],(s>0||o>t)&&(e[o+s]=r)}}}function V_(e,t,s,n){return!s||e.type==="mouseout"?null:n?t:e}var ys;let Lo=(ys=class{static register(...t){He.add(...t),_c()}static unregister(...t){He.remove(...t),_c()}constructor(t,s){const n=this.config=new N_(s),i=Vd(t),o=bc(i);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const r=n.createResolver(n.chartOptionScopes(),this.getContext());this.platform=new(n.platform||c_(i)),this.platform.updateConfig(n);const a=this.platform.acquireContext(i,r.aspectRatio),l=a&&a.canvas,c=l&&l.height,u=l&&l.width;if(this.id=v0(),this.ctx=a,this.canvas=l,this.width=u,this.height=c,this._options=r,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new I_,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=$0(f=>this.update(f),r.resizeDelay||0),this._dataChanges=[],Wi[this.id]=this,!a||!l){console.error("Failed to create chart: can't acquire context from the given item");return}Je.listen(this,"complete",yc),Je.listen(this,"progress",W_),this._initialize(),this.attached&&this.update()}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:s},width:n,height:i,_aspectRatio:o}=this;return de(t)?s&&o?o:i?n/i:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return He}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():Yl(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ul(this.canvas,this.ctx),this}stop(){return Je.stop(this),this}resize(t,s){Je.running(this)?this._resizeBeforeDraw={width:t,height:s}:this._resize(t,s)}_resize(t,s){const n=this.options,i=this.canvas,o=n.maintainAspectRatio&&this.aspectRatio,r=this.platform.getMaximumSize(i,t,s,o),a=n.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=r.width,this.height=r.height,this._aspectRatio=this.aspectRatio,Yl(this,a,!0)&&(this.notifyPlugins("resize",{size:r}),Ut(n.onResize,[this,r],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const s=this.options.scales||{};Dt(s,(n,i)=>{n.id=i})}buildOrUpdateScales(){const t=this.options,s=t.scales,n=this.scales,i=Object.keys(n).reduce((r,a)=>(r[a]=!1,r),{});let o=[];s&&(o=o.concat(Object.keys(s).map(r=>{const a=s[r],l=$r(r,a),c=l==="r",u=l==="x";return{options:a,dposition:c?"chartArea":u?"bottom":"left",dtype:c?"radialLinear":u?"category":"linear"}}))),Dt(o,r=>{const a=r.options,l=a.id,c=$r(l,a),u=Ft(a.type,r.dtype);(a.position===void 0||mc(a.position,c)!==mc(r.dposition))&&(a.position=r.dposition),i[l]=!0;let f=null;if(l in n&&n[l].type===u)f=n[l];else{const h=He.getScale(u);f=new h({id:l,type:u,ctx:this.ctx,chart:this}),n[f.id]=f}f.init(a,t)}),Dt(i,(r,a)=>{r||delete n[a]}),Dt(n,r=>{Cs.configure(this,r,r.options),Cs.addBox(this,r)})}_updateMetasets(){const t=this._metasets,s=this.data.datasets.length,n=t.length;if(t.sort((i,o)=>i.index-o.index),n>s){for(let i=s;is.length&&delete this._stacks,t.forEach((n,i)=>{s.filter(o=>o===n._dataset).length===0&&this._destroyDatasetMeta(i)})}buildOrUpdateControllers(){const t=[],s=this.data.datasets;let n,i;for(this._removeUnreferencedMetasets(),n=0,i=s.length;n{this.getDatasetMeta(s).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const s=this.config;s.update();const n=this._options=s.createResolver(s.chartOptionScopes(),this.getContext()),i=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;const o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let r=0;for(let c=0,u=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(vc("z","_idx"));const{_active:a,_lastEvent:l}=this;l?this._eventHandler(l,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){Dt(this.scales,t=>{Cs.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,s=new Set(Object.keys(this._listeners)),n=new Set(t.events);(!Ll(s,n)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,s=this._getUniformDataChanges()||[];for(const{method:n,start:i,count:o}of s){const r=n==="_removeElements"?-o:o;U_(t,i,r)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const s=this.data.datasets.length,n=o=>new Set(t.filter(r=>r[0]===o).map((r,a)=>a+","+r.splice(1).join(","))),i=n(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;Cs.update(this,this.width,this.height,t);const s=this.chartArea,n=s.width<=0||s.height<=0;this._layers=[],Dt(this.boxes,i=>{n&&i.position==="chartArea"||(i.configure&&i.configure(),this._layers.push(...i._layers()))},this),this._layers.forEach((i,o)=>{i._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let s=0,n=this.data.datasets.length;s=0;--s)this._drawDataset(t[s]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const s=this.ctx,n={meta:t,index:t.index,cancelable:!0},i=x1(this,t);this.notifyPlugins("beforeDatasetDraw",n)!==!1&&(i&&ca(s,i),t.controller.draw(),i&&ua(s),n.cancelable=!1,this.notifyPlugins("afterDatasetDraw",n))}isPointInArea(t){return Md(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,s,n,i){const o=H1.modes[s];return typeof o=="function"?o(this,t,n,i):[]}getDatasetMeta(t){const s=this.data.datasets[t],n=this._metasets;let i=n.filter(o=>o&&o._dataset===s).pop();return i||(i={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:s&&s.order||0,index:t,_dataset:s,_parsed:[],_sorted:!1},n.push(i)),i}getContext(){return this.$context||(this.$context=vn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const s=this.data.datasets[t];if(!s)return!1;const n=this.getDatasetMeta(t);return typeof n.hidden=="boolean"?!n.hidden:!s.hidden}setDatasetVisibility(t,s){const n=this.getDatasetMeta(t);n.hidden=!s}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,s,n){const i=n?"show":"hide",o=this.getDatasetMeta(t),r=o.controller._resolveAnimations(void 0,i);ro(s)?(o.data[s].hidden=!n,this.update()):(this.setDatasetVisibility(t,n),r.update(o,{visible:n}),this.update(a=>a.datasetIndex===t?i:void 0))}hide(t,s){this._updateVisibility(t,s,!1)}show(t,s){this._updateVisibility(t,s,!0)}_destroyDatasetMeta(t){const s=this._metasets[t];s&&s.controller&&s.controller._destroy(),delete this._metasets[t]}_stop(){let t,s;for(this.stop(),Je.remove(this),t=0,s=this.data.datasets.length;t{s.addEventListener(this,o,r),t[o]=r},i=(o,r,a)=>{o.offsetX=r,o.offsetY=a,this._eventHandler(o)};Dt(this.options.events,o=>n(o,i))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,s=this.platform,n=(l,c)=>{s.addEventListener(this,l,c),t[l]=c},i=(l,c)=>{t[l]&&(s.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)};let r;const a=()=>{i("attach",a),this.attached=!0,this.resize(),n("resize",o),n("detach",r)};r=()=>{this.attached=!1,i("resize",o),this._stop(),this._resize(0,0),n("attach",a)},s.isAttached(this.canvas)?a():r()}unbindEvents(){Dt(this._listeners,(t,s)=>{this.platform.removeEventListener(this,s,t)}),this._listeners={},Dt(this._responsiveListeners,(t,s)=>{this.platform.removeEventListener(this,s,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,s,n){const i=n?"set":"remove";let o,r,a,l;for(s==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+i+"DatasetHoverStyle"]()),a=0,l=t.length;a{const a=this.getDatasetMeta(o);if(!a)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:a.data[r],index:r}});!io(n,s)&&(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,s))}notifyPlugins(t,s,n){return this._plugins.notify(this,t,s,n)}isPluginEnabled(t){return this._plugins._cache.filter(s=>s.plugin.id===t).length===1}_updateHoverStyles(t,s,n){const i=this.options.hover,o=(l,c)=>l.filter(u=>!c.some(f=>u.datasetIndex===f.datasetIndex&&u.index===f.index)),r=o(s,t),a=n?t:o(t,s);r.length&&this.updateHoverStyle(r,i.mode,!1),a.length&&i.mode&&this.updateHoverStyle(a,i.mode,!0)}_eventHandler(t,s){const n={event:t,replay:s,cancelable:!0,inChartArea:this.isPointInArea(t)},i=r=>(r.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",n,i)===!1)return;const o=this._handleEvent(t,s,n.inChartArea);return n.cancelable=!1,this.notifyPlugins("afterEvent",n,i),(o||n.changed)&&this.render(),this}_handleEvent(t,s,n){const{_active:i=[],options:o}=this,r=s,a=this._getActiveElements(t,i,n,r),l=k0(t),c=V_(t,this._lastEvent,n,l);n&&(this._lastEvent=null,Ut(o.onHover,[t,a,this],this),l&&Ut(o.onClick,[t,a,this],this));const u=!io(a,i);return(u||s)&&(this._active=a,this._updateHoverStyles(a,i,s)),this._lastEvent=c,u}_getActiveElements(t,s,n,i){if(t.type==="mouseout")return[];if(!n)return s;const o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,i)}},xt(ys,"defaults",Yt),xt(ys,"instances",Wi),xt(ys,"overrides",Ks),xt(ys,"registry",He),xt(ys,"version",B_),xt(ys,"getChart",bc),ys);function _c(){return Dt(Lo.instances,e=>e._plugins.invalidate())}function q_(e,t,s){const{startAngle:n,x:i,y:o,outerRadius:r,innerRadius:a,options:l}=t,{borderWidth:c,borderJoinStyle:u}=l,f=Math.min(c/r,We(n-s));if(e.beginPath(),e.arc(i,o,r-c/2,n+f/2,s-f/2),a>0){const h=Math.min(c/a,We(n-s));e.arc(i,o,a+c/2,s-h/2,n+h/2,!0)}else{const h=Math.min(c/2,r*We(n-s));if(u==="round")e.arc(i,o,h,s-qt/2,n+qt/2,!0);else if(u==="bevel"){const g=2*h*h,y=-g*Math.cos(s+qt/2)+i,v=-g*Math.sin(s+qt/2)+o,b=g*Math.cos(n+qt/2)+i,S=g*Math.sin(n+qt/2)+o;e.lineTo(y,v),e.lineTo(b,S)}}e.closePath(),e.moveTo(0,0),e.rect(0,0,e.canvas.width,e.canvas.height),e.clip("evenodd")}function K_(e,t,s){const{startAngle:n,pixelMargin:i,x:o,y:r,outerRadius:a,innerRadius:l}=t;let c=i/a;e.beginPath(),e.arc(o,r,a,n-c,s+c),l>i?(c=i/l,e.arc(o,r,l,s+c,n-c,!0)):e.arc(o,r,i,s+Xt,n-Xt),e.closePath(),e.clip()}function Y_(e){return da(e,["outerStart","outerEnd","innerStart","innerEnd"])}function G_(e,t,s,n){const i=Y_(e.options.borderRadius),o=(s-t)/2,r=Math.min(o,n*t/2),a=l=>{const c=(s-Math.min(o,l))*n/2;return Ie(l,0,Math.min(o,c))};return{outerStart:a(i.outerStart),outerEnd:a(i.outerEnd),innerStart:Ie(i.innerStart,0,r),innerEnd:Ie(i.innerEnd,0,r)}}function Js(e,t,s,n){return{x:s+e*Math.cos(t),y:n+e*Math.sin(t)}}function po(e,t,s,n,i,o){const{x:r,y:a,startAngle:l,pixelMargin:c,innerRadius:u}=t,f=Math.max(t.outerRadius+n+s-c,0),h=u>0?u+n+s+c:0;let g=0;const y=i-l;if(n){const N=u>0?u-n:0,P=f>0?f-n:0,W=(N+P)/2,Y=W!==0?y*W/(W+n):y;g=(y-Y)/2}const v=Math.max(.001,y*f-s/qt)/f,b=(y-v)/2,S=l+b+g,_=i-b-g,{outerStart:k,outerEnd:E,innerStart:B,innerEnd:L}=G_(t,h,f,_-S),U=f-k,V=f-E,T=S+k/U,I=_-E/V,H=h+B,R=h+L,at=S+B/H,F=_-L/R;if(e.beginPath(),o){const N=(T+I)/2;if(e.arc(r,a,f,T,N),e.arc(r,a,f,N,I),E>0){const st=Js(V,I,r,a);e.arc(st.x,st.y,E,I,_+Xt)}const P=Js(R,_,r,a);if(e.lineTo(P.x,P.y),L>0){const st=Js(R,F,r,a);e.arc(st.x,st.y,L,_+Xt,F+Math.PI)}const W=(_-L/h+(S+B/h))/2;if(e.arc(r,a,h,_-L/h,W,!0),e.arc(r,a,h,W,S+B/h,!0),B>0){const st=Js(H,at,r,a);e.arc(st.x,st.y,B,at+Math.PI,S-Xt)}const Y=Js(U,S,r,a);if(e.lineTo(Y.x,Y.y),k>0){const st=Js(U,T,r,a);e.arc(st.x,st.y,k,S-Xt,T)}}else{e.moveTo(r,a);const N=Math.cos(T)*f+r,P=Math.sin(T)*f+a;e.lineTo(N,P);const W=Math.cos(I)*f+r,Y=Math.sin(I)*f+a;e.lineTo(W,Y)}e.closePath()}function Z_(e,t,s,n,i){const{fullCircles:o,startAngle:r,circumference:a}=t;let l=t.endAngle;if(o){po(e,t,s,n,l,i);for(let c=0;c=qt&&g===0&&u!=="miter"&&q_(e,t,v),o||(po(e,t,s,n,v,i),e.stroke())}class Rn extends mi{constructor(s){super();xt(this,"circumference");xt(this,"endAngle");xt(this,"fullCircles");xt(this,"innerRadius");xt(this,"outerRadius");xt(this,"pixelMargin");xt(this,"startAngle");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,s&&Object.assign(this,s)}inRange(s,n,i){const o=this.getProps(["x","y"],i),{angle:r,distance:a}=xd(o,{x:s,y:n}),{startAngle:l,endAngle:c,innerRadius:u,outerRadius:f,circumference:h}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),g=(this.options.spacing+this.options.borderWidth)/2,y=Ft(h,c-l),v=co(r,l,c)&&l!==c,b=y>=Jt||v,S=Tn(a,u+g,f+g);return b&&S}getCenterPoint(s){const{x:n,y:i,startAngle:o,endAngle:r,innerRadius:a,outerRadius:l}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],s),{offset:c,spacing:u}=this.options,f=(o+r)/2,h=(a+l+u+c)/2;return{x:n+Math.cos(f)*h,y:i+Math.sin(f)*h}}tooltipPosition(s){return this.getCenterPoint(s)}draw(s){const{options:n,circumference:i}=this,o=(n.offset||0)/4,r=(n.spacing||0)/2,a=n.circular;if(this.pixelMargin=n.borderAlign==="inner"?.33:0,this.fullCircles=i>Jt?Math.floor(i/Jt):0,i===0||this.innerRadius<0||this.outerRadius<0)return;s.save();const l=(this.startAngle+this.endAngle)/2;s.translate(Math.cos(l)*o,Math.sin(l)*o);const c=1-Math.sin(Math.min(qt,i||0)),u=o*c;s.fillStyle=n.backgroundColor,s.strokeStyle=n.borderColor,Z_(s,this,u,r,a),J_(s,this,u,r,a),s.restore()}}xt(Rn,"id","arc"),xt(Rn,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),xt(Rn,"defaultRoutes",{backgroundColor:"backgroundColor"}),xt(Rn,"descriptors",{_scriptable:!0,_indexable:s=>s!=="borderDash"});const xc=(e,t)=>{let{boxHeight:s=t,boxWidth:n=t}=e;return e.usePointStyle&&(s=Math.min(s,t),n=e.pointStyleWidth||Math.min(n,t)),{boxWidth:n,boxHeight:s,itemHeight:Math.max(t,s)}},X_=(e,t)=>e!==null&&t!==null&&e.datasetIndex===t.datasetIndex&&e.index===t.index;class wc extends mi{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,s,n){this.maxWidth=t,this.maxHeight=s,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let s=Ut(t.generateLabels,[this.chart],this)||[];t.filter&&(s=s.filter(n=>t.filter(n,this.chart.data))),t.sort&&(s=s.sort((n,i)=>t.sort(n,i,this.chart.data))),this.options.reverse&&s.reverse(),this.legendItems=s}fit(){const{options:t,ctx:s}=this;if(!t.display){this.width=this.height=0;return}const n=t.labels,i=be(n.font),o=i.size,r=this._computeTitleHeight(),{boxWidth:a,itemHeight:l}=xc(n,o);let c,u;s.font=i.string,this.isHorizontal()?(c=this.maxWidth,u=this._fitRows(r,o,a,l)+10):(u=this.maxHeight,c=this._fitCols(r,i,a,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(u,t.maxHeight||this.maxHeight)}_fitRows(t,s,n,i){const{ctx:o,maxWidth:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],u=i+a;let f=t;o.textAlign="left",o.textBaseline="middle";let h=-1,g=-u;return this.legendItems.forEach((y,v)=>{const b=n+s/2+o.measureText(y.text).width;(v===0||c[c.length-1]+b+2*a>r)&&(f+=u,c[c.length-(v>0?0:1)]=0,g+=u,h++),l[v]={left:0,top:g,row:h,width:b,height:i},c[c.length-1]+=b+a}),f}_fitCols(t,s,n,i){const{ctx:o,maxHeight:r,options:{labels:{padding:a}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],u=r-t;let f=a,h=0,g=0,y=0,v=0;return this.legendItems.forEach((b,S)=>{const{itemWidth:_,itemHeight:k}=Q_(n,s,o,b,i);S>0&&g+k+2*a>u&&(f+=h+a,c.push({width:h,height:g}),y+=h+a,v++,h=g=0),l[S]={left:y,top:g,col:v,width:_,height:k},h=Math.max(h,_),g+=k+a}),f+=h,c.push({width:h,height:g}),f}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:s,options:{align:n,labels:{padding:i},rtl:o}}=this,r=an(o,this.left,this.width);if(this.isHorizontal()){let a=0,l=we(n,this.left+i,this.right-this.lineWidths[a]);for(const c of s)a!==c.row&&(a=c.row,l=we(n,this.left+i,this.right-this.lineWidths[a])),c.top+=this.top+t+i,c.left=r.leftForLtr(r.x(l),c.width),l+=c.width+i}else{let a=0,l=we(n,this.top+t+i,this.bottom-this.columnSizes[a].height);for(const c of s)c.col!==a&&(a=c.col,l=we(n,this.top+t+i,this.bottom-this.columnSizes[a].height)),c.top=l,c.left+=this.left+i,c.left=r.leftForLtr(r.x(c.left),c.width),l+=c.height+i}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){const t=this.ctx;ca(t,this),this._draw(),ua(t)}}_draw(){const{options:t,columnSizes:s,lineWidths:n,ctx:i}=this,{align:o,labels:r}=t,a=Yt.color,l=an(t.rtl,this.left,this.width),c=be(r.font),{padding:u}=r,f=c.size,h=f/2;let g;this.drawTitle(),i.textAlign=l.textAlign("left"),i.textBaseline="middle",i.lineWidth=.5,i.font=c.string;const{boxWidth:y,boxHeight:v,itemHeight:b}=xc(r,f),S=function(L,U,V){if(isNaN(y)||y<=0||isNaN(v)||v<0)return;i.save();const T=Ft(V.lineWidth,1);if(i.fillStyle=Ft(V.fillStyle,a),i.lineCap=Ft(V.lineCap,"butt"),i.lineDashOffset=Ft(V.lineDashOffset,0),i.lineJoin=Ft(V.lineJoin,"miter"),i.lineWidth=T,i.strokeStyle=Ft(V.strokeStyle,a),i.setLineDash(Ft(V.lineDash,[])),r.usePointStyle){const I={radius:v*Math.SQRT2/2,pointStyle:V.pointStyle,rotation:V.rotation,borderWidth:T},H=l.xPlus(L,y/2),R=U+h;Id(i,I,H,R,r.pointStyleWidth&&y)}else{const I=U+Math.max((f-v)/2,0),H=l.leftForLtr(L,y),R=Yn(V.borderRadius);i.beginPath(),Object.values(R).some(at=>at!==0)?Pr(i,{x:H,y:I,w:y,h:v,radius:R}):i.rect(H,I,y,v),i.fill(),T!==0&&i.stroke()}i.restore()},_=function(L,U,V){uo(i,V.text,L,U+b/2,c,{strikethrough:V.hidden,textAlign:l.textAlign(V.textAlign)})},k=this.isHorizontal(),E=this._computeTitleHeight();k?g={x:we(o,this.left+u,this.right-n[0]),y:this.top+u+E,line:0}:g={x:this.left+u,y:we(o,this.top+E+u,this.bottom-s[0].height),line:0},Rd(this.ctx,t.textDirection);const B=b+u;this.legendItems.forEach((L,U)=>{i.strokeStyle=L.fontColor,i.fillStyle=L.fontColor;const V=i.measureText(L.text).width,T=l.textAlign(L.textAlign||(L.textAlign=r.textAlign)),I=y+h+V;let H=g.x,R=g.y;l.setWidth(this.width),k?U>0&&H+I+u>this.right&&(R=g.y+=B,g.line++,H=g.x=we(o,this.left+u,this.right-n[g.line])):U>0&&R+B>this.bottom&&(H=g.x=H+s[g.line].width+u,g.line++,R=g.y=we(o,this.top+E+u,this.bottom-s[g.line].height));const at=l.x(H);if(S(at,R,L),H=L0(T,H+y+h,k?H+I:this.right,t.rtl),_(l.x(H),R,L),k)g.x+=I+u;else if(typeof L.text!="string"){const F=c.lineHeight;g.y+=qd(L,F)+u}else g.y+=B}),$d(this.ctx,t.textDirection)}drawTitle(){const t=this.options,s=t.title,n=be(s.font),i=De(s.padding);if(!s.display)return;const o=an(t.rtl,this.left,this.width),r=this.ctx,a=s.position,l=n.size/2,c=i.top+l;let u,f=this.left,h=this.width;if(this.isHorizontal())h=Math.max(...this.lineWidths),u=this.top+c,f=we(t.align,f,this.right-h);else{const y=this.columnSizes.reduce((v,b)=>Math.max(v,b.height),0);u=c+we(t.align,this.top,this.bottom-y-t.labels.padding-this._computeTitleHeight())}const g=we(a,f,f+h);r.textAlign=o.textAlign(Cd(a)),r.textBaseline="middle",r.strokeStyle=s.color,r.fillStyle=s.color,r.font=n.string,uo(r,s.text,g,u,n)}_computeTitleHeight(){const t=this.options.title,s=be(t.font),n=De(t.padding);return t.display?s.lineHeight+n.height:0}_getLegendItemAt(t,s){let n,i,o;if(Tn(t,this.left,this.right)&&Tn(s,this.top,this.bottom)){for(o=this.legendHitBoxes,n=0;no.length>r.length?o:r)),t+s.size/2+n.measureText(i).width}function ex(e,t,s){let n=e;return typeof t.text!="string"&&(n=qd(t,s)),n}function qd(e,t){const s=e.text?e.text.length:0;return t*s}function sx(e,t){return!!((e==="mousemove"||e==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(e==="click"||e==="mouseup"))}var nx={id:"legend",_element:wc,start(e,t,s){const n=e.legend=new wc({ctx:e.ctx,options:s,chart:e});Cs.configure(e,n,s),Cs.addBox(e,n)},stop(e){Cs.removeBox(e,e.legend),delete e.legend},beforeUpdate(e,t,s){const n=e.legend;Cs.configure(e,n,s),n.options=s},afterUpdate(e){const t=e.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(e,t){t.replay||e.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(e,t,s){const n=t.datasetIndex,i=s.chart;i.isDatasetVisible(n)?(i.hide(n),t.hidden=!0):(i.show(n),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:e=>e.chart.options.color,boxWidth:40,padding:10,generateLabels(e){const t=e.data.datasets,{labels:{usePointStyle:s,pointStyle:n,textAlign:i,color:o,useBorderRadius:r,borderRadius:a}}=e.legend.options;return e._getSortedDatasetMetas().map(l=>{const c=l.controller.getStyle(s?0:void 0),u=De(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(u.width+u.height)/4,strokeStyle:c.borderColor,pointStyle:n||c.pointStyle,rotation:c.rotation,textAlign:i||c.textAlign,borderRadius:r&&(a||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:e=>e.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:e=>!e.startsWith("on"),labels:{_scriptable:e=>!["generateLabels","filter","sort"].includes(e)}}};const $n={average(e){if(!e.length)return!1;let t,s,n=new Set,i=0,o=0;for(t=0,s=e.length;ta+l)/n.size,y:i/o}},nearest(e,t){if(!e.length)return!1;let s=t.x,n=t.y,i=Number.POSITIVE_INFINITY,o,r,a;for(o=0,r=e.length;o-1?e.split(` -`):e}function ix(e,t){const{element:s,datasetIndex:n,index:i}=t,o=e.getDatasetMeta(n).controller,{label:r,value:a}=o.getLabelAndValue(i);return{chart:e,label:r,parsed:o.getParsed(i),raw:e.data.datasets[n].data[i],formattedValue:a,dataset:o.getDataset(),dataIndex:i,datasetIndex:n,element:s}}function kc(e,t){const s=e.chart.ctx,{body:n,footer:i,title:o}=e,{boxWidth:r,boxHeight:a}=t,l=be(t.bodyFont),c=be(t.titleFont),u=be(t.footerFont),f=o.length,h=i.length,g=n.length,y=De(t.padding);let v=y.height,b=0,S=n.reduce((E,B)=>E+B.before.length+B.lines.length+B.after.length,0);if(S+=e.beforeBody.length+e.afterBody.length,f&&(v+=f*c.lineHeight+(f-1)*t.titleSpacing+t.titleMarginBottom),S){const E=t.displayColors?Math.max(a,l.lineHeight):l.lineHeight;v+=g*E+(S-g)*l.lineHeight+(S-1)*t.bodySpacing}h&&(v+=t.footerMarginTop+h*u.lineHeight+(h-1)*t.footerSpacing);let _=0;const k=function(E){b=Math.max(b,s.measureText(E).width+_)};return s.save(),s.font=c.string,Dt(e.title,k),s.font=l.string,Dt(e.beforeBody.concat(e.afterBody),k),_=t.displayColors?r+2+t.boxPadding:0,Dt(n,E=>{Dt(E.before,k),Dt(E.lines,k),Dt(E.after,k)}),_=0,s.font=u.string,Dt(e.footer,k),s.restore(),b+=y.width,{width:b,height:v}}function ox(e,t){const{y:s,height:n}=t;return se.height-n/2?"bottom":"center"}function rx(e,t,s,n){const{x:i,width:o}=n,r=s.caretSize+s.caretPadding;if(e==="left"&&i+o+r>t.width||e==="right"&&i-o-r<0)return!0}function ax(e,t,s,n){const{x:i,width:o}=s,{width:r,chartArea:{left:a,right:l}}=e;let c="center";return n==="center"?c=i<=(a+l)/2?"left":"right":i<=o/2?c="left":i>=r-o/2&&(c="right"),rx(c,e,t,s)&&(c="center"),c}function Sc(e,t,s){const n=s.yAlign||t.yAlign||ox(e,s);return{xAlign:s.xAlign||t.xAlign||ax(e,t,s,n),yAlign:n}}function lx(e,t){let{x:s,width:n}=e;return t==="right"?s-=n:t==="center"&&(s-=n/2),s}function cx(e,t,s){let{y:n,height:i}=e;return t==="top"?n+=s:t==="bottom"?n-=i+s:n-=i/2,n}function Cc(e,t,s,n){const{caretSize:i,caretPadding:o,cornerRadius:r}=e,{xAlign:a,yAlign:l}=s,c=i+o,{topLeft:u,topRight:f,bottomLeft:h,bottomRight:g}=Yn(r);let y=lx(t,a);const v=cx(t,l,c);return l==="center"?a==="left"?y+=c:a==="right"&&(y-=c):a==="left"?y-=Math.max(u,h)+i:a==="right"&&(y+=Math.max(f,g)+i),{x:Ie(y,0,n.width-t.width),y:Ie(v,0,n.height-t.height)}}function $i(e,t,s){const n=De(s.padding);return t==="center"?e.x+e.width/2:t==="right"?e.x+e.width-n.right:e.x+n.left}function Ac(e){return ze([],Xe(e))}function ux(e,t,s){return vn(e,{tooltip:t,tooltipItems:s,type:"tooltip"})}function Ic(e,t){const s=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return s?e.override(s):e}const Kd={beforeTitle:Ze,title(e){if(e.length>0){const t=e[0],s=t.chart.data.labels,n=s?s.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(n>0&&t.dataIndex"u"?Kd[t].call(s,n):i}class Lr extends mi{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const s=this.chart,n=this.options.setContext(this.getContext()),i=n.enabled&&s.options.animation&&n.animations,o=new Ld(this.chart,i);return i._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=ux(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,s){const{callbacks:n}=s,i=me(n,"beforeTitle",this,t),o=me(n,"title",this,t),r=me(n,"afterTitle",this,t);let a=[];return a=ze(a,Xe(i)),a=ze(a,Xe(o)),a=ze(a,Xe(r)),a}getBeforeBody(t,s){return Ac(me(s.callbacks,"beforeBody",this,t))}getBody(t,s){const{callbacks:n}=s,i=[];return Dt(t,o=>{const r={before:[],lines:[],after:[]},a=Ic(n,o);ze(r.before,Xe(me(a,"beforeLabel",this,o))),ze(r.lines,me(a,"label",this,o)),ze(r.after,Xe(me(a,"afterLabel",this,o))),i.push(r)}),i}getAfterBody(t,s){return Ac(me(s.callbacks,"afterBody",this,t))}getFooter(t,s){const{callbacks:n}=s,i=me(n,"beforeFooter",this,t),o=me(n,"footer",this,t),r=me(n,"afterFooter",this,t);let a=[];return a=ze(a,Xe(i)),a=ze(a,Xe(o)),a=ze(a,Xe(r)),a}_createItems(t){const s=this._active,n=this.chart.data,i=[],o=[],r=[];let a=[],l,c;for(l=0,c=s.length;lt.filter(u,f,h,n))),t.itemSort&&(a=a.sort((u,f)=>t.itemSort(u,f,n))),Dt(a,u=>{const f=Ic(t.callbacks,u);i.push(me(f,"labelColor",this,u)),o.push(me(f,"labelPointStyle",this,u)),r.push(me(f,"labelTextColor",this,u))}),this.labelColors=i,this.labelPointStyles=o,this.labelTextColors=r,this.dataPoints=a,a}update(t,s){const n=this.options.setContext(this.getContext()),i=this._active;let o,r=[];if(!i.length)this.opacity!==0&&(o={opacity:0});else{const a=$n[n.position].call(this,i,this._eventPosition);r=this._createItems(n),this.title=this.getTitle(r,n),this.beforeBody=this.getBeforeBody(r,n),this.body=this.getBody(r,n),this.afterBody=this.getAfterBody(r,n),this.footer=this.getFooter(r,n);const l=this._size=kc(this,n),c=Object.assign({},a,l),u=Sc(this.chart,n,c),f=Cc(n,c,u,this.chart);this.xAlign=u.xAlign,this.yAlign=u.yAlign,o={opacity:1,x:f.x,y:f.y,width:l.width,height:l.height,caretX:a.x,caretY:a.y}}this._tooltipItems=r,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:s})}drawCaret(t,s,n,i){const o=this.getCaretPosition(t,n,i);s.lineTo(o.x1,o.y1),s.lineTo(o.x2,o.y2),s.lineTo(o.x3,o.y3)}getCaretPosition(t,s,n){const{xAlign:i,yAlign:o}=this,{caretSize:r,cornerRadius:a}=n,{topLeft:l,topRight:c,bottomLeft:u,bottomRight:f}=Yn(a),{x:h,y:g}=t,{width:y,height:v}=s;let b,S,_,k,E,B;return o==="center"?(E=g+v/2,i==="left"?(b=h,S=b-r,k=E+r,B=E-r):(b=h+y,S=b+r,k=E-r,B=E+r),_=b):(i==="left"?S=h+Math.max(l,u)+r:i==="right"?S=h+y-Math.max(c,f)-r:S=this.caretX,o==="top"?(k=g,E=k-r,b=S-r,_=S+r):(k=g+v,E=k+r,b=S+r,_=S-r),B=k),{x1:b,x2:S,x3:_,y1:k,y2:E,y3:B}}drawTitle(t,s,n){const i=this.title,o=i.length;let r,a,l;if(o){const c=an(n.rtl,this.x,this.width);for(t.x=$i(this,n.titleAlign,n),s.textAlign=c.textAlign(n.titleAlign),s.textBaseline="middle",r=be(n.titleFont),a=n.titleSpacing,s.fillStyle=n.titleColor,s.font=r.string,l=0;l_!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,Pr(t,{x:v,y,w:c,h:l,radius:S}),t.fill(),t.stroke(),t.fillStyle=r.backgroundColor,t.beginPath(),Pr(t,{x:b,y:y+1,w:c-2,h:l-2,radius:S}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(v,y,c,l),t.strokeRect(v,y,c,l),t.fillStyle=r.backgroundColor,t.fillRect(b,y+1,c-2,l-2))}t.fillStyle=this.labelTextColors[n]}drawBody(t,s,n){const{body:i}=this,{bodySpacing:o,bodyAlign:r,displayColors:a,boxHeight:l,boxWidth:c,boxPadding:u}=n,f=be(n.bodyFont);let h=f.lineHeight,g=0;const y=an(n.rtl,this.x,this.width),v=function(V){s.fillText(V,y.x(t.x+g),t.y+h/2),t.y+=h+o},b=y.textAlign(r);let S,_,k,E,B,L,U;for(s.textAlign=r,s.textBaseline="middle",s.font=f.string,t.x=$i(this,b,n),s.fillStyle=n.bodyColor,Dt(this.beforeBody,v),g=a&&b!=="right"?r==="center"?c/2+u:c+2+u:0,E=0,L=i.length;E0&&s.stroke()}_updateAnimationTarget(t){const s=this.chart,n=this.$animations,i=n&&n.x,o=n&&n.y;if(i||o){const r=$n[t.position].call(this,this._active,this._eventPosition);if(!r)return;const a=this._size=kc(this,t),l=Object.assign({},r,this._size),c=Sc(s,t,l),u=Cc(t,l,c,s);(i._to!==u.x||o._to!==u.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=a.width,this.height=a.height,this.caretX=r.x,this.caretY=r.y,this._resolveAnimations().update(this,u))}}_willRender(){return!!this.opacity}draw(t){const s=this.options.setContext(this.getContext());let n=this.opacity;if(!n)return;this._updateAnimationTarget(s);const i={width:this.width,height:this.height},o={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;const r=De(s.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;s.enabled&&a&&(t.save(),t.globalAlpha=n,this.drawBackground(o,t,i,s),Rd(t,s.textDirection),o.y+=r.top,this.drawTitle(o,t,s),this.drawBody(o,t,s),this.drawFooter(o,t,s),$d(t,s.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,s){const n=this._active,i=t.map(({datasetIndex:a,index:l})=>{const c=this.chart.getDatasetMeta(a);if(!c)throw new Error("Cannot find a dataset at index "+a);return{datasetIndex:a,element:c.data[l],index:l}}),o=!io(n,i),r=this._positionChanged(i,s);(o||r)&&(this._active=i,this._eventPosition=s,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,s,n=!0){if(s&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const i=this.options,o=this._active||[],r=this._getActiveElements(t,o,s,n),a=this._positionChanged(r,t),l=s||!io(r,o)||a;return l&&(this._active=r,(i.enabled||i.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,s))),l}_getActiveElements(t,s,n,i){const o=this.options;if(t.type==="mouseout")return[];if(!i)return s.filter(a=>this.chart.data.datasets[a.datasetIndex]&&this.chart.getDatasetMeta(a.datasetIndex).controller.getParsed(a.index)!==void 0);const r=this.chart.getElementsAtEventForMode(t,o.mode,o,n);return o.reverse&&r.reverse(),r}_positionChanged(t,s){const{caretX:n,caretY:i,options:o}=this,r=$n[o.position].call(this,t,s);return r!==!1&&(n!==r.x||i!==r.y)}}xt(Lr,"positioners",$n);var dx={id:"tooltip",_element:Lr,positioners:$n,afterInit(e,t,s){s&&(e.tooltip=new Lr({chart:e,options:s}))},beforeUpdate(e,t,s){e.tooltip&&e.tooltip.initialize(s)},reset(e,t,s){e.tooltip&&e.tooltip.initialize(s)},afterDraw(e){const t=e.tooltip;if(t&&t._willRender()){const s={tooltip:t};if(e.notifyPlugins("beforeTooltipDraw",{...s,cancelable:!0})===!1)return;t.draw(e.ctx),e.notifyPlugins("afterTooltipDraw",s)}},afterEvent(e,t){if(e.tooltip){const s=t.replay;e.tooltip.handleEvent(t.event,s,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:Kd},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:e=>e!=="filter"&&e!=="itemSort"&&e!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};const Do={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ye=Object.keys(Do);function Mc(e,t){return e-t}function Ec(e,t){if(de(t))return null;const s=e._adapter,{parser:n,round:i,isoWeekday:o}=e._parseOpts;let r=t;return typeof n=="function"&&(r=n(r)),cs(r)||(r=typeof n=="string"?s.parse(r,n):s.parse(r)),r===null?null:(i&&(r=i==="week"&&(lo(o)||o===!0)?s.startOf(r,"isoWeek",o):s.startOf(r,i)),+r)}function Tc(e,t,s,n){const i=ye.length;for(let o=ye.indexOf(e);o=ye.indexOf(s);o--){const r=ye[o];if(Do[r].common&&e._adapter.diff(i,n,r)>=t-1)return r}return ye[s?ye.indexOf(s):0]}function hx(e){for(let t=ye.indexOf(e)+1,s=ye.length;t=t?s[n]:s[i];e[o]=!0}}function px(e,t,s,n){const i=e._adapter,o=+i.startOf(t[0].value,n),r=t[t.length-1].value;let a,l;for(a=o;a<=r;a=+i.add(a,1,n))l=s[a],l>=0&&(t[l].major=!0);return t}function Oc(e,t,s){const n=[],i={},o=t.length;let r,a;for(r=0;r+t.value))}initOffsets(t=[]){let s=0,n=0,i,o;this.options.offset&&t.length&&(i=this.getDecimalForValue(t[0]),t.length===1?s=1-i:s=(this.getDecimalForValue(t[1])-i)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?n=o:n=(o-this.getDecimalForValue(t[t.length-2]))/2);const r=t.length<3?.5:.25;s=Ie(s,0,r),n=Ie(n,0,r),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,s=this.min,n=this.max,i=this.options,o=i.time,r=o.unit||Tc(o.minUnit,s,n,this._getLabelCapacity(s)),a=Ft(i.ticks.stepSize,1),l=r==="week"?o.isoWeekday:!1,c=lo(l)||l===!0,u={};let f=s,h,g;if(c&&(f=+t.startOf(f,"isoWeek",l)),f=+t.startOf(f,c?"day":r),t.diff(n,s,r)>1e5*a)throw new Error(s+" and "+n+" are too far apart with stepSize of "+a+" "+r);const y=i.ticks.source==="data"&&this.getDataTimestamps();for(h=f,g=0;h+v)}getLabelForValue(t){const s=this._adapter,n=this.options.time;return n.tooltipFormat?s.format(t,n.tooltipFormat):s.format(t,n.displayFormats.datetime)}format(t,s){const i=this.options.time.displayFormats,o=this._unit,r=s||i[o];return this._adapter.format(t,r)}_tickFormatFunction(t,s,n,i){const o=this.options,r=o.ticks.callback;if(r)return Ut(r,[t,s,n],this);const a=o.time.displayFormats,l=this._unit,c=this._majorUnit,u=l&&a[l],f=c&&a[c],h=n[s],g=c&&f&&h&&h.major;return this._adapter.format(t,i||(g?f:u))}generateTickLabels(t){let s,n,i;for(s=0,n=t.length;s0?a:1}getDataTimestamps(){let t=this._cache.data||[],s,n;if(t.length)return t;const i=this.getMatchingVisibleMetas();if(this._normalized&&i.length)return this._cache.data=i[0].controller.getAllParsedValues(this);for(s=0,n=i.length;s=e[n].pos&&t<=e[i].pos&&({lo:n,hi:i}=Er(e,"pos",t)),{pos:o,time:a}=e[n],{pos:r,time:l}=e[i]):(t>=e[n].time&&t<=e[i].time&&({lo:n,hi:i}=Er(e,"time",t)),{time:o,pos:a}=e[n],{time:r,pos:l}=e[i]);const c=r-o;return c?a+(l-a)*(t-o)/c:a}class Rc extends go{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),s=this._table=this.buildLookupTable(t);this._minPos=Li(s,this.min),this._tableRange=Li(s,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:s,max:n}=this,i=[],o=[];let r,a,l,c,u;for(r=0,a=t.length;r=s&&c<=n&&i.push(c);if(i.length<2)return[{time:s,pos:0},{time:n,pos:1}];for(r=0,a=i.length;ri-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const s=this.getDataTimestamps(),n=this.getLabelTimestamps();return s.length&&n.length?t=this.normalize(s.concat(n)):t=s.length?s:n,t=this._cache.all=t,t}getDecimalForValue(t){return(Li(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const s=this._offsets,n=this.getDecimalForPixel(t)/s.factor-s.end;return Li(this._table,n*this._tableRange+this._minPos,!0)}}xt(Rc,"id","timeseries"),xt(Rc,"defaults",go.defaults);const Yd={data:{type:Object,required:!0},options:{type:Object,default:()=>({})},plugins:{type:Array,default:()=>[]},datasetIdKey:{type:String,default:"label"},updateMode:{type:String,default:void 0}},gx={ariaLabel:{type:String},ariaDescribedby:{type:String}},mx={type:{type:String,required:!0},destroyDelay:{type:Number,default:0},...Yd,...gx},vx=Bu[0]==="2"?(e,t)=>Object.assign(e,{attrs:t}):(e,t)=>Object.assign(e,t);function Xs(e){return ci(e)?Mt(e):e}function yx(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:e;return ci(t)?new Proxy(e,{}):e}function bx(e,t){const s=e.options;s&&t&&Object.assign(s,t)}function Gd(e,t){e.labels=t}function Zd(e,t,s){const n=[];e.datasets=t.map(i=>{const o=e.datasets.find(r=>r[s]===i[s]);return!o||!i.data||n.includes(o)?{...i}:(n.push(o),Object.assign(o,i),o)})}function _x(e,t){const s={labels:[],datasets:[]};return Gd(s,e.labels),Zd(s,e.datasets,t),s}const xx=ie({props:mx,setup(e,t){let{expose:s,slots:n}=t;const i=X(null),o=Yr(null);s({chart:o});const r=()=>{if(!i.value)return;const{type:c,data:u,options:f,plugins:h,datasetIdKey:g}=e,y=_x(u,g),v=yx(y,u);o.value=new Lo(i.value,{type:c,data:v,options:{...f},plugins:h})},a=()=>{const c=Mt(o.value);c&&(e.destroyDelay>0?setTimeout(()=>{c.destroy(),o.value=null},e.destroyDelay):(c.destroy(),o.value=null))},l=c=>{c.update(e.updateMode)};return fs(r),gn(a),ve([()=>e.options,()=>e.data],(c,u)=>{let[f,h]=c,[g,y]=u;const v=Mt(o.value);if(!v)return;let b=!1;if(f){const S=Xs(f),_=Xs(g);S&&S!==_&&(bx(v,S),b=!0)}if(h){const S=Xs(h.labels),_=Xs(y.labels),k=Xs(h.datasets),E=Xs(y.datasets);S!==_&&(Gd(v.config.data,S),b=!0),k&&k!==E&&(Zd(v.config.data,k,e.datasetIdKey),b=!0)}b&&di(()=>{l(v)})},{deep:!0}),()=>ee("canvas",{role:"img",ariaLabel:e.ariaLabel,ariaDescribedby:e.ariaDescribedby,ref:i},[ee("p",{},[n.default?n.default():""])])}});function wx(e,t){return Lo.register(t),ie({props:Yd,setup(s,n){let{expose:i}=n;const o=Yr(null),r=a=>{o.value=a==null?void 0:a.chart};return i({chart:o}),()=>ee(xx,vx({ref:r},{type:e,...s}))}})}const kx=wx("pie",Or),Sx={class:"relative"},Cx=ie({__name:"TokenPieChart",props:{data:{}},setup(e){Lo.register(Rn,dx,nx);const t=e,s=ot(()=>({labels:t.data.map(i=>i.name),datasets:[{data:t.data.map(i=>i.value),backgroundColor:t.data.map(i=>i.color),borderWidth:2,borderColor:"hsl(var(--b1))"}]})),n=ot(()=>({responsive:!0,maintainAspectRatio:!0,plugins:{legend:{display:!1},tooltip:{callbacks:{label:i=>{var l;const o=i.label||"",r=i.parsed||0,a=((l=t.data[i.dataIndex])==null?void 0:l.percentage)||0;return`${o}: ${r.toLocaleString()} (${a.toFixed(1)}%)`}}}}}));return(i,o)=>(x(),w("div",Sx,[ht(ct(kx),{data:s.value,options:n.value},null,8,["data","options"])]))}}),Ax=["open"],Ix={class:"modal-box max-w-lg"},Mx={key:0,class:"flex justify-center py-8"},Ex={key:1,class:"alert alert-error mb-4"},Tx={class:"text-sm"},Px={key:2,class:"space-y-2"},Ox={class:"flex items-center gap-3 min-w-0 flex-1"},Rx=["title"],$x={class:"min-w-0 flex-1"},Lx={class:"font-medium text-sm truncate"},Dx=["title"],Fx={class:"flex-shrink-0 ml-2"},Nx={key:0,class:"badge badge-ghost badge-sm"},jx={key:1,class:"text-xs opacity-40"},zx=["onClick","disabled"],Bx={key:0,class:"loading loading-spinner loading-xs"},Hx={key:1},Wx=["onClick","disabled"],Ux={key:0,class:"loading loading-spinner loading-xs"},Vx={key:1},qx={key:0,class:"text-center py-6 opacity-60"},Kx={key:3,class:"mt-3"},Yx={class:"text-sm"},Gx={class:"modal-action"},Zx=["disabled"],Jx=ie({__name:"ConnectModal",props:{show:{type:Boolean}},emits:["close"],setup(e,{emit:t}){const s=e,n=t,i=hs(),o=X([]),r=X(null),a=X(""),l=X(!1),c=us({initial:!1,clients:{}}),u=ot(()=>o.value.filter(_=>_.supported&&_.exists&&!_.connected)),f=ot(()=>u.value.length===0);function h(_){return{"claude-desktop":"✨","claude-code":"πŸ’»",cursor:"πŸ“",vscode:"πŸ“",windsurf:"πŸ„",opencode:"⚑",gemini:"β™Š",codex:"⌘",zed:"⚑",cline:"πŸ€–",continue:"➑️"}[_.id]||_.icon||"πŸ”§"}async function g(){c.initial=!0,r.value=null;try{const _=await pt.getConnectStatus();_.success&&_.data?o.value=Array.isArray(_.data)?_.data:[]:r.value=_.error||"Failed to load client status"}catch(_){r.value=_ instanceof Error?_.message:"Failed to connect to API"}finally{c.initial=!1}}async function y(_){c.clients[_]=!0,a.value="";try{const k=await pt.connectClient(_);k.success&&k.data?(a.value=k.data.message||`Connected to ${_}`,l.value=!0,await g(),i.addToast({type:"success",title:"Client Connected",message:`MCPProxy registered in ${_}`})):(a.value=k.error||"Failed to connect",l.value=!1)}catch(k){a.value=k instanceof Error?k.message:"Unknown error",l.value=!1}finally{c.clients[_]=!1}}async function v(_){c.clients[_]=!0,a.value="";try{const k=o.value.find(B=>B.id===_),E=await pt.disconnectClient(_,(k==null?void 0:k.server_name)||"mcpproxy");E.success&&E.data?(a.value=E.data.message||`Disconnected from ${_}`,l.value=!0,await g(),i.addToast({type:"info",title:"Client Disconnected",message:`MCPProxy removed from ${_}`})):(a.value=E.error||"Failed to disconnect",l.value=!1)}catch(k){a.value=k instanceof Error?k.message:"Unknown error",l.value=!1}finally{c.clients[_]=!1}}async function b(){for(const _ of u.value)await y(_.id)}function S(){a.value="",n("close")}return ve(()=>s.show,_=>{_&&(g(),a.value="")}),(_,k)=>(x(),w("dialog",{open:_.show,class:"modal"},[d("div",Ix,[k[3]||(k[3]=d("h3",{class:"font-bold text-lg mb-2"},"Connect MCPProxy to AI Agents",-1)),k[4]||(k[4]=d("p",{class:"text-sm opacity-70 mb-4"}," Register MCPProxy as an MCP server in your AI tools. This modifies the tool's config file (backup created automatically). ",-1)),c.initial?(x(),w("div",Mx,[...k[0]||(k[0]=[d("span",{class:"loading loading-spinner loading-md"},null,-1)])])):r.value?(x(),w("div",Ex,[k[1]||(k[1]=d("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),d("span",Tx,z(r.value),1)])):(x(),w("div",Px,[(x(!0),w(wt,null,Vt(o.value,E=>(x(),w("div",{key:E.id,class:"flex items-center justify-between p-3 rounded-lg border border-base-300 hover:bg-base-200/50 transition-colors"},[d("div",Ox,[d("div",{class:"w-8 h-8 flex items-center justify-center text-lg flex-shrink-0",title:E.name},z(h(E)),9,Rx),d("div",$x,[d("div",Lx,z(E.name),1),d("div",{class:"text-xs opacity-50 truncate",title:E.config_path},z(E.config_path),9,Dx)])]),d("div",Fx,[E.supported?E.exists?E.connected?(x(),w("button",{key:2,onClick:B=>v(E.id),class:"btn btn-ghost btn-xs text-error",disabled:c.clients[E.id]},[c.clients[E.id]?(x(),w("span",Bx)):(x(),w("span",Hx,"Disconnect"))],8,zx)):(x(),w("button",{key:3,onClick:B=>y(E.id),class:"btn btn-primary btn-xs",disabled:c.clients[E.id]},[c.clients[E.id]?(x(),w("span",Ux)):(x(),w("span",Vx,"Connect"))],8,Wx)):(x(),w("span",jx,"Config not found")):(x(),w("span",Nx,z(E.reason||"Not supported"),1))])]))),128)),o.value.length===0&&!c.initial?(x(),w("div",qx,[...k[2]||(k[2]=[d("p",{class:"text-sm"},"No AI clients detected on this system.",-1)])])):J("",!0)])),a.value?(x(),w("div",Kx,[d("div",{class:yt(["alert alert-sm",l.value?"alert-success":"alert-error"])},[d("span",Yx,z(a.value),1)],2)])):J("",!0),d("div",Gx,[d("button",{onClick:b,class:"btn btn-primary btn-sm",disabled:f.value||u.value.length===0}," Connect All ",8,Zx),d("button",{onClick:S,class:"btn btn-ghost btn-sm"},"Close")])]),d("form",{method:"dialog",class:"modal-backdrop",onClick:mn(S,["prevent"])},[...k[5]||(k[5]=[d("button",null,"close",-1)])])],8,Ax))}}),Xx=["open"],Qx={class:"flex items-start justify-between px-6 pt-5 pb-3"},tw={class:"text-xs opacity-60 mt-1"},ew={role:"tablist",class:"tabs tabs-bordered px-6 shrink-0"},sw=["data-test","onClick"],nw={key:0},iw={key:1},ow={class:"px-6 py-4 overflow-y-auto flex-1"},rw={key:0,"data-test":"panel-clients"},aw={key:0,class:"flex justify-center py-6"},lw={key:1,class:"alert alert-error mb-2"},cw={class:"text-sm"},uw={key:0,class:"space-y-2 mb-4"},dw={key:1,class:"space-y-2 mb-4"},fw={key:2,class:"group mb-2"},hw={class:"cursor-pointer text-sm opacity-70 hover:opacity-100 select-none flex items-center gap-1 py-1"},pw={class:"space-y-2 mt-2"},gw={key:3,class:"mt-3"},mw={class:"text-sm"},vw={class:"mt-6 border-t border-base-300 pt-4"},yw={class:"mt-3 space-y-3 text-sm"},bw={class:"flex items-start gap-3"},_w={class:"flex-1 min-w-0"},xw={class:"text-xs opacity-60 mt-0.5"},ww={class:"font-mono text-[11px]"},kw={class:"flex items-start gap-3"},Sw=["checked","disabled"],Cw={key:1,"data-test":"panel-servers"},Aw={key:0,class:"flex justify-center py-4"},Iw={key:1,class:"text-sm opacity-60 py-4 text-center"},Mw={key:2,class:"border border-base-300 rounded-lg overflow-hidden mb-5"},Ew=["data-test"],Tw={class:"flex items-start gap-3 px-3 py-2 bg-base-200/50 cursor-pointer"},Pw=["checked",".indeterminate","data-test","onChange"],Ow={class:"min-w-0 flex-1"},Rw={class:"font-medium text-sm flex items-center gap-2"},$w={class:"text-[11px] opacity-50"},Lw=["title"],Dw={class:"divide-y divide-base-300"},Fw={class:"flex items-center gap-3 flex-1 min-w-0 cursor-pointer"},Nw=["checked","data-test","onChange"],jw={class:"text-sm truncate"},zw=["title"],Bw={class:"font-mono text-[11px]"},Hw={class:"text-sm"},Ww={class:"border border-base-300 rounded-lg p-3 text-sm","data-test":"manual-add-details"},Uw={class:"mt-3"},Vw={key:0,class:"text-xs text-success mt-2"},qw={key:1,class:"text-xs opacity-60 mt-2"},Kw={key:2,"data-test":"panel-verify"},Yw={key:0,class:"flex flex-col items-center gap-2 py-6 text-center"},Gw={key:0,class:"text-xs opacity-60 mt-2"},Zw={class:"font-medium"},Jw={key:1,class:"flex flex-col items-center gap-3 py-6 text-center"},Xw={class:"mt-4 border-t border-base-300 pt-4","data-test":"verify-activity-section"},Qw={class:"flex items-center justify-between mb-2"},t2={key:0,class:"flex justify-center py-3"},e2={key:1,class:"bg-base-200 rounded-lg p-3 text-sm opacity-70 text-center","data-test":"verify-activity-empty"},s2={key:2,class:"space-y-1.5","data-test":"verify-activity-list"},n2=["title"],i2={class:"font-mono text-xs opacity-60 shrink-0"},o2={class:"font-medium truncate flex-1"},r2={key:0,class:"opacity-70"},a2={key:0,class:"text-xs opacity-50 shrink-0"},l2={key:0,class:"border-t border-base-300 shrink-0 bg-base-200/40"},c2={class:"border-b border-base-300","data-test":"security-panel"},u2={class:"px-6 py-4 space-y-4 bg-base-100"},d2={class:"flex items-start gap-3 p-3 rounded-lg border border-base-300 cursor-pointer"},f2=["checked","disabled"],h2={class:"flex-1 min-w-0"},p2={key:0,class:"text-xs text-warning mt-2","data-test":"docker-install-hint"},g2={class:"flex items-start gap-3 p-3 rounded-lg border border-base-300 cursor-pointer"},m2=["checked","disabled"],v2={class:"flex-1 min-w-0"},y2={class:"text-xs opacity-70 mt-1.5 leading-relaxed"},b2={class:"flex items-center justify-between gap-3 px-6 py-3"},_2={class:"text-xs"},x2={key:0,class:"opacity-50"},w2={key:1},k2={class:"font-semibold text-primary"},S2={key:0,class:"opacity-70"},C2={class:"text-warning"},A2={class:"flex items-center gap-2"},I2=["disabled"],M2={key:0,class:"loading loading-spinner loading-xs"},E2={key:1},T2=["disabled","title"],P2={key:0,class:"loading loading-spinner loading-xs"},O2={key:1},R2={key:1,class:"flex items-center justify-between px-6 py-3 border-t border-base-300 shrink-0"},$2=ie({__name:"OnboardingWizard",props:{show:{type:Boolean}},emits:["close"],setup(e,{emit:t}){const s=e,n=t,i=sa(),o=hs(),r=pi(),a=X("clients"),l=X([]),c=X(!1),u=X(null),f=us({}),h=X(""),g=X(!0),y=X(!1),v=X(!1),b=X(!1),S=X(!0),_=X(!0),k=X(""),E=X(!1),B=X(null),L=X([]),U=X(!1),V=X([]),T=X(!1),I=X(new Set),H=X(""),R=ot(()=>H.value!==""),at=X(""),F=X(!1),N=ot(()=>L.value.filter(Z=>Z.serverCount>0));function P(Z,M){return`${Z}::${M}`}function W(Z,M){return I.value.has(P(Z,M))}function Y(Z,M,it){const q=P(Z,M),jt=new Set(I.value);it?jt.add(q):jt.delete(q),I.value=jt}function st(Z){return Z.serverNames.length>0&&Z.serverNames.every(M=>W(Z.path,M))}function At(Z){return Z.serverNames.some(it=>W(Z.path,it))&&!st(Z)}function K(Z,M){const it=new Set(I.value);for(const q of Z.serverNames){const jt=P(Z.path,q);M?it.add(jt):it.delete(jt)}I.value=it}const O=ot(()=>I.value.size),bt=ot(()=>{const Z=new Map;for(const it of I.value){const q=it.indexOf("::");if(q===-1)continue;const jt=it.slice(0,q),zt=it.slice(q+2);Z.has(zt)||Z.set(zt,new Set),Z.get(zt).add(jt)}const M=new Map;for(const[it,q]of Z)if(!(q.size<2))for(const jt of q){const zt=L.value.find(ps=>ps.path===jt);zt&&M.set(P(jt,it),`${it}_${zt.format.replace(/-/g,"_")}`)}return M});function dt(Z,M){return bt.value.get(P(Z.path,M))}const Pt=ot(()=>bt.value.size);let Ct=null;const j=ot(()=>[{id:"clients",label:"Clients",idx:1,complete:i.hasConnectedClient},{id:"servers",label:"Servers",idx:2,complete:i.hasConfiguredServer},{id:"verify",label:"Verify",idx:3,complete:i.firstMCPClientEver}]),rt=ot(()=>({width:"min(960px, 90vw)",maxWidth:"min(960px, 90vw)",height:"min(640px, 85vh)",maxHeight:"min(640px, 85vh)"})),nt=["claude-code","codex","gemini"],ut=ot(()=>l.value.filter(Z=>Z.exists)),St=ot(()=>nt.map(Z=>l.value.find(M=>M.id===Z)).filter(Z=>!!Z&&!Z.exists)),m=ot(()=>{const Z=new Set(ut.value.map(it=>it.id)),M=new Set(St.value.map(it=>it.id));return l.value.filter(it=>!Z.has(it.id)&&!M.has(it.id))}),p=ot(()=>{var M;const Z=((M=i.state)==null?void 0:M.configured_server_count)??0;return Z===1?"1 server":`${Z} servers`});ve(()=>s.show,async Z=>{Z?(v.value=!1,h.value="",await i.fetchState(),await Promise.all([D(),Q(),G(),gt(),et()]),a.value=A(),$()):C()});function A(){return i.hasConnectedClient?i.hasConfiguredServer?i.firstMCPClientEver?"clients":"verify":"servers":"clients"}function $(){C(),Ct=setInterval(()=>{i.fetchState(),a.value==="verify"&&et()},5e3)}function C(){Ct&&(clearInterval(Ct),Ct=null)}gn(()=>C());async function D(){c.value=!0,u.value=null;try{const Z=await pt.getConnectStatus();Z.success&&Z.data?l.value=Array.isArray(Z.data)?Z.data:[]:u.value=Z.error??"Failed to load client status"}catch(Z){u.value=Z.message}finally{c.value=!1}}async function et(){T.value=!0;try{const Z=await pt.getActivities({limit:5});Z.success&&Z.data&&(V.value=Z.data.activities??[])}catch{}finally{T.value=!1}}function tt(Z){const M=new Date(Z),q=Date.now()-M.getTime();return q<6e4?"just now":q<36e5?`${Math.floor(q/6e4)}m ago`:q<864e5?`${Math.floor(q/36e5)}h ago`:M.toLocaleDateString()}async function Q(){try{const Z=await pt.getConfig();if(Z.success&&Z.data){const M=Z.data.config??{};b.value=!!M.require_mcp_auth,_.value=M.quarantine_enabled??!0,k.value=M.listen??"";const it=M.docker_isolation??M.isolation??null;S.value=(it==null?void 0:it.enabled)??!0}}catch{}}async function G(){try{const Z=await pt.getDockerStatus();if(Z.success&&Z.data){let M=Z.data.docker_available??!1;!M&&r.servers.some(it=>it.connected&&it.protocol==="stdio")&&(M=!0),B.value=M}else B.value=!1}catch{B.value=!1}}async function gt(){U.value=!0;try{const Z=await pt.getCanonicalConfigPaths();if(!Z.success||!Z.data){L.value=[];return}const M=Z.data.paths.filter(it=>it.exists).map(it=>({name:it.name,format:it.format,path:it.path,exists:!0,previewLoading:!0,previewError:"",serverCount:0,serverNames:[],importBusy:"",importMessage:"",importMessageOk:!1}));L.value=M,await Promise.all(M.map(async(it,q)=>{try{const jt=await pt.importServersFromPath({path:it.path,format:it.format,preview:!0});if(jt.success&&jt.data){const zt=jt.data.imported??[];L.value[q]={...it,previewLoading:!1,serverCount:zt.length,serverNames:zt.map(ps=>ps.name)}}else L.value[q]={...it,previewLoading:!1,previewError:jt.error??"preview failed"}}catch(jt){L.value[q]={...it,previewLoading:!1,previewError:jt.message}}}))}finally{U.value=!1}}async function lt(Z){var ps,ba,_a;if(I.value.size===0)return;H.value=Z?"quarantine":"active",at.value="";const M=new Map;for(const gs of I.value){const _e=gs.indexOf("::");if(_e===-1)continue;const te=gs.slice(0,_e),xa=gs.slice(_e+2),wa=L.value.find(Xd=>Xd.path===te);if(!wa)continue;M.has(te)||M.set(te,{src:wa,serverNames:[],rename:{}});const ka=M.get(te);ka.serverNames.push(xa);const Sa=bt.value.get(gs);Sa&&(ka.rename[xa]=Sa)}let it=0,q=0,jt=0;const zt=[];try{const gs=await Promise.all(Array.from(M.values()).map(async _e=>{const te=await pt.importServersFromPath({path:_e.src.path,format:_e.src.format,server_names:_e.serverNames,rename:Object.keys(_e.rename).length>0?_e.rename:void 0,skip_quarantine:!Z});return{job:_e,r:te}}));for(const{job:_e,r:te}of gs)te.success&&te.data?(it+=((ps=te.data.summary)==null?void 0:ps.imported)??0,q+=((ba=te.data.summary)==null?void 0:ba.skipped)??0,jt+=((_a=te.data.summary)==null?void 0:_a.failed)??0):zt.push(`${_e.src.name}: ${te.error??"unknown error"}`);if(F.value=zt.length===0,zt.length===0){let te=`βœ“ Imported ${it} server${it===1?"":"s"} ${Z?"into quarantine":"as active"}`;q>0&&(te+=` Β· ${q} skipped (already configured)`),jt>0&&(te+=` Β· ${jt} failed`),Z&&it>0&&(te+=". Approve from the Servers page."),at.value=te,I.value=new Set,o.addToast({type:"success",title:"Import complete",message:`${it} server${it===1?"":"s"}${Pt.value>0?` (${Pt.value} renamed)`:""}`})}else at.value=`Some imports failed: ${zt.join(" Β· ")}`;await Promise.all([r.fetchServers(),i.fetchState(),gt()])}catch(gs){at.value=gs.message,F.value=!1}finally{H.value=""}}async function ft(Z){E.value=!0;try{const M=await pt.getConfig();if(!M.success||!M.data)throw new Error(M.error??"failed to read config");const it={...M.data.config,...Z},q=await pt.applyConfig(it);if(!q.success)throw new Error(q.error??"failed to apply config");await Q(),o.addToast({type:"success",title:"Settings saved",message:"Updated"})}catch(M){o.addToast({type:"error",title:"Save failed",message:M.message})}finally{E.value=!1}}function _t(Z){ft({require_mcp_auth:Z})}function It(Z){ft({docker_isolation:{enabled:Z}})}function Nt(Z){ft({quarantine_enabled:Z})}async function Et(Z){f[Z]=!0,h.value="";try{const M=await pt.connectClient(Z);M.success&&M.data?(g.value=!0,h.value=M.data.message||`Connected ${Z}`,await D(),await i.fetchState(),o.addToast({type:"success",title:"Client connected",message:`mcpproxy registered in ${Z}`})):(g.value=!1,h.value=M.error??"Failed to connect")}catch(M){g.value=!1,h.value=M.message}finally{f[Z]=!1}}function oe(){y.value=!0}async function re(){y.value=!1,v.value=!0,await Promise.all([r.fetchServers(),i.fetchState()]),o.addToast({type:"success",title:"Server added",message:"It is in quarantine. Review and approve from the Servers page."})}async function fe(){i.isEngaged||await i.markEngaged(),n("close")}fs(()=>{s.show&&(i.fetchState(),D(),Q(),G(),gt(),$())});const ae=(Z,{emit:M})=>{const it=Z.client;return ee("div",{class:"flex items-center justify-between p-2 rounded-lg border border-base-300","data-test":`client-row-${it.id}`},[ee("div",{class:"min-w-0 flex-1"},[ee("div",{class:"font-medium text-sm truncate"},it.name),ee("div",{class:"text-xs opacity-50 truncate",title:it.config_path},it.config_path)]),ee("div",{class:"flex-shrink-0 ml-2"},[it.supported?it.exists?it.connected?ee("span",{class:"badge badge-success badge-sm"},"Connected"):ee("button",{class:"btn btn-primary btn-xs",disabled:Z.busy,"data-test":`connect-${it.id}`,onClick:()=>M("connect",it.id)},Z.busy?[ee("span",{class:"loading loading-spinner loading-xs"})]:["Connect"]):ee("span",{class:"text-xs opacity-40"},"Not installed"):ee("span",{class:"badge badge-ghost badge-sm"},it.reason||"Not supported")])])};return ae.props={client:{type:Object,required:!0},busy:{type:Boolean,default:!1}},ae.emits=["connect"],(Z,M)=>{const it=ko("router-link");return x(),w(wt,null,[d("dialog",{open:Z.show,class:"modal modal-bottom sm:modal-middle"},[d("div",{class:"modal-box p-0 overflow-hidden flex flex-col",style:li(rt.value)},[d("div",Qx,[d("div",null,[M[6]||(M[6]=d("h3",{class:"font-bold text-lg"},"MCPProxy setup",-1)),d("p",tw,[ct(i).incompleteTabCount>0?(x(),w(wt,{key:0},[mt(z(ct(i).incompleteTabCount)+" "+z(ct(i).incompleteTabCount===1?"step":"steps")+" still to do ",1)],64)):(x(),w(wt,{key:1},[mt("You're all set up.")],64))])]),d("button",{class:"btn btn-ghost btn-sm btn-square",onClick:fe,"aria-label":"Close"},"βœ•")]),d("div",ew,[(x(!0),w(wt,null,Vt(j.value,q=>(x(),w("a",{key:q.id,role:"tab",class:yt(["tab gap-2",{"tab-active text-primary":a.value===q.id}]),"data-test":`tab-${q.id}`,onClick:jt=>a.value=q.id},[d("span",{class:yt(["inline-flex items-center justify-center w-5 h-5 rounded-full text-[11px] font-semibold",q.complete?"bg-success text-success-content":"bg-base-300 text-base-content/60"])},[q.complete?(x(),w("span",nw,"βœ“")):(x(),w("span",iw,z(q.idx),1))],2),d("span",null,z(q.label),1)],10,sw))),128))]),d("div",ow,[a.value==="clients"?(x(),w("section",rw,[M[20]||(M[20]=d("p",{class:"text-sm opacity-70 mb-4"}," Pick at least one AI tool. MCPProxy registers itself in that tool's config so the assistant can talk to mcpproxy. A timestamped backup is created before any file is modified. ",-1)),c.value?(x(),w("div",aw,[...M[7]||(M[7]=[d("span",{class:"loading loading-spinner loading-md"},null,-1)])])):u.value?(x(),w("div",lw,[d("span",cw,z(u.value),1)])):(x(),w(wt,{key:2},[ut.value.length>0?(x(),w("div",uw,[M[8]||(M[8]=d("div",{class:"text-[11px] font-semibold uppercase tracking-wider opacity-50"},"Detected on this machine",-1)),(x(!0),w(wt,null,Vt(ut.value,q=>(x(),is(ae,{key:q.id,client:q,busy:f[q.id],onConnect:Et},null,8,["client","busy"]))),128))])):J("",!0),St.value.length>0?(x(),w("div",dw,[M[9]||(M[9]=d("div",{class:"text-[11px] font-semibold uppercase tracking-wider opacity-50"},"Most popular",-1)),(x(!0),w(wt,null,Vt(St.value,q=>(x(),is(ae,{key:q.id,client:q,busy:f[q.id],onConnect:Et},null,8,["client","busy"]))),128))])):J("",!0),m.value.length>0?(x(),w("details",fw,[d("summary",hw,[M[10]||(M[10]=d("span",{class:"transition-transform group-open:rotate-90"},"β–Έ",-1)),mt(" Show "+z(m.value.length)+" more "+z(m.value.length===1?"client":"clients"),1)]),d("div",pw,[(x(!0),w(wt,null,Vt(m.value,q=>(x(),is(ae,{key:q.id,client:q,busy:f[q.id],onConnect:Et},null,8,["client","busy"]))),128))])])):J("",!0),h.value?(x(),w("div",gw,[d("div",{class:yt(["alert alert-sm",g.value?"alert-success":"alert-error"])},[d("span",mw,z(h.value),1)],2)])):J("",!0)],64)),d("details",vw,[M[19]||(M[19]=d("summary",{class:"cursor-pointer text-sm font-medium opacity-80 hover:opacity-100 select-none flex items-center gap-1"},[d("span",{class:"transition-transform group-open:rotate-90"},"β–Έ"),mt(" Show security settings ")],-1)),d("div",yw,[d("div",bw,[d("div",_w,[M[17]||(M[17]=d("div",{class:"font-medium"},"Bind interface",-1)),d("div",xw,[M[12]||(M[12]=mt(" mcpproxy is listening on ",-1)),d("code",ww,z(k.value||"localhost"),1),M[13]||(M[13]=mt(". To expose it on the LAN, edit ",-1)),M[14]||(M[14]=d("span",{class:"opacity-80"},"listen",-1)),M[15]||(M[15]=mt(" in ",-1)),ht(it,{to:"/settings",class:"link link-primary"},{default:$t(()=>[...M[11]||(M[11]=[mt("Settings β†’ Configuration",-1)])]),_:1}),M[16]||(M[16]=mt(". ",-1))])])]),d("div",kw,[d("input",{type:"checkbox",class:"checkbox checkbox-sm mt-0.5",checked:b.value,disabled:E.value,onChange:M[0]||(M[0]=q=>_t(q.target.checked)),"data-test":"toggle-require-mcp-auth"},null,40,Sw),M[18]||(M[18]=d("div",{class:"flex-1 min-w-0"},[d("div",{class:"font-medium"},"Require API key on /mcp"),d("div",{class:"text-xs opacity-60 mt-0.5"}," On by default for LAN-bound mcpproxy. Off-by-default keeps localhost-only setup frictionless. ")],-1))])])])])):a.value==="servers"?(x(),w("section",Cw,[M[25]||(M[25]=d("p",{class:"text-sm opacity-70 mb-4"},[mt(" Pick which servers from your existing AI clients to import. Same name in multiple sources? We auto-rename collisions like "),d("code",{class:"font-mono text-[11px] bg-base-200 px-1 rounded"},"mcpproxy_claude_code"),mt(" so each entry stays distinct. ")],-1)),U.value?(x(),w("div",Aw,[...M[21]||(M[21]=[d("span",{class:"loading loading-spinner loading-md"},null,-1)])])):N.value.length===0?(x(),w("div",Iw," No client configs with importable servers detected on this machine. ")):(x(),w("div",Mw,[(x(!0),w(wt,null,Vt(N.value,(q,jt)=>(x(),w("div",{key:q.path,"data-test":`import-section-${q.format}`,class:yt(jt>0?"border-t border-base-300":"")},[d("label",Tw,[d("input",{type:"checkbox",class:"checkbox checkbox-sm mt-0.5",checked:st(q),".indeterminate":At(q),"data-test":`select-all-${q.format}`,onChange:zt=>K(q,zt.target.checked)},null,40,Pw),d("div",Ow,[d("div",Rw,[d("span",null,z(q.name),1),d("span",$w,"β€” "+z(q.serverCount)+" server"+z(q.serverCount===1?"":"s"),1)]),d("div",{class:"text-[11px] opacity-50 truncate font-mono",title:q.path},z(q.path),9,Lw)])]),d("ul",Dw,[(x(!0),w(wt,null,Vt(q.serverNames,zt=>(x(),w("li",{key:zt,class:"flex items-center gap-3 pl-10 pr-3 py-2 relative hover:bg-base-200/40"},[M[23]||(M[23]=d("span",{class:"absolute left-5 top-0 bottom-0 w-px bg-base-300","aria-hidden":"true"},null,-1)),d("label",Fw,[d("input",{type:"checkbox",class:"checkbox checkbox-sm",checked:W(q.path,zt),"data-test":`server-checkbox-${q.format}-${zt}`,onChange:ps=>Y(q.path,zt,ps.target.checked)},null,40,Nw),d("span",jw,z(zt),1)]),dt(q,zt)?(x(),w("span",{key:0,class:"badge badge-warning badge-sm gap-1 shrink-0 font-normal",title:`This name conflicts across sources β€” will be imported as ${dt(q,zt)}`},[M[22]||(M[22]=mt(" β†’ ",-1)),d("code",Bw,z(dt(q,zt)),1)],8,zw)):J("",!0)]))),128))])],10,Ew))),128))])),at.value?(x(),w("div",{key:3,class:yt(["alert mb-4",F.value?"alert-success":"alert-error"])},[d("span",Hw,z(at.value),1)],2)):J("",!0),d("details",Ww,[M[24]||(M[24]=d("summary",{class:"cursor-pointer font-medium flex items-center gap-2 select-none"},[d("span",{class:"transition-transform group-open:rotate-90"},"β–Έ"),mt(" Add a single server manually instead ")],-1)),d("div",Uw,[d("button",{class:"btn btn-primary btn-sm w-full",onClick:oe,"data-test":"add-server-button"}," Open the add-server form "),v.value?(x(),w("p",Vw," βœ“ Server added β€” it's currently in quarantine. Review it on the Servers page after this wizard. ")):ct(i).hasConfiguredServer?(x(),w("p",qw,z(p.value)+" configured. ",1)):J("",!0)])])])):a.value==="verify"?(x(),w("section",Kw,[ct(i).firstMCPClientEver?(x(),w("div",Yw,[M[27]||(M[27]=d("div",{class:"text-4xl"},"βœ…",-1)),M[28]||(M[28]=d("div",{class:"font-semibold text-lg"},"Round-trip verified",-1)),M[29]||(M[29]=d("div",{class:"text-sm opacity-70 max-w-md"}," We've seen at least one MCP request from your AI client(s). mcpproxy is wired up correctly. ",-1)),ct(i).mcpClientsSeenEver.length>0?(x(),w("div",Gw,[M[26]||(M[26]=mt(" Recognized: ",-1)),d("span",Zw,z(ct(i).mcpClientsSeenEver.join(", ")),1)])):J("",!0)])):(x(),w("div",Jw,[...M[30]||(M[30]=[Ve('
πŸ“‘
Waiting for your first request
Open your AI agent and ask it to call retrieve_tools through mcpproxy. We'll detect the round-trip live.
Listening…
',4)])])),M[37]||(M[37]=Ve('
Try one of these prompts
  • "Search for MCP filesystem tools." β†’ retrieve_tools
  • "List my upstream MCP servers and their connection status." β†’ upstream_servers
  • "Show me tools pending quarantine approval in mcpproxy." β†’ quarantine_security
',1)),d("div",Xw,[d("div",Qw,[M[32]||(M[32]=d("div",{class:"text-[11px] font-semibold uppercase tracking-wider opacity-50"},"Recent activity",-1)),ht(it,{to:"/activity",class:"text-[11px] link link-primary opacity-80 hover:opacity-100","data-test":"link-activity-log"},{default:$t(()=>[...M[31]||(M[31]=[mt(" View all in Activity Log β†’ ",-1)])]),_:1})]),T.value?(x(),w("div",t2,[...M[33]||(M[33]=[d("span",{class:"loading loading-spinner loading-sm"},null,-1)])])):V.value.length===0?(x(),w("div",e2,[M[35]||(M[35]=mt(" Once your AI starts calling tools, every request shows up here β€” and in the ",-1)),ht(it,{to:"/activity",class:"link link-primary"},{default:$t(()=>[...M[34]||(M[34]=[mt("Activity Log",-1)])]),_:1}),M[36]||(M[36]=mt(". ",-1))])):(x(),w("ul",s2,[(x(!0),w(wt,null,Vt(V.value,q=>(x(),w("li",{key:q.id,class:"flex items-center gap-3 px-3 py-2 rounded-lg bg-base-200/60 text-sm"},[d("span",{class:yt(["badge badge-xs shrink-0",q.status==="success"?"badge-success":q.status==="error"?"badge-error":"badge-warning"]),title:q.status},z(q.status==="success"?"βœ“":q.status==="error"?"βœ—":"!"),11,n2),d("span",i2,z(tt(q.timestamp)),1),d("span",o2,[q.server_name?(x(),w("span",r2,z(q.server_name)+":",1)):J("",!0),mt(z(q.tool_name||q.type),1)]),q.duration_ms!==void 0?(x(),w("span",a2,z(q.duration_ms)+"ms",1)):J("",!0)]))),128))]))])])):J("",!0)]),a.value==="servers"&&N.value.length>0?(x(),w("div",l2,[d("details",c2,[M[48]||(M[48]=Ve('β–ΈRuntime isolation and MCP server quarantineGlobal settings',1)),d("div",u2,[d("label",d2,[d("input",{type:"checkbox",class:"checkbox checkbox-sm mt-0.5",checked:S.value,disabled:E.value||B.value===!1,onChange:M[1]||(M[1]=q=>It(q.target.checked)),"data-test":"toggle-docker-isolation"},null,40,f2),d("div",h2,[M[39]||(M[39]=d("div",{class:"font-medium text-sm"},"Docker isolation",-1)),M[40]||(M[40]=d("p",{class:"text-xs opacity-70 mt-1 leading-relaxed"}," Sandboxes every stdio server in a throwaway Docker container so a compromised server can't read or write your host files, env vars, or SSH keys. Recommended whenever you import servers from sources you don't fully control. ",-1)),B.value===!1?(x(),w("p",p2,[...M[38]||(M[38]=[mt(" Docker isn't running on this machine. Install ",-1),d("a",{href:"https://www.docker.com/products/docker-desktop/",target:"_blank",rel:"noopener",class:"link"},"Docker Desktop",-1),mt(" (or start the Docker daemon) then come back to enable this β€” stdio servers run unsandboxed otherwise. ",-1)])])):J("",!0),M[41]||(M[41]=d("p",{class:"text-[11px] mt-2"},[d("a",{href:"https://docs.mcpproxy.app/security/docker-isolation/",target:"_blank",rel:"noopener",class:"link link-primary"},"Learn more about Docker isolation β†’")],-1))])]),d("label",g2,[d("input",{type:"checkbox",class:"checkbox checkbox-sm mt-0.5",checked:_.value,disabled:E.value,onChange:M[2]||(M[2]=q=>Nt(q.target.checked)),"data-test":"toggle-quarantine"},null,40,m2),d("div",v2,[M[45]||(M[45]=d("div",{class:"font-medium text-sm"},"Quarantine new servers",-1)),M[46]||(M[46]=d("p",{class:"text-xs mt-1 leading-relaxed"},[d("strong",null,"Recommended."),mt(" Holds every newly added server in a quarantine zone until you explicitly approve it. Defends against tool-poisoning attacks where a malicious server smuggles instructions into tool descriptions. "),d("strong",null,"Important:"),mt(" your AI agent itself can add upstream servers via mcpproxy's built-in MCP tools β€” your approval is the only safety net. ")],-1)),d("p",y2,[M[43]||(M[43]=mt(" Combine with security scanners (Trivy, Semgrep, MCP Scan) on the ",-1)),ht(it,{to:"/servers",class:"link link-primary"},{default:$t(()=>[...M[42]||(M[42]=[mt("Servers",-1)])]),_:1}),M[44]||(M[44]=mt(" page for deeper supply-chain checks before approving. ",-1))]),M[47]||(M[47]=d("p",{class:"text-[11px] mt-2"},[d("a",{href:"https://docs.mcpproxy.app/security/quarantine/",target:"_blank",rel:"noopener",class:"link link-primary"},"Learn more about quarantine β†’")],-1))])])])]),d("div",b2,[d("div",_2,[O.value===0?(x(),w("span",x2,"Select at least one server to import")):(x(),w("span",w2,[d("span",k2,z(O.value),1),M[50]||(M[50]=d("span",{class:"opacity-70"}," selected",-1)),Pt.value>0?(x(),w("span",S2,[M[49]||(M[49]=mt(" Β· ",-1)),d("span",C2,z(Pt.value)+" renamed",1)])):J("",!0)]))]),d("div",A2,[d("button",{class:"btn btn-ghost btn-sm",onClick:fe,"data-test":"close-wizard"},"Close"),d("button",{class:"btn btn-secondary btn-sm gap-1 min-w-[180px]",disabled:O.value===0||R.value,onClick:M[3]||(M[3]=q=>lt(!1)),"data-test":"bulk-import-active"},[H.value==="active"?(x(),w("span",M2)):(x(),w("span",E2,"⚑")),M[51]||(M[51]=mt(" Import as active ",-1))],8,I2),d("button",{class:"btn btn-primary btn-sm gap-1 min-w-[180px]",disabled:O.value===0||R.value||!_.value,title:_.value?"":"Re-enable Quarantine new servers above to use this option",onClick:M[4]||(M[4]=q=>lt(!0)),"data-test":"bulk-import-quarantine"},[H.value==="quarantine"?(x(),w("span",P2)):(x(),w("span",O2,"πŸ›‘")),M[52]||(M[52]=mt(" Import & quarantine ",-1))],8,T2)])])])):(x(),w("div",R2,[M[53]||(M[53]=d("div",{class:"text-xs opacity-50"},[mt(" Tip: you can always re-open this from the sidebar's "),d("span",{class:"font-medium"},"Setup"),mt(" entry. ")],-1)),d("button",{class:"btn btn-primary btn-sm",onClick:fe,"data-test":"close-wizard"},z(ct(i).incompleteTabCount===0?"Done":"Close for now"),1)]))],4),d("form",{method:"dialog",class:"modal-backdrop",onClick:mn(fe,["prevent"])},[...M[54]||(M[54]=[d("button",null,"close",-1)])])],8,Xx),ht(na,{show:y.value,onClose:M[5]||(M[5]=q=>y.value=!1),onAdded:re},null,8,["show"])],64)}}}),L2={class:"space-y-6"},D2={key:0,class:"alert alert-warning"},F2={class:"flex-1"},N2={class:"font-bold"},j2={class:"text-sm space-y-1 mt-1"},z2={class:"opacity-70"},B2=["onClick"],H2=["onClick"],W2=["onClick"],U2={key:0,class:"text-xs opacity-60"},V2={key:1,class:"alert alert-warning"},q2={class:"flex-1"},K2={class:"font-bold"},Y2={class:"text-sm space-y-1 mt-1"},G2={class:"opacity-70"},Z2={key:0,class:"text-xs opacity-60"},J2={class:"grid grid-cols-1 lg:grid-cols-[280px_1fr_280px] gap-0 min-h-[520px] relative"},X2={class:"flex flex-col justify-center items-center lg:items-end space-y-3 py-6 lg:pr-0"},Q2={class:"card card-compact bg-base-100 shadow-sm border border-base-300 w-full max-w-[260px]"},tk={class:"card-body py-3 px-4"},ek={key:0,class:"mb-1"},sk={class:"text-sm font-medium"},nk={key:1},ik={class:"text-xs opacity-40 mt-1"},ok={key:2,class:"text-sm opacity-50 text-center py-2"},rk={class:"flex flex-col gap-2 w-full max-w-[260px] pt-3"},ak={class:"flex flex-col items-center justify-center relative py-6"},lk={class:"mb-6 z-10"},ck={key:0,class:"badge badge-lg gap-1 px-4 py-3 bg-primary/10 text-primary border-primary/30"},uk={class:"text-lg font-bold"},dk={class:"relative z-10"},fk=["src"],hk={class:"text-center mt-1 select-none"},pk={key:0,class:"text-[10px] opacity-50"},gk={class:"z-10 w-full max-w-[300px] space-y-2 mt-4"},mk={key:0,class:"font-medium"},vk={key:1,class:"font-medium"},yk={key:0,class:"font-medium"},bk={key:1,class:"font-medium"},_k={class:"flex flex-col justify-center items-center lg:items-start space-y-3 py-6 lg:pl-4"},xk={class:"card-body py-3 px-4"},wk={class:"flex items-center gap-2"},kk={class:"text-2xl font-bold leading-none"},Sk={class:"text-sm mt-1"},Ck={class:"font-bold"},Ak={key:0,class:"text-xs opacity-50 mt-0.5"},Ik={class:"card-body py-3 px-4"},Mk={class:"flex items-center gap-2"},Ek={class:"text-lg font-bold text-warning leading-none"},Tk={class:"flex flex-col gap-2 w-full max-w-[240px] pt-3"},Pk={key:0,class:"badge badge-ghost badge-xs ml-1"},Ok={key:1,class:"badge badge-warning badge-xs ml-1"},Rk={key:2,class:"collapse collapse-arrow bg-base-100 shadow-sm border border-base-300"},$k={class:"collapse-title font-medium flex items-center gap-3"},Lk={class:"badge badge-success badge-sm ml-auto"},Dk={class:"collapse-content"},Fk={class:"grid grid-cols-1 lg:grid-cols-2 gap-6 pt-2"},Nk={class:"grid grid-cols-3 gap-4"},jk={class:"text-2xl font-bold text-success"},zk={class:"text-xs opacity-60"},Bk={class:"text-xl font-bold"},Hk={class:"text-xl font-bold"},Wk={class:"flex items-center justify-center"},Uk={class:"w-48 h-48"},Vk={class:"mt-3 space-y-1.5 max-h-32 overflow-y-auto"},qk={class:"flex items-center space-x-2 min-w-0"},Kk={class:"truncate text-xs"},Yk={class:"flex items-center space-x-2 flex-shrink-0"},Gk={class:"font-mono text-xs"},Zk={class:"text-xs opacity-50"},Jk=ie({__name:"Dashboard",setup(e){const t=pi(),s=hs(),n=sa(),i=X(!1),o=X(!1);let r=null;const a=X([]),l=ot(()=>a.value.filter(K=>K.connected).map(K=>K.name)),c=ot(()=>a.value.filter(K=>K.supported&&!K.connected&&K.exists).map(K=>K.name)),u=async()=>{try{const K=await pt.getConnectStatus();K.success&&K.data&&(a.value=Array.isArray(K.data)?K.data:[])}catch{}},f=X(0),h=async()=>{try{const K=await pt.getActivitySummary("24h");K.success&&K.data&&(f.value=K.data.total_count||0)}catch{}},g=X(null),y=X(null),{totalFindings:v,totalScans:b,loaded:S}=Ib(),_=async()=>{try{const K=await pt.getDockerStatus();if(K.success&&K.data){let O=K.data.docker_available??!1;!O&&t.servers.some(bt=>bt.connected&&bt.protocol==="stdio")&&(O=!0),g.value={available:O}}}catch{g.value={available:!1}}try{const K=await pt.getConfig();if(K.success&&K.data){const O=K.data.config;y.value=(O==null?void 0:O.quarantine_enabled)??!0}}catch{y.value=!0}},k=X(0);ve(()=>s.isRunning,K=>{K&&!k.value&&(k.value=Date.now())},{immediate:!0});const E=ot(()=>{var O;if(!s.isRunning)return"";const K=(O=s.status)==null?void 0:O.timestamp;if(K&&K>0&&k.value){const bt=Math.floor((Date.now()-k.value)/1e3);return bt<60?"just started":bt<3600?`${Math.floor(bt/60)}m uptime`:bt<86400?`${Math.floor(bt/3600)}h uptime`:`${Math.floor(bt/86400)}d uptime`}return"online"}),B=X([]),L=async()=>{try{const K=await pt.getSessions(5);K.success&&K.data&&(B.value=K.data.sessions||[])}catch{}},U=X(null),V=async()=>{try{const K=await pt.getTokenStats();K.success&&K.data&&(U.value=K.data)}catch{}},T=ot(()=>t.serverCount.total-t.serverCount.connected-t.serverCount.quarantined),I=ot(()=>t.servers.filter(K=>!K.health||K.health.admin_state==="disabled"||K.health.admin_state==="quarantined"?!1:!!(K.health.level==="unhealthy"||K.health.level==="degraded"&&K.health.action))),H=X([]),R=ot(()=>H.value.filter(K=>K.count>0)),at=ot(()=>R.value.reduce((K,O)=>K+O.count,0)),F=async()=>{try{const K=t.servers.filter(dt=>dt.enabled),O=[],bt=K.map(async dt=>{var Pt;try{const Ct=await pt.getToolApprovals(dt.name);if(Ct.success&&((Pt=Ct.data)!=null&&Pt.tools)){const j=Ct.data.tools.filter(rt=>rt.status==="pending"||rt.status==="changed").length;j>0&&O.push({serverName:dt.name,count:j})}}catch{}});await Promise.all(bt),O.sort((dt,Pt)=>Pt.count-dt.count),H.value=O}catch{}},N=async(K,O)=>{try{switch(O){case"oauth_login":await t.triggerOAuthLogin(K),s.addToast({type:"success",title:"OAuth Login",message:`OAuth login initiated for ${K}`});break;case"restart":await t.restartServer(K),s.addToast({type:"success",title:"Server Restarted",message:`${K} is restarting`});break;case"enable":await t.enableServer(K),s.addToast({type:"success",title:"Server Enabled",message:`${K} has been enabled`});break;default:console.warn(`Unknown action: ${O}`)}setTimeout(()=>t.fetchServers(),1e3)}catch(bt){s.addToast({type:"error",title:"Action Failed",message:bt instanceof Error?bt.message:"Unknown error"})}},P=()=>{o.value=!1,t.fetchServers(),s.addToast({type:"success",title:"Server Added",message:"New server has been added successfully"})},W=K=>K>=1e6?`${(K/1e6).toFixed(1)}M`:K>=1e3?`${(K/1e3).toFixed(1)}K`:K.toString(),Y=["#3b82f6","#10b981","#f59e0b","#ec4899","#8b5cf6","#06b6d4","#ef4444","#14b8a6","#f97316","#a855f7","#6366f1","#84cc16","#f43f5e","#0ea5e9","#22c55e","#eab308"],st=ot(()=>{var Pt;if(!((Pt=U.value)!=null&&Pt.per_server_tool_list_sizes))return[];const K=U.value.per_server_tool_list_sizes,O=Object.entries(K).sort((Ct,j)=>j[1]-Ct[1]),bt=O.reduce((Ct,[,j])=>Ct+j,0);let dt=0;return O.map(([Ct,j],rt)=>{const nt=j,ut=bt>0?nt/bt*100:0,St={name:Ct,value:nt,percentage:ut,offset:dt,color:Y[rt%Y.length]};return dt+=ut,St})}),At=ot(()=>{const K=[];return K.push({icon:"πŸ’‘",title:"CLI Commands for Managing MCPProxy",description:"Useful commands for working with MCPProxy",sections:[{title:"View all servers",codeBlock:{language:"bash",code:`# List all upstream servers -mcpproxy upstream list`}},{title:"Search for tools",codeBlock:{language:"bash",code:`# Search across all server tools -mcpproxy tools search "your query" - -# List tools from specific server -mcpproxy tools list --server=server-name`}},{title:"Connect to AI clients",codeBlock:{language:"bash",code:`# Register MCPProxy in Claude Desktop -mcpproxy connect claude-desktop - -# List all detected clients -mcpproxy connect --list`}}]}),K.push({icon:"πŸ€–",title:"Use MCPProxy with LLM Agents",description:"Connect Claude or other LLM agents to MCPProxy",sections:[{title:"Example LLM prompts",list:["Search for tools related to GitHub issues across all my MCP servers","List all available MCP servers and their connection status","Add a new MCP server from npm package @modelcontextprotocol/server-filesystem","Show me statistics about which tools are being used most frequently"]},{title:"Configure Claude Desktop",text:"Add MCPProxy to your Claude Desktop config:",codeBlock:{language:"json",code:`{ - "mcpServers": { - "mcpproxy": { - "command": "mcpproxy", - "args": ["serve"], - "env": {} - } - } -}`}}]}),K});return fs(()=>{u(),V(),h(),L(),_(),no(),t.fetchServers().then(()=>F()),r=setInterval(()=>{u(),V(),h(),L(),_(),no(),F()},3e4),s.connectEventSource(),t.fetchServers(),n.fetchState().then(K=>{K!=null&&K.should_show_wizard&&n.openWizard()})}),gn(()=>{r&&(clearInterval(r),r=null)}),(K,O)=>{const bt=ko("router-link");return x(),w("div",L2,[ht(Yb),I.value.length>0?(x(),w("div",D2,[O[8]||(O[8]=d("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.732-.833-2.5 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})],-1)),d("div",F2,[d("h3",N2,z(I.value.length)+" server"+z(I.value.length!==1?"s":"")+" need"+z(I.value.length===1?"s":"")+" attention",1),d("div",j2,[(x(!0),w(wt,null,Vt(I.value.slice(0,3),dt=>{var Pt,Ct,j,rt,nt,ut,St;return x(),w("div",{key:dt.name,class:"flex items-center gap-2"},[d("span",{class:yt(((Pt=dt.health)==null?void 0:Pt.level)==="unhealthy"?"text-error":"text-warning")},"●",2),ht(bt,{to:`/servers/${dt.name}`,class:"font-medium link link-hover"},{default:$t(()=>[mt(z(dt.name),1)]),_:2},1032,["to"]),d("span",z2,z((Ct=dt.health)==null?void 0:Ct.summary),1),((j=dt.health)==null?void 0:j.action)==="login"?(x(),w("button",{key:0,onClick:m=>N(dt.name,"oauth_login"),class:"btn btn-xs btn-primary"}," Login ",8,B2)):J("",!0),((rt=dt.health)==null?void 0:rt.action)==="restart"?(x(),w("button",{key:1,onClick:m=>N(dt.name,"restart"),class:"btn btn-xs btn-primary"}," Restart ",8,H2)):J("",!0),((nt=dt.health)==null?void 0:nt.action)==="enable"?(x(),w("button",{key:2,onClick:m=>N(dt.name,"enable"),class:"btn btn-xs btn-primary"}," Enable ",8,W2)):J("",!0),((ut=dt.health)==null?void 0:ut.action)==="set_secret"?(x(),is(bt,{key:3,to:"/secrets",class:"btn btn-xs btn-primary"},{default:$t(()=>[...O[5]||(O[5]=[mt(" Set Secret ",-1)])]),_:1})):J("",!0),((St=dt.health)==null?void 0:St.action)==="configure"?(x(),is(bt,{key:4,to:`/servers/${dt.name}?tab=config`,class:"btn btn-xs btn-primary"},{default:$t(()=>[...O[6]||(O[6]=[mt(" Configure ",-1)])]),_:1},8,["to"])):J("",!0)])}),128)),I.value.length>3?(x(),w("div",U2," ... and "+z(I.value.length-3)+" more ",1)):J("",!0)])]),ht(bt,{to:"/servers",class:"btn btn-sm"},{default:$t(()=>[...O[7]||(O[7]=[mt(" View All Servers ",-1)])]),_:1})])):J("",!0),at.value>0?(x(),w("div",V2,[O[11]||(O[11]=d("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1)),d("div",q2,[d("h3",K2,z(at.value)+" tool"+z(at.value!==1?"s":"")+" pending approval across "+z(R.value.length)+" server"+z(R.value.length!==1?"s":""),1),d("div",Y2,[(x(!0),w(wt,null,Vt(R.value.slice(0,5),dt=>(x(),w("div",{key:dt.serverName,class:"flex items-center gap-2"},[O[9]||(O[9]=d("span",{class:"text-warning"},"●",-1)),ht(bt,{to:`/servers/${dt.serverName}`,class:"font-medium link link-hover"},{default:$t(()=>[mt(z(dt.serverName),1)]),_:2},1032,["to"]),d("span",G2,z(dt.count)+" tool"+z(dt.count!==1?"s":"")+" pending",1)]))),128)),R.value.length>5?(x(),w("div",Z2," ... and "+z(R.value.length-5)+" more server"+z(R.value.length-5!==1?"s":""),1)):J("",!0)])]),ht(bt,{to:"/servers",class:"btn btn-sm"},{default:$t(()=>[...O[10]||(O[10]=[mt(" Review Tools ",-1)])]),_:1})])):J("",!0),d("div",J2,[d("div",X2,[O[15]||(O[15]=d("h3",{class:"text-xs font-bold uppercase tracking-widest opacity-40 mb-1 w-full max-w-[260px] text-center lg:text-right"},"AI Agents",-1)),d("div",Q2,[d("div",tk,[l.value.length>0?(x(),w("div",ek,[O[12]||(O[12]=d("div",{class:"flex items-center gap-2 mb-1"},[d("div",{class:"w-2.5 h-2.5 rounded-full bg-success flex-shrink-0"}),d("span",{class:"text-xs font-bold uppercase tracking-wide opacity-50"},"Connected")],-1)),d("div",sk,z(l.value.join(", ")),1)])):J("",!0),c.value.length>0?(x(),w("div",nk,[d("div",ik,"Available: "+z(c.value.join(", ")),1)])):J("",!0),l.value.length===0&&c.value.length===0?(x(),w("div",ok," No clients detected ")):J("",!0)])]),d("div",rk,[d("button",{onClick:O[0]||(O[0]=dt=>i.value=!0),class:"btn btn-primary btn-sm w-full gap-1"}," Connect Clients "),d("button",{onClick:O[1]||(O[1]=dt=>o.value=!0),class:"btn btn-secondary btn-outline btn-sm w-full gap-1"},[...O[13]||(O[13]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"})],-1),mt(" Import from client configs ",-1)])]),ht(bt,{to:"/sessions",class:"btn btn-ghost btn-sm w-full gap-1"},{default:$t(()=>[...O[14]||(O[14]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"})],-1),mt(" Recent Sessions ",-1)])]),_:1})])]),d("div",ak,[O[21]||(O[21]=Ve('',1)),d("div",lk,[U.value&&U.value.saved_tokens_percentage>0?(x(),w("div",ck,[O[16]||(O[16]=d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"})],-1)),d("span",uk,z(U.value.saved_tokens_percentage>=99.995?"99.99":U.value.saved_tokens_percentage>=10?U.value.saved_tokens_percentage.toFixed(1):U.value.saved_tokens_percentage.toFixed(0))+"%",1),O[17]||(O[17]=d("span",{class:"text-xs font-medium"},"tokens saved",-1))])):J("",!0)]),d("div",dk,[d("div",{class:yt(["w-36 h-36 flex items-center justify-center transition-all duration-500",ct(s).isRunning?"hub-glow":""])},[d("img",{src:ct(td),alt:"MCPProxy",class:"w-28 h-28"},null,8,fk)],2),d("div",hk,[d("div",{class:yt(["text-xs font-bold uppercase tracking-wider",ct(s).isRunning?"text-primary":"text-base-content/60"])}," MCPProxy ",2),d("div",{class:yt(["text-xs font-medium",ct(s).isRunning?"text-success":"text-error"])},z(ct(s).isRunning?"active":"stopped"),3),E.value?(x(),w("div",pk,z(E.value),1)):J("",!0)])]),d("div",gk,[g.value?(x(),w("div",{key:0,class:yt(["flex items-center gap-2 text-xs px-3 py-2 rounded-lg",g.value.available?"bg-success/10 text-success":"bg-warning/10 text-warning"])},[O[18]||(O[18]=d("svg",{class:"w-4 h-4 flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"})],-1)),g.value.available?(x(),w("span",mk,"Docker isolation active")):(x(),w("span",vk,"Docker isolation disabled β€” enable Docker to protect your system"))],2)):J("",!0),y.value!==null?(x(),w("div",{key:1,class:yt(["flex items-center gap-2 text-xs px-3 py-2 rounded-lg",y.value?"bg-success/10 text-success":"bg-warning/10 text-warning"])},[O[19]||(O[19]=d("svg",{class:"w-4 h-4 flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1)),y.value?(x(),w("span",yk,"Quarantine protection active")):(x(),w("span",bk,"Quarantine disabled β€” enable to prevent prompt injection attacks"))],2)):J("",!0),ht(bt,{to:"/activity",class:"flex items-center gap-2 text-xs px-3 py-2 rounded-lg bg-base-100/50 border border-base-300 hover:bg-base-200 transition-colors"},{default:$t(()=>[...O[20]||(O[20]=[d("svg",{class:"w-4 h-4 flex-shrink-0 opacity-60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"})],-1),d("span",{class:"font-medium opacity-70"},"Activity Log",-1)])]),_:1})])]),d("div",_k,[O[31]||(O[31]=d("h3",{class:"text-xs font-bold uppercase tracking-widest opacity-40 mb-1 w-full max-w-[240px] text-center lg:text-left"},"Upstream Servers",-1)),ht(bt,{to:"/servers",class:"card card-compact bg-base-100 shadow-sm border border-base-300 w-full max-w-[240px] hover:shadow-md transition-shadow"},{default:$t(()=>[d("div",xk,[d("div",wk,[O[22]||(O[22]=d("div",{class:"w-2.5 h-2.5 rounded-full bg-success flex-shrink-0"},null,-1)),d("span",kk,z(ct(t).serverCount.connected),1),O[23]||(O[23]=d("span",{class:"text-sm opacity-60"},"connected",-1))]),d("div",Sk,[d("span",Ck,z(ct(t).totalTools),1),O[24]||(O[24]=d("span",{class:"opacity-60"}," tools available",-1))]),T.value>0?(x(),w("div",Ak,z(T.value)+" disabled ",1)):J("",!0)])]),_:1}),ct(t).serverCount.quarantined>0?(x(),is(bt,{key:0,to:"/servers",class:"card card-compact bg-warning/10 border border-warning/30 w-full max-w-[240px] hover:shadow-md transition-shadow"},{default:$t(()=>[d("div",Ik,[d("div",Mk,[O[25]||(O[25]=d("svg",{class:"w-4 h-4 text-warning flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1)),d("span",Ek,z(ct(t).serverCount.quarantined),1),O[26]||(O[26]=d("span",{class:"text-sm"},"in quarantine",-1))])])]),_:1})):J("",!0),d("div",Tk,[d("button",{onClick:O[2]||(O[2]=dt=>o.value=!0),class:"btn btn-primary btn-sm w-full gap-1"},[...O[27]||(O[27]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 6v6m0 0v6m0-6h6m-6 0H6"})],-1),mt(" Add Server ",-1)])]),ht(bt,{to:"/repositories",class:"btn btn-ghost btn-sm w-full gap-1"},{default:$t(()=>[...O[28]||(O[28]=[d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1),mt(" Browse Registry ",-1)])]),_:1}),ht(bt,{to:"/security",class:"btn btn-ghost btn-sm w-full gap-1"},{default:$t(()=>[O[29]||(O[29]=d("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1)),O[30]||(O[30]=mt(" Security Scan ",-1)),ct(S)&&ct(b)===0?(x(),w("span",Pk,"Run first scan")):ct(v)>0?(x(),w("span",Ok,z(ct(v))+" issue"+z(ct(v)===1?"":"s"),1)):J("",!0)]),_:1})])])]),U.value?(x(),w("div",Rk,[O[39]||(O[39]=d("input",{type:"checkbox"},null,-1)),d("div",$k,[O[32]||(O[32]=d("svg",{class:"w-5 h-5 text-success",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"})],-1)),O[33]||(O[33]=mt(" Token Savings Details ",-1)),d("span",Lk,z(W(U.value.saved_tokens))+" saved",1)]),d("div",Dk,[d("div",Fk,[d("div",null,[d("div",Nk,[d("div",null,[O[34]||(O[34]=d("div",{class:"text-sm opacity-60"},"Tokens Saved",-1)),d("div",jk,z(W(U.value.saved_tokens)),1),d("div",zk,z(U.value.saved_tokens_percentage.toFixed(1))+"% reduction",1)]),d("div",null,[O[35]||(O[35]=d("div",{class:"text-sm opacity-60"},"Full Tool List",-1)),d("div",Bk,z(W(U.value.total_server_tool_list_size)),1),O[36]||(O[36]=d("div",{class:"text-xs opacity-60"},"All servers",-1))]),d("div",null,[O[37]||(O[37]=d("div",{class:"text-sm opacity-60"},"Typical Query",-1)),d("div",Hk,z(W(U.value.average_query_result_size)),1),O[38]||(O[38]=d("div",{class:"text-xs opacity-60"},"BM25 result",-1))])])]),d("div",null,[d("div",Wk,[d("div",Uk,[st.value.length>0?(x(),is(Cx,{key:0,data:st.value},null,8,["data"])):J("",!0)])]),d("div",Vk,[(x(!0),w(wt,null,Vt(st.value,(dt,Pt)=>(x(),w("div",{key:Pt,class:"flex items-center justify-between text-sm"},[d("div",qk,[d("div",{class:"w-2.5 h-2.5 rounded flex-shrink-0",style:li({backgroundColor:dt.color})},null,4),d("span",Kk,z(dt.name),1)]),d("div",Yk,[d("span",Gk,z(W(dt.value)),1),d("span",Zk,"("+z(dt.percentage.toFixed(1))+"%)",1)])]))),128))])])])])])):J("",!0),ht(qb,{hints:At.value},null,8,["hints"]),ht(Jx,{show:i.value,onClose:O[3]||(O[3]=dt=>i.value=!1)},null,8,["show"]),ht(na,{show:o.value,onClose:O[4]||(O[4]=dt=>o.value=!1),onAdded:P},null,8,["show"]),ht($2,{show:ct(n).wizardOpen,onClose:ct(n).closeWizard},null,8,["show","onClose"])])}}}),Xk=hi(Jk,[["__scopeId","data-v-a9365f07"]]),Jd=Wg({history:yg("/ui/"),scrollBehavior(){const e=document.querySelector("main.overflow-y-auto");return e&&(e.scrollTop=0),{top:0}},routes:[{path:"/login",name:"login",component:()=>Kt(()=>import("./Login-BS5rjyms.js"),[]),meta:{title:"Sign In",public:!0}},{path:"/",name:"dashboard",component:Xk,meta:{title:"Dashboard"}},{path:"/servers",name:"servers",component:()=>Kt(()=>import("./Servers-vGmGbuV-.js"),[]),meta:{title:"Servers"}},{path:"/servers/:serverName",name:"server-detail",component:()=>Kt(()=>import("./ServerDetail-DZf4WjHw.js"),[]),props:!0,meta:{title:"Server Details"}},{path:"/repositories",name:"repositories",component:()=>Kt(()=>import("./Repositories-BAogKZE_.js"),[]),meta:{title:"Repositories"}},{path:"/search",name:"search",component:()=>Kt(()=>import("./Search-D-mj47__.js"),[]),meta:{title:"Search"}},{path:"/settings",name:"settings",component:()=>Kt(()=>import("./Settings-RcQ5dhlx.js"),[]),meta:{title:"Configuration"}},{path:"/feedback",name:"feedback",component:()=>Kt(()=>import("./Feedback-BTV7aiQR.js"),[]),meta:{title:"Send Feedback"}},{path:"/secrets",name:"secrets",component:()=>Kt(()=>import("./Secrets-BKIyhyih.js"),[]),meta:{title:"Secrets"}},{path:"/sessions",name:"sessions",component:()=>Kt(()=>import("./Sessions-Dsg-0ylf.js"),[]),meta:{title:"MCP Sessions"}},{path:"/activity",name:"activity",component:()=>Kt(()=>import("./Activity-DhitPCWU.js"),__vite__mapDeps([0,1])),meta:{title:"Activity Log"}},{path:"/security",name:"security",component:()=>Kt(()=>import("./Security-DiXvJatK.js"),[]),meta:{title:"Security"}},{path:"/security/scans/:jobId",name:"scan-report",component:()=>Kt(()=>import("./ScanReport-nG0rtEIx.js"),[]),props:!0,meta:{title:"Scan Report"}},{path:"/tokens",name:"tokens",component:()=>Kt(()=>import("./AgentTokens-BUr0zPZZ.js"),[]),meta:{title:"Agent Tokens"}},{path:"/my/servers",name:"user-servers",component:()=>Kt(()=>import("./UserServers-CcZ1PmWJ.js"),[]),meta:{title:"My Servers",requiresAuth:!0}},{path:"/my/activity",name:"user-activity",component:()=>Kt(()=>import("./UserActivity-DJXmTB_5.js"),[]),meta:{title:"My Activity",requiresAuth:!0}},{path:"/my/diagnostics",name:"user-diagnostics",component:()=>Kt(()=>import("./UserDiagnostics-D1TBjGe7.js"),[]),meta:{title:"Diagnostics",requiresAuth:!0}},{path:"/my/tokens",name:"user-tokens",component:()=>Kt(()=>import("./UserTokens-IkJLKSRQ.js"),[]),meta:{title:"Agent Tokens",requiresAuth:!0}},{path:"/admin/dashboard",name:"admin-dashboard",component:()=>Kt(()=>import("./AdminDashboard-C1SaV16-.js"),[]),meta:{title:"Admin Dashboard",requiresAuth:!0,requiresAdmin:!0}},{path:"/admin/users",name:"admin-users",component:()=>Kt(()=>import("./AdminUsers-DsLLAbcP.js"),[]),meta:{title:"Users",requiresAuth:!0,requiresAdmin:!0}},{path:"/admin/servers",name:"admin-servers",component:()=>Kt(()=>import("./AdminServers-Bq_mhKvu.js"),[]),meta:{title:"Servers",requiresAuth:!0,requiresAdmin:!0}},{path:"/:pathMatch(.*)*",name:"not-found",component:()=>Kt(()=>import("./NotFound-BpDrBCs_.js"),[]),meta:{title:"Page Not Found"}}]});Jd.beforeEach(async e=>{const{useAuthStore:t}=await Kt(async()=>{const{useAuthStore:i}=await Promise.resolve().then(()=>Kg);return{useAuthStore:i}},void 0),s=t();if(s.loading&&await s.checkAuth(),!s.isTeamsEdition){if(e.path==="/login"||e.path.startsWith("/my/")||e.path.startsWith("/admin/"))return{name:"dashboard"};const i=e.meta.title;i&&(document.title=`${i} - MCPProxy Control Panel`);return}if(e.meta.public)return s.isAuthenticated?{name:"dashboard"}:void 0;if(!s.isAuthenticated)return{name:"login"};if(e.meta.requiresAdmin&&!s.isAdmin)return{name:"dashboard"};const n=e.meta.title;n&&(document.title=`${n} - MCPProxy Control Panel`)});const ya=Rp(Sb);ya.use(Dp());ya.use(Jd);ya.mount("#app");export{Vg as A,gn as B,qb as C,br as D,li as E,wt as F,Ve as G,Gu as H,ee as I,Yr as J,di as K,us as L,mn as M,Mn as N,no as O,eS as P,hd as Q,xp as T,hi as _,d as a,pi as b,w as c,ie as d,hs as e,Ib as f,ot as g,J as h,mt as i,is as j,ht as k,ko as l,ct as m,yt as n,x as o,Lt as p,pt as q,X as r,Vt as s,z as t,Po as u,Oe as v,$t as w,tS as x,ve as y,fs as z}; diff --git a/web/frontend/dist/favicon.svg b/web/frontend/dist/favicon.svg deleted file mode 100644 index 3a872851..00000000 --- a/web/frontend/dist/favicon.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - mcpproxy shield logo - Blue shield with MCP circles beneath - - - - - M - C - P - diff --git a/web/frontend/dist/index.html b/web/frontend/dist/index.html deleted file mode 100644 index aab90e27..00000000 --- a/web/frontend/dist/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - MCPProxy Control Panel - - - - -
- - diff --git a/web/web.go b/web/web.go index d266321f..ec111c9c 100644 --- a/web/web.go +++ b/web/web.go @@ -10,9 +10,25 @@ import ( "go.uber.org/zap" ) -//go:embed frontend/dist +// frontendFS embeds the Vite-built web UI from web/frontend/dist/. The +// `all:` prefix is required because a fresh module fetch (e.g. +// `go install …@latest`) contains only the tracked .gitkeep placeholder +// under that directory, and the default //go:embed pattern excludes +// dotfiles. With `all:`, the directive compiles even when no real UI +// has been produced yet; the handler below detects that case and falls +// back to fallbackFS. +// +//go:embed all:frontend/dist var frontendFS embed.FS +// fallbackFS embeds a small stub UI shown when frontendFS contains only +// the .gitkeep placeholder (no real index.html). This is what bare +// `go build ./cmd/mcpproxy` and `go install …@latest` users see β€” it +// points them at the documented `make build` flow or release artifacts. +// +//go:embed embedded_fallback +var fallbackFS embed.FS + // NewHandler creates a new HTTP handler for serving the embedded web UI func NewHandler(logger *zap.SugaredLogger) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -29,14 +45,21 @@ func NewHandler(logger *zap.SugaredLogger) http.Handler { // Try to read the file content, err := fs.ReadFile(frontendFS, fullPath) if err != nil { - // If file not found, serve index.html (for SPA routing) + // File not found in the real UI bundle. Fall back to the + // real index.html (for SPA client-side routing), and if + // that's missing too, serve the embedded fallback stub. content, err = fs.ReadFile(frontendFS, "frontend/dist/index.html") if err != nil { - logger.Errorw("Failed to read index.html", "error", err) - http.Error(w, "Not found", http.StatusNotFound) - return + content, err = fs.ReadFile(fallbackFS, "embedded_fallback/index.html") + if err != nil { + logger.Errorw("Failed to read fallback index.html", "error", err) + http.Error(w, "Not found", http.StatusNotFound) + return + } + fullPath = "embedded_fallback/index.html" + } else { + fullPath = "frontend/dist/index.html" } - fullPath = "frontend/dist/index.html" } // Set content type based on file extension