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 @@ + + +
+ + +
+ 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)Try adjusting your search query or select a different registry.
Choose a registry from the dropdown to start browsing MCP servers.
Use our BM25-powered search to find the perfect tool for your task. Search by name, description, or functionality.
Search using natural descriptions like "send email" or "file operations"
Results ranked by relevance with visual score indicators
Search across all connected MCP servers simultaneously
Could not resolve source files for scanning.
Server may be disconnected or not running in Docker.
MCP sessions represent individual connections from AI clients (like Claude Code) to MCPProxy. Each session tracks:
Sessions are retained for the 100 most recent connections.
β’ 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
The API key is invalid or missing. You need an API key to access the MCPProxy web interface.
?apikey=YOUR_KEY to the URLretrieve_tools through mcpproxy. We'll detect the round-trip live.