@augmentd-labs/canvas-web 2.26.15 → 2.26.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/NextShell-Byg6OtC2.js","assets/rolldown-runtime-C0FnF6B9.js","assets/code-editor-BQnKd3jw.js","assets/workspace-BSXnX2Me.js","assets/react-BzqgEMSQ.js","assets/alert-dialog-BC58hyW-.js","assets/ui-BqHBdBU4.js","assets/utils-BxVxyehK.js","assets/utils-2pl1SbIp.js","assets/NextShell-BT6-_CFY.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,n as t,o as n,r,t as i}from"./rolldown-runtime-C0FnF6B9.js";import{a,i as o,l as s,n as c,r as l,t as u,u as d}from"./code-editor-BQnKd3jw.js";import{_t as f,gt as p,vt as m,yt as h}from"./react-BzqgEMSQ.js";import{t as g}from"./preload-helper-Czpn1I53.js";import{$ as _,$n as v,$t as y,A as b,An as x,At as S,B as C,Bn as w,Bt as T,C as E,Cn as D,Ct as O,D as k,Dn as A,Dt as j,E as M,En as N,Et as P,F as ee,Fn as F,Ft as I,G as te,Gn as L,Gt as R,H as ne,Hn as re,Ht as ie,I as ae,In as z,It as oe,J as se,Jn as B,Jt as ce,K as V,Kn as le,Kt as ue,L as de,Ln as fe,Lt as pe,M as me,Mn as he,Mt as ge,N as _e,Nn as ve,Nt as ye,O as be,On as xe,Ot as H,P as Se,Pn as Ce,Pt as U,Q as W,Qn as we,Qt as Te,R as Ee,Rn as De,Rt as Oe,S as ke,Sn as Ae,St as je,T as Me,Tn as Ne,Tt as Pe,U as Fe,Un as Ie,Ut as Le,V as Re,Vn as ze,Vt as Be,W as Ve,Wn as He,Wt as Ue,Xn as We,Xt as Ge,Y as Ke,Yn as G,Yt as qe,Z as Je,Zn as Ye,Zt as Xe,_ as Ze,_n as Qe,_t as $e,a as et,an as tt,ar as nt,at as rt,b as it,bn as at,bt as ot,c as st,cr as ct,ct as lt,d as ut,dn as dt,dr as ft,dt as pt,en as mt,er as ht,et as gt,f as _t,fn as vt,fr as yt,ft as bt,g as xt,gn as St,gt as Ct,h as wt,hn as Tt,ht as Et,i as Dt,in as Ot,ir as kt,it as At,j as jt,jn as Mt,jt as Nt,k as Pt,kn as Ft,kt as It,l as Lt,lr as Rt,lt as zt,m as Bt,mn as Vt,mt as Ht,n as Ut,nn as Wt,nr as Gt,nt as Kt,o as qt,on as Jt,or as Yt,ot as Xt,p as Zt,pn as Qt,pr as $t,pt as en,q as tn,qn as nn,qt as rn,r as an,rn as on,rr as sn,rt as cn,s as ln,sr as un,st as dn,t as fn,tn as pn,tr as mn,tt as hn,u as gn,un as _n,ur as vn,ut as yn,v as bn,vn as xn,vt as Sn,w as Cn,wn,wt as Tn,x as En,xn as Dn,xt as On,y as kn,yn as An,yt as jn,z as Mn,zn as Nn,zt as Pn}from"./document-list-BmUv3zzK.js";import{$ as Fn,$n as In,$r as Ln,$t as Rn,An as zn,Ar as Bn,At as Vn,B as Hn,Bn as Un,Br as Wn,Bt as Gn,C as Kn,Cn as qn,Cr as Jn,Ct as Yn,Dn as Xn,Dr as Zn,En as Qn,F as $n,Fr as er,Ft as tr,G as nr,Gn as rr,Gr as ir,H as ar,Hn as or,Hr as sr,Ht as cr,I as lr,It as ur,J as dr,Jn as fr,Jr as pr,Jt as mr,K as hr,Kn as gr,Kr as _r,L as vr,Lr as yr,Mt as br,Nn as xr,Nr as Sr,Nt as Cr,On as wr,Or as Tr,Ot as Er,P as Dr,Pn as Or,Pr as kr,Pt as Ar,Q as jr,Qn as Mr,Qr as Nr,R as Pr,Rn as Fr,Rr as Ir,Rt as Lr,S as Rr,Sn as zr,St as Br,Tt as Vr,U as Hr,Ur,Ut as Wr,V as Gr,Vn as Kr,Vr as qr,Vt as Jr,W as Yr,Wn as Xr,Wt as Zr,X as Qr,Xn as $r,Xt as ei,Y as ti,Yn as ni,Yr as ri,Yt as ii,Z as ai,Zn as oi,Zr as si,Zt as ci,_ as li,_i as ui,_n as di,_r as fi,_t as pi,an as mi,ar as hi,at as gi,b as _i,bn as vi,br as yi,bt as bi,ci as xi,cn as Si,ct as Ci,d as wi,dn as Ti,dr as Ei,dt as Di,ei as Oi,en as ki,er as Ai,et as ji,f as Mi,fi as Ni,fr as Pi,ft as Fi,g as Ii,gi as Li,gn as Ri,gr as zi,gt as Bi,h as Vi,hi as Hi,hn as Ui,ht as Wi,in as Gi,ir as Ki,it as qi,jn as Ji,jr as Yi,jt as Xi,kn as Zi,kr as Qi,kt as $i,ln as ea,lt as ta,m as na,mi as ra,mr as ia,mt as aa,ni as oa,nn as sa,oi as ca,on as la,or as ua,p as da,pi as fa,pn as pa,pr as ma,pt as ha,q as ga,qn as _a,qt as va,ri as ya,rn as ba,rr as xa,rt as Sa,si as Ca,sn as wa,st as Ta,tn as Ea,tt as Da,u as Oa,ui as ka,un as Aa,ur as ja,ut as Ma,v as Na,vn as Pa,vr as Fa,vt as Ia,w as La,wn as Ra,wr as za,wt as Ba,x as Va,xn as Ha,xt as Ua,y as Wa,yn as Ga,yr as Ka,yt as qa,z as Ja,zn as Ya,zr as Xa,zt as Za}from"./ui-BqHBdBU4.js";import{i as Qa,n as $a,r as eo}from"./utils-BxVxyehK.js";import{n as to,t as K}from"./utils-2pl1SbIp.js";import{_ as no,a as ro,b as q,c as io,d as ao,f as oo,g as so,h as co,i as lo,l as uo,m as fo,n as po,o as mo,p as ho,r as go,s as _o,t as vo,u as J,v as yo,x as Y,y as bo}from"./alert-dialog-BC58hyW-.js";import{t as xo}from"./socket-hM4c-ZSl.js";import{a as So,c as Co,l as wo,n as To,o as Eo,r as Do,s as Oo}from"./blobs-CtDkR2hC.js";import{$ as ko,$t as Ao,A as jo,At as Mo,B as No,C as Po,Cn as Fo,Ct as Io,D as Lo,Dn as Ro,Dt as zo,E as Bo,En as Vo,Fn as Ho,Ft as Uo,Gt as Wo,H as Go,Ht as Ko,I as qo,It as Jo,J as Yo,Jt as Xo,K as Zo,Kn as Qo,Kt as $o,L as es,Ln as ts,M as ns,Mn as rs,Nn as is,Nt as as,O as os,On as ss,Ot as cs,Pn as ls,Pt as us,Q as ds,Qt as fs,R as ps,Rn as ms,S as hs,Sn as gs,St as _s,T as vs,Tn as ys,Tt as bs,U as xs,Ut as Ss,V as Cs,Vt as ws,W as Ts,Wn as Es,Wt as Ds,Yt as Os,Zt as ks,_ as As,_n as js,_t as Ms,a as Ns,an as Ps,at as Fs,b as Is,bn as Ls,bt as Rs,cn as zs,ct as Bs,dn as Vs,dt as Hs,en as Us,et as Ws,f as Gs,fn as Ks,ft as qs,gn as Js,gt as Ys,ht as Xs,i as Zs,it as Qs,j as $s,jt as ec,k as tc,kn as nc,kt as rc,ln as ic,lt as ac,m as oc,mt as sc,n as cc,nn as lc,nt as uc,o as dc,on as fc,ot as pc,p as mc,pn as hc,pt as gc,q as _c,qt as vc,r as yc,rn as bc,rt as xc,s as Sc,sn as Cc,st as wc,t as Tc,tt as Ec,u as Dc,un as Oc,ut as kc,v as Ac,vn as jc,vt as Mc,w as Nc,wn as Pc,wt as Fc,x as Ic,xn as Lc,xt as Rc,y as zc,yt as Bc,z as Vc,zn as Hc,zt as Uc}from"./workspace-BSXnX2Me.js";import{_ as Wc,c as Gc,f as Kc,g as qc,h as Jc,l as Yc,m as Xc,o as Zc,p as Qc,s as $c,u as el,y as tl}from"./text-documents-BvR9-zf4.js";import{B as nl,D as rl,F as il,I as al,L as ol,N as sl,O as cl,P as ll,R as ul,T as dl,_ as fl,a as pl,b as ml,c as hl,d as gl,f as _l,g as vl,h as yl,i as bl,j as xl,m as Sl,n as Cl,o as wl,p as Tl,r as El,s as Dl,t as Ol,u as kl,w as Al,y as jl,z as Ml}from"./useAddTarget-CgZfKokT.js";import{n as Nl,t as Pl}from"./map-BxCwdK0d.js";import{t as Fl}from"./sha256-65KIjGvZ.js";import{n as Il,t as Ll}from"./use-theme-Bd8sb5Ox.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var X=n(d(),1),Rl=m(),Z=s(),zl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`rounded-(--card-radius) border bg-card text-card-foreground shadow-elevation-1`,e),...t}));zl.displayName=`Card`;var Bl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`flex flex-col space-y-1.5 p-6`,e),...t}));Bl.displayName=`CardHeader`;var Vl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`h3`,{ref:n,className:K(`text-2xl font-semibold leading-none tracking-tight`,e),...t}));Vl.displayName=`CardTitle`;var Hl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`p`,{ref:n,className:K(`text-sm text-muted-foreground`,e),...t}));Hl.displayName=`CardDescription`;var Ul=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`p-6 pt-0`,e),...t}));Ul.displayName=`CardContent`;var Wl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`flex items-center p-6 pt-0`,e),...t}));Wl.displayName=`CardFooter`;var Gl=`2.26.15`,Kl=e=>{window.particlesJS.load(e,`/js/particles.config.json`,()=>{console.log(`particles.js config loaded for`,e)})};function ql(e){(0,X.useEffect)(()=>{if(window.particlesJS!==void 0)Kl(e);else{if(document.getElementById(`particles-js-script`))return;let t=document.createElement(`script`);t.id=`particles-js-script`,t.src=`/js/particles.min.js`,t.onload=()=>{console.log(`particles.js loaded`),Kl(e)},document.head.appendChild(t)}return()=>{window.pJS&&window.pJS[e]?.destroy&&window.pJS[e].destroy()}},[e])}var Jl=`session.open`,Yl=`session.set`,Xl=`session.ids`,Zl=`session.materialize`,Ql=`session.close`,$l=`session.delta`;function eu(){let[e,t]=(0,X.useState)(null),[n,r]=(0,X.useState)(!0),[i,a]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let e=!0;async function n(){try{r(!0),a(null);let n=await J.get(`/ping`,{skipAuth:!0});e&&(n?.version?t(n.version):a(`Invalid server response`))}catch(t){e&&(console.error(`Failed to fetch server version:`,t),a(`Unable to connect to server`))}finally{e&&r(!1)}}n();let i=setInterval(n,3e4);return()=>{e=!1,clearInterval(i)}},[]),{serverVersion:e,isLoading:n,error:i}}var tu=`https://github.com/canvas-ui/canvas-server`,nu=null;function ru(){return nu||=J.get(`/ping`,{skipAuth:!0}).then(e=>{let t=e??{};return{sourceUrl:t.sourceUrl||tu,version:t.version??null,commit:t.commit??null,license:t.license??null}}).catch(e=>(console.error(`Failed to fetch server source info:`,e),nu=null,{sourceUrl:tu,version:null,commit:null,license:null})),nu}function iu(){let[e,t]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let e=!0;return ru().then(n=>{e&&t(n)}),()=>{e=!1}},[]),e}function au({className:e=``}){let t=iu();if(!t)return null;let n=[t.version?`v${t.version}`:null,t.commit?.slice(0,7)].filter(Boolean).join(` `);return(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground ${e}`,children:[`Powered by`,` `,(0,Z.jsx)(`a`,{href:t.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Canvas`}),n?` ${n}`:``,t.license?`, ${t.license}`:``,`.`,` `,(0,Z.jsx)(`a`,{href:t.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Get the source code`}),`.`]})}function ou({children:e}){ql(`particle-js`);let{serverVersion:t,isLoading:n,error:r}=eu();return(0,Z.jsx)(`div`,{className:`flex min-h-viewport w-full items-center justify-center p-4 flex-col`,children:(0,Z.jsxs)(zl,{className:`flex w-[95vw] h-viewport-modal overflow-hidden`,children:[(0,Z.jsxs)(`div`,{className:`hidden md:block w-1/2 relative bg-background`,"data-scheme":`dark`,id:`particle-js`,children:[(0,Z.jsxs)(we,{className:`absolute top-8 left-8 font-bold text-foreground flex items-center z-raised`,to:`/`,children:[(0,Z.jsx)(`img`,{src:`/images/logo-wr_128x128.png`,alt:`Canvas Logo`,className:`mr-2 h-6 w-6 touch-target`}),(0,Z.jsx)(`span`,{className:`text-2xl font-bold text-foreground`,children:`Canvas`})]}),(0,Z.jsxs)(`div`,{className:`absolute bottom-8 left-8 text-sm text-foreground max-w-[80%] z-raised`,children:[`Web UI: v`,Gl,`, Server: `,n?`Loading...`:r?`Unavailable`:t?`v${t}`:`Unknown`]})]}),(0,Z.jsx)(`div`,{className:`flex w-full md:w-1/2 flex-col justify-center px-4 py-12 sm:px-6 lg:px-8`,children:(0,Z.jsxs)(`div`,{className:`mx-auto w-full max-w-sm`,children:[e,(0,Z.jsxs)(`div`,{className:`mt-8 border-t pt-6`,children:[(0,Z.jsxs)(`a`,{href:`https://github.com/canvas-ui`,target:`_blank`,className:`text-muted-foreground hover:text-foreground justify-center flex items-center space-x-2`,rel:`noopener noreferrer`,children:[(0,Z.jsx)(`svg`,{viewBox:`0 0 24 24`,width:`24`,height:`24`,stroke:`currentColor`,fill:`none`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`w-6 h-6`,children:(0,Z.jsx)(`path`,{d:`M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22`})}),(0,Z.jsx)(`span`,{children:`View on GitHub`})]}),(0,Z.jsx)(au,{className:`mt-4 text-center`})]})]})})]})})}async function su(e,t,n=`auto`){try{let r=await J.post(no.login,{email:e,password:t,strategy:n},{skipAuth:!0});console.log(`Login response:`,r);let i=r;if(`token`in i)return console.log(`Setting auth token (direct):`,i.token.substring(0,10)+`...`),J.setAuthToken(i.token),B.connect(i.token),r;if(i&&`payload`in i&&i.payload&&i.payload.token)return console.log(`Setting auth token (nested):`,i.payload.token.substring(0,10)+`...`),J.setAuthToken(i.payload.token),B.connect(i.payload.token),r;throw console.error(`Invalid login response structure:`,r),Error(`Invalid login response: missing token`)}catch(e){throw console.error(`Login error:`,e),J.clearAuthToken(),e}}async function cu(e,t,n){try{return await J.post(no.register,{name:e,email:t,password:n},{skipAuth:!0})}catch(e){throw console.error(`Registration failed:`,e),e}}function lu(e){return e instanceof Error&&/^Network error/i.test(e.message)}function uu(){let e=localStorage.getItem(`authToken`);if(!e)return!1;if(e.startsWith(`canvas-`))return!0;try{return eo(e).exp*1e3>Date.now()}catch{return!1}}function du(){let e=localStorage.getItem(`authToken`);if(!e||e.startsWith(`canvas-`))return null;try{let t=eo(e);return t.exp*1e3<Date.now()?(J.clearAuthToken(),null):{id:t.sub,email:t.email,userType:t.userType||`user`}}catch(e){return console.error(`Failed to decode token:`,e),J.clearAuthToken(),null}}async function fu(){try{if(!J.isAuthenticated())return console.log(`Not authenticated, skipping getCurrentUser request`),null;let e=await J.get(no.me);return console.log(`Current user response:`,e),e&&e?(B.isConnected()||B.reconnect(),e):(console.warn(`Invalid user profile response structure:`,e),null)}catch(e){if(console.error(`Failed to get current user:`,e),lu(e))throw e;return e instanceof Error&&(e.message.includes(`USER_NOT_FOUND_IN_DATABASE`)||e.message.includes(`Your session is invalid`)||e.message.includes(`Authentication required`)||e.message.includes(`user account no longer exists`))?(console.warn(`Authentication error detected, clearing token:`,e.message),J.clearAuthToken(),B.disconnect(),null):null}}function pu(){return J.isAuthenticated()}function mu(){let e=new URL(`${yo}/oauth/google/login`);e.searchParams.set(`origin`,window.location.origin),window.location.assign(e.toString())}async function hu(e){let t=await J.post(`${yo}/oauth/google/exchange`,{code:e},{skipAuth:!0});if(!t?.token)throw Error(`Invalid login response: missing token`);J.setAuthToken(t.token),B.connect(t.token)}async function gu(){try{let e=await J.get(no.authConfig,{skipAuth:!0});return e||e}catch(e){return console.error(`Failed to get auth config:`,e),{strategies:{local:{enabled:!0},imap:{enabled:!1,domains:[]}}}}}async function _u(e){try{await J.post(no.verifyEmailRequest,{email:e},{skipAuth:!0})}catch(e){throw console.error(`Failed to request email verification:`,e),e}}var vu=e=>e?.strategies?.local?.enabled!==!1,yu=e=>e?.allowUserRegistrations!==!1;function bu(){let e=ft(),[t,n]=X.useState(!1),[r,i]=X.useState(``),[a,o]=X.useState(``),[s,c]=X.useState(!1),[l,u]=X.useState({}),[d,p]=X.useState(null),[m,h]=X.useState({email:``,password:``,strategy:`auto`});X.useEffect(()=>{uu()&&e(`/workspaces`),fetch(`${yo}/runtime/capabilities`).then(e=>e.ok?e.json():null).then(e=>n(e?.payload?.local===!0)).catch(()=>{}),gu().then(e=>{p(e)}).catch(e=>{console.error(`Failed to load auth config:`,e)})},[e]);let g=()=>{let e={};return m.email?/\S+@\S+\.\S+/.test(m.email)||(e.email=`Email is invalid`):e.email=`Email is required`,m.password||(e.password=`Password is required`),u(e),Object.keys(e).length===0},_=e=>{let{name:t,value:n}=e.target;h(e=>({...e,[t]:n}))};async function v(t){if(t.preventDefault(),g()){c(!0);try{console.log(`Attempting login with:`,m.email,`strategy:`,m.strategy);let t=await su(m.email,m.password,m.strategy);console.log(`Login successful, received token:`,`token`in t?!!t.token:!!t.payload?.token),u({}),e(`/home`)}catch(e){console.error(`Login error:`,e);let t=`Login failed`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;n.message?t=n.message:n.error?t=n.error:n.payload?.message&&(t=n.payload.message)}u({password:t})}finally{c(!1)}}}return t?(0,Z.jsx)(ou,{children:(0,Z.jsxs)(`form`,{className:`grid gap-4`,onSubmit:async t=>{t.preventDefault(),c(!0),o(``);try{if(J.setAuthToken(r.trim()),!await fu())throw Error(`The local token was not accepted`);e(`/workspaces`)}catch(e){J.clearAuthToken(),o(e instanceof Error?e.message:`Authentication failed`)}finally{c(!1)}},children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold`,children:`Connect to your local runtime`}),(0,Z.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Enter the token shown by `,(0,Z.jsx)(`code`,{children:`canvas runtime token`}),` in the runtime folder.`]}),(0,Z.jsx)(G,{htmlFor:`local-token`,children:`Local access token`}),(0,Z.jsx)(q,{id:`local-token`,type:`password`,autoComplete:`off`,value:r,onChange:e=>i(e.target.value),required:!0}),a&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:a}),(0,Z.jsx)(Y,{disabled:s,children:s?`Connecting…`:`Connect`})]})}):(0,Z.jsx)(ou,{children:(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Welcome back`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter your credentials to access your account`})]}),(0,Z.jsx)(`form`,{onSubmit:v,children:(0,Z.jsxs)(`div`,{className:`grid gap-4`,children:[d?.strategies?.imap?.enabled&&d.strategies.imap.domains.length>0&&(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`strategy`,children:`Authentication Method`}),(0,Z.jsxs)(`select`,{id:`strategy`,name:`strategy`,value:m.strategy,onChange:_,disabled:s,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50`,children:[(0,Z.jsx)(`option`,{value:`auto`,children:`Auto-detect`}),(0,Z.jsx)(`option`,{value:`local`,children:`Local Account`}),(0,Z.jsx)(`option`,{value:`imap`,children:`Email Server (IMAP)`})]})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`email`,children:`Email`}),(0,Z.jsx)(q,{id:`email`,name:`email`,placeholder:`name@example.com`,type:`email`,autoCapitalize:`none`,autoComplete:`email`,autoCorrect:`off`,disabled:s,value:m.email,onChange:_}),l.email&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:l.email})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`password`,children:`Password`}),(0,Z.jsx)(q,{id:`password`,name:`password`,type:`password`,disabled:s,value:m.password,onChange:_}),l.password&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:l.password})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-4`,children:[(0,Z.jsx)(Y,{type:`submit`,disabled:s,children:s?`Signing in...`:`Sign In`}),d?.strategies?.google?.enabled&&(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,disabled:s,onClick:()=>mu(),children:[(0,Z.jsx)(f,{icon:`logos:google-icon`,width:16,height:16,className:`mr-2`}),`Sign in with Google`]}),vu(d)&&yu(d)&&(0,Z.jsx)(Y,{variant:`outline`,type:`button`,disabled:s,onClick:()=>e(`/register`),children:`Don't have an account? Sign up`})]})]})})]})})}function xu(){let e=ft(),{showToast:t}=wo(),[n,r]=X.useState(!1),[i,a]=X.useState({}),[o,s]=X.useState({name:``,email:``,password:``}),[c,l]=X.useState(!1),[u,d]=X.useState(!1),[f,p]=X.useState(null);X.useEffect(()=>{(async()=>{let t=await gu(),n=t?.strategies?.local;if(t?.allowUserRegistrations===!1||n?.enabled===!1){e(`/login`,{replace:!0});return}n?.passwordPolicy&&p(n.passwordPolicy),d(!!n?.requireEmailVerification)})()},[e]);let m=X.useMemo(()=>{if(!f)return null;let e=o.password||``;return{minLength:!f.minLength||e.length>=f.minLength,maxLength:!f.maxLength||e.length<=f.maxLength,uppercase:!f.requireUppercase||/[A-Z]/.test(e),lowercase:!f.requireLowercase||/[a-z]/.test(e),number:!f.requireNumbers||/[0-9]/.test(e),special:!f.requireSpecialChars||/[^A-Za-z0-9]/.test(e)}},[f,o.password]),h=()=>{let e={};if(!o.name)e.name=`Username is required`;else if(o.name.trim().length===0)e.name=`Username cannot be empty`;else{let t=o.name.toLowerCase().trim();t.length<3?e.name=`Username must be at least 3 characters long`:t.length>39?e.name=`Username cannot be longer than 39 characters`:/^[a-z0-9_-]+$/.test(t)?[`admin`,`administrator`,`root`,`system`,`support`,`help`,`api`,`www`,`mail`,`ftp`,`localhost`,`test`,`demo`,`canvas`,`universe`,`workspace`,`context`,`user`,`users`].includes(t)&&(e.name=`Username '${t}' is reserved and cannot be used`):e.name=`Username can only contain lowercase letters, numbers, underscores, and hyphens`}if(o.email?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.email)||(e.email=`Please enter a valid email address`):e.email=`Email is required`,!o.password)e.password=`Password is required`;else if(f){let t=o.password,n=[];f.minLength&&t.length<f.minLength&&n.push(`at least ${f.minLength} characters`),f.maxLength&&t.length>f.maxLength&&n.push(`no more than ${f.maxLength} characters`),f.requireUppercase&&!/[A-Z]/.test(t)&&n.push(`an uppercase letter`),f.requireLowercase&&!/[a-z]/.test(t)&&n.push(`a lowercase letter`),f.requireNumbers&&!/[0-9]/.test(t)&&n.push(`a number`),f.requireSpecialChars&&!/[^A-Za-z0-9]/.test(t)&&n.push(`a special character`),n.length&&(e.password=`Password must contain ${n.join(`, `).replace(/, ([^,]*)$/,` and $1`)}.`)}else o.password.length<8&&(e.password=`Password must be at least 8 characters long`);return a(e),Object.keys(e).length===0},g=e=>{let t={...o,[e.target.id]:e.target.value};s(t),(e.target.id===`name`||e.target.id===`email`||e.target.id===`password`)&&h()};return c?(0,Z.jsxs)(ou,{children:[(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Registration Successful!`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:u?`Check your email for a verification link to activate your account.`:`Your account has been created.`})]}),(0,Z.jsx)(`div`,{className:`space-y-6 text-center pt-6`,children:!u&&(0,Z.jsx)(Y,{asChild:!0,className:`w-full`,children:(0,Z.jsx)(we,{to:`/login`,children:`Go to Login`})})})]}):(0,Z.jsxs)(ou,{children:[(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Create an account`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter your email below to create your account`})]}),(0,Z.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),h()){r(!0);try{let e=await cu(o.name,o.email,o.password);console.log(`Registration successful:`,e),t({title:`Registration Successful`,description:u?`Check your email for a verification link before logging in.`:`You can now log in with your credentials.`,variant:`default`}),l(!0),s({name:``,email:``,password:``}),a({})}catch(e){console.error(`Registration failed:`,e);let n=e?.message||`Registration failed`;n.toLowerCase().includes(`password`)?a({...i,password:n}):a({...i,email:n}),t({title:`Registration Failed`,description:n,variant:`destructive`})}finally{r(!1)}}},className:`space-y-4 pt-6`,children:[(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Username`}),(0,Z.jsx)(q,{id:`name`,type:`text`,placeholder:`Enter your username (e.g., john_doe)`,value:o.name,onChange:g,disabled:n,className:i.name?`border-destructive`:``}),i.name&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:i.name}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`3-39 characters, lowercase letters, numbers, underscores, and hyphens only`})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(G,{htmlFor:`email`,children:`Email`}),(0,Z.jsx)(q,{id:`email`,type:`email`,placeholder:`name@example.com`,value:o.email,onChange:g,disabled:n,className:i.email?`border-destructive`:``}),i.email&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:i.email})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(G,{htmlFor:`password`,children:`Password`}),(0,Z.jsx)(q,{id:`password`,type:`password`,placeholder:`Enter your password`,value:o.password,onChange:g,disabled:n,className:i.password?`border-destructive`:``}),i.password&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:i.password}),f&&m&&(0,Z.jsxs)(`ul`,{className:`text-xs list-disc pl-4 space-y-1`,children:[(0,Z.jsxs)(`li`,{className:m.minLength?`text-success`:`text-muted-foreground`,children:[`At least `,f.minLength,` characters`]}),f.requireUppercase&&(0,Z.jsx)(`li`,{className:m.uppercase?`text-success`:`text-muted-foreground`,children:`At least one uppercase letter`}),f.requireLowercase&&(0,Z.jsx)(`li`,{className:m.lowercase?`text-success`:`text-muted-foreground`,children:`At least one lowercase letter`}),f.requireNumbers&&(0,Z.jsx)(`li`,{className:m.number?`text-success`:`text-muted-foreground`,children:`At least one number`}),f.requireSpecialChars&&(0,Z.jsx)(`li`,{className:m.special?`text-success`:`text-muted-foreground`,children:`At least one special character`}),f.maxLength&&(0,Z.jsxs)(`li`,{className:m.maxLength?`text-success`:`text-muted-foreground`,children:[`No more than `,f.maxLength,` characters`]})]})]}),(0,Z.jsx)(Y,{type:`submit`,className:`w-full`,disabled:n,children:n?`Creating Account...`:`Create Account`})]}),(0,Z.jsxs)(`div`,{className:`mt-4 text-center text-sm`,children:[`Already have an account?`,` `,(0,Z.jsx)(we,{to:`/login`,className:`underline`,children:`Sign in`})]}),(0,Z.jsxs)(`div`,{className:`px-8 py-4 text-center text-sm text-muted-foreground border-t mt-6`,children:[`By clicking continue, you agree to our`,` `,(0,Z.jsx)(we,{to:`/terms`,className:`underline underline-offset-4 hover:text-primary`,children:`Terms of Service`}),` `,`and`,` `,(0,Z.jsx)(we,{to:`/privacy`,className:`underline underline-offset-4 hover:text-primary`,children:`Privacy Policy`}),`.`]})]})}function Su(){let e=ft(),[t]=$t(),[n,r]=X.useState(t.get(`error`)),i=X.useRef(!1);return X.useEffect(()=>{let n=t.get(`code`);!n||i.current||(i.current=!0,hu(n).then(()=>e(`/home`,{replace:!0})).catch(e=>r(e instanceof Error?e.message:`Google sign-in failed`)))},[t,e]),(0,Z.jsx)(ou,{children:(0,Z.jsx)(`div`,{className:`flex flex-col space-y-4 text-center`,children:n?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Google sign-in failed`}),(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:n}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:()=>e(`/login`,{replace:!0}),children:`Back to sign in`})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Signing you in…`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Completing Google sign-in.`})]})})})}function Cu({children:e}){let[t,n]=(0,X.useState)(`loading`);return(0,X.useEffect)(()=>{(async()=>{try{if(!pu()){console.log(`No authentication token found, redirecting to login`),n(`unauthenticated`);return}let e=await fu();e?(console.log(`User authenticated:`,e.email),n(`authenticated`)):(console.log(`User not authenticated or token expired`),n(`unauthenticated`))}catch(e){if(console.error(`Authentication check failed:`,e),lu(e)){if(uu()){n(`authenticated`);return}J.clearAuthToken(),n(`unauthenticated`);return}e instanceof Error&&e.message.includes(`Authentication required`)&&(console.log(`Clearing invalid token from ProtectedRoute`),J.clearAuthToken()),n(`unauthenticated`)}})()},[]),t===`loading`?(0,Z.jsx)(`div`,{className:`flex h-screen items-center justify-center`,children:(0,Z.jsx)(nn,{className:`h-8 w-8`})}):t===`unauthenticated`?(0,Z.jsx)(ht,{to:`/login`,replace:!0}):(0,Z.jsx)(Z.Fragment,{children:e})}function wu({children:e}){let[t,n]=(0,X.useState)(null);return(0,X.useEffect)(()=>{(async()=>{try{await J.get(`/auth/me`),n(!0)}catch(e){e instanceof Error&&e.message.includes(`Authentication required`)&&(console.log(`Clearing invalid token from PublicRoute`),J.clearAuthToken()),n(!1)}})()},[]),t===null?null:t?(0,Z.jsx)(ht,{to:`/workspaces`,replace:!0}):(0,Z.jsx)(Z.Fragment,{children:e})}var Tu=i(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?r(e):typeof define==`function`&&define.amd?define([`exports`],r):(n=typeof globalThis<`u`?globalThis:n||self,r(n[`fast-equals`]={}))})(e,(function(e){function t(e){return function(t,n,r,i,a,o,s){return e(t,n,s)}}function n(e){return function(t,n,r,i){if(!t||!n||typeof t!=`object`||typeof n!=`object`)return e(t,n,r,i);var a=i.get(t),o=i.get(n);if(a&&o)return a===n&&o===t;i.set(t,n),i.set(n,t);var s=e(t,n,r,i);return i.delete(t),i.delete(n),s}}function r(e,t){var n={};for(var r in e)n[r]=e[r];for(var r in t)n[r]=t[r];return n}function i(e){return e.constructor===Object||e.constructor==null}function a(e){return typeof e.then==`function`}function o(e,t){return e===t||e!==e&&t!==t}var s=Object.prototype.toString;function c(e){var t=e.areArraysEqual,n=e.areDatesEqual,r=e.areMapsEqual,c=e.areObjectsEqual,l=e.areRegExpsEqual,u=e.areSetsEqual,d=e.createIsNestedEqual,f=d(p);function p(e,d,p){if(e===d)return!0;if(!e||!d||typeof e!=`object`||typeof d!=`object`)return e!==e&&d!==d;if(i(e)&&i(d))return c(e,d,f,p);var m=Array.isArray(e),h=Array.isArray(d);if(m||h)return m===h&&t(e,d,f,p);var g=s.call(e);return g===s.call(d)?g===`[object Date]`?n(e,d,f,p):g===`[object RegExp]`?l(e,d,f,p):g===`[object Map]`?r(e,d,f,p):g===`[object Set]`?u(e,d,f,p):g===`[object Object]`||g===`[object Arguments]`?a(e)||a(d)?!1:c(e,d,f,p):g===`[object Boolean]`||g===`[object Number]`||g===`[object String]`?o(e.valueOf(),d.valueOf()):!1:!1}return p}function l(e,t,n,r){var i=e.length;if(t.length!==i)return!1;for(;i-->0;)if(!n(e[i],t[i],i,i,e,t,r))return!1;return!0}var u=n(l);function d(e,t){return o(e.valueOf(),t.valueOf())}function f(e,t,n,r){var i=e.size===t.size;if(!i)return!1;if(!e.size)return!0;var a={},o=0;return e.forEach(function(s,c){if(i){var l=!1,u=0;t.forEach(function(i,d){!l&&!a[u]&&(l=n(c,d,o,u,e,t,r)&&n(s,i,c,d,e,t,r))&&(a[u]=!0),u++}),o++,i=l}}),i}var p=n(f),m=`_owner`,h=Object.prototype.hasOwnProperty;function g(e,t,n,r){var i=Object.keys(e),a=i.length;if(Object.keys(t).length!==a)return!1;for(var o;a-->0;){if(o=i[a],o===m){var s=!!e.$$typeof,c=!!t.$$typeof;if((s||c)&&s!==c)return!1}if(!h.call(t,o)||!n(e[o],t[o],o,o,e,t,r))return!1}return!0}var _=n(g);function v(e,t){return e.source===t.source&&e.flags===t.flags}function y(e,t,n,r){var i=e.size===t.size;if(!i)return!1;if(!e.size)return!0;var a={};return e.forEach(function(o,s){if(i){var c=!1,l=0;t.forEach(function(i,u){!c&&!a[l]&&(c=n(o,i,s,u,e,t,r))&&(a[l]=!0),l++}),i=c}}),i}var b=n(y),x=Object.freeze({areArraysEqual:l,areDatesEqual:d,areMapsEqual:f,areObjectsEqual:g,areRegExpsEqual:v,areSetsEqual:y,createIsNestedEqual:t}),S=Object.freeze({areArraysEqual:u,areDatesEqual:d,areMapsEqual:p,areObjectsEqual:_,areRegExpsEqual:v,areSetsEqual:b,createIsNestedEqual:t}),C=c(x);function w(e,t){return C(e,t,void 0)}var T=c(r(x,{createIsNestedEqual:function(){return o}}));function E(e,t){return T(e,t,void 0)}var D=c(S);function O(e,t){return D(e,t,new WeakMap)}var k=c(r(S,{createIsNestedEqual:function(){return o}}));function A(e,t){return k(e,t,new WeakMap)}function j(e){return c(r(x,e(x)))}function M(e){var t=c(r(S,e(S)));return(function(e,n,r){return r===void 0&&(r=new WeakMap),t(e,n,r)})}e.circularDeepEqual=O,e.circularShallowEqual=A,e.createCustomCircularEqual=M,e.createCustomEqual=j,e.deepEqual=w,e.sameValueZeroEqual=o,e.shallowEqual=E,Object.defineProperty(e,"__esModule",{value:!0})}))})),Eu=i(((e,t)=>{t.exports=function(e,t,n){return e===t||e.className===t.className&&n(e.style,t.style)&&e.width===t.width&&e.autoSize===t.autoSize&&e.cols===t.cols&&e.draggableCancel===t.draggableCancel&&e.draggableHandle===t.draggableHandle&&n(e.verticalCompact,t.verticalCompact)&&n(e.compactType,t.compactType)&&n(e.layout,t.layout)&&n(e.margin,t.margin)&&n(e.containerPadding,t.containerPadding)&&e.rowHeight===t.rowHeight&&e.maxRows===t.maxRows&&e.isBounded===t.isBounded&&e.isDraggable===t.isDraggable&&e.isResizable===t.isResizable&&e.allowOverlap===t.allowOverlap&&e.preventCollision===t.preventCollision&&e.useCSSTransforms===t.useCSSTransforms&&e.transformScale===t.transformScale&&e.isDroppable===t.isDroppable&&n(e.resizeHandles,t.resizeHandles)&&n(e.resizeHandle,t.resizeHandle)&&e.onLayoutChange===t.onLayoutChange&&e.onDragStart===t.onDragStart&&e.onDrag===t.onDrag&&e.onDragStop===t.onDragStop&&e.onResizeStart===t.onResizeStart&&e.onResize===t.onResize&&e.onResizeStop===t.onResizeStop&&e.onDrop===t.onDrop&&n(e.droppingItem,t.droppingItem)&&n(e.innerRef,t.innerRef)}})),Du=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.bottom=l,e.childrenEqual=h,e.cloneLayout=u,e.cloneLayoutItem=m,e.collides=_,e.compact=v,e.compactItem=x,e.compactType=se,e.correctBounds=S,e.fastPositionEqual=g,e.fastRGLPropsEqual=void 0,e.getAllCollisions=T,e.getFirstCollision=w,e.getLayoutItem=C,e.getStatics=E,e.modifyLayout=f,e.moveElement=D,e.moveElementAwayFromCollision=O,e.noop=void 0,e.perc=k,e.resizeItemInDirection=L,e.setTopLeft=ne,e.setTransform=R,e.sortLayoutItems=re,e.sortLayoutItemsByColRow=ae,e.sortLayoutItemsByRowCol=ie,e.synchronizeLayoutWithChildren=z,e.validateLayout=oe,e.withLayoutItem=p;var t=Tu(),n=r(d());function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?i(Object(n),!0).forEach(function(t){o(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function o(e,t,n){return(t=s(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e){var t=c(e,`string`);return typeof t==`symbol`?t:t+``}function c(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function l(e){let t=0,n;for(let r=0,i=e.length;r<i;r++)n=e[r].y+e[r].h,n>t&&(t=n);return t}function u(e){let t=Array(e.length);for(let n=0,r=e.length;n<r;n++)t[n]=m(e[n]);return t}function f(e,t){let n=Array(e.length);for(let r=0,i=e.length;r<i;r++)t.i===e[r].i?n[r]=t:n[r]=e[r];return n}function p(e,t,n){let r=C(e,t);return r?(r=n(m(r)),e=f(e,r),[e,r]):[e,null]}function m(e){return{w:e.w,h:e.h,x:e.x,y:e.y,i:e.i,minW:e.minW,maxW:e.maxW,minH:e.minH,maxH:e.maxH,moved:!!e.moved,static:!!e.static,isDraggable:e.isDraggable,isResizable:e.isResizable,resizeHandles:e.resizeHandles,isBounded:e.isBounded}}function h(e,r){return(0,t.deepEqual)(n.default.Children.map(e,e=>e?.key),n.default.Children.map(r,e=>e?.key))&&(0,t.deepEqual)(n.default.Children.map(e,e=>e?.props[`data-grid`]),n.default.Children.map(r,e=>e?.props[`data-grid`]))}e.fastRGLPropsEqual=Eu();function g(e,t){return e.left===t.left&&e.top===t.top&&e.width===t.width&&e.height===t.height}function _(e,t){return!(e.i===t.i||e.x+e.w<=t.x||e.x>=t.x+t.w||e.y+e.h<=t.y||e.y>=t.y+t.h)}function v(e,t,n,r){let i=E(e),a=l(i),o=re(e,t),s=Array(e.length);for(let c=0,l=o.length;c<l;c++){let l=m(o[c]);l.static||(l=x(i,l,t,n,o,r,a),a=Math.max(a,l.y+l.h),i.push(l)),s[e.indexOf(o[c])]=l,l.moved=!1}return s}var y={x:`w`,y:`h`};function b(e,t,n,r){let i=y[r];t[r]+=1;let a=e.map(e=>e.i).indexOf(t.i);for(let o=a+1;o<e.length;o++){let a=e[o];if(!a.static){if(a.y>t.y+t.h)break;_(t,a)&&b(e,a,n+t[i],r)}}t[r]=n}function x(e,t,n,r,i,a,o){let s=n===`vertical`,c=n===`horizontal`;if(s)for(t.y=Math.min(typeof o==`number`?o:l(e),t.y);t.y>0&&!w(e,t);)t.y--;else if(c)for(;t.x>0&&!w(e,t);)t.x--;let u;for(;(u=w(e,t))&&!(n===null&&a);)if(c?b(i,t,u.x+u.w,`x`):b(i,t,u.y+u.h,`y`),c&&t.x+t.w>r)for(t.x=r-t.w,t.y++;t.x>0&&!w(e,t);)t.x--;return t.y=Math.max(t.y,0),t.x=Math.max(t.x,0),t}function S(e,t){let n=E(e);for(let r=0,i=e.length;r<i;r++){let i=e[r];if(i.x+i.w>t.cols&&(i.x=t.cols-i.w),i.x<0&&(i.x=0,i.w=t.cols),!i.static)n.push(i);else for(;w(n,i);)i.y++}return e}function C(e,t){for(let n=0,r=e.length;n<r;n++)if(e[n].i===t)return e[n]}function w(e,t){for(let n=0,r=e.length;n<r;n++)if(_(e[n],t))return e[n]}function T(e,t){return e.filter(e=>_(e,t))}function E(e){return e.filter(e=>e.static)}function D(e,t,n,r,i,a,o,s,c){if(t.static&&t.isDraggable!==!0||t.y===r&&t.x===n)return e;`${t.i}${String(n)}${String(r)}${t.x}${t.y}`;let l=t.x,d=t.y;typeof n==`number`&&(t.x=n),typeof r==`number`&&(t.y=r),t.moved=!0;let f=re(e,o);(o===`vertical`&&typeof r==`number`?d>=r:o===`horizontal`&&typeof n==`number`&&l>=n)&&(f=f.reverse());let p=T(f,t),m=p.length>0;if(m&&c)return u(e);if(m&&a)return`${t.i}`,t.x=l,t.y=d,t.moved=!1,e;for(let n=0,r=p.length;n<r;n++){let r=p[n];`${t.i}${t.x}${t.y}${r.i}${r.x}${r.y}`,!r.moved&&(e=r.static?O(e,r,t,i,o,s):O(e,t,r,i,o,s))}return e}function O(e,t,n,r,i,a){let o=i===`horizontal`,s=i===`vertical`,c=t.static;if(r){r=!1;let l={x:o?Math.max(t.x-n.w,0):n.x,y:s?Math.max(t.y-n.h,0):n.y,w:n.w,h:n.h,i:`-1`},u=w(e,l),d=u&&u.y+u.h>t.y,f=u&&t.x+t.w>u.x;if(!u)return`${n.i}${l.x}${l.y}`,D(e,n,o?l.x:void 0,s?l.y:void 0,r,c,i,a);if(d&&s)return D(e,n,void 0,n.y+1,r,c,i,a);if(d&&i==null)return t.y=n.y,n.y+=n.h,e;if(f&&o)return D(e,t,n.x,void 0,r,c,i,a)}let l=o?n.x+1:void 0,u=s?n.y+1:void 0;return l==null&&u==null?e:D(e,n,o?n.x+1:void 0,s?n.y+1:void 0,r,c,i,a)}function k(e){return e*100+`%`}var A=(e,t,n,r)=>e+n>r?t:n,j=(e,t,n)=>e<0?t:n,M=e=>Math.max(0,e),N=e=>Math.max(0,e),P=(e,t,n)=>{let{left:r,height:i,width:a}=t,o=e.top-(i-e.height);return{left:r,width:a,height:j(o,e.height,i),top:N(o)}},ee=(e,t,n)=>{let{top:r,left:i,height:a,width:o}=t;return{top:r,height:a,width:A(e.left,e.width,o,n),left:M(i)}},F=(e,t,n)=>{let{top:r,height:i,width:a}=t,o=e.left-(a-e.width);return{height:i,width:o<0?e.width:A(e.left,e.width,a,n),top:N(r),left:M(o)}},I=(e,t,n)=>{let{top:r,left:i,height:a,width:o}=t;return{width:o,left:i,height:j(r,e.height,a),top:N(r)}},te={n:P,ne:function(){return P(arguments.length<=0?void 0:arguments[0],ee(...arguments),arguments.length<=2?void 0:arguments[2])},e:ee,se:function(){return I(arguments.length<=0?void 0:arguments[0],ee(...arguments),arguments.length<=2?void 0:arguments[2])},s:I,sw:function(){return I(arguments.length<=0?void 0:arguments[0],F(...arguments),arguments.length<=2?void 0:arguments[2])},w:F,nw:function(){return P(arguments.length<=0?void 0:arguments[0],F(...arguments),arguments.length<=2?void 0:arguments[2])}};function L(e,t,n,r){let i=te[e];return i?i(t,a(a({},t),n),r):n}function R(e){let{top:t,left:n,width:r,height:i}=e,a=`translate(${n}px,${t}px)`;return{transform:a,WebkitTransform:a,MozTransform:a,msTransform:a,OTransform:a,width:`${r}px`,height:`${i}px`,position:`absolute`}}function ne(e){let{top:t,left:n,width:r,height:i}=e;return{top:`${t}px`,left:`${n}px`,width:`${r}px`,height:`${i}px`,position:`absolute`}}function re(e,t){return t===`horizontal`?ae(e):t===`vertical`?ie(e):e}function ie(e){return e.slice(0).sort(function(e,t){return e.y>t.y||e.y===t.y&&e.x>t.x?1:e.y===t.y&&e.x===t.x?0:-1})}function ae(e){return e.slice(0).sort(function(e,t){return e.x>t.x||e.x===t.x&&e.y>t.y?1:-1})}function z(e,t,r,i,o){e||=[];let s=[];n.default.Children.forEach(t,t=>{if(t?.key==null)return;let n=C(e,String(t.key)),r=t.props[`data-grid`];n&&r==null?s.push(m(n)):r?s.push(m(a(a({},r),{},{i:t.key}))):s.push(m({w:1,h:1,x:0,y:l(s),i:String(t.key)}))});let c=S(s,{cols:r});return o?c:v(c,i,r)}function oe(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:`Layout`,n=[`x`,`y`,`w`,`h`];if(!Array.isArray(e))throw Error(t+` must be an array!`);for(let r=0,i=e.length;r<i;r++){let i=e[r];for(let e=0;e<n.length;e++){let a=n[e],o=i[a];if(typeof o!=`number`||Number.isNaN(o))throw Error(`ReactGridLayout: ${t}[${r}].${a} must be a number! Received: ${o} (${typeof o})`)}if(i.i!==void 0&&typeof i.i!=`string`)throw Error(`ReactGridLayout: ${t}[${r}].i must be a string! Received: ${i.i} (${typeof i.i})`)}}function se(e){let{verticalCompact:t,compactType:n}=e||{};return t===!1?null:n}e.noop=()=>{}})),Ou=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.calcGridColWidth=t,e.calcGridItemPosition=r,e.calcGridItemWHPx=n,e.calcWH=a,e.calcXY=i,e.clamp=o;function t(e){let{margin:t,containerPadding:n,containerWidth:r,cols:i}=e;return(r-t[0]*(i-1)-n[0]*2)/i}function n(e,t,n){return Number.isFinite(e)?Math.round(t*e+Math.max(0,e-1)*n):e}function r(e,r,i,a,o,s){let{margin:c,containerPadding:l,rowHeight:u}=e,d=t(e),f={};return s&&s.resizing?(f.width=Math.round(s.resizing.width),f.height=Math.round(s.resizing.height)):(f.width=n(a,d,c[0]),f.height=n(o,u,c[1])),s&&s.dragging?(f.top=Math.round(s.dragging.top),f.left=Math.round(s.dragging.left)):s&&s.resizing&&typeof s.resizing.top==`number`&&typeof s.resizing.left==`number`?(f.top=Math.round(s.resizing.top),f.left=Math.round(s.resizing.left)):(f.top=Math.round((u+c[1])*i+l[1]),f.left=Math.round((d+c[0])*r+l[0])),f}function i(e,n,r,i,a){let{margin:s,containerPadding:c,cols:l,rowHeight:u,maxRows:d}=e,f=t(e),p=Math.round((r-c[0])/(f+s[0])),m=Math.round((n-c[1])/(u+s[1]));return p=o(p,0,l-i),m=o(m,0,d-a),{x:p,y:m}}function a(e,n,r,i,a,s){let{margin:c,maxRows:l,cols:u,rowHeight:d}=e,f=t(e),p=Math.round((n+c[0])/(f+c[0])),m=Math.round((r+c[1])/(d+c[1])),h=o(p,0,u-i),g=o(m,0,l-a);return[`sw`,`w`,`nw`].indexOf(s)!==-1&&(h=o(p,0,u)),[`nw`,`n`,`ne`].indexOf(s)!==-1&&(g=o(m,0,l)),{w:h,h:g}}function o(e,t,n){return Math.max(Math.min(e,n),t)}})),ku=i(((e,t)=>{t.exports=`SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED`})),Au=i(((e,t)=>{var n=ku();function r(){}function i(){}i.resetWarningCache=r,t.exports=function(){function e(e,t,r,i,a,o){if(o!==n){var s=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name=`Invariant Violation`,s}}e.isRequired=e;function t(){return e}var a={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:r};return a.PropTypes=a,a}})),ju=i(((e,t)=>{t.exports=Au()()})),Mu=i(((e,t)=>{var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})},l=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of a(t))!s.call(e,c)&&c!==n&&r(e,c,{get:()=>t[c],enumerable:!(o=i(t,c))||o.enumerable});return e},u=(e,t,i)=>(i=e==null?{}:n(o(e)),l(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)),f=e=>l(r({},`__esModule`,{value:!0}),e),p={};c(p,{DraggableCore:()=>Se,default:()=>Ce}),t.exports=f(p);var m=u(d()),g=u(ju()),_=u(h()),v=$a();function y(e,t){for(let n=0,r=e.length;n<r;n++)if(t.apply(t,[e[n],n,e]))return e[n]}function b(e){return typeof e==`function`||Object.prototype.toString.call(e)===`[object Function]`}function x(e){return typeof e==`number`&&!isNaN(e)}function S(e){return parseInt(e,10)}function C(e,t,n){if(e[t])return Error(`Invalid prop ${t} passed to ${n} - do not set this, set it on the child.`)}var w=[`Moz`,`Webkit`,`O`,`ms`];function T(e=`transform`){if(typeof window>`u`)return``;let t=window.document?.documentElement?.style;if(!t||e in t)return``;for(let n=0;n<w.length;n++)if(E(e,w[n])in t)return w[n];return``}function E(e,t){return t?`${t}${D(e)}`:e}function D(e){let t=``,n=!0;for(let r=0;r<e.length;r++)n?(t+=e[r].toUpperCase(),n=!1):e[r]===`-`?n=!0:t+=e[r];return t}var O=T(),k=``;function A(e,t){k||=y([`matches`,`webkitMatchesSelector`,`mozMatchesSelector`,`msMatchesSelector`,`oMatchesSelector`],function(t){return b(e[t])})??``;let n=e[k];return b(n)?!!n.call(e,t):!1}function j(e,t,n){let r=e;do{if(A(r,t))return!0;if(r===n)return!1;r=r.parentNode}while(r);return!1}function M(e,t,n,r){if(!e)return;let i={capture:!0,...r},a=n;e.addEventListener?e.addEventListener(t,a,i):e.attachEvent?e.attachEvent(`on`+t,a):e[`on`+t]=a}function N(e,t,n,r){if(!e)return;let i={capture:!0,...r},a=n;e.removeEventListener?e.removeEventListener(t,a,i):e.detachEvent?e.detachEvent(`on`+t,a):e[`on`+t]=null}function P(e){let t=e.clientHeight,n=e.ownerDocument.defaultView.getComputedStyle(e);return t+=S(n.borderTopWidth),t+=S(n.borderBottomWidth),t}function ee(e){let t=e.clientWidth,n=e.ownerDocument.defaultView.getComputedStyle(e);return t+=S(n.borderLeftWidth),t+=S(n.borderRightWidth),t}function F(e){let t=e.clientHeight,n=e.ownerDocument.defaultView.getComputedStyle(e);return t-=S(n.paddingTop),t-=S(n.paddingBottom),t}function I(e){let t=e.clientWidth,n=e.ownerDocument.defaultView.getComputedStyle(e);return t-=S(n.paddingLeft),t-=S(n.paddingRight),t}function te(e,t,n){let r=t===t.ownerDocument.body?{left:0,top:0}:t.getBoundingClientRect();return{x:(e.clientX+t.scrollLeft-r.left)/n,y:(e.clientY+t.scrollTop-r.top)/n}}function L(e,t){let n=ne(e,t,`px`);return{[E(`transform`,O)]:n}}function R(e,t){return ne(e,t,``)}function ne({x:e,y:t},n,r){let i=`translate(${e}${r},${t}${r})`;return n&&(i=`translate(${`${typeof n.x==`string`?n.x:n.x+r}`}, ${`${typeof n.y==`string`?n.y:n.y+r}`})`+i),i}function re(e,t){return e.targetTouches&&y(e.targetTouches,e=>t===e.identifier)||e.changedTouches&&y(e.changedTouches,e=>t===e.identifier)}function ie(e){if(e.targetTouches&&e.targetTouches[0])return e.targetTouches[0].identifier;if(e.changedTouches&&e.changedTouches[0])return e.changedTouches[0].identifier}function ae(){return typeof __webpack_nonce__<`u`?__webpack_nonce__:void 0}function z(e,t){if(!e)return;let n=e.getElementById(`react-draggable-style-el`);if(!n){n=e.createElement(`style`),n.type=`text/css`,n.id=`react-draggable-style-el`;let r=t??ae();r&&n.setAttribute(`nonce`,r),n.innerHTML=`.react-draggable-transparent-selection *::-moz-selection {all: inherit;}
|
|
2
|
+
import{a as e,n as t,o as n,r,t as i}from"./rolldown-runtime-C0FnF6B9.js";import{a,i as o,l as s,n as c,r as l,t as u,u as d}from"./code-editor-BQnKd3jw.js";import{_t as f,gt as p,vt as m,yt as h}from"./react-BzqgEMSQ.js";import{t as g}from"./preload-helper-Czpn1I53.js";import{$ as _,$n as v,$t as y,A as b,An as x,At as S,B as C,Bn as w,Bt as T,C as E,Cn as D,Ct as O,D as k,Dn as A,Dt as j,E as M,En as N,Et as P,F as ee,Fn as F,Ft as I,G as te,Gn as L,Gt as R,H as ne,Hn as re,Ht as ie,I as ae,In as z,It as oe,J as se,Jn as B,Jt as ce,K as V,Kn as le,Kt as ue,L as de,Ln as fe,Lt as pe,M as me,Mn as he,Mt as ge,N as _e,Nn as ve,Nt as ye,O as be,On as xe,Ot as H,P as Se,Pn as Ce,Pt as U,Q as W,Qn as we,Qt as Te,R as Ee,Rn as De,Rt as Oe,S as ke,Sn as Ae,St as je,T as Me,Tn as Ne,Tt as Pe,U as Fe,Un as Ie,Ut as Le,V as Re,Vn as ze,Vt as Be,W as Ve,Wn as He,Wt as Ue,Xn as We,Xt as Ge,Y as Ke,Yn as G,Yt as qe,Z as Je,Zn as Ye,Zt as Xe,_ as Ze,_n as Qe,_t as $e,a as et,an as tt,ar as nt,at as rt,b as it,bn as at,bt as ot,c as st,cr as ct,ct as lt,d as ut,dn as dt,dr as ft,dt as pt,en as mt,er as ht,et as gt,f as _t,fn as vt,fr as yt,ft as bt,g as xt,gn as St,gt as Ct,h as wt,hn as Tt,ht as Et,i as Dt,in as Ot,ir as kt,it as At,j as jt,jn as Mt,jt as Nt,k as Pt,kn as Ft,kt as It,l as Lt,lr as Rt,lt as zt,m as Bt,mn as Vt,mt as Ht,n as Ut,nn as Wt,nr as Gt,nt as Kt,o as qt,on as Jt,or as Yt,ot as Xt,p as Zt,pn as Qt,pr as $t,pt as en,q as tn,qn as nn,qt as rn,r as an,rn as on,rr as sn,rt as cn,s as ln,sr as un,st as dn,t as fn,tn as pn,tr as mn,tt as hn,u as gn,un as _n,ur as vn,ut as yn,v as bn,vn as xn,vt as Sn,w as Cn,wn,wt as Tn,x as En,xn as Dn,xt as On,y as kn,yn as An,yt as jn,z as Mn,zn as Nn,zt as Pn}from"./document-list-BmUv3zzK.js";import{$ as Fn,$n as In,$r as Ln,$t as Rn,An as zn,Ar as Bn,At as Vn,B as Hn,Bn as Un,Br as Wn,Bt as Gn,C as Kn,Cn as qn,Cr as Jn,Ct as Yn,Dn as Xn,Dr as Zn,En as Qn,F as $n,Fr as er,Ft as tr,G as nr,Gn as rr,Gr as ir,H as ar,Hn as or,Hr as sr,Ht as cr,I as lr,It as ur,J as dr,Jn as fr,Jr as pr,Jt as mr,K as hr,Kn as gr,Kr as _r,L as vr,Lr as yr,Mt as br,Nn as xr,Nr as Sr,Nt as Cr,On as wr,Or as Tr,Ot as Er,P as Dr,Pn as Or,Pr as kr,Pt as Ar,Q as jr,Qn as Mr,Qr as Nr,R as Pr,Rn as Fr,Rr as Ir,Rt as Lr,S as Rr,Sn as zr,St as Br,Tt as Vr,U as Hr,Ur,Ut as Wr,V as Gr,Vn as Kr,Vr as qr,Vt as Jr,W as Yr,Wn as Xr,Wt as Zr,X as Qr,Xn as $r,Xt as ei,Y as ti,Yn as ni,Yr as ri,Yt as ii,Z as ai,Zn as oi,Zr as si,Zt as ci,_ as li,_i as ui,_n as di,_r as fi,_t as pi,an as mi,ar as hi,at as gi,b as _i,bn as vi,br as yi,bt as bi,ci as xi,cn as Si,ct as Ci,d as wi,dn as Ti,dr as Ei,dt as Di,ei as Oi,en as ki,er as Ai,et as ji,f as Mi,fi as Ni,fr as Pi,ft as Fi,g as Ii,gi as Li,gn as Ri,gr as zi,gt as Bi,h as Vi,hi as Hi,hn as Ui,ht as Wi,in as Gi,ir as Ki,it as qi,jn as Ji,jr as Yi,jt as Xi,kn as Zi,kr as Qi,kt as $i,ln as ea,lt as ta,m as na,mi as ra,mr as ia,mt as aa,ni as oa,nn as sa,oi as ca,on as la,or as ua,p as da,pi as fa,pn as pa,pr as ma,pt as ha,q as ga,qn as _a,qt as va,ri as ya,rn as ba,rr as xa,rt as Sa,si as Ca,sn as wa,st as Ta,tn as Ea,tt as Da,u as Oa,ui as ka,un as Aa,ur as ja,ut as Ma,v as Na,vn as Pa,vr as Fa,vt as Ia,w as La,wn as Ra,wr as za,wt as Ba,x as Va,xn as Ha,xt as Ua,y as Wa,yn as Ga,yr as Ka,yt as qa,z as Ja,zn as Ya,zr as Xa,zt as Za}from"./ui-BqHBdBU4.js";import{i as Qa,n as $a,r as eo}from"./utils-BxVxyehK.js";import{n as to,t as K}from"./utils-2pl1SbIp.js";import{_ as no,a as ro,b as q,c as io,d as ao,f as oo,g as so,h as co,i as lo,l as uo,m as fo,n as po,o as mo,p as ho,r as go,s as _o,t as vo,u as J,v as yo,x as Y,y as bo}from"./alert-dialog-BC58hyW-.js";import{t as xo}from"./socket-hM4c-ZSl.js";import{a as So,c as Co,l as wo,n as To,o as Eo,r as Do,s as Oo}from"./blobs-CtDkR2hC.js";import{$ as ko,$t as Ao,A as jo,At as Mo,B as No,C as Po,Cn as Fo,Ct as Io,D as Lo,Dn as Ro,Dt as zo,E as Bo,En as Vo,Fn as Ho,Ft as Uo,Gt as Wo,H as Go,Ht as Ko,I as qo,It as Jo,J as Yo,Jt as Xo,K as Zo,Kn as Qo,Kt as $o,L as es,Ln as ts,M as ns,Mn as rs,Nn as is,Nt as as,O as os,On as ss,Ot as cs,Pn as ls,Pt as us,Q as ds,Qt as fs,R as ps,Rn as ms,S as hs,Sn as gs,St as _s,T as vs,Tn as ys,Tt as bs,U as xs,Ut as Ss,V as Cs,Vt as ws,W as Ts,Wn as Es,Wt as Ds,Yt as Os,Zt as ks,_ as As,_n as js,_t as Ms,a as Ns,an as Ps,at as Fs,b as Is,bn as Ls,bt as Rs,cn as zs,ct as Bs,dn as Vs,dt as Hs,en as Us,et as Ws,f as Gs,fn as Ks,ft as qs,gn as Js,gt as Ys,ht as Xs,i as Zs,it as Qs,j as $s,jt as ec,k as tc,kn as nc,kt as rc,ln as ic,lt as ac,m as oc,mt as sc,n as cc,nn as lc,nt as uc,o as dc,on as fc,ot as pc,p as mc,pn as hc,pt as gc,q as _c,qt as vc,r as yc,rn as bc,rt as xc,s as Sc,sn as Cc,st as wc,t as Tc,tt as Ec,u as Dc,un as Oc,ut as kc,v as Ac,vn as jc,vt as Mc,w as Nc,wn as Pc,wt as Fc,x as Ic,xn as Lc,xt as Rc,y as zc,yt as Bc,z as Vc,zn as Hc,zt as Uc}from"./workspace-BSXnX2Me.js";import{_ as Wc,c as Gc,f as Kc,g as qc,h as Jc,l as Yc,m as Xc,o as Zc,p as Qc,s as $c,u as el,y as tl}from"./text-documents-BvR9-zf4.js";import{B as nl,D as rl,F as il,I as al,L as ol,N as sl,O as cl,P as ll,R as ul,T as dl,_ as fl,a as pl,b as ml,c as hl,d as gl,f as _l,g as vl,h as yl,i as bl,j as xl,m as Sl,n as Cl,o as wl,p as Tl,r as El,s as Dl,t as Ol,u as kl,w as Al,y as jl,z as Ml}from"./useAddTarget-CgZfKokT.js";import{n as Nl,t as Pl}from"./map-BxCwdK0d.js";import{t as Fl}from"./sha256-65KIjGvZ.js";import{n as Il,t as Ll}from"./use-theme-Bd8sb5Ox.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var X=n(d(),1),Rl=m(),Z=s(),zl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`rounded-(--card-radius) border bg-card text-card-foreground shadow-elevation-1`,e),...t}));zl.displayName=`Card`;var Bl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`flex flex-col space-y-1.5 p-6`,e),...t}));Bl.displayName=`CardHeader`;var Vl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`h3`,{ref:n,className:K(`text-2xl font-semibold leading-none tracking-tight`,e),...t}));Vl.displayName=`CardTitle`;var Hl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`p`,{ref:n,className:K(`text-sm text-muted-foreground`,e),...t}));Hl.displayName=`CardDescription`;var Ul=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`p-6 pt-0`,e),...t}));Ul.displayName=`CardContent`;var Wl=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(`div`,{ref:n,className:K(`flex items-center p-6 pt-0`,e),...t}));Wl.displayName=`CardFooter`;var Gl=`2.26.16`,Kl=e=>{window.particlesJS.load(e,`/js/particles.config.json`,()=>{console.log(`particles.js config loaded for`,e)})};function ql(e){(0,X.useEffect)(()=>{if(window.particlesJS!==void 0)Kl(e);else{if(document.getElementById(`particles-js-script`))return;let t=document.createElement(`script`);t.id=`particles-js-script`,t.src=`/js/particles.min.js`,t.onload=()=>{console.log(`particles.js loaded`),Kl(e)},document.head.appendChild(t)}return()=>{window.pJS&&window.pJS[e]?.destroy&&window.pJS[e].destroy()}},[e])}var Jl=`session.open`,Yl=`session.set`,Xl=`session.ids`,Zl=`session.materialize`,Ql=`session.close`,$l=`session.delta`;function eu(){let[e,t]=(0,X.useState)(null),[n,r]=(0,X.useState)(!0),[i,a]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let e=!0;async function n(){try{r(!0),a(null);let n=await J.get(`/ping`,{skipAuth:!0});e&&(n?.version?t(n.version):a(`Invalid server response`))}catch(t){e&&(console.error(`Failed to fetch server version:`,t),a(`Unable to connect to server`))}finally{e&&r(!1)}}n();let i=setInterval(n,3e4);return()=>{e=!1,clearInterval(i)}},[]),{serverVersion:e,isLoading:n,error:i}}var tu=`https://github.com/canvas-ui/canvas-server`,nu=null;function ru(){return nu||=J.get(`/ping`,{skipAuth:!0}).then(e=>{let t=e??{};return{sourceUrl:t.sourceUrl||tu,version:t.version??null,commit:t.commit??null,license:t.license??null}}).catch(e=>(console.error(`Failed to fetch server source info:`,e),nu=null,{sourceUrl:tu,version:null,commit:null,license:null})),nu}function iu(){let[e,t]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let e=!0;return ru().then(n=>{e&&t(n)}),()=>{e=!1}},[]),e}function au({className:e=``}){let t=iu();if(!t)return null;let n=[t.version?`v${t.version}`:null,t.commit?.slice(0,7)].filter(Boolean).join(` `);return(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground ${e}`,children:[`Powered by`,` `,(0,Z.jsx)(`a`,{href:t.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Canvas`}),n?` ${n}`:``,t.license?`, ${t.license}`:``,`.`,` `,(0,Z.jsx)(`a`,{href:t.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Get the source code`}),`.`]})}function ou({children:e}){ql(`particle-js`);let{serverVersion:t,isLoading:n,error:r}=eu();return(0,Z.jsx)(`div`,{className:`flex min-h-viewport w-full items-center justify-center p-4 flex-col`,children:(0,Z.jsxs)(zl,{className:`flex w-[95vw] h-viewport-modal overflow-hidden`,children:[(0,Z.jsxs)(`div`,{className:`hidden md:block w-1/2 relative bg-background`,"data-scheme":`dark`,id:`particle-js`,children:[(0,Z.jsxs)(we,{className:`absolute top-8 left-8 font-bold text-foreground flex items-center z-raised`,to:`/`,children:[(0,Z.jsx)(`img`,{src:`/images/logo-wr_128x128.png`,alt:`Canvas Logo`,className:`mr-2 h-6 w-6 touch-target`}),(0,Z.jsx)(`span`,{className:`text-2xl font-bold text-foreground`,children:`Canvas`})]}),(0,Z.jsxs)(`div`,{className:`absolute bottom-8 left-8 text-sm text-foreground max-w-[80%] z-raised`,children:[`Web UI: v`,Gl,`, Server: `,n?`Loading...`:r?`Unavailable`:t?`v${t}`:`Unknown`]})]}),(0,Z.jsx)(`div`,{className:`flex w-full md:w-1/2 flex-col justify-center px-4 py-12 sm:px-6 lg:px-8`,children:(0,Z.jsxs)(`div`,{className:`mx-auto w-full max-w-sm`,children:[e,(0,Z.jsxs)(`div`,{className:`mt-8 border-t pt-6`,children:[(0,Z.jsxs)(`a`,{href:`https://github.com/canvas-ui`,target:`_blank`,className:`text-muted-foreground hover:text-foreground justify-center flex items-center space-x-2`,rel:`noopener noreferrer`,children:[(0,Z.jsx)(`svg`,{viewBox:`0 0 24 24`,width:`24`,height:`24`,stroke:`currentColor`,fill:`none`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`w-6 h-6`,children:(0,Z.jsx)(`path`,{d:`M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22`})}),(0,Z.jsx)(`span`,{children:`View on GitHub`})]}),(0,Z.jsx)(au,{className:`mt-4 text-center`})]})]})})]})})}async function su(e,t,n=`auto`){try{let r=await J.post(no.login,{email:e,password:t,strategy:n},{skipAuth:!0});console.log(`Login response:`,r);let i=r;if(`token`in i)return console.log(`Setting auth token (direct):`,i.token.substring(0,10)+`...`),J.setAuthToken(i.token),B.connect(i.token),r;if(i&&`payload`in i&&i.payload&&i.payload.token)return console.log(`Setting auth token (nested):`,i.payload.token.substring(0,10)+`...`),J.setAuthToken(i.payload.token),B.connect(i.payload.token),r;throw console.error(`Invalid login response structure:`,r),Error(`Invalid login response: missing token`)}catch(e){throw console.error(`Login error:`,e),J.clearAuthToken(),e}}async function cu(e,t,n){try{return await J.post(no.register,{name:e,email:t,password:n},{skipAuth:!0})}catch(e){throw console.error(`Registration failed:`,e),e}}function lu(e){return e instanceof Error&&/^Network error/i.test(e.message)}function uu(){let e=localStorage.getItem(`authToken`);if(!e)return!1;if(e.startsWith(`canvas-`))return!0;try{return eo(e).exp*1e3>Date.now()}catch{return!1}}function du(){let e=localStorage.getItem(`authToken`);if(!e||e.startsWith(`canvas-`))return null;try{let t=eo(e);return t.exp*1e3<Date.now()?(J.clearAuthToken(),null):{id:t.sub,email:t.email,userType:t.userType||`user`}}catch(e){return console.error(`Failed to decode token:`,e),J.clearAuthToken(),null}}async function fu(){try{if(!J.isAuthenticated())return console.log(`Not authenticated, skipping getCurrentUser request`),null;let e=await J.get(no.me);return console.log(`Current user response:`,e),e&&e?(B.isConnected()||B.reconnect(),e):(console.warn(`Invalid user profile response structure:`,e),null)}catch(e){if(console.error(`Failed to get current user:`,e),lu(e))throw e;return e instanceof Error&&(e.message.includes(`USER_NOT_FOUND_IN_DATABASE`)||e.message.includes(`Your session is invalid`)||e.message.includes(`Authentication required`)||e.message.includes(`user account no longer exists`))?(console.warn(`Authentication error detected, clearing token:`,e.message),J.clearAuthToken(),B.disconnect(),null):null}}function pu(){return J.isAuthenticated()}function mu(){let e=new URL(`${yo}/oauth/google/login`);e.searchParams.set(`origin`,window.location.origin),window.location.assign(e.toString())}async function hu(e){let t=await J.post(`${yo}/oauth/google/exchange`,{code:e},{skipAuth:!0});if(!t?.token)throw Error(`Invalid login response: missing token`);J.setAuthToken(t.token),B.connect(t.token)}async function gu(){try{let e=await J.get(no.authConfig,{skipAuth:!0});return e||e}catch(e){return console.error(`Failed to get auth config:`,e),{strategies:{local:{enabled:!0},imap:{enabled:!1,domains:[]}}}}}async function _u(e){try{await J.post(no.verifyEmailRequest,{email:e},{skipAuth:!0})}catch(e){throw console.error(`Failed to request email verification:`,e),e}}var vu=e=>e?.strategies?.local?.enabled!==!1,yu=e=>e?.allowUserRegistrations!==!1;function bu(){let e=ft(),[t,n]=X.useState(!1),[r,i]=X.useState(``),[a,o]=X.useState(``),[s,c]=X.useState(!1),[l,u]=X.useState({}),[d,p]=X.useState(null),[m,h]=X.useState({email:``,password:``,strategy:`auto`});X.useEffect(()=>{uu()&&e(`/workspaces`),fetch(`${yo}/runtime/capabilities`).then(e=>e.ok?e.json():null).then(e=>n(e?.payload?.local===!0)).catch(()=>{}),gu().then(e=>{p(e)}).catch(e=>{console.error(`Failed to load auth config:`,e)})},[e]);let g=()=>{let e={};return m.email?/\S+@\S+\.\S+/.test(m.email)||(e.email=`Email is invalid`):e.email=`Email is required`,m.password||(e.password=`Password is required`),u(e),Object.keys(e).length===0},_=e=>{let{name:t,value:n}=e.target;h(e=>({...e,[t]:n}))};async function v(t){if(t.preventDefault(),g()){c(!0);try{console.log(`Attempting login with:`,m.email,`strategy:`,m.strategy);let t=await su(m.email,m.password,m.strategy);console.log(`Login successful, received token:`,`token`in t?!!t.token:!!t.payload?.token),u({}),e(`/home`)}catch(e){console.error(`Login error:`,e);let t=`Login failed`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;n.message?t=n.message:n.error?t=n.error:n.payload?.message&&(t=n.payload.message)}u({password:t})}finally{c(!1)}}}return t?(0,Z.jsx)(ou,{children:(0,Z.jsxs)(`form`,{className:`grid gap-4`,onSubmit:async t=>{t.preventDefault(),c(!0),o(``);try{if(J.setAuthToken(r.trim()),!await fu())throw Error(`The local token was not accepted`);e(`/workspaces`)}catch(e){J.clearAuthToken(),o(e instanceof Error?e.message:`Authentication failed`)}finally{c(!1)}},children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold`,children:`Connect to your local runtime`}),(0,Z.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Enter the token shown by `,(0,Z.jsx)(`code`,{children:`canvas runtime token`}),` in the runtime folder.`]}),(0,Z.jsx)(G,{htmlFor:`local-token`,children:`Local access token`}),(0,Z.jsx)(q,{id:`local-token`,type:`password`,autoComplete:`off`,value:r,onChange:e=>i(e.target.value),required:!0}),a&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:a}),(0,Z.jsx)(Y,{disabled:s,children:s?`Connecting…`:`Connect`})]})}):(0,Z.jsx)(ou,{children:(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Welcome back`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter your credentials to access your account`})]}),(0,Z.jsx)(`form`,{onSubmit:v,children:(0,Z.jsxs)(`div`,{className:`grid gap-4`,children:[d?.strategies?.imap?.enabled&&d.strategies.imap.domains.length>0&&(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`strategy`,children:`Authentication Method`}),(0,Z.jsxs)(`select`,{id:`strategy`,name:`strategy`,value:m.strategy,onChange:_,disabled:s,className:`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50`,children:[(0,Z.jsx)(`option`,{value:`auto`,children:`Auto-detect`}),(0,Z.jsx)(`option`,{value:`local`,children:`Local Account`}),(0,Z.jsx)(`option`,{value:`imap`,children:`Email Server (IMAP)`})]})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`email`,children:`Email`}),(0,Z.jsx)(q,{id:`email`,name:`email`,placeholder:`name@example.com`,type:`email`,autoCapitalize:`none`,autoComplete:`email`,autoCorrect:`off`,disabled:s,value:m.email,onChange:_}),l.email&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:l.email})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`password`,children:`Password`}),(0,Z.jsx)(q,{id:`password`,name:`password`,type:`password`,disabled:s,value:m.password,onChange:_}),l.password&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:l.password})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-4`,children:[(0,Z.jsx)(Y,{type:`submit`,disabled:s,children:s?`Signing in...`:`Sign In`}),d?.strategies?.google?.enabled&&(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,disabled:s,onClick:()=>mu(),children:[(0,Z.jsx)(f,{icon:`logos:google-icon`,width:16,height:16,className:`mr-2`}),`Sign in with Google`]}),vu(d)&&yu(d)&&(0,Z.jsx)(Y,{variant:`outline`,type:`button`,disabled:s,onClick:()=>e(`/register`),children:`Don't have an account? Sign up`})]})]})})]})})}function xu(){let e=ft(),{showToast:t}=wo(),[n,r]=X.useState(!1),[i,a]=X.useState({}),[o,s]=X.useState({name:``,email:``,password:``}),[c,l]=X.useState(!1),[u,d]=X.useState(!1),[f,p]=X.useState(null);X.useEffect(()=>{(async()=>{let t=await gu(),n=t?.strategies?.local;if(t?.allowUserRegistrations===!1||n?.enabled===!1){e(`/login`,{replace:!0});return}n?.passwordPolicy&&p(n.passwordPolicy),d(!!n?.requireEmailVerification)})()},[e]);let m=X.useMemo(()=>{if(!f)return null;let e=o.password||``;return{minLength:!f.minLength||e.length>=f.minLength,maxLength:!f.maxLength||e.length<=f.maxLength,uppercase:!f.requireUppercase||/[A-Z]/.test(e),lowercase:!f.requireLowercase||/[a-z]/.test(e),number:!f.requireNumbers||/[0-9]/.test(e),special:!f.requireSpecialChars||/[^A-Za-z0-9]/.test(e)}},[f,o.password]),h=()=>{let e={};if(!o.name)e.name=`Username is required`;else if(o.name.trim().length===0)e.name=`Username cannot be empty`;else{let t=o.name.toLowerCase().trim();t.length<3?e.name=`Username must be at least 3 characters long`:t.length>39?e.name=`Username cannot be longer than 39 characters`:/^[a-z0-9_-]+$/.test(t)?[`admin`,`administrator`,`root`,`system`,`support`,`help`,`api`,`www`,`mail`,`ftp`,`localhost`,`test`,`demo`,`canvas`,`universe`,`workspace`,`context`,`user`,`users`].includes(t)&&(e.name=`Username '${t}' is reserved and cannot be used`):e.name=`Username can only contain lowercase letters, numbers, underscores, and hyphens`}if(o.email?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.email)||(e.email=`Please enter a valid email address`):e.email=`Email is required`,!o.password)e.password=`Password is required`;else if(f){let t=o.password,n=[];f.minLength&&t.length<f.minLength&&n.push(`at least ${f.minLength} characters`),f.maxLength&&t.length>f.maxLength&&n.push(`no more than ${f.maxLength} characters`),f.requireUppercase&&!/[A-Z]/.test(t)&&n.push(`an uppercase letter`),f.requireLowercase&&!/[a-z]/.test(t)&&n.push(`a lowercase letter`),f.requireNumbers&&!/[0-9]/.test(t)&&n.push(`a number`),f.requireSpecialChars&&!/[^A-Za-z0-9]/.test(t)&&n.push(`a special character`),n.length&&(e.password=`Password must contain ${n.join(`, `).replace(/, ([^,]*)$/,` and $1`)}.`)}else o.password.length<8&&(e.password=`Password must be at least 8 characters long`);return a(e),Object.keys(e).length===0},g=e=>{let t={...o,[e.target.id]:e.target.value};s(t),(e.target.id===`name`||e.target.id===`email`||e.target.id===`password`)&&h()};return c?(0,Z.jsxs)(ou,{children:[(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Registration Successful!`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:u?`Check your email for a verification link to activate your account.`:`Your account has been created.`})]}),(0,Z.jsx)(`div`,{className:`space-y-6 text-center pt-6`,children:!u&&(0,Z.jsx)(Y,{asChild:!0,className:`w-full`,children:(0,Z.jsx)(we,{to:`/login`,children:`Go to Login`})})})]}):(0,Z.jsxs)(ou,{children:[(0,Z.jsxs)(`div`,{className:`flex flex-col space-y-2 text-center`,children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Create an account`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enter your email below to create your account`})]}),(0,Z.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),h()){r(!0);try{let e=await cu(o.name,o.email,o.password);console.log(`Registration successful:`,e),t({title:`Registration Successful`,description:u?`Check your email for a verification link before logging in.`:`You can now log in with your credentials.`,variant:`default`}),l(!0),s({name:``,email:``,password:``}),a({})}catch(e){console.error(`Registration failed:`,e);let n=e?.message||`Registration failed`;n.toLowerCase().includes(`password`)?a({...i,password:n}):a({...i,email:n}),t({title:`Registration Failed`,description:n,variant:`destructive`})}finally{r(!1)}}},className:`space-y-4 pt-6`,children:[(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Username`}),(0,Z.jsx)(q,{id:`name`,type:`text`,placeholder:`Enter your username (e.g., john_doe)`,value:o.name,onChange:g,disabled:n,className:i.name?`border-destructive`:``}),i.name&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:i.name}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`3-39 characters, lowercase letters, numbers, underscores, and hyphens only`})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(G,{htmlFor:`email`,children:`Email`}),(0,Z.jsx)(q,{id:`email`,type:`email`,placeholder:`name@example.com`,value:o.email,onChange:g,disabled:n,className:i.email?`border-destructive`:``}),i.email&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:i.email})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(G,{htmlFor:`password`,children:`Password`}),(0,Z.jsx)(q,{id:`password`,type:`password`,placeholder:`Enter your password`,value:o.password,onChange:g,disabled:n,className:i.password?`border-destructive`:``}),i.password&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:i.password}),f&&m&&(0,Z.jsxs)(`ul`,{className:`text-xs list-disc pl-4 space-y-1`,children:[(0,Z.jsxs)(`li`,{className:m.minLength?`text-success`:`text-muted-foreground`,children:[`At least `,f.minLength,` characters`]}),f.requireUppercase&&(0,Z.jsx)(`li`,{className:m.uppercase?`text-success`:`text-muted-foreground`,children:`At least one uppercase letter`}),f.requireLowercase&&(0,Z.jsx)(`li`,{className:m.lowercase?`text-success`:`text-muted-foreground`,children:`At least one lowercase letter`}),f.requireNumbers&&(0,Z.jsx)(`li`,{className:m.number?`text-success`:`text-muted-foreground`,children:`At least one number`}),f.requireSpecialChars&&(0,Z.jsx)(`li`,{className:m.special?`text-success`:`text-muted-foreground`,children:`At least one special character`}),f.maxLength&&(0,Z.jsxs)(`li`,{className:m.maxLength?`text-success`:`text-muted-foreground`,children:[`No more than `,f.maxLength,` characters`]})]})]}),(0,Z.jsx)(Y,{type:`submit`,className:`w-full`,disabled:n,children:n?`Creating Account...`:`Create Account`})]}),(0,Z.jsxs)(`div`,{className:`mt-4 text-center text-sm`,children:[`Already have an account?`,` `,(0,Z.jsx)(we,{to:`/login`,className:`underline`,children:`Sign in`})]}),(0,Z.jsxs)(`div`,{className:`px-8 py-4 text-center text-sm text-muted-foreground border-t mt-6`,children:[`By clicking continue, you agree to our`,` `,(0,Z.jsx)(we,{to:`/terms`,className:`underline underline-offset-4 hover:text-primary`,children:`Terms of Service`}),` `,`and`,` `,(0,Z.jsx)(we,{to:`/privacy`,className:`underline underline-offset-4 hover:text-primary`,children:`Privacy Policy`}),`.`]})]})}function Su(){let e=ft(),[t]=$t(),[n,r]=X.useState(t.get(`error`)),i=X.useRef(!1);return X.useEffect(()=>{let n=t.get(`code`);!n||i.current||(i.current=!0,hu(n).then(()=>e(`/home`,{replace:!0})).catch(e=>r(e instanceof Error?e.message:`Google sign-in failed`)))},[t,e]),(0,Z.jsx)(ou,{children:(0,Z.jsx)(`div`,{className:`flex flex-col space-y-4 text-center`,children:n?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Google sign-in failed`}),(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:n}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:()=>e(`/login`,{replace:!0}),children:`Back to sign in`})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`h1`,{className:`text-2xl font-semibold tracking-tight`,children:`Signing you in…`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Completing Google sign-in.`})]})})})}function Cu({children:e}){let[t,n]=(0,X.useState)(`loading`);return(0,X.useEffect)(()=>{(async()=>{try{if(!pu()){console.log(`No authentication token found, redirecting to login`),n(`unauthenticated`);return}let e=await fu();e?(console.log(`User authenticated:`,e.email),n(`authenticated`)):(console.log(`User not authenticated or token expired`),n(`unauthenticated`))}catch(e){if(console.error(`Authentication check failed:`,e),lu(e)){if(uu()){n(`authenticated`);return}J.clearAuthToken(),n(`unauthenticated`);return}e instanceof Error&&e.message.includes(`Authentication required`)&&(console.log(`Clearing invalid token from ProtectedRoute`),J.clearAuthToken()),n(`unauthenticated`)}})()},[]),t===`loading`?(0,Z.jsx)(`div`,{className:`flex h-screen items-center justify-center`,children:(0,Z.jsx)(nn,{className:`h-8 w-8`})}):t===`unauthenticated`?(0,Z.jsx)(ht,{to:`/login`,replace:!0}):(0,Z.jsx)(Z.Fragment,{children:e})}function wu({children:e}){let[t,n]=(0,X.useState)(null);return(0,X.useEffect)(()=>{(async()=>{try{await J.get(`/auth/me`),n(!0)}catch(e){e instanceof Error&&e.message.includes(`Authentication required`)&&(console.log(`Clearing invalid token from PublicRoute`),J.clearAuthToken()),n(!1)}})()},[]),t===null?null:t?(0,Z.jsx)(ht,{to:`/workspaces`,replace:!0}):(0,Z.jsx)(Z.Fragment,{children:e})}var Tu=i(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?r(e):typeof define==`function`&&define.amd?define([`exports`],r):(n=typeof globalThis<`u`?globalThis:n||self,r(n[`fast-equals`]={}))})(e,(function(e){function t(e){return function(t,n,r,i,a,o,s){return e(t,n,s)}}function n(e){return function(t,n,r,i){if(!t||!n||typeof t!=`object`||typeof n!=`object`)return e(t,n,r,i);var a=i.get(t),o=i.get(n);if(a&&o)return a===n&&o===t;i.set(t,n),i.set(n,t);var s=e(t,n,r,i);return i.delete(t),i.delete(n),s}}function r(e,t){var n={};for(var r in e)n[r]=e[r];for(var r in t)n[r]=t[r];return n}function i(e){return e.constructor===Object||e.constructor==null}function a(e){return typeof e.then==`function`}function o(e,t){return e===t||e!==e&&t!==t}var s=Object.prototype.toString;function c(e){var t=e.areArraysEqual,n=e.areDatesEqual,r=e.areMapsEqual,c=e.areObjectsEqual,l=e.areRegExpsEqual,u=e.areSetsEqual,d=e.createIsNestedEqual,f=d(p);function p(e,d,p){if(e===d)return!0;if(!e||!d||typeof e!=`object`||typeof d!=`object`)return e!==e&&d!==d;if(i(e)&&i(d))return c(e,d,f,p);var m=Array.isArray(e),h=Array.isArray(d);if(m||h)return m===h&&t(e,d,f,p);var g=s.call(e);return g===s.call(d)?g===`[object Date]`?n(e,d,f,p):g===`[object RegExp]`?l(e,d,f,p):g===`[object Map]`?r(e,d,f,p):g===`[object Set]`?u(e,d,f,p):g===`[object Object]`||g===`[object Arguments]`?a(e)||a(d)?!1:c(e,d,f,p):g===`[object Boolean]`||g===`[object Number]`||g===`[object String]`?o(e.valueOf(),d.valueOf()):!1:!1}return p}function l(e,t,n,r){var i=e.length;if(t.length!==i)return!1;for(;i-->0;)if(!n(e[i],t[i],i,i,e,t,r))return!1;return!0}var u=n(l);function d(e,t){return o(e.valueOf(),t.valueOf())}function f(e,t,n,r){var i=e.size===t.size;if(!i)return!1;if(!e.size)return!0;var a={},o=0;return e.forEach(function(s,c){if(i){var l=!1,u=0;t.forEach(function(i,d){!l&&!a[u]&&(l=n(c,d,o,u,e,t,r)&&n(s,i,c,d,e,t,r))&&(a[u]=!0),u++}),o++,i=l}}),i}var p=n(f),m=`_owner`,h=Object.prototype.hasOwnProperty;function g(e,t,n,r){var i=Object.keys(e),a=i.length;if(Object.keys(t).length!==a)return!1;for(var o;a-->0;){if(o=i[a],o===m){var s=!!e.$$typeof,c=!!t.$$typeof;if((s||c)&&s!==c)return!1}if(!h.call(t,o)||!n(e[o],t[o],o,o,e,t,r))return!1}return!0}var _=n(g);function v(e,t){return e.source===t.source&&e.flags===t.flags}function y(e,t,n,r){var i=e.size===t.size;if(!i)return!1;if(!e.size)return!0;var a={};return e.forEach(function(o,s){if(i){var c=!1,l=0;t.forEach(function(i,u){!c&&!a[l]&&(c=n(o,i,s,u,e,t,r))&&(a[l]=!0),l++}),i=c}}),i}var b=n(y),x=Object.freeze({areArraysEqual:l,areDatesEqual:d,areMapsEqual:f,areObjectsEqual:g,areRegExpsEqual:v,areSetsEqual:y,createIsNestedEqual:t}),S=Object.freeze({areArraysEqual:u,areDatesEqual:d,areMapsEqual:p,areObjectsEqual:_,areRegExpsEqual:v,areSetsEqual:b,createIsNestedEqual:t}),C=c(x);function w(e,t){return C(e,t,void 0)}var T=c(r(x,{createIsNestedEqual:function(){return o}}));function E(e,t){return T(e,t,void 0)}var D=c(S);function O(e,t){return D(e,t,new WeakMap)}var k=c(r(S,{createIsNestedEqual:function(){return o}}));function A(e,t){return k(e,t,new WeakMap)}function j(e){return c(r(x,e(x)))}function M(e){var t=c(r(S,e(S)));return(function(e,n,r){return r===void 0&&(r=new WeakMap),t(e,n,r)})}e.circularDeepEqual=O,e.circularShallowEqual=A,e.createCustomCircularEqual=M,e.createCustomEqual=j,e.deepEqual=w,e.sameValueZeroEqual=o,e.shallowEqual=E,Object.defineProperty(e,"__esModule",{value:!0})}))})),Eu=i(((e,t)=>{t.exports=function(e,t,n){return e===t||e.className===t.className&&n(e.style,t.style)&&e.width===t.width&&e.autoSize===t.autoSize&&e.cols===t.cols&&e.draggableCancel===t.draggableCancel&&e.draggableHandle===t.draggableHandle&&n(e.verticalCompact,t.verticalCompact)&&n(e.compactType,t.compactType)&&n(e.layout,t.layout)&&n(e.margin,t.margin)&&n(e.containerPadding,t.containerPadding)&&e.rowHeight===t.rowHeight&&e.maxRows===t.maxRows&&e.isBounded===t.isBounded&&e.isDraggable===t.isDraggable&&e.isResizable===t.isResizable&&e.allowOverlap===t.allowOverlap&&e.preventCollision===t.preventCollision&&e.useCSSTransforms===t.useCSSTransforms&&e.transformScale===t.transformScale&&e.isDroppable===t.isDroppable&&n(e.resizeHandles,t.resizeHandles)&&n(e.resizeHandle,t.resizeHandle)&&e.onLayoutChange===t.onLayoutChange&&e.onDragStart===t.onDragStart&&e.onDrag===t.onDrag&&e.onDragStop===t.onDragStop&&e.onResizeStart===t.onResizeStart&&e.onResize===t.onResize&&e.onResizeStop===t.onResizeStop&&e.onDrop===t.onDrop&&n(e.droppingItem,t.droppingItem)&&n(e.innerRef,t.innerRef)}})),Du=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.bottom=l,e.childrenEqual=h,e.cloneLayout=u,e.cloneLayoutItem=m,e.collides=_,e.compact=v,e.compactItem=x,e.compactType=se,e.correctBounds=S,e.fastPositionEqual=g,e.fastRGLPropsEqual=void 0,e.getAllCollisions=T,e.getFirstCollision=w,e.getLayoutItem=C,e.getStatics=E,e.modifyLayout=f,e.moveElement=D,e.moveElementAwayFromCollision=O,e.noop=void 0,e.perc=k,e.resizeItemInDirection=L,e.setTopLeft=ne,e.setTransform=R,e.sortLayoutItems=re,e.sortLayoutItemsByColRow=ae,e.sortLayoutItemsByRowCol=ie,e.synchronizeLayoutWithChildren=z,e.validateLayout=oe,e.withLayoutItem=p;var t=Tu(),n=r(d());function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?i(Object(n),!0).forEach(function(t){o(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function o(e,t,n){return(t=s(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e){var t=c(e,`string`);return typeof t==`symbol`?t:t+``}function c(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function l(e){let t=0,n;for(let r=0,i=e.length;r<i;r++)n=e[r].y+e[r].h,n>t&&(t=n);return t}function u(e){let t=Array(e.length);for(let n=0,r=e.length;n<r;n++)t[n]=m(e[n]);return t}function f(e,t){let n=Array(e.length);for(let r=0,i=e.length;r<i;r++)t.i===e[r].i?n[r]=t:n[r]=e[r];return n}function p(e,t,n){let r=C(e,t);return r?(r=n(m(r)),e=f(e,r),[e,r]):[e,null]}function m(e){return{w:e.w,h:e.h,x:e.x,y:e.y,i:e.i,minW:e.minW,maxW:e.maxW,minH:e.minH,maxH:e.maxH,moved:!!e.moved,static:!!e.static,isDraggable:e.isDraggable,isResizable:e.isResizable,resizeHandles:e.resizeHandles,isBounded:e.isBounded}}function h(e,r){return(0,t.deepEqual)(n.default.Children.map(e,e=>e?.key),n.default.Children.map(r,e=>e?.key))&&(0,t.deepEqual)(n.default.Children.map(e,e=>e?.props[`data-grid`]),n.default.Children.map(r,e=>e?.props[`data-grid`]))}e.fastRGLPropsEqual=Eu();function g(e,t){return e.left===t.left&&e.top===t.top&&e.width===t.width&&e.height===t.height}function _(e,t){return!(e.i===t.i||e.x+e.w<=t.x||e.x>=t.x+t.w||e.y+e.h<=t.y||e.y>=t.y+t.h)}function v(e,t,n,r){let i=E(e),a=l(i),o=re(e,t),s=Array(e.length);for(let c=0,l=o.length;c<l;c++){let l=m(o[c]);l.static||(l=x(i,l,t,n,o,r,a),a=Math.max(a,l.y+l.h),i.push(l)),s[e.indexOf(o[c])]=l,l.moved=!1}return s}var y={x:`w`,y:`h`};function b(e,t,n,r){let i=y[r];t[r]+=1;let a=e.map(e=>e.i).indexOf(t.i);for(let o=a+1;o<e.length;o++){let a=e[o];if(!a.static){if(a.y>t.y+t.h)break;_(t,a)&&b(e,a,n+t[i],r)}}t[r]=n}function x(e,t,n,r,i,a,o){let s=n===`vertical`,c=n===`horizontal`;if(s)for(t.y=Math.min(typeof o==`number`?o:l(e),t.y);t.y>0&&!w(e,t);)t.y--;else if(c)for(;t.x>0&&!w(e,t);)t.x--;let u;for(;(u=w(e,t))&&!(n===null&&a);)if(c?b(i,t,u.x+u.w,`x`):b(i,t,u.y+u.h,`y`),c&&t.x+t.w>r)for(t.x=r-t.w,t.y++;t.x>0&&!w(e,t);)t.x--;return t.y=Math.max(t.y,0),t.x=Math.max(t.x,0),t}function S(e,t){let n=E(e);for(let r=0,i=e.length;r<i;r++){let i=e[r];if(i.x+i.w>t.cols&&(i.x=t.cols-i.w),i.x<0&&(i.x=0,i.w=t.cols),!i.static)n.push(i);else for(;w(n,i);)i.y++}return e}function C(e,t){for(let n=0,r=e.length;n<r;n++)if(e[n].i===t)return e[n]}function w(e,t){for(let n=0,r=e.length;n<r;n++)if(_(e[n],t))return e[n]}function T(e,t){return e.filter(e=>_(e,t))}function E(e){return e.filter(e=>e.static)}function D(e,t,n,r,i,a,o,s,c){if(t.static&&t.isDraggable!==!0||t.y===r&&t.x===n)return e;`${t.i}${String(n)}${String(r)}${t.x}${t.y}`;let l=t.x,d=t.y;typeof n==`number`&&(t.x=n),typeof r==`number`&&(t.y=r),t.moved=!0;let f=re(e,o);(o===`vertical`&&typeof r==`number`?d>=r:o===`horizontal`&&typeof n==`number`&&l>=n)&&(f=f.reverse());let p=T(f,t),m=p.length>0;if(m&&c)return u(e);if(m&&a)return`${t.i}`,t.x=l,t.y=d,t.moved=!1,e;for(let n=0,r=p.length;n<r;n++){let r=p[n];`${t.i}${t.x}${t.y}${r.i}${r.x}${r.y}`,!r.moved&&(e=r.static?O(e,r,t,i,o,s):O(e,t,r,i,o,s))}return e}function O(e,t,n,r,i,a){let o=i===`horizontal`,s=i===`vertical`,c=t.static;if(r){r=!1;let l={x:o?Math.max(t.x-n.w,0):n.x,y:s?Math.max(t.y-n.h,0):n.y,w:n.w,h:n.h,i:`-1`},u=w(e,l),d=u&&u.y+u.h>t.y,f=u&&t.x+t.w>u.x;if(!u)return`${n.i}${l.x}${l.y}`,D(e,n,o?l.x:void 0,s?l.y:void 0,r,c,i,a);if(d&&s)return D(e,n,void 0,n.y+1,r,c,i,a);if(d&&i==null)return t.y=n.y,n.y+=n.h,e;if(f&&o)return D(e,t,n.x,void 0,r,c,i,a)}let l=o?n.x+1:void 0,u=s?n.y+1:void 0;return l==null&&u==null?e:D(e,n,o?n.x+1:void 0,s?n.y+1:void 0,r,c,i,a)}function k(e){return e*100+`%`}var A=(e,t,n,r)=>e+n>r?t:n,j=(e,t,n)=>e<0?t:n,M=e=>Math.max(0,e),N=e=>Math.max(0,e),P=(e,t,n)=>{let{left:r,height:i,width:a}=t,o=e.top-(i-e.height);return{left:r,width:a,height:j(o,e.height,i),top:N(o)}},ee=(e,t,n)=>{let{top:r,left:i,height:a,width:o}=t;return{top:r,height:a,width:A(e.left,e.width,o,n),left:M(i)}},F=(e,t,n)=>{let{top:r,height:i,width:a}=t,o=e.left-(a-e.width);return{height:i,width:o<0?e.width:A(e.left,e.width,a,n),top:N(r),left:M(o)}},I=(e,t,n)=>{let{top:r,left:i,height:a,width:o}=t;return{width:o,left:i,height:j(r,e.height,a),top:N(r)}},te={n:P,ne:function(){return P(arguments.length<=0?void 0:arguments[0],ee(...arguments),arguments.length<=2?void 0:arguments[2])},e:ee,se:function(){return I(arguments.length<=0?void 0:arguments[0],ee(...arguments),arguments.length<=2?void 0:arguments[2])},s:I,sw:function(){return I(arguments.length<=0?void 0:arguments[0],F(...arguments),arguments.length<=2?void 0:arguments[2])},w:F,nw:function(){return P(arguments.length<=0?void 0:arguments[0],F(...arguments),arguments.length<=2?void 0:arguments[2])}};function L(e,t,n,r){let i=te[e];return i?i(t,a(a({},t),n),r):n}function R(e){let{top:t,left:n,width:r,height:i}=e,a=`translate(${n}px,${t}px)`;return{transform:a,WebkitTransform:a,MozTransform:a,msTransform:a,OTransform:a,width:`${r}px`,height:`${i}px`,position:`absolute`}}function ne(e){let{top:t,left:n,width:r,height:i}=e;return{top:`${t}px`,left:`${n}px`,width:`${r}px`,height:`${i}px`,position:`absolute`}}function re(e,t){return t===`horizontal`?ae(e):t===`vertical`?ie(e):e}function ie(e){return e.slice(0).sort(function(e,t){return e.y>t.y||e.y===t.y&&e.x>t.x?1:e.y===t.y&&e.x===t.x?0:-1})}function ae(e){return e.slice(0).sort(function(e,t){return e.x>t.x||e.x===t.x&&e.y>t.y?1:-1})}function z(e,t,r,i,o){e||=[];let s=[];n.default.Children.forEach(t,t=>{if(t?.key==null)return;let n=C(e,String(t.key)),r=t.props[`data-grid`];n&&r==null?s.push(m(n)):r?s.push(m(a(a({},r),{},{i:t.key}))):s.push(m({w:1,h:1,x:0,y:l(s),i:String(t.key)}))});let c=S(s,{cols:r});return o?c:v(c,i,r)}function oe(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:`Layout`,n=[`x`,`y`,`w`,`h`];if(!Array.isArray(e))throw Error(t+` must be an array!`);for(let r=0,i=e.length;r<i;r++){let i=e[r];for(let e=0;e<n.length;e++){let a=n[e],o=i[a];if(typeof o!=`number`||Number.isNaN(o))throw Error(`ReactGridLayout: ${t}[${r}].${a} must be a number! Received: ${o} (${typeof o})`)}if(i.i!==void 0&&typeof i.i!=`string`)throw Error(`ReactGridLayout: ${t}[${r}].i must be a string! Received: ${i.i} (${typeof i.i})`)}}function se(e){let{verticalCompact:t,compactType:n}=e||{};return t===!1?null:n}e.noop=()=>{}})),Ou=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.calcGridColWidth=t,e.calcGridItemPosition=r,e.calcGridItemWHPx=n,e.calcWH=a,e.calcXY=i,e.clamp=o;function t(e){let{margin:t,containerPadding:n,containerWidth:r,cols:i}=e;return(r-t[0]*(i-1)-n[0]*2)/i}function n(e,t,n){return Number.isFinite(e)?Math.round(t*e+Math.max(0,e-1)*n):e}function r(e,r,i,a,o,s){let{margin:c,containerPadding:l,rowHeight:u}=e,d=t(e),f={};return s&&s.resizing?(f.width=Math.round(s.resizing.width),f.height=Math.round(s.resizing.height)):(f.width=n(a,d,c[0]),f.height=n(o,u,c[1])),s&&s.dragging?(f.top=Math.round(s.dragging.top),f.left=Math.round(s.dragging.left)):s&&s.resizing&&typeof s.resizing.top==`number`&&typeof s.resizing.left==`number`?(f.top=Math.round(s.resizing.top),f.left=Math.round(s.resizing.left)):(f.top=Math.round((u+c[1])*i+l[1]),f.left=Math.round((d+c[0])*r+l[0])),f}function i(e,n,r,i,a){let{margin:s,containerPadding:c,cols:l,rowHeight:u,maxRows:d}=e,f=t(e),p=Math.round((r-c[0])/(f+s[0])),m=Math.round((n-c[1])/(u+s[1]));return p=o(p,0,l-i),m=o(m,0,d-a),{x:p,y:m}}function a(e,n,r,i,a,s){let{margin:c,maxRows:l,cols:u,rowHeight:d}=e,f=t(e),p=Math.round((n+c[0])/(f+c[0])),m=Math.round((r+c[1])/(d+c[1])),h=o(p,0,u-i),g=o(m,0,l-a);return[`sw`,`w`,`nw`].indexOf(s)!==-1&&(h=o(p,0,u)),[`nw`,`n`,`ne`].indexOf(s)!==-1&&(g=o(m,0,l)),{w:h,h:g}}function o(e,t,n){return Math.max(Math.min(e,n),t)}})),ku=i(((e,t)=>{t.exports=`SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED`})),Au=i(((e,t)=>{var n=ku();function r(){}function i(){}i.resetWarningCache=r,t.exports=function(){function e(e,t,r,i,a,o){if(o!==n){var s=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name=`Invariant Violation`,s}}e.isRequired=e;function t(){return e}var a={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:r};return a.PropTypes=a,a}})),ju=i(((e,t)=>{t.exports=Au()()})),Mu=i(((e,t)=>{var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})},l=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of a(t))!s.call(e,c)&&c!==n&&r(e,c,{get:()=>t[c],enumerable:!(o=i(t,c))||o.enumerable});return e},u=(e,t,i)=>(i=e==null?{}:n(o(e)),l(t||!e||!e.__esModule?r(i,`default`,{value:e,enumerable:!0}):i,e)),f=e=>l(r({},`__esModule`,{value:!0}),e),p={};c(p,{DraggableCore:()=>Se,default:()=>Ce}),t.exports=f(p);var m=u(d()),g=u(ju()),_=u(h()),v=$a();function y(e,t){for(let n=0,r=e.length;n<r;n++)if(t.apply(t,[e[n],n,e]))return e[n]}function b(e){return typeof e==`function`||Object.prototype.toString.call(e)===`[object Function]`}function x(e){return typeof e==`number`&&!isNaN(e)}function S(e){return parseInt(e,10)}function C(e,t,n){if(e[t])return Error(`Invalid prop ${t} passed to ${n} - do not set this, set it on the child.`)}var w=[`Moz`,`Webkit`,`O`,`ms`];function T(e=`transform`){if(typeof window>`u`)return``;let t=window.document?.documentElement?.style;if(!t||e in t)return``;for(let n=0;n<w.length;n++)if(E(e,w[n])in t)return w[n];return``}function E(e,t){return t?`${t}${D(e)}`:e}function D(e){let t=``,n=!0;for(let r=0;r<e.length;r++)n?(t+=e[r].toUpperCase(),n=!1):e[r]===`-`?n=!0:t+=e[r];return t}var O=T(),k=``;function A(e,t){k||=y([`matches`,`webkitMatchesSelector`,`mozMatchesSelector`,`msMatchesSelector`,`oMatchesSelector`],function(t){return b(e[t])})??``;let n=e[k];return b(n)?!!n.call(e,t):!1}function j(e,t,n){let r=e;do{if(A(r,t))return!0;if(r===n)return!1;r=r.parentNode}while(r);return!1}function M(e,t,n,r){if(!e)return;let i={capture:!0,...r},a=n;e.addEventListener?e.addEventListener(t,a,i):e.attachEvent?e.attachEvent(`on`+t,a):e[`on`+t]=a}function N(e,t,n,r){if(!e)return;let i={capture:!0,...r},a=n;e.removeEventListener?e.removeEventListener(t,a,i):e.detachEvent?e.detachEvent(`on`+t,a):e[`on`+t]=null}function P(e){let t=e.clientHeight,n=e.ownerDocument.defaultView.getComputedStyle(e);return t+=S(n.borderTopWidth),t+=S(n.borderBottomWidth),t}function ee(e){let t=e.clientWidth,n=e.ownerDocument.defaultView.getComputedStyle(e);return t+=S(n.borderLeftWidth),t+=S(n.borderRightWidth),t}function F(e){let t=e.clientHeight,n=e.ownerDocument.defaultView.getComputedStyle(e);return t-=S(n.paddingTop),t-=S(n.paddingBottom),t}function I(e){let t=e.clientWidth,n=e.ownerDocument.defaultView.getComputedStyle(e);return t-=S(n.paddingLeft),t-=S(n.paddingRight),t}function te(e,t,n){let r=t===t.ownerDocument.body?{left:0,top:0}:t.getBoundingClientRect();return{x:(e.clientX+t.scrollLeft-r.left)/n,y:(e.clientY+t.scrollTop-r.top)/n}}function L(e,t){let n=ne(e,t,`px`);return{[E(`transform`,O)]:n}}function R(e,t){return ne(e,t,``)}function ne({x:e,y:t},n,r){let i=`translate(${e}${r},${t}${r})`;return n&&(i=`translate(${`${typeof n.x==`string`?n.x:n.x+r}`}, ${`${typeof n.y==`string`?n.y:n.y+r}`})`+i),i}function re(e,t){return e.targetTouches&&y(e.targetTouches,e=>t===e.identifier)||e.changedTouches&&y(e.changedTouches,e=>t===e.identifier)}function ie(e){if(e.targetTouches&&e.targetTouches[0])return e.targetTouches[0].identifier;if(e.changedTouches&&e.changedTouches[0])return e.changedTouches[0].identifier}function ae(){return typeof __webpack_nonce__<`u`?__webpack_nonce__:void 0}function z(e,t){if(!e)return;let n=e.getElementById(`react-draggable-style-el`);if(!n){n=e.createElement(`style`),n.type=`text/css`,n.id=`react-draggable-style-el`;let r=t??ae();r&&n.setAttribute(`nonce`,r),n.innerHTML=`.react-draggable-transparent-selection *::-moz-selection {all: inherit;}
|
|
3
3
|
`,n.innerHTML+=`.react-draggable-transparent-selection *::selection {all: inherit;}
|
|
4
4
|
`,e.getElementsByTagName(`head`)[0].appendChild(n)}e.body&&B(e.body,`react-draggable-transparent-selection`)}function oe(e){window.requestAnimationFrame?window.requestAnimationFrame(()=>{se(e)}):se(e)}function se(e){if(e)try{e.body&&ce(e.body,`react-draggable-transparent-selection`);let t=e.selection;if(t)t.empty();else{let t=(e.defaultView||window).getSelection();t&&t.type!==`Caret`&&t.removeAllRanges()}}catch{}}function B(e,t){e.classList?e.classList.add(t):e.className.match(RegExp(`(?:^|\\s)${t}(?!\\S)`))||(e.className+=` ${t}`)}function ce(e,t){e.classList?e.classList.remove(t):e.className=e.className.replace(RegExp(`(?:^|\\s)${t}(?!\\S)`,`g`),``)}function V(e,t,n){if(!e.props.bounds)return[t,n];let{bounds:r}=e.props;r=typeof r==`string`?r:he(r);let i=ge(e);if(typeof r==`string`){let{ownerDocument:e}=i,t=e.defaultView;if(!t)throw Error(`Cannot resolve the owner window of the draggable node.`);let n;if(n=r===`parent`?i.parentNode:i.getRootNode().querySelector(r),!(n instanceof t.HTMLElement))throw Error(`Bounds selector "`+r+`" could not find an element.`);let a=n,o=t.getComputedStyle(i),s=t.getComputedStyle(a);r={left:-i.offsetLeft+S(s.paddingLeft)+S(o.marginLeft),top:-i.offsetTop+S(s.paddingTop)+S(o.marginTop),right:I(a)-ee(i)-i.offsetLeft+S(s.paddingRight)-S(o.marginRight),bottom:F(a)-P(i)-i.offsetTop+S(s.paddingBottom)-S(o.marginBottom)}}return x(r.right)&&(t=Math.min(t,r.right)),x(r.bottom)&&(n=Math.min(n,r.bottom)),x(r.left)&&(t=Math.max(t,r.left)),x(r.top)&&(n=Math.max(n,r.top)),[t,n]}function le(e,t,n){return[Math.round(t/e[0])*e[0],Math.round(n/e[1])*e[1]]}function ue(e){return e.props.axis===`both`||e.props.axis===`x`}function de(e){return e.props.axis===`both`||e.props.axis===`y`}function fe(e,t,n){let r=typeof t==`number`?re(e,t):null;if(typeof t==`number`&&!r)return null;let i=ge(n),a=n.props.offsetParent||i.offsetParent||i.ownerDocument.body;return te(r||e,a,n.props.scale)}function pe(e,t,n){let r=!x(e.lastX),i=ge(e);return r?{node:i,deltaX:0,deltaY:0,lastX:t,lastY:n,x:t,y:n}:{node:i,deltaX:t-e.lastX,deltaY:n-e.lastY,lastX:e.lastX,lastY:e.lastY,x:t,y:n}}function me(e,t){let n=e.props.scale;return{node:t.node,x:e.state.x+t.deltaX/n,y:e.state.y+t.deltaY/n,deltaX:t.deltaX/n,deltaY:t.deltaY/n,lastX:e.state.x,lastY:e.state.y}}function he(e){return{left:e.left,top:e.top,right:e.right,bottom:e.bottom}}function ge(e){let t=e.findDOMNode();if(!t)throw Error(`<DraggableCore>: Unmounted during event!`);return t}var _e=u(d()),ve=u(ju()),ye=u(h()),be=typeof process<`u`&&{}.DRAGGABLE_DEBUG?console.log.bind(console):function(){},xe={touch:{start:`touchstart`,move:`touchmove`,stop:`touchend`},mouse:{start:`mousedown`,move:`mousemove`,stop:`mouseup`}},H=xe.mouse,Se=class extends _e.Component{constructor(){super(...arguments),this.dragging=!1,this.lastX=NaN,this.lastY=NaN,this.touchIdentifier=null,this.mounted=!1,this.handleDragStart=e=>{if(this.props.onMouseDown(e),!this.props.allowAnyClick&&(typeof e.button==`number`&&e.button!==0||e.ctrlKey))return!1;let t=this.findDOMNode();if(!t||!t.ownerDocument||!t.ownerDocument.body)throw Error(`<DraggableCore> not mounted on DragStart!`);let{ownerDocument:n}=t;if(this.props.disabled||!(e.target instanceof n.defaultView.Node)||this.props.handle&&!j(e.target,this.props.handle,t)||this.props.cancel&&j(e.target,this.props.cancel,t))return;e.type===`touchstart`&&!this.props.allowMobileScroll&&e.preventDefault();let r=ie(e);this.touchIdentifier=r;let i=fe(e,r,this);if(i==null)return;let{x:a,y:o}=i,s=pe(this,a,o);be(`DraggableCore: handleDragStart: %j`,s),be(`calling`,this.props.onStart),this.props.onStart(e,s)!==!1&&this.mounted!==!1&&(this.props.enableUserSelectHack&&z(n,this.props.nonce),this.dragging=!0,this.lastX=a,this.lastY=o,M(n,H.move,this.handleDrag),M(n,H.stop,this.handleDragStop))},this.handleDrag=e=>{let t=fe(e,this.touchIdentifier,this);if(t==null)return;let{x:n,y:r}=t;if(Array.isArray(this.props.grid)){let e=n-this.lastX,t=r-this.lastY;if([e,t]=le(this.props.grid,e,t),!e&&!t)return;n=this.lastX+e,r=this.lastY+t}let i=pe(this,n,r);if(be(`DraggableCore: handleDrag: %j`,i),this.props.onDrag(e,i)===!1||this.mounted===!1){try{this.handleDragStop(new MouseEvent(`mouseup`))}catch{let e=document.createEvent(`MouseEvents`);e.initMouseEvent(`mouseup`,!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),this.handleDragStop(e)}return}this.lastX=n,this.lastY=r},this.handleDragStop=e=>{if(!this.dragging)return;let t=fe(e,this.touchIdentifier,this);if(t==null)return;let{x:n,y:r}=t;if(Array.isArray(this.props.grid)){let e=n-this.lastX||0,t=r-this.lastY||0;[e,t]=le(this.props.grid,e,t),n=this.lastX+e,r=this.lastY+t}let i=pe(this,n,r);if(this.props.onStop(e,i)===!1||this.mounted===!1)return!1;let a=this.findDOMNode();a&&this.props.enableUserSelectHack&&oe(a.ownerDocument),be(`DraggableCore: handleDragStop: %j`,i),this.dragging=!1,this.lastX=NaN,this.lastY=NaN,a&&(be(`DraggableCore: Removing handlers`),N(a.ownerDocument,H.move,this.handleDrag),N(a.ownerDocument,H.stop,this.handleDragStop))},this.onMouseDown=e=>(H=xe.mouse,this.handleDragStart(e)),this.onMouseUp=e=>(H=xe.mouse,this.handleDragStop(e)),this.onTouchStart=e=>(H=xe.touch,this.handleDragStart(e)),this.onTouchEnd=e=>(H=xe.touch,this.handleDragStop(e))}componentDidMount(){this.mounted=!0;let e=this.findDOMNode();e&&M(e,xe.touch.start,this.onTouchStart,{passive:!1})}componentWillUnmount(){this.mounted=!1;let e=this.findDOMNode();if(e){let{ownerDocument:t}=e;N(t,xe.mouse.move,this.handleDrag),N(t,xe.touch.move,this.handleDrag),N(t,xe.mouse.stop,this.handleDragStop),N(t,xe.touch.stop,this.handleDragStop),N(e,xe.touch.start,this.onTouchStart,{passive:!1}),this.props.enableUserSelectHack&&oe(t)}}findDOMNode(){if(this.props?.nodeRef)return this.props.nodeRef.current;let e=ye.default;return typeof e.findDOMNode==`function`?e.findDOMNode(this):(be(`react-draggable: ReactDOM.findDOMNode is not available in React 19+. You must provide a nodeRef prop. See: https://github.com/react-grid-layout/react-draggable#noderef`),null)}render(){return _e.cloneElement(_e.Children.only(this.props.children),{onMouseDown:this.onMouseDown,onMouseUp:this.onMouseUp,onTouchEnd:this.onTouchEnd})}};Se.displayName=`DraggableCore`,Se.propTypes={allowAnyClick:ve.default.bool,allowMobileScroll:ve.default.bool,children:ve.default.node.isRequired,disabled:ve.default.bool,enableUserSelectHack:ve.default.bool,offsetParent:function(e,t){if(e[t]&&e[t].nodeType!==1)throw Error(`Draggable's offsetParent must be a DOM Node.`)},grid:ve.default.arrayOf(ve.default.number),handle:ve.default.string,cancel:ve.default.string,nodeRef:ve.default.object,nonce:ve.default.string,onStart:ve.default.func,onDrag:ve.default.func,onStop:ve.default.func,onMouseDown:ve.default.func,scale:ve.default.number,className:C,style:C,transform:C},Se.defaultProps={allowAnyClick:!1,allowMobileScroll:!1,disabled:!1,enableUserSelectHack:!0,onStart:function(){},onDrag:function(){},onStop:function(){},onMouseDown:function(){},scale:1};var Ce=class extends m.Component{constructor(e){super(e),this.onDragStart=(e,t)=>{if(be(`Draggable: onDragStart: %j`,t),this.props.onStart(e,me(this,t))===!1)return!1;this.setState({dragging:!0,dragged:!0})},this.onDrag=(e,t)=>{if(!this.state.dragging)return!1;be(`Draggable: onDrag: %j`,t);let n=me(this,t),r={x:n.x,y:n.y,slackX:0,slackY:0};if(this.props.bounds){let{x:e,y:t}=r;r.x+=this.state.slackX,r.y+=this.state.slackY;let[i,a]=V(this,r.x,r.y);r.x=i,r.y=a,r.slackX=this.state.slackX+(e-r.x),r.slackY=this.state.slackY+(t-r.y),n.x=r.x,n.y=r.y,n.deltaX=r.x-this.state.x,n.deltaY=r.y-this.state.y}if(this.props.onDrag(e,n)===!1)return!1;this.setState(r)},this.onDragStop=(e,t)=>{if(!this.state.dragging||this.props.onStop(e,me(this,t))===!1)return!1;be(`Draggable: onDragStop: %j`,t);let n={dragging:!1,slackX:0,slackY:0};if(this.props.position){let{x:e,y:t}=this.props.position;n.x=e,n.y=t}this.setState(n)},this.state={dragging:!1,dragged:!1,x:e.position?e.position.x:e.defaultPosition.x,y:e.position?e.position.y:e.defaultPosition.y,prevPropsPosition:{...e.position},slackX:0,slackY:0,isElementSVG:!1},e.position&&!(e.onDrag||e.onStop)&&console.warn("A `position` was applied to this <Draggable>, without drag handlers. This will make this component effectively undraggable. Please attach `onDrag` or `onStop` handlers so you can adjust the `position` of this element.")}static getDerivedStateFromProps({position:e},{prevPropsPosition:t}){return e&&(!t||e.x!==t.x||e.y!==t.y)?(be(`Draggable: getDerivedStateFromProps %j`,{position:e,prevPropsPosition:t}),{x:e.x,y:e.y,prevPropsPosition:{...e}}):null}componentDidMount(){window.SVGElement!==void 0&&this.findDOMNode()instanceof window.SVGElement&&this.setState({isElementSVG:!0})}componentWillUnmount(){this.state.dragging&&this.setState({dragging:!1})}findDOMNode(){if(this.props?.nodeRef)return this.props.nodeRef.current;let e=_.default;return typeof e.findDOMNode==`function`?e.findDOMNode(this):null}render(){let{axis:e,bounds:t,children:n,defaultPosition:r,defaultClassName:i,defaultClassNameDragging:a,defaultClassNameDragged:o,position:s,positionOffset:c,scale:l,...u}=this.props,d={},f=null,p=!s||this.state.dragging,h=s||r,g={x:ue(this)&&p?this.state.x:h.x,y:de(this)&&p?this.state.y:h.y};this.state.isElementSVG?f=R(g,c):d=L(g,c);let _=m.Children.only(n),y=(0,v.clsx)(_.props.className||``,i,{[a]:this.state.dragging,[o]:this.state.dragged});return m.createElement(Se,{...u,onStart:this.onDragStart,onDrag:this.onDrag,onStop:this.onDragStop},m.cloneElement(_,{className:y,style:{..._.props.style,...d},transform:f}))}};Ce.displayName=`Draggable`,Ce.propTypes={...Se.propTypes,axis:g.default.oneOf([`both`,`x`,`y`,`none`]),bounds:g.default.oneOfType([g.default.shape({left:g.default.number,right:g.default.number,top:g.default.number,bottom:g.default.number}),g.default.string,g.default.oneOf([!1])]),defaultClassName:g.default.string,defaultClassNameDragging:g.default.string,defaultClassNameDragged:g.default.string,defaultPosition:g.default.shape({x:g.default.number,y:g.default.number}),positionOffset:g.default.shape({x:g.default.oneOfType([g.default.number,g.default.string]),y:g.default.oneOfType([g.default.number,g.default.string])}),position:g.default.shape({x:g.default.number,y:g.default.number}),className:C,style:C,transform:C},Ce.defaultProps={...Se.defaultProps,axis:`both`,bounds:!1,defaultClassName:`react-draggable`,defaultClassNameDragging:`react-draggable-dragging`,defaultClassNameDragged:`react-draggable-dragged`,defaultPosition:{x:0,y:0},scale:1},0&&(t.exports={DraggableCore:Se})})),Nu=i(((e,t)=>{var n=Mu(),r=n.DraggableCore,i=n.default||n;t.exports=i,t.exports.default=i,t.exports.DraggableCore=r})),Pu=i((e=>{e.__esModule=!0,e.cloneElement=c;var t=n(d());function n(e){return e&&e.__esModule?e:{default:e}}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?r(Object(n),!0).forEach(function(t){a(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function a(e,t,n){return(t=o(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){var t=s(e,`string`);return typeof t==`symbol`?t:t+``}function s(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function c(e,n){return n.style&&e.props.style&&(n.style=i(i({},e.props.style),n.style)),n.className&&e.props.className&&(n.className=e.props.className+` `+n.className),t.default.cloneElement(e,n)}})),Fu=i((e=>{e.__esModule=!0,e.resizableProps=void 0;var t=n(ju());Nu();function n(e){return e&&e.__esModule?e:{default:e}}e.resizableProps={axis:t.default.oneOf([`both`,`x`,`y`,`none`]),className:t.default.string,children:t.default.element.isRequired,draggableOpts:t.default.shape({allowAnyClick:t.default.bool,cancel:t.default.string,children:t.default.node,disabled:t.default.bool,enableUserSelectHack:t.default.bool,offsetParent:typeof Element<`u`?t.default.instanceOf(Element):t.default.any,grid:t.default.arrayOf(t.default.number),handle:t.default.string,nodeRef:t.default.object,onStart:t.default.func,onDrag:t.default.func,onStop:t.default.func,onMouseDown:t.default.func,scale:t.default.number}),height:function(){var e=[...arguments];let n=e[0];return n.axis===`both`||n.axis===`y`?t.default.number.isRequired(...e):t.default.number(...e)},handle:t.default.oneOfType([t.default.node,t.default.func]),handleSize:t.default.arrayOf(t.default.number),lockAspectRatio:t.default.bool,maxConstraints:t.default.arrayOf(t.default.number),minConstraints:t.default.arrayOf(t.default.number),onResizeStop:t.default.func,onResizeStart:t.default.func,onResize:t.default.func,resizeHandles:t.default.arrayOf(t.default.oneOf([`s`,`w`,`e`,`n`,`sw`,`nw`,`se`,`ne`])),transformScale:t.default.number,width:function(){var e=[...arguments];let n=e[0];return n.axis===`both`||n.axis===`x`?t.default.number.isRequired(...e):t.default.number(...e)}}})),Iu=i((e=>{e.__esModule=!0,e.default=void 0;var t=o(d()),n=Nu(),r=Pu(),i=Fu(),a=[`children`,`className`,`draggableOpts`,`width`,`height`,`handle`,`handleSize`,`lockAspectRatio`,`axis`,`minConstraints`,`maxConstraints`,`onResize`,`onResizeStop`,`onResizeStart`,`resizeHandles`,`transformScale`];function o(e,t){if(typeof WeakMap==`function`)var n=new WeakMap,r=new WeakMap;return(o=function(e,t){if(!t&&e&&e.__esModule)return e;var i,a,o={__proto__:null,default:e};if(e===null||typeof e!=`object`&&typeof e!=`function`)return o;if(i=t?r:n){if(i.has(e))return i.get(e);i.set(e,o)}for(let t in e)t!=="default"&&{}.hasOwnProperty.call(e,t)&&((a=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?i(o,t,a):o[t]=e[t]);return o})(e,t)}function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s.apply(null,arguments)}function c(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l(Object(n),!0).forEach(function(t){f(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function f(e,t,n){return(t=p(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e){var t=m(e,`string`);return typeof t==`symbol`?t:t+``}function m(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var h=class extends t.Component{constructor(){super(...arguments),this.handleRefs={},this.lastHandleRect=null,this.slack=null,this.lastSize=null}componentWillUnmount(){this.resetData()}resetData(){this.lastHandleRect=this.slack=this.lastSize=null}runConstraints(e,t){let n=this.props,r=n.minConstraints,i=n.maxConstraints,a=n.lockAspectRatio;if(!r&&!i&&!a)return[e,t];if(a){let n=this.props.width/this.props.height,r=e-this.props.width,i=t-this.props.height;Math.abs(r)>Math.abs(i*n)?t=e/n:e=t*n}let o=e,s=t,c=this.slack||[0,0],l=c[0],u=c[1];return e+=l,t+=u,r&&(e=Math.max(r[0],e),t=Math.max(r[1],t)),i&&(e=Math.min(i[0],e),t=Math.min(i[1],t)),this.slack=[l+(o-e),u+(s-t)],[e,t]}resizeHandler(e,t){return(n,r)=>{let i=r.node,a=r.deltaX,o=r.deltaY;e===`onResizeStart`&&this.resetData();let s=(this.props.axis===`both`||this.props.axis===`x`)&&t!==`n`&&t!==`s`,c=(this.props.axis===`both`||this.props.axis===`y`)&&t!==`e`&&t!==`w`;if(!s&&!c)return;let l=t[0],u=t[t.length-1],d=i.getBoundingClientRect();if(this.lastHandleRect!=null){if(u===`w`){let e=d.left-this.lastHandleRect.left;a+=e}if(l===`n`){let e=d.top-this.lastHandleRect.top;o+=e}}this.lastHandleRect=d,u===`w`&&(a=-a),l===`n`&&(o=-o);let f=this.lastSize?.width??this.props.width,p=this.lastSize?.height??this.props.height,m=f+(s?a/this.props.transformScale:0),h=p+(c?o/this.props.transformScale:0);var g=this.runConstraints(m,h);if(m=g[0],h=g[1],e===`onResizeStop`&&this.lastSize){var _=this.lastSize;m=_.width,h=_.height}let v=m!==f||h!==p;e!==`onResizeStop`&&(this.lastSize={width:m,height:h});let y=typeof this.props[e]==`function`?this.props[e]:null;y&&!(e===`onResize`&&!v)&&(n.persist==null||n.persist(),y(n,{node:i,size:{width:m,height:h},handle:t})),e===`onResizeStop`&&this.resetData()}}renderResizeHandle(e,n){let r=this.props.handle;if(!r)return t.createElement(`span`,{className:`react-resizable-handle react-resizable-handle-`+e,ref:n});if(typeof r==`function`)return r(e,n);let i=typeof r.type==`string`,a=u({ref:n},i?{}:{handleAxis:e});return t.cloneElement(r,a)}render(){let e=this.props,i=e.children,o=e.className,l=e.draggableOpts;e.width,e.height,e.handle,e.handleSize,e.lockAspectRatio,e.axis,e.minConstraints,e.maxConstraints,e.onResize,e.onResizeStop,e.onResizeStart;let d=e.resizeHandles;e.transformScale;let f=c(e,a);return(0,r.cloneElement)(i,u(u({},f),{},{className:(o?o+` `:``)+`react-resizable`,children:[...t.Children.toArray(i.props.children),...d.map(e=>{let r=this.handleRefs[e]??(this.handleRefs[e]=t.createRef());return t.createElement(n.DraggableCore,s({},l,{nodeRef:r,key:`resizableHandle-`+e,onStop:this.resizeHandler(`onResizeStop`,e),onStart:this.resizeHandler(`onResizeStart`,e),onDrag:this.resizeHandler(`onResize`,e)}),this.renderResizeHandle(e,r))})]}))}};e.default=h,h.propTypes=i.resizableProps,h.defaultProps={axis:`both`,handleSize:[20,20],lockAspectRatio:!1,minConstraints:[20,20],maxConstraints:[1/0,1/0],resizeHandles:[`se`],transformScale:1}})),Lu=i((e=>{e.__esModule=!0,e.default=void 0;var t=s(d()),n=o(ju()),r=o(Iu()),i=Fu(),a=[`handle`,`handleSize`,`onResize`,`onResizeStart`,`onResizeStop`,`draggableOpts`,`minConstraints`,`maxConstraints`,`lockAspectRatio`,`axis`,`width`,`height`,`resizeHandles`,`style`,`transformScale`];function o(e){return e&&e.__esModule?e:{default:e}}function s(e,t){if(typeof WeakMap==`function`)var n=new WeakMap,r=new WeakMap;return(s=function(e,t){if(!t&&e&&e.__esModule)return e;var i,a,o={__proto__:null,default:e};if(e===null||typeof e!=`object`&&typeof e!=`function`)return o;if(i=t?r:n){if(i.has(e))return i.get(e);i.set(e,o)}for(let t in e)t!=="default"&&{}.hasOwnProperty.call(e,t)&&((a=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?i(o,t,a):o[t]=e[t]);return o})(e,t)}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},c.apply(null,arguments)}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l(Object(n),!0).forEach(function(t){f(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function f(e,t,n){return(t=p(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e){var t=m(e,`string`);return typeof t==`symbol`?t:t+``}function m(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function h(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}var g=class extends t.Component{constructor(){super(...arguments),this.state={width:this.props.width,height:this.props.height,propsWidth:this.props.width,propsHeight:this.props.height},this.onResize=(e,t)=>{let n=t.size;this.props.onResize?(e.persist==null||e.persist(),this.setState(n,()=>this.props.onResize&&this.props.onResize(e,t))):this.setState(n)}}static getDerivedStateFromProps(e,t){return t.propsWidth!==e.width||t.propsHeight!==e.height?{width:e.width,height:e.height,propsWidth:e.width,propsHeight:e.height}:null}render(){let e=this.props,n=e.handle,i=e.handleSize;e.onResize;let o=e.onResizeStart,s=e.onResizeStop,l=e.draggableOpts,d=e.minConstraints,f=e.maxConstraints,p=e.lockAspectRatio,m=e.axis;e.width,e.height;let g=e.resizeHandles,_=e.style,v=e.transformScale,y=h(e,a);return t.createElement(r.default,{axis:m,draggableOpts:l,handle:n,handleSize:i,height:this.state.height,lockAspectRatio:p,maxConstraints:f,minConstraints:d,onResizeStart:o,onResize:this.onResize,onResizeStop:s,resizeHandles:g,transformScale:v,width:this.state.width},t.createElement(`div`,c({},y,{style:u(u({},_),{},{width:this.state.width+`px`,height:this.state.height+`px`})})))}};e.default=g,g.propTypes=u(u({},i.resizableProps),{},{children:n.default.element})})),Ru=i(((e,t)=>{t.exports=function(){throw Error(`Don't instantiate Resizable directly! Use require('react-resizable').Resizable`)},t.exports.Resizable=Iu().default,t.exports.ResizableBox=Lu().default})),zu=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.resizeHandleType=e.resizeHandleAxesType=e.default=void 0;var t=r(ju()),n=r(d());function r(e){return e&&e.__esModule?e:{default:e}}var i=e.resizeHandleAxesType=t.default.arrayOf(t.default.oneOf([`s`,`w`,`e`,`n`,`sw`,`nw`,`se`,`ne`])),a=e.resizeHandleType=t.default.oneOfType([t.default.node,t.default.func]);e.default={className:t.default.string,style:t.default.object,width:t.default.number,autoSize:t.default.bool,cols:t.default.number,draggableCancel:t.default.string,draggableHandle:t.default.string,verticalCompact:function(e){e.verticalCompact},compactType:t.default.oneOf([`vertical`,`horizontal`]),layout:function(e){var t=e.layout;t!==void 0&&Du().validateLayout(t,`layout`)},margin:t.default.arrayOf(t.default.number),containerPadding:t.default.arrayOf(t.default.number),rowHeight:t.default.number,maxRows:t.default.number,isBounded:t.default.bool,isDraggable:t.default.bool,isResizable:t.default.bool,allowOverlap:t.default.bool,preventCollision:t.default.bool,useCSSTransforms:t.default.bool,transformScale:t.default.number,isDroppable:t.default.bool,resizeHandles:i,resizeHandle:a,onLayoutChange:t.default.func,onDragStart:t.default.func,onDrag:t.default.func,onDragStop:t.default.func,onResizeStart:t.default.func,onResize:t.default.func,onResizeStop:t.default.func,onDrop:t.default.func,droppingItem:t.default.shape({i:t.default.string.isRequired,w:t.default.number.isRequired,h:t.default.number.isRequired}),children:function(e,t){let r=e[t],i={};n.default.Children.forEach(r,function(e){if(e?.key!=null){if(i[e.key])throw Error(`Duplicate child key "`+e.key+`" found! This will cause problems in ReactGridLayout.`);i[e.key]=!0}})},innerRef:t.default.any}})),Bu=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=u(d()),n=h(),r=u(ju()),i=Nu(),a=Ru(),o=Du(),s=Ou(),c=zu(),l=u($a());function u(e){return e&&e.__esModule?e:{default:e}}function f(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function p(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?f(Object(n),!0).forEach(function(t){m(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):f(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function m(e,t,n){return(t=g(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function g(e){var t=_(e,`string`);return typeof t==`symbol`?t:t+``}function _(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var v=class extends t.default.Component{constructor(){super(...arguments),m(this,`state`,{resizing:null,dragging:null,className:``}),m(this,`elementRef`,t.default.createRef()),m(this,`onDragStart`,(e,t)=>{let{node:n}=t,{onDragStart:r,transformScale:i}=this.props;if(!r)return;let a={top:0,left:0},{offsetParent:o}=n;if(!o)return;let c=o.getBoundingClientRect(),l=n.getBoundingClientRect(),u=l.left/i,d=c.left/i,f=l.top/i,p=c.top/i;a.left=u-d+o.scrollLeft,a.top=f-p+o.scrollTop,this.setState({dragging:a});let{x:m,y:h}=(0,s.calcXY)(this.getPositionParams(),a.top,a.left,this.props.w,this.props.h);return r.call(this,this.props.i,m,h,{e,node:n,newPosition:a})}),m(this,`onDrag`,(e,t,r)=>{let{node:i,deltaX:a,deltaY:o}=t,{onDrag:c}=this.props;if(!c)return;if(!this.state.dragging)throw Error(`onDrag called before onDragStart.`);let l=this.state.dragging.top+o,u=this.state.dragging.left+a,{isBounded:d,i:f,w:p,h:m,containerWidth:h}=this.props,g=this.getPositionParams();if(d){let{offsetParent:e}=i;if(e){let{margin:t,rowHeight:n}=this.props,r=e.clientHeight-(0,s.calcGridItemWHPx)(m,n,t[1]);l=(0,s.clamp)(l,0,r);let i=(0,s.calcGridColWidth)(g),a=h-(0,s.calcGridItemWHPx)(p,i,t[0]);u=(0,s.clamp)(u,0,a)}}let _={top:l,left:u};r?this.setState({dragging:_}):(0,n.flushSync)(()=>{this.setState({dragging:_})});let{x:v,y}=(0,s.calcXY)(g,l,u,p,m);return c.call(this,f,v,y,{e,node:i,newPosition:_})}),m(this,`onDragStop`,(e,t)=>{let{node:n}=t,{onDragStop:r}=this.props;if(!r)return;if(!this.state.dragging)throw Error(`onDragEnd called before onDragStart.`);let{w:i,h:a,i:o}=this.props,{left:c,top:l}=this.state.dragging,u={top:l,left:c};this.setState({dragging:null});let{x:d,y:f}=(0,s.calcXY)(this.getPositionParams(),l,c,i,a);return r.call(this,o,d,f,{e,node:n,newPosition:u})}),m(this,`onResizeStop`,(e,t,n)=>this.onResizeHandler(e,t,n,`onResizeStop`)),m(this,`onResizeStart`,(e,t,n)=>this.onResizeHandler(e,t,n,`onResizeStart`)),m(this,`onResize`,(e,t,n)=>this.onResizeHandler(e,t,n,`onResize`))}shouldComponentUpdate(e,t){if(this.props.children!==e.children||this.props.droppingPosition!==e.droppingPosition)return!0;let n=(0,s.calcGridItemPosition)(this.getPositionParams(this.props),this.props.x,this.props.y,this.props.w,this.props.h,this.state),r=(0,s.calcGridItemPosition)(this.getPositionParams(e),e.x,e.y,e.w,e.h,t);return!(0,o.fastPositionEqual)(n,r)||this.props.useCSSTransforms!==e.useCSSTransforms}componentDidMount(){this.moveDroppingItem({})}componentDidUpdate(e){this.moveDroppingItem(e)}moveDroppingItem(e){let{droppingPosition:t}=this.props;if(!t)return;let n=this.elementRef.current;if(!n)return;let r=e.droppingPosition||{left:0,top:0},{dragging:i}=this.state,a=i&&t.left!==r.left||t.top!==r.top;if(!i)this.onDragStart(t.e,{node:n,deltaX:t.left,deltaY:t.top});else if(a){let e=t.left-i.left,r=t.top-i.top;this.onDrag(t.e,{node:n,deltaX:e,deltaY:r},!0)}}getPositionParams(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.props;return{cols:e.cols,containerPadding:e.containerPadding,containerWidth:e.containerWidth,margin:e.margin,maxRows:e.maxRows,rowHeight:e.rowHeight}}createStyle(e){let{usePercentages:t,containerWidth:n,useCSSTransforms:r}=this.props,i;return r?i=(0,o.setTransform)(e):(i=(0,o.setTopLeft)(e),t&&(i.left=(0,o.perc)(e.left/n),i.width=(0,o.perc)(e.width/n))),i}mixinDraggable(e,n){return t.default.createElement(i.DraggableCore,{disabled:!n,onStart:this.onDragStart,onDrag:this.onDrag,onStop:this.onDragStop,handle:this.props.handle,cancel:`.react-resizable-handle`+(this.props.cancel?`,`+this.props.cancel:``),scale:this.props.transformScale,nodeRef:this.elementRef},e)}curryResizeHandler(e,t){return(n,r)=>t(n,r,e)}mixinResizable(e,n,r){let{cols:i,minW:o,minH:c,maxW:l,maxH:u,transformScale:d,resizeHandles:f,resizeHandle:p}=this.props,m=this.getPositionParams(),h=(0,s.calcGridItemPosition)(m,0,0,i,0).width,g=(0,s.calcGridItemPosition)(m,0,0,o,c),_=(0,s.calcGridItemPosition)(m,0,0,l,u),v=[g.width,g.height],y=[Math.min(_.width,h),Math.min(_.height,1/0)];return t.default.createElement(a.Resizable,{draggableOpts:{disabled:!r},className:r?void 0:`react-resizable-hide`,width:n.width,height:n.height,minConstraints:v,maxConstraints:y,onResizeStop:this.curryResizeHandler(n,this.onResizeStop),onResizeStart:this.curryResizeHandler(n,this.onResizeStart),onResize:this.curryResizeHandler(n,this.onResize),transformScale:d,resizeHandles:f,handle:p},e)}onResizeHandler(e,t,r,i){let{node:a,size:c,handle:l}=t,u=this.props[i];if(!u)return;let{x:d,y:f,i:p,maxH:m,minH:h,containerWidth:g}=this.props,{minW:_,maxW:v}=this.props,y=c;a&&(y=(0,o.resizeItemInDirection)(l,r,c,g),(0,n.flushSync)(()=>{this.setState({resizing:i===`onResizeStop`?null:y})}));let{w:b,h:x}=(0,s.calcWH)(this.getPositionParams(),y.width,y.height,d,f,l);b=(0,s.clamp)(b,Math.max(_,1),v),x=(0,s.clamp)(x,h,m),u.call(this,p,b,x,{e,node:a,size:y,handle:l})}render(){let{x:e,y:n,w:r,h:i,isDraggable:a,isResizable:o,droppingPosition:c,useCSSTransforms:u}=this.props,d=(0,s.calcGridItemPosition)(this.getPositionParams(),e,n,r,i,this.state),f=t.default.Children.only(this.props.children),m=t.default.cloneElement(f,{ref:this.elementRef,className:(0,l.default)(`react-grid-item`,f.props.className,this.props.className,{static:this.props.static,resizing:!!this.state.resizing,"react-draggable":a,"react-draggable-dragging":!!this.state.dragging,dropping:!!c,cssTransforms:u}),style:p(p(p({},this.props.style),f.props.style),this.createStyle(d))});return m=this.mixinResizable(m,d,o),m=this.mixinDraggable(m,a),m}};e.default=v,m(v,`propTypes`,{children:r.default.element,cols:r.default.number.isRequired,containerWidth:r.default.number.isRequired,rowHeight:r.default.number.isRequired,margin:r.default.array.isRequired,maxRows:r.default.number.isRequired,containerPadding:r.default.array.isRequired,x:r.default.number.isRequired,y:r.default.number.isRequired,w:r.default.number.isRequired,h:r.default.number.isRequired,minW:function(e,t){let n=e[t];if(typeof n!=`number`)return Error(`minWidth not Number`);if(n>e.w||n>e.maxW)return Error(`minWidth larger than item width/maxWidth`)},maxW:function(e,t){let n=e[t];if(typeof n!=`number`)return Error(`maxWidth not Number`);if(n<e.w||n<e.minW)return Error(`maxWidth smaller than item width/minWidth`)},minH:function(e,t){let n=e[t];if(typeof n!=`number`)return Error(`minHeight not Number`);if(n>e.h||n>e.maxH)return Error(`minHeight larger than item height/maxHeight`)},maxH:function(e,t){let n=e[t];if(typeof n!=`number`)return Error(`maxHeight not Number`);if(n<e.h||n<e.minH)return Error(`maxHeight smaller than item height/minHeight`)},i:r.default.string.isRequired,resizeHandles:c.resizeHandleAxesType,resizeHandle:c.resizeHandleType,onDragStop:r.default.func,onDragStart:r.default.func,onDrag:r.default.func,onResizeStop:r.default.func,onResizeStart:r.default.func,onResize:r.default.func,isDraggable:r.default.bool.isRequired,isResizable:r.default.bool.isRequired,isBounded:r.default.bool.isRequired,static:r.default.bool,useCSSTransforms:r.default.bool.isRequired,transformScale:r.default.number,className:r.default.string,handle:r.default.string,cancel:r.default.string,droppingPosition:r.default.shape({e:r.default.object.isRequired,left:r.default.number.isRequired,top:r.default.number.isRequired})}),m(v,`defaultProps`,{className:``,cancel:``,handle:``,minH:1,minW:1,maxH:1/0,maxW:1/0,transformScale:1})})),Vu=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=l(d()),n=Tu(),r=c($a()),i=Du(),a=Ou(),o=c(Bu()),s=c(zu());function c(e){return e&&e.__esModule?e:{default:e}}function l(e,t){if(typeof WeakMap==`function`)var n=new WeakMap,r=new WeakMap;return(l=function(e,t){if(!t&&e&&e.__esModule)return e;var i,a,o={__proto__:null,default:e};if(e===null||typeof e!=`object`&&typeof e!=`function`)return o;if(i=t?r:n){if(i.has(e))return i.get(e);i.set(e,o)}for(let t in e)t!=="default"&&{}.hasOwnProperty.call(e,t)&&((a=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?i(o,t,a):o[t]=e[t]);return o})(e,t)}function u(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function f(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?u(Object(n),!0).forEach(function(t){p(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):u(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function p(e,t,n){return(t=m(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function m(e){var t=h(e,`string`);return typeof t==`symbol`?t:t+``}function h(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var g=`react-grid-layout`,_=!1;try{_=/firefox/i.test(navigator.userAgent)}catch{}var v=class extends t.Component{constructor(){super(...arguments),p(this,`state`,{activeDrag:null,layout:(0,i.synchronizeLayoutWithChildren)(this.props.layout,this.props.children,this.props.cols,(0,i.compactType)(this.props),this.props.allowOverlap),mounted:!1,oldDragItem:null,oldLayout:null,oldResizeItem:null,resizing:!1,droppingDOMNode:null,children:[]}),p(this,`dragEnterCounter`,0),p(this,`onDragStart`,(e,t,n,r)=>{let{e:a,node:o}=r,{layout:s}=this.state,c=(0,i.getLayoutItem)(s,e);if(!c)return;let l={w:c.w,h:c.h,x:c.x,y:c.y,placeholder:!0,i:e};return this.setState({oldDragItem:(0,i.cloneLayoutItem)(c),oldLayout:s,activeDrag:l}),this.props.onDragStart(s,c,c,null,a,o)}),p(this,`onDrag`,(e,t,n,r)=>{let{e:a,node:o}=r,{oldDragItem:s}=this.state,{layout:c}=this.state,{cols:l,allowOverlap:u,preventCollision:d}=this.props,f=(0,i.getLayoutItem)(c,e);if(!f)return;let p={w:f.w,h:f.h,x:f.x,y:f.y,placeholder:!0,i:e};c=(0,i.moveElement)(c,f,t,n,!0,d,(0,i.compactType)(this.props),l,u),this.props.onDrag(c,s,f,p,a,o),this.setState({layout:u?c:(0,i.compact)(c,(0,i.compactType)(this.props),l),activeDrag:p})}),p(this,`onDragStop`,(e,t,n,r)=>{let{e:a,node:o}=r;if(!this.state.activeDrag)return;let{oldDragItem:s}=this.state,{layout:c}=this.state,{cols:l,preventCollision:u,allowOverlap:d}=this.props,f=(0,i.getLayoutItem)(c,e);if(!f)return;c=(0,i.moveElement)(c,f,t,n,!0,u,(0,i.compactType)(this.props),l,d);let p=d?c:(0,i.compact)(c,(0,i.compactType)(this.props),l);this.props.onDragStop(p,s,f,null,a,o);let{oldLayout:m}=this.state;this.setState({activeDrag:null,layout:p,oldDragItem:null,oldLayout:null}),this.onLayoutMaybeChanged(p,m)}),p(this,`onResizeStart`,(e,t,n,r)=>{let{e:a,node:o}=r,{layout:s}=this.state,c=(0,i.getLayoutItem)(s,e);c&&(this.setState({oldResizeItem:(0,i.cloneLayoutItem)(c),oldLayout:this.state.layout,resizing:!0}),this.props.onResizeStart(s,c,c,null,a,o))}),p(this,`onResize`,(e,t,n,r)=>{let{e:a,node:o,size:s,handle:c}=r,{oldResizeItem:l}=this.state,{layout:u}=this.state,{cols:d,preventCollision:p,allowOverlap:m}=this.props,h=!1,g,_,v,[y,b]=(0,i.withLayoutItem)(u,e,e=>{let r;return _=e.x,v=e.y,[`sw`,`w`,`nw`,`n`,`ne`].indexOf(c)!==-1&&([`sw`,`nw`,`w`].indexOf(c)!==-1&&(_=e.x+(e.w-t),t=e.x!==_&&_<0?e.w:t,_=_<0?0:_),[`ne`,`n`,`nw`].indexOf(c)!==-1&&(v=e.y+(e.h-n),n=e.y!==v&&v<0?e.h:n,v=v<0?0:v),h=!0),p&&!m&&(r=(0,i.getAllCollisions)(u,f(f({},e),{},{w:t,h:n,x:_,y:v})).filter(t=>t.i!==e.i).length>0,r&&(v=e.y,n=e.h,_=e.x,t=e.w,h=!1)),e.w=t,e.h=n,e});if(!b)return;g=y,h&&(g=(0,i.moveElement)(y,b,_,v,!0,this.props.preventCollision,(0,i.compactType)(this.props),d,m));let x={w:b.w,h:b.h,x:b.x,y:b.y,static:!0,i:e};this.props.onResize(g,l,b,x,a,o),this.setState({layout:m?g:(0,i.compact)(g,(0,i.compactType)(this.props),d),activeDrag:x})}),p(this,`onResizeStop`,(e,t,n,r)=>{let{e:a,node:o}=r,{layout:s,oldResizeItem:c}=this.state,{cols:l,allowOverlap:u}=this.props,d=(0,i.getLayoutItem)(s,e),f=u?s:(0,i.compact)(s,(0,i.compactType)(this.props),l);this.props.onResizeStop(f,c,d,null,a,o);let{oldLayout:p}=this.state;this.setState({activeDrag:null,layout:f,oldResizeItem:null,oldLayout:null,resizing:!1}),this.onLayoutMaybeChanged(f,p)}),p(this,`onDragOver`,e=>{var n;if(e.preventDefault(),e.stopPropagation(),_&&!((n=e.nativeEvent.target)!=null&&n.classList.contains(g)))return!1;let{droppingItem:r,onDropDragOver:i,margin:o,cols:s,rowHeight:c,maxRows:l,width:u,containerPadding:d,transformScale:p}=this.props,m=i?.(e);if(m===!1)return this.state.droppingDOMNode&&this.removeDroppingPlaceholder(),!1;let h=f(f({},r),m),{layout:v}=this.state,y=e.currentTarget.getBoundingClientRect(),b=e.clientX-y.left,x=e.clientY-y.top,S={left:b/p,top:x/p,e};if(!this.state.droppingDOMNode){let e={cols:s,margin:o,maxRows:l,rowHeight:c,containerWidth:u,containerPadding:d||o},n=(0,a.calcXY)(e,x,b,h.w,h.h);this.setState({droppingDOMNode:t.createElement(`div`,{key:h.i}),droppingPosition:S,layout:[...v,f(f({},h),{},{x:n.x,y:n.y,static:!1,isDraggable:!0})]})}else if(this.state.droppingPosition){let{left:e,top:t}=this.state.droppingPosition;(e!=b||t!=x)&&this.setState({droppingPosition:S})}}),p(this,`removeDroppingPlaceholder`,()=>{let{droppingItem:e,cols:t}=this.props,{layout:n}=this.state,r=(0,i.compact)(n.filter(t=>t.i!==e.i),(0,i.compactType)(this.props),t,this.props.allowOverlap);this.setState({layout:r,droppingDOMNode:null,activeDrag:null,droppingPosition:void 0})}),p(this,`onDragLeave`,e=>{e.preventDefault(),e.stopPropagation(),this.dragEnterCounter--,this.dragEnterCounter===0&&this.removeDroppingPlaceholder()}),p(this,`onDragEnter`,e=>{e.preventDefault(),e.stopPropagation(),this.dragEnterCounter++}),p(this,`onDrop`,e=>{e.preventDefault(),e.stopPropagation();let{droppingItem:t}=this.props,{layout:n}=this.state,r=n.find(e=>e.i===t.i);this.dragEnterCounter=0,this.removeDroppingPlaceholder(),this.props.onDrop(n,r,e)})}componentDidMount(){this.setState({mounted:!0}),this.onLayoutMaybeChanged(this.state.layout,this.props.layout)}static getDerivedStateFromProps(e,t){let r;return t.activeDrag?null:(!(0,n.deepEqual)(e.layout,t.propsLayout)||e.compactType!==t.compactType?r=e.layout:(0,i.childrenEqual)(e.children,t.children)||(r=t.layout),r?{layout:(0,i.synchronizeLayoutWithChildren)(r,e.children,e.cols,(0,i.compactType)(e),e.allowOverlap),compactType:e.compactType,children:e.children,propsLayout:e.layout}:null)}shouldComponentUpdate(e,t){return this.props.children!==e.children||!(0,i.fastRGLPropsEqual)(this.props,e,n.deepEqual)||this.state.activeDrag!==t.activeDrag||this.state.mounted!==t.mounted||this.state.droppingPosition!==t.droppingPosition}componentDidUpdate(e,t){if(!this.state.activeDrag){let e=this.state.layout,n=t.layout;this.onLayoutMaybeChanged(e,n)}}containerHeight(){if(!this.props.autoSize)return;let e=(0,i.bottom)(this.state.layout),t=this.props.containerPadding?this.props.containerPadding[1]:this.props.margin[1];return e*this.props.rowHeight+(e-1)*this.props.margin[1]+t*2+`px`}onLayoutMaybeChanged(e,t){t||=this.state.layout,(0,n.deepEqual)(t,e)||this.props.onLayoutChange(e)}placeholder(){let{activeDrag:e}=this.state;if(!e)return null;let{width:n,cols:r,margin:i,containerPadding:a,rowHeight:s,maxRows:c,useCSSTransforms:l,transformScale:u}=this.props;return t.createElement(o.default,{w:e.w,h:e.h,x:e.x,y:e.y,i:e.i,className:`react-grid-placeholder ${this.state.resizing?`placeholder-resizing`:``}`,containerWidth:n,cols:r,margin:i,containerPadding:a||i,maxRows:c,rowHeight:s,isDraggable:!1,isResizable:!1,isBounded:!1,useCSSTransforms:l,transformScale:u},t.createElement(`div`,null))}processGridItem(e,n){if(!e||!e.key)return;let r=(0,i.getLayoutItem)(this.state.layout,String(e.key));if(!r)return null;let{width:a,cols:s,margin:c,containerPadding:l,rowHeight:u,maxRows:d,isDraggable:f,isResizable:p,isBounded:m,useCSSTransforms:h,transformScale:g,draggableCancel:_,draggableHandle:v,resizeHandles:y,resizeHandle:b}=this.props,{mounted:x,droppingPosition:S}=this.state,C=typeof r.isDraggable==`boolean`?r.isDraggable:!r.static&&f,w=typeof r.isResizable==`boolean`?r.isResizable:!r.static&&p,T=r.resizeHandles||y,E=C&&m&&r.isBounded!==!1;return t.createElement(o.default,{containerWidth:a,cols:s,margin:c,containerPadding:l||c,maxRows:d,rowHeight:u,cancel:_,handle:v,onDragStop:this.onDragStop,onDragStart:this.onDragStart,onDrag:this.onDrag,onResizeStart:this.onResizeStart,onResize:this.onResize,onResizeStop:this.onResizeStop,isDraggable:C,isResizable:w,isBounded:E,useCSSTransforms:h&&x,usePercentages:!x,transformScale:g,w:r.w,h:r.h,x:r.x,y:r.y,i:r.i,minH:r.minH,minW:r.minW,maxH:r.maxH,maxW:r.maxW,static:r.static,droppingPosition:n?S:void 0,resizeHandles:T,resizeHandle:b},e)}render(){let{className:e,style:n,isDroppable:a,innerRef:o}=this.props,s=(0,r.default)(g,e),c=f({height:this.containerHeight()},n);return t.createElement(`div`,{ref:o,className:s,style:c,onDrop:a?this.onDrop:i.noop,onDragLeave:a?this.onDragLeave:i.noop,onDragEnter:a?this.onDragEnter:i.noop,onDragOver:a?this.onDragOver:i.noop},t.Children.map(this.props.children,e=>this.processGridItem(e)),a&&this.state.droppingDOMNode&&this.processGridItem(this.state.droppingDOMNode,!0),this.placeholder())}};e.default=v,p(v,`displayName`,`ReactGridLayout`),p(v,`propTypes`,s.default),p(v,`defaultProps`,{autoSize:!0,cols:12,className:``,style:{},draggableHandle:``,draggableCancel:``,containerPadding:null,rowHeight:150,maxRows:1/0,layout:[],margin:[10,10],isBounded:!1,isDraggable:!0,isResizable:!0,allowOverlap:!1,isDroppable:!1,useCSSTransforms:!0,transformScale:1,verticalCompact:!0,compactType:`vertical`,preventCollision:!1,droppingItem:{i:`__dropping-elem__`,h:1,w:1},resizeHandles:[`se`],onLayoutChange:i.noop,onDragStart:i.noop,onDrag:i.noop,onDragStop:i.noop,onResizeStart:i.noop,onResize:i.noop,onResizeStop:i.noop,onDrop:i.noop,onDropDragOver:i.noop})})),Hu=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.findOrGenerateResponsiveLayout=i,e.getBreakpointFromWidth=n,e.getColsFromBreakpoint=r,e.sortBreakpoints=a;var t=Du();function n(e,t){let n=a(e),r=n[0];for(let i=1,a=n.length;i<a;i++){let a=n[i];t>e[a]&&(r=a)}return r}function r(e,t){if(!t[e])throw Error("ResponsiveReactGridLayout: `cols` entry for breakpoint "+e+` is missing!`);return t[e]}function i(e,n,r,i,o,s){if(e[r])return(0,t.cloneLayout)(e[r]);let c=e[i],l=a(n),u=l.slice(l.indexOf(r));for(let t=0,n=u.length;t<n;t++){let n=u[t];if(e[n]){c=e[n];break}}return c=(0,t.cloneLayout)(c||[]),(0,t.compact)((0,t.correctBounds)(c,{cols:o}),s,o)}function a(e){return Object.keys(e).sort(function(t,n){return e[t]-e[n]})}})),Uu=i((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=l(d()),n=c(ju()),r=Tu(),i=Du(),a=Hu(),o=c(Vu()),s=[`breakpoint`,`breakpoints`,`cols`,`layouts`,`margin`,`containerPadding`,`onBreakpointChange`,`onLayoutChange`,`onWidthChange`];function c(e){return e&&e.__esModule?e:{default:e}}function l(e,t){if(typeof WeakMap==`function`)var n=new WeakMap,r=new WeakMap;return(l=function(e,t){if(!t&&e&&e.__esModule)return e;var i,a,o={__proto__:null,default:e};if(e===null||typeof e!=`object`&&typeof e!=`function`)return o;if(i=t?r:n){if(i.has(e))return i.get(e);i.set(e,o)}for(let t in e)t!=="default"&&{}.hasOwnProperty.call(e,t)&&((a=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?i(o,t,a):o[t]=e[t]);return o})(e,t)}function u(){return u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u.apply(null,arguments)}function f(e,t){if(e==null)return{};var n,r,i=p(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function p(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function h(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?m(Object(n),!0).forEach(function(t){g(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):m(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function g(e,t,n){return(t=_(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _(e){var t=v(e,`string`);return typeof t==`symbol`?t:t+``}function v(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var y=e=>Object.prototype.toString.call(e);function b(e,t){return e==null?null:Array.isArray(e)?e:e[t]}var x=class extends t.Component{constructor(){super(...arguments),g(this,`state`,this.generateInitialState()),g(this,`onLayoutChange`,e=>{this.props.onLayoutChange(e,h(h({},this.props.layouts),{},{[this.state.breakpoint]:e}))})}generateInitialState(){let{width:e,breakpoints:t,layouts:n,cols:r}=this.props,i=(0,a.getBreakpointFromWidth)(t,e),o=(0,a.getColsFromBreakpoint)(i,r),s=this.props.verticalCompact===!1?null:this.props.compactType;return{layout:(0,a.findOrGenerateResponsiveLayout)(n,t,i,i,o,s),breakpoint:i,cols:o}}static getDerivedStateFromProps(e,t){if(!(0,r.deepEqual)(e.layouts,t.layouts)){let{breakpoint:n,cols:r}=t;return{layout:(0,a.findOrGenerateResponsiveLayout)(e.layouts,e.breakpoints,n,n,r,e.compactType),layouts:e.layouts}}return null}componentDidUpdate(e){(this.props.width!=e.width||this.props.breakpoint!==e.breakpoint||!(0,r.deepEqual)(this.props.breakpoints,e.breakpoints)||!(0,r.deepEqual)(this.props.cols,e.cols))&&this.onWidthChange(e)}onWidthChange(e){let{breakpoints:t,cols:n,layouts:r,compactType:o}=this.props,s=this.props.breakpoint||(0,a.getBreakpointFromWidth)(this.props.breakpoints,this.props.width),c=this.state.breakpoint,l=(0,a.getColsFromBreakpoint)(s,n),u=h({},r);if(c!==s||e.breakpoints!==t||e.cols!==n){c in u||(u[c]=(0,i.cloneLayout)(this.state.layout));let e=(0,a.findOrGenerateResponsiveLayout)(u,t,s,c,l,o);e=(0,i.synchronizeLayoutWithChildren)(e,this.props.children,l,o,this.props.allowOverlap),u[s]=e,this.props.onBreakpointChange(s,l),this.props.onLayoutChange(e,u),this.setState({breakpoint:s,layout:e,cols:l})}let d=b(this.props.margin,s),f=b(this.props.containerPadding,s);this.props.onWidthChange(this.props.width,d,l,f)}render(){let e=this.props,{breakpoint:n,breakpoints:r,cols:i,layouts:a,margin:c,containerPadding:l,onBreakpointChange:d,onLayoutChange:p,onWidthChange:m}=e,h=f(e,s);return t.createElement(o.default,u({},h,{margin:b(c,this.state.breakpoint),containerPadding:b(l,this.state.breakpoint),onLayoutChange:this.onLayoutChange,layout:this.state.layout,cols:this.state.cols}))}};e.default=x,g(x,`propTypes`,{breakpoint:n.default.string,breakpoints:n.default.object,allowOverlap:n.default.bool,cols:n.default.object,margin:n.default.oneOfType([n.default.array,n.default.object]),containerPadding:n.default.oneOfType([n.default.array,n.default.object]),layouts(e,t){if(y(e[t])!==`[object Object]`)throw Error(`Layout property must be an object. Received: `+y(e[t]));Object.keys(e[t]).forEach(t=>{if(!(t in e.breakpoints))throw Error(`Each key in layouts must align with a key in breakpoints.`);(0,i.validateLayout)(e.layouts[t],`layouts.`+t)})},width:n.default.number.isRequired,onBreakpointChange:n.default.func,onLayoutChange:n.default.func,onWidthChange:n.default.func}),g(x,`defaultProps`,{breakpoints:{lg:1200,md:996,sm:768,xs:480,xxs:0},cols:{lg:12,md:10,sm:6,xs:4,xxs:2},containerPadding:{lg:null,md:null,sm:null,xs:null,xxs:null},layouts:{},margin:[10,10],allowOverlap:!1,onBreakpointChange:i.noop,onLayoutChange:i.noop,onWidthChange:i.noop})})),Wu=r({default:()=>yd});function Gu(e,t){var n=!1,r=!1,i=0;function a(){n&&(n=!1,e()),r&&s()}function o(){id(a)}function s(){var e=Date.now();if(n){if(e-i<ad)return;r=!0}else n=!0,r=!1,setTimeout(o,t);i=e}return s}function Ku(e){return parseFloat(e)||0}function qu(e){return[...arguments].slice(1).reduce(function(t,n){var r=e[`border-`+n+`-width`];return t+Ku(r)},0)}function Ju(e){for(var t=[`top`,`right`,`bottom`,`left`],n={},r=0,i=t;r<i.length;r++){var a=i[r],o=e[`padding-`+a];n[a]=Ku(o)}return n}function Yu(e){var t=e.getBBox();return ed(0,0,t.width,t.height)}function Xu(e){var t=e.clientWidth,n=e.clientHeight;if(!t&&!n)return fd;var r=dd(e).getComputedStyle(e),i=Ju(r),a=i.left+i.right,o=i.top+i.bottom,s=Ku(r.width),c=Ku(r.height);if(r.boxSizing===`border-box`&&(Math.round(s+a)!==t&&(s-=qu(r,`left`,`right`)+a),Math.round(c+o)!==n&&(c-=qu(r,`top`,`bottom`)+o)),!Zu(e)){var l=Math.round(s+a)-t,u=Math.round(c+o)-n;Math.abs(l)!==1&&(s-=l),Math.abs(u)!==1&&(c-=u)}return ed(i.left,i.top,s,c)}function Zu(e){return e===dd(e).document.documentElement}function Qu(e){return nd?pd(e)?Yu(e):Xu(e):fd}function $u(e){var t=e.x,n=e.y,r=e.width,i=e.height,a=Object.create((typeof DOMRectReadOnly<`u`?DOMRectReadOnly:Object).prototype);return ud(a,{x:t,y:n,width:r,height:i,top:n,right:t+r,bottom:i+n,left:t}),a}function ed(e,t,n,r){return{x:e,y:t,width:n,height:r}}var td,nd,rd,id,ad,od,sd,cd,ld,ud,dd,fd,pd,md,hd,gd,_d,vd,yd,bd=t((()=>{td=(function(){if(typeof Map<`u`)return Map;function e(e,t){var n=-1;return e.some(function(e,r){return e[0]===t&&(n=r,!0)}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){t===void 0&&(t=null);for(var n=0,r=this.__entries__;n<r.length;n++){var i=r[n];e.call(t,i[1],i[0])}},t}()})(),nd=typeof window<`u`&&typeof document<`u`&&window.document===document,rd=(function(){return typeof global<`u`&&global.Math===Math?global:typeof self<`u`&&self.Math===Math?self:typeof window<`u`&&window.Math===Math?window:Function(`return this`)()})(),id=(function(){return typeof requestAnimationFrame==`function`?requestAnimationFrame.bind(rd):function(e){return setTimeout(function(){return e(Date.now())},1e3/60)}})(),ad=2,od=20,sd=[`top`,`right`,`bottom`,`left`,`width`,`height`,`size`,`weight`],cd=typeof MutationObserver<`u`,ld=function(){function e(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutationsObserver_=null,this.observers_=[],this.onTransitionEnd_=this.onTransitionEnd_.bind(this),this.refresh=Gu(this.refresh.bind(this),od)}return e.prototype.addObserver=function(e){~this.observers_.indexOf(e)||this.observers_.push(e),this.connected_||this.connect_()},e.prototype.removeObserver=function(e){var t=this.observers_,n=t.indexOf(e);~n&&t.splice(n,1),!t.length&&this.connected_&&this.disconnect_()},e.prototype.refresh=function(){this.updateObservers_()&&this.refresh()},e.prototype.updateObservers_=function(){var e=this.observers_.filter(function(e){return e.gatherActive(),e.hasActive()});return e.forEach(function(e){return e.broadcastActive()}),e.length>0},e.prototype.connect_=function(){!nd||this.connected_||(document.addEventListener(`transitionend`,this.onTransitionEnd_),window.addEventListener(`resize`,this.refresh),cd?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener(`DOMSubtreeModified`,this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!nd||!this.connected_||(document.removeEventListener(`transitionend`,this.onTransitionEnd_),window.removeEventListener(`resize`,this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener(`DOMSubtreeModified`,this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(e){var t=e.propertyName,n=t===void 0?``:t;sd.some(function(e){return!!~n.indexOf(e)})&&this.refresh()},e.getInstance=function(){return this.instance_||=new e,this.instance_},e.instance_=null,e}(),ud=(function(e,t){for(var n=0,r=Object.keys(t);n<r.length;n++){var i=r[n];Object.defineProperty(e,i,{value:t[i],enumerable:!1,writable:!1,configurable:!0})}return e}),dd=(function(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView||rd}),fd=ed(0,0,0,0),pd=(function(){return typeof SVGGraphicsElement<`u`?function(e){return e instanceof dd(e).SVGGraphicsElement}:function(e){return e instanceof dd(e).SVGElement&&typeof e.getBBox==`function`}})(),md=function(){function e(e){this.broadcastWidth=0,this.broadcastHeight=0,this.contentRect_=ed(0,0,0,0),this.target=e}return e.prototype.isActive=function(){var e=Qu(this.target);return this.contentRect_=e,e.width!==this.broadcastWidth||e.height!==this.broadcastHeight},e.prototype.broadcastRect=function(){var e=this.contentRect_;return this.broadcastWidth=e.width,this.broadcastHeight=e.height,e},e}(),hd=function(){function e(e,t){var n=$u(t);ud(this,{target:e,contentRect:n})}return e}(),gd=function(){function e(e,t,n){if(this.activeObservations_=[],this.observations_=new td,typeof e!=`function`)throw TypeError(`The callback provided as parameter 1 is not a function.`);this.callback_=e,this.controller_=t,this.callbackCtx_=n}return e.prototype.observe=function(e){if(!arguments.length)throw TypeError(`1 argument required, but only 0 present.`);if(!(typeof Element>`u`||!(Element instanceof Object))){if(!(e instanceof dd(e).Element))throw TypeError(`parameter 1 is not of type "Element".`);var t=this.observations_;t.has(e)||(t.set(e,new md(e)),this.controller_.addObserver(this),this.controller_.refresh())}},e.prototype.unobserve=function(e){if(!arguments.length)throw TypeError(`1 argument required, but only 0 present.`);if(!(typeof Element>`u`||!(Element instanceof Object))){if(!(e instanceof dd(e).Element))throw TypeError(`parameter 1 is not of type "Element".`);var t=this.observations_;t.has(e)&&(t.delete(e),t.size||this.controller_.removeObserver(this))}},e.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},e.prototype.gatherActive=function(){var e=this;this.clearActive(),this.observations_.forEach(function(t){t.isActive()&&e.activeObservations_.push(t)})},e.prototype.broadcastActive=function(){if(this.hasActive()){var e=this.callbackCtx_,t=this.activeObservations_.map(function(e){return new hd(e.target,e.broadcastRect())});this.callback_.call(e,t,e),this.clearActive()}},e.prototype.clearActive=function(){this.activeObservations_.splice(0)},e.prototype.hasActive=function(){return this.activeObservations_.length>0},e}(),_d=typeof WeakMap<`u`?new WeakMap:new td,vd=function(){function e(t){if(!(this instanceof e))throw TypeError(`Cannot call a class as a function.`);if(!arguments.length)throw TypeError(`1 argument required, but only 0 present.`);var n=new gd(t,ld.getInstance(),this);_d.set(this,n)}return e}(),[`observe`,`unobserve`,`disconnect`].forEach(function(e){vd.prototype[e]=function(){var t;return(t=_d.get(this))[e].apply(t,arguments)}}),yd=(function(){return rd.ResizeObserver===void 0?vd:rd.ResizeObserver})()})),xd=i((t=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=_;var n=c(d()),r=s(ju()),i=s((bd(),e(Wu))),a=s($a()),o=[`measureBeforeMount`];function s(e){return e&&e.__esModule?e:{default:e}}function c(e,t){if(typeof WeakMap==`function`)var n=new WeakMap,r=new WeakMap;return(c=function(e,t){if(!t&&e&&e.__esModule)return e;var i,a,o={__proto__:null,default:e};if(e===null||typeof e!=`object`&&typeof e!=`function`)return o;if(i=t?r:n){if(i.has(e))return i.get(e);i.set(e,o)}for(let t in e)t!=="default"&&{}.hasOwnProperty.call(e,t)&&((a=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?i(o,t,a):o[t]=e[t]);return o})(e,t)}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l.apply(null,arguments)}function u(e,t){if(e==null)return{};var n,r,i=f(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function f(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function p(e,t,n){return(t=m(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function m(e){var t=h(e,`string`);return typeof t==`symbol`?t:t+``}function h(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var g=`react-grid-layout`;function _(e){var t;return t=class extends n.Component{constructor(){super(...arguments),p(this,`state`,{width:1280}),p(this,`elementRef`,n.createRef()),p(this,`mounted`,!1),p(this,`resizeObserver`,void 0)}componentDidMount(){this.mounted=!0,this.resizeObserver=new i.default(e=>{if(this.elementRef.current instanceof HTMLElement){let t=e[0].contentRect.width;this.setState({width:t})}});let e=this.elementRef.current;e instanceof HTMLElement&&this.resizeObserver.observe(e)}componentWillUnmount(){this.mounted=!1;let e=this.elementRef.current;e instanceof HTMLElement&&this.resizeObserver.unobserve(e),this.resizeObserver.disconnect()}render(){let t=this.props,{measureBeforeMount:r}=t,i=u(t,o);return r&&!this.mounted?n.createElement(`div`,{className:(0,a.default)(this.props.className,g),style:this.props.style,ref:this.elementRef}):n.createElement(e,l({innerRef:this.elementRef},i,this.state))}},p(t,`defaultProps`,{measureBeforeMount:!1}),p(t,`propTypes`,{measureBeforeMount:r.default.bool}),t}})),Sd=n(i(((e,t)=>{t.exports=Vu().default,t.exports.utils=Du(),t.exports.calculateUtils=Ou(),t.exports.Responsive=Uu().default,t.exports.Responsive.utils=Hu(),t.exports.WidthProvider=xd().default}))(),1),Cd=new Map;function wd(e){Cd.set(e.type,e)}function Td(e){return Cd.get(e)}function Ed(){return[...Cd.values()]}function Dd(e,t){let n=typeof e.setCanvasQueries==`function`,[r,i]=(0,X.useState)(e.canvasQueries??[]),a=(0,X.useMemo)(()=>n?e.canvasQueries??[]:r,[n,e.canvasQueries,r]),o=(0,X.useCallback)(r=>{n?e.setCanvasQueries(r):i(r),t?.()},[n,e,t]);return{queries:a,runSearch:(0,X.useCallback)(e=>{let t=e.trim();!t||a.includes(t)||o([...a,t])},[a,o]),removeQuery:(0,X.useCallback)(e=>{o(e<0?[]:a.filter((t,n)=>n!==e))},[a,o]),clearSearch:(0,X.useCallback)(()=>o([]),[o])}}function Od({config:e,canvas:t}){let n=typeof e.pageSize==`number`?e.pageSize:50,r=e.viewMode===`card`||e.viewMode===`tile`||e.viewMode===`table`?e.viewMode:`table`,[i,a]=(0,X.useState)([]),[o,s]=(0,X.useState)(0),[c,l]=(0,X.useState)(1),[u,d]=(0,X.useState)(!0),f=t.canvasSort??xt,{queries:p,runSearch:m,removeQuery:h}=Dd(t,()=>l(1));(0,X.useEffect)(()=>{let e=!1;return(async()=>{d(!0);try{let r=await t.fetchDocuments({limit:n,page:c,sortBy:f.sortBy,order:f.order,queries:p.length?p:void 0});if(e)return;a(r.payload||[]),s(r.totalCount||r.count||0)}catch{e||(a([]),s(0))}finally{e||d(!1)}})(),()=>{e=!0}},[t,n,c,f.sortBy,f.order,p]);let g=(0,X.useCallback)(e=>{t.setCanvasSort?.(e),l(1)},[t]),_=t.readOnly===!0;return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[!_&&(0,Z.jsxs)(`div`,{className:`canvas-no-drag flex items-center gap-2 border-b px-1 pb-2`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Sort`}),(0,Z.jsx)(wt,{workspaceId:t.workspaceId,value:f,onChange:g})]}),(0,Z.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto`,children:(0,Z.jsx)(fn,{documents:i,isLoading:u,contextPath:t.path,treeName:t.treeName,workspaceId:t.workspaceId,totalCount:o,serverSort:f,viewMode:r,allowViewToggle:!0,currentPage:c,pageSize:n,onPageChange:l,backendSearchQueries:p,onBackendSearch:_?void 0:m,onRemoveBackendQuery:_?void 0:h})})]})}wd({type:`documents-table`,name:`Documents`,icon:Fn,defaultSize:{w:8,h:6,minW:4,minH:3},mobileHeight:.9,defaultConfig:{pageSize:50,viewMode:`table`},component:Od});function kd({config:e,setConfig:t,canvas:n}){let[r,i]=(0,X.useState)(()=>new Date),a=e.format!==`24`;return(0,X.useEffect)(()=>{let e=setInterval(()=>i(new Date),1e3);return()=>clearInterval(e)},[]),(0,Z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-1`,children:[(0,Z.jsx)(`div`,{className:`text-3xl font-semibold tabular-nums`,children:r.toLocaleTimeString(void 0,{hour12:a,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:r.toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`})}),!n.readOnly&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t({...e,format:a?`24`:`12`}),className:`mt-1 px-2 py-0.5 text-[10px] border rounded-md text-muted-foreground hover:bg-accent`,children:a?`12h`:`24h`})]})}wd({type:`clock`,name:`Clock`,icon:Zn,defaultSize:{w:3,h:2,minW:2,minH:2},defaultConfig:{format:`24`},component:kd});var Ad=450,jd=10;function Md(e,t){let{open:n}=I(),r=(0,X.useRef)(null),i=(0,X.useRef)(null),a=(0,X.useRef)(!1),o=()=>{e&&n(e,t)},s=()=>{r.current&&=(clearTimeout(r.current),null)};return{activationProps:{role:`button`,tabIndex:0,onClick:()=>{if(a.current){a.current=!1;return}o()},onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),o())},onContextMenu:e=>{e.preventDefault(),o()},onPointerDown:e=>{e.pointerType===`touch`&&(i.current={x:e.clientX,y:e.clientY},a.current=!1,s(),r.current=setTimeout(()=>{a.current=!0,o()},Ad))},onPointerMove:e=>{i.current&&Math.hypot(e.clientX-i.current.x,e.clientY-i.current.y)>jd&&s()},onPointerUp:s,onPointerCancel:s,onPointerLeave:s},stopRowActivation:e=>e.stopPropagation()}}function Nd({doc:e,workspaceId:t}){let n=Ho(e),{activationProps:r}=Md(e,t);return(0,Z.jsxs)(`li`,{...r,title:`Open details`,className:`canvas-no-drag cursor-pointer py-1.5 min-w-0 rounded px-1 transition-colors hover:bg-accent/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring`,children:[(0,Z.jsx)(`div`,{className:`truncate font-medium`,children:n.title}),n.preview&&(0,Z.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:n.preview})]})}function Pd({config:e,canvas:t}){let n=typeof e.limit==`number`?e.limit:10,[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(!0),[s,c]=(0,X.useState)(null);return(0,X.useEffect)(()=>{let e=!1;return(async()=>{o(!0);try{let r=await t.fetchDocuments({limit:n});if(e)return;i(r.payload||[]),c(null)}catch(t){if(e)return;c(t instanceof Error?t.message:`Failed to load documents`),i([])}finally{e||o(!1)}})(),()=>{e=!0}},[t,n]),a?(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground p-1`,children:`Loading…`}):s?(0,Z.jsx)(`div`,{className:`text-xs text-destructive p-1`,children:s}):r.length===0?(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground p-1`,children:`No documents on this canvas.`}):(0,Z.jsx)(`ul`,{className:`divide-y text-sm`,children:r.map(e=>(0,Z.jsx)(Nd,{doc:e,workspaceId:t.workspaceId},e.id))})}wd({type:`recent-documents`,name:`Recent documents`,icon:hi,defaultSize:{w:4,h:4,minW:3,minH:2},mobileHeight:.5,defaultConfig:{limit:10},component:Pd});function Fd({config:e,setConfig:t,canvas:n}){let r=typeof e.text==`string`?e.text:``;return(0,Z.jsx)(`textarea`,{value:r,readOnly:n.readOnly,onChange:n=>t({...e,text:n.target.value}),placeholder:n.readOnly?``:`Jot something down…`,className:`canvas-no-drag w-full h-full resize-none bg-transparent text-sm leading-6 outline-none`})}wd({type:`note`,name:`Note`,icon:Da,defaultSize:{w:3,h:3,minW:2,minH:2},defaultConfig:{text:``},component:Fd});var Id=`data/schema/file`,Ld=`data/schema/drawing`;function Rd(e){return(e.schema===Id||e.schema===Ld)&&String(e.metadata?.contentType||``).startsWith(`image/`)}function zd(e){return e.schema===Id&&String(e.metadata?.contentType||``).startsWith(`video/`)}var Bd=`data/mime/image`;function Vd(e,t,n=!1){let[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(0),[s,c]=(0,X.useState)(1),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(``),{queries:h,runSearch:g,removeQuery:_,clearSearch:v}=Dd(e,()=>c(1)),y=e.canvasSort??xt;(0,X.useEffect)(()=>{let r=!1,a=async()=>{u(!0),f(null);try{let a=await e.fetchDocuments({limit:t,page:s,queries:h.length?h:void 0,sortBy:y.sortBy,order:y.order,...n?{anyOf:[Bd,`data/mime/video`]}:{allOf:[Bd]}});if(r)return;i((a.payload||[]).filter(e=>Rd(e)||n&&zd(e))),o(a.totalCount||a.count||0)}catch(e){if(r)return;i([]),o(0),f(e instanceof Error?e.message:`Failed to load images`)}finally{r||u(!1)}};return a(),window.addEventListener(`workspace:documents:refresh`,a),()=>{r=!0,window.removeEventListener(`workspace:documents:refresh`,a)}},[e,t,s,h,y.sortBy,y.order,n]);let b=(0,X.useCallback)(()=>{let e=p.trim();m(``),g(e)},[p,g]),x=(0,X.useCallback)(()=>{m(``),v()},[v]),S=(0,X.useCallback)(e=>{_(e)},[_]),C=(0,X.useCallback)(t=>{e.setCanvasSort?.(t),c(1)},[e]);return{images:r,isLoading:l,error:d,page:s,setPage:c,totalCount:a,totalPages:(0,X.useMemo)(()=>Math.max(1,Math.ceil(a/t)),[a,t]),input:p,setInput:m,submit:b,clearSearch:x,removeQuery:S,activeQueries:h,sort:y,setSort:C}}var Hd=n(h(),1);function Ud({workspaceId:e,doc:t,onClick:n,className:r=`aspect-square`,comments:i=`off`}){let{blobUrl:a,error:o,loading:s}=z(e,t.id,512,{blobFallback:!zd(t),version:t.checksumArray?.[0]??null}),c=ts(t)||`image-${t.id}`,l=ls(t),u=l!==``&&i!==`off`;return(0,Z.jsxs)(`button`,{type:`button`,onClick:n,title:l||c,className:`canvas-no-drag group relative block w-full overflow-hidden rounded-(--card-radius) border bg-muted/40 shadow-elevation-1 transition-shadow hover:shadow-elevation-2 hover:ring-2 hover:ring-primary/30 ${r}`,children:[s&&(0,Z.jsx)(`div`,{className:`absolute inset-0 animate-pulse bg-muted/60`}),o&&!zd(t)&&(0,Z.jsx)(`div`,{className:`absolute inset-0 flex items-center justify-center p-1 text-[10px] text-destructive`,children:o}),a&&(0,Z.jsx)(`img`,{src:a,alt:c,loading:`lazy`,className:`h-full w-full object-cover transition-transform duration-normal group-hover:scale-105`}),zd(t)&&(0,Z.jsxs)(`span`,{className:`absolute inset-0 flex items-center justify-center`,children:[(0,Z.jsx)(Ar,{className:`h-10 w-10 rounded-full bg-black/60 p-2 text-white`}),(0,Z.jsx)(`span`,{className:`sr-only`,children:`Play video`})]}),u&&(0,Z.jsx)(`span`,{className:`pointer-events-none absolute inset-x-0 bottom-0 px-1.5 pb-1 pt-4 text-left text-[11px] leading-snug text-white bg-gradient-to-t from-black/75 via-black/45 to-transparent ${i===`reveal`?`caption-reveal`:``}`,children:(0,Z.jsx)(`span`,{className:`line-clamp-2`,children:l})}),l!==``&&i!==`caption`&&(0,Z.jsx)(`span`,{className:`pointer-events-none absolute right-1 top-1 rounded-full bg-black/55 p-1 text-white transition-opacity ${i===`reveal`?`hidden [@media(hover:hover)]:block [@media(hover:hover)]:group-hover:opacity-0`:``}`,title:`Has a comment`,children:(0,Z.jsx)(Rn,{className:`h-3 w-3`})})]})}function Wd({workspaceId:e,docs:t,index:n,onClose:r,onNavigate:i}){let a=t[n],{blobUrl:o,error:s,loading:c}=Xc(e,a.id,{version:a.checksumArray?.[0]??null,enabled:!zd(a)}),l=ts(a)||`image-${a.id}`,u=ls(a),[d,f]=(0,X.useState)(!1);return Ae(r),(0,X.useEffect)(()=>{let e=e=>{e.target?.closest(`video`)||(e.key===`ArrowLeft`&&n>0&&i(n-1),e.key===`ArrowRight`&&n<t.length-1&&i(n+1))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[n,t.length,i]),(0,Hd.createPortal)((0,Z.jsxs)(`div`,{"data-scheme":`dark`,className:`fixed inset-0 z-fullscreen flex flex-col bg-scrim p-0 sm:p-4`,onClick:r,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:r,className:`canvas-no-drag absolute right-2 top-2 z-10 rounded-full bg-foreground/10 p-2 text-foreground hover:bg-foreground/20 touch-target sm:right-4 sm:top-4`,title:`Close`,children:(0,Z.jsx)(vr,{className:`h-5 w-5`})}),n>0&&!d&&(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),i(n-1)},className:`canvas-no-drag absolute left-3 top-1/2 -translate-y-1/2 rounded-full bg-foreground/10 p-2 text-foreground hover:bg-foreground/20`,title:`Previous`,children:(0,Z.jsx)(Wn,{className:`h-6 w-6 touch-target`})}),n<t.length-1&&!d&&(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),i(n+1)},className:`canvas-no-drag absolute right-3 top-1/2 -translate-y-1/2 rounded-full bg-foreground/10 p-2 text-foreground hover:bg-foreground/20`,title:`Next`,children:(0,Z.jsx)(Xa,{className:`h-6 w-6 touch-target`})}),(0,Z.jsxs)(`figure`,{className:`flex min-h-0 flex-1 flex-col`,onClick:e=>e.stopPropagation(),children:[(0,Z.jsxs)(`div`,{className:`flex min-h-0 flex-1 items-center justify-center`,children:[c&&(0,Z.jsx)(`div`,{className:`text-sm text-foreground/70`,children:`Loading…`}),s&&(0,Z.jsx)(`div`,{className:`text-sm text-destructive`,children:s}),zd(a)&&(0,Z.jsx)(Kd,{workspaceId:e,doc:a},a.id),o&&(0,Z.jsx)(fe,{src:o,alt:l,onZoomChange:f,className:`max-h-full max-w-full rounded object-contain`})]}),(0,Z.jsxs)(`figcaption`,{className:`shrink-0 px-4 py-2 text-center text-xs text-foreground/70`,children:[u&&(0,Z.jsx)(`span`,{className:`mx-auto mb-1 block max-w-2xl whitespace-pre-wrap text-sm text-foreground`,children:u}),l,` · `,n+1,`/`,t.length,!d&&!zd(a)&&(0,Z.jsx)(`span`,{className:`ml-2 opacity-70`,children:`· double-tap to zoom`})]})]})]}),document.body)}function Gd({workspaceId:e,state:t,comments:n,onToggleComments:r}){let{input:i,setInput:a,submit:o,clearSearch:s,removeQuery:c,activeQueries:l,sort:u,setSort:d,page:f,setPage:p,totalPages:m,totalCount:h,isLoading:g}=t,_=l.length>0;return(0,Z.jsxs)(`div`,{className:`canvas-no-drag flex flex-wrap items-center gap-x-2 gap-y-1.5 border-b px-1 pb-1.5`,children:[(0,Z.jsxs)(`div`,{className:`relative min-w-[9rem] flex-1 basis-full sm:basis-auto`,children:[(0,Z.jsx)(qa,{className:`pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground`}),(0,Z.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&o()},placeholder:_?`Refine: add another query (Enter)…`:`Search media (Enter)…`,className:`h-7 w-full rounded-md border bg-background pl-7 pr-7 text-xs`}),_&&(0,Z.jsx)(`button`,{type:`button`,onClick:s,title:`Clear search`,className:`absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-muted-foreground hover:text-foreground touch-target`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]}),_&&(0,Z.jsx)(`div`,{className:`flex w-full flex-wrap items-center gap-1 order-last`,children:l.map((e,t)=>(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[t>0&&(0,Z.jsx)(`span`,{className:`text-[10px] uppercase text-muted-foreground`,children:`then`}),(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full border bg-accent/50 px-2 py-0.5 text-xs`,children:[(0,Z.jsx)(`span`,{className:`max-w-[10rem] truncate`,children:e}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>c(t),title:`Remove "${e}"`,className:`rounded p-0.5 text-muted-foreground hover:text-foreground touch-target`,children:(0,Z.jsx)(vr,{className:`h-3 w-3`})})]})]},`${e}-${t}`))}),(0,Z.jsxs)(`div`,{className:`flex flex-1 basis-full items-center justify-between gap-2 sm:basis-auto sm:justify-end`,children:[r&&(0,Z.jsx)(`button`,{type:`button`,onClick:r,"aria-pressed":n!==`off`,title:n===`off`?`Show comments on tiles`:`Hide comments on tiles`,className:`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border touch-target ${n===`off`?`text-muted-foreground hover:bg-accent`:`border-primary/30 bg-primary/15 text-primary hover:bg-primary/25`}`,children:(0,Z.jsx)(Rn,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(wt,{workspaceId:e,value:u,onChange:d}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1`,children:[g&&(0,Z.jsx)(nn,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`shrink-0 whitespace-nowrap tabular-nums text-xs text-muted-foreground`,children:[h.toLocaleString(),(0,Z.jsxs)(`span`,{className:`hidden sm:inline`,children:[` item`,h===1?``:`s`]})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>p(Math.max(1,f-1)),disabled:f<=1,title:`Previous page`,className:`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border text-muted-foreground hover:bg-accent disabled:opacity-40 touch-target`,children:(0,Z.jsx)(Wn,{className:`h-3.5 w-3.5`})}),(0,Z.jsxs)(`span`,{className:`shrink-0 tabular-nums text-xs text-muted-foreground`,children:[f,`/`,m]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>p(Math.min(m,f+1)),disabled:f>=m,title:`Next page`,className:`flex h-7 w-7 shrink-0 items-center justify-center rounded-md border text-muted-foreground hover:bg-accent disabled:opacity-40 touch-target`,children:(0,Z.jsx)(Xa,{className:`h-3.5 w-3.5`})})]})]})]})}function Kd({workspaceId:e,doc:t}){let{src:n,loading:r,error:i}=Jc(e,t.id);return(0,Z.jsxs)(Z.Fragment,{children:[r&&(0,Z.jsx)(`span`,{children:`Loading video…`}),i&&(0,Z.jsx)(`span`,{role:`alert`,children:i}),n&&(0,Z.jsx)(`video`,{src:n,controls:!0,playsInline:!0,preload:`metadata`,className:`max-h-full max-w-full`})]})}function qd({config:e,setConfig:t,canvas:n}){let r=Vd(n,typeof e.pageSize==`number`?e.pageSize:60,!0),i=tl()==null&&(n.interactive??!n.readOnly),[a,o]=(0,X.useState)(new Set),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(null),p=e=>o(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),[m,h]=(0,X.useState)(null),{images:g,isLoading:_,error:v,activeQueries:y}=r,b=e.showComments===!1?`off`:`caption`;return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[!n.readOnly&&(0,Z.jsx)(Gd,{workspaceId:n.workspaceId,state:r,comments:b,onToggleComments:()=>t({...e,showComments:b===`off`})}),i&&(0,Z.jsxs)(`div`,{className:`canvas-no-drag flex items-center gap-2 py-1`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>{c(!s),o(new Set)},children:s?`Done selecting`:`Select`}),s&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>o(new Set(g.map(e=>e.id))),children:`Select page`}),a.size>0&&(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>u([...a]),children:[`Bulk Edit… (`,a.size,`)`]})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto p-1`,children:v?(0,Z.jsx)(`div`,{className:`p-4 text-sm text-destructive`,children:v}):g.length===0?(0,Z.jsx)(`div`,{className:`p-4 text-sm text-muted-foreground`,children:_?`Loading media…`:y.length?`No images or videos match your search.`:`No images or videos in this canvas' context.`}):(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fill,minmax(min(120px,100%),1fr))] gap-2 sm:grid-cols-[repeat(auto-fill,minmax(min(200px,100%),1fr))] sm:gap-3`,children:g.map((e,t)=>(0,Z.jsxs)(`div`,{className:`relative`,onContextMenu:t=>{i&&(t.preventDefault(),t.stopPropagation(),f({x:t.clientX,y:t.clientY,ids:a.has(e.id)?[...a]:[e.id]}))},children:[(0,Z.jsx)(Ud,{workspaceId:n.workspaceId,doc:e,onClick:()=>s?p(e.id):h(t),comments:b}),s&&(0,Z.jsx)(`input`,{type:`checkbox`,"aria-label":`Select document ${e.id}`,checked:a.has(e.id),onChange:()=>p(e.id),className:`canvas-no-drag absolute left-2 top-2 h-4 w-4 accent-primary`})]},e.id))})}),d&&(0,Z.jsx)(xn,{anchor:d,onClose:()=>f(null),label:`${d.ids.length} image${d.ids.length===1?``:`s`}`,items:[{id:`bulk-edit`,label:`Bulk edit… (${d.ids.length})`,icon:Lr,run:()=>u(d.ids)}]}),l&&(0,Z.jsx)(Ee,{workspaceId:n.workspaceId,documentIds:l,onClose:()=>u(null)}),m!=null&&g[m]&&(0,Z.jsx)(Wd,{workspaceId:n.workspaceId,docs:g,index:m,onClose:()=>h(null),onNavigate:h})]})}wd({type:`gallery`,name:`Gallery`,icon:Zi,defaultSize:{w:8,h:6,minW:3,minH:3},mobileHeight:.9,defaultConfig:{pageSize:60,showComments:!0},component:qd});var Jd=150;function Yd(e){let t=typeof e==`string`?parseFloat(e):e;return Number.isFinite(t)&&t>0?t:0}function Xd(e){let t=e.metadata??{},n=e.data??{};return{w:Yd(t.width)||Yd(t.imageWidth)||Yd(n.width)||Yd(n.imageWidth),h:Yd(t.height)||Yd(t.imageHeight)||Yd(n.height)||Yd(n.imageHeight)}}function Zd(e,t){if(t%9==0)return{cols:2,rows:2};let{w:n,h:r}=Xd(e),i=n&&r?n/r:0;return i>=1.5?{cols:2,rows:1}:i>0&&i<=.66?{cols:1,rows:2}:!i&&t%7==3?{cols:2,rows:1}:{cols:1,rows:1}}function Qd({config:e,setConfig:t,canvas:n}){let r=Vd(n,typeof e.pageSize==`number`?e.pageSize:60),[i,a]=(0,X.useState)(null),{images:o,isLoading:s,error:c,activeQueries:l}=r,u=e.showComments===!1?`off`:`reveal`;return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[!n.readOnly&&(0,Z.jsx)(Gd,{workspaceId:n.workspaceId,state:r,comments:u,onToggleComments:()=>t({...e,showComments:u===`off`})}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto p-1`,children:c?(0,Z.jsx)(`div`,{className:`p-4 text-sm text-destructive`,children:c}):o.length===0?(0,Z.jsx)(`div`,{className:`p-4 text-sm text-muted-foreground`,children:s?`Loading images…`:l.length?`No images match your search.`:`No images in this canvas' context.`}):(0,Z.jsx)(`div`,{className:`grid gap-2`,style:{gridTemplateColumns:`repeat(auto-fill, minmax(${Jd}px, 1fr))`,gridAutoRows:`${Jd}px`,gridAutoFlow:`dense`},children:o.map((e,t)=>{let{cols:r,rows:i}=Zd(e,t);return(0,Z.jsx)(`div`,{style:{gridColumn:`span ${r}`,gridRow:`span ${i}`},children:(0,Z.jsx)(Ud,{workspaceId:n.workspaceId,doc:e,onClick:()=>a(t),className:`h-full`,comments:u})},e.id)})})}),i!=null&&o[i]&&(0,Z.jsx)(Wd,{workspaceId:n.workspaceId,docs:o,index:i,onClose:()=>a(null),onNavigate:a})]})}wd({type:`mosaic`,name:`Mosaic`,icon:Pa,defaultSize:{w:8,h:7,minW:4,minH:4},mobileHeight:.9,defaultConfig:{pageSize:60,showComments:!0},component:Qd});var $d=`data/schema/task`;function ef({doc:e,workspaceId:t,readOnly:n,onChanged:r}){let i=A(e),[a,o]=(0,X.useState)(!1),{replicating:s,label:c}=nc(e),l=i.status===`completed`,u=i.status??`pending`,d=Ne(i),{activationProps:f,stopRowActivation:p}=Md(e,t),m=async()=>{if(!(n||a)){o(!0);try{await N(t,e,l?`pending`:`completed`),r()}catch{}finally{o(!1)}}};return(0,Z.jsxs)(`div`,{...f,title:`Open details`,className:`canvas-no-drag flex cursor-pointer items-start gap-2.5 rounded-md border bg-card px-2.5 py-2 transition-colors hover:bg-accent/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring ${s?`opacity-60`:``}`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{p(e),m()},disabled:n||a||s,"aria-pressed":l,title:l?`Mark not done`:`Mark done`,className:`canvas-no-drag mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors ${l?`border-success bg-success text-success-foreground`:`border-input hover:border-success`} ${n?`cursor-default opacity-70`:``}`,children:a?(0,Z.jsx)(Ti,{className:`h-2.5 w-2.5 animate-spin`}):l&&(0,Z.jsx)(sr,{className:`h-3 w-3`})}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm ${l?`text-muted-foreground line-through`:``}`,children:i.title||`Todo ${e.id}`}),(0,Z.jsxs)(`div`,{className:`mt-0.5 flex flex-wrap items-center gap-1.5 text-[11px]`,children:[(0,Z.jsx)(`span`,{className:`rounded-full px-1.5 py-0.5 ${D[u]}`,children:xe[u]}),i.dueDate&&(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-0.5 ${d?`font-medium text-destructive`:`text-muted-foreground`}`,children:[(0,Z.jsx)(_r,{className:`h-3 w-3`}),wn(i.dueDate)]}),typeof i.priority==`number`&&(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-0.5 text-muted-foreground`,children:[(0,Z.jsx)(Ai,{className:`h-3 w-3`}),`P`,i.priority]}),s&&(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-muted-foreground`,role:`status`,children:[(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}),c]})]})]})]})}function tf({config:e,setConfig:t,canvas:n}){let r=typeof e.pageSize==`number`?e.pageSize:50,[i,a]=(0,X.useState)([]),[o,s]=(0,X.useState)(!0),[c,l]=(0,X.useState)(0),u=n.interactive===!1,d=n.readOnly!==!0,[f,p]=(0,X.useState)(e.hideDone===!0),m=d?e.hideDone===!0:f,h=n=>{d?t({...e,hideDone:n}):p(n)};(0,X.useEffect)(()=>{let e=!1;return(async()=>{s(!0);try{let t=await n.fetchDocuments({limit:r,allOf:[$d],sortBy:`tasks`,order:`asc`});if(e)return;a((t.payload||[]).filter(e=>e.schema===Qo))}catch{e||a([])}finally{e||s(!1)}})(),()=>{e=!0}},[n,r,c]),(0,X.useEffect)(()=>{let e=()=>l(e=>e+1);return window.addEventListener(`workspace:documents:refresh`,e),()=>window.removeEventListener(`workspace:documents:refresh`,e)},[]);let g=(0,X.useCallback)(()=>l(e=>e+1),[]),_=m?i.filter(e=>A(e).status!==`completed`):i,v=i.filter(e=>{let t=A(e).status;return t!==`completed`&&t!==`cancelled`}).length;return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsxs)(`div`,{className:`canvas-no-drag flex items-center justify-between gap-2 border-b px-1 pb-2`,children:[(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[v,` open`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:m,onChange:e=>h(e.target.checked),className:`h-3 w-3`}),`Hide done`]})]}),(0,Z.jsx)(`div`,{className:`flex-1 space-y-1.5 overflow-y-auto p-1`,children:o&&i.length===0?(0,Z.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:`Loading todos…`}):_.length===0?(0,Z.jsx)(`div`,{className:`p-3 text-sm text-muted-foreground`,children:`No todos in this canvas' context.`}):_.map(e=>(0,Z.jsx)(ef,{doc:e,workspaceId:n.workspaceId,readOnly:u,onChanged:g},e.id))})]})}wd({type:`todos`,name:`Todos`,icon:pa,defaultSize:{w:4,h:6,minW:3,minH:3},mobileHeight:.6,defaultConfig:{pageSize:50,hideDone:!1},component:tf});function nf(e){if(!e)return`/`;let t=e.replace(/\/+/g,`/`);return t.startsWith(`/`)?t:`/${t}`}var rf=`context`;function af(e){let t=e=>{try{return decodeURIComponent(e)}catch{return e}},n=e.split(`/`).filter(Boolean);if(n[0]!==`workspaces`)return{treeName:rf,path:`/`};if(n[2]===`trees`&&n[3]){let e=t(n[3]);if(n[4]!==`path`)return{treeName:e,path:`/`};let r=n.slice(5).map(t).join(`/`);return{treeName:e,path:r?`/${r}`:`/`}}if(n[2]===`path`){let e=n.slice(3).map(t).join(`/`);return{treeName:rf,path:e?`/${e}`:`/`}}return{treeName:rf,path:`/`}}function of(e,t,n){let r=n&&n!==rf?`/trees/${encodeURIComponent(n)}`:``,i=nf(t);return`/workspaces/${e}${r}${i===`/`?``:`/path/${i.split(`/`).filter(Boolean).map(encodeURIComponent).join(`/`)}`}`}function sf({canvas:e}){return tl()!=null||!pu()?(0,Z.jsx)(`p`,{className:`p-3 text-sm text-muted-foreground`,children:`Workspace pins are available in the signed-in workspace view.`}):(0,Z.jsx)(cf,{workspaceId:e.workspaceId},e.workspaceId)}function cf({workspaceId:e}){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(`Workspace`),[a,o]=(0,X.useState)(!0),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(0);return(0,X.useEffect)(()=>{let t=!1,r=0,a=async()=>{let a=++r;o(!0);try{let[o,s]=await Promise.all([Ws(e),rc(e)]);if(t||a!==r)return;i(o.label||o.name||`Workspace`),n(s),c(null)}catch{if(t||a!==r)return;n([]),c(`Workspace pins are unavailable. Check your workspace access or try again.`)}finally{!t&&a===r&&o(!1)}},s=()=>{document.visibilityState===`visible`&&a()};a(),window.addEventListener(`focus`,s),document.addEventListener(`visibilitychange`,s);let l=B.on(`pins.changed`,s),u=window.setInterval(s,6e4);return()=>{t=!0,window.removeEventListener(`focus`,s),document.removeEventListener(`visibilitychange`,s),l?.(),window.clearInterval(u)}},[e,l]),(0,Z.jsxs)(`div`,{className:`canvas-no-drag flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b px-2 pb-2`,children:[(0,Z.jsx)(`span`,{className:`truncate text-sm font-medium`,children:r}),(0,Z.jsx)(`button`,{type:`button`,title:`Refresh pins`,"aria-label":`Refresh pins`,disabled:a,onClick:()=>u(e=>e+1),className:`rounded p-1.5 text-muted-foreground hover:bg-accent disabled:opacity-40`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5 ${a?`animate-spin`:``}`})})]}),(0,Z.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-1`,children:s?(0,Z.jsx)(`p`,{role:`alert`,className:`p-2 text-sm text-muted-foreground`,children:s}):t.length?(0,Z.jsx)(`ul`,{className:`space-y-2`,children:t.map(t=>{let n=t.resolvable===!1,r=Jt(t.color),i=(0,Z.jsxs)(Z.Fragment,{children:[n?(0,Z.jsx)(dr,{className:`h-5 w-5 shrink-0 text-warning`}):(0,Z.jsx)(f,{icon:t.icon||(t.type===`canvas`?`ph:squares-four-fill`:`ph:folder-fill`),width:22,height:22,color:r,className:`shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`p`,{className:`truncate text-sm font-medium`,children:t.label||t.name||t.path}),(0,Z.jsxs)(`p`,{className:`truncate text-xs text-muted-foreground`,children:[t.tree,`:`,t.path]}),t.description&&(0,Z.jsx)(`p`,{className:`line-clamp-2 text-xs text-muted-foreground`,children:t.description}),n&&(0,Z.jsx)(`p`,{className:`text-xs text-warning`,children:`Folder no longer exists`})]})]}),a=`flex items-center gap-3 rounded-(--card-radius) border border-l-4 bg-card p-3`,o={borderLeftColor:r||`transparent`};return(0,Z.jsx)(`li`,{children:n?(0,Z.jsx)(`div`,{className:`${a} opacity-60`,style:o,children:i}):(0,Z.jsx)(we,{to:of(e,t.path,t.tree),title:`Open ${t.tree}:${t.path}`,className:`${a} transition-colors hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,style:o,children:i})},t.id)})}):(0,Z.jsx)(`p`,{className:`p-2 text-sm text-muted-foreground`,children:a?`Loading pins…`:`No workspace pins yet. Pin a folder from the workspace tree menu.`})})]})}wd({type:`workspace-pins`,name:`Workspace pins`,icon:tr,defaultSize:{w:4,h:6,minW:3,minH:2},mobileHeight:.6,defaultConfig:{},component:sf});function lf({title:e,icon:t,onRemove:n,fill:r,onToggleFill:i,readOnly:a=!1,stacked:o=!1,children:s}){let[c,l]=(0,X.useState)(!1),u=c?document.getElementById(`content-area`):null,d=(0,Z.jsxs)(`div`,{className:c?u?`absolute inset-0 z-40 flex flex-col bg-background`:`fixed inset-0 z-50 flex flex-col bg-background`:`flex flex-col h-full rounded-(--card-radius) border bg-background overflow-hidden`,children:[(0,Z.jsxs)(`div`,{className:`canvas-drag-handle flex items-center gap-2 px-2 py-1 border-b bg-muted/30 select-none ${o?``:`cursor-move`}`,children:[t&&(0,Z.jsx)(t,{className:`w-3.5 h-3.5 text-muted-foreground shrink-0`}),(0,Z.jsx)(`span`,{className:`text-xs font-medium truncate flex-1`,children:e}),!a&&i&&!c&&!o&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(uf,{on:r?.w===!0,onClick:()=>i(`w`),label:`Fill width`,icon:ga}),(0,Z.jsx)(uf,{on:r?.h===!0,onClick:()=>i(`h`),label:`Fill height`,icon:hr})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>l(e=>!e),className:`canvas-no-drag shrink-0 p-0.5 rounded text-muted-foreground hover:text-foreground hover:bg-accent touch-target`,title:c?`Restore`:`Full screen`,children:c?(0,Z.jsx)(ei,{className:`w-3.5 h-3.5`}):(0,Z.jsx)(ba,{className:`w-3.5 h-3.5`})}),!a&&n&&(0,Z.jsx)(`button`,{type:`button`,onClick:n,className:`canvas-no-drag shrink-0 p-0.5 rounded text-muted-foreground hover:text-destructive hover:bg-destructive/10 touch-target`,title:`Remove widget`,children:(0,Z.jsx)(vr,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 min-h-0 overflow-auto p-2`,children:s})]});return c?(0,Hd.createPortal)(d,u??document.body):d}function uf({on:e,onClick:t,label:n,icon:r}){return(0,Z.jsx)(`button`,{type:`button`,onClick:t,"aria-pressed":e,title:e?`${n} (on)`:n,className:`canvas-no-drag shrink-0 p-0.5 rounded touch-target ${e?`bg-primary/15 text-primary hover:bg-primary/25`:`text-muted-foreground hover:text-foreground hover:bg-accent`}`,children:(0,Z.jsx)(r,{className:`w-3.5 h-3.5`})})}var df=(0,Sd.WidthProvider)(Sd.default),ff=12,pf=80,mf=40,hf=[12,12],gf=[8,8],_f={w:!1,h:!1};function vf(e){return Math.max(1,...e.map(e=>e.y+e.h).filter(Number.isFinite))}function yf(e){return Math.max(0,...e.map(e=>e.y+e.h).filter(Number.isFinite))}function bf(e){let t=(e,t)=>typeof e==`number`&&Number.isFinite(e)?e:t;return{...e,x:t(e.x,0),y:t(e.y,0),w:t(e.w,1),h:t(e.h,1)}}function xf(e,t,n=0){let r=n>0?n:vf(e);return e.map(e=>{let n=t[e.i]??_f;return!n.w&&!n.h?e:{...e,x:n.w?0:e.x,w:n.w?ff:e.w,y:n.h?0:e.y,h:n.h?Math.max(e.minH??1,r):e.h}})}var Sf=4;function Cf(e,t,n=hf[1]){return Math.max(1,Math.ceil((e-n-Sf)/(t+n)))}var wf=45,Tf=640;function Ef(e,t,n=0,r){let i=[...xf(e,t,n)].sort((e,t)=>e.y-t.y||e.x-t.x),a=0;return i.map(e=>{let t=r?.(e.i)??0,n=Math.max(e.h,e.minH??1,t),i={...e,x:0,w:ff,y:a,h:n};return a+=n,i})}var Df=e=>e&&e.trim()?[e]:[];function Of(e){let t=e?.ui??{},n=Array.isArray(t.layout)?t.layout.map(bf):[],r={};for(let e of n)r[e.i]={w:e.fillW??e.w>=ff,h:e.fillH===!0};return{layout:n,fills:r,widgets:t.widgets&&typeof t.widgets==`object`?t.widgets:{}}}function kf({workspaceId:e,treeName:t,path:n,layerId:r,querySpec:i,metadata:a,isLocked:o=!1,readOnly:s=!1,interactive:c=!0,fetchDocuments:l,onSaved:u}){let d=!s,f=(0,X.useMemo)(()=>Of(a),[a]),[p,m]=(0,X.useState)(f.layout),[h,g]=(0,X.useState)(f.widgets),[_,v]=(0,X.useState)(f.fills),y=(0,X.useRef)(f.fills),[b,x]=(0,X.useState)(!1),[S,C]=(0,X.useState)(!1),[w,T]=(0,X.useState)(!1),[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(!1),[A,j]=(0,X.useState)(0),M=(0,X.useRef)(0),N=(0,X.useCallback)(e=>{y.current=e,v(e)},[]),[P,ee]=(0,X.useState)(()=>Cn(i?.sort)),F=(0,X.useRef)(!1),[I,te]=(0,X.useState)(()=>Df(i?.query)),L=(0,X.useRef)(!1),R=(0,X.useRef)(null),ne=(0,X.useRef)(f),re=(0,X.useCallback)(e=>{let t=Td(h[e]?.type??``)?.mobileHeight;if(!(!t||A<=0))return Math.max(1,Math.round(A*t))},[h,A]),ie=(0,X.useMemo)(()=>O?Ef(p,_,A,re):xf(p,_,A),[p,_,O,A,re]),ae=O?mf:pf,z=(0,X.useMemo)(()=>JSON.stringify(a?.ui??null),[a?.ui]);(0,X.useEffect)(()=>{let e=Of(a);m(e.layout),g(e.widgets),N(e.fills),ne.current=e,ee(Cn(i?.sort)),F.current=!1,te(Df(i?.query)),L.current=!1,C(!1)},[n,r]),(0,X.useEffect)(()=>{if(!s)return;let e=Of(a);m(e.layout),g(e.widgets),N(e.fills),ne.current=e},[s,z,a,N]),(0,X.useEffect)(()=>{let e=R.current;if(!e)return;let t=()=>{let t=e.clientHeight,n=e.clientWidth>0&&e.clientWidth<Tf;k(n),M.current=t,e.style.setProperty(`--canvas-host-h`,`${t}px`);let r=n?gf:hf;e.style.setProperty(`--canvas-grid-gutter`,`${r[1]}px`),t>0&&j(Cf(t,n?mf:pf,r[1]))};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[p]);let oe=(0,X.useCallback)(e=>{ee(e),F.current=!0,C(!0)},[]),se=(0,X.useCallback)(e=>{te(e),L.current=!0,C(!0)},[]),B=(0,X.useMemo)(()=>({workspaceId:e,treeName:t,path:n,layerId:r,querySpec:i,readOnly:!d,interactive:c,canvasSort:P,setCanvasSort:d?oe:void 0,canvasQueries:I,setCanvasQueries:d?se:void 0,fetchDocuments:l??(async r=>{let i;if(r?.anyOf?.length&&(i=((await Yo(e,n,t,{anyOf:r.anyOf,limit:0,applyCanvasSpec:!1})).payload||[]).map(e=>e.id),!i.length))return{payload:[],count:0,totalCount:0};let a=await Yo(e,n,t,{...r,anyOf:void 0,ids:i});return{payload:a.payload||[],count:a.count??void 0,totalCount:a.totalCount??void 0}})}),[e,t,n,r,i,d,c,l,P,oe,I,se]),ce=(0,X.useCallback)((e,t,n)=>{ne.current={layout:e,widgets:t,fills:n??y.current},C(!0)},[]),V=(0,X.useCallback)(async()=>{if(!(!d||w)){T(!0),D(null);try{let r={widgets:ne.current.widgets,layout:ne.current.layout.map(e=>({...e,fillW:y.current[e.i]?.w===!0,fillH:y.current[e.i]?.h===!0}))};ne.current={...r,fills:y.current};let o=F.current||L.current?{...i||{},...F.current?{sort:P.sortBy?P:null}:{},...L.current?{query:I.join(` `).trim()||null}:{}}:void 0;await zs(e,n,t,{...a||{},ui:r},o),F.current=!1,L.current=!1,C(!1),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:e,treeName:t}})),u?.()}catch(e){let t=e instanceof Error?e.message:`Save failed`;D(t),console.error(`Failed to save canvas layout:`,e)}finally{T(!1)}}},[d,w,e,n,t,a,u,i,P,I]),le=(0,X.useCallback)(e=>{!d||O||m(t=>{let n=e.map(e=>{let n=t.find(t=>t.i===e.i),r=y.current[e.i];return n?{...e,x:r?.w?n.x:e.x,w:r?.w?n.w:e.w,y:r?.h?n.y:e.y,h:r?.h?n.h:e.h}:e});return ce(n,h),n})},[d,O,ce,h]),ue=(0,X.useCallback)((e,t,n)=>{if(!d)return;let r=y.current[n.i]??_f,i=hf[1]+(n.y+n.h)*(pf+hf[1]),a={w:n.x+n.w>=ff,h:M.current>0&&i>=M.current-wf};if(a.w||=r.w&&n.w===t.w,a.h||=r.h&&n.h===t.h,a.w===r.w&&a.h===r.h)return;let o={...y.current,[n.i]:a};N(o),ce(ne.current.layout,h,o)},[d,N,ce,h]),de=(0,X.useCallback)((e,t)=>{if(!d)return;let n=y.current[e]??_f,r={...y.current,[e]:{...n,[t]:!n[t]}};N(r),ce(p,h,r)},[d,N,ce,p,h]),fe=(0,X.useCallback)(e=>{let t=Td(e);if(!t)return;let n=crypto.randomUUID(),{w:r,h:i,minW:a,minH:o,maxW:s,maxH:c}=t.defaultSize,l=[...p,{i:n,x:0,y:yf(ie),w:r,h:i,minW:a,minH:o,maxW:s,maxH:c}],u={...h,[n]:{type:e,config:{...t.defaultConfig||{}}}},d={...y.current,[n]:{w:r>=ff,h:!1}};m(l),g(u),N(d),x(!1),ce(l,u,d)},[p,ie,h,N,ce]),pe=(0,X.useCallback)(e=>{let t=p.filter(t=>t.i!==e),n={...h};delete n[e];let r={...y.current};delete r[e],m(t),g(n),N(r),ce(t,n,r)},[p,h,N,ce]),me=(0,X.useCallback)((e,t)=>{g(n=>{let r={...n,[e]:{...n[e],config:t}};return ce(p,r),r})},[p,ce]),he=Object.keys(h);return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full min-h-0`,children:[d&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b shrink-0 sm:px-3`,children:[(0,Z.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>x(e=>!e),className:`flex items-center gap-1.5 whitespace-nowrap px-2.5 py-1 text-xs border rounded-md hover:bg-accent`,children:[(0,Z.jsx)(br,{className:`w-3.5 h-3.5`}),`Add`,(0,Z.jsx)(`span`,{className:`hidden sm:inline`,children:` widget`})]}),b&&(0,Z.jsx)(`div`,{className:`absolute left-0 top-full mt-1 z-20 w-48 rounded-md border bg-popover shadow-elevation-2 py-1`,children:Ed().map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>fe(e.type),className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs text-left hover:bg-accent`,children:[(0,Z.jsx)(e.icon,{className:`w-3.5 h-3.5 text-muted-foreground`}),e.name]},e.type))})]}),(0,Z.jsxs)(`button`,{type:`button`,onClick:V,disabled:!S||w,className:K(`flex shrink-0 items-center gap-1.5 whitespace-nowrap px-2.5 py-1 text-xs rounded-md transition-colors disabled:opacity-50`,S?`bg-primary text-primary-foreground hover:bg-primary`:`border hover:bg-accent`),children:[(0,Z.jsx)(Yn,{className:`w-3.5 h-3.5`}),w?`Saving…`:`Save`]}),(0,Z.jsxs)(`span`,{className:`min-w-0 truncate text-xs text-muted-foreground`,children:[he.length,` widget`,he.length===1?``:`s`,S?` · unsaved`:``,E?` · ${E}`:``]})]}),(0,Z.jsx)(`div`,{ref:R,className:`canvas-grid-host flex-1 min-h-0 bg-muted/10 overflow-y-auto overflow-x-hidden`,children:he.length===0?(0,Z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(`p`,{children:`No widgets yet.`}),d&&(0,Z.jsx)(`p`,{className:`text-xs`,children:`Use “Add widget” to place one on the canvas.`})]}):(0,Z.jsx)(df,{className:`layout`,layout:ie,cols:ff,rowHeight:ae,margin:O?gf:hf,isDraggable:d&&!O,isResizable:d&&!O,resizeHandles:[`s`,`e`,`se`],draggableHandle:`.canvas-drag-handle`,draggableCancel:`.canvas-no-drag`,onLayoutChange:le,onResizeStop:ue,compactType:`vertical`,children:he.map(e=>{let t=h[e],n=Td(t.type),r=_[e]??_f,i=[r.w?`w`:``,r.h?`h`:``].filter(Boolean).join(` `);return(0,Z.jsx)(`div`,{"data-fill":i||void 0,children:n?(0,Z.jsx)(lf,{title:n.name,icon:n.icon,readOnly:!d,stacked:O,onRemove:()=>pe(e),fill:_[e]??_f,onToggleFill:d?t=>de(e,t):void 0,children:(0,Z.jsx)(n.component,{config:t.config??{...n.defaultConfig||{}},setConfig:t=>me(e,t),canvas:B})}):(0,Z.jsx)(lf,{title:`Unknown: ${t.type}`,readOnly:!d,stacked:O,onRemove:()=>pe(e),children:(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`This widget type is not available.`})})},e)})})})]})}var Af=`data/schema/file`;function jf(e){return String(e.locations?.[0]?.url||``).trim()}function Mf(e){let t=jf(e);if(!t)return``;let n=t.split(/[?#]/)[0].split(`/`).filter(Boolean).pop()||``;try{return decodeURIComponent(n)}catch{return n}}function Nf(e){return e.schema===Af&&String(e.metadata?.contentType||``).startsWith(`image/`)}function Pf(e){let t=Number(e);return!Number.isFinite(t)||t<0?``:t<1024?`${t} B`:t<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}function Ff(e){if(e.schema!==Af)return Ho(e);let t=Mf(e),n=String(e.metadata?.contentType||``).trim(),r=Pf(e.metadata?.size);return{...Ho(e),title:t||`File ${e.id}`,preview:[n,r].filter(Boolean).join(` · `),subtitle:jf(e),schemaLabel:`file`}}function If(e){return/^https?:\/\/[^\s]+$/i.test(e)}function Lf(e,t){if(e.schema===`data/schema/tab`){let t=String(e.data?.url||``).trim();return If(t)?t:null}return t.isExternal&&If(t.subtitle)?t.subtitle:If(t.title)?t.title:null}function Rf(e,t,n=!1){return Wc(e,t,{download:n})}function zf(e){return e.split(/(https?:\/\/[^\s]+)/gi).map((e,t)=>If(e)?(0,Z.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,className:`underline decoration-muted-foreground underline-offset-2 hover:text-primary`,children:e},`${e}-${t}`):e)}function Bf(e){return e?new Date(e).toLocaleString():``}function Vf(){let{code:e=``}=yt(),[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!0),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(``),d=(0,X.useMemo)(()=>t?.documents?Array.isArray(t.documents)?t.documents:t.documents.data||[]:[],[t]),f=(0,X.useMemo)(()=>{let e=l.trim().toLowerCase();return e?d.filter(t=>{let n=Ff(t);return[t.schema,n.title,n.preview,n.subtitle,Mf(t),t.metadata?.contentType].join(` `).toLowerCase().includes(e)}):d},[d,l]),p=(0,X.useCallback)(async()=>{if(e){i(!0);try{let t=await J.get(`${yo}/pub/c/${encodeURIComponent(e)}`,{skipAuth:!0});n(t),o(null)}catch(e){n(null),o(e instanceof Error?e.message:`Failed to load public canvas`)}finally{i(!1)}}},[e]);(0,X.useEffect)(()=>{p()},[p]),(0,X.useEffect)(()=>{if(!e)return;let t=xo(`${bo}/pub`,{transports:[`websocket`],auth:{code:e},reconnection:!0,reconnectionAttempts:10,reconnectionDelay:1500});return t.on(`connect`,()=>c(!0)),t.on(`disconnect`,()=>c(!1)),t.on(`connect_error`,()=>c(!1)),t.on(`canvas:changed`,()=>p()),()=>{t?.disconnect(),t=null}},[e,p]);let m=(0,X.useCallback)(e=>{e?.preventDefault(),u(l.trim())},[l]),h=(0,X.useCallback)(()=>{u(``)},[]),g=(0,X.useCallback)(async e=>({payload:rs(e?.sortBy)?is(d,e.sortBy,e?.order):d,totalCount:t?.stats.documentCount??d.length}),[d,t]);if(r&&!t)return(0,Z.jsx)(`main`,{className:`min-h-screen bg-muted flex items-center justify-center p-6`,children:(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Loading canvas...`})});if(a||!t)return(0,Z.jsxs)(`main`,{className:`min-h-screen bg-muted flex flex-col items-center justify-center p-6`,children:[(0,Z.jsxs)(zl,{className:`max-w-md bg-card`,children:[(0,Z.jsx)(Bl,{children:(0,Z.jsx)(Vl,{children:`Canvas unavailable`})}),(0,Z.jsx)(Ul,{className:`text-sm text-muted-foreground`,children:a||`This public canvas does not exist.`})]}),(0,Z.jsx)(au,{className:`mt-6 text-center`})]});let _=t.canvas.metadata?.ui??{},v=!!_.widgets&&Object.keys(_.widgets).length>0;return(0,Z.jsx)(qc.Provider,{value:e,children:(0,Z.jsx)(`main`,{className:`min-h-screen bg-muted p-2 text-foreground sm:p-4 md:p-10`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-6xl`,children:[(0,Z.jsxs)(zl,{className:`bg-card shadow-elevation-3`,children:[(0,Z.jsx)(Bl,{className:`border-b p-3 sm:p-6`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col gap-3 md:flex-row md:items-start md:justify-between md:gap-4`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 gap-3 sm:gap-4`,children:[(0,Z.jsx)(`div`,{className:`mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-accent text-primary sm:mt-1 sm:h-12 sm:w-12 sm:rounded-2xl`,style:t.canvas.color?{borderLeft:`4px solid ${t.canvas.color}`}:void 0,children:(0,Z.jsx)(Pa,{className:`h-5 w-5 sm:h-6 sm:w-6`})}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`truncate text-xs uppercase tracking-wide text-muted-foreground`,children:t.workspace.label||t.workspace.name}),(0,Z.jsxs)(`span`,{className:`flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] text-muted-foreground md:hidden`,children:[s?(0,Z.jsx)(Ja,{className:`h-3 w-3 text-success`}):(0,Z.jsx)(Hn,{className:`h-3 w-3 text-muted-foreground`}),s?`Live`:`Offline`]})]}),(0,Z.jsx)(Vl,{className:`mt-0.5 truncate text-2xl sm:mt-1 sm:text-3xl md:text-5xl`,children:t.canvas.label||t.canvas.name||`Canvas`}),t.canvas.description&&(0,Z.jsx)(`p`,{className:`mt-1.5 max-w-3xl text-sm text-muted-foreground sm:mt-3 sm:text-base`,children:t.canvas.description})]})]}),(0,Z.jsxs)(`div`,{className:`hidden shrink-0 items-center gap-2 rounded-full border px-3 py-1 text-xs text-muted-foreground md:flex`,children:[s?(0,Z.jsx)(Ja,{className:`h-3.5 w-3.5 text-success`}):(0,Z.jsx)(Hn,{className:`h-3.5 w-3.5 text-muted-foreground`}),s?`Live`:`Offline`]})]})}),(0,Z.jsxs)(Ul,{className:`space-y-4 p-3 sm:space-y-6 sm:p-6 md:p-8`,children:[(0,Z.jsxs)(`section`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1 text-xs text-muted-foreground md:hidden`,children:[(0,Z.jsx)(`span`,{className:`w-full truncate font-mono text-foreground`,children:t.share.path}),(0,Z.jsxs)(`span`,{className:`tabular-nums`,children:[t.stats.documentCount,` docs`]}),f.length!==t.stats.documentCount&&(0,Z.jsxs)(`span`,{className:`tabular-nums`,children:[`· `,f.length,` shown`]}),(0,Z.jsxs)(`span`,{className:`truncate`,children:[`· `,Bf(t.stats.refreshedAt)]})]}),(0,Z.jsxs)(`section`,{className:`hidden gap-3 md:grid md:grid-cols-4`,children:[(0,Z.jsx)(Hf,{label:`Path`,value:t.share.path,mono:!0}),(0,Z.jsx)(Hf,{label:`Documents`,value:String(t.stats.documentCount)}),(0,Z.jsx)(Hf,{label:`Shown`,value:String(f.length)}),(0,Z.jsx)(Hf,{label:`Refreshed`,value:Bf(t.stats.refreshedAt)})]}),v&&(0,Z.jsx)(`section`,{id:`content-area`,className:`flex w-full flex-col overflow-hidden rounded-2xl border h-viewport-card min-h-[420px] md:h-viewport-pane`,children:(0,Z.jsx)(kf,{workspaceId:t.workspace.name,treeName:t.share.treeName,path:t.share.path,layerId:t.canvas.id,querySpec:t.canvas.querySpec,metadata:t.canvas.metadata,readOnly:!0,interactive:!1,fetchDocuments:g},JSON.stringify(_))}),!v&&(0,Z.jsxs)(`section`,{className:`rounded-2xl border`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-3 border-b px-4 py-3 md:flex-row md:items-center md:justify-between`,children:[(0,Z.jsx)(`h2`,{className:`font-semibold`,children:`Content`}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Z.jsxs)(`form`,{onSubmit:m,className:`flex min-w-0 items-center gap-2`,children:[(0,Z.jsxs)(`div`,{className:`relative min-w-0`,children:[(0,Z.jsx)(qa,{className:`pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,Z.jsx)(`input`,{type:`search`,value:l,onChange:e=>u(e.target.value),placeholder:`Search loaded documents...`,className:`w-full rounded-md border py-1.5 pl-9 pr-8 text-sm md:w-72`}),l&&(0,Z.jsx)(`button`,{type:`button`,onClick:h,className:`absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground`,"aria-label":`Clear search`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsx)(`button`,{type:`submit`,className:`rounded-md border px-3 py-1.5 text-xs hover:bg-muted`,children:`Search`})]}),(0,Z.jsxs)(`button`,{type:`button`,onClick:p,className:`inline-flex items-center justify-center gap-2 rounded-md border px-3 py-1.5 text-xs hover:bg-muted`,children:[(0,Z.jsx)(Er,{className:`h-3.5 w-3.5 ${r?`animate-spin`:``}`}),`Refresh`]})]})]}),l.trim()&&(0,Z.jsxs)(`div`,{className:`border-b bg-muted px-4 py-2 text-xs text-muted-foreground`,children:[`Local search: `,(0,Z.jsxs)(`span`,{className:`font-mono`,children:[`"`,l.trim(),`"`]})]}),(0,Z.jsx)(`div`,{className:`divide-y`,children:f.length===0?(0,Z.jsx)(`div`,{className:`p-8 text-center text-sm text-muted-foreground`,children:l.trim()?`No loaded documents match your search.`:`No documents yet.`}):f.map(t=>{let n=Ff(t),r=Lf(t,n),i=t.schema===Af,a=i?Rf(e,t.id):null,o=a||r;return(0,Z.jsxs)(`article`,{className:`p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1 md:flex-row md:items-start md:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`h3`,{className:`truncate font-medium`,children:o?(0,Z.jsx)(`a`,{href:o,target:`_blank`,rel:`noreferrer`,className:`hover:text-primary hover:underline`,children:n.title}):n.title}),(0,Z.jsx)(`div`,{className:`mt-1 font-mono text-xs text-muted-foreground`,children:n.schemaLabel})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-3`,children:[i&&(0,Z.jsxs)(`a`,{href:Rf(e,t.id,!0),download:n.title,className:`inline-flex items-center gap-1 rounded-md border px-2 py-1 text-xs text-muted-foreground hover:bg-muted hover:text-foreground`,children:[(0,Z.jsx)(zi,{className:`h-3.5 w-3.5`}),`Download`]}),(0,Z.jsx)(`time`,{className:`text-xs text-muted-foreground`,children:Bf(t.updatedAt||t.createdAt)})]})]}),n.preview&&(0,Z.jsx)(`p`,{className:`mt-3 line-clamp-3 text-sm leading-6 text-foreground`,children:zf(n.preview)}),Nf(t)&&(0,Z.jsx)(`a`,{href:a||void 0,target:`_blank`,rel:`noreferrer`,className:`mt-3 block w-fit`,children:(0,Z.jsx)(`img`,{src:a||void 0,alt:n.title,loading:`lazy`,className:`max-h-64 max-w-full rounded border bg-muted object-contain transition-opacity hover:opacity-90`})})]},t.id)})})]})]})]}),(0,Z.jsx)(au,{className:`mt-6 text-center`})]})})})}function Hf({label:e,value:t,mono:n=!1}){return(0,Z.jsxs)(`div`,{className:`min-w-0 rounded-xl border bg-muted p-4`,children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:e}),(0,Z.jsx)(`div`,{className:`mt-2 truncate text-lg font-semibold ${n?`font-mono text-sm`:``}`,children:t||`-`})]})}var Uf=`false`,Wf=`false`,Gf=Uf===`true`,Kf=Wf===`true`;function qf(e={}){let{immediate:t=!1,onNeedReload:n,onNeedRefresh:r,onOfflineReady:i,onRegistered:a,onRegisteredSW:o,onRegisterError:s}=e,c,l,u,d=async(e=!0)=>{await l,Gf||u?.()};async function f(){if(`serviceWorker`in navigator){if(c=await g(async()=>{let{Workbox:e}=await import(`./workbox-window.prod.es5-Bd17z0YL.js`);return{Workbox:e}},[]).then(({Workbox:e})=>new e(`/sw.js`,{scope:`/`,type:`classic`})).catch(e=>{s?.(e)}),!c)return;if(u=()=>{c?.messageSkipWaiting()},!Kf){if(Gf)c.addEventListener(`activated`,e=>{(e.isUpdate||e.isExternal)&&(n?n():window.location.reload())}),c.addEventListener(`installed`,e=>{e.isUpdate||i?.()});else{let e=!1,t=()=>{e=!0,c?.addEventListener(`controlling`,e=>{e.isUpdate&&(n?n():window.location.reload())}),r?.()};c.addEventListener(`installed`,n=>{n.isUpdate===void 0?n.isExternal===void 0?!e&&i?.():n.isExternal?t():!e&&i?.():n.isUpdate||i?.()}),c.addEventListener(`waiting`,t)}}c.register({immediate:t}).then(e=>{o?o(`/sw.js`,e):a?.(e)}).catch(e=>{s?.(e)})}}return l=f(),d}var Jf=new Set,Yf=!1,Xf=qf({immediate:!0,onRegisteredSW(e,t){t&&setInterval(()=>{t.update()},36e5)},onNeedRefresh(){Yf=!0,Jf.forEach(e=>e())}});function Zf(e){return Jf.add(e),Yf&&e(),()=>{Jf.delete(e)}}function Qf(){Xf(!0)}function $f(){let[e,t]=(0,X.useState)(!1),[n,r]=(0,X.useState)(!1);return(0,X.useEffect)(()=>Zf(()=>t(!0)),[]),!e||n?null:(0,Z.jsx)(`div`,{className:`fixed bottom-4 left-1/2 z-50 -translate-x-1/2`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-3 rounded-full border border-border bg-card px-4 py-2 shadow-elevation-2`,children:[(0,Z.jsx)(`span`,{className:`text-sm`,children:`A new version of Canvas is ready`}),(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>Qf(),className:`flex items-center gap-1 rounded-full bg-foreground px-3 py-1 text-xs font-medium text-background hover:bg-foreground/90`,children:[(0,Z.jsx)(Er,{className:`h-3 w-3`}),` Reload`]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(!0),"aria-label":`Not now`,className:`rounded-full p-1 text-muted-foreground hover:bg-muted hover:text-foreground`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})})}var ep=Object.defineProperty,tp=Object.getOwnPropertyDescriptor,np=(e,t)=>{for(var n in t)ep(e,n,{get:t[n],enumerable:!0})},rp=(e,t,n,r)=>{for(var i=r>1?void 0:r?tp(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(r?o(t,n,i):o(i))||i);return r&&i&&ep(t,n,i),i},ip=(e,t)=>(n,r)=>t(n,r,e),ap=`Terminal input`,op={get:()=>ap,set:e=>ap=e},sp=`Too much output to announce, navigate to rows manually to read`,cp={get:()=>sp,set:e=>sp=e};function lp(e){return e.replace(/\r?\n/g,`\r`)}function up(e,t){return t?`\x1B[200~`+e+`\x1B[201~`:e}function dp(e,t){e.clipboardData&&e.clipboardData.setData(`text/plain`,t.selectionText),e.preventDefault()}function fp(e,t,n,r){e.stopPropagation(),e.clipboardData&&pp(e.clipboardData.getData(`text/plain`),t,n,r)}function pp(e,t,n,r){e=lp(e),e=up(e,n.decPrivateModes.bracketedPasteMode&&r.rawOptions.ignoreBracketedPasteMode!==!0),n.triggerDataEvent(e,!0),t.value=``}function mp(e,t,n){let r=n.getBoundingClientRect(),i=e.clientX-r.left-10,a=e.clientY-r.top-10;t.style.width=`20px`,t.style.height=`20px`,t.style.left=`${i}px`,t.style.top=`${a}px`,t.style.zIndex=`1000`,t.focus()}function hp(e,t,n,r,i){mp(e,t,n),i&&r.rightClickSelect(e),t.value=r.selectionText,t.select()}function gp(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function _p(e,t=0,n=e.length){let r=``;for(let i=t;i<n;++i){let t=e[i];t>65535?(t-=65536,r+=String.fromCharCode((t>>10)+55296)+String.fromCharCode(t%1024+56320)):r+=String.fromCharCode(t)}return r}var vp=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i=0;if(this._interim){let n=e.charCodeAt(i++);56320<=n&&n<=57343?t[r++]=(this._interim-55296)*1024+n-56320+65536:(t[r++]=this._interim,t[r++]=n),this._interim=0}for(let a=i;a<n;++a){let i=e.charCodeAt(a);if(55296<=i&&i<=56319){if(++a>=n)return this._interim=i,r;let o=e.charCodeAt(a);56320<=o&&o<=57343?t[r++]=(i-55296)*1024+o-56320+65536:(t[r++]=i,t[r++]=o);continue}i!==65279&&(t[r++]=i)}return r}},yp=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i,a,o,s,c=0,l=0;if(this.interim[0]){let i=!1,a=this.interim[0];a&=(a&224)==192?31:(a&240)==224?15:7;let o=0,s;for(;(s=this.interim[++o]&63)&&o<4;)a<<=6,a|=s;let c=(this.interim[0]&224)==192?2:(this.interim[0]&240)==224?3:4,u=c-o;for(;l<u;){if(l>=n)return 0;if(s=e[l++],(s&192)!=128){l--,i=!0;break}this.interim[o++]=s,a<<=6,a|=s&63}i||(c===2?a<128?l--:t[r++]=a:c===3?a<2048||a>=55296&&a<=57343||a===65279||(t[r++]=a):a<65536||a>1114111||(t[r++]=a)),this.interim.fill(0)}let u=n-4,d=l;for(;d<n;){for(;d<u&&!((i=e[d])&128)&&!((a=e[d+1])&128)&&!((o=e[d+2])&128)&&!((s=e[d+3])&128);)t[r++]=i,t[r++]=a,t[r++]=o,t[r++]=s,d+=4;if(i=e[d++],i<128)t[r++]=i;else if((i&224)==192){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(c=(i&31)<<6|a&63,c<128){d--;continue}t[r++]=c}else if((i&240)==224){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(c=(i&15)<<12|(a&63)<<6|o&63,c<2048||c>=55296&&c<=57343||c===65279)continue;t[r++]=c}else if((i&248)==240){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,this.interim[2]=o,r;if(s=e[d++],(s&192)!=128){d--;continue}if(c=(i&7)<<18|(a&63)<<12|(o&63)<<6|s&63,c<65536||c>1114111)continue;t[r++]=c}}return r}},bp=``,xp=` `,Sp=class e{constructor(){this.fg=0,this.bg=0,this.extended=new Cp}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let t=new e;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)==50331648}isBgRGB(){return(this.bg&50331648)==50331648}isFgPalette(){return(this.fg&50331648)==16777216||(this.fg&50331648)==33554432}isBgPalette(){return(this.bg&50331648)==16777216||(this.bg&50331648)==33554432}isFgDefault(){return!(this.fg&50331648)}isBgDefault(){return!(this.bg&50331648)}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==16777216||(this.extended.underlineColor&50331648)==33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?!(this.extended.underlineColor&50331648):this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},Cp=class e{constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new e(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},wp=class e extends Sp{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new Cp,this.combinedData=``}static fromCharData(t){let n=new e;return n.setFromCharData(t),n}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?gp(this.content&2097151):``}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let n=e[1].charCodeAt(0);if(55296<=n&&n<=56319){let r=e[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(n-55296)*1024+r-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},Tp=`di$target`,Ep=`di$dependencies`,Dp=new Map;function Op(e){return e[Ep]||[]}function kp(e){if(Dp.has(e))return Dp.get(e);let t=function(e,n,r){if(arguments.length!==3)throw Error(`@IServiceName-decorator can only be used to decorate a parameter`);Ap(t,e,r)};return t._id=e,Dp.set(e,t),t}function Ap(e,t,n){t[Tp]===t?t[Ep].push({id:e,index:n}):(t[Ep]=[{id:e,index:n}],t[Tp]=t)}var jp=kp(`BufferService`),Mp=kp(`CoreMouseService`),Np=kp(`CoreService`),Pp=kp(`CharsetService`),Fp=kp(`InstantiationService`),Ip=kp(`LogService`),Lp=kp(`OptionsService`),Rp=kp(`OscLinkService`),zp=kp(`UnicodeService`),Bp=kp(`DecorationService`),Vp=class{constructor(e,t,n){this._bufferService=e,this._optionsService=t,this._oscLinkService=n}provideLinks(e,t){let n=this._bufferService.buffer.lines.get(e-1);if(!n){t(void 0);return}let r=[],i=this._optionsService.rawOptions.linkHandler,a=new wp,o=n.getTrimmedLength(),s=-1,c=-1,l=!1;for(let t=0;t<o;t++)if(!(c===-1&&!n.hasContent(t))){if(n.loadCell(t,a),a.hasExtendedAttrs()&&a.extended.urlId){if(c===-1){c=t,s=a.extended.urlId;continue}l=a.extended.urlId!==s}else c!==-1&&(l=!0);if(l||c!==-1&&t===o-1){let n=this._oscLinkService.getLinkData(s)?.uri;if(n){let a={start:{x:c+1,y:e},end:{x:t+ +(!l&&t===o-1),y:e}},s=!1;if(!i?.allowNonHttpProtocols)try{let e=new URL(n);[`http:`,`https:`].includes(e.protocol)||(s=!0)}catch{s=!0}s||r.push({text:n,range:a,activate:(e,t)=>i?i.activate(e,t,a):Hp(e,t),hover:(e,t)=>i?.hover?.(e,t,a),leave:(e,t)=>i?.leave?.(e,t,a)})}l=!1,a.hasExtendedAttrs()&&a.extended.urlId?(c=t,s=a.extended.urlId):(c=-1,s=-1)}}t(r)}};Vp=rp([ip(0,jp),ip(1,Lp),ip(2,Rp)],Vp);function Hp(e,t){if(confirm(`Do you want to navigate to ${t}?
|
|
5
5
|
|
|
@@ -28,20 +28,20 @@ WARNING: This link could potentially be dangerous`)){let e=window.open();if(e){t
|
|
|
28
28
|
`).trim():``:``}function VD(e){if(!e)return;let t=BD(e),n={...e.api?{api:e.api}:{},...e.provider?{provider:e.provider}:{},...e.model?{model:e.model}:{},...e.stopReason?{stopReason:e.stopReason}:{},...e.timestamp===void 0?{}:{timestamp:e.timestamp},...e.responseId?{responseId:e.responseId}:{},...e.usage?{usage:e.usage}:{},...e.metadata?.toolCalls?{toolCalls:e.metadata.toolCalls}:{},...t?{reasoning:t}:{}};return Object.keys(n).length>0?n:void 0}function HD(e){if(typeof e==`number`)return new Date(e).toISOString();if(typeof e==`string`){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t.toISOString()}return new Date().toISOString()}function UD(e=[]){return e.filter(e=>e?.role===`user`||e?.role===`assistant`).map(e=>({role:e.role,content:zD(e),timestamp:HD(e.timestamp),...e.role===`assistant`?{metadata:VD(e)}:{}})).filter(e=>e.content||e.metadata?.reasoning)}function WD(e){return{mode:e?.mode,sessionId:e?.sessionId,sessionFile:e?.sessionFile,thinkingLevel:e?.thinkingLevel,model:e?.model,messages:UD(e?.messages||[])}}function GD(e){return{current:WD(e?.current),sessions:e?.sessions}}new class{connectors=new Map;wsService=null;messageCallbacks=new Map;constructor(){this.initializeWebSocketFallback()}async initializeWebSocketFallback(){try{let e=`${window.location.protocol===`https:`?`wss:`:`ws:`}//${window.location.host}/ws`;this.wsService=new RD(e)}catch(e){console.warn(`WebSocket fallback not available:`,e)}}registerAgent(e){if(e.type===`anthropic`){let t=new LD(e.apiKey||``,e.endpoint||`${yo}/agents/${e.id}`);this.connectors.set(e.id,t)}}async sendMessage(e,t,n={}){let{onMessage:r,onError:i,onComplete:a,useWebSocketFallback:o=!1}=n,s=`msg_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;r&&this.messageCallbacks.set(s,r);try{if(o&&this.wsService){await this.sendMessageViaWebSocket(e,s,t,r,i),a&&a();return}let n=this.connectors.get(e);n?await n.chatStream(t,{agentId:e,messageId:s,onMessage:e=>{let t={id:e.messageId,agentId:e.agentId,content:e.content||``,timestamp:new Date,type:`agent`,streaming:!e.done,error:e.error};r&&r(t)},onError:n=>{if(console.error(`Agent connector error:`,n),n.message.includes(`getReader is not a function`)&&this.wsService){console.log(`Falling back to WebSocket streaming...`),this.sendMessageViaWebSocket(e,s,t,r,i);return}i&&i(n)},onComplete:a}):await this.sendMessageViaAPI(e,s,t,r,i,a)}catch(e){console.error(`Agent communication error:`,e),i&&i(e instanceof Error?e:Error(String(e)))}finally{this.messageCallbacks.delete(s)}}async sendMessageViaAPI(e,t,n,r,i,a){try{await J.stream(`${yo}/agents/${e}/chat/stream`,{message:n,messageId:t},{onChunk:n=>{try{let i=JSON.parse(n),a={id:t,agentId:e,content:i.content||n,timestamp:new Date,type:`agent`,streaming:!i.done,error:i.error};r&&r(a)}catch{r&&r({id:t,agentId:e,content:n,timestamp:new Date,type:`agent`,streaming:!0})}},onError:e=>{console.error(`API streaming error:`,e),i&&i(e)},onComplete:a})}catch(e){i&&i(e instanceof Error?e:Error(String(e)))}}async sendMessageViaWebSocket(e,t,n,r,i){if(!this.wsService){i&&i(Error(`WebSocket service not available`));return}try{this.wsService.socket?.readyState!==WebSocket.OPEN&&await this.wsService.connect(),this.wsService.startChatStream(e,t,n,e=>{let t={id:e.messageId,agentId:e.agentId,content:e.content||``,timestamp:new Date,type:`agent`,streaming:!e.done,error:e.error};r&&r(t)},i)}catch(e){i&&i(e instanceof Error?e:Error(String(e)))}}async getAvailableAgents(){try{return(await J.get(`${yo}/agents`)).agents||[]}catch(e){return console.error(`Failed to fetch available agents:`,e),[]}}async createAgent(e){let t=await J.post(`${yo}/agents`,e);return this.registerAgent(t),t}dispose(){this.connectors.clear(),this.messageCallbacks.clear(),this.wsService&&this.wsService.disconnect()}};async function KD(e){return await J.get(`${yo}/agents/${e}/access`)||null}async function qD(e,t){return await J.put(`${yo}/agents/${e}/access`,t)}async function JD(e){return await J.post(`${yo}/agents/${e}/access/token`)}async function YD(e){await J.delete(`${yo}/agents/${e}/access`)}async function XD(e){return await J.get(`${yo}/agents/${e}/tools`)||{tools:[],config:{}}}async function ZD(){try{return await J.get(`${yo}/agents`)||[]}catch(e){return console.error(`Failed to list agents:`,e),[]}}async function QD(e){return await J.get(`${yo}/agents/${e}`)}async function $D(e){return WD(await J.get(`${yo}/agents/${e}/session`))}async function eO(e){return await J.get(`${yo}/agents/${e}/sessions`)}async function tO(e,t){return GD(await J.post(`${yo}/agents/${e}/sessions`,t))}async function nO(e,t){return GD(await J.put(`${yo}/agents/${e}/session`,t))}async function rO(e,t,n){return GD(await J.patch(`${yo}/agents/${e}/sessions/${t}`,n))}async function iO(e,t){return GD(await J.delete(`${yo}/agents/${e}/sessions/${t}`))}async function aO(e){return await J.get(`${yo}/agents/${e}/skills`)||[]}async function oO(e,t){return await J.post(`${yo}/agents/${e}/skills`,t)||[]}async function sO(e,t){return await J.delete(`${yo}/agents/${e}/skills/${encodeURIComponent(t)}`)||[]}async function cO(e){return await J.post(`${yo}/agents`,e)}async function lO(e,t){return await J.put(`${yo}/agents/${e}`,t)}async function uO(e){await J.delete(`${yo}/agents/${e}`)}async function dO(e){return await J.post(`${yo}/agents/${e}/start`)}async function fO(e){return await J.post(`${yo}/agents/${e}/stop`)}async function pO(e){return await J.get(`${yo}/agents/${e}/status`)}async function mO(e,t,n={}){let{onStart:r,onMessage:i,onError:a,onComplete:o,context:s,mcpContext:c,maxTokens:l,temperature:u,images:d}=n,f=``;await J.stream(`${yo}/agents/${e}/prompt/stream`,{message:t,images:d,context:s,mcpContext:c,maxTokens:l,temperature:u},{onOpen:()=>{r?.()},onChunk:e=>{f+=e;let t=f.split(`
|
|
29
29
|
|
|
30
30
|
`);f=t.pop()||``;for(let e of t){let t=e.split(`
|
|
31
|
-
`).map(e=>e.trim()).filter(Boolean);for(let e of t){if(!e.startsWith(`data: `))continue;let t=e.slice(6).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t);if(!i)continue;if(e.type===`chunk`)i(e.delta||``,!1,e.metadata||{});else if(e.type===`thinking`)i(``,!1,{...e.metadata||{},reasoningDelta:e.delta||``});else if(e.type===`complete`){let t=Array.isArray(e.messages)?[...e.messages].reverse().find(e=>e?.role===`assistant`):null;i(``,!0,{...e.metadata||{},...VD(t)||{}})}else e.type===`error`&&a&&a(Error(e.error||`Prompt stream failed`))}catch{}}}},onError:a,onComplete:o})}async function hO(e,t){let{message:n,onMessage:r,onError:i,onComplete:a,context:o,mcpContext:s,maxTokens:c,temperature:l,images:u}=t;try{let t=await J.post(`${yo}/agents/${e}/prompt`,{message:n,images:u,context:o,mcpContext:s,maxTokens:c,temperature:l}),i=Array.isArray(t.messages)?[...t.messages].reverse().find(e=>e?.role===`assistant`):null,d={content:zD(i),metadata:VD(i)};return r&&r(d.content,!0,d.metadata),a&&a(),d}catch(e){throw i&&i(e),e}}function gO(e){return e.map(e=>({...e,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString()}))}async function _O(){return await J.get(`${yo}/voice/status`)}async function vO(e,t,n={}){let r=new FormData,i=(t.type.split(`/`)[1]||`webm`).split(`;`)[0];r.append(`file`,t,`voice.${i}`);let a=new URLSearchParams;n.tts===!1&&a.set(`tts`,`false`),n.voice&&a.set(`voice`,n.voice);let o=a.toString()?`?${a.toString()}`:``;return await J.post(`${yo}/agents/${e}/voice${o}`,r)}var yO=[{id:`workspace`,label:`Workspace`,path:`workspaces`,description:`Files, search, devices and sharing for one workspace. These settings override account defaults.`,sections:kD,load:async()=>(await Uo()).map(e=>({id:e.name,label:e.label||e.name}))},{id:`context`,label:`Context`,path:`contexts`,description:`Choose the tree and path a context opens, and who can access that view. File storage belongs to its workspace.`,sections:MD,load:async()=>(await ml()).map(e=>({id:e.id,label:e.name||e.id}))},{id:`agent`,label:`Agent`,path:`agents`,description:`Configure one assistant: its instructions, chat model, tools and access to Canvas.`,sections:PD,load:async()=>(await ZD()).map(e=>({id:e.id,label:e.label||e.name}))}];function bO({to:e,label:t,description:n,icon:r}){return(0,Z.jsxs)(we,{to:e,className:`group flex items-start gap-3 rounded-lg border bg-card p-4 transition-colors hover:border-primary/50 hover:bg-accent/30 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary`,children:[(0,Z.jsx)(r,{className:`mt-0.5 h-5 w-5 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-semibold`,children:t}),(0,Z.jsx)(`span`,{className:`mt-1 block text-sm leading-relaxed text-muted-foreground`,children:n})]}),(0,Z.jsx)(xi,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground group-hover:text-primary`})]})}function xO({group:e,query:t}){let[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(`loading`),[c,l]=(0,X.useState)(0);(0,X.useEffect)(()=>{let t=!1;return e.load().then(e=>{t||(r(e),s(`ready`))}).catch(()=>{t||s(`error`)}),()=>{t=!0}},[e,c]);let u=e.sections.filter(n=>wC(t,e.label,n.label,n.description));return u.length?(0,Z.jsxs)(`section`,{id:e.id,className:`scroll-mt-6 space-y-3`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Z.jsxs)(`label`,{className:`block max-w-md text-sm font-medium`,children:[`Choose a `,e.label.toLowerCase(),(0,Z.jsxs)(`select`,{className:`mt-2 h-10 w-full rounded-md border bg-background px-3 text-sm`,value:i,disabled:o!==`ready`||!n.length,onChange:e=>a(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:o===`loading`?`Loading…`:o===`error`?`Unable to load list`:n.length?`Select ${e.label.toLowerCase()}…`:`No ${e.path} available`}),n.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.label},e.id))]})]}),o===`error`&&(0,Z.jsxs)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:[`The list could not be loaded. `,(0,Z.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>{s(`loading`),l(e=>e+1)},children:`Retry`})]}),(0,Z.jsxs)(`details`,{open:!!(i||t.trim()),children:[(0,Z.jsx)(`summary`,{className:`cursor-pointer py-2 text-sm text-muted-foreground`,children:i?`Settings for ${n.find(e=>e.id===i)?.label||i}`:`What you can configure (${u.length})`}),(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:u.map(t=>i?(0,Z.jsx)(bO,{to:`/${e.path}/${encodeURIComponent(i)}/settings/${t.id}`,...t},t.id):(0,Z.jsxs)(`div`,{className:`rounded-lg border border-dashed p-4`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:t.label}),(0,Z.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:t.description})]},t.id))})]})]}):null}function SO(){let{state:e}=qC(),[t,n]=(0,X.useState)(``),r=SC.filter(t=>t.id!==`server`||e.user?.userType===`admin`).map(e=>({...e,items:e.items.filter(n=>wC(t,e.label,n.label,n.description))})).filter(e=>e.items.length),i=yO.some(e=>e.sections.some(n=>wC(t,e.label,n.label,n.description)));return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-6xl space-y-8 pb-8 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{title:`Settings`,description:`Start with what you want to change. Each section explains where your changes apply.`}),(0,Z.jsx)(q,{type:`search`,className:`max-w-xl`,"aria-label":`Search all settings`,placeholder:`Find a setting: offline, folders, models, sharing…`,value:t,onChange:e=>n(e.target.value)}),r.filter(e=>e.id===`device`||e.id===`account`).map(e=>(0,Z.jsxs)(`section`,{className:`space-y-3`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:e.items.map(e=>(0,Z.jsx)(bO,{to:e.path,...e},e.path))})]},e.id)),yO.map(e=>(0,Z.jsx)(xO,{group:e,query:t},e.id)),r.filter(e=>e.id===`server`||e.id===`information`).map(e=>(0,Z.jsxs)(`section`,{className:`space-y-3`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:e.items.map(e=>(0,Z.jsx)(bO,{to:e.path,...e},e.path))})]},e.id)),!r.length&&!i&&(0,Z.jsxs)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:[`No settings match “`,t,`”. Try a shorter phrase or clear the search.`]})]})}var CO=[{id:`canvas_1`,title:`Canvas Deep`,scheme:`dark`,background:`#032940`,accent:`#f2f2f2`,sources:[{type:`image/svg+xml`,src:`files/canvas_1.svg`},{type:`image/avif`,src:`files/canvas_1.avif`},{type:`image/webp`,src:`files/canvas_1.webp`}],thumb:`thumbs/canvas_1.webp`,author:`Canvas`,license:`LicenseRef-Canvas-Brand`},{id:`canvas_3`,title:`Canvas Mono Dark`,scheme:`dark`,background:`#000000`,accent:`#ffffff`,sources:[{type:`image/svg+xml`,src:`files/canvas_3.svg`},{type:`image/avif`,src:`files/canvas_3.avif`},{type:`image/webp`,src:`files/canvas_3.webp`}],thumb:`thumbs/canvas_3.webp`,author:`Canvas`,license:`LicenseRef-Canvas-Brand`},{id:`w1`,title:`Frost`,scheme:`dark`,background:`#164a6f`,accent:`#9ad9f0`,sources:[{type:`image/avif`,src:`files/w1.avif`},{type:`image/webp`,src:`files/w1.webp`},{type:`image/jpeg`,src:`files/w1.jpg`}],thumb:`thumbs/w1.webp`,author:`Peter Cui Bide`,source:`https://petercui.deviantart.com`,license:`LicenseRef-Attribution-Only`}],wO=`/wallpapers`;function TO(e){return CO.find(t=>t.id===e)}function EO(e,t={}){let n=typeof e==`string`?TO(e):e;if(!n)return null;let{base:r=wO,types:i}=t,a=(i?n.sources.find(e=>i.includes(e.type)):n.sources[0])??n.sources[n.sources.length-1];return`${r.replace(/\/$/,``)}/${a.src}`}function DO(e,t=wO){let n=typeof e==`string`?TO(e):e;return n?`${t.replace(/\/$/,``)}/${n.thumb}`:null}var OO=[{id:`cover`,label:`Scale and Crop`,description:`Fills the screen, cropping edges as needed`},{id:`fill`,label:`Fill`,description:`Stretches to the exact screen size`},{id:`center`,label:`Centered`,description:`Original size, centered on the desk`}],kO=`canvas:wallpaper`,AO=`canvas-wallpaper`,jO=`settings`,MO=`builtin:`,NO=CO;function PO(e){return DO(e)??``}function FO(e){return`${MO}${e}`}function IO(e){return e?.startsWith(MO)?e.slice(8):null}function LO(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.image!=`string`&&t.image!==null?null:{image:t.image,fit:t.fit===`fill`||t.fit===`center`?t.fit:`cover`}}function RO(){try{let e=localStorage.getItem(kO);if(e){let t=LO(JSON.parse(e));if(t)return t}}catch{}return{image:null,fit:`cover`}}var zO=RO(),BO=null;function VO(){return zO}async function HO(e){let t=await new Promise((e,t)=>{let n=indexedDB.open(AO,1),r=!1;n.onupgradeneeded=()=>n.result.createObjectStore(jO),n.onsuccess=()=>{if(r){n.result.close();return}n.result.onversionchange=()=>n.result.close(),e(n.result)},n.onerror=()=>t(n.error),n.onblocked=()=>{r=!0,t(Error(`Close other Canvas tabs and try again.`))}});try{return await new Promise((n,r)=>{let i=t.transaction(jO,e?`readwrite`:`readonly`),a=i.objectStore(jO),o=e?a.put(e,kO):a.get(kO);i.oncomplete=()=>n(o.result),i.onerror=()=>r(i.error),i.onabort=()=>r(i.error)})}finally{t.close()}}function UO(){try{localStorage.removeItem(kO)}catch{}}function WO(){return BO||=(async()=>{try{let e=LO(await HO());e?zO=e:await HO(zO),UO()}catch{}return QO(zO),zO})(),BO.then(()=>zO)}async function GO(e){await WO(),await HO(e),zO=e,UO(),QO(e)}function KO(e){if(e.size>10485760)return Promise.reject(Error(`Image too large. Choose one up to 10 MB.`));let t=e.type||(/\.gif$/i.test(e.name)?`image/gif`:``);return t.startsWith(`image/`)?new Promise((n,r)=>{let i=new FileReader;i.onload=()=>n(String(i.result)),i.onerror=()=>r(Error(`Could not read the image. Try selecting it again.`)),i.onabort=()=>r(Error(`Reading the image was cancelled.`)),i.readAsDataURL(e.type?e:e.slice(0,e.size,t))}):Promise.reject(Error(`Pick an image file (animated GIFs are supported).`))}var qO=typeof CSS<`u`&&CSS.supports(`background-image`,`image-set(url("a.avif") type("image/avif"))`);function JO(e){if(!e)return null;let t=IO(e);if(t===null)return`url("${e}")`;let n=TO(t);if(!n)return null;let r=`url("${EO(n,{types:[n.sources[n.sources.length-1].type]})}")`;return!qO||n.sources.length===1?r:`image-set(${n.sources.map(e=>`url("${EO(n,{types:[e.type]})}") type("${e.type}")`).join(`, `)})`}function YO(e){return e===`fill`?`100% 100%`:e===`center`?`auto`:`cover`}var XO=null;function ZO(e){let t=e.indexOf(`,`);if(t<0)throw Error(`Invalid wallpaper data URL`);let n=e.slice(5,t),r=e.slice(t+1),i;if(n.endsWith(`;base64`)){let e=atob(r);i=new Uint8Array(e.length);for(let t=0;t<e.length;t++)i[t]=e.charCodeAt(t)}else i=new TextEncoder().encode(decodeURIComponent(r));return new Blob([i],{type:n.split(`;`)[0]})}function QO(e=VO()){let t=document.documentElement.style,n=XO,r=e.image;if(r?.startsWith(`data:`))try{XO?.dataUrl!==r&&(XO={dataUrl:r,objectUrl:URL.createObjectURL(ZO(r))}),r=XO.objectUrl}catch{XO=null,r=null}else XO=null;let i=JO(r);i?(t.setProperty(`--wallpaper-image`,i),t.setProperty(`--wallpaper-size`,YO(e.fit))):(t.removeProperty(`--wallpaper-image`),t.removeProperty(`--wallpaper-size`)),n&&n!==XO&&URL.revokeObjectURL(n.objectUrl)}var $O=[{id:`cards`,name:`Cards`,description:`Nested cards with connector lines. Each level indents.`},{id:`accordion-mobile`,name:`Accordion on phones (beta)`,description:`Experimental. Full-width accordion rows on a phone, cards on wider screens.`},{id:`accordion`,name:`Accordion (beta)`,description:`Experimental. Full-width rows at every depth; a depth rail, tint and colour swatch replace the indent, and open parents stick to the top while you scroll.`}],ek=`canvas:treeStyle`;function tk(){try{let e=localStorage.getItem(ek);return e===`accordion`||e===`accordion-mobile`?e:`cards`}catch{return`cards`}}var nk=tk(),rk=new Set;function ik(){return nk}function ak(e){try{e===`cards`?localStorage.removeItem(ek):localStorage.setItem(ek,e)}catch{}nk=e;for(let e of rk)e()}function ok(e){rk.add(e);let t=t=>{(t.key===ek||t.key===null)&&(nk=tk(),e())};return window.addEventListener(`storage`,t),()=>{rk.delete(e),window.removeEventListener(`storage`,t)}}function sk(){return(0,X.useSyncExternalStore)(ok,ik,()=>`cards`)}function ck(){let e=sk(),t=De();return e===`accordion`||e===`accordion-mobile`&&t}var lk=[{id:`canvas`,name:`Canvas`,description:`Black and white with a teal accent. Sheets of paper on a grey desk.`,swatches:[`oklch(1 0 0)`,`oklch(0 0 0)`,`oklch(0.704 0.135 183)`]},{id:`nord`,name:`Nord`,description:`Cool arctic blues, lower contrast, softer corners.`,swatches:[`oklch(0.976 0.006 251)`,`oklch(0.588 0.056 244)`,`oklch(0.686 0.062 213)`]},{id:`contrast`,name:`High Contrast`,description:`WCAG AAA text contrast, square corners, hard borders, no shadows.`,swatches:[`oklch(1 0 0)`,`oklch(0 0 0)`,`oklch(0.32 0.16 258)`]},{id:`frost`,name:`Frosted Glass`,description:`Translucent, blurred surfaces over a soft backdrop. Best with a wallpaper.`,swatches:[`oklch(0.92 0.008 250)`,`oklch(0.31 0.025 255)`,`oklch(0.55 0.05 250)`]},{id:`terminal`,name:`Terminal`,description:`Monospaced and dense. Tighter rows and chrome for large displays.`,swatches:[`oklch(0.17 0.006 152)`,`oklch(0.8 0.19 148)`,`oklch(0.75 0.12 220)`]},{id:`halflife`,name:`Half-Life`,description:`Lambda orange on black steel. Square corners; the left rail is orange.`,swatches:[`oklch(0.724 0.181 52)`,`oklch(0 0 0)`,`oklch(1 0 0)`]}],uk=lk.map(e=>e.id),dk=[{id:`system`,name:`System`},{id:`light`,name:`Light`},{id:`dark`,name:`Dark`}],fk=[{id:`auto`,name:`Auto`,description:`Match the pointer: touch on phones, mouse on desktop`},{id:`compact`,name:`Compact`,description:`Maximum rows per screen`},{id:`comfortable`,name:`Comfortable`,description:`Balanced for mouse use`},{id:`touch`,name:`Touch`,description:`Large targets for finger input`}],pk={theme:`canvas`,scheme:`light`,density:`auto`},mk=`canvas.ui.theme`;function hk(e){return typeof e==`string`&&uk.includes(e)}function gk(e){return e===`light`||e===`dark`||e===`system`}function _k(e){return e===`auto`||e===`compact`||e===`comfortable`||e===`touch`}function vk(e){let t=typeof e==`object`&&e?e:{};return{theme:hk(t.theme)?t.theme:pk.theme,scheme:gk(t.scheme)?t.scheme:pk.scheme,density:_k(t.density)?t.density:pk.density}}var yk=`(prefers-color-scheme: dark)`;function bk(){return typeof document<`u`}function xk(){return typeof window>`u`||typeof window.matchMedia!=`function`?!1:window.matchMedia(yk).matches}function Sk(e){return e===`system`?xk()?`dark`:`light`:e}function Ck(e){if(typeof window>`u`||typeof window.matchMedia!=`function`)return()=>{};let t=window.matchMedia(yk),n=t=>e(t.matches?`dark`:`light`);return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)}function wk(e){return Ck(e)}function Tk(){return xk()?`dark`:`light`}function Ek(){return`light`}function Dk(e){let t=getComputedStyle(e).getPropertyValue(`--background`).trim();if(!t)return;let n=document.querySelector(`meta[name="theme-color"]`);n||(n=document.createElement(`meta`),n.name=`theme-color`,document.head.appendChild(n)),n.content=t}function Ok(e,t=bk()?document.documentElement:void 0){let n=Sk(e.scheme);return t?(t.dataset.theme=e.theme,t.dataset.scheme=n,t.dataset.density=e.density,Dk(t),n):n}function kk(e,t=bk()?document.documentElement:void 0){if(!t||typeof window>`u`)return Ok(e,t);let n=document.createElement(`style`);n.appendChild(document.createTextNode(`*,*::before,*::after{transition:none!important;animation:none!important}`)),document.head.appendChild(n);let r=Ok(e,t);return window.getComputedStyle(n).opacity,document.head.removeChild(n),r}function Ak(e){let t=e??Nk();if(!t)return pk;try{let e=t.getItem(mk);return e?vk(JSON.parse(e)):pk}catch{return pk}}function jk(e,t){let n=t??Nk();if(n)try{n.setItem(mk,JSON.stringify(e))}catch{}}function Mk(e){let t=e??Nk();if(t)try{t.removeItem(mk)}catch{}}function Nk(){try{return typeof localStorage<`u`?localStorage:void 0}catch{return}}function Pk({children:e,initial:t,storage:n,persist:r=!0}){let[i,a]=(0,X.useState)(()=>({...Ak(n),...t})),o=(0,X.useSyncExternalStore)(wk,Tk,Ek),s=i.scheme===`system`?o:i.scheme;(0,X.useEffect)(()=>{kk({...i,scheme:s})},[i,s]),(0,X.useEffect)(()=>{r&&jk(i,n)},[i,r,n]);let c=(0,X.useCallback)(e=>{a(t=>t.theme===e?t:{...t,theme:e})},[]),l=(0,X.useCallback)(e=>{a(t=>t.scheme===e?t:{...t,scheme:e})},[]),u=(0,X.useCallback)(e=>{a(t=>t.density===e?t:{...t,density:e})},[]),d=(0,X.useCallback)(()=>{a(e=>({...e,scheme:(e.scheme===`system`?Tk():e.scheme)===`dark`?`light`:`dark`}))},[]),f=(0,X.useCallback)(()=>{Mk(n),a(pk)},[n]),p=(0,X.useMemo)(()=>({...i,resolvedScheme:s,setTheme:c,setScheme:l,setDensity:u,toggleScheme:d,reset:f}),[i,s,c,l,u,d,f]);return(0,Z.jsx)(Il.Provider,{value:p,children:e})}var Fk={system:mr,light:ji,dark:va};function Ik(){let{theme:e,scheme:t,density:n,resolvedScheme:r,setTheme:i,setScheme:a,setDensity:o,reset:s}=Ll(),c=re(),l=k(),u=PC(),d=L(),f=sk(),p=UC();return(0,Z.jsxs)(`div`,{className:`space-y-8`,children:[(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Theme`,description:`Palette, shape and typography. Each theme defines its own light and dark variants.`}),(0,Z.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:lk.map(t=>{let n=t.id===e;return(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>i(t.id),"aria-pressed":n,className:K(`focus-ring group flex flex-col gap-3 rounded-lg border p-4 text-left transition-colors`,n?`border-primary bg-accent`:`border-border hover:border-muted-foreground/40 hover:bg-accent/50`),children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:t.name}),n&&(0,Z.jsx)(sr,{className:`size-4 shrink-0 text-primary`})]}),(0,Z.jsx)(`div`,{className:`flex gap-1.5`,"aria-hidden":!0,children:t.swatches.map(e=>(0,Z.jsx)(`span`,{className:`size-6 rounded-full border border-border`,style:{backgroundColor:e}},e))}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.description})]},t.id)})})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Colour scheme`,description:t===`system`?`Following your system setting, currently ${r}.`:`Overrides your system setting.`}),(0,Z.jsx)(Vk,{options:dk.map(e=>{let t=Fk[e.id];return{id:e.id,label:e.name,icon:(0,Z.jsx)(t,{className:`size-4 shrink-0`})}}),value:t,onChange:a})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Density`,description:`Controls row height, hit-target size and shell spacing across the whole app.`}),(0,Z.jsx)(Vk,{options:fk.map(e=>({id:e.id,label:e.name,title:e.description})),value:n,onChange:o}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:fk.find(e=>e.id===n)?.description})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Layout`,description:`How menus and content share the screen. Device-local, like the wallpaper.`}),(0,Z.jsx)(Vk,{options:TC.map(e=>({id:e.id,label:e.name,title:e.description})),value:u,onChange:MC}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:TC.find(e=>e.id===u)?.description}),u===`strip`&&(0,Z.jsxs)(`div`,{className:`mt-4`,children:[(0,Z.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Navigation keys`}),(0,Z.jsx)(Vk,{options:FC.map(e=>({id:e.id,label:e.name,title:e.description})),value:p,onChange:VC}),(0,Z.jsxs)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:[FC.find(e=>e.id===p)?.description,` `,`Left and right walk the columns, up and down switch pin rows.`]})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Tree style`,description:`How workspace and context trees are drawn in the menu. Device-local.`}),(0,Z.jsx)(Vk,{options:$O.map(e=>({id:e.id,label:e.name,title:e.description})),value:f,onChange:ak}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:$O.find(e=>e.id===f)?.description})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Open documents`,description:`Choose how documents open from lists, tiles and boards. Saved on this device.`}),(0,Z.jsx)(Vk,{options:[{id:`modal`,label:`Modal`},{id:`side`,label:`Side reading pane`}],value:l,onChange:M}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`The reading pane opens beside the content and updates as you select another document. On small screens it opens as a drawer.`})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Always-on content area`,description:`Keep a reading pane beside document lists on tablets and desktops. Remember the selected item in each folder, or show the first available item.`}),(0,Z.jsx)(Vk,{options:[{id:`on`,label:`On`},{id:`off`,label:`Off`}],value:c?`on`:`off`,onChange:e=>ze(e===`on`)}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`On by default. The reader uses roughly half the screen; drag its divider to resize. Phones keep tap-to-open navigation. When enabled, list selections use this pane regardless of the Open documents setting.`})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Bk,{title:`Document tiles`,description:`Choose the photo and media layout for tile view. Saved on this device.`}),(0,Z.jsx)(Vk,{options:Ie,value:d,onChange:He})]}),(0,Z.jsx)(Lk,{}),(0,Z.jsx)(`section`,{children:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{s(),M(`modal`)},className:`focus-ring rounded-md text-sm text-muted-foreground underline-offset-4 hover:text-foreground hover:underline`,children:`Reset to defaults`})})]})}function Lk(){let[e,t]=(0,X.useState)(VO),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(!1),c=(0,X.useRef)(!1);(0,X.useEffect)(()=>{let e=!1;return WO().then(()=>{e||(t(VO()),a(!1))}),()=>{e=!0}},[]);let l=async(e,n)=>{if(!c.current){c.current=!0,s(!0);try{let i=n?{...e,image:await KO(n)}:e;await GO(i),t(i),r(null)}catch(e){r(e instanceof Error&&e.name!==`QuotaExceededError`?e.message:`Could not store the wallpaper. Free some browser storage or try a smaller image.`)}finally{c.current=!1,s(!1)}}},u=t=>{t&&l(e,t)},d=e.image!==null&&IO(e.image)===null,f=JO(e.image);return(0,Z.jsx)(`section`,{children:(0,Z.jsxs)(`fieldset`,{disabled:i||o,className:`min-w-0`,children:[(0,Z.jsx)(Bk,{title:`Wallpaper`,description:`Background image for the desk behind all panels. Without one, the theme's desk color shows (the default).`}),(0,Z.jsxs)(`div`,{role:`radiogroup`,"aria-label":`Wallpaper`,className:`grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-6`,children:[(0,Z.jsx)(zk,{label:`None`,isActive:e.image===null,onSelect:()=>l({...e,image:null}),children:(0,Z.jsx)(`span`,{className:`flex size-full items-center justify-center surface-desk text-xs text-muted-foreground`,style:{backgroundImage:`none`},children:`None`})}),NO.map(t=>(0,Z.jsx)(zk,{label:t.title,title:`${t.title} — suits the ${t.scheme} scheme`,isActive:IO(e.image)===t.id,onSelect:()=>l({...e,image:FO(t.id)}),children:(0,Z.jsx)(`img`,{src:PO(t),alt:``,loading:`lazy`,className:`size-full object-cover`,style:{backgroundColor:t.background}})},t.id)),d&&(0,Z.jsx)(zk,{label:`Your image`,isActive:!0,onSelect:()=>{},children:(0,Z.jsx)(`img`,{src:e.image??void 0,alt:``,className:`size-full object-cover`})})]}),(0,Z.jsx)(Rk,{}),(0,Z.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center gap-3`,children:[(0,Z.jsx)(`div`,{className:`h-20 w-32 shrink-0 rounded-md border surface-desk`,style:f?{backgroundImage:f,backgroundSize:YO(e.fit),backgroundPosition:`center`,backgroundRepeat:`no-repeat`}:void 0,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(`label`,{className:`focus-ring inline-flex cursor-pointer items-center rounded-md border px-3 py-1.5 text-sm hover:bg-accent/50`,children:[d?`Change image…`:`Use your own image…`,(0,Z.jsx)(`input`,{type:`file`,accept:`image/*,.gif`,className:`hidden`,onChange:e=>{u(e.target.files?.[0]),e.target.value=``}})]}),e.image&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>l({...e,image:null}),className:`focus-ring rounded-md border px-3 py-1.5 text-sm text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:`Remove`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Images and animated GIFs up to 10 MB. Stored on this device.`}),(0,Z.jsx)(Vk,{options:OO.map(e=>({id:e.id,label:e.label,title:e.description})),value:e.fit,onChange:t=>l({...e,fit:t})}),n&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:n}),o&&(0,Z.jsx)(`p`,{role:`status`,className:`text-xs text-muted-foreground`,children:`Saving wallpaper…`})]})]})]})})}function Rk(){let e=NO.filter(e=>e.author!==`Canvas`);return e.length===0?null:(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:e.map((e,t)=>(0,Z.jsxs)(`span`,{children:[t>0&&` · `,e.title,` © `,e.author,e.source&&(0,Z.jsxs)(Z.Fragment,{children:[` `,(0,Z.jsx)(`a`,{href:e.source,target:`_blank`,rel:`noreferrer noopener`,className:`focus-ring underline underline-offset-2 hover:text-foreground`,children:new URL(e.source).hostname})]})]},e.id))})}function zk({label:e,title:t,isActive:n,onSelect:r,children:i}){return(0,Z.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"aria-label":e,title:t??e,onClick:r,className:K(`focus-ring group relative aspect-video overflow-hidden rounded-md border transition-colors`,n?`border-primary ring-1 ring-primary`:`border-border hover:border-muted-foreground/40`),children:[i,n&&(0,Z.jsx)(`span`,{className:`absolute right-1 top-1 rounded-full bg-primary p-0.5 text-primary-foreground`,children:(0,Z.jsx)(sr,{className:`size-3`})})]})}function Bk({title:e,description:t}){return(0,Z.jsxs)(`div`,{className:`mb-3`,children:[(0,Z.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function Vk({options:e,value:t,onChange:n}){return(0,Z.jsx)(`div`,{role:`radiogroup`,className:`inline-flex flex-wrap gap-1 rounded-lg bg-muted p-1`,children:e.map(e=>{let r=e.id===t;return(0,Z.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":r,title:e.title,onClick:()=>n(e.id),className:K(`focus-ring flex h-control items-center gap-2 rounded-md px-3 text-sm transition-colors`,r?`bg-card text-foreground shadow-elevation-1`:`text-muted-foreground hover:text-foreground`),children:[e.icon,e.label]},e.id)})})}function Hk(){return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`Appearance`,onBack:yD(),description:`Theme, colour scheme and density. Changes apply immediately and are remembered on this device.`}),(0,Z.jsx)(Ik,{})]})}var Uk={previousTree:`Alt+Q`,nextTree:`Alt+W`},Wk=`canvas:key-bindings`,Gk=/^(Alt|Alt\+Shift|Ctrl\+Shift|Meta\+Shift)\+[A-Z]$/;function Kk(){try{let e=JSON.parse(localStorage.getItem(Wk)||`{}`),t={...Uk};for(let n of Object.keys(t))(e[n]===``||Gk.test(e[n]))&&(t[n]=e[n]);return t.previousTree&&t.previousTree===t.nextTree?{...Uk}:t}catch{return{...Uk}}}function qk(e){localStorage.setItem(Wk,JSON.stringify(e))}function Jk(e){return/^Key[A-Z]$/.test(e.code)?[e.ctrlKey&&`Ctrl`,e.altKey&&`Alt`,e.metaKey&&`Meta`,e.shiftKey&&`Shift`,e.code.slice(3)].filter(Boolean).join(`+`):``}function Yk(e,t,n){return e[(Math.max(0,e.indexOf(t))+n+e.length)%e.length]}function Xk(e,t){return Math.abs(e)>=48&&Math.abs(e)>Math.abs(t)*1.5?e<0?1:-1:0}function Zk(){let[e,t]=(0,X.useState)(Kk),[n,r]=(0,X.useState)(``),i=e=>{if(e.previousTree&&e.previousTree===e.nextTree){r(`Choose a different shortcut: that combination is already assigned.`);return}try{qk(e),t(e),r(`Saved on this device.`)}catch{r(`Could not save shortcuts in this browser.`)}};return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`Key bindings`,onBack:yD(),description:`Web UI shortcuts, saved on this device and available offline.`}),(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`font-medium`,children:`Tree navigation`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Cycle the open workspace menu’s tabs in their displayed order, including Pins and Layers. Swipe left for next or right for previous over the tab bar. Shortcuts pause while typing or using a dialog.`}),[`previousTree`,`nextTree`].map(t=>(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Z.jsx)(`label`,{htmlFor:t,className:`min-w-32 text-sm`,children:t===`previousTree`?`Previous tree`:`Next tree`}),(0,Z.jsxs)(`select`,{id:t,className:`rounded-md border bg-background p-2 text-sm`,value:e[t].split(`+`).slice(0,-1).join(`+`),onChange:n=>i({...e,[t]:n.target.value?`${n.target.value}+${e[t].slice(-1)||Uk[t].slice(-1)}`:``}),children:[(0,Z.jsx)(`option`,{value:``,children:`Disabled`}),[`Alt`,`Alt+Shift`,`Ctrl+Shift`,`Meta+Shift`].map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))]}),(0,Z.jsx)(`select`,{"aria-label":`${t===`previousTree`?`Previous`:`Next`} tree key`,disabled:!e[t],className:`rounded-md border bg-background p-2 text-sm disabled:opacity-50`,value:e[t].slice(-1)||Uk[t].slice(-1),onChange:n=>i({...e,[t]:`${e[t].split(`+`).slice(0,-1).join(`+`)}+${n.target.value}`}),children:`ABCDEFGHIJKLMNOPQRSTUVWXYZ`.split(``).map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))})]},t)),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Browsers and operating systems may reserve combinations. Choose another if a shortcut does not reach Canvas. Letters refer to physical keyboard positions (Q/W on a US keyboard); Meta is Command on Mac.`}),(0,Z.jsx)(`button`,{type:`button`,className:`rounded-md border px-3 py-2 text-sm hover:bg-accent`,onClick:()=>i({...Uk}),children:`Restore defaults`}),(0,Z.jsx)(`p`,{role:`status`,className:`text-sm`,children:n})]})]})}var Qk=`offline-content-v1`,$k=`offline-api-v1`,eA=1073741824,tA={enabled:!1,budgetBytes:4*eA,excludedWorkspaces:[]},nA=1e3;function rA(e){return(e.startsWith(`/`)?e:`/${e}`).replace(/\/+$/,``)||`/`}function iA(e,t,n){return`${e}:${t}:${rA(n)}`}var aA=`canvas-offline`,oA=2,sA=null;function cA(){return sA||(sA=new Promise((e,t)=>{let n=indexedDB.open(aA,oA);n.onupgradeneeded=e=>{let t=n.result;if(t.objectStoreNames.contains(`config`)||t.createObjectStore(`config`),t.objectStoreNames.contains(`entries`)||t.createObjectStore(`entries`,{keyPath:`url`}),e.oldVersion>=1&&t.objectStoreNames.contains(`pins`)){t.deleteObjectStore(`pins`);let e=n.transaction.objectStore(`entries`).openCursor();e.onsuccess=()=>{let t=e.result;if(!t)return;let n=t.value;n.pinned&&t.update({...n,pinned:!1}),t.continue()}}t.objectStoreNames.contains(`scopes`)||t.createObjectStore(`scopes`,{keyPath:`id`})},n.onsuccess=()=>{n.result.onversionchange=()=>{n.result.close(),sA=null},e(n.result)},n.onerror=()=>{sA=null,t(n.error)}}),sA)}function lA(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}function uA(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function dA(e,t){return uA((await cA()).transaction(e).objectStore(e).get(t))}async function fA(e){return uA((await cA()).transaction(e).objectStore(e).getAll())}async function pA(e,t,n){let r=(await cA()).transaction(e,`readwrite`);return r.objectStore(e).put(t,n),lA(r)}async function mA(e,t){let n=(await cA()).transaction(e,`readwrite`);return n.objectStore(e).delete(t),lA(n)}async function hA(e){let t=(await cA()).transaction(e,`readwrite`);return t.objectStore(e).clear(),lA(t)}async function gA(){try{let e=await dA(`config`,`settings`);return e?{...tA,...e}:tA}catch{return tA}}async function _A(e){await pA(`config`,e,`settings`)}async function vA(e,t){let n=(await cA()).transaction(`entries`,`readwrite`),r=n.objectStore(`entries`);for(let n of e){let e=r.get(n);e.onsuccess=()=>{let i=e.result;i?r.put({...i,pinned:t}):t&&r.put({url:n,kind:`content`,size:0,lastAccess:Date.now(),pinned:t})}}return lA(n)}async function yA(e){let t=await fA(`entries`),n=t.filter(e=>e.kind===`api`).sort((e,t)=>e.lastAccess-t.lastAccess),r=n.slice(0,Math.max(0,n.length-nA)),i=t.filter(e=>e.kind===`content`),a=i.reduce((e,t)=>e+t.size,0),o=i.filter(e=>!e.pinned).sort((e,t)=>e.lastAccess-t.lastAccess),s=[];for(let t of o){if(a<=e)break;s.push(t),a-=t.size}if(!r.length&&!s.length)return;let[c,l]=await Promise.all([caches.open($k),caches.open(Qk)]);await Promise.all([...r.map(async e=>{await c.delete(e.url),await mA(`entries`,e.url)}),...s.map(async e=>{await l.delete(e.url),await mA(`entries`,e.url)})])}async function bA(){let e=await fA(`entries`),t=e.filter(e=>e.kind===`content`);return{contentBytes:t.reduce((e,t)=>e+t.size,0),contentCount:t.length,pinnedBytes:t.filter(e=>e.pinned).reduce((e,t)=>e+t.size,0),apiCount:e.length-t.length}}async function xA(){await Promise.all([caches.delete(Qk),caches.delete($k)]),await hA(`entries`),await hA(`scopes`)}async function SA(){return fA(`scopes`)}async function CA(e){return dA(`scopes`,e)}async function wA(e){await pA(`scopes`,e)}async function TA(e){let t=await dA(`scopes`,e);await mA(`scopes`,e),t?.urls.length&&await EA(t.urls)}async function EA(e){let t=await fA(`scopes`),n=new Set(t.flatMap(e=>e.urls)),r=e.filter(e=>!n.has(e));r.length&&await vA(r,!1)}var DA=3,OA=`data/schema/file`,kA=128;async function AA({workspaceRef:e,path:t,treeName:n,treeType:r},i){let a=await gA();if(!a.enabled)throw Error(`Enable the offline cache first`);if(a.excludedWorkspaces.includes(e))throw Error(`Workspace "${e}" is excluded from offline caching`);let o=iA(e,n,t),s=rA(t),c=await CA(o),l=((await Fs(e,s,[],{limit:1e4,treeName:n,treeType:r})).payload??[]).filter(e=>e.schema===OA),u=[],d=0,f=0,p=!1,m=l.length;i?.({done:f,total:m,bytes:d});let h=0;await Promise.all(Array.from({length:Math.min(DA,l.length)},async()=>{for(;h<l.length;){let t=l[h++];if(d>=a.budgetBytes*.9){p=!0;return}try{let{blob:n}=await No(e,t.id);d+=n.size,u.push(`${no.workspaces}/${e}/documents/${t.id}/content`);try{await Cs(e,t.id,kA),u.push(`${no.workspaces}/${e}/documents/${t.id}/thumbnail?size=${kA}`)}catch{}}catch{}f+=1,i?.({done:f,total:m,bytes:d})}})),await vA(u,!0);let g={id:o,workspaceRef:e,treeName:n,treeType:r,path:s,urls:u,bytes:d,warmedAt:Date.now(),...p?{truncated:!0}:{}};if(await wA(g),c){let e=new Set(u),t=c.urls.filter(t=>!e.has(t));t.length&&await EA(t)}return g}var jA=[{label:`1 GB`,bytes:1*eA},{label:`2 GB`,bytes:2*eA},{label:`4 GB`,bytes:4*eA},{label:`8 GB`,bytes:8*eA}];function MA(e){return e<1048576?`${(e/1024).toFixed(0)} KB`:e<1073741824?`${(e/1048576).toFixed(1)} MB`:`${(e/eA).toFixed(2)} GB`}function NA(){navigator.serviceWorker?.controller?.postMessage({type:`OFFLINE_SETTINGS_CHANGED`})}function PA(){let{showSuccessToast:e,showErrorToast:t}=Oo(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)([]),[u,d]=(0,X.useState)([]),[f,p]=(0,X.useState)({}),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(!1),v=(0,X.useCallback)(()=>{gA().then(r).catch(()=>{}),bA().then(a).catch(()=>{}),SA().then(e=>d(e.sort((e,t)=>e.id.localeCompare(t.id)))).catch(()=>{}),navigator.storage?.persisted?.().then(s).catch(()=>{})},[]);(0,X.useEffect)(()=>{v(),Uo().then(e=>l(e.map(e=>e.name).filter(Boolean).sort())).catch(()=>{})},[v]);let b=async e=>{r(e),await _A(e),NA(),e.enabled&&navigator.storage?.persist?.().then(s).catch(()=>{}),yA(e.budgetBytes).then(v).catch(()=>{})},x=e=>{if(!n)return;let t=n.excludedWorkspaces.includes(e)?n.excludedWorkspaces.filter(t=>t!==e):[...n.excludedWorkspaces,e];b({...n,excludedWorkspaces:t})},S=async()=>{h(!0);try{await xA(),e(`Offline cache cleared`),v()}catch(e){t(e instanceof Error?e.message:`Failed to clear cache`)}finally{h(!1)}},C=async n=>{let r=iA(n.workspaceRef,n.treeName,n.path);p(e=>({...e,[r]:{done:0,total:0,bytes:0}}));try{let t=await AA(n,e=>p(t=>({...t,[r]:e})));e(t.truncated?`Pinned ${MA(t.bytes)} — stopped at the size budget`:`Pinned ${t.workspaceRef}:/${t.path} (${MA(t.bytes)})`)}catch(e){t(e instanceof Error?e.message:`Failed to pin`)}finally{p(e=>{let{[r]:t,...n}=e;return n}),v()}},w=(e,t)=>{_(!1);for(let n of e)C({workspaceRef:t.workspaceName,path:n,treeName:t.treeName,treeType:t.treeType})},T=e=>({workspaceRef:e.workspaceRef,path:e.path,treeName:e.treeName||`context`,treeType:e.treeType||`context`}),E=async e=>{await TA(e),v()};return n?(0,Z.jsxs)(`div`,{className:`space-y-8`,children:[(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(FA,{title:`Offline cache`,description:`Keep documents you open (and scopes you pin) readable without a connection. Cached on this device only; least-recently-used files are evicted when the size budget fills. Video streaming is not cached.`}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>b({...n,enabled:!n.enabled}),"aria-pressed":n.enabled,className:K(`focus-ring flex items-center gap-3 rounded-lg border p-4 text-left transition-colors`,n.enabled?`border-primary bg-accent`:`border-input hover:bg-muted/40`),children:[(0,Z.jsx)(Ya,{className:`h-5 w-5 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`flex-1`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium`,children:n.enabled?`Enabled`:`Disabled`}),(0,Z.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:n.enabled?o===!1?`Storage is not persistent — the browser may still evict the cache under disk pressure`:`Documents are cached as you browse`:`Nothing is cached for offline use`})]}),n.enabled&&(0,Z.jsx)(sr,{className:`h-4 w-4 shrink-0 text-primary`})]}),n.enabled&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Size budget`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:jA.map(e=>(0,Z.jsx)(Y,{variant:n.budgetBytes===e.bytes?`default`:`outline`,size:`sm`,onClick:()=>b({...n,budgetBytes:e.bytes}),children:e.label},e.bytes))})]}),i&&(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(`div`,{className:`flex items-baseline justify-between text-sm`,children:[(0,Z.jsxs)(`span`,{children:[MA(i.contentBytes),` of `,MA(n.budgetBytes),` used`]}),(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[i.contentCount,` file(s)`,i.pinnedBytes>0?`, ${MA(i.pinnedBytes)} pinned`:``]})]}),(0,Z.jsx)(`div`,{className:`h-2 w-full overflow-hidden rounded-full bg-muted`,children:(0,Z.jsx)(`div`,{className:`h-full rounded-full bg-primary`,style:{width:`${Math.min(100,i.contentBytes/n.budgetBytes*100)}%`}})})]}),(0,Z.jsx)(`div`,{children:(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,onClick:S,disabled:m,children:[m?(0,Z.jsx)(Ti,{className:`mr-1.5 h-3.5 w-3.5 animate-spin`}):(0,Z.jsx)(Qr,{className:`mr-1.5 h-3.5 w-3.5`}),`Clear offline cache`]})})]})]})]}),n.enabled&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(FA,{title:`Pinned scopes`,description:`A pinned scope — a workspace, or one of its tree paths — is downloaded up front and never evicted. Scopes resolve fresh on every re-warm, so moved contexts and reorganized trees are picked up; documents that left a scope return to normal eviction.`}),(0,Z.jsx)(`div`,{className:`mb-3`,children:(0,Z.jsxs)(Y,{size:`sm`,onClick:()=>_(!0),disabled:!!Object.keys(f).length,children:[(0,Z.jsx)(tr,{className:`mr-1.5 h-3.5 w-3.5`}),`Pin a path…`]})}),(0,Z.jsxs)(`ul`,{className:`space-y-1`,children:[u.map(e=>{let t=f[e.id];return(0,Z.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,Z.jsxs)(`span`,{className:`flex-1 truncate font-mono text-xs sm:text-sm`,children:[e.workspaceRef,`://`,e.path.replace(/^\//,``),e.treeName&&e.treeName!==`context`&&(0,Z.jsx)(`span`,{className:`ml-1.5 rounded bg-muted px-1 py-0.5 font-sans text-[10px] text-muted-foreground`,children:e.treeName})]}),t?(0,Z.jsxs)(`span`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Z.jsx)(Ti,{className:`h-3.5 w-3.5 animate-spin`}),t.total>0?`${t.done}/${t.total} · ${MA(t.bytes)}`:`listing…`]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[MA(e.bytes),e.truncated?` (partial)`:``]}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:()=>C(T(e)),"aria-label":`Re-warm ${e.id}`,title:`Re-warm: re-resolve the scope and download anything new`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:()=>E(e.id),"aria-label":`Unpin ${e.id}`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})]},e.id)}),u.length===0&&(0,Z.jsx)(`li`,{className:`rounded-md border border-dashed border-input px-3 py-4 text-center text-sm text-muted-foreground`,children:`Nothing pinned — everything relies on browse-caching and LRU`})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(FA,{title:`Workspace caching`,description:`Excluded workspaces are never cached — not even as you browse — and are not served from cache.`}),(0,Z.jsx)(`ul`,{className:`space-y-1`,children:c.map(e=>{let t=n.excludedWorkspaces.includes(e);return(0,Z.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,Z.jsx)(`span`,{className:K(`flex-1 truncate`,t&&`text-muted-foreground line-through`),children:e}),t&&(0,Z.jsx)(ya,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,Z.jsx)(Y,{variant:t?`outline`:`ghost`,size:`sm`,onClick:()=>x(e),children:t?`Include`:`Exclude`})]},e)})})]})]}),g&&(0,Z.jsx)(Le,{onClose:()=>_(!1),children:(0,Z.jsx)(y,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,multiple:!1,tabs:[`context`,`directory`],title:`Pin for offline…`,confirmLabel:`Pin path`,onConfirm:w,onClose:()=>_(!1)})})]}):null}function FA({title:e,description:t}){return(0,Z.jsxs)(`div`,{className:`mb-4`,children:[(0,Z.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function IA(){return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`Offline`,onBack:yD(),description:`Per-device offline cache: browse notes, files, photos and saved websites without a connection.`}),(0,Z.jsx)(PA,{})]})}function LA(e){let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:n>0?`${n}h ${r}m`:`${r}m`}function RA({name:e,version:t,detail:n}){return(0,Z.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 px-4 py-2.5`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium truncate`,children:e}),n&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate`,children:n})]}),(0,Z.jsx)(`code`,{className:`text-xs text-muted-foreground shrink-0`,children:t})]})}function zA(){let[e,t]=(0,X.useState)(null),[n,r]=(0,X.useState)(null);(0,X.useEffect)(()=>{let e=!0;return J.get(`/ping`,{skipAuth:!0}).then(n=>{e&&t(n??{})}).catch(t=>{e&&r(t instanceof Error?t.message:`Failed to reach the server`)}),()=>{e=!1}},[]);let i=[e?.commit?`commit ${e.commit.slice(0,7)}`:null,typeof e?.uptime==`number`?`up ${LA(e.uptime)}`:null].filter(Boolean).join(` · `),a=Object.entries(e?.components??{}).sort(([e],[t])=>e.localeCompare(t));return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`About`,onBack:yD(),description:`Versions of every Canvas component this installation is running.`}),(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`section`,{className:`rounded-md border border-border divide-y divide-border`,children:[(0,Z.jsx)(RA,{name:`Canvas Web`,detail:`this interface`,version:`v2.26.15`}),e?.version&&(0,Z.jsx)(RA,{name:e.productName||e.appName||`Canvas Server`,detail:i||void 0,version:`v${e.version}`})]}),a.length>0&&(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(`h2`,{className:`mb-2 px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Server components`}),(0,Z.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:a.map(([e,t])=>(0,Z.jsx)(RA,{name:e,version:`v${t}`},e))})]}),n&&(0,Z.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Server details unavailable: `,n]}),e?.sourceUrl&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[e.license?`Licensed ${e.license}. `:``,(0,Z.jsx)(`a`,{href:e.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Get the source code`}),`.`]})]})]})}var BA=[`onnx`,`clip`,`blip`,`openai`],VA=[`onnx`,`clip`,`blip`,`ollama`,`vllm`],HA=[{id:`openai`,baseUrl:`https://api.openai.com/v1`,label:`OpenAI`},{id:`vllm`,baseUrl:`http://127.0.0.1:8000/v1`,label:`vLLM`},{id:`ollama`,baseUrl:`http://127.0.0.1:11434/v1`,label:`Ollama`}],UA=e=>`${no.workspaces}/${encodeURIComponent(e)}/inferd`;function WA(e,t){let n={};for(let[r,i]of Object.entries(e.providers||{})){let e={...i};delete e.apiKeySet,delete e.headerNames,t.has(r)&&i.apiKey?e.apiKey=i.apiKey:delete e.apiKey,n[r]=e}return{...e,providers:n}}async function GA(e){return await J.get(`${UA(e)}/status`)}async function KA(e,t={}){let n={};return t.force!==void 0&&(n.force=t.force),await J.post(`${UA(e)}/summarize/images`,n)}async function qA(e){return await J.post(`${UA(e)}/summarize/images/stop`,{})}async function JA(e){return await J.get(`${UA(e)}/config`)}async function YA(e,t){return await J.put(`${UA(e)}/config`,t)}async function XA(e,t={}){let n={};return t.space&&(n.space=t.space),t.reindex!==void 0&&(n.reindex=t.reindex),t.scope&&(n.scope=t.scope),await J.post(`${UA(e)}/reindex`,n)}async function ZA(e){return await J.get(`${UA(e)}/vector-tables`)}async function QA(e,t){return await J.delete(`${UA(e)}/vector-tables/${encodeURIComponent(t)}`)}async function $A(){return await J.get(`${no.inferd}/config`)}async function ej(e){return await J.put(`${no.inferd}/config`,e)}async function tj(){return await J.get(`${no.inferd}/defaults`)}async function nj(e){return await J.put(`${no.inferd}/defaults`,e)}async function rj(e,t){let n={...e};return delete n.apiKeySet,delete n.headerNames,(await J.post(`${no.inferd}/test`,{provider:n,...t?{model:t}:{},probe:!0})).cached??null}async function ij(e,t,n=`text`){let r={...e};return delete r.apiKeySet,delete r.headerNames,await J.post(`${no.inferd}/test`,{provider:r,...t?{model:t}:{},modality:n})}var aj=`h-8 w-full rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`,oj=`font-semibold uppercase tracking-[0.08em]`,sj={openai:{url:{key:`baseUrl`,label:`Base URL`,placeholder:`http://gpu.local:8000/v1`,hint:`OpenAI-compatible embeddings endpoint — Ollama, vLLM, TEI, infinity, LM Studio and OpenAI itself all speak this. A trailing /v1 is optional; both http://host:8000 and http://host:8000/v1 work.`},apiKey:"Sent as `Authorization: Bearer …`. Leave empty for servers that do not check it.",imageInput:!0,timeoutMs:!0,headers:!0,where:e=>e.baseUrl||`no endpoint set`},ollama:{url:{key:`host`,label:`Host (legacy)`,placeholder:`http://127.0.0.1:11434`,hint:`Written by an older version. Switch the type to openai — the host becomes the base URL and the /v1 suffix is added for you.`},apiKey:"Sent as `Authorization: Bearer …`.",where:e=>e.host||`http://127.0.0.1:11434`},onnx:{cacheDir:`Where downloaded weights are cached on the server. Empty uses the server default.`,note:`Runs in-process on the server. No endpoint and no credentials.`,where:()=>`in-process`},clip:{cacheDir:`Where downloaded weights are cached on the server. Empty uses the server default.`,note:`Runs in-process on the server. No endpoint and no credentials.`,where:()=>`in-process`}},cj=[`baseUrl`,`host`,`apiKey`,`cacheDir`,`imageInput`,`timeoutMs`],lj=[{value:`data-uri`,label:`data-uri (default)`,hint:"Images ride in the ordinary `input` array as data URIs (infinity, TEI-style servers)."},{value:`messages`,label:`messages`,hint:`vLLM's multimodal shape: one request per image, wrapped in a chat message.`}],uj=12e4;function dj(e){if(typeof e!=`string`||e.trim()===``)return null;let t;try{t=new URL(e.trim())}catch{return`Must be an absolute URL including the scheme, e.g. http://127.0.0.1:11434`}return t.protocol!==`http:`&&t.protocol!==`https:`?`Unsupported scheme '${t.protocol.replace(`:`,``)}'. Use http or https.`:null}function fj({title:e,hint:t}){return(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(`h3`,{className:K(`text-[11px] text-muted-foreground`,oj),children:e}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:t})]})}function pj({overridden:e,source:t}){return e?(0,Z.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary`,title:`Set on this layer; it wins over anything inherited`,children:`overridden`}):(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground`,title:t?`Inherited: ${t}`:`Inherited from a lower config layer`,children:`inherited`})}function mj({label:e,value:t,inheritedValue:n,onChange:r,type:i=`text`,placeholder:a,disabled:o,hint:s,error:c,mono:l}){let u=t!==void 0&&t!==``;return(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:e}),(0,Z.jsx)(pj,{overridden:u,source:n===void 0?void 0:String(n)}),u&&!o&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(``),className:`text-[10px] text-muted-foreground underline hover:text-foreground`,title:`Clear the override and fall back to the inherited value`,children:`reset`})]}),(0,Z.jsx)(q,{type:i,value:t??``,disabled:o,onChange:e=>r(e.target.value),placeholder:a??(n===void 0?`—`:String(n)),className:K(`h-8 text-sm`,l&&`font-mono`,c&&`border-destructive focus-visible:ring-destructive`)}),c&&(0,Z.jsx)(`p`,{className:`text-[11px] font-medium text-destructive`,children:c}),s&&(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:s})]})}function hj({label:e,checked:t,overridden:n,disabled:r,onChange:i}){return(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,disabled:r,checked:t,onChange:e=>i(e.target.checked)}),e,(0,Z.jsx)(pj,{overridden:n})]})}function gj({storedNames:e,value:t,disabled:n,onChange:r}){let i=t!==void 0,[a,o]=(0,X.useState)([]),s=e=>{o(e),r(Object.fromEntries(e.filter(([e])=>e.trim()!==``)))};return(0,Z.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Custom headers`}),i?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will replace stored`}),!n&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{o([]),r(void 0)},className:`text-[10px] text-muted-foreground underline hover:text-foreground`,children:`cancel`})]}):(0,Z.jsx)(pj,{overridden:!1,source:e?.join(`, `)})]}),!i&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:e?.length?(0,Z.jsxs)(Z.Fragment,{children:[`Stored: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:e.join(`, `)}),` (values are never sent back)`]}):`None set.`}),!n&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>{o([[``,``]]),r({})},children:e?.length?`Replace headers`:`Add headers`})]}),i&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Saving replaces every stored header, so re-enter the ones you want to keep.`}),a.map(([e,t],r)=>(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:e,disabled:n,placeholder:`X-Tenant`,className:`h-8 font-mono text-sm`,onChange:e=>s(a.map((t,n)=>n===r?[e.target.value,t[1]]:t))}),(0,Z.jsx)(q,{value:t,disabled:n,placeholder:`value`,className:`h-8 font-mono text-sm`,onChange:e=>s(a.map((t,n)=>n===r?[t[0],e.target.value]:t))}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Remove header ${e||r+1}`,onClick:()=>s(a.filter((e,t)=>t!==r)),children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]},r)),!n&&(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>s([...a,[``,``]]),children:[(0,Z.jsx)(br,{className:`mr-1.5 h-3.5 w-3.5`}),`Add header`]})]})]})}function _j({open:e,onClick:t,label:n}){return(0,Z.jsx)(`button`,{type:`button`,onClick:t,"aria-expanded":e,title:n,"aria-label":n,className:`flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground`,children:(0,Z.jsx)(qr,{className:K(`h-4 w-4 transition-transform motion-reduce:transition-none`,e&&`rotate-180`)})})}var vj={configured:`bg-success`,"needs-fill":`bg-warning`,unresolved:`bg-destructive`,unset:`bg-muted-foreground/30`};function yj({value:e,effective:t,inherited:n,resolvedSpaces:r,invalid:i,attention:a,onFill:o,saving:s=!1,disabled:c=!1,saveLabel:l=`Save`,onSave:u}){let{showToast:d}=wo(),[f,p]=(0,X.useState)(()=>structuredClone(e)),[m,h]=(0,X.useState)(new Set),[g,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(``),[S,C]=(0,X.useState)(``),[w,T]=(0,X.useState)(null),E=(0,X.useMemo)(()=>[...new Set([...Object.keys(t.spaces||{}),...Object.keys(f.spaces||{})])].sort(),[t.spaces,f.spaces]),D=(0,X.useMemo)(()=>[...new Set([...Object.keys(t.providers||{}),...Object.keys(f.providers||{})])].sort(),[t.providers,f.providers]),O=(e,t,n)=>{p(r=>{let i={...r.spaces||{}},a={...i[e]||{}};if(n===``)delete a[t];else if(t===`dim`||t===`maxLength`||t===`dimensions`){let e=Number(n);if(Number.isNaN(e))return r;a[t]=e}else a[t]=n;return Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,spaces:i}})},k=(e,t,n)=>{p(r=>{let i={...r.spaces||{}},a={...i[e]||{}};return n===void 0?delete a[t]:a[t]=n,Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,spaces:i}})},A=(e,t,n)=>{t===`apiKey`&&h(t=>{let r=new Set(t);return n===``?r.delete(e):r.add(e),r}),p(r=>{let i={...r.providers||{}},a={...i[e]||{}};if(n===``)delete a[t];else if(t===`timeoutMs`){let e=Number(n);if(Number.isNaN(e))return r;a[t]=e}else a[t]=n;return Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,providers:i}})},j=(e,t,n)=>{p(r=>{let i={...r.providers||{}},a={...i[e]||{}};return n===void 0?delete a[t]:a[t]=n,Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,providers:i}})},M=e=>{p(t=>{let n={...t.providers||{}};return delete n[e],{...t,providers:n}}),h(t=>{let n=new Set(t);return n.delete(e),n})},N=()=>{let e=S.trim();if(e){if(E.includes(e)){d({title:`Space exists`,description:`'${e}' already has a row below.`,variant:`destructive`});return}p(t=>({...t,spaces:{...t.spaces||{},[e]:{}}})),C(``),T(`space:${e}`)}},P=(e,t)=>{if(e){if(D.includes(e)){d({title:`Backend exists`,description:`'${e}' is already declared. Open it below to edit.`,variant:`destructive`});return}p(n=>({...n,providers:{...n.providers||{},[e]:{type:`openai`,...t?{baseUrl:t}:{}}}})),x(``),T(`provider:${e}`)}},ee=e=>({...t.providers?.[e]||{},...f.providers?.[e]||{}}),F=async e=>{let n=f.spaces?.[e]?.provider??t.spaces?.[e]?.provider,r=f.spaces?.[e]?.model??t.spaces?.[e]?.model;if(!n){d({title:`No backend`,description:`Space '${e}' has no backend to test.`,variant:`destructive`});return}let i=ee(n),a=i.type?sj[i.type]?.url?.key:void 0,o=a?dj(i[a]):null;if(o){d({title:`Backend '${n}'`,description:o,variant:`destructive`});return}_(e);try{try{await rj(i,r)===!1&&(y(!0),d({title:`Downloading model`,description:`'${r??`the configured model`}' is not in the server's cache yet; downloading now. A first test can take a few minutes; the model is then cached for good.`}))}catch{}let n=await ij(i,r,e),a=f.spaces?.[e]?.dim??t.spaces?.[e]?.dim,o=n.dim>0&&a!==void 0&&n.dim!==a;(o||n.dim>0&&a===void 0)&&O(e,`dim`,String(n.dim)),d({title:o?`Backend answered; dimensions corrected`:`Backend answered`,description:o?`Returned ${n.dim}-d but '${e}' was set to ${a}-d. Dimensions updated to ${n.dim}; save to apply. (${n.latencyMs} ms)`:`${n.dim}-d in ${n.latencyMs} ms`})}catch(e){d({title:`Test failed`,description:e instanceof Error?e.message:`Backend unreachable`,variant:`destructive`})}finally{_(null),y(!1)}},I=(0,X.useMemo)(()=>{let e=[];for(let[n,r]of Object.entries(f.providers||{})){let i=r.type??t.providers?.[n]?.type,a=i?sj[i]?.url?.key:void 0;if(!a)continue;let o=dj(r[a]);o&&e.push(`${n}: ${o}`)}return e},[f.providers,t.providers]),te=(0,X.useMemo)(()=>JSON.stringify(f)!==JSON.stringify(e)||m.size>0,[f,e,m]),L=async()=>{if(I.length>0){d({title:`Fix the endpoint first`,description:I.join(` · `),variant:`destructive`});return}await u(WA(f,m)),h(new Set)},R=e=>T(t=>t===e?null:e);return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[i&&(0,Z.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive-subtle p-3 text-xs`,children:[(0,Z.jsx)(dr,{className:`mt-0.5 h-4 w-4 shrink-0 text-destructive`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Stored config does not resolve; defaults are standing in`}),(0,Z.jsx)(`p`,{className:`mt-0.5 font-mono text-[11px] text-muted-foreground`,children:i})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(fj,{title:`Search models`,hint:`Choose a provider and model for each kind of content. After switching models, fill the new index to make existing documents searchable. Previous model indexes are preserved.`}),E.length===0?(0,Z.jsxs)(`div`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:`No spaces on this layer`}),(0,Z.jsx)(`p`,{className:`mx-auto mt-1 max-w-sm text-xs text-muted-foreground`,children:`A space needs a backend, a model and a dimension count. Add one below to start embedding.`})]}):(0,Z.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:E.map(e=>{let s=f.spaces?.[e]||{},l=t.spaces?.[e]||{},u=n.spaces?.[e]||{},d=r?.[e],p=`space:${e}`,m=w===p,h=s.model??l.model,_=s.provider??l.provider,y=s.dim??l.dim,b=s.chunk??l.chunk??!1,x=a?.includes(e)??!1;return(0,Z.jsxs)(`div`,{className:`relative`,children:[(0,Z.jsx)(`span`,{className:K(`absolute inset-y-0 left-0 w-[3px]`,vj[i?`unresolved`:x?`needs-fill`:h?`configured`:`unset`]),"aria-hidden":!0}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 py-3 pl-4 pr-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,Z.jsx)(`span`,{className:K(`text-[11px]`,oj),children:e}),(0,Z.jsx)(`span`,{className:`truncate font-mono text-sm`,children:h||`no model set`}),_&&(0,Z.jsxs)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground`,children:[`via `,_]}),y!==void 0&&(0,Z.jsxs)(`span`,{className:`text-xs tabular-nums text-muted-foreground`,children:[y,`-d`]}),b&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`chunked`})]}),r&&h&&(0,Z.jsxs)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,title:`Vector table backing this space`,children:[`└─ `,d?.table??(0,Z.jsx)(`span`,{className:`not-italic`,children:`not created yet`})]}),x&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-warning`,children:`New table, nothing embedded in it yet; dense search stays thin for this space until it is filled. Reverting the model is still instant.`})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[x&&o&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>o(e),children:`Fill`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:c||g!==null,onClick:()=>F(e),title:`Round-trip a real embedding call against this backend and report the dimensions it returns`,children:[(0,Z.jsx)(lr,{className:`mr-1.5 h-3.5 w-3.5`}),g===e?v?`Downloading…`:`Testing…`:`Test`]}),(0,Z.jsx)(_j,{open:m,onClick:()=>R(p),label:`Edit ${e}`})]})]}),m&&(0,Z.jsxs)(`div`,{className:`border-t bg-muted/40 py-4 pl-4 pr-3`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Backend`}),(0,Z.jsx)(pj,{overridden:s.provider!==void 0,source:u.provider})]}),(0,Z.jsxs)(`select`,{className:aj,disabled:c,value:s.provider??``,onChange:t=>O(e,`provider`,t.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:l.provider?`inherited: ${l.provider}`:`inherited`}),D.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))]})]}),(0,Z.jsx)(mj,{label:`Model`,mono:!0,value:s.model,inheritedValue:l.model,onChange:t=>O(e,`model`,t),disabled:c}),(0,Z.jsx)(mj,{label:`Dimensions`,type:`number`,value:s.dim,inheritedValue:l.dim,onChange:t=>O(e,`dim`,t),disabled:c,hint:`Sizes the vector table. Test asks the backend and fills in what it really returns.`}),(0,Z.jsx)(mj,{label:`Max length`,type:`number`,value:s.maxLength,inheritedValue:l.maxLength,onChange:t=>O(e,`maxLength`,t),disabled:c})]}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-4`,children:[(0,Z.jsx)(hj,{label:`Chunk long inputs`,checked:b,overridden:s.chunk!==void 0,disabled:c,onChange:t=>k(e,`chunk`,t)}),(0,Z.jsx)(hj,{label:`Build ANN index`,checked:s.annIndex??l.annIndex??!0,overridden:s.annIndex!==void 0,disabled:c,onChange:t=>k(e,`annIndex`,t)})]})]})]},e)})}),!c&&(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(q,{value:S,onChange:e=>C(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),N())},placeholder:`new space name (e.g. audio)`,className:`h-8 w-full max-w-xs text-sm sm:w-auto`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:N,children:[(0,Z.jsx)(br,{className:`mr-1.5 h-3.5 w-3.5`}),`Add space`]})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(fj,{title:`Model providers`,hint:`Connect a service here, then select it under Search models above. Built-in providers work without an extra connection. Provider changes take effect when you save.`}),(0,Z.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:D.map(e=>{let n=f.providers?.[e]||{},r=t.providers?.[e]||{},i=VA.includes(e),a=f.providers?.[e]!==void 0,o=`provider:${e}`,s=w===o,l=n.type??r.type,u=l?sj[l]:void 0,d=u?.url?dj(n[u.url.key]):null,p={...r,...n},h=cj.filter(e=>!(n[e]===void 0||e===u?.url?.key||e===`apiKey`&&u?.apiKey||e===`cacheDir`&&u?.cacheDir)),g=E.filter(n=>(f.spaces?.[n]?.provider??t.spaces?.[n]?.provider)===e);return(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 px-4 py-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,Z.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:e}),(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:l??`no type`}),i&&(0,Z.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`built-in`}),p.apiKeySet&&!m.has(e)&&(0,Z.jsx)(`span`,{className:`text-[10px] font-medium text-success`,children:`key set`}),d&&(0,Z.jsx)(`span`,{className:`text-[10px] font-medium text-destructive`,children:`check endpoint`})]}),(0,Z.jsx)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,children:u?u.where(p):`—`}),g.length>0&&(0,Z.jsxs)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`used by `,g.join(`, `)]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[a&&!i&&!c&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>M(e),title:`Remove this override`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(_j,{open:s,onClick:()=>R(o),label:`Edit ${e}`})]})]}),s&&(0,Z.jsxs)(`div`,{className:`border-t bg-muted/40 px-4 py-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Type`}),(0,Z.jsx)(pj,{overridden:n.type!==void 0,source:r.type})]}),(0,Z.jsxs)(`select`,{className:aj,disabled:c,value:n.type??``,onChange:t=>A(e,`type`,t.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:r.type?`inherited: ${r.type}`:`inherited`}),BA.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e)),l&&!BA.includes(l)&&(0,Z.jsxs)(`option`,{value:l,children:[l,` (legacy)`]})]}),u?.note&&(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:u.note})]}),u?.url&&(0,Z.jsx)(mj,{label:u.url.label,mono:!0,value:n[u.url.key],inheritedValue:r[u.url.key],onChange:t=>A(e,u.url.key,t),disabled:c,placeholder:r[u.url.key]??u.url.placeholder,hint:u.url.hint,error:d??void 0}),u?.cacheDir&&(0,Z.jsx)(mj,{label:`Cache directory`,mono:!0,value:n.cacheDir,inheritedValue:r.cacheDir,onChange:t=>A(e,`cacheDir`,t),disabled:c,placeholder:r.cacheDir??`server default`,hint:u.cacheDir}),u?.imageInput&&(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Image input shape`}),(0,Z.jsx)(pj,{overridden:n.imageInput!==void 0,source:r.imageInput})]}),(0,Z.jsxs)(`select`,{className:aj,disabled:c,value:n.imageInput??``,onChange:t=>A(e,`imageInput`,t.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:r.imageInput?`inherited: ${r.imageInput}`:`inherited: data-uri`}),lj.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))]}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:lj.find(e=>e.value===(n.imageInput??r.imageInput??`data-uri`))?.hint})]}),u?.timeoutMs&&(0,Z.jsx)(mj,{label:`Request timeout (ms)`,type:`number`,value:n.timeoutMs,inheritedValue:r.timeoutMs??uj,onChange:t=>A(e,`timeoutMs`,t),disabled:c,hint:`How long to wait for a batch before giving up. Raise it for a slow or cold GPU host.`}),u?.apiKey&&(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`API key`}),m.has(e)&&(0,Z.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will be written`})]}),(0,Z.jsx)(q,{type:`password`,autoComplete:`new-password`,disabled:c,value:n.apiKey??``,onChange:t=>A(e,`apiKey`,t.target.value),placeholder:r.apiKeySet?`•••••••• (stored; leave empty to keep)`:`unset`,className:`h-8 text-sm`}),(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[u.apiKey,` Write-only: the stored key is never sent back, and leaving this empty keeps whatever is stored.`]})]})]}),u?.headers&&(0,Z.jsx)(gj,{disabled:c,storedNames:r.headerNames,value:n.headers,onChange:t=>j(e,`headers`,t)}),h.length>0&&!c&&(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2 rounded-md border border-dashed p-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`Not used by type `,(0,Z.jsx)(`span`,{className:`font-mono`,children:l}),`:`,` `,(0,Z.jsx)(`span`,{className:`font-mono`,children:h.join(`, `)})]}),(0,Z.jsx)(`button`,{type:`button`,className:`underline hover:text-foreground`,onClick:()=>h.forEach(t=>A(e,t,``)),children:`clear`})]}),r.headerNames&&r.headerNames.length>0&&(0,Z.jsxs)(`p`,{className:`mt-3 text-[11px] text-muted-foreground`,children:[`Stored custom headers: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:r.headerNames.join(`, `)}),` (values not shown)`]})]})]},e)})}),!c&&(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(q,{value:b,onChange:e=>x(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),P(b.trim()))},placeholder:`new backend name (e.g. gpu)`,className:`h-8 w-full max-w-xs text-sm sm:w-auto`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>P(b.trim()),children:[(0,Z.jsx)(br,{className:`mr-1.5 h-3.5 w-3.5`}),`Add backend`]}),HA.filter(e=>!D.includes(e.id)).map(e=>(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>P(e.id,e.baseUrl),title:`Add an openai-type backend '${e.id}' pointed at ${e.baseUrl}`,children:e.label},e.id))]})]}),!c&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-4`,children:[(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:te?`default`:`outline`,onClick:L,disabled:s||!te||I.length>0,children:s?`Saving…`:l}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:s||!te,onClick:()=>{p(structuredClone(e)),h(new Set)},children:`Discard changes`}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:I.length>0?(0,Z.jsxs)(`span`,{className:`font-medium text-destructive`,children:[I.length,` endpoint `,I.length===1?`needs`:`need`,` fixing`]}):te?`Unsaved changes`:`Everything saved`})]})]})}function bj(){let{showToast:e}=wo(),[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!0),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(null),l=(0,X.useCallback)(()=>$A().then(e=>{n(e),c(null)}).catch(e=>c(e instanceof Error?e.message:`Failed to load embedding defaults`)).finally(()=>i(!1)),[]);(0,X.useEffect)(()=>{l()},[l]);let u=()=>{i(!0),l()};return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6`,title:`Search & AI defaults`,onBack:yD(),description:`Your account · Choose the embedding models used for text and image search. Workspace settings override these defaults. Running workspaces adopt new defaults when restarted.`,actions:(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:u,disabled:r,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})}),r?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):s||!t?(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Embedding defaults unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:s||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:u,children:`Retry`})]}):(0,Z.jsx)(yj,{value:t.user||{},effective:t.effective||{},inherited:t.serverDefaults||{},invalid:t.invalid,saving:a,saveLabel:`Save defaults`,onSave:async t=>{o(!0);try{let n=await ej(t);e({title:`Defaults saved`,description:n.restartRequired?`${n.workspaces.length} running workspace(s) keep their current tables until restarted. Set the config on a workspace directly to change it live.`:`New workspaces will inherit this.`}),await l()}catch(t){e({title:`Save failed`,description:t instanceof Error?t.message:`Failed to save`,variant:`destructive`})}finally{o(!1)}}},JSON.stringify(t.user))]})}function xj(){let e=vn(),{showToast:t}=wo(),n=new URLSearchParams(e.search),r=e=>{try{let t=new URL(e);return t.pathname.includes(`/rest/v2/workspaces/`)&&!t.pathname.includes(`/rest/v2/pub/`)?t.pathname=t.pathname.replace(`/rest/v2/workspaces/`,`/rest/v2/pub/workspaces/`):t.pathname.includes(`/rest/v2/contexts/`)&&!t.pathname.includes(`/rest/v2/pub/`)&&(t.pathname=t.pathname.replace(`/rest/v2/contexts/`,`/rest/v2/pub/contexts/`)),t.toString()}catch{return e}},i=r(n.get(`url`)||``),a=sessionStorage.getItem(`sharedToken:last`)||``,[o,s]=(0,X.useState)(i),[c,l]=(0,X.useState)(a),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)([]),[m,h]=(0,X.useState)(!1),g=(0,X.useMemo)(()=>{try{let e=new URL(o);return e.pathname.includes(`/pub/workspaces/`)?`workspace`:e.pathname.includes(`/pub/contexts/`)?`context`:`unknown`}catch{return`unknown`}},[o]),_=()=>({Authorization:`Bearer ${c.trim()}`}),v=async()=>{if(!(!o||!c)){h(!0);try{let e=r(o),t=await J.get(e,{skipAuth:!0,headers:_()});d(t);let n=await J.get(`${e}/documents`,{skipAuth:!0,headers:_()}),i=Array.isArray(n)?n:Array.isArray(n?.data)?n.data:[];p(Array.isArray(i)?i:[])}catch(e){let n=o.includes(`/rest/v2/workspaces/`)?`Ensure the URL uses /rest/v2/pub/workspaces/<workspace-id> and the token matches that workspace.`:o.includes(`/rest/v2/contexts/`)?`Ensure the URL uses /rest/v2/pub/contexts/<context-id>.`:void 0;t({title:`Error`,description:`${e instanceof Error?e.message:`Failed to load shared resource`}${n?`: ${n}`:``}`,variant:`destructive`}),d(null),p([])}finally{h(!1)}}},y=(0,X.useRef)(v);return(0,X.useEffect)(()=>{y.current()},[]),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(sw,{onBack:yD(),title:`Shared Resource Viewer`,description:`Open a resource someone shared with you.`}),(0,Z.jsxs)(`div`,{className:`grid gap-2 md:grid-cols-3`,children:[(0,Z.jsx)(q,{value:o,onChange:e=>s(e.target.value),placeholder:`Full pub URL`}),(0,Z.jsx)(q,{value:c,onChange:e=>l(e.target.value),placeholder:`Access token (canvas-...)`}),(0,Z.jsx)(Y,{onClick:v,disabled:m||!o||!c,children:`Load`})]}),(0,Z.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[`Type: `,g]}),m?(0,Z.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`Loading...`}):(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`border rounded p-3`,children:[(0,Z.jsx)(`h2`,{className:`font-semibold mb-2`,children:`Metadata`}),(0,Z.jsx)(`pre`,{className:`text-xs overflow-auto max-h-80`,children:JSON.stringify(u,null,2)})]}),(0,Z.jsxs)(`div`,{className:`border rounded p-3`,children:[(0,Z.jsxs)(`h2`,{className:`font-semibold mb-2`,children:[`Documents (`,f.length,`)`]}),f.length===0?(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`No documents`}):(0,Z.jsx)(`ul`,{className:`space-y-2 text-sm`,children:f.slice(0,100).map((e,t)=>(0,Z.jsxs)(`li`,{className:`border rounded p-2`,children:[(0,Z.jsx)(`div`,{className:`font-mono text-xs`,children:e.id}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.schema})]},t))})]})]}),(0,Z.jsx)(au,{className:`mt-8`})]})}function Sj(e={}){let t=new URLSearchParams;e.tail&&t.set(`tail`,String(e.tail)),e.level&&t.set(`level`,e.level),e.module&&t.set(`module`,e.module);let n=t.toString();return n?`?${n}`:``}function Cj(){let e=localStorage.getItem(`authToken`);if(!e)throw Error(`Authentication required`);let t=localStorage.getItem(`appName`)||window.location.hostname;return{Authorization:`Bearer ${e}`,"X-App-Name":t,Accept:`text/event-stream`}}var wj={users:{async listUsers(e){let t=new URLSearchParams;e?.status&&t.append(`status`,e.status),e?.userType&&t.append(`userType`,e.userType);let n=t.toString(),r=n?`${no.admin.users}?${n}`:no.admin.users;return await J.get(r)},async getUser(e){return await J.get(`${no.admin.users}/${e}`)},async createUser(e){return await J.post(no.admin.users,e)},async updateUser(e,t){return await J.put(`${no.admin.users}/${e}`,t)},async deleteUser(e){await J.delete(`${no.admin.users}/${e}`)}},workspaces:{async listAllWorkspaces(){return await J.get(no.admin.workspaces)},async createWorkspace(e){return await J.post(no.admin.workspaces,e)},async deleteWorkspace(e){await J.delete(`${no.admin.workspaces}/${e}`)}},logs:{async getLogs(e={}){return(await J.get(`${no.admin.logs}${Sj(e)}`)).logs||[]},async streamLogs(e={},t={}){let{signal:n,onEntry:r,onError:i}=t;try{let t=await fetch(`${no.admin.logsStream}${Sj(e)}`,{method:`GET`,headers:Cj(),credentials:`include`,signal:n});if(!t.ok)throw Error(`Failed to open log stream (${t.status})`);if(!t.body)throw Error(`Streaming is not supported by this browser`);let i=t.body.getReader(),a=new TextDecoder,o=``,s=e=>{let t=e.split(`
|
|
31
|
+
`).map(e=>e.trim()).filter(Boolean);for(let e of t){if(!e.startsWith(`data: `))continue;let t=e.slice(6).trim();if(t!==`[DONE]`)try{let e=JSON.parse(t);if(!i)continue;if(e.type===`chunk`)i(e.delta||``,!1,e.metadata||{});else if(e.type===`thinking`)i(``,!1,{...e.metadata||{},reasoningDelta:e.delta||``});else if(e.type===`complete`){let t=Array.isArray(e.messages)?[...e.messages].reverse().find(e=>e?.role===`assistant`):null;i(``,!0,{...e.metadata||{},...VD(t)||{}})}else e.type===`error`&&a&&a(Error(e.error||`Prompt stream failed`))}catch{}}}},onError:a,onComplete:o})}async function hO(e,t){let{message:n,onMessage:r,onError:i,onComplete:a,context:o,mcpContext:s,maxTokens:c,temperature:l,images:u}=t;try{let t=await J.post(`${yo}/agents/${e}/prompt`,{message:n,images:u,context:o,mcpContext:s,maxTokens:c,temperature:l}),i=Array.isArray(t.messages)?[...t.messages].reverse().find(e=>e?.role===`assistant`):null,d={content:zD(i),metadata:VD(i)};return r&&r(d.content,!0,d.metadata),a&&a(),d}catch(e){throw i&&i(e),e}}function gO(e){return e.map(e=>({...e,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString()}))}async function _O(){return await J.get(`${yo}/voice/status`)}async function vO(e,t,n={}){let r=new FormData,i=(t.type.split(`/`)[1]||`webm`).split(`;`)[0];r.append(`file`,t,`voice.${i}`);let a=new URLSearchParams;n.tts===!1&&a.set(`tts`,`false`),n.voice&&a.set(`voice`,n.voice);let o=a.toString()?`?${a.toString()}`:``;return await J.post(`${yo}/agents/${e}/voice${o}`,r)}function yO(e,t){return J.post(`${yo}/agents/models`,e,{signal:t})}var bO=[{id:`workspace`,label:`Workspace`,path:`workspaces`,description:`Files, search, devices and sharing for one workspace. These settings override account defaults.`,sections:kD,load:async()=>(await Uo()).map(e=>({id:e.name,label:e.label||e.name}))},{id:`context`,label:`Context`,path:`contexts`,description:`Choose the tree and path a context opens, and who can access that view. File storage belongs to its workspace.`,sections:MD,load:async()=>(await ml()).map(e=>({id:e.id,label:e.name||e.id}))},{id:`agent`,label:`Agent`,path:`agents`,description:`Configure one assistant: its instructions, chat model, tools and access to Canvas.`,sections:PD,load:async()=>(await ZD()).map(e=>({id:e.id,label:e.label||e.name}))}];function xO({to:e,label:t,description:n,icon:r}){return(0,Z.jsxs)(we,{to:e,className:`group flex items-start gap-3 rounded-lg border bg-card p-4 transition-colors hover:border-primary/50 hover:bg-accent/30 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary`,children:[(0,Z.jsx)(r,{className:`mt-0.5 h-5 w-5 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-semibold`,children:t}),(0,Z.jsx)(`span`,{className:`mt-1 block text-sm leading-relaxed text-muted-foreground`,children:n})]}),(0,Z.jsx)(xi,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground group-hover:text-primary`})]})}function SO({group:e,query:t}){let[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(`loading`),[c,l]=(0,X.useState)(0);(0,X.useEffect)(()=>{let t=!1;return e.load().then(e=>{t||(r(e),s(`ready`))}).catch(()=>{t||s(`error`)}),()=>{t=!0}},[e,c]);let u=e.sections.filter(n=>wC(t,e.label,n.label,n.description));return u.length?(0,Z.jsxs)(`section`,{id:e.id,className:`scroll-mt-6 space-y-3`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Z.jsxs)(`label`,{className:`block max-w-md text-sm font-medium`,children:[`Choose a `,e.label.toLowerCase(),(0,Z.jsxs)(`select`,{className:`mt-2 h-10 w-full rounded-md border bg-background px-3 text-sm`,value:i,disabled:o!==`ready`||!n.length,onChange:e=>a(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:o===`loading`?`Loading…`:o===`error`?`Unable to load list`:n.length?`Select ${e.label.toLowerCase()}…`:`No ${e.path} available`}),n.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.label},e.id))]})]}),o===`error`&&(0,Z.jsxs)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:[`The list could not be loaded. `,(0,Z.jsx)(`button`,{type:`button`,className:`underline`,onClick:()=>{s(`loading`),l(e=>e+1)},children:`Retry`})]}),(0,Z.jsxs)(`details`,{open:!!(i||t.trim()),children:[(0,Z.jsx)(`summary`,{className:`cursor-pointer py-2 text-sm text-muted-foreground`,children:i?`Settings for ${n.find(e=>e.id===i)?.label||i}`:`What you can configure (${u.length})`}),(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:u.map(t=>i?(0,Z.jsx)(xO,{to:`/${e.path}/${encodeURIComponent(i)}/settings/${t.id}`,...t},t.id):(0,Z.jsxs)(`div`,{className:`rounded-lg border border-dashed p-4`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:t.label}),(0,Z.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:t.description})]},t.id))})]})]}):null}function CO(){let{state:e}=qC(),[t,n]=(0,X.useState)(``),r=SC.filter(t=>t.id!==`server`||e.user?.userType===`admin`).map(e=>({...e,items:e.items.filter(n=>wC(t,e.label,n.label,n.description))})).filter(e=>e.items.length),i=bO.some(e=>e.sections.some(n=>wC(t,e.label,n.label,n.description)));return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-6xl space-y-8 pb-8 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{title:`Settings`,description:`Start with what you want to change. Each section explains where your changes apply.`}),(0,Z.jsx)(q,{type:`search`,className:`max-w-xl`,"aria-label":`Search all settings`,placeholder:`Find a setting: offline, folders, models, sharing…`,value:t,onChange:e=>n(e.target.value)}),r.filter(e=>e.id===`device`||e.id===`account`).map(e=>(0,Z.jsxs)(`section`,{className:`space-y-3`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:e.items.map(e=>(0,Z.jsx)(xO,{to:e.path,...e},e.path))})]},e.id)),bO.map(e=>(0,Z.jsx)(SO,{group:e,query:t},e.id)),r.filter(e=>e.id===`server`||e.id===`information`).map(e=>(0,Z.jsxs)(`section`,{className:`space-y-3`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.label}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.description}),(0,Z.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(min(100%,16rem),1fr))] gap-3`,children:e.items.map(e=>(0,Z.jsx)(xO,{to:e.path,...e},e.path))})]},e.id)),!r.length&&!i&&(0,Z.jsxs)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:[`No settings match “`,t,`”. Try a shorter phrase or clear the search.`]})]})}var wO=[{id:`canvas_1`,title:`Canvas Deep`,scheme:`dark`,background:`#032940`,accent:`#f2f2f2`,sources:[{type:`image/svg+xml`,src:`files/canvas_1.svg`},{type:`image/avif`,src:`files/canvas_1.avif`},{type:`image/webp`,src:`files/canvas_1.webp`}],thumb:`thumbs/canvas_1.webp`,author:`Canvas`,license:`LicenseRef-Canvas-Brand`},{id:`canvas_3`,title:`Canvas Mono Dark`,scheme:`dark`,background:`#000000`,accent:`#ffffff`,sources:[{type:`image/svg+xml`,src:`files/canvas_3.svg`},{type:`image/avif`,src:`files/canvas_3.avif`},{type:`image/webp`,src:`files/canvas_3.webp`}],thumb:`thumbs/canvas_3.webp`,author:`Canvas`,license:`LicenseRef-Canvas-Brand`},{id:`w1`,title:`Frost`,scheme:`dark`,background:`#164a6f`,accent:`#9ad9f0`,sources:[{type:`image/avif`,src:`files/w1.avif`},{type:`image/webp`,src:`files/w1.webp`},{type:`image/jpeg`,src:`files/w1.jpg`}],thumb:`thumbs/w1.webp`,author:`Peter Cui Bide`,source:`https://petercui.deviantart.com`,license:`LicenseRef-Attribution-Only`}],TO=`/wallpapers`;function EO(e){return wO.find(t=>t.id===e)}function DO(e,t={}){let n=typeof e==`string`?EO(e):e;if(!n)return null;let{base:r=TO,types:i}=t,a=(i?n.sources.find(e=>i.includes(e.type)):n.sources[0])??n.sources[n.sources.length-1];return`${r.replace(/\/$/,``)}/${a.src}`}function OO(e,t=TO){let n=typeof e==`string`?EO(e):e;return n?`${t.replace(/\/$/,``)}/${n.thumb}`:null}var kO=[{id:`cover`,label:`Scale and Crop`,description:`Fills the screen, cropping edges as needed`},{id:`fill`,label:`Fill`,description:`Stretches to the exact screen size`},{id:`center`,label:`Centered`,description:`Original size, centered on the desk`}],AO=`canvas:wallpaper`,jO=`canvas-wallpaper`,MO=`settings`,NO=`builtin:`,PO=wO;function FO(e){return OO(e)??``}function IO(e){return`${NO}${e}`}function LO(e){return e?.startsWith(NO)?e.slice(8):null}function RO(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.image!=`string`&&t.image!==null?null:{image:t.image,fit:t.fit===`fill`||t.fit===`center`?t.fit:`cover`}}function zO(){try{let e=localStorage.getItem(AO);if(e){let t=RO(JSON.parse(e));if(t)return t}}catch{}return{image:null,fit:`cover`}}var BO=zO(),VO=null;function HO(){return BO}async function UO(e){let t=await new Promise((e,t)=>{let n=indexedDB.open(jO,1),r=!1;n.onupgradeneeded=()=>n.result.createObjectStore(MO),n.onsuccess=()=>{if(r){n.result.close();return}n.result.onversionchange=()=>n.result.close(),e(n.result)},n.onerror=()=>t(n.error),n.onblocked=()=>{r=!0,t(Error(`Close other Canvas tabs and try again.`))}});try{return await new Promise((n,r)=>{let i=t.transaction(MO,e?`readwrite`:`readonly`),a=i.objectStore(MO),o=e?a.put(e,AO):a.get(AO);i.oncomplete=()=>n(o.result),i.onerror=()=>r(i.error),i.onabort=()=>r(i.error)})}finally{t.close()}}function WO(){try{localStorage.removeItem(AO)}catch{}}function GO(){return VO||=(async()=>{try{let e=RO(await UO());e?BO=e:await UO(BO),WO()}catch{}return $O(BO),BO})(),VO.then(()=>BO)}async function KO(e){await GO(),await UO(e),BO=e,WO(),$O(e)}function qO(e){if(e.size>10485760)return Promise.reject(Error(`Image too large. Choose one up to 10 MB.`));let t=e.type||(/\.gif$/i.test(e.name)?`image/gif`:``);return t.startsWith(`image/`)?new Promise((n,r)=>{let i=new FileReader;i.onload=()=>n(String(i.result)),i.onerror=()=>r(Error(`Could not read the image. Try selecting it again.`)),i.onabort=()=>r(Error(`Reading the image was cancelled.`)),i.readAsDataURL(e.type?e:e.slice(0,e.size,t))}):Promise.reject(Error(`Pick an image file (animated GIFs are supported).`))}var JO=typeof CSS<`u`&&CSS.supports(`background-image`,`image-set(url("a.avif") type("image/avif"))`);function YO(e){if(!e)return null;let t=LO(e);if(t===null)return`url("${e}")`;let n=EO(t);if(!n)return null;let r=`url("${DO(n,{types:[n.sources[n.sources.length-1].type]})}")`;return!JO||n.sources.length===1?r:`image-set(${n.sources.map(e=>`url("${DO(n,{types:[e.type]})}") type("${e.type}")`).join(`, `)})`}function XO(e){return e===`fill`?`100% 100%`:e===`center`?`auto`:`cover`}var ZO=null;function QO(e){let t=e.indexOf(`,`);if(t<0)throw Error(`Invalid wallpaper data URL`);let n=e.slice(5,t),r=e.slice(t+1),i;if(n.endsWith(`;base64`)){let e=atob(r);i=new Uint8Array(e.length);for(let t=0;t<e.length;t++)i[t]=e.charCodeAt(t)}else i=new TextEncoder().encode(decodeURIComponent(r));return new Blob([i],{type:n.split(`;`)[0]})}function $O(e=HO()){let t=document.documentElement.style,n=ZO,r=e.image;if(r?.startsWith(`data:`))try{ZO?.dataUrl!==r&&(ZO={dataUrl:r,objectUrl:URL.createObjectURL(QO(r))}),r=ZO.objectUrl}catch{ZO=null,r=null}else ZO=null;let i=YO(r);i?(t.setProperty(`--wallpaper-image`,i),t.setProperty(`--wallpaper-size`,XO(e.fit))):(t.removeProperty(`--wallpaper-image`),t.removeProperty(`--wallpaper-size`)),n&&n!==ZO&&URL.revokeObjectURL(n.objectUrl)}var ek=[{id:`cards`,name:`Cards`,description:`Nested cards with connector lines. Each level indents.`},{id:`accordion-mobile`,name:`Accordion on phones (beta)`,description:`Experimental. Full-width accordion rows on a phone, cards on wider screens.`},{id:`accordion`,name:`Accordion (beta)`,description:`Experimental. Full-width rows at every depth; a depth rail, tint and colour swatch replace the indent, and open parents stick to the top while you scroll.`}],tk=`canvas:treeStyle`;function nk(){try{let e=localStorage.getItem(tk);return e===`accordion`||e===`accordion-mobile`?e:`cards`}catch{return`cards`}}var rk=nk(),ik=new Set;function ak(){return rk}function ok(e){try{e===`cards`?localStorage.removeItem(tk):localStorage.setItem(tk,e)}catch{}rk=e;for(let e of ik)e()}function sk(e){ik.add(e);let t=t=>{(t.key===tk||t.key===null)&&(rk=nk(),e())};return window.addEventListener(`storage`,t),()=>{ik.delete(e),window.removeEventListener(`storage`,t)}}function ck(){return(0,X.useSyncExternalStore)(sk,ak,()=>`cards`)}function lk(){let e=ck(),t=De();return e===`accordion`||e===`accordion-mobile`&&t}var uk=[{id:`canvas`,name:`Canvas`,description:`Black and white with a teal accent. Sheets of paper on a grey desk.`,swatches:[`oklch(1 0 0)`,`oklch(0 0 0)`,`oklch(0.704 0.135 183)`]},{id:`nord`,name:`Nord`,description:`Cool arctic blues, lower contrast, softer corners.`,swatches:[`oklch(0.976 0.006 251)`,`oklch(0.588 0.056 244)`,`oklch(0.686 0.062 213)`]},{id:`contrast`,name:`High Contrast`,description:`WCAG AAA text contrast, square corners, hard borders, no shadows.`,swatches:[`oklch(1 0 0)`,`oklch(0 0 0)`,`oklch(0.32 0.16 258)`]},{id:`frost`,name:`Frosted Glass`,description:`Translucent, blurred surfaces over a soft backdrop. Best with a wallpaper.`,swatches:[`oklch(0.92 0.008 250)`,`oklch(0.31 0.025 255)`,`oklch(0.55 0.05 250)`]},{id:`terminal`,name:`Terminal`,description:`Monospaced and dense. Tighter rows and chrome for large displays.`,swatches:[`oklch(0.17 0.006 152)`,`oklch(0.8 0.19 148)`,`oklch(0.75 0.12 220)`]},{id:`halflife`,name:`Half-Life`,description:`Lambda orange on black steel. Square corners; the left rail is orange.`,swatches:[`oklch(0.724 0.181 52)`,`oklch(0 0 0)`,`oklch(1 0 0)`]}],dk=uk.map(e=>e.id),fk=[{id:`system`,name:`System`},{id:`light`,name:`Light`},{id:`dark`,name:`Dark`}],pk=[{id:`auto`,name:`Auto`,description:`Match the pointer: touch on phones, mouse on desktop`},{id:`compact`,name:`Compact`,description:`Maximum rows per screen`},{id:`comfortable`,name:`Comfortable`,description:`Balanced for mouse use`},{id:`touch`,name:`Touch`,description:`Large targets for finger input`}],mk={theme:`canvas`,scheme:`light`,density:`auto`},hk=`canvas.ui.theme`;function gk(e){return typeof e==`string`&&dk.includes(e)}function _k(e){return e===`light`||e===`dark`||e===`system`}function vk(e){return e===`auto`||e===`compact`||e===`comfortable`||e===`touch`}function yk(e){let t=typeof e==`object`&&e?e:{};return{theme:gk(t.theme)?t.theme:mk.theme,scheme:_k(t.scheme)?t.scheme:mk.scheme,density:vk(t.density)?t.density:mk.density}}var bk=`(prefers-color-scheme: dark)`;function xk(){return typeof document<`u`}function Sk(){return typeof window>`u`||typeof window.matchMedia!=`function`?!1:window.matchMedia(bk).matches}function Ck(e){return e===`system`?Sk()?`dark`:`light`:e}function wk(e){if(typeof window>`u`||typeof window.matchMedia!=`function`)return()=>{};let t=window.matchMedia(bk),n=t=>e(t.matches?`dark`:`light`);return t.addEventListener(`change`,n),()=>t.removeEventListener(`change`,n)}function Tk(e){return wk(e)}function Ek(){return Sk()?`dark`:`light`}function Dk(){return`light`}function Ok(e){let t=getComputedStyle(e).getPropertyValue(`--background`).trim();if(!t)return;let n=document.querySelector(`meta[name="theme-color"]`);n||(n=document.createElement(`meta`),n.name=`theme-color`,document.head.appendChild(n)),n.content=t}function kk(e,t=xk()?document.documentElement:void 0){let n=Ck(e.scheme);return t?(t.dataset.theme=e.theme,t.dataset.scheme=n,t.dataset.density=e.density,Ok(t),n):n}function Ak(e,t=xk()?document.documentElement:void 0){if(!t||typeof window>`u`)return kk(e,t);let n=document.createElement(`style`);n.appendChild(document.createTextNode(`*,*::before,*::after{transition:none!important;animation:none!important}`)),document.head.appendChild(n);let r=kk(e,t);return window.getComputedStyle(n).opacity,document.head.removeChild(n),r}function jk(e){let t=e??Pk();if(!t)return mk;try{let e=t.getItem(hk);return e?yk(JSON.parse(e)):mk}catch{return mk}}function Mk(e,t){let n=t??Pk();if(n)try{n.setItem(hk,JSON.stringify(e))}catch{}}function Nk(e){let t=e??Pk();if(t)try{t.removeItem(hk)}catch{}}function Pk(){try{return typeof localStorage<`u`?localStorage:void 0}catch{return}}function Fk({children:e,initial:t,storage:n,persist:r=!0}){let[i,a]=(0,X.useState)(()=>({...jk(n),...t})),o=(0,X.useSyncExternalStore)(Tk,Ek,Dk),s=i.scheme===`system`?o:i.scheme;(0,X.useEffect)(()=>{Ak({...i,scheme:s})},[i,s]),(0,X.useEffect)(()=>{r&&Mk(i,n)},[i,r,n]);let c=(0,X.useCallback)(e=>{a(t=>t.theme===e?t:{...t,theme:e})},[]),l=(0,X.useCallback)(e=>{a(t=>t.scheme===e?t:{...t,scheme:e})},[]),u=(0,X.useCallback)(e=>{a(t=>t.density===e?t:{...t,density:e})},[]),d=(0,X.useCallback)(()=>{a(e=>({...e,scheme:(e.scheme===`system`?Ek():e.scheme)===`dark`?`light`:`dark`}))},[]),f=(0,X.useCallback)(()=>{Nk(n),a(mk)},[n]),p=(0,X.useMemo)(()=>({...i,resolvedScheme:s,setTheme:c,setScheme:l,setDensity:u,toggleScheme:d,reset:f}),[i,s,c,l,u,d,f]);return(0,Z.jsx)(Il.Provider,{value:p,children:e})}var Ik={system:mr,light:ji,dark:va};function Lk(){let{theme:e,scheme:t,density:n,resolvedScheme:r,setTheme:i,setScheme:a,setDensity:o,reset:s}=Ll(),c=re(),l=k(),u=PC(),d=L(),f=ck(),p=UC();return(0,Z.jsxs)(`div`,{className:`space-y-8`,children:[(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Theme`,description:`Palette, shape and typography. Each theme defines its own light and dark variants.`}),(0,Z.jsx)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3`,children:uk.map(t=>{let n=t.id===e;return(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>i(t.id),"aria-pressed":n,className:K(`focus-ring group flex flex-col gap-3 rounded-lg border p-4 text-left transition-colors`,n?`border-primary bg-accent`:`border-border hover:border-muted-foreground/40 hover:bg-accent/50`),children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:t.name}),n&&(0,Z.jsx)(sr,{className:`size-4 shrink-0 text-primary`})]}),(0,Z.jsx)(`div`,{className:`flex gap-1.5`,"aria-hidden":!0,children:t.swatches.map(e=>(0,Z.jsx)(`span`,{className:`size-6 rounded-full border border-border`,style:{backgroundColor:e}},e))}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.description})]},t.id)})})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Colour scheme`,description:t===`system`?`Following your system setting, currently ${r}.`:`Overrides your system setting.`}),(0,Z.jsx)(Hk,{options:fk.map(e=>{let t=Ik[e.id];return{id:e.id,label:e.name,icon:(0,Z.jsx)(t,{className:`size-4 shrink-0`})}}),value:t,onChange:a})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Density`,description:`Controls row height, hit-target size and shell spacing across the whole app.`}),(0,Z.jsx)(Hk,{options:pk.map(e=>({id:e.id,label:e.name,title:e.description})),value:n,onChange:o}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:pk.find(e=>e.id===n)?.description})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Layout`,description:`How menus and content share the screen. Device-local, like the wallpaper.`}),(0,Z.jsx)(Hk,{options:TC.map(e=>({id:e.id,label:e.name,title:e.description})),value:u,onChange:MC}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:TC.find(e=>e.id===u)?.description}),u===`strip`&&(0,Z.jsxs)(`div`,{className:`mt-4`,children:[(0,Z.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Navigation keys`}),(0,Z.jsx)(Hk,{options:FC.map(e=>({id:e.id,label:e.name,title:e.description})),value:p,onChange:VC}),(0,Z.jsxs)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:[FC.find(e=>e.id===p)?.description,` `,`Left and right walk the columns, up and down switch pin rows.`]})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Tree style`,description:`How workspace and context trees are drawn in the menu. Device-local.`}),(0,Z.jsx)(Hk,{options:ek.map(e=>({id:e.id,label:e.name,title:e.description})),value:f,onChange:ok}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:ek.find(e=>e.id===f)?.description})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Open documents`,description:`Choose how documents open from lists, tiles and boards. Saved on this device.`}),(0,Z.jsx)(Hk,{options:[{id:`modal`,label:`Modal`},{id:`side`,label:`Side reading pane`}],value:l,onChange:M}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`The reading pane opens beside the content and updates as you select another document. On small screens it opens as a drawer.`})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Always-on content area`,description:`Keep a reading pane beside document lists on tablets and desktops. Remember the selected item in each folder, or show the first available item.`}),(0,Z.jsx)(Hk,{options:[{id:`on`,label:`On`},{id:`off`,label:`Off`}],value:c?`on`:`off`,onChange:e=>ze(e===`on`)}),(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`On by default. The reader uses roughly half the screen; drag its divider to resize. Phones keep tap-to-open navigation. When enabled, list selections use this pane regardless of the Open documents setting.`})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(Vk,{title:`Document tiles`,description:`Choose the photo and media layout for tile view. Saved on this device.`}),(0,Z.jsx)(Hk,{options:Ie,value:d,onChange:He})]}),(0,Z.jsx)(Rk,{}),(0,Z.jsx)(`section`,{children:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{s(),M(`modal`)},className:`focus-ring rounded-md text-sm text-muted-foreground underline-offset-4 hover:text-foreground hover:underline`,children:`Reset to defaults`})})]})}function Rk(){let[e,t]=(0,X.useState)(HO),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(!1),c=(0,X.useRef)(!1);(0,X.useEffect)(()=>{let e=!1;return GO().then(()=>{e||(t(HO()),a(!1))}),()=>{e=!0}},[]);let l=async(e,n)=>{if(!c.current){c.current=!0,s(!0);try{let i=n?{...e,image:await qO(n)}:e;await KO(i),t(i),r(null)}catch(e){r(e instanceof Error&&e.name!==`QuotaExceededError`?e.message:`Could not store the wallpaper. Free some browser storage or try a smaller image.`)}finally{c.current=!1,s(!1)}}},u=t=>{t&&l(e,t)},d=e.image!==null&&LO(e.image)===null,f=YO(e.image);return(0,Z.jsx)(`section`,{children:(0,Z.jsxs)(`fieldset`,{disabled:i||o,className:`min-w-0`,children:[(0,Z.jsx)(Vk,{title:`Wallpaper`,description:`Background image for the desk behind all panels. Without one, the theme's desk color shows (the default).`}),(0,Z.jsxs)(`div`,{role:`radiogroup`,"aria-label":`Wallpaper`,className:`grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-6`,children:[(0,Z.jsx)(Bk,{label:`None`,isActive:e.image===null,onSelect:()=>l({...e,image:null}),children:(0,Z.jsx)(`span`,{className:`flex size-full items-center justify-center surface-desk text-xs text-muted-foreground`,style:{backgroundImage:`none`},children:`None`})}),PO.map(t=>(0,Z.jsx)(Bk,{label:t.title,title:`${t.title} — suits the ${t.scheme} scheme`,isActive:LO(e.image)===t.id,onSelect:()=>l({...e,image:IO(t.id)}),children:(0,Z.jsx)(`img`,{src:FO(t),alt:``,loading:`lazy`,className:`size-full object-cover`,style:{backgroundColor:t.background}})},t.id)),d&&(0,Z.jsx)(Bk,{label:`Your image`,isActive:!0,onSelect:()=>{},children:(0,Z.jsx)(`img`,{src:e.image??void 0,alt:``,className:`size-full object-cover`})})]}),(0,Z.jsx)(zk,{}),(0,Z.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center gap-3`,children:[(0,Z.jsx)(`div`,{className:`h-20 w-32 shrink-0 rounded-md border surface-desk`,style:f?{backgroundImage:f,backgroundSize:XO(e.fit),backgroundPosition:`center`,backgroundRepeat:`no-repeat`}:void 0,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(`label`,{className:`focus-ring inline-flex cursor-pointer items-center rounded-md border px-3 py-1.5 text-sm hover:bg-accent/50`,children:[d?`Change image…`:`Use your own image…`,(0,Z.jsx)(`input`,{type:`file`,accept:`image/*,.gif`,className:`hidden`,onChange:e=>{u(e.target.files?.[0]),e.target.value=``}})]}),e.image&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>l({...e,image:null}),className:`focus-ring rounded-md border px-3 py-1.5 text-sm text-muted-foreground hover:bg-accent/50 hover:text-foreground`,children:`Remove`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Images and animated GIFs up to 10 MB. Stored on this device.`}),(0,Z.jsx)(Hk,{options:kO.map(e=>({id:e.id,label:e.label,title:e.description})),value:e.fit,onChange:t=>l({...e,fit:t})}),n&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:n}),o&&(0,Z.jsx)(`p`,{role:`status`,className:`text-xs text-muted-foreground`,children:`Saving wallpaper…`})]})]})]})})}function zk(){let e=PO.filter(e=>e.author!==`Canvas`);return e.length===0?null:(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:e.map((e,t)=>(0,Z.jsxs)(`span`,{children:[t>0&&` · `,e.title,` © `,e.author,e.source&&(0,Z.jsxs)(Z.Fragment,{children:[` `,(0,Z.jsx)(`a`,{href:e.source,target:`_blank`,rel:`noreferrer noopener`,className:`focus-ring underline underline-offset-2 hover:text-foreground`,children:new URL(e.source).hostname})]})]},e.id))})}function Bk({label:e,title:t,isActive:n,onSelect:r,children:i}){return(0,Z.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"aria-label":e,title:t??e,onClick:r,className:K(`focus-ring group relative aspect-video overflow-hidden rounded-md border transition-colors`,n?`border-primary ring-1 ring-primary`:`border-border hover:border-muted-foreground/40`),children:[i,n&&(0,Z.jsx)(`span`,{className:`absolute right-1 top-1 rounded-full bg-primary p-0.5 text-primary-foreground`,children:(0,Z.jsx)(sr,{className:`size-3`})})]})}function Vk({title:e,description:t}){return(0,Z.jsxs)(`div`,{className:`mb-3`,children:[(0,Z.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function Hk({options:e,value:t,onChange:n}){return(0,Z.jsx)(`div`,{role:`radiogroup`,className:`inline-flex flex-wrap gap-1 rounded-lg bg-muted p-1`,children:e.map(e=>{let r=e.id===t;return(0,Z.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":r,title:e.title,onClick:()=>n(e.id),className:K(`focus-ring flex h-control items-center gap-2 rounded-md px-3 text-sm transition-colors`,r?`bg-card text-foreground shadow-elevation-1`:`text-muted-foreground hover:text-foreground`),children:[e.icon,e.label]},e.id)})})}function Uk(){return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`Appearance`,onBack:yD(),description:`Theme, colour scheme and density. Changes apply immediately and are remembered on this device.`}),(0,Z.jsx)(Lk,{})]})}var Wk={previousTree:`Alt+Q`,nextTree:`Alt+W`},Gk=`canvas:key-bindings`,Kk=/^(Alt|Alt\+Shift|Ctrl\+Shift|Meta\+Shift)\+[A-Z]$/;function qk(){try{let e=JSON.parse(localStorage.getItem(Gk)||`{}`),t={...Wk};for(let n of Object.keys(t))(e[n]===``||Kk.test(e[n]))&&(t[n]=e[n]);return t.previousTree&&t.previousTree===t.nextTree?{...Wk}:t}catch{return{...Wk}}}function Jk(e){localStorage.setItem(Gk,JSON.stringify(e))}function Yk(e){return/^Key[A-Z]$/.test(e.code)?[e.ctrlKey&&`Ctrl`,e.altKey&&`Alt`,e.metaKey&&`Meta`,e.shiftKey&&`Shift`,e.code.slice(3)].filter(Boolean).join(`+`):``}function Xk(e,t,n){return e[(Math.max(0,e.indexOf(t))+n+e.length)%e.length]}function Zk(e,t){return Math.abs(e)>=48&&Math.abs(e)>Math.abs(t)*1.5?e<0?1:-1:0}function Qk(){let[e,t]=(0,X.useState)(qk),[n,r]=(0,X.useState)(``),i=e=>{if(e.previousTree&&e.previousTree===e.nextTree){r(`Choose a different shortcut: that combination is already assigned.`);return}try{Jk(e),t(e),r(`Saved on this device.`)}catch{r(`Could not save shortcuts in this browser.`)}};return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`Key bindings`,onBack:yD(),description:`Web UI shortcuts, saved on this device and available offline.`}),(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`font-medium`,children:`Tree navigation`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Cycle the open workspace menu’s tabs in their displayed order, including Pins and Layers. Swipe left for next or right for previous over the tab bar. Shortcuts pause while typing or using a dialog.`}),[`previousTree`,`nextTree`].map(t=>(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Z.jsx)(`label`,{htmlFor:t,className:`min-w-32 text-sm`,children:t===`previousTree`?`Previous tree`:`Next tree`}),(0,Z.jsxs)(`select`,{id:t,className:`rounded-md border bg-background p-2 text-sm`,value:e[t].split(`+`).slice(0,-1).join(`+`),onChange:n=>i({...e,[t]:n.target.value?`${n.target.value}+${e[t].slice(-1)||Wk[t].slice(-1)}`:``}),children:[(0,Z.jsx)(`option`,{value:``,children:`Disabled`}),[`Alt`,`Alt+Shift`,`Ctrl+Shift`,`Meta+Shift`].map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))]}),(0,Z.jsx)(`select`,{"aria-label":`${t===`previousTree`?`Previous`:`Next`} tree key`,disabled:!e[t],className:`rounded-md border bg-background p-2 text-sm disabled:opacity-50`,value:e[t].slice(-1)||Wk[t].slice(-1),onChange:n=>i({...e,[t]:`${e[t].split(`+`).slice(0,-1).join(`+`)}+${n.target.value}`}),children:`ABCDEFGHIJKLMNOPQRSTUVWXYZ`.split(``).map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))})]},t)),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Browsers and operating systems may reserve combinations. Choose another if a shortcut does not reach Canvas. Letters refer to physical keyboard positions (Q/W on a US keyboard); Meta is Command on Mac.`}),(0,Z.jsx)(`button`,{type:`button`,className:`rounded-md border px-3 py-2 text-sm hover:bg-accent`,onClick:()=>i({...Wk}),children:`Restore defaults`}),(0,Z.jsx)(`p`,{role:`status`,className:`text-sm`,children:n})]})]})}var $k=`offline-content-v1`,eA=`offline-api-v1`,tA=1073741824,nA={enabled:!1,budgetBytes:4*tA,excludedWorkspaces:[]},rA=1e3;function iA(e){return(e.startsWith(`/`)?e:`/${e}`).replace(/\/+$/,``)||`/`}function aA(e,t,n){return`${e}:${t}:${iA(n)}`}var oA=`canvas-offline`,sA=2,cA=null;function lA(){return cA||(cA=new Promise((e,t)=>{let n=indexedDB.open(oA,sA);n.onupgradeneeded=e=>{let t=n.result;if(t.objectStoreNames.contains(`config`)||t.createObjectStore(`config`),t.objectStoreNames.contains(`entries`)||t.createObjectStore(`entries`,{keyPath:`url`}),e.oldVersion>=1&&t.objectStoreNames.contains(`pins`)){t.deleteObjectStore(`pins`);let e=n.transaction.objectStore(`entries`).openCursor();e.onsuccess=()=>{let t=e.result;if(!t)return;let n=t.value;n.pinned&&t.update({...n,pinned:!1}),t.continue()}}t.objectStoreNames.contains(`scopes`)||t.createObjectStore(`scopes`,{keyPath:`id`})},n.onsuccess=()=>{n.result.onversionchange=()=>{n.result.close(),cA=null},e(n.result)},n.onerror=()=>{cA=null,t(n.error)}}),cA)}function uA(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error),e.onabort=()=>n(e.error)})}function dA(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function fA(e,t){return dA((await lA()).transaction(e).objectStore(e).get(t))}async function pA(e){return dA((await lA()).transaction(e).objectStore(e).getAll())}async function mA(e,t,n){let r=(await lA()).transaction(e,`readwrite`);return r.objectStore(e).put(t,n),uA(r)}async function hA(e,t){let n=(await lA()).transaction(e,`readwrite`);return n.objectStore(e).delete(t),uA(n)}async function gA(e){let t=(await lA()).transaction(e,`readwrite`);return t.objectStore(e).clear(),uA(t)}async function _A(){try{let e=await fA(`config`,`settings`);return e?{...nA,...e}:nA}catch{return nA}}async function vA(e){await mA(`config`,e,`settings`)}async function yA(e,t){let n=(await lA()).transaction(`entries`,`readwrite`),r=n.objectStore(`entries`);for(let n of e){let e=r.get(n);e.onsuccess=()=>{let i=e.result;i?r.put({...i,pinned:t}):t&&r.put({url:n,kind:`content`,size:0,lastAccess:Date.now(),pinned:t})}}return uA(n)}async function bA(e){let t=await pA(`entries`),n=t.filter(e=>e.kind===`api`).sort((e,t)=>e.lastAccess-t.lastAccess),r=n.slice(0,Math.max(0,n.length-rA)),i=t.filter(e=>e.kind===`content`),a=i.reduce((e,t)=>e+t.size,0),o=i.filter(e=>!e.pinned).sort((e,t)=>e.lastAccess-t.lastAccess),s=[];for(let t of o){if(a<=e)break;s.push(t),a-=t.size}if(!r.length&&!s.length)return;let[c,l]=await Promise.all([caches.open(eA),caches.open($k)]);await Promise.all([...r.map(async e=>{await c.delete(e.url),await hA(`entries`,e.url)}),...s.map(async e=>{await l.delete(e.url),await hA(`entries`,e.url)})])}async function xA(){let e=await pA(`entries`),t=e.filter(e=>e.kind===`content`);return{contentBytes:t.reduce((e,t)=>e+t.size,0),contentCount:t.length,pinnedBytes:t.filter(e=>e.pinned).reduce((e,t)=>e+t.size,0),apiCount:e.length-t.length}}async function SA(){await Promise.all([caches.delete($k),caches.delete(eA)]),await gA(`entries`),await gA(`scopes`)}async function CA(){return pA(`scopes`)}async function wA(e){return fA(`scopes`,e)}async function TA(e){await mA(`scopes`,e)}async function EA(e){let t=await fA(`scopes`,e);await hA(`scopes`,e),t?.urls.length&&await DA(t.urls)}async function DA(e){let t=await pA(`scopes`),n=new Set(t.flatMap(e=>e.urls)),r=e.filter(e=>!n.has(e));r.length&&await yA(r,!1)}var OA=3,kA=`data/schema/file`,AA=128;async function jA({workspaceRef:e,path:t,treeName:n,treeType:r},i){let a=await _A();if(!a.enabled)throw Error(`Enable the offline cache first`);if(a.excludedWorkspaces.includes(e))throw Error(`Workspace "${e}" is excluded from offline caching`);let o=aA(e,n,t),s=iA(t),c=await wA(o),l=((await Fs(e,s,[],{limit:1e4,treeName:n,treeType:r})).payload??[]).filter(e=>e.schema===kA),u=[],d=0,f=0,p=!1,m=l.length;i?.({done:f,total:m,bytes:d});let h=0;await Promise.all(Array.from({length:Math.min(OA,l.length)},async()=>{for(;h<l.length;){let t=l[h++];if(d>=a.budgetBytes*.9){p=!0;return}try{let{blob:n}=await No(e,t.id);d+=n.size,u.push(`${no.workspaces}/${e}/documents/${t.id}/content`);try{await Cs(e,t.id,AA),u.push(`${no.workspaces}/${e}/documents/${t.id}/thumbnail?size=${AA}`)}catch{}}catch{}f+=1,i?.({done:f,total:m,bytes:d})}})),await yA(u,!0);let g={id:o,workspaceRef:e,treeName:n,treeType:r,path:s,urls:u,bytes:d,warmedAt:Date.now(),...p?{truncated:!0}:{}};if(await TA(g),c){let e=new Set(u),t=c.urls.filter(t=>!e.has(t));t.length&&await DA(t)}return g}var MA=[{label:`1 GB`,bytes:1*tA},{label:`2 GB`,bytes:2*tA},{label:`4 GB`,bytes:4*tA},{label:`8 GB`,bytes:8*tA}];function NA(e){return e<1048576?`${(e/1024).toFixed(0)} KB`:e<1073741824?`${(e/1048576).toFixed(1)} MB`:`${(e/tA).toFixed(2)} GB`}function PA(){navigator.serviceWorker?.controller?.postMessage({type:`OFFLINE_SETTINGS_CHANGED`})}function FA(){let{showSuccessToast:e,showErrorToast:t}=Oo(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)([]),[u,d]=(0,X.useState)([]),[f,p]=(0,X.useState)({}),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(!1),v=(0,X.useCallback)(()=>{_A().then(r).catch(()=>{}),xA().then(a).catch(()=>{}),CA().then(e=>d(e.sort((e,t)=>e.id.localeCompare(t.id)))).catch(()=>{}),navigator.storage?.persisted?.().then(s).catch(()=>{})},[]);(0,X.useEffect)(()=>{v(),Uo().then(e=>l(e.map(e=>e.name).filter(Boolean).sort())).catch(()=>{})},[v]);let b=async e=>{r(e),await vA(e),PA(),e.enabled&&navigator.storage?.persist?.().then(s).catch(()=>{}),bA(e.budgetBytes).then(v).catch(()=>{})},x=e=>{if(!n)return;let t=n.excludedWorkspaces.includes(e)?n.excludedWorkspaces.filter(t=>t!==e):[...n.excludedWorkspaces,e];b({...n,excludedWorkspaces:t})},S=async()=>{h(!0);try{await SA(),e(`Offline cache cleared`),v()}catch(e){t(e instanceof Error?e.message:`Failed to clear cache`)}finally{h(!1)}},C=async n=>{let r=aA(n.workspaceRef,n.treeName,n.path);p(e=>({...e,[r]:{done:0,total:0,bytes:0}}));try{let t=await jA(n,e=>p(t=>({...t,[r]:e})));e(t.truncated?`Pinned ${NA(t.bytes)} — stopped at the size budget`:`Pinned ${t.workspaceRef}:/${t.path} (${NA(t.bytes)})`)}catch(e){t(e instanceof Error?e.message:`Failed to pin`)}finally{p(e=>{let{[r]:t,...n}=e;return n}),v()}},w=(e,t)=>{_(!1);for(let n of e)C({workspaceRef:t.workspaceName,path:n,treeName:t.treeName,treeType:t.treeType})},T=e=>({workspaceRef:e.workspaceRef,path:e.path,treeName:e.treeName||`context`,treeType:e.treeType||`context`}),E=async e=>{await EA(e),v()};return n?(0,Z.jsxs)(`div`,{className:`space-y-8`,children:[(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(IA,{title:`Offline cache`,description:`Keep documents you open (and scopes you pin) readable without a connection. Cached on this device only; least-recently-used files are evicted when the size budget fills. Video streaming is not cached.`}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>b({...n,enabled:!n.enabled}),"aria-pressed":n.enabled,className:K(`focus-ring flex items-center gap-3 rounded-lg border p-4 text-left transition-colors`,n.enabled?`border-primary bg-accent`:`border-input hover:bg-muted/40`),children:[(0,Z.jsx)(Ya,{className:`h-5 w-5 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`flex-1`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium`,children:n.enabled?`Enabled`:`Disabled`}),(0,Z.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:n.enabled?o===!1?`Storage is not persistent — the browser may still evict the cache under disk pressure`:`Documents are cached as you browse`:`Nothing is cached for offline use`})]}),n.enabled&&(0,Z.jsx)(sr,{className:`h-4 w-4 shrink-0 text-primary`})]}),n.enabled&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`mb-2 text-sm font-medium`,children:`Size budget`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:MA.map(e=>(0,Z.jsx)(Y,{variant:n.budgetBytes===e.bytes?`default`:`outline`,size:`sm`,onClick:()=>b({...n,budgetBytes:e.bytes}),children:e.label},e.bytes))})]}),i&&(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(`div`,{className:`flex items-baseline justify-between text-sm`,children:[(0,Z.jsxs)(`span`,{children:[NA(i.contentBytes),` of `,NA(n.budgetBytes),` used`]}),(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[i.contentCount,` file(s)`,i.pinnedBytes>0?`, ${NA(i.pinnedBytes)} pinned`:``]})]}),(0,Z.jsx)(`div`,{className:`h-2 w-full overflow-hidden rounded-full bg-muted`,children:(0,Z.jsx)(`div`,{className:`h-full rounded-full bg-primary`,style:{width:`${Math.min(100,i.contentBytes/n.budgetBytes*100)}%`}})})]}),(0,Z.jsx)(`div`,{children:(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,onClick:S,disabled:m,children:[m?(0,Z.jsx)(Ti,{className:`mr-1.5 h-3.5 w-3.5 animate-spin`}):(0,Z.jsx)(Qr,{className:`mr-1.5 h-3.5 w-3.5`}),`Clear offline cache`]})})]})]})]}),n.enabled&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(IA,{title:`Pinned scopes`,description:`A pinned scope — a workspace, or one of its tree paths — is downloaded up front and never evicted. Scopes resolve fresh on every re-warm, so moved contexts and reorganized trees are picked up; documents that left a scope return to normal eviction.`}),(0,Z.jsx)(`div`,{className:`mb-3`,children:(0,Z.jsxs)(Y,{size:`sm`,onClick:()=>_(!0),disabled:!!Object.keys(f).length,children:[(0,Z.jsx)(tr,{className:`mr-1.5 h-3.5 w-3.5`}),`Pin a path…`]})}),(0,Z.jsxs)(`ul`,{className:`space-y-1`,children:[u.map(e=>{let t=f[e.id];return(0,Z.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,Z.jsxs)(`span`,{className:`flex-1 truncate font-mono text-xs sm:text-sm`,children:[e.workspaceRef,`://`,e.path.replace(/^\//,``),e.treeName&&e.treeName!==`context`&&(0,Z.jsx)(`span`,{className:`ml-1.5 rounded bg-muted px-1 py-0.5 font-sans text-[10px] text-muted-foreground`,children:e.treeName})]}),t?(0,Z.jsxs)(`span`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Z.jsx)(Ti,{className:`h-3.5 w-3.5 animate-spin`}),t.total>0?`${t.done}/${t.total} · ${NA(t.bytes)}`:`listing…`]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[NA(e.bytes),e.truncated?` (partial)`:``]}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:()=>C(T(e)),"aria-label":`Re-warm ${e.id}`,title:`Re-warm: re-resolve the scope and download anything new`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:()=>E(e.id),"aria-label":`Unpin ${e.id}`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})]},e.id)}),u.length===0&&(0,Z.jsx)(`li`,{className:`rounded-md border border-dashed border-input px-3 py-4 text-center text-sm text-muted-foreground`,children:`Nothing pinned — everything relies on browse-caching and LRU`})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(IA,{title:`Workspace caching`,description:`Excluded workspaces are never cached — not even as you browse — and are not served from cache.`}),(0,Z.jsx)(`ul`,{className:`space-y-1`,children:c.map(e=>{let t=n.excludedWorkspaces.includes(e);return(0,Z.jsxs)(`li`,{className:`flex items-center gap-3 rounded-md border border-input px-3 py-2 text-sm`,children:[(0,Z.jsx)(`span`,{className:K(`flex-1 truncate`,t&&`text-muted-foreground line-through`),children:e}),t&&(0,Z.jsx)(ya,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,Z.jsx)(Y,{variant:t?`outline`:`ghost`,size:`sm`,onClick:()=>x(e),children:t?`Include`:`Exclude`})]},e)})})]})]}),g&&(0,Z.jsx)(Le,{onClose:()=>_(!1),children:(0,Z.jsx)(y,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,multiple:!1,tabs:[`context`,`directory`],title:`Pin for offline…`,confirmLabel:`Pin path`,onConfirm:w,onClose:()=>_(!1)})})]}):null}function IA({title:e,description:t}){return(0,Z.jsxs)(`div`,{className:`mb-4`,children:[(0,Z.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t})]})}function LA(){return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`Offline`,onBack:yD(),description:`Per-device offline cache: browse notes, files, photos and saved websites without a connection.`}),(0,Z.jsx)(FA,{})]})}function RA(e){let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:n>0?`${n}h ${r}m`:`${r}m`}function zA({name:e,version:t,detail:n}){return(0,Z.jsxs)(`div`,{className:`flex items-baseline justify-between gap-4 px-4 py-2.5`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium truncate`,children:e}),n&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate`,children:n})]}),(0,Z.jsx)(`code`,{className:`text-xs text-muted-foreground shrink-0`,children:t})]})}function BA(){let[e,t]=(0,X.useState)(null),[n,r]=(0,X.useState)(null);(0,X.useEffect)(()=>{let e=!0;return J.get(`/ping`,{skipAuth:!0}).then(n=>{e&&t(n??{})}).catch(t=>{e&&r(t instanceof Error?t.message:`Failed to reach the server`)}),()=>{e=!1}},[]);let i=[e?.commit?`commit ${e.commit.slice(0,7)}`:null,typeof e?.uptime==`number`?`up ${RA(e.uptime)}`:null].filter(Boolean).join(` · `),a=Object.entries(e?.components??{}).sort(([e],[t])=>e.localeCompare(t));return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl`,children:[(0,Z.jsx)(sw,{className:`mb-6`,title:`About`,onBack:yD(),description:`Versions of every Canvas component this installation is running.`}),(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`section`,{className:`rounded-md border border-border divide-y divide-border`,children:[(0,Z.jsx)(zA,{name:`Canvas Web`,detail:`this interface`,version:`v2.26.16`}),e?.version&&(0,Z.jsx)(zA,{name:e.productName||e.appName||`Canvas Server`,detail:i||void 0,version:`v${e.version}`})]}),a.length>0&&(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(`h2`,{className:`mb-2 px-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Server components`}),(0,Z.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:a.map(([e,t])=>(0,Z.jsx)(zA,{name:e,version:`v${t}`},e))})]}),n&&(0,Z.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Server details unavailable: `,n]}),e?.sourceUrl&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[e.license?`Licensed ${e.license}. `:``,(0,Z.jsx)(`a`,{href:e.sourceUrl,target:`_blank`,rel:`noreferrer`,className:`underline underline-offset-2 hover:text-foreground`,children:`Get the source code`}),`.`]})]})]})}var VA=[`onnx`,`clip`,`blip`,`openai`],HA=[`onnx`,`clip`,`blip`,`ollama`,`vllm`],UA=[{id:`openai`,baseUrl:`https://api.openai.com/v1`,label:`OpenAI`},{id:`vllm`,baseUrl:`http://127.0.0.1:8000/v1`,label:`vLLM`},{id:`ollama`,baseUrl:`http://127.0.0.1:11434/v1`,label:`Ollama`}],WA=e=>`${no.workspaces}/${encodeURIComponent(e)}/inferd`;function GA(e,t){let n={};for(let[r,i]of Object.entries(e.providers||{})){let e={...i};delete e.apiKeySet,delete e.headerNames,t.has(r)&&i.apiKey?e.apiKey=i.apiKey:delete e.apiKey,n[r]=e}return{...e,providers:n}}async function KA(e){return await J.get(`${WA(e)}/status`)}async function qA(e,t={}){let n={};return t.force!==void 0&&(n.force=t.force),await J.post(`${WA(e)}/summarize/images`,n)}async function JA(e){return await J.post(`${WA(e)}/summarize/images/stop`,{})}async function YA(e){return await J.get(`${WA(e)}/config`)}async function XA(e,t){return await J.put(`${WA(e)}/config`,t)}async function ZA(e,t={}){let n={};return t.space&&(n.space=t.space),t.reindex!==void 0&&(n.reindex=t.reindex),t.scope&&(n.scope=t.scope),await J.post(`${WA(e)}/reindex`,n)}async function QA(e){return await J.get(`${WA(e)}/vector-tables`)}async function $A(e,t){return await J.delete(`${WA(e)}/vector-tables/${encodeURIComponent(t)}`)}async function ej(){return await J.get(`${no.inferd}/config`)}async function tj(e){return await J.put(`${no.inferd}/config`,e)}async function nj(){return await J.get(`${no.inferd}/defaults`)}async function rj(e){return await J.put(`${no.inferd}/defaults`,e)}async function ij(e,t){let n={...e};return delete n.apiKeySet,delete n.headerNames,(await J.post(`${no.inferd}/test`,{provider:n,...t?{model:t}:{},probe:!0})).cached??null}async function aj(e,t,n=`text`){let r={...e};return delete r.apiKeySet,delete r.headerNames,await J.post(`${no.inferd}/test`,{provider:r,...t?{model:t}:{},modality:n})}var oj=`h-8 w-full rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`,sj=`font-semibold uppercase tracking-[0.08em]`,cj={openai:{url:{key:`baseUrl`,label:`Base URL`,placeholder:`http://gpu.local:8000/v1`,hint:`OpenAI-compatible embeddings endpoint — Ollama, vLLM, TEI, infinity, LM Studio and OpenAI itself all speak this. A trailing /v1 is optional; both http://host:8000 and http://host:8000/v1 work.`},apiKey:"Sent as `Authorization: Bearer …`. Leave empty for servers that do not check it.",imageInput:!0,timeoutMs:!0,headers:!0,where:e=>e.baseUrl||`no endpoint set`},ollama:{url:{key:`host`,label:`Host (legacy)`,placeholder:`http://127.0.0.1:11434`,hint:`Written by an older version. Switch the type to openai — the host becomes the base URL and the /v1 suffix is added for you.`},apiKey:"Sent as `Authorization: Bearer …`.",where:e=>e.host||`http://127.0.0.1:11434`},onnx:{cacheDir:`Where downloaded weights are cached on the server. Empty uses the server default.`,note:`Runs in-process on the server. No endpoint and no credentials.`,where:()=>`in-process`},clip:{cacheDir:`Where downloaded weights are cached on the server. Empty uses the server default.`,note:`Runs in-process on the server. No endpoint and no credentials.`,where:()=>`in-process`}},lj=[`baseUrl`,`host`,`apiKey`,`cacheDir`,`imageInput`,`timeoutMs`],uj=[{value:`data-uri`,label:`data-uri (default)`,hint:"Images ride in the ordinary `input` array as data URIs (infinity, TEI-style servers)."},{value:`messages`,label:`messages`,hint:`vLLM's multimodal shape: one request per image, wrapped in a chat message.`}],dj=12e4;function fj(e){if(typeof e!=`string`||e.trim()===``)return null;let t;try{t=new URL(e.trim())}catch{return`Must be an absolute URL including the scheme, e.g. http://127.0.0.1:11434`}return t.protocol!==`http:`&&t.protocol!==`https:`?`Unsupported scheme '${t.protocol.replace(`:`,``)}'. Use http or https.`:null}function pj({title:e,hint:t}){return(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(`h3`,{className:K(`text-[11px] text-muted-foreground`,sj),children:e}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:t})]})}function mj({overridden:e,source:t}){return e?(0,Z.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary`,title:`Set on this layer; it wins over anything inherited`,children:`overridden`}):(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground`,title:t?`Inherited: ${t}`:`Inherited from a lower config layer`,children:`inherited`})}function hj({label:e,value:t,inheritedValue:n,onChange:r,type:i=`text`,placeholder:a,disabled:o,hint:s,error:c,mono:l}){let u=t!==void 0&&t!==``;return(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:e}),(0,Z.jsx)(mj,{overridden:u,source:n===void 0?void 0:String(n)}),u&&!o&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(``),className:`text-[10px] text-muted-foreground underline hover:text-foreground`,title:`Clear the override and fall back to the inherited value`,children:`reset`})]}),(0,Z.jsx)(q,{type:i,value:t??``,disabled:o,onChange:e=>r(e.target.value),placeholder:a??(n===void 0?`—`:String(n)),className:K(`h-8 text-sm`,l&&`font-mono`,c&&`border-destructive focus-visible:ring-destructive`)}),c&&(0,Z.jsx)(`p`,{className:`text-[11px] font-medium text-destructive`,children:c}),s&&(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:s})]})}function gj({label:e,checked:t,overridden:n,disabled:r,onChange:i}){return(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,disabled:r,checked:t,onChange:e=>i(e.target.checked)}),e,(0,Z.jsx)(mj,{overridden:n})]})}function _j({storedNames:e,value:t,disabled:n,onChange:r}){let i=t!==void 0,[a,o]=(0,X.useState)([]),s=e=>{o(e),r(Object.fromEntries(e.filter(([e])=>e.trim()!==``)))};return(0,Z.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Custom headers`}),i?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will replace stored`}),!n&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{o([]),r(void 0)},className:`text-[10px] text-muted-foreground underline hover:text-foreground`,children:`cancel`})]}):(0,Z.jsx)(mj,{overridden:!1,source:e?.join(`, `)})]}),!i&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:e?.length?(0,Z.jsxs)(Z.Fragment,{children:[`Stored: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:e.join(`, `)}),` (values are never sent back)`]}):`None set.`}),!n&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>{o([[``,``]]),r({})},children:e?.length?`Replace headers`:`Add headers`})]}),i&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Saving replaces every stored header, so re-enter the ones you want to keep.`}),a.map(([e,t],r)=>(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:e,disabled:n,placeholder:`X-Tenant`,className:`h-8 font-mono text-sm`,onChange:e=>s(a.map((t,n)=>n===r?[e.target.value,t[1]]:t))}),(0,Z.jsx)(q,{value:t,disabled:n,placeholder:`value`,className:`h-8 font-mono text-sm`,onChange:e=>s(a.map((t,n)=>n===r?[t[0],e.target.value]:t))}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Remove header ${e||r+1}`,onClick:()=>s(a.filter((e,t)=>t!==r)),children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]},r)),!n&&(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>s([...a,[``,``]]),children:[(0,Z.jsx)(br,{className:`mr-1.5 h-3.5 w-3.5`}),`Add header`]})]})]})}function vj({open:e,onClick:t,label:n}){return(0,Z.jsx)(`button`,{type:`button`,onClick:t,"aria-expanded":e,title:n,"aria-label":n,className:`flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground`,children:(0,Z.jsx)(qr,{className:K(`h-4 w-4 transition-transform motion-reduce:transition-none`,e&&`rotate-180`)})})}var yj={configured:`bg-success`,"needs-fill":`bg-warning`,unresolved:`bg-destructive`,unset:`bg-muted-foreground/30`};function bj({value:e,effective:t,inherited:n,resolvedSpaces:r,invalid:i,attention:a,onFill:o,saving:s=!1,disabled:c=!1,saveLabel:l=`Save`,onSave:u}){let{showToast:d}=wo(),[f,p]=(0,X.useState)(()=>structuredClone(e)),[m,h]=(0,X.useState)(new Set),[g,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(``),[S,C]=(0,X.useState)(``),[w,T]=(0,X.useState)(null),E=(0,X.useMemo)(()=>[...new Set([...Object.keys(t.spaces||{}),...Object.keys(f.spaces||{})])].sort(),[t.spaces,f.spaces]),D=(0,X.useMemo)(()=>[...new Set([...Object.keys(t.providers||{}),...Object.keys(f.providers||{})])].sort(),[t.providers,f.providers]),O=(e,t,n)=>{p(r=>{let i={...r.spaces||{}},a={...i[e]||{}};if(n===``)delete a[t];else if(t===`dim`||t===`maxLength`||t===`dimensions`){let e=Number(n);if(Number.isNaN(e))return r;a[t]=e}else a[t]=n;return Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,spaces:i}})},k=(e,t,n)=>{p(r=>{let i={...r.spaces||{}},a={...i[e]||{}};return n===void 0?delete a[t]:a[t]=n,Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,spaces:i}})},A=(e,t,n)=>{t===`apiKey`&&h(t=>{let r=new Set(t);return n===``?r.delete(e):r.add(e),r}),p(r=>{let i={...r.providers||{}},a={...i[e]||{}};if(n===``)delete a[t];else if(t===`timeoutMs`){let e=Number(n);if(Number.isNaN(e))return r;a[t]=e}else a[t]=n;return Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,providers:i}})},j=(e,t,n)=>{p(r=>{let i={...r.providers||{}},a={...i[e]||{}};return n===void 0?delete a[t]:a[t]=n,Object.keys(a).length===0?delete i[e]:i[e]=a,{...r,providers:i}})},M=e=>{p(t=>{let n={...t.providers||{}};return delete n[e],{...t,providers:n}}),h(t=>{let n=new Set(t);return n.delete(e),n})},N=()=>{let e=S.trim();if(e){if(E.includes(e)){d({title:`Space exists`,description:`'${e}' already has a row below.`,variant:`destructive`});return}p(t=>({...t,spaces:{...t.spaces||{},[e]:{}}})),C(``),T(`space:${e}`)}},P=(e,t)=>{if(e){if(D.includes(e)){d({title:`Backend exists`,description:`'${e}' is already declared. Open it below to edit.`,variant:`destructive`});return}p(n=>({...n,providers:{...n.providers||{},[e]:{type:`openai`,...t?{baseUrl:t}:{}}}})),x(``),T(`provider:${e}`)}},ee=e=>({...t.providers?.[e]||{},...f.providers?.[e]||{}}),F=async e=>{let n=f.spaces?.[e]?.provider??t.spaces?.[e]?.provider,r=f.spaces?.[e]?.model??t.spaces?.[e]?.model;if(!n){d({title:`No backend`,description:`Space '${e}' has no backend to test.`,variant:`destructive`});return}let i=ee(n),a=i.type?cj[i.type]?.url?.key:void 0,o=a?fj(i[a]):null;if(o){d({title:`Backend '${n}'`,description:o,variant:`destructive`});return}_(e);try{try{await ij(i,r)===!1&&(y(!0),d({title:`Downloading model`,description:`'${r??`the configured model`}' is not in the server's cache yet; downloading now. A first test can take a few minutes; the model is then cached for good.`}))}catch{}let n=await aj(i,r,e),a=f.spaces?.[e]?.dim??t.spaces?.[e]?.dim,o=n.dim>0&&a!==void 0&&n.dim!==a;(o||n.dim>0&&a===void 0)&&O(e,`dim`,String(n.dim)),d({title:o?`Backend answered; dimensions corrected`:`Backend answered`,description:o?`Returned ${n.dim}-d but '${e}' was set to ${a}-d. Dimensions updated to ${n.dim}; save to apply. (${n.latencyMs} ms)`:`${n.dim}-d in ${n.latencyMs} ms`})}catch(e){d({title:`Test failed`,description:e instanceof Error?e.message:`Backend unreachable`,variant:`destructive`})}finally{_(null),y(!1)}},I=(0,X.useMemo)(()=>{let e=[];for(let[n,r]of Object.entries(f.providers||{})){let i=r.type??t.providers?.[n]?.type,a=i?cj[i]?.url?.key:void 0;if(!a)continue;let o=fj(r[a]);o&&e.push(`${n}: ${o}`)}return e},[f.providers,t.providers]),te=(0,X.useMemo)(()=>JSON.stringify(f)!==JSON.stringify(e)||m.size>0,[f,e,m]),L=async()=>{if(I.length>0){d({title:`Fix the endpoint first`,description:I.join(` · `),variant:`destructive`});return}await u(GA(f,m)),h(new Set)},R=e=>T(t=>t===e?null:e);return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[i&&(0,Z.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive-subtle p-3 text-xs`,children:[(0,Z.jsx)(dr,{className:`mt-0.5 h-4 w-4 shrink-0 text-destructive`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Stored config does not resolve; defaults are standing in`}),(0,Z.jsx)(`p`,{className:`mt-0.5 font-mono text-[11px] text-muted-foreground`,children:i})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(pj,{title:`Search models`,hint:`Choose a provider and model for each kind of content. After switching models, fill the new index to make existing documents searchable. Previous model indexes are preserved.`}),E.length===0?(0,Z.jsxs)(`div`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:`No spaces on this layer`}),(0,Z.jsx)(`p`,{className:`mx-auto mt-1 max-w-sm text-xs text-muted-foreground`,children:`A space needs a backend, a model and a dimension count. Add one below to start embedding.`})]}):(0,Z.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:E.map(e=>{let s=f.spaces?.[e]||{},l=t.spaces?.[e]||{},u=n.spaces?.[e]||{},d=r?.[e],p=`space:${e}`,m=w===p,h=s.model??l.model,_=s.provider??l.provider,y=s.dim??l.dim,b=s.chunk??l.chunk??!1,x=a?.includes(e)??!1;return(0,Z.jsxs)(`div`,{className:`relative`,children:[(0,Z.jsx)(`span`,{className:K(`absolute inset-y-0 left-0 w-[3px]`,yj[i?`unresolved`:x?`needs-fill`:h?`configured`:`unset`]),"aria-hidden":!0}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 py-3 pl-4 pr-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,Z.jsx)(`span`,{className:K(`text-[11px]`,sj),children:e}),(0,Z.jsx)(`span`,{className:`truncate font-mono text-sm`,children:h||`no model set`}),_&&(0,Z.jsxs)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground`,children:[`via `,_]}),y!==void 0&&(0,Z.jsxs)(`span`,{className:`text-xs tabular-nums text-muted-foreground`,children:[y,`-d`]}),b&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`chunked`})]}),r&&h&&(0,Z.jsxs)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,title:`Vector table backing this space`,children:[`└─ `,d?.table??(0,Z.jsx)(`span`,{className:`not-italic`,children:`not created yet`})]}),x&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-warning`,children:`New table, nothing embedded in it yet; dense search stays thin for this space until it is filled. Reverting the model is still instant.`})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[x&&o&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>o(e),children:`Fill`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:c||g!==null,onClick:()=>F(e),title:`Round-trip a real embedding call against this backend and report the dimensions it returns`,children:[(0,Z.jsx)(lr,{className:`mr-1.5 h-3.5 w-3.5`}),g===e?v?`Downloading…`:`Testing…`:`Test`]}),(0,Z.jsx)(vj,{open:m,onClick:()=>R(p),label:`Edit ${e}`})]})]}),m&&(0,Z.jsxs)(`div`,{className:`border-t bg-muted/40 py-4 pl-4 pr-3`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Backend`}),(0,Z.jsx)(mj,{overridden:s.provider!==void 0,source:u.provider})]}),(0,Z.jsxs)(`select`,{className:oj,disabled:c,value:s.provider??``,onChange:t=>O(e,`provider`,t.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:l.provider?`inherited: ${l.provider}`:`inherited`}),D.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))]})]}),(0,Z.jsx)(hj,{label:`Model`,mono:!0,value:s.model,inheritedValue:l.model,onChange:t=>O(e,`model`,t),disabled:c}),(0,Z.jsx)(hj,{label:`Dimensions`,type:`number`,value:s.dim,inheritedValue:l.dim,onChange:t=>O(e,`dim`,t),disabled:c,hint:`Sizes the vector table. Test asks the backend and fills in what it really returns.`}),(0,Z.jsx)(hj,{label:`Max length`,type:`number`,value:s.maxLength,inheritedValue:l.maxLength,onChange:t=>O(e,`maxLength`,t),disabled:c})]}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-4`,children:[(0,Z.jsx)(gj,{label:`Chunk long inputs`,checked:b,overridden:s.chunk!==void 0,disabled:c,onChange:t=>k(e,`chunk`,t)}),(0,Z.jsx)(gj,{label:`Build ANN index`,checked:s.annIndex??l.annIndex??!0,overridden:s.annIndex!==void 0,disabled:c,onChange:t=>k(e,`annIndex`,t)})]})]})]},e)})}),!c&&(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(q,{value:S,onChange:e=>C(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),N())},placeholder:`new space name (e.g. audio)`,className:`h-8 w-full max-w-xs text-sm sm:w-auto`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:N,children:[(0,Z.jsx)(br,{className:`mr-1.5 h-3.5 w-3.5`}),`Add space`]})]})]}),(0,Z.jsxs)(`section`,{children:[(0,Z.jsx)(pj,{title:`Model providers`,hint:`Connect a service here, then select it under Search models above. Built-in providers work without an extra connection. Provider changes take effect when you save.`}),(0,Z.jsx)(`div`,{className:`divide-y overflow-hidden rounded-lg border`,children:D.map(e=>{let n=f.providers?.[e]||{},r=t.providers?.[e]||{},i=HA.includes(e),a=f.providers?.[e]!==void 0,o=`provider:${e}`,s=w===o,l=n.type??r.type,u=l?cj[l]:void 0,d=u?.url?fj(n[u.url.key]):null,p={...r,...n},h=lj.filter(e=>!(n[e]===void 0||e===u?.url?.key||e===`apiKey`&&u?.apiKey||e===`cacheDir`&&u?.cacheDir)),g=E.filter(n=>(f.spaces?.[n]?.provider??t.spaces?.[n]?.provider)===e);return(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 px-4 py-3 sm:flex-row sm:items-start sm:gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2 gap-y-1`,children:[(0,Z.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:e}),(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:l??`no type`}),i&&(0,Z.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`built-in`}),p.apiKeySet&&!m.has(e)&&(0,Z.jsx)(`span`,{className:`text-[10px] font-medium text-success`,children:`key set`}),d&&(0,Z.jsx)(`span`,{className:`text-[10px] font-medium text-destructive`,children:`check endpoint`})]}),(0,Z.jsx)(`p`,{className:`mt-1 truncate font-mono text-[11px] text-muted-foreground`,children:u?u.where(p):`—`}),g.length>0&&(0,Z.jsxs)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`used by `,g.join(`, `)]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1 max-sm:justify-end`,children:[a&&!i&&!c&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>M(e),title:`Remove this override`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(vj,{open:s,onClick:()=>R(o),label:`Edit ${e}`})]})]}),s&&(0,Z.jsxs)(`div`,{className:`border-t bg-muted/40 px-4 py-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Type`}),(0,Z.jsx)(mj,{overridden:n.type!==void 0,source:r.type})]}),(0,Z.jsxs)(`select`,{className:oj,disabled:c,value:n.type??``,onChange:t=>A(e,`type`,t.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:r.type?`inherited: ${r.type}`:`inherited`}),VA.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e)),l&&!VA.includes(l)&&(0,Z.jsxs)(`option`,{value:l,children:[l,` (legacy)`]})]}),u?.note&&(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:u.note})]}),u?.url&&(0,Z.jsx)(hj,{label:u.url.label,mono:!0,value:n[u.url.key],inheritedValue:r[u.url.key],onChange:t=>A(e,u.url.key,t),disabled:c,placeholder:r[u.url.key]??u.url.placeholder,hint:u.url.hint,error:d??void 0}),u?.cacheDir&&(0,Z.jsx)(hj,{label:`Cache directory`,mono:!0,value:n.cacheDir,inheritedValue:r.cacheDir,onChange:t=>A(e,`cacheDir`,t),disabled:c,placeholder:r.cacheDir??`server default`,hint:u.cacheDir}),u?.imageInput&&(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Image input shape`}),(0,Z.jsx)(mj,{overridden:n.imageInput!==void 0,source:r.imageInput})]}),(0,Z.jsxs)(`select`,{className:oj,disabled:c,value:n.imageInput??``,onChange:t=>A(e,`imageInput`,t.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:r.imageInput?`inherited: ${r.imageInput}`:`inherited: data-uri`}),uj.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))]}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:uj.find(e=>e.value===(n.imageInput??r.imageInput??`data-uri`))?.hint})]}),u?.timeoutMs&&(0,Z.jsx)(hj,{label:`Request timeout (ms)`,type:`number`,value:n.timeoutMs,inheritedValue:r.timeoutMs??dj,onChange:t=>A(e,`timeoutMs`,t),disabled:c,hint:`How long to wait for a batch before giving up. Raise it for a slow or cold GPU host.`}),u?.apiKey&&(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`API key`}),m.has(e)&&(0,Z.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,children:`will be written`})]}),(0,Z.jsx)(q,{type:`password`,autoComplete:`new-password`,disabled:c,value:n.apiKey??``,onChange:t=>A(e,`apiKey`,t.target.value),placeholder:r.apiKeySet?`•••••••• (stored; leave empty to keep)`:`unset`,className:`h-8 text-sm`}),(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[u.apiKey,` Write-only: the stored key is never sent back, and leaving this empty keeps whatever is stored.`]})]})]}),u?.headers&&(0,Z.jsx)(_j,{disabled:c,storedNames:r.headerNames,value:n.headers,onChange:t=>j(e,`headers`,t)}),h.length>0&&!c&&(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2 rounded-md border border-dashed p-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`Not used by type `,(0,Z.jsx)(`span`,{className:`font-mono`,children:l}),`:`,` `,(0,Z.jsx)(`span`,{className:`font-mono`,children:h.join(`, `)})]}),(0,Z.jsx)(`button`,{type:`button`,className:`underline hover:text-foreground`,onClick:()=>h.forEach(t=>A(e,t,``)),children:`clear`})]}),r.headerNames&&r.headerNames.length>0&&(0,Z.jsxs)(`p`,{className:`mt-3 text-[11px] text-muted-foreground`,children:[`Stored custom headers: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:r.headerNames.join(`, `)}),` (values not shown)`]})]})]},e)})}),!c&&(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(q,{value:b,onChange:e=>x(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),P(b.trim()))},placeholder:`new backend name (e.g. gpu)`,className:`h-8 w-full max-w-xs text-sm sm:w-auto`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:()=>P(b.trim()),children:[(0,Z.jsx)(br,{className:`mr-1.5 h-3.5 w-3.5`}),`Add backend`]}),UA.filter(e=>!D.includes(e.id)).map(e=>(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>P(e.id,e.baseUrl),title:`Add an openai-type backend '${e.id}' pointed at ${e.baseUrl}`,children:e.label},e.id))]})]}),!c&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-4`,children:[(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:te?`default`:`outline`,onClick:L,disabled:s||!te||I.length>0,children:s?`Saving…`:l}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:s||!te,onClick:()=>{p(structuredClone(e)),h(new Set)},children:`Discard changes`}),(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:I.length>0?(0,Z.jsxs)(`span`,{className:`font-medium text-destructive`,children:[I.length,` endpoint `,I.length===1?`needs`:`need`,` fixing`]}):te?`Unsaved changes`:`Everything saved`})]})]})}function xj(){let{showToast:e}=wo(),[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!0),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(null),l=(0,X.useCallback)(()=>ej().then(e=>{n(e),c(null)}).catch(e=>c(e instanceof Error?e.message:`Failed to load embedding defaults`)).finally(()=>i(!1)),[]);(0,X.useEffect)(()=>{l()},[l]);let u=()=>{i(!0),l()};return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6`,title:`Search & AI defaults`,onBack:yD(),description:`Your account · Choose the embedding models used for text and image search. Workspace settings override these defaults. Running workspaces adopt new defaults when restarted.`,actions:(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:u,disabled:r,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})}),r?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):s||!t?(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Embedding defaults unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:s||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:u,children:`Retry`})]}):(0,Z.jsx)(bj,{value:t.user||{},effective:t.effective||{},inherited:t.serverDefaults||{},invalid:t.invalid,saving:a,saveLabel:`Save defaults`,onSave:async t=>{o(!0);try{let n=await tj(t);e({title:`Defaults saved`,description:n.restartRequired?`${n.workspaces.length} running workspace(s) keep their current tables until restarted. Set the config on a workspace directly to change it live.`:`New workspaces will inherit this.`}),await l()}catch(t){e({title:`Save failed`,description:t instanceof Error?t.message:`Failed to save`,variant:`destructive`})}finally{o(!1)}}},JSON.stringify(t.user))]})}function Sj(){let e=vn(),{showToast:t}=wo(),n=new URLSearchParams(e.search),r=e=>{try{let t=new URL(e);return t.pathname.includes(`/rest/v2/workspaces/`)&&!t.pathname.includes(`/rest/v2/pub/`)?t.pathname=t.pathname.replace(`/rest/v2/workspaces/`,`/rest/v2/pub/workspaces/`):t.pathname.includes(`/rest/v2/contexts/`)&&!t.pathname.includes(`/rest/v2/pub/`)&&(t.pathname=t.pathname.replace(`/rest/v2/contexts/`,`/rest/v2/pub/contexts/`)),t.toString()}catch{return e}},i=r(n.get(`url`)||``),a=sessionStorage.getItem(`sharedToken:last`)||``,[o,s]=(0,X.useState)(i),[c,l]=(0,X.useState)(a),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)([]),[m,h]=(0,X.useState)(!1),g=(0,X.useMemo)(()=>{try{let e=new URL(o);return e.pathname.includes(`/pub/workspaces/`)?`workspace`:e.pathname.includes(`/pub/contexts/`)?`context`:`unknown`}catch{return`unknown`}},[o]),_=()=>({Authorization:`Bearer ${c.trim()}`}),v=async()=>{if(!(!o||!c)){h(!0);try{let e=r(o),t=await J.get(e,{skipAuth:!0,headers:_()});d(t);let n=await J.get(`${e}/documents`,{skipAuth:!0,headers:_()}),i=Array.isArray(n)?n:Array.isArray(n?.data)?n.data:[];p(Array.isArray(i)?i:[])}catch(e){let n=o.includes(`/rest/v2/workspaces/`)?`Ensure the URL uses /rest/v2/pub/workspaces/<workspace-id> and the token matches that workspace.`:o.includes(`/rest/v2/contexts/`)?`Ensure the URL uses /rest/v2/pub/contexts/<context-id>.`:void 0;t({title:`Error`,description:`${e instanceof Error?e.message:`Failed to load shared resource`}${n?`: ${n}`:``}`,variant:`destructive`}),d(null),p([])}finally{h(!1)}}},y=(0,X.useRef)(v);return(0,X.useEffect)(()=>{y.current()},[]),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(sw,{onBack:yD(),title:`Shared Resource Viewer`,description:`Open a resource someone shared with you.`}),(0,Z.jsxs)(`div`,{className:`grid gap-2 md:grid-cols-3`,children:[(0,Z.jsx)(q,{value:o,onChange:e=>s(e.target.value),placeholder:`Full pub URL`}),(0,Z.jsx)(q,{value:c,onChange:e=>l(e.target.value),placeholder:`Access token (canvas-...)`}),(0,Z.jsx)(Y,{onClick:v,disabled:m||!o||!c,children:`Load`})]}),(0,Z.jsxs)(`div`,{className:`text-sm text-muted-foreground`,children:[`Type: `,g]}),m?(0,Z.jsx)(`div`,{className:`text-center py-8 text-muted-foreground`,children:`Loading...`}):(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`border rounded p-3`,children:[(0,Z.jsx)(`h2`,{className:`font-semibold mb-2`,children:`Metadata`}),(0,Z.jsx)(`pre`,{className:`text-xs overflow-auto max-h-80`,children:JSON.stringify(u,null,2)})]}),(0,Z.jsxs)(`div`,{className:`border rounded p-3`,children:[(0,Z.jsxs)(`h2`,{className:`font-semibold mb-2`,children:[`Documents (`,f.length,`)`]}),f.length===0?(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`No documents`}):(0,Z.jsx)(`ul`,{className:`space-y-2 text-sm`,children:f.slice(0,100).map((e,t)=>(0,Z.jsxs)(`li`,{className:`border rounded p-2`,children:[(0,Z.jsx)(`div`,{className:`font-mono text-xs`,children:e.id}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.schema})]},t))})]})]}),(0,Z.jsx)(au,{className:`mt-8`})]})}function Cj(e={}){let t=new URLSearchParams;e.tail&&t.set(`tail`,String(e.tail)),e.level&&t.set(`level`,e.level),e.module&&t.set(`module`,e.module);let n=t.toString();return n?`?${n}`:``}function wj(){let e=localStorage.getItem(`authToken`);if(!e)throw Error(`Authentication required`);let t=localStorage.getItem(`appName`)||window.location.hostname;return{Authorization:`Bearer ${e}`,"X-App-Name":t,Accept:`text/event-stream`}}var Tj={users:{async listUsers(e){let t=new URLSearchParams;e?.status&&t.append(`status`,e.status),e?.userType&&t.append(`userType`,e.userType);let n=t.toString(),r=n?`${no.admin.users}?${n}`:no.admin.users;return await J.get(r)},async getUser(e){return await J.get(`${no.admin.users}/${e}`)},async createUser(e){return await J.post(no.admin.users,e)},async updateUser(e,t){return await J.put(`${no.admin.users}/${e}`,t)},async deleteUser(e){await J.delete(`${no.admin.users}/${e}`)}},workspaces:{async listAllWorkspaces(){return await J.get(no.admin.workspaces)},async createWorkspace(e){return await J.post(no.admin.workspaces,e)},async deleteWorkspace(e){await J.delete(`${no.admin.workspaces}/${e}`)}},logs:{async getLogs(e={}){return(await J.get(`${no.admin.logs}${Cj(e)}`)).logs||[]},async streamLogs(e={},t={}){let{signal:n,onEntry:r,onError:i}=t;try{let t=await fetch(`${no.admin.logsStream}${Cj(e)}`,{method:`GET`,headers:wj(),credentials:`include`,signal:n});if(!t.ok)throw Error(`Failed to open log stream (${t.status})`);if(!t.body)throw Error(`Streaming is not supported by this browser`);let i=t.body.getReader(),a=new TextDecoder,o=``,s=e=>{let t=e.split(`
|
|
32
32
|
`),n=`message`,i=[];for(let e of t)if(!(!e||e.startsWith(`:`))){if(e.startsWith(`event:`)){n=e.slice(6).trim();continue}e.startsWith(`data:`)&&i.push(e.slice(5).trim())}if(n!==`log`||i.length===0)return;let a=JSON.parse(i.join(`
|
|
33
33
|
`));r?.(a)};try{for(;;){let{done:e,value:t}=await i.read();if(e)break;o+=a.decode(t,{stream:!0});let n=o.split(`
|
|
34
34
|
|
|
35
|
-
`);o=n.pop()||``;for(let e of n)s(e)}o.trim()&&s(o)}finally{i.releaseLock()}}catch(e){if(n?.aborted)return;let t=e instanceof Error?e:Error(String(e));throw i?.(t),t}}}},Tj=()=>{let e=[`#FF6B6B`,`#4ECDC4`,`#45B7D1`,`#96CEB4`,`#FECA57`,`#FF9FF3`,`#54A0FF`,`#5F27CD`,`#00D2D3`,`#FF9F43`,`#10AC84`,`#EE5A24`,`#EA2027`,`#009432`,`#0652DD`];return e[Math.floor(Math.random()*e.length)]};function Ej(){let e=du()?.userType===`admin`,[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(e),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(e?null:`Access denied. Admin privileges required.`),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)({search:``,owner:``,type:``,status:``}),[_,v]=(0,X.useState)({userId:``,name:``,label:``,description:``,color:Tj(),type:`workspace`}),{showToast:y}=wo(),b=(0,X.useCallback)(async()=>{try{o(!0);let e=await wj.workspaces.listAllWorkspaces();n(e),u(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch workspaces`;u(t),y({title:`Error`,description:t,variant:`destructive`})}finally{o(!1)}},[y]);(0,X.useEffect)(()=>{e&&b()},[e,b]);let x=(0,X.useCallback)(async()=>{try{c(!0);let e=await wj.users.listUsers({status:`active`});i(e)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch users`;y({title:`Error`,description:t,variant:`destructive`})}finally{c(!1)}},[y]),S=async e=>{if(e.preventDefault(),!_.userId||!_.name.trim()){y({title:`Validation Error`,description:`User and workspace name are required`,variant:`destructive`});return}f(!0);try{let e={userId:_.userId,name:_.name.trim(),label:_.label.trim()||_.name.trim(),description:_.description.trim(),color:_.color,type:_.type};await wj.workspaces.createWorkspace(e),v({userId:``,name:``,label:``,description:``,color:Tj(),type:`workspace`}),m(!1),await b(),y({title:`Success`,description:`Workspace created successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to create workspace`;y({title:`Error`,description:t,variant:`destructive`})}finally{f(!1)}},C=async(e,t)=>{if(confirm(`Are you sure you want to delete workspace "${t}"? This action cannot be undone and will delete all data in the workspace.`))try{await wj.workspaces.deleteWorkspace(e),await b(),y({title:`Success`,description:`Workspace deleted successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to delete workspace`;y({title:`Error`,description:t,variant:`destructive`})}},w=async()=>{v({userId:``,name:``,label:``,description:``,color:Tj(),type:`workspace`}),m(!0),await x()},T=()=>{m(!1)};Ae(T,p);let E=t.filter(e=>{let t=h.search===``||e.name.toLowerCase().includes(h.search.toLowerCase())||e.label.toLowerCase().includes(h.search.toLowerCase())||e.ownerName&&e.ownerName.toLowerCase().includes(h.search.toLowerCase())||e.ownerEmail&&e.ownerEmail.toLowerCase().includes(h.search.toLowerCase()),n=h.owner===``||e.owner===h.owner,r=h.type===``||e.type===h.type,i=h.status===``||e.status===h.status;return t&&n&&r&&i}),D=Array.from(new Set(t.map(e=>e.owner))).map(e=>{let n=t.find(t=>t.owner===e);return{id:e,name:n?.ownerName||n?.ownerEmail||e}});return e?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`Workspace Administration`,description:`Manage workspaces across all users`}),t.some(e=>e.status!==`active`&&e.protection?.mode&&e.protection.mode!==`none`)&&(0,Z.jsxs)(`p`,{className:`text-sm rounded border p-3`,children:[t.filter(e=>e.status!==`active`&&e.protection?.mode&&e.protection.mode!==`none`).length,` protected workspaces waiting for their owners to start them.`]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center md:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Z.jsx)(q,{placeholder:`Search workspaces...`,value:h.search,onChange:e=>g(t=>({...t,search:e.target.value})),className:`md:w-64`}),(0,Z.jsxs)(`select`,{value:h.owner,onChange:e=>g(t=>({...t,owner:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Owners`}),D.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,Z.jsxs)(`select`,{value:h.type,onChange:e=>g(t=>({...t,type:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Types`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Z.jsx)(`option`,{value:`universe`,children:`Universe`})]}),(0,Z.jsxs)(`select`,{value:h.status,onChange:e=>g(t=>({...t,status:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Z.jsx)(`option`,{value:`active`,children:`Active`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Z.jsx)(`option`,{value:`error`,children:`Error`})]})]}),(0,Z.jsxs)(Y,{onClick:w,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Workspace`]})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[a&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading workspaces...`}),l&&!t.length&&(0,Z.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Z.jsx)(`p`,{children:l})}),!a&&!l&&E.length===0&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No workspaces found`}),E.length>0&&(0,Z.jsx)(`div`,{className:`border rounded-md`,children:(0,Z.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Z.jsxs)(`table`,{className:`w-full`,children:[(0,Z.jsx)(`thead`,{children:(0,Z.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Label`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Owner`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Type`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Status`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Color`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Z.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Z.jsx)(`tbody`,{children:E.map(e=>(0,Z.jsxs)(`tr`,{className:`border-t`,children:[(0,Z.jsx)(`td`,{className:`p-3 font-medium font-mono text-sm`,children:e.name}),(0,Z.jsx)(`td`,{className:`p-3`,children:e.label}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(ar,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`font-medium`,children:e.ownerName||`Unknown`}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.ownerEmail})]})]})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.type===`universe`?`bg-accent text-primary`:`bg-info-subtle text-info`}`,children:e.type})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.status===`active`?`bg-success-subtle text-success`:e.status===`inactive`?`bg-warning-subtle text-warning`:`bg-destructive-subtle text-destructive`}`,children:e.status})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`div`,{className:`w-4 h-4 rounded border`,style:{backgroundColor:e.color}}),(0,Z.jsx)(`span`,{className:`font-mono text-xs`,children:e.color})]})}),(0,Z.jsx)(`td`,{className:`p-3`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Z.jsxs)(`td`,{className:`p-3 text-right space-x-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>window.open(`/workspaces/${e.name}`,`_blank`),title:`View workspace`,children:(0,Z.jsx)(ja,{className:`h-4 w-4`})}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>C(e.id,e.name),className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,title:`Delete workspace`,disabled:e.type===`universe`,children:(0,Z.jsx)(ti,{className:`h-4 w-4`})})]})]},e.id))})]})})})]}),(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-4 mt-8`,children:[(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:t.length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Total Workspaces`})]}),(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:t.filter(e=>e.status===`active`).length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Active Workspaces`})]}),(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:t.filter(e=>e.type===`universe`).length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Universe Workspaces`})]}),(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:D.length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Unique Owners`})]})]}),p&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-card rounded-lg p-6 w-full max-w-md mx-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-semibold`,children:`Create New Workspace`}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:T,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`form`,{onSubmit:S,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`userId`,children:`User`}),(0,Z.jsxs)(`select`,{id:`userId`,value:_.userId,onChange:e=>v(t=>({...t,userId:e.target.value})),disabled:d||s,className:`w-full px-3 py-2 border border-border rounded-md`,required:!0,children:[(0,Z.jsx)(`option`,{value:``,children:`Select a user...`}),r.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.email,`)`]},e.id))]}),s&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Loading users...`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Workspace Name`}),(0,Z.jsx)(q,{id:`name`,type:`text`,value:_.name,onChange:e=>v(t=>({...t,name:e.target.value})),placeholder:`my-workspace`,disabled:d,required:!0}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Lowercase letters, numbers, and hyphens only`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`label`,children:`Display Label`}),(0,Z.jsx)(q,{id:`label`,type:`text`,value:_.label,onChange:e=>v(t=>({...t,label:e.target.value})),placeholder:`My Workspace`,disabled:d})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`description`,children:`Description`}),(0,Z.jsx)(q,{id:`description`,type:`text`,value:_.description,onChange:e=>v(t=>({...t,description:e.target.value})),placeholder:`Workspace description (optional)`,disabled:d})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`type`,children:`Type`}),(0,Z.jsxs)(`select`,{id:`type`,value:_.type,onChange:e=>v(t=>({...t,type:e.target.value})),disabled:d,className:`w-full px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Z.jsx)(`option`,{value:`universe`,children:`Universe`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`color`,children:`Color`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(q,{id:`color`,type:`color`,value:_.color,onChange:e=>v(t=>({...t,color:e.target.value})),className:`h-10 w-16 p-1`,disabled:d}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>v(e=>({...e,color:Tj()})),disabled:d,children:`Random`})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-4`,children:[(0,Z.jsx)(Y,{type:`submit`,disabled:d||s,className:`flex-1`,children:d?`Creating...`:`Create Workspace`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:T,disabled:d,children:`Cancel`})]})]})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function Dj(){let e=du()?.userType===`admin`;return(0,X.useEffect)(()=>{},[e]),e?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`All Contexts`,description:`Manage all contexts across all users`}),(0,Z.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Z.jsxs)(`div`,{className:`text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Global context management is currently under development. Check back later for updates.`})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function Oj(){let e=du()?.userType===`admin`;return(0,X.useEffect)(()=>{},[e]),e?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`All Agents`,description:`Manage all AI agents across all users`}),(0,Z.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Z.jsxs)(`div`,{className:`text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Global agent management is currently under development. Check back later for updates.`})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}var kj={tail:200,level:``,module:``};function Aj(e){return e.slice(-1e3)}function jj(e){switch(e.levelLabel){case`fatal`:return`text-destructive`;case`error`:return`text-destructive`;case`warn`:return`text-warning`;case`info`:return`text-info`;case`debug`:return`text-muted-foreground`;case`trace`:return`text-muted-foreground`;default:return`text-success`}}function Mj(){let e=yD(),t=du()?.userType===`admin`,{showToast:n}=wo(),r=(0,X.useRef)(null),[i,a]=(0,X.useState)(kj),[o,s]=(0,X.useState)(kj),[c,l]=(0,X.useState)([]),[u,d]=(0,X.useState)(t),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(t?null:`Access denied. Admin privileges required.`),v=(0,X.useCallback)(async e=>{try{d(!0);let t=await wj.logs.getLogs(e);l(Aj(t)),_(null)}catch(e){let t=e instanceof Error?e.message:`Failed to load server logs`;_(t),n({title:`Error`,description:t,variant:`destructive`})}finally{d(!1)}},[n]);(0,X.useEffect)(()=>{t&&v(i)},[i,t,v]),(0,X.useEffect)(()=>{if(!t||m)return;let e=new AbortController;return p(!0),wj.logs.streamLogs(i,{signal:e.signal,onEntry:e=>{l(t=>Aj([...t,e]))},onError:e=>{_(e.message)}}).catch(e=>{let t=e instanceof Error?e.message:`Log stream stopped`;_(t),n({title:`Stream error`,description:t,variant:`destructive`})}).finally(()=>{p(!1)}),()=>{e.abort()}},[i,t,m,n]),(0,X.useEffect)(()=>{!r.current||m||(r.current.scrollTop=r.current.scrollHeight)},[c,m]);let y=()=>{a({tail:Math.min(Math.max(Number(o.tail)||kj.tail,1),500),level:o.level||``,module:o.module.trim()})},b=(0,X.useMemo)(()=>[{value:``,label:`All levels`},{value:`trace`,label:`Trace`},{value:`debug`,label:`Debug`},{value:`info`,label:`Info`},{value:`warn`,label:`Warn`},{value:`error`,label:`Error`},{value:`fatal`,label:`Fatal`}],[]);return t?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{onBack:e,title:`Server Logs`,description:`Live tail for the unified canvas-server logger`,actions:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(ui,{className:`w-4 h-4 ${f?`text-success`:`text-muted-foreground`}`}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:m?`Paused`:f?`Streaming`:`Disconnected`})]})}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-[140px_180px_1fr_auto]`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`tail`,children:`Tail`}),(0,Z.jsx)(q,{id:`tail`,type:`number`,min:1,max:500,value:o.tail,onChange:e=>s(t=>({...t,tail:Number(e.target.value)}))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`level`,children:`Level`}),(0,Z.jsx)(`select`,{id:`level`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:o.level,onChange:e=>s(t=>({...t,level:e.target.value})),children:b.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value||`all`))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`module`,children:`Module filter`}),(0,Z.jsx)(q,{id:`module`,placeholder:`auth, http, workspace...`,value:o.module,onChange:e=>s(t=>({...t,module:e.target.value}))})]}),(0,Z.jsx)(`div`,{className:`flex items-end`,children:(0,Z.jsx)(Y,{onClick:y,className:`w-full`,children:`Apply`})})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>h(e=>!e),children:[m?(0,Z.jsx)(Ar,{className:`w-4 h-4 mr-2`}):(0,Z.jsx)(Jr,{className:`w-4 h-4 mr-2`}),m?`Resume`:`Pause`]}),(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>v(i),children:[(0,Z.jsx)(Ba,{className:`w-4 h-4 mr-2`}),`Refresh`]}),(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>l([]),children:[(0,Z.jsx)(Qr,{className:`w-4 h-4 mr-2`}),`Clear buffer`]}),(0,Z.jsxs)(`span`,{className:`text-sm text-muted-foreground ml-auto`,children:[`Showing `,c.length,` lines`]})]}),g&&(0,Z.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive`,children:g}),(0,Z.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,Z.jsx)(`div`,{ref:r,"data-scheme":`dark`,className:`bg-background text-success font-mono text-xs h-viewport-pane overflow-auto p-4 rounded-md`,children:u?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading logs...`}):c.length===0?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Z.jsx)(`div`,{className:`whitespace-pre-wrap break-words`,children:c.map((e,t)=>(0,Z.jsx)(`div`,{className:jj(e),children:e.line},`${e.time||`log`}-${t}`))})})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}var Nj={async listRoles(e){let t=new URLSearchParams;e?.type&&t.append(`type`,e.type),e?.userId&&t.append(`userId`,e.userId),e?.workspaceId&&t.append(`workspaceId`,e.workspaceId),e?.status&&t.append(`status`,e.status);let n=t.toString(),r=n?`${no.roles}?${n}`:no.roles;return(await J.get(r)).roles||[]},async getRole(e){return(await J.get(`${no.roles}/${e}`)).role},async createRole(e){return(await J.post(no.roles,e)).role},async deleteRole(e,t=!1){let n=t?`?force=true`:``;await J.delete(`${no.roles}/${e}${n}`)},async startRole(e){return(await J.post(`${no.roles}/${e}/start`,{})).role},async stopRole(e){await J.post(`${no.roles}/${e}/stop`,{})},async restartRole(e){return(await J.post(`${no.roles}/${e}/restart`,{})).role},async getRoleLogs(e,t=100){return(await J.get(`${no.roles}/${e}/logs?tail=${t}`)).logs||[]},async getRoleStats(e){return(await J.get(`${no.roles}/${e}/stats`)).stats},async getRoleHealth(e){return(await J.get(`${no.roles}/${e}/health`)).health},async listTemplates(){return(await J.get(`${no.roleTemplates}`)).templates||[]},async getTemplate(e){return(await J.get(`${no.roleTemplates}/${e}`)).template}};function Pj({status:e}){let t={running:{icon:kr,color:`text-success`,bg:`bg-success-subtle`,label:`Running`},stopped:{icon:Bn,color:`text-muted-foreground`,bg:`bg-muted`,label:`Stopped`},starting:{icon:Zn,color:`text-info`,bg:`bg-info-subtle`,label:`Starting`},stopping:{icon:Zn,color:`text-warning`,bg:`bg-warning-subtle`,label:`Stopping`},error:{icon:er,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Error`},created:{icon:ui,color:`text-muted-foreground`,bg:`bg-muted`,label:`Created`},configured:{icon:ui,color:`text-info`,bg:`bg-info-subtle`,label:`Configured`},removed:{icon:Bn,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Removed`}},n=t[e]||t.created,r=n.icon;return(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${n.bg} ${n.color}`,children:[(0,Z.jsx)(r,{className:`w-3 h-3`}),n.label]})}function Fj({type:e}){return(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${e===`global`?`bg-accent text-primary`:`bg-info-subtle text-info`}`,children:[(0,Z.jsx)(pi,{className:`w-3 h-3`}),e===`global`?`Global`:`Workspace`]})}function Ij(){let e=yD(),t=du()?.userType===`admin`,[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)([]),[o,s]=(0,X.useState)(t),[c,l]=(0,X.useState)(t?null:`Access denied. Admin privileges required.`),[u,d]=(0,X.useState)(!1);Ae(()=>d(!1),u);let[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(!1);Ae(()=>h(!1),m);let[g,_]=(0,X.useState)([]),[v,y]=(0,X.useState)({type:``,status:``,search:``}),[b,x]=(0,X.useState)({template:``,name:``,type:`global`}),{showToast:S}=wo(),C=(0,X.useRef)(v);(0,X.useEffect)(()=>{C.current=v},[v]);let w=(0,X.useCallback)(async()=>{try{s(!0);let{type:e,status:t}=C.current,n=await Nj.listRoles({type:e||void 0,status:t||void 0});r(n),l(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch roles`;l(t)}finally{s(!1)}},[]),T=(0,X.useCallback)(async()=>{try{let e=await Nj.listTemplates();a(e)}catch(e){console.error(`Failed to fetch templates:`,e)}},[]);(0,X.useEffect)(()=>{t&&(w(),T())},[t,w,T]);let E=async()=>{if(!b.template||!b.name){S({title:`Validation Error`,description:`Template and name are required`,variant:`destructive`});return}try{await Nj.createRole(b),S({title:`Success`,description:`Role "${b.name}" created successfully`}),d(!1),M(),w()}catch(e){let t=e instanceof Error?e.message:`Failed to create role`;S({title:`Error`,description:t,variant:`destructive`})}},D=async e=>{try{await Nj.startRole(e.id),S({title:`Success`,description:`Role "${e.name}" started successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to start role`;S({title:`Error`,description:t,variant:`destructive`})}},O=async e=>{try{await Nj.stopRole(e.id),S({title:`Success`,description:`Role "${e.name}" stopped successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to stop role`;S({title:`Error`,description:t,variant:`destructive`})}},k=async e=>{try{await Nj.restartRole(e.id),S({title:`Success`,description:`Role "${e.name}" restarted successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to restart role`;S({title:`Error`,description:t,variant:`destructive`})}},A=async e=>{if(confirm(`Are you sure you want to delete role "${e.name}"?`))try{await Nj.deleteRole(e.id,e.status===`running`),S({title:`Success`,description:`Role "${e.name}" deleted successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to delete role`;S({title:`Error`,description:t,variant:`destructive`})}},j=async e=>{try{let t=await Nj.getRoleLogs(e.id,100);_(t),p(e),h(!0)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch logs`;S({title:`Error`,description:t,variant:`destructive`})}},M=()=>{x({template:``,name:``,type:`global`})},N=()=>{M(),d(!0)},P=()=>{d(!1),M()},ee=n.filter(e=>!v.search||e.name.toLowerCase().includes(v.search.toLowerCase())||e.template.toLowerCase().includes(v.search.toLowerCase()));return t?c&&!t?(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:c})}):(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{onBack:e,title:`Role Management`,description:`Manage global and workspace roles for Canvas services`,actions:(0,Z.jsxs)(Y,{onClick:N,className:`gap-2`,children:[(0,Z.jsx)(br,{className:`w-4 h-4`}),`Create Role`]})}),(0,Z.jsxs)(`div`,{className:`flex gap-4 items-end`,children:[(0,Z.jsxs)(`div`,{className:`flex-1`,children:[(0,Z.jsx)(G,{htmlFor:`search`,children:`Search`}),(0,Z.jsx)(q,{id:`search`,placeholder:`Search by name or template...`,value:v.search,onChange:e=>y({...v,search:e.target.value})})]}),(0,Z.jsxs)(`div`,{className:`w-48`,children:[(0,Z.jsx)(G,{htmlFor:`type`,children:`Type`}),(0,Z.jsxs)(`select`,{id:`type`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:v.type,onChange:e=>y({...v,type:e.target.value}),children:[(0,Z.jsx)(`option`,{value:``,children:`All Types`}),(0,Z.jsx)(`option`,{value:`global`,children:`Global`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`})]})]}),(0,Z.jsxs)(`div`,{className:`w-48`,children:[(0,Z.jsx)(G,{htmlFor:`status`,children:`Status`}),(0,Z.jsxs)(`select`,{id:`status`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:v.status,onChange:e=>y({...v,status:e.target.value}),children:[(0,Z.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Z.jsx)(`option`,{value:`running`,children:`Running`}),(0,Z.jsx)(`option`,{value:`stopped`,children:`Stopped`}),(0,Z.jsx)(`option`,{value:`starting`,children:`Starting`}),(0,Z.jsx)(`option`,{value:`error`,children:`Error`})]})]}),(0,Z.jsxs)(Y,{onClick:w,variant:`outline`,children:[(0,Z.jsx)(Ba,{className:`w-4 h-4 mr-2`}),`Refresh`]})]}),o?(0,Z.jsx)(`div`,{className:`text-center py-8`,children:`Loading roles...`}):ee.length===0?(0,Z.jsxs)(`div`,{className:`text-center py-8 border rounded-lg`,children:[(0,Z.jsx)(pi,{className:`w-12 h-12 mx-auto text-muted-foreground mb-4`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:v.search||v.type||v.status?`No roles match your filters`:`No roles created yet`}),!v.search&&!v.type&&!v.status&&(0,Z.jsxs)(Y,{onClick:N,variant:`outline`,className:`mt-4`,children:[(0,Z.jsx)(br,{className:`w-4 h-4 mr-2`}),`Create Your First Role`]})]}):(0,Z.jsx)(`div`,{className:`border rounded-lg`,children:(0,Z.jsxs)(`table`,{className:`w-full`,children:[(0,Z.jsx)(`thead`,{className:`bg-muted/50`,children:(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Name`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Template`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Type`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Status`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Container`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Created`}),(0,Z.jsx)(`th`,{className:`text-right p-4 font-medium`,children:`Actions`})]})}),(0,Z.jsx)(`tbody`,{className:`divide-y`,children:ee.map(e=>(0,Z.jsxs)(`tr`,{className:`hover:bg-muted/50`,children:[(0,Z.jsx)(`td`,{className:`p-4 font-medium`,children:e.name}),(0,Z.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:e.template}),(0,Z.jsx)(`td`,{className:`p-4`,children:(0,Z.jsx)(Fj,{type:e.type})}),(0,Z.jsx)(`td`,{className:`p-4`,children:(0,Z.jsx)(Pj,{status:e.status})}),(0,Z.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:e.container?.name||`-`}),(0,Z.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Z.jsx)(`td`,{className:`p-4`,children:(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[e.status===`stopped`||e.status===`created`?(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(e),title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-4 h-4`})}):e.status===`running`?(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>O(e),title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-4 h-4`})}):null,e.status===`running`&&(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>k(e),title:`Restart`,children:(0,Z.jsx)(Ba,{className:`w-4 h-4`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>j(e),title:`View Logs`,children:(0,Z.jsx)(Ki,{className:`w-4 h-4`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>A(e),title:`Delete`,className:`text-destructive hover:text-destructive`,children:(0,Z.jsx)(ti,{className:`w-4 h-4`})})]})})]},e.id))})]})}),u&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsx)(`div`,{className:`bg-background rounded-lg shadow-elevation-3 max-w-lg w-full mx-4 max-h-viewport-modal overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(`h2`,{className:`text-xl font-bold`,children:`Create New Role`}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:P,children:(0,Z.jsx)(vr,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`template`,children:`Template *`}),(0,Z.jsxs)(`select`,{id:`template`,className:`w-full px-3 py-2 border rounded-md bg-background mt-1`,value:b.template,onChange:e=>x({...b,template:e.target.value}),children:[(0,Z.jsx)(`option`,{value:``,children:`Select a template...`}),i.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,` - `,e.description]},e.id))]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Role Name *`}),(0,Z.jsx)(q,{id:`name`,placeholder:`e.g., canvas-sshd`,value:b.name,onChange:e=>x({...b,name:e.target.value})})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`roleType`,children:`Type *`}),(0,Z.jsxs)(`select`,{id:`roleType`,className:`w-full px-3 py-2 border rounded-md bg-background mt-1`,value:b.type,onChange:e=>x({...b,type:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`global`,children:`Global (Server-wide)`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace (User-scoped)`})]})]}),b.template&&(0,Z.jsxs)(`div`,{className:`p-4 bg-muted rounded-lg`,children:[(0,Z.jsx)(`h3`,{className:`font-medium mb-2`,children:`Template Info`}),i.find(e=>e.id===b.template)&&(0,Z.jsxs)(`div`,{className:`text-sm space-y-1 text-muted-foreground`,children:[(0,Z.jsxs)(`p`,{children:[(0,Z.jsx)(`strong`,{children:`Image:`}),` `,i.find(e=>e.id===b.template)?.container.image]}),(0,Z.jsxs)(`p`,{children:[(0,Z.jsx)(`strong`,{children:`Category:`}),` `,i.find(e=>e.id===b.template)?.category]}),i.find(e=>e.id===b.template)?.documentation?.readme&&(0,Z.jsx)(`p`,{className:`mt-2`,children:i.find(e=>e.id===b.template)?.documentation?.readme})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t`,children:[(0,Z.jsx)(Y,{variant:`outline`,onClick:P,children:`Cancel`}),(0,Z.jsx)(Y,{onClick:E,children:`Create Role`})]})]})})}),m&&f&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-background rounded-lg shadow-elevation-3 max-w-4xl w-full mx-4 max-h-viewport-modal flex flex-col`,children:[(0,Z.jsxs)(`div`,{className:`p-6 border-b flex items-center justify-between`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-xl font-bold`,children:`Role Logs`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:f.name})]}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>h(!1),children:(0,Z.jsx)(vr,{className:`w-4 h-4`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto p-6`,children:(0,Z.jsx)(`div`,{"data-scheme":`dark`,className:`bg-background text-success p-4 rounded font-mono text-xs overflow-x-auto`,children:g.length===0?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Z.jsx)(`pre`,{children:g.join(`
|
|
36
|
-
`)})})}),(0,Z.jsx)(`div`,{className:`p-4 border-t flex justify-end`,children:(0,Z.jsx)(Y,{onClick:()=>h(!1),children:`Close`})})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function Lj(){let e=yD(),t=du(),n=t?.userType===`admin`,[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(n),[s,c]=(0,X.useState)(n?null:`Access denied. Admin privileges required.`),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)({status:``,userType:``,search:``}),[x,S]=(0,X.useState)({name:``,email:``,password:``,userType:`user`,status:`active`}),{showToast:C}=wo();(0,X.useEffect)(()=>{n&&(async()=>{try{let e=await gu(),t=!!e?.strategies?.local?.requireEmailVerification;g(t),v(e?.strategies?.local?.passwordPolicy||null)}catch{g(!1),v(null)}})()},[n]);let w=e=>{let t=e.trim().toLowerCase();return t.length<3||t.length>39?`Username must be 3-39 characters long`:/^[a-z0-9_-]+$/.test(t)?null:`Username can only contain lowercase letters, numbers, underscores, and hyphens`},T=e=>{let t=e||``,n=_||{},r=n.minLength??12,i=n.maxLength??128,a=[];return t.length<r&&a.push(`at least ${r} characters`),t.length>i&&a.push(`no more than ${i} characters`),(n.requireUppercase??!0)&&!/[A-Z]/.test(t)&&a.push(`an uppercase letter`),(n.requireLowercase??!0)&&!/[a-z]/.test(t)&&a.push(`a lowercase letter`),(n.requireNumbers??!0)&&!/[0-9]/.test(t)&&a.push(`a number`),(n.requireSpecialChars??!0)&&!/[^A-Za-z0-9]/.test(t)&&a.push(`a special character`),a.length?`Password must contain ${a.join(`, `).replace(/, ([^,]*)$/,` and $1`)}.`:null},E=()=>{let e=_||{},t=[],n=e.minLength??12;return t.push(`${n}+ chars`),(e.requireUppercase??!0)&&t.push(`uppercase`),(e.requireLowercase??!0)&&t.push(`lowercase`),(e.requireNumbers??!0)&&t.push(`number`),(e.requireSpecialChars??!0)&&t.push(`special`),t.join(`, `)},D=e=>{if(!e)return`-`;let t=new Date(e);return isNaN(t.getTime())?`-`:t.toLocaleString()},O=async e=>{try{await _u(e),C({title:`Verification email`,description:`If the account exists, a verification email was sent.`})}catch(e){let t=e instanceof Error?e.message:`Failed to send verification email`;C({title:`Error`,description:t,variant:`destructive`})}},k=(0,X.useCallback)(async()=>{try{o(!0);let{status:e,userType:t}=y,n=await wj.users.listUsers({status:e||void 0,userType:t||void 0});i(n),c(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch users`;c(t),C({title:`Error`,description:t,variant:`destructive`})}finally{o(!1)}},[y,C]);(0,X.useEffect)(()=>{n&&k()},[k,n]);let A=async e=>{if(e.preventDefault(),!x.name.trim()||!x.email.trim()){C({title:`Validation Error`,description:`Name and email are required`,variant:`destructive`});return}let t=w(x.name);if(t){C({title:`Validation Error`,description:t,variant:`destructive`});return}if(!x.password.trim()){C({title:`Validation Error`,description:`Password is required`,variant:`destructive`});return}let n=T(x.password);if(n){C({title:`Validation Error`,description:n,variant:`destructive`});return}u(!0);try{let e={name:x.name.trim().toLowerCase(),email:x.email.trim(),userType:x.userType,status:x.status};if(x.password.trim()&&(e.password=x.password),await wj.users.createUser(e),h&&x.status===`pending`)try{await _u(x.email.trim())}catch{}S({name:``,email:``,password:``,userType:`user`,status:h?`pending`:`active`}),m(!1),await k(),C({title:`Success`,description:`User created successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to create user`;C({title:`Error`,description:t,variant:`destructive`})}finally{u(!1)}},j=async e=>{if(e.preventDefault(),!d)return;let t=w(x.name);if(t){C({title:`Validation Error`,description:t,variant:`destructive`});return}if(x.password.trim()){let e=T(x.password);if(e){C({title:`Validation Error`,description:e,variant:`destructive`});return}}u(!0);try{let e={name:x.name.trim().toLowerCase(),email:x.email.trim(),userType:x.userType,status:x.status};x.password.trim()&&(e.password=x.password),await wj.users.updateUser(d.id,e),f(null),m(!1),await k(),C({title:`Success`,description:`User updated successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to update user`;C({title:`Error`,description:t,variant:`destructive`})}finally{u(!1)}},M=async(e,t)=>{if(confirm(`Are you sure you want to delete user "${t}"? This action cannot be undone.`))try{await wj.users.deleteUser(e),await k(),C({title:`Success`,description:`User deleted successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to delete user`;C({title:`Error`,description:t,variant:`destructive`})}},N=()=>{f(null),S({name:``,email:``,password:``,userType:`user`,status:h?`pending`:`active`}),m(!0)},P=e=>{f(e),S({name:e.name,email:e.email,password:``,userType:e.userType,status:e.status}),m(!0)},ee=()=>{m(!1),f(null)};Ae(ee,p);let F=r.filter(e=>y.search===``||e.name.toLowerCase().includes(y.search.toLowerCase())||e.email.toLowerCase().includes(y.search.toLowerCase()));return n?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{onBack:e,title:`User Management`,description:`Manage user accounts and permissions`}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center md:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Z.jsx)(q,{placeholder:`Search users...`,value:y.search,onChange:e=>b(t=>({...t,search:e.target.value})),className:`md:w-64`}),(0,Z.jsxs)(`select`,{value:y.status,onChange:e=>b(t=>({...t,status:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Z.jsx)(`option`,{value:`active`,children:`Active`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Z.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,Z.jsx)(`option`,{value:`deleted`,children:`Deleted`})]}),(0,Z.jsxs)(`select`,{value:y.userType,onChange:e=>b(t=>({...t,userType:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Types`}),(0,Z.jsx)(`option`,{value:`user`,children:`User`}),(0,Z.jsx)(`option`,{value:`admin`,children:`Admin`})]})]}),(0,Z.jsxs)(Y,{onClick:N,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create User`]})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[a&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading users...`}),s&&!r.length&&(0,Z.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Z.jsx)(`p`,{children:s})}),!a&&!s&&F.length===0&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No users found`}),F.length>0&&(0,Z.jsx)(`div`,{className:`border rounded-md`,children:(0,Z.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Z.jsxs)(`table`,{className:`w-full`,children:[(0,Z.jsx)(`thead`,{children:(0,Z.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Email`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Type`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Status`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Updated`}),(0,Z.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Z.jsx)(`tbody`,{children:F.map(e=>(0,Z.jsxs)(`tr`,{className:`border-t`,children:[(0,Z.jsx)(`td`,{className:`p-3 font-medium`,children:e.name}),(0,Z.jsx)(`td`,{className:`p-3`,children:e.email}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.userType===`admin`?`bg-destructive-subtle text-destructive`:`bg-info-subtle text-info`}`,children:e.userType})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.status===`active`?`bg-success-subtle text-success`:e.status===`inactive`?`bg-warning-subtle text-warning`:e.status===`pending`?`bg-info-subtle text-info`:`bg-destructive-subtle text-destructive`}`,children:e.status})}),(0,Z.jsx)(`td`,{className:`p-3`,children:D(e.createdAt)}),(0,Z.jsx)(`td`,{className:`p-3`,children:D(e.updatedAt)}),(0,Z.jsxs)(`td`,{className:`p-3 text-right space-x-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>P(e),children:(0,Z.jsx)(Za,{className:`h-4 w-4`})}),h&&e.status===`pending`&&(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>O(e.email),title:`Resend activation email`,children:`Resend activation`}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>M(e.id,e.name),className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,disabled:e.id===t?.id,title:e.id===t?.id?`Cannot delete your own account`:`Delete user`,children:(0,Z.jsx)(ti,{className:`h-4 w-4`})})]})]},e.id))})]})})})]}),p&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-card rounded-lg p-6 w-full max-w-md mx-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-semibold`,children:d?`Edit User`:`Create New User`}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:ee,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`form`,{onSubmit:d?j:A,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Username`}),(0,Z.jsx)(q,{id:`name`,type:`text`,value:x.name,onChange:e=>S(t=>({...t,name:e.target.value.toLowerCase().replace(/\s+/g,``)})),placeholder:`Enter username`,disabled:l,required:!0}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`3-39 characters, lowercase letters, numbers, underscores, and hyphens only`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`email`,children:`Email`}),(0,Z.jsx)(q,{id:`email`,type:`email`,value:x.email,onChange:e=>S(t=>({...t,email:e.target.value})),placeholder:`Enter email address`,disabled:l,required:!0})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(G,{htmlFor:`password`,children:[`Password `,d&&`(leave blank to keep current)`]}),(0,Z.jsx)(q,{id:`password`,type:`password`,value:x.password,onChange:e=>S(t=>({...t,password:e.target.value})),placeholder:d?`Leave blank to keep current`:`Enter password`,disabled:l,required:!d}),!d&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[`Must satisfy: `,E()]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`userType`,children:`User Type`}),(0,Z.jsxs)(`select`,{id:`userType`,value:x.userType,onChange:e=>S(t=>({...t,userType:e.target.value})),disabled:l,className:`w-full px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:`user`,children:`User`}),(0,Z.jsx)(`option`,{value:`admin`,children:`Admin`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`status`,children:`Status`}),(0,Z.jsxs)(`select`,{id:`status`,value:x.status,onChange:e=>S(t=>({...t,status:e.target.value})),disabled:l,className:`w-full px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:`active`,children:`Active`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Z.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,Z.jsx)(`option`,{value:`deleted`,children:`Deleted`})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-4`,children:[(0,Z.jsx)(Y,{type:`submit`,disabled:l,className:`flex-1`,children:l?`Processing...`:d?`Update User`:`Create User`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:ee,disabled:l,children:`Cancel`})]})]})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function Rj(){let e=yD(),{showToast:t}=wo(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(``),f=du()?.userType===`admin`,p=(0,X.useCallback)(()=>tj().then(e=>{r(e),d((e.allowHosts||[]).join(`, `)),l(null)}).catch(e=>l(e instanceof Error?e.message:`Failed to load server defaults`)).finally(()=>a(!1)),[]);(0,X.useEffect)(()=>{p()},[p]);let m=()=>{a(!0),p()};return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[(0,Z.jsx)(sw,{onBack:e,compact:!0,className:`mb-6`,title:`Server search & AI defaults`,description:`Entire server · Set the embedding defaults accounts inherit. Account and workspace overrides take priority. Running workspaces adopt new defaults when restarted.`,actions:(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:m,disabled:i,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})}),!f&&(0,Z.jsxs)(`div`,{className:`mb-4 flex items-start gap-2 rounded-md border p-3 text-xs`,children:[(0,Z.jsx)(ha,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:`Read-only. Changing server defaults requires an admin account. This is what your workspaces inherit.`})]}),i?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):c||!n?(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Server defaults unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:c||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:m,children:`Retry`})]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Config file: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:n.configPath})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-semibold`,children:`Endpoint allowlist`}),(0,Z.jsx)(`p`,{className:`mb-2 mt-1 text-[11px] text-muted-foreground`,children:`Provider URLs are fetched by the server, so they are an SSRF surface. Link-local and cloud-metadata targets are always refused; list additional hosts here to permit them. Comma-separated, empty = only the always-blocked ranges apply.`}),(0,Z.jsx)(q,{value:u,disabled:!f,onChange:e=>d(e.target.value),placeholder:`gpu.internal, embeddings.example.com`,className:`h-8 text-sm`})]}),(0,Z.jsx)(yj,{value:n.serverDefaults||{},effective:n.serverDefaults||{},inherited:{},saving:o,disabled:!f,saveLabel:`Save server defaults`,onSave:async e=>{s(!0);try{let n=u.split(`,`).map(e=>e.trim()).filter(Boolean),r=await nj({...e,...n.length?{allowHosts:n}:{}});t({title:`Server defaults saved`,description:`Written to ${r.configPath}. Every user inherits these, so running workspaces keep their current tables until restarted.`}),await p()}catch(e){t({title:`Save failed`,description:e instanceof Error?e.message:`Failed to save`,variant:`destructive`})}finally{s(!1)}}},JSON.stringify(n.serverDefaults))]})]})}function zj(){return J.get(no.admin.authConfig)}function Bj(e){return J.put(no.admin.authConfig,e)}function Vj(e,t,n){return J.post(`${no.admin.authConfig}/test`,{strategy:`ldap`,name:e,server:t,email:n})}function Hj(e,t,n){return J.post(`${no.admin.authConfig}/test`,{strategy:`imap`,domain:e,email:t,password:n})}var Uj=0,Wj=()=>`row-${++Uj}`;function Gj(e){let{servers:t,...n}=e.strategies.ldap,{domains:r,...i}=e.strategies.imap;return{allowUserRegistrations:e.allowUserRegistrations,local:e.strategies.local,ldap:{...n,servers:Object.entries(t).map(([e,t])=>({...t,id:Wj(),name:e,originalName:e}))},imap:{...i,domains:Object.entries(r).map(([e,t])=>({...t,id:Wj(),domain:e}))},google:e.strategies.google??{enabled:!1,defaultUserType:`user`,defaultStatus:`active`,clientId:``,clientSecretSet:!1,allowedDomains:[],autoCreateUsers:!0,webOrigins:[]}}}function Kj(e){let{id:t,name:n,originalName:r,...i}=e;return{...i,...r&&r!==e.name?{previousName:r}:{}}}function qj(e){return{allowUserRegistrations:e.allowUserRegistrations,strategies:{local:e.local,ldap:{enabled:e.ldap.enabled,defaultUserType:e.ldap.defaultUserType,defaultStatus:e.ldap.defaultStatus,servers:Object.fromEntries(e.ldap.servers.map(e=>[e.name.trim(),Kj(e)]))},imap:{enabled:e.imap.enabled,defaultUserType:e.imap.defaultUserType,defaultStatus:e.imap.defaultStatus,domains:Object.fromEntries(e.imap.domains.map(({id:e,domain:t,...n})=>[t.trim().toLowerCase(),n]))},google:e.google}}}function Jj({value:e,onChange:t,placeholder:n,disabled:r}){let i=e.join(`, `),[a,o]=(0,X.useState)(i),[s,c]=(0,X.useState)(i);return i!==s&&(c(i),a.split(/[\s,]+/).filter(Boolean).join(`, `)!==i&&o(i)),(0,Z.jsx)(q,{className:`h-8 text-sm`,value:a,placeholder:n,disabled:r,onChange:e=>{o(e.target.value),t(e.target.value.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean))}})}var Yj={originalName:null,url:`ldap://`,bindDN:``,bindPasswordSet:!1,bindPassword:void 0,searchBase:``,searchFilter:`(mail={{email}})`,attributes:[`mail`,`cn`,`displayName`,`memberOf`],groupAttribute:`memberOf`,tls:!1},Xj={domain:``,name:``,host:``,port:993,secure:!0,startTLS:!1,requireAppPassword:!1},Zj=`h-8 rounded-md border border-input bg-transparent px-2 text-sm outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50`;function Qj({label:e,hint:t,children:n,className:r}){return(0,Z.jsxs)(`label`,{className:K(`flex min-w-0 flex-col gap-1`,r),children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium`,children:e}),n,t&&(0,Z.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:t})]})}function $j({checked:e,onChange:t,disabled:n,label:r,hint:i}){return(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 text-sm`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:e,disabled:n,onChange:e=>t(e.target.checked)}),(0,Z.jsxs)(`span`,{children:[r,i&&(0,Z.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:i})]})]})}function eM({title:e,description:t,enabled:n,onToggle:r,disabled:i,children:a}){return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-semibold`,children:e}),(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:t})]}),r&&(0,Z.jsxs)(`label`,{className:`flex shrink-0 items-center gap-2 text-xs font-medium`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:!!n,disabled:i,onChange:e=>r(e.target.checked)}),n?`Enabled`:`Disabled`]})]}),(0,Z.jsx)(`div`,{className:K(`mt-4 space-y-4`,r&&!n&&`opacity-60`),children:a})]})}function tM({result:e}){return e?(0,Z.jsxs)(`div`,{className:K(`flex items-start gap-2 rounded-md border p-2 text-xs`,e.ok?`border-emerald-500/40 bg-emerald-500/5`:`border-destructive/40 bg-destructive/5`),children:[e.ok?(0,Z.jsx)(Sr,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-emerald-600`}):(0,Z.jsx)(Bn,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-destructive`}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`p`,{children:e.message}),e.user&&e.user.groups.length>0&&(0,Z.jsxs)(`p`,{className:`mt-1 break-all text-muted-foreground`,children:[`Groups: `,e.user.groups.join(` · `)]})]})]}):null}function nM({value:e,onChange:t,disabled:n}){return(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-4`,children:[(0,Z.jsx)(Qj,{label:`New accounts are`,children:(0,Z.jsxs)(`select`,{className:Zj,value:e.defaultUserType,disabled:n,onChange:e=>t({defaultUserType:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`user`,children:`Users`}),(0,Z.jsx)(`option`,{value:`admin`,children:`Admins`})]})}),(0,Z.jsx)(Qj,{label:`Initial status`,children:(0,Z.jsxs)(`select`,{className:Zj,value:e.defaultStatus,disabled:n,onChange:e=>t({defaultStatus:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`active`,children:`Active — can sign in right away`}),(0,Z.jsx)(`option`,{value:`pending`,children:`Pending — an admin activates them`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`})]})})]}),e.defaultUserType===`admin`&&(0,Z.jsxs)(`p`,{className:`flex items-start gap-1.5 text-[11px] text-destructive`,children:[(0,Z.jsx)(ha,{className:`mt-0.5 h-3.5 w-3.5 shrink-0`}),`Everyone who can sign in through this backend becomes a server admin on first login.`]})]})}function rM({row:e,index:t,onChange:n,onRemove:r,disabled:i}){let[a,o]=(0,X.useState)(``),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),d=async()=>{c(!0),u(null);try{u(await Vj(e.originalName??e.name,Kj(e),a.trim()||void 0))}catch(e){u({ok:!1,message:e instanceof Error?e.message:`Test failed`})}finally{c(!1)}},f=e.bindPassword===null?`cleared on save`:typeof e.bindPassword==`string`?`replaced on save`:e.bindPasswordSet?`stored — leave empty to keep it`:`none set`;return(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:[`#`,t+1]}),(0,Z.jsx)(q,{className:`h-8 max-w-[14rem] font-mono text-sm`,value:e.name,disabled:i,onChange:e=>n({name:e.target.value}),placeholder:`primary`,"aria-label":`Server name`}),(0,Z.jsx)(`div`,{className:`flex-1`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:r,disabled:i,"aria-label":`Remove server`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsx)(Qj,{label:`Server URL`,hint:`ldap:// or ldaps://host:port`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.url,disabled:i,onChange:e=>n({url:e.target.value}),placeholder:`ldaps://dc1.example.com:636`})}),(0,Z.jsx)(Qj,{label:`Search base`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.searchBase,disabled:i,onChange:e=>n({searchBase:e.target.value}),placeholder:`ou=users,dc=example,dc=com`})}),(0,Z.jsx)(Qj,{label:`Bind DN`,hint:`Service account used to look users up. Empty = anonymous search.`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.bindDN,disabled:i,onChange:e=>n({bindDN:e.target.value}),placeholder:`cn=canvas,ou=services,dc=example,dc=com`})}),(0,Z.jsx)(Qj,{label:`Bind password`,hint:(0,Z.jsxs)(Z.Fragment,{children:[`Currently: `,f,e.bindPasswordSet&&e.bindPassword!==null&&(0,Z.jsxs)(Z.Fragment,{children:[` · `,(0,Z.jsx)(`button`,{type:`button`,className:`underline hover:text-foreground`,disabled:i,onClick:()=>n({bindPassword:null}),children:`clear`})]})]}),children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`password`,autoComplete:`new-password`,value:typeof e.bindPassword==`string`?e.bindPassword:``,disabled:i,onChange:e=>n({bindPassword:e.target.value===``?void 0:e.target.value}),placeholder:e.bindPasswordSet&&e.bindPassword!==null?`••••••••`:``})}),(0,Z.jsx)(Qj,{label:`User search filter`,hint:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`font-mono`,children:`{{email}}`}),` is replaced by the address typed at sign-in.`]}),children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.searchFilter,disabled:i,onChange:e=>n({searchFilter:e.target.value})})}),(0,Z.jsx)(Qj,{label:`Group attribute`,hint:`Group memberships drive team workspace sharing.`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.groupAttribute,disabled:i,onChange:e=>n({groupAttribute:e.target.value}),placeholder:`memberOf`})}),(0,Z.jsx)(Qj,{label:`Attributes to read`,hint:`Comma-separated.`,className:`sm:col-span-2`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.attributes.join(`, `),disabled:i,onChange:e=>n({attributes:e.target.value.split(`,`).map(e=>e.trim()).filter(Boolean)})})})]}),(0,Z.jsx)($j,{checked:e.tls,disabled:i,onChange:e=>n({tls:e}),label:`Accept self-signed certificates`,hint:`Skips certificate verification for ldaps://. Only for directories with a private CA.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2 border-t pt-3`,children:[(0,Z.jsx)(Qj,{label:`Test`,hint:`Binds with the settings above (unsaved edits included). Add an e-mail to also look that user up.`,className:`min-w-[14rem] flex-1`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`email`,value:a,onChange:e=>o(e.target.value),placeholder:`someone@example.com (optional)`})}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:d,disabled:s||i,className:`mb-5`,children:[s&&(0,Z.jsx)(Ti,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Test connection`]})]}),(0,Z.jsx)(tM,{result:l})]})}function iM({row:e,onChange:t,onRemove:n,disabled:r}){let[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null);return(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:`@`}),(0,Z.jsx)(q,{className:`h-8 max-w-[16rem] font-mono text-sm`,value:e.domain,disabled:r,onChange:e=>t({domain:e.target.value}),placeholder:`example.com`,"aria-label":`E-mail domain`}),(0,Z.jsx)(`div`,{className:`flex-1`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:n,disabled:r,"aria-label":`Remove domain`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-[1fr_6rem_1fr]`,children:[(0,Z.jsx)(Qj,{label:`IMAP host`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.host,disabled:r,onChange:e=>t({host:e.target.value}),placeholder:`imap.example.com`})}),(0,Z.jsx)(Qj,{label:`Port`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`number`,min:1,max:65535,value:e.port,disabled:r,onChange:e=>t({port:Number(e.target.value)})})}),(0,Z.jsx)(Qj,{label:`Label on the sign-in form`,hint:`Optional.`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,value:e.name,disabled:r,onChange:e=>t({name:e.target.value}),placeholder:`Example Mail`})})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2`,children:[(0,Z.jsx)($j,{checked:e.secure,disabled:r,onChange:e=>t({secure:e,...e?{startTLS:!1}:{}}),label:`TLS from the start`,hint:`Usually port 993.`}),(0,Z.jsx)($j,{checked:e.startTLS,disabled:r||e.secure,onChange:e=>t({startTLS:e}),label:`Require STARTTLS`,hint:`Plain port 143 upgraded to TLS.`}),(0,Z.jsx)($j,{checked:e.requireAppPassword,disabled:r,onChange:e=>t({requireAppPassword:e}),label:`Needs an app password`,hint:`Shown as a hint on the sign-in form.`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2 border-t pt-3`,children:[(0,Z.jsx)(Qj,{label:`Test sign-in`,hint:`A real IMAP login with these credentials, logged straight out. Nothing is stored.`,className:`min-w-[12rem] flex-1`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`email`,value:i,onChange:e=>a(e.target.value),placeholder:`someone@${e.domain||`example.com`}`})}),(0,Z.jsx)(Qj,{label:`Password`,className:`mb-5 min-w-[10rem] flex-1`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`password`,autoComplete:`off`,value:o,onChange:e=>s(e.target.value)})}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:async()=>{l(!0),d(null);try{let{id:t,domain:n,...r}=e;d(await Hj(r,i.trim(),o))}catch(e){d({ok:!1,message:e instanceof Error?e.message:`Test failed`})}finally{l(!1),s(``)}},disabled:c||r||!i||!o,className:`mb-5`,children:[c&&(0,Z.jsx)(Ti,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Test`]})]}),(0,Z.jsx)(tM,{result:u})]})}function aM(){let e=yD(),{showToast:t}=wo(),n=du()?.userType===`admin`,[r,i]=(0,X.useState)(``),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),_=(0,X.useCallback)(()=>zj().then(e=>{let t=Gj(e.config);i(e.configPath),o(t),c(t),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to load auth configuration`)).finally(()=>u(!1)),[]);(0,X.useEffect)(()=>{n&&_()},[n,_]);let v=(0,X.useMemo)(()=>!!s&&!!a&&JSON.stringify(qj(s))!==JSON.stringify(qj(a)),[s,a]),y=e=>c(t=>t&&e(t)),b=(e,t)=>y(n=>({...n,ldap:{...n.ldap,servers:n.ldap.servers.map(n=>n.id===e?{...n,...t}:n)}})),x=(e,t)=>y(n=>({...n,imap:{...n.imap,domains:n.imap.domains.map(n=>n.id===e?{...n,...t}:n)}})),S=async()=>{if(!s)return;let e=s.ldap.servers.map(e=>e.name.trim()),n=s.imap.domains.map(e=>e.domain.trim().toLowerCase());if(e.some(e=>!e)||new Set(e).size!==e.length){g(`Every LDAP server needs a unique name.`);return}if(n.some(e=>!e)||new Set(n).size!==n.length){g(`Every IMAP domain must be filled in and listed once.`);return}f(!0),g(null);try{let e=Gj((await Bj(qj(s))).config);o(e),c(e),t({title:`Authentication settings saved`,description:`Applied immediately — the next sign-in uses them.`})}catch(e){g(e instanceof Error?e.message.replace(/^HTTP \d+:\s*/,``):`Failed to save`)}finally{f(!1)}},C=(0,Z.jsx)(sw,{onBack:e,compact:!0,className:`mb-6`,title:`Authentication`,description:`Entire server · Choose how people sign in: local passwords, your LDAP directory, or their mail server over IMAP.`,actions:n&&(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>{u(!0),_()},disabled:l||d,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Reload`]})});return n?(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6 pb-24`,children:[C,l&&!s?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):p||!s?(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Authentication settings unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:p||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>{u(!0),_()},children:`Retry`})]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Config file: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:r}),` · Sign-in picks the backend from the account: existing users keep the method they were created with; a new address tries LDAP first (when enabled), then IMAP for a listed domain, then local.`]}),(0,Z.jsxs)(eM,{title:`Sign-up & local passwords`,description:`Accounts whose password is stored on this server.`,children:[(0,Z.jsx)($j,{checked:s.allowUserRegistrations,onChange:e=>y(t=>({...t,allowUserRegistrations:e})),label:`Allow self-registration`,hint:`Off = only admins create accounts (and LDAP/IMAP users on first sign-in).`}),(0,Z.jsx)($j,{checked:s.local.enabled,onChange:e=>y(t=>({...t,local:{...t.local,enabled:e}})),label:`Local password accounts`,hint:`Off refuses new local registrations. Existing local accounts — admins included — can still sign in, so this cannot lock you out.`}),(0,Z.jsx)($j,{checked:s.local.requireEmailVerification,onChange:e=>y(t=>({...t,local:{...t.local,requireEmailVerification:e}})),label:`Require e-mail verification`,hint:`Needs working SMTP (config/smtp.json).`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`mb-2 text-xs font-medium`,children:`Password policy`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-start gap-4`,children:[(0,Z.jsx)(Qj,{label:`Min length`,children:(0,Z.jsx)(q,{className:`h-8 w-24 text-sm`,type:`number`,min:1,max:1024,value:s.local.passwordPolicy.minLength,onChange:e=>y(t=>({...t,local:{...t.local,passwordPolicy:{...t.local.passwordPolicy,minLength:Number(e.target.value)}}}))})}),(0,Z.jsx)(Qj,{label:`Max length`,children:(0,Z.jsx)(q,{className:`h-8 w-24 text-sm`,type:`number`,min:1,max:1024,value:s.local.passwordPolicy.maxLength,onChange:e=>y(t=>({...t,local:{...t.local,passwordPolicy:{...t.local.passwordPolicy,maxLength:Number(e.target.value)}}}))})}),(0,Z.jsx)(`div`,{className:`grid grid-cols-2 gap-x-6 gap-y-1 pt-1`,children:[[`requireUppercase`,`Uppercase letter`],[`requireLowercase`,`Lowercase letter`],[`requireNumbers`,`Number`],[`requireSpecialChars`,`Special character`]].map(([e,t])=>(0,Z.jsx)($j,{checked:s.local.passwordPolicy[e],label:t,onChange:t=>y(n=>({...n,local:{...n.local,passwordPolicy:{...n.local.passwordPolicy,[e]:t}}}))},e))})]})]})]}),(0,Z.jsxs)(eM,{title:`LDAP / Active Directory`,description:`Users sign in with their directory password. Servers are tried in order, so later ones act as fallbacks.`,enabled:s.ldap.enabled,onToggle:e=>y(t=>({...t,ldap:{...t.ldap,enabled:e}})),children:[(0,Z.jsx)(nM,{value:s.ldap,onChange:e=>y(t=>({...t,ldap:{...t.ldap,...e}}))}),s.ldap.servers.map((e,t)=>(0,Z.jsx)(rM,{row:e,index:t,onChange:t=>b(e.id,t),onRemove:()=>y(t=>({...t,ldap:{...t.ldap,servers:t.ldap.servers.filter(t=>t.id!==e.id)}}))},e.id)),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>y(e=>({...e,ldap:{...e.ldap,servers:[...e.ldap.servers,{...Yj,id:Wj(),name:e.ldap.servers.length?`server${e.ldap.servers.length+1}`:`primary`}]}})),children:[(0,Z.jsx)(br,{className:`mr-2 h-3.5 w-3.5`}),` Add LDAP server`]})]}),(0,Z.jsxs)(eM,{title:`IMAP (mail server sign-in)`,description:`Users of a listed e-mail domain sign in with their mailbox password — the server checks it by logging in to IMAP.`,enabled:s.imap.enabled,onToggle:e=>y(t=>({...t,imap:{...t.imap,enabled:e}})),children:[(0,Z.jsx)(nM,{value:s.imap,onChange:e=>y(t=>({...t,imap:{...t.imap,...e}}))}),s.imap.domains.map(e=>(0,Z.jsx)(iM,{row:e,onChange:t=>x(e.id,t),onRemove:()=>y(t=>({...t,imap:{...t.imap,domains:t.imap.domains.filter(t=>t.id!==e.id)}}))},e.id)),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>y(e=>({...e,imap:{...e.imap,domains:[...e.imap.domains,{...Xj,id:Wj()}]}})),children:[(0,Z.jsx)(br,{className:`mr-2 h-3.5 w-3.5`}),` Add mail domain`]})]}),(0,Z.jsxs)(eM,{title:`Google sign-in`,description:(0,Z.jsxs)(Z.Fragment,{children:[`One-click sign-in with a Google account via OAuth. Needs a Google Cloud OAuth client of type `,(0,Z.jsx)(`em`,{children:`Web application`}),` whose authorized redirect URI is `,(0,Z.jsx)(`code`,{className:`select-all`,children:`${yo}/oauth/google/callback`}),`.`]}),enabled:s.google.enabled,onToggle:e=>y(t=>({...t,google:{...t.google,enabled:e}})),children:[(0,Z.jsx)(nM,{value:s.google,onChange:e=>y(t=>({...t,google:{...t.google,...e}}))}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsx)(Qj,{label:`OAuth client id`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:s.google.clientId,autoComplete:`off`,onChange:e=>y(t=>({...t,google:{...t.google,clientId:e.target.value}}))})}),(0,Z.jsx)(Qj,{label:`OAuth client secret`,hint:s.google.clientSecretSet&&s.google.clientSecret===void 0?`A secret is stored; leave blank to keep it.`:void 0,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,type:`password`,autoComplete:`off`,value:s.google.clientSecret??``,placeholder:s.google.clientSecretSet?`••••••••`:``,onChange:e=>y(t=>({...t,google:{...t.google,clientSecret:e.target.value===``?void 0:e.target.value}}))})}),(0,Z.jsx)(Qj,{label:`Allowed e-mail domains`,hint:`Comma separated. Empty = any Google account may sign in.`,children:(0,Z.jsx)(Jj,{value:s.google.allowedDomains,placeholder:`example.com, example.org`,onChange:e=>y(t=>({...t,google:{...t.google,allowedDomains:e}}))})}),(0,Z.jsx)(Qj,{label:`Extra web origins`,hint:`Only when the web UI is served from another origin than the API (e.g. a Vite dev server).`,children:(0,Z.jsx)(Jj,{value:s.google.webOrigins,placeholder:`http://localhost:5173`,onChange:e=>y(t=>({...t,google:{...t.google,webOrigins:e}}))})})]}),(0,Z.jsx)($j,{checked:s.google.autoCreateUsers,label:`Create an account on first sign-in`,hint:`Off: only users that already exist (by e-mail) can sign in with Google.`,onChange:e=>y(t=>({...t,google:{...t.google,autoCreateUsers:e}}))})]}),(v||h)&&(0,Z.jsxs)(`div`,{className:`sticky bottom-4 z-10 rounded-lg border bg-card p-3 shadow-elevation-4`,children:[h&&(0,Z.jsx)(`ul`,{className:`mb-2 space-y-0.5 text-xs text-destructive`,children:h.split(`; `).map(e=>(0,Z.jsx)(`li`,{children:e},e))}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-end gap-2`,children:[(0,Z.jsx)(`span`,{className:`mr-auto text-xs text-muted-foreground`,children:v?`Unsaved changes`:``}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:d,onClick:()=>{c(a),g(null)},children:`Discard`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,disabled:d||!v,onClick:()=>void S(),children:[d&&(0,Z.jsx)(Ti,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Save`]})]})]})]})]}):(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[C,(0,Z.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border p-3 text-xs`,children:[(0,Z.jsx)(ha,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:`Authentication settings are only available to server admins.`})]})]})}function oM({agent:e,onStart:t,onStop:n,onEnter:r}){let[i,a]=(0,X.useState)(!1),o=async()=>{a(!0);try{await t(e.name)}finally{a(!1)}},s=async()=>{a(!0);try{await n(e.name)}finally{a(!1)}},c=()=>{switch(e.status){case`active`:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-success`});case`inactive`:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-warning`});case`error`:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-destructive`});default:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-muted-foreground`})}},l=()=>{switch(e.llmProvider){case`anthropic`:return(0,Z.jsx)(ri,{className:`h-4 w-4 text-warning`});case`openai`:return(0,Z.jsx)(ri,{className:`h-4 w-4 text-success`});case`ollama`:return(0,Z.jsx)(lr,{className:`h-4 w-4 text-info`});default:return(0,Z.jsx)(ri,{className:`h-4 w-4 text-muted-foreground`})}},u=()=>{switch(e.status){case`active`:return`text-success bg-success-subtle border-success`;case`inactive`:return`text-warning bg-warning-subtle border-warning`;case`error`:return`text-destructive bg-destructive-subtle border-destructive`;case`available`:return`text-info bg-info-subtle border-info`;default:return`text-foreground bg-muted border-border`}},d=e.status===`available`||e.status===`inactive`,f=e.status===`active`;return(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 hover:shadow-elevation-2 transition-shadow bg-card`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[l(),(0,Z.jsx)(`h3`,{className:`text-lg font-semibold truncate`,children:e.label||e.name}),e.color&&(0,Z.jsx)(`div`,{className:`w-4 h-4 rounded border flex-shrink-0`,style:{backgroundColor:e.color},title:`Color: ${e.color}`})]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground font-mono`,children:e.name}),e.description&&(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1 line-clamp-2`,children:e.description})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 flex-shrink-0`,children:[c(),(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs font-medium border ${u()}`,children:e.status})]})]}),(0,Z.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 text-sm`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Provider:`}),(0,Z.jsx)(`div`,{className:`font-medium capitalize`,children:e.llmProvider})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Model:`}),(0,Z.jsx)(`div`,{className:`font-mono text-xs`,children:e.model})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Created:`}),(0,Z.jsx)(`div`,{children:new Date(e.createdAt).toLocaleDateString()})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Last Access:`}),(0,Z.jsx)(`div`,{children:e.lastAccessed?new Date(e.lastAccessed).toLocaleDateString():`Never`})]})]}),e.config.mcp?.servers&&e.config.mcp.servers.length>0&&(0,Z.jsxs)(`div`,{className:`text-sm`,children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`MCP Servers:`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-1`,children:e.config.mcp.servers.map((e,t)=>(0,Z.jsx)(`span`,{className:`px-2 py-1 bg-secondary text-secondary-foreground rounded text-xs`,children:e.name},t))})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-2 border-t`,children:[d&&(0,Z.jsxs)(Y,{onClick:o,disabled:i,size:`sm`,variant:`outline`,className:`flex-1`,children:[(0,Z.jsx)(Ar,{className:`mr-2 h-4 w-4`}),`Start`]}),f&&(0,Z.jsxs)(Y,{onClick:s,disabled:i,size:`sm`,variant:`outline`,className:`flex-1`,children:[(0,Z.jsx)(Sa,{className:`mr-2 h-4 w-4`}),`Stop`]}),(0,Z.jsxs)(Y,{onClick:()=>r(e.name),size:`sm`,className:`flex-1`,children:[(0,Z.jsx)(Ea,{className:`mr-2 h-4 w-4`}),`Chat`]})]})]})}function sM(){let e={anthropic:`https://api.anthropic.com`,openai:`https://api.openai.com/v1`,ollama:`http://localhost:11434/v1`},t={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`},[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(``),[u,d]=(0,X.useState)(``),[f,p]=(0,X.useState)(on()),[m,h]=(0,X.useState)(``),[g,_]=(0,X.useState)(`anthropic`),[v,y]=(0,X.useState)(t.anthropic),[b,x]=(0,X.useState)({apiKey:``,baseUrl:e.anthropic,maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096}),[S,C]=(0,X.useState)(``),[w,T]=(0,X.useState)(!1),E=aw(),[D,O]=hw(),{showToast:k}=wo(),A=ft(),j=Cw();fw(j,`agent`,{"agent:status:changed":e=>{r(t=>t.map(t=>t.id===e.agentId?{...t,status:e.status,isActive:e.isActive}:t))},"agent:created":e=>{r(t=>[...t,e.agent])},"agent:deleted":e=>{r(t=>t.filter(t=>t.id!==e.agentId))}});let M=n=>{_(n),y(t[n]),x({apiKey:``,baseUrl:e[n],maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096})};(0,X.useEffect)(()=>((async()=>{try{a(!0);let e=await ZD();r(e),s(null)}catch(e){console.error(`Agent fetch error:`,e);let t=`Failed to fetch agents`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to fetch agents`}s(t),k({title:`Error`,description:t,variant:`destructive`})}finally{a(!1)}})(),()=>{}),[j,k]);let N=async t=>{if(t.preventDefault(),c.trim()){T(!0);try{let t=await cO({name:c,label:m||c,description:u||void 0,color:f,llmProvider:g,model:v,config:{type:g,model:v,prompts:S?{system:S}:void 0,connectors:{[g]:{...b,...b.apiKey?{apiKey:b.apiKey}:{},...b.baseUrl?{baseUrl:b.baseUrl}:{},maxTokens:b.maxTokens,temperature:b.temperature,topP:b.topP,frequencyPenalty:b.frequencyPenalty,presencePenalty:b.presencePenalty,...g===`ollama`?{numCtx:b.numCtx}:{}}}},mcp:{enabled:!0,servers:[{name:`weather`,command:`node`,args:[`src/managers/agent/mcp-servers/weather.js`]}]}});r(e=>[...e,t]),l(``),d(``),p(on()),h(``),C(``),x({apiKey:``,baseUrl:e[g],maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096}),k({title:`Success`,description:`Agent '${t.label||t.name}' created.`}),O(!1)}catch(e){console.error(`Agent creation error:`,e);let t=`Failed to create agent`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to create agent`}k({title:`Error`,description:t,variant:`destructive`})}finally{T(!1)}}},P=async e=>{try{let t=await dO(e);r(e=>e.map(e=>e.name===t.name?t:e)),k({title:`Success`,description:`Agent '${t.label||t.name}' started.`})}catch(e){console.error(`Agent start error:`,e);let t=`Failed to start agent`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to start agent`}k({title:`Error`,description:t,variant:`destructive`})}},ee=async e=>{try{await fO(e),r(t=>t.map(t=>t.name===e?{...t,status:`inactive`,isActive:!1}:t)),k({title:`Success`,description:`Agent '${e}' stopped.`})}catch(e){console.error(`Agent stop error:`,e);let t=`Failed to stop agent`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to stop agent`}k({title:`Error`,description:t,variant:`destructive`})}},F=e=>{A(`/agents/${e}`)};return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`AI Agents`,description:`Create and manage your AI agents with multiple LLM providers`,actions:!E.local&&!D&&(0,Z.jsxs)(Y,{onClick:()=>O(!0),className:`max-sm:h-9 max-sm:w-9 max-sm:p-0`,"aria-label":`Create agent`,title:`Create agent`,children:[(0,Z.jsx)(br,{className:`h-4 w-4 sm:mr-2`}),(0,Z.jsx)(`span`,{className:`max-sm:hidden`,children:`Create Agent`})]})}),!E.local&&D&&(0,Z.jsx)(pw,{title:`Create New Agent`,onClose:()=>O(!1),children:(0,Z.jsxs)(`form`,{onSubmit:N,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsx)(q,{value:c,onChange:e=>l(e.target.value),placeholder:`Agent Name (e.g., 'my-assistant')`,disabled:w}),(0,Z.jsx)(q,{value:m,onChange:e=>h(e.target.value),placeholder:`Agent Label (display name, optional)`,disabled:w})]}),(0,Z.jsx)(q,{value:u,onChange:e=>d(e.target.value),placeholder:`Description (optional)`,disabled:w}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`agent-provider`,className:`text-sm font-medium`,children:`LLM Provider`}),(0,Z.jsxs)(`select`,{id:`agent-provider`,value:g,onChange:e=>M(e.target.value),className:`w-full mt-1 px-3 py-2 border border-input bg-background rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-ring`,disabled:w,children:[(0,Z.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,Z.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,Z.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`agent-model`,className:`text-sm font-medium`,children:`Model`}),(0,Z.jsx)(q,{id:`agent-model`,value:v,onChange:e=>y(e.target.value),placeholder:`Model name (e.g., 'gpt-4o')`,disabled:w})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`system-prompt`,className:`text-sm font-medium`,children:`System Prompt (Optional)`}),(0,Z.jsx)(`textarea`,{id:`system-prompt`,value:S,onChange:e=>C(e.target.value),placeholder:`Enter system prompt to define agent behavior...`,className:`w-full mt-1 px-3 py-2 border border-input bg-background rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-ring min-h-[80px] resize-y`,disabled:w})]}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`api-key`,className:`text-sm font-medium`,children:`API Key (Optional)`}),(0,Z.jsx)(q,{id:`api-key`,type:`password`,value:b.apiKey,onChange:e=>x(t=>({...t,apiKey:e.target.value})),placeholder:`Enter your API key`,disabled:w})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`baseUrl`,className:`text-sm font-medium`,children:`Base URL (Optional)`}),(0,Z.jsx)(q,{id:`baseUrl`,value:b.baseUrl,onChange:e=>x(t=>({...t,baseUrl:e.target.value})),placeholder:e[g],disabled:w})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-medium`,children:`LLM Parameters`}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`max-tokens`,className:`text-sm font-medium`,children:`Max Tokens`}),(0,Z.jsx)(q,{id:`max-tokens`,type:`number`,min:`1`,max:`32768`,value:b.maxTokens,onChange:e=>x(t=>({...t,maxTokens:parseInt(e.target.value)||4096})),disabled:w})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`temperature`,className:`text-sm font-medium`,children:`Temperature`}),(0,Z.jsx)(q,{id:`temperature`,type:`number`,min:`0`,max:`2`,step:`0.1`,value:b.temperature,onChange:e=>x(t=>({...t,temperature:parseFloat(e.target.value)||.7})),disabled:w})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`top-p`,className:`text-sm font-medium`,children:`Top P`}),(0,Z.jsx)(q,{id:`top-p`,type:`number`,min:`0`,max:`1`,step:`0.1`,value:b.topP,onChange:e=>x(t=>({...t,topP:parseFloat(e.target.value)||1})),disabled:w})]}),g===`ollama`&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`num-ctx`,className:`text-sm font-medium`,children:`Context Length`}),(0,Z.jsx)(q,{id:`num-ctx`,type:`number`,min:`1024`,max:`32768`,value:b.numCtx,onChange:e=>x(t=>({...t,numCtx:parseInt(e.target.value)||4096})),disabled:w})]})]}),g!==`ollama`&&(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`frequency-penalty`,className:`text-sm font-medium`,children:`Frequency Penalty`}),(0,Z.jsx)(q,{id:`frequency-penalty`,type:`number`,min:`-2`,max:`2`,step:`0.1`,value:b.frequencyPenalty,onChange:e=>x(t=>({...t,frequencyPenalty:parseFloat(e.target.value)||0})),disabled:w})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`presence-penalty`,className:`text-sm font-medium`,children:`Presence Penalty`}),(0,Z.jsx)(q,{id:`presence-penalty`,type:`number`,min:`-2`,max:`2`,step:`0.1`,value:b.presencePenalty,onChange:e=>x(t=>({...t,presencePenalty:parseFloat(e.target.value)||0})),disabled:w})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{htmlFor:`agent-color`,className:`text-sm font-medium`,children:`Agent Color`}),(0,Z.jsx)(q,{id:`agent-color`,type:`color`,value:f,onChange:e=>p(e.target.value),className:`h-10 w-16 p-1`,disabled:w}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>p(on()),disabled:w,children:`Randomize`})]}),(0,Z.jsxs)(Y,{type:`submit`,disabled:w||!c.trim(),children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Agent`]})]})}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Your Agents`}),i&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading agents...`}),o&&(0,Z.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Z.jsx)(`p`,{children:o})}),!i&&!o&&n.length===0&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No agents found`}),n.length>0&&(0,Z.jsx)(`div`,{className:`grid gap-4`,children:n.map(e=>(0,Z.jsx)(oM,{agent:e,onStart:P,onStop:ee,onEnter:F},e.id))})]})]})}function cM(e){let t=e?.usage;if(!t)return null;let n=t.totalTokens,r=t.input,i=t.output;return typeof n==`number`&&typeof r==`number`&&typeof i==`number`?`${n} tok (${r} in / ${i} out)`:typeof n==`number`?`${n} tok`:null}function lM(e){let t=e?.usage?.cost?.total;return typeof t==`number`?`$${t.toFixed(t<.01?6:4)}`:null}function uM({reasoning:e,metadata:t,isStreaming:n=!1,compact:r=!1}){let i=t?.model,a=[t?.provider,i,cM(t),lM(t)].filter(Boolean);return!e&&a.length===0?null:(0,Z.jsxs)(Z.Fragment,{children:[e&&(0,Z.jsxs)(`details`,{open:n,className:`mb-2 rounded border border-border bg-background ${r?`px-2 py-1.5`:`px-3 py-2`}`,children:[(0,Z.jsx)(`summary`,{className:`cursor-pointer font-medium text-foreground ${r?`text-[11px]`:`text-xs`}`,children:`Reasoning`}),(0,Z.jsx)(F,{content:e,className:`mt-1 text-foreground ${r?`text-[11px]`:`text-xs`}`})]}),a.length>0&&(0,Z.jsx)(`div`,{className:`mt-2 text-muted-foreground ${r?`text-[11px]`:`text-xs`}`,children:a.join(` • `)})]})}function dM({message:e,isStreaming:t=!1,connectionStatus:n=`disconnected`}){let[r,i]=(0,X.useState)(``),[a,o]=(0,X.useState)(!0);(0,X.useEffect)(()=>{if(!t||e.isComplete)return;let n=e.content,r=0,a=setInterval(()=>{r<n.length?(i(n.substring(0,r+1)),r++):clearInterval(a)},20);return()=>clearInterval(a)},[e.content,t,e.isComplete]);let s=t&&!e.isComplete?r:e.content;return(0,X.useEffect)(()=>{if(!t||e.isComplete)return;let n=setInterval(()=>{o(e=>!e)},500);return()=>{clearInterval(n),o(!0)}},[t,e.isComplete]),(0,Z.jsx)(`div`,{className:`flex ${e.role===`user`?`justify-end`:`justify-start`}`,children:(0,Z.jsxs)(`div`,{className:`max-w-[70%] p-3 rounded-lg ${e.role===`user`?`bg-primary text-primary-foreground`:`bg-muted`} ${t&&!e.isComplete?`border-2 border-info`:``}`,children:[(0,Z.jsx)(uM,{reasoning:e.role===`assistant`?e.metadata?.reasoning?.trim():void 0,metadata:e.role===`assistant`?e.metadata:void 0,isStreaming:t&&!e.isComplete}),(0,Z.jsxs)(`div`,{className:`text-sm`,children:[e.role===`assistant`?(0,Z.jsx)(F,{content:s}):(0,Z.jsx)(`span`,{className:`whitespace-pre-wrap break-words`,children:s}),t&&!e.isComplete&&(0,Z.jsx)(`span`,{className:`inline-block w-2 ${a?`bg-current`:`bg-transparent`}`,children:`|`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between text-xs mt-2 opacity-70`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{children:new Date(e.timestamp).toLocaleTimeString()}),t&&!e.isComplete&&(0,Z.jsx)(`span`,{className:`text-info`,children:`• streaming...`})]}),e.role===`assistant`&&(()=>{switch(n){case`websocket`:return(0,Z.jsx)(`span`,{title:`WebSocket`,children:(0,Z.jsx)(Ja,{className:`h-3 w-3 text-success`})});case`sse`:return(0,Z.jsx)(`span`,{title:`Server-Sent Events`,children:(0,Z.jsx)($i,{className:`h-3 w-3 text-info`})});case`rest`:return(0,Z.jsx)(`span`,{title:`REST API`,children:(0,Z.jsx)(yi,{className:`h-3 w-3 text-warning`})});default:return(0,Z.jsx)(`span`,{title:`Disconnected`,children:(0,Z.jsx)(Hn,{className:`h-3 w-3 text-destructive`})})}})()]})]})})}var fM=(0,X.createContext)(null);function pM(e){let t=(0,X.useContext)(fM);if(!t)throw Error(`useAgentSessions must be used within an AgentSessionProvider`);let{getState:n,refresh:r,create:i,select:a,rename:o,remove:s}=t,c=n(e),l=(0,X.useCallback)(()=>r(e),[r,e]),u=(0,X.useCallback)(t=>i(e,t),[i,e]),d=(0,X.useCallback)(t=>a(e,t),[a,e]),f=(0,X.useCallback)((t,n)=>o(e,t,n),[o,e]),p=(0,X.useCallback)(t=>s(e,t),[s,e]);return(0,X.useMemo)(()=>({...c,refresh:l,create:u,select:d,rename:f,remove:p}),[c,l,u,d,f,p])}function mM(e={}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!1),[a,o]=(0,X.useState)(!1),s=(0,X.useRef)(e),c=(0,X.useRef)(null),l=(0,X.useRef)(!1);(0,X.useEffect)(()=>{s.current=e},[e]);let u=(0,X.useCallback)(()=>{if(!s.current.agentId||c.current||l.current)return;let e=localStorage.getItem(`authToken`);if(!e){console.warn(`No auth token available for WebSocket connection`);return}console.log(`[WebSocket] Using token type: ${e.startsWith(`canvas-`)?`API`:`JWT`}, length: ${e.length}`),l.current=!0,o(!0);let t=xo(no.ws,{auth:{token:e},transports:[`websocket`],reconnection:!0,reconnectionAttempts:5,reconnectionDelay:1e3,timeout:1e4,forceNew:!0});t.on(`connect`,()=>{console.log(`Agent WebSocket connected successfully`),i(!0),l.current=!1,o(!1)}),t.on(`connect_error`,e=>{console.error(`Agent WebSocket connection error:`,e),i(!1),l.current=!1,o(!1),(e.message?.includes(`Auth error`)||e.message?.includes(`token`))&&console.warn(`WebSocket auth failed, will fallback to SSE for streaming`)}),t.on(`disconnect`,e=>{console.log(`Agent WebSocket disconnected:`,e),i(!1),l.current=!1,o(!1)}),t.on(`agent:chat:chunk`,e=>{console.log(`Received chat chunk:`,e),s.current.onMessage&&s.current.onMessage(e)}),t.on(`agent:chat:complete`,e=>{console.log(`Chat stream complete:`,e),s.current.onComplete&&s.current.onComplete(e.agentId,e.messageId,e.messages)}),t.on(`agent:chat:error`,e=>{console.error(`Chat stream error:`,e),s.current.onError&&s.current.onError(e)}),t.on(`agent:chat:start`,e=>{console.log(`Chat stream started:`,e)}),c.current=t,n(t)},[]),d=(0,X.useCallback)(()=>{let e=c.current;e&&(e.removeAllListeners(),e.close()),c.current=null,l.current=!1,n(null),i(!1),o(!1)},[]),f=(0,X.useCallback)(e=>{t&&r&&(console.log(`Subscribing to agent channel: ${e}`),t.emit(`agent:subscribe`,{agentId:e}))},[t,r]),p=(0,X.useCallback)(e=>{t&&r&&(console.log(`Unsubscribing from agent channel: ${e}`),t.emit(`agent:unsubscribe`,{agentId:e}))},[t,r]),m=(0,X.useCallback)((e,n)=>{if(!t||!r)throw Error(`WebSocket not connected`);let i=`msg_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;return console.log(`Starting streaming chat for agent ${e}, message ${i}`),t.emit(`agent:chat:stream`,{agentId:e,messageId:i,...n}),i},[t,r]);return(0,X.useEffect)(()=>{if(e.agentId)return u(),()=>{d()}},[e.agentId,u,d]),(0,X.useEffect)(()=>{if(r&&e.agentId)return f(e.agentId),()=>{e.agentId&&p(e.agentId)}},[r,e.agentId,f,p]),{socket:t,isConnected:r,isConnecting:a,connect:u,disconnect:d,joinAgentChannel:f,leaveAgentChannel:p,startStreamingChat:m}}function hM(e){if(!e)return``;if(typeof e.errorMessage==`string`&&e.errorMessage.trim())return e.errorMessage.trim();let t=e.content;return typeof t==`string`?t:Array.isArray(t)&&t.filter(e=>e?.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
|
|
37
|
-
`)||``}function gM(e,t){return`${e||``}${t||``}`.trim()||void 0}function _M(e,t){if(!e&&!t)return;let{reasoningDelta:n,...r}=e||{};return{...r,...t?{reasoning:t}:{}}}function vM(e){let{agentId:t,initialMessages:n=[],historyKey:r,loadHistory:i=!0,onError:a,enableWebSocket:o=!0,enableSSE:s=!0,enableFallback:c=!0,llmProvider:l}=e,[u,d]=(0,X.useState)(gO(n)),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(`disconnected`),[v,y]=(0,X.useState)(null),b=(0,X.useRef)(n);(0,X.useEffect)(()=>{b.current=n});let x=`${t}${String(i)}${r??``}`,[S,C]=(0,X.useState)(x);S!==x&&(C(x),(!t||!i)&&d(gO(n))),(0,X.useEffect)(()=>{let e=!1;if(!(!t||!i))return $D(t).then(t=>{e||d(gO(t.messages))}).catch(()=>{e||d(gO(b.current))}),()=>{e=!0}},[t,i,r]);let w=(0,X.useRef)(null),T=(0,X.useRef)(null),{isConnected:E,startStreamingChat:D}=mM({agentId:o?t:void 0,onMessage:j,onComplete:M,onError:N}),O=o&&E,[k,A]=(0,X.useState)(!1);k!==O&&(A(O),_(O?`websocket`:e=>e===`websocket`?`disconnected`:e));function j(e){e.messageId===T.current&&(console.log(`Processing WebSocket chunk:`,{type:e.type,content:e.content,delta:e.delta}),e.type===`content`||e.type===`chunk`?h(t=>t?{...t,content:t.content+(e.delta||e.content||``),isComplete:!1,metadata:t.metadata}:{role:`assistant`,content:e.delta||e.content||``,timestamp:new Date().toISOString(),isComplete:!1}):e.type===`thinking`?h(t=>{let n=gM(t?.metadata?.reasoning,e.delta);return t?{...t,metadata:{...t.metadata||{},...n?{reasoning:n}:{}}}:{role:`assistant`,content:``,timestamp:new Date().toISOString(),isComplete:!1,metadata:n?{reasoning:n}:void 0}}):(e.type===`complete`||e.type===`done`)&&h(e=>{if(e){let t={...e,isComplete:!0};return d(e=>[...e,t]),p(!1),T.current=null,null}return null}))}function M(e,t,n){if(t===T.current){let e=Array.isArray(n)?[...n].reverse().find(e=>e?.role===`assistant`):null,t=hM(e),r=VD(e);h(e=>{if(e){let n={...e,content:t||e.content,isComplete:!0,metadata:{...e.metadata||{},...r||{}}};d(e=>[...e,n])}else t&&d(e=>[...e,{role:`assistant`,content:t,timestamp:new Date().toISOString(),isComplete:!0,metadata:r}]);return null}),p(!1),T.current=null}}function N(e){e.messageId===T.current&&(console.error(`WebSocket streaming error:`,e),y(e.error),p(!1),T.current=null,a&&a(Error(e.error)))}let P=(0,X.useCallback)(async(e,n={})=>{if(f)throw Error(`Cannot send message while streaming`);y(null);let r={role:`user`,content:e||(n.images?.length?`[${n.images.length} image${n.images.length===1?``:`s`} attached]`:``),timestamp:new Date().toISOString(),isComplete:!0};d(e=>[...e,r]),p(!0);let i={message:e,images:n.images,context:u.slice(-10),mcpContext:n.mcpContext??!0,maxTokens:n.maxTokens,temperature:n.temperature},m=Array.isArray(n.images)&&n.images.length>0,g=o&&E&&l!==`ollama`&&!m,v=s;if(l===`ollama`&&console.log(`🦙 Ollama detected: Using SSE streaming (WebSocket not supported by Ollama)`),g)try{console.log(`🔌 Attempting WebSocket streaming for ${l||`unknown`} provider...`);let e=D(t,i);T.current=e,_(`websocket`);return}catch(e){console.warn(`WebSocket streaming failed for ${l||`unknown`}, falling back to SSE:`,e)}if(v){let e=!1;try{console.log(`📡 ${l===`ollama`?`Using`:`Attempting`} SSE streaming for ${l||`unknown`} provider...`),_(`sse`),w.current=new AbortController;let r=``;await mO(t,i.message,{onStart:()=>{e=!0},onMessage:(e,t,n)=>{r+=e;let i=typeof n?.reasoningDelta==`string`?n.reasoningDelta:``;if(h(e=>{let a=n?.reasoning||gM(e?.metadata?.reasoning,i);return{role:`assistant`,content:r,timestamp:e?.timestamp||new Date().toISOString(),isComplete:t,metadata:_M({...e?.metadata||{},...n},a)}}),t){let e=n?.reasoning;d(t=>[...t,{role:`assistant`,content:r,timestamp:new Date().toISOString(),isComplete:!0,metadata:_M(n,e)}]),h(null),p(!1)}},onError:e=>{console.error(`SSE streaming error:`,e),y(e.message),p(!1),a&&a(e)},context:u.slice(-10).map(e=>({role:e.role,content:e.content,timestamp:e.timestamp,metadata:e.metadata})),images:n.images,mcpContext:n.mcpContext??!0,maxTokens:n.maxTokens,temperature:n.temperature});return}catch(t){if(e){console.warn(`SSE stream failed after server accepted prompt for ${l||`unknown`}; refusing REST fallback to avoid duplicate prompt.`);return}console.warn(`SSE streaming failed for ${l||`unknown`}, falling back to REST:`,t)}}if(c)try{console.log(`⚙️ Using REST API fallback for ${l||`unknown`} provider...`),_(`rest`);let r=await hO(t,{message:e,images:n.images,context:u.slice(-10).map(e=>({role:e.role,content:e.content,timestamp:e.timestamp,metadata:e.metadata})),mcpContext:n.mcpContext??!0,maxTokens:n.maxTokens,temperature:n.temperature}),i={role:`assistant`,content:r.content,timestamp:new Date().toISOString(),isComplete:!0,metadata:r.metadata};d(e=>[...e,i]),p(!1)}catch(e){console.error(`All chat methods failed:`,e);let t=e instanceof Error?e.message:`Failed to send message`;y(t),p(!1),a&&a(e instanceof Error?e:Error(t))}else y(`All streaming methods failed and fallback is disabled`),p(!1)},[t,u,f,E,D,o,s,c,l,a]),ee=(0,X.useCallback)(()=>{d([]),h(null),y(null)},[]),F=(0,X.useCallback)(()=>{w.current&&=(w.current.abort(),null),T.current=null,p(!1),h(null)},[]);return(0,X.useEffect)(()=>()=>{w.current&&w.current.abort()},[]),{messages:u,isStreaming:f,currentStreamingMessage:m,connectionStatus:g,error:v,sendMessage:P,clearMessages:ee,stopStreaming:F,allMessages:m?[...u,m]:u,isWebSocketConnected:g===`websocket`,isUsingSSE:g===`sse`,isUsingREST:g===`rest`}}function yM(e){let{sessions:t,create:n}=pM(e),r=(t?.sessions.length??0)>0;return{hasSession:r,ensureSession:async()=>r?null:n({mode:`persistent`})}}async function bM(e){let t=await new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let[,e=``]=(typeof r.result==`string`?r.result:``).split(`,`,2);t(e)},r.onerror=()=>n(r.error||Error(`Failed to read image`)),r.readAsDataURL(e)});return{id:`${e.name}-${e.size}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:`image`,data:t,mimeType:e.type||`image/png`,name:e.name}}function xM(e){return String(e||``).trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)}function SM({agentId:e,routeAgentId:t,initialMessages:n,llmProvider:r,sessionKey:i}){let{showToast:a}=wo(),{hasSession:o,ensureSession:s}=yM(e),c=ft(),l=(0,X.useRef)(null),u=(0,X.useRef)(null),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)([]),{allMessages:h,isStreaming:g,currentStreamingMessage:_,connectionStatus:v,error:y,sendMessage:b,clearMessages:x,stopStreaming:S}=vM({agentId:e,initialMessages:n,historyKey:i,loadHistory:!1,llmProvider:r,enableWebSocket:!1,onError:e=>{a({title:`Chat Error`,description:e.message,variant:`destructive`})}});return(0,X.useEffect)(()=>{l.current?.scrollIntoView({behavior:`smooth`})},[h,_]),(0,X.useEffect)(()=>{g||u.current?.focus()},[g,i]),(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col rounded-lg border`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between border-b px-4 py-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Chat`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current session conversation`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`span`,{children:v}),h.length>0&&(0,Z.jsx)(`button`,{type:`button`,onClick:x,disabled:g,className:`text-destructive hover:underline disabled:opacity-50`,children:`Clear visible chat`})]})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4 space-y-4`,children:[h.length===0?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(Ea,{className:`mx-auto mb-4 h-10 w-10 opacity-40`}),(0,Z.jsx)(`p`,{className:`text-sm`,children:o?`No messages yet.`:`No session yet.`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs`,children:o?`Send a message to start the conversation.`:`Type a message to auto-create a session, or pick one in the Sessions panel.`})]})}):h.map((e,t)=>(0,Z.jsx)(dM,{message:e,isStreaming:g&&e===_,connectionStatus:v},`${e.timestamp}-${t}`)),y&&(0,Z.jsx)(`div`,{className:`rounded-lg bg-destructive/10 p-3 text-sm text-destructive`,children:y}),(0,Z.jsx)(`div`,{ref:l})]}),(0,Z.jsxs)(`div`,{className:`border-t p-4`,children:[p.length>0&&(0,Z.jsx)(`div`,{className:`mb-3 flex flex-wrap gap-2`,children:p.map(e=>(0,Z.jsxs)(`div`,{className:`group relative overflow-hidden rounded-md border bg-muted/20`,children:[(0,Z.jsx)(`img`,{src:`data:${e.mimeType};base64,${e.data}`,alt:e.name||`Pasted image`,className:`h-16 w-16 object-cover`}),(0,Z.jsx)(`div`,{className:`max-w-16 truncate px-2 py-1 text-[10px] text-muted-foreground`,children:e.name||e.mimeType}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>m(t=>t.filter(t=>t.id!==e.id)),className:`absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded-full bg-background/90 text-muted-foreground hover:text-foreground`,title:`Remove image`,children:(0,Z.jsx)(vr,{className:`h-3 w-3`})})]},e.id))}),(0,Z.jsxs)(`form`,{onSubmit:async e=>{e.preventDefault();let n=d.trim();if(!(!n&&p.length===0)){f(``);try{let e=await s();e?.current.sessionId&&c(`/agents/${encodeURIComponent(t)}/${encodeURIComponent(e.current.sessionId)}`,{replace:!0}),await b(n,{images:p.map(({id:e,...t})=>t)}),m([])}catch(e){a({title:`Chat Error`,description:e instanceof Error?e.message:`Failed to send message`,variant:`destructive`})}}},className:`flex gap-2`,children:[(0,Z.jsx)(`textarea`,{ref:u,value:d,onChange:e=>f(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),e.currentTarget.form?.requestSubmit())},onPaste:async e=>{let t=Array.from(e.clipboardData.items).filter(e=>e.kind===`file`&&e.type.startsWith(`image/`)).map(e=>e.getAsFile()).filter(e=>!!e);if(t.length!==0)try{let e=await Promise.all(t.map(bM));m(t=>[...t,...e])}catch(e){a({title:`Paste Error`,description:e instanceof Error?e.message:`Failed to read pasted image`,variant:`destructive`})}},placeholder:g?`Streaming in progress...`:o?`Type a message...`:`Type to start a new session…`,disabled:g,rows:2,className:`flex min-h-10 flex-1 resize-y rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50`}),g?(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:S,children:`Stop`}):(0,Z.jsx)(Y,{type:`submit`,disabled:!d.trim()&&p.length===0,children:`Send`})]}),(0,Z.jsxs)(`div`,{className:`mt-2 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Z.jsx)(zn,{className:`h-3.5 w-3.5`}),`Paste image files from clipboard directly into the input.`]})]})]})}function CM(){let{agentId:e,sessionId:t}=yt(),n=vn(),r=ft(),{showToast:i}=wo(),{selectEntity:a,goBack:o}=qC(),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1),y=(0,X.useRef)(null),{current:b,sessions:x,refresh:S,select:C}=pM(e||``),w=(0,X.useMemo)(()=>x?.sessions?x.currentSessionId?x.sessions.find(e=>e.id===x.currentSessionId)||null:x.currentSessionPath?x.sessions.find(e=>e.path===x.currentSessionPath)||null:x.sessions.find(e=>e.isCurrent)||null:null,[x]),T=[b?.mode||`persistent`,b?.sessionId||b?.sessionFile||`initial`].join(`:`);return(0,X.useEffect)(()=>{e&&(async()=>{u(!0);try{let i=await QD(e);a(i.id),c(i);let o=i.name||i.id;if(o&&decodeURIComponent(e)!==o){let e=n.pathname.endsWith(`/settings`)?`/agents/${encodeURIComponent(o)}/settings`:t?`/agents/${encodeURIComponent(o)}/${encodeURIComponent(t)}`:`/agents/${encodeURIComponent(o)}`;r(e,{replace:!0})}await S(),g(null)}catch(e){let t=e instanceof Error?e.message:`Failed to load agent`;g(t),i({title:`Error`,description:t,variant:`destructive`})}finally{u(!1)}})()},[e,t,n.pathname,r,S,a,i]),(0,X.useEffect)(()=>{if(!e||!t||!x)return;let n=decodeURIComponent(t),r=xM(n),a=x.sessions.find(e=>e.id===n||e.slug===n||xM(e.name)===r),o=!!(a&&(x.currentSessionId===a.id||x.currentSessionPath===a.path||b?.sessionId===a.id||b?.sessionFile===a.path)),s=b?.sessionId===n||x.currentSessionId===n;if(b?.mode===`persistent`&&o){y.current=null;return}if(!a){b?.mode===`persistent`&&s&&(y.current=null);return}y.current!==a.id&&(y.current=a.id,C({mode:`persistent`,sessionId:a.id}).catch(e=>{i({title:`Session Error`,description:e instanceof Error?e.message:`Failed to select session`,variant:`destructive`})}).finally(()=>{y.current===a.id&&(y.current=null)}))},[e,t,x,b?.mode,b?.sessionId,b?.sessionFile,C,i]),(0,X.useEffect)(()=>{if(!e)return;let t=async()=>{try{let t=await pO(e);c(e=>e?{...e,isActive:t.isActive,status:t.status,lastAccessed:t.lastAccessed}:null)}catch{}};t();let n=setInterval(t,5e3);return()=>clearInterval(n)},[e]),l?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,Z.jsxs)(`div`,{className:`text-center text-muted-foreground`,children:[(0,Z.jsx)(Nr,{className:`mx-auto mb-3 h-8 w-8 animate-pulse`}),(0,Z.jsx)(`p`,{children:`Loading agent...`})]})}):!s||h?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,Z.jsxs)(`div`,{className:`text-center text-destructive`,children:[(0,Z.jsx)(Nr,{className:`mx-auto mb-3 h-8 w-8`}),(0,Z.jsx)(`p`,{children:h||`Agent not found`})]})}):(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Z.jsx)(lw,{title:`Back to previous view`,onBack:o}),(0,Z.jsx)(`span`,{className:`h-3 w-3 shrink-0 rounded-full`,style:{backgroundColor:s.color||`#9ca3af`}}),(0,Z.jsx)(`h1`,{className:`truncate text-xl font-semibold`,children:s.label||s.name}),(0,Z.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,children:s.status})]}),(0,Z.jsx)(`p`,{className:`mt-1 truncate text-sm text-muted-foreground`,children:s.description||`${s.llmProvider} / ${s.model}`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[s.isActive?(0,Z.jsxs)(Y,{variant:`outline`,onClick:async()=>{if(e){m(!0);try{let t=await fO(e);c(t),i({title:`Stopped`,description:`${t.label||t.name} is inactive`})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to stop agent`,variant:`destructive`})}finally{m(!1)}}},disabled:p,children:[(0,Z.jsx)(Sa,{className:`mr-2 h-4 w-4`}),p?`Stopping...`:`Stop`]}):(0,Z.jsxs)(Y,{onClick:async()=>{if(e){f(!0);try{let t=await dO(e);c(t),i({title:`Started`,description:`${t.label||t.name} is active`})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to start agent`,variant:`destructive`})}finally{f(!1)}}},disabled:d,children:[(0,Z.jsx)(Ar,{className:`mr-2 h-4 w-4`}),d?`Starting...`:`Start`]}),(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>{a(s.id),r(`/agents/${encodeURIComponent(s.name||s.id)}/settings/identity`)},children:[(0,Z.jsx)(Wi,{className:`mr-2 h-4 w-4`}),`Settings`]}),(0,Z.jsx)(cw,{className:`h-9 w-9`})]})]}),(0,Z.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 gap-4 grid-rows-[minmax(0,1fr)_auto] xl:grid-rows-none xl:grid-cols-[minmax(0,1.2fr)_minmax(320px,0.8fr)]`,children:[(0,Z.jsx)(SM,{agentId:s.id,routeAgentId:s.name||s.id,initialMessages:b?.messages||[],llmProvider:s.llmProvider,sessionKey:T},T),(0,Z.jsxs)(`div`,{className:`flex min-h-0 flex-col rounded-lg border`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>v(e=>!e),"aria-expanded":_,className:K(`flex w-full items-center justify-between gap-2 px-4 py-3 text-left xl:pointer-events-none`,_?`border-b`:`xl:border-b`),children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Contextual Information`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current session and runtime state.`})]}),(0,Z.jsx)(qr,{className:K(`h-4 w-4 shrink-0 text-muted-foreground transition-transform xl:hidden`,_&&`rotate-180`)})]}),(0,Z.jsxs)(`div`,{className:K(`space-y-4 overflow-y-auto p-4 text-sm max-xl:max-h-viewport-half`,!_&&`max-xl:hidden`),children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Mode`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:b?.mode||x?.mode||`persistent`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Selected Session`}),(0,Z.jsx)(`div`,{className:`mt-1 break-all`,children:w?.name||(w?.isExperimental?`Experimental`:null)||b?.sessionId||`Default session`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Known Sessions`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:x?.sessions.length||0})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Thinking Level`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:b?.thinkingLevel||`high`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Model`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:b?.model?.modelId||s.model||`Not set`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Session File`}),(0,Z.jsx)(`div`,{className:`mt-1 break-all text-xs text-muted-foreground`,children:b?.sessionFile||`In-memory / not persisted yet`})]}),(0,Z.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4 text-sm text-muted-foreground`,children:[(0,Z.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 font-medium text-foreground`,children:[(0,Z.jsx)(yi,{className:`h-4 w-4`}),`Shape`]}),(0,Z.jsx)(`p`,{children:`Session selection lives in M2. Main content stays focused on the active conversation and its context.`})]})]})]})]})]})}var wM={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`,"lm-studio":``,vllm:``,custom:``},TM={anthropic:`https://api.anthropic.com`,openai:`https://api.openai.com/v1`,ollama:`http://localhost:11434/v1`,"lm-studio":`http://localhost:1234/v1`,vllm:`http://localhost:8000/v1`,custom:``};function EM(e){return TM[e]||``}function DM(e,t,n){return[e.trim()?`## Role\n${e.trim()}`:``,t.trim()?`## Identity\n${t.trim()}`:``,n.trim()?`## Instructions\n${n.trim()}`:``].filter(Boolean).join(`
|
|
35
|
+
`);o=n.pop()||``;for(let e of n)s(e)}o.trim()&&s(o)}finally{i.releaseLock()}}catch(e){if(n?.aborted)return;let t=e instanceof Error?e:Error(String(e));throw i?.(t),t}}}},Ej=()=>{let e=[`#FF6B6B`,`#4ECDC4`,`#45B7D1`,`#96CEB4`,`#FECA57`,`#FF9FF3`,`#54A0FF`,`#5F27CD`,`#00D2D3`,`#FF9F43`,`#10AC84`,`#EE5A24`,`#EA2027`,`#009432`,`#0652DD`];return e[Math.floor(Math.random()*e.length)]};function Dj(){let e=du()?.userType===`admin`,[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(e),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(e?null:`Access denied. Admin privileges required.`),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)({search:``,owner:``,type:``,status:``}),[_,v]=(0,X.useState)({userId:``,name:``,label:``,description:``,color:Ej(),type:`workspace`}),{showToast:y}=wo(),b=(0,X.useCallback)(async()=>{try{o(!0);let e=await Tj.workspaces.listAllWorkspaces();n(e),u(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch workspaces`;u(t),y({title:`Error`,description:t,variant:`destructive`})}finally{o(!1)}},[y]);(0,X.useEffect)(()=>{e&&b()},[e,b]);let x=(0,X.useCallback)(async()=>{try{c(!0);let e=await Tj.users.listUsers({status:`active`});i(e)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch users`;y({title:`Error`,description:t,variant:`destructive`})}finally{c(!1)}},[y]),S=async e=>{if(e.preventDefault(),!_.userId||!_.name.trim()){y({title:`Validation Error`,description:`User and workspace name are required`,variant:`destructive`});return}f(!0);try{let e={userId:_.userId,name:_.name.trim(),label:_.label.trim()||_.name.trim(),description:_.description.trim(),color:_.color,type:_.type};await Tj.workspaces.createWorkspace(e),v({userId:``,name:``,label:``,description:``,color:Ej(),type:`workspace`}),m(!1),await b(),y({title:`Success`,description:`Workspace created successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to create workspace`;y({title:`Error`,description:t,variant:`destructive`})}finally{f(!1)}},C=async(e,t)=>{if(confirm(`Are you sure you want to delete workspace "${t}"? This action cannot be undone and will delete all data in the workspace.`))try{await Tj.workspaces.deleteWorkspace(e),await b(),y({title:`Success`,description:`Workspace deleted successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to delete workspace`;y({title:`Error`,description:t,variant:`destructive`})}},w=async()=>{v({userId:``,name:``,label:``,description:``,color:Ej(),type:`workspace`}),m(!0),await x()},T=()=>{m(!1)};Ae(T,p);let E=t.filter(e=>{let t=h.search===``||e.name.toLowerCase().includes(h.search.toLowerCase())||e.label.toLowerCase().includes(h.search.toLowerCase())||e.ownerName&&e.ownerName.toLowerCase().includes(h.search.toLowerCase())||e.ownerEmail&&e.ownerEmail.toLowerCase().includes(h.search.toLowerCase()),n=h.owner===``||e.owner===h.owner,r=h.type===``||e.type===h.type,i=h.status===``||e.status===h.status;return t&&n&&r&&i}),D=Array.from(new Set(t.map(e=>e.owner))).map(e=>{let n=t.find(t=>t.owner===e);return{id:e,name:n?.ownerName||n?.ownerEmail||e}});return e?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`Workspace Administration`,description:`Manage workspaces across all users`}),t.some(e=>e.status!==`active`&&e.protection?.mode&&e.protection.mode!==`none`)&&(0,Z.jsxs)(`p`,{className:`text-sm rounded border p-3`,children:[t.filter(e=>e.status!==`active`&&e.protection?.mode&&e.protection.mode!==`none`).length,` protected workspaces waiting for their owners to start them.`]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center md:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Z.jsx)(q,{placeholder:`Search workspaces...`,value:h.search,onChange:e=>g(t=>({...t,search:e.target.value})),className:`md:w-64`}),(0,Z.jsxs)(`select`,{value:h.owner,onChange:e=>g(t=>({...t,owner:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Owners`}),D.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,Z.jsxs)(`select`,{value:h.type,onChange:e=>g(t=>({...t,type:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Types`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Z.jsx)(`option`,{value:`universe`,children:`Universe`})]}),(0,Z.jsxs)(`select`,{value:h.status,onChange:e=>g(t=>({...t,status:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Z.jsx)(`option`,{value:`active`,children:`Active`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Z.jsx)(`option`,{value:`error`,children:`Error`})]})]}),(0,Z.jsxs)(Y,{onClick:w,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Workspace`]})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[a&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading workspaces...`}),l&&!t.length&&(0,Z.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Z.jsx)(`p`,{children:l})}),!a&&!l&&E.length===0&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No workspaces found`}),E.length>0&&(0,Z.jsx)(`div`,{className:`border rounded-md`,children:(0,Z.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Z.jsxs)(`table`,{className:`w-full`,children:[(0,Z.jsx)(`thead`,{children:(0,Z.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Label`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Owner`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Type`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Status`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Color`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Z.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Z.jsx)(`tbody`,{children:E.map(e=>(0,Z.jsxs)(`tr`,{className:`border-t`,children:[(0,Z.jsx)(`td`,{className:`p-3 font-medium font-mono text-sm`,children:e.name}),(0,Z.jsx)(`td`,{className:`p-3`,children:e.label}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(ar,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`font-medium`,children:e.ownerName||`Unknown`}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e.ownerEmail})]})]})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.type===`universe`?`bg-accent text-primary`:`bg-info-subtle text-info`}`,children:e.type})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.status===`active`?`bg-success-subtle text-success`:e.status===`inactive`?`bg-warning-subtle text-warning`:`bg-destructive-subtle text-destructive`}`,children:e.status})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`div`,{className:`w-4 h-4 rounded border`,style:{backgroundColor:e.color}}),(0,Z.jsx)(`span`,{className:`font-mono text-xs`,children:e.color})]})}),(0,Z.jsx)(`td`,{className:`p-3`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Z.jsxs)(`td`,{className:`p-3 text-right space-x-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>window.open(`/workspaces/${e.name}`,`_blank`),title:`View workspace`,children:(0,Z.jsx)(ja,{className:`h-4 w-4`})}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>C(e.id,e.name),className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,title:`Delete workspace`,disabled:e.type===`universe`,children:(0,Z.jsx)(ti,{className:`h-4 w-4`})})]})]},e.id))})]})})})]}),(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-4 mt-8`,children:[(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:t.length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Total Workspaces`})]}),(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:t.filter(e=>e.status===`active`).length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Active Workspaces`})]}),(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:t.filter(e=>e.type===`universe`).length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Universe Workspaces`})]}),(0,Z.jsxs)(`div`,{className:`bg-card p-4 rounded-lg border`,children:[(0,Z.jsx)(`div`,{className:`text-2xl font-bold`,children:D.length}),(0,Z.jsx)(`div`,{className:`text-sm text-muted-foreground`,children:`Unique Owners`})]})]}),p&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-card rounded-lg p-6 w-full max-w-md mx-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-semibold`,children:`Create New Workspace`}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:T,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`form`,{onSubmit:S,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`userId`,children:`User`}),(0,Z.jsxs)(`select`,{id:`userId`,value:_.userId,onChange:e=>v(t=>({...t,userId:e.target.value})),disabled:d||s,className:`w-full px-3 py-2 border border-border rounded-md`,required:!0,children:[(0,Z.jsx)(`option`,{value:``,children:`Select a user...`}),r.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,` (`,e.email,`)`]},e.id))]}),s&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Loading users...`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Workspace Name`}),(0,Z.jsx)(q,{id:`name`,type:`text`,value:_.name,onChange:e=>v(t=>({...t,name:e.target.value})),placeholder:`my-workspace`,disabled:d,required:!0}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`Lowercase letters, numbers, and hyphens only`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`label`,children:`Display Label`}),(0,Z.jsx)(q,{id:`label`,type:`text`,value:_.label,onChange:e=>v(t=>({...t,label:e.target.value})),placeholder:`My Workspace`,disabled:d})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`description`,children:`Description`}),(0,Z.jsx)(q,{id:`description`,type:`text`,value:_.description,onChange:e=>v(t=>({...t,description:e.target.value})),placeholder:`Workspace description (optional)`,disabled:d})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`type`,children:`Type`}),(0,Z.jsxs)(`select`,{id:`type`,value:_.type,onChange:e=>v(t=>({...t,type:e.target.value})),disabled:d,className:`w-full px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Z.jsx)(`option`,{value:`universe`,children:`Universe`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`color`,children:`Color`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(q,{id:`color`,type:`color`,value:_.color,onChange:e=>v(t=>({...t,color:e.target.value})),className:`h-10 w-16 p-1`,disabled:d}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>v(e=>({...e,color:Ej()})),disabled:d,children:`Random`})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-4`,children:[(0,Z.jsx)(Y,{type:`submit`,disabled:d||s,className:`flex-1`,children:d?`Creating...`:`Create Workspace`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:T,disabled:d,children:`Cancel`})]})]})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function Oj(){let e=du()?.userType===`admin`;return(0,X.useEffect)(()=>{},[e]),e?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`All Contexts`,description:`Manage all contexts across all users`}),(0,Z.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Z.jsxs)(`div`,{className:`text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Global context management is currently under development. Check back later for updates.`})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function kj(){let e=du()?.userType===`admin`;return(0,X.useEffect)(()=>{},[e]),e?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`All Agents`,description:`Manage all AI agents across all users`}),(0,Z.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Z.jsxs)(`div`,{className:`text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Global agent management is currently under development. Check back later for updates.`})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}var Aj={tail:200,level:``,module:``};function jj(e){return e.slice(-1e3)}function Mj(e){switch(e.levelLabel){case`fatal`:return`text-destructive`;case`error`:return`text-destructive`;case`warn`:return`text-warning`;case`info`:return`text-info`;case`debug`:return`text-muted-foreground`;case`trace`:return`text-muted-foreground`;default:return`text-success`}}function Nj(){let e=yD(),t=du()?.userType===`admin`,{showToast:n}=wo(),r=(0,X.useRef)(null),[i,a]=(0,X.useState)(Aj),[o,s]=(0,X.useState)(Aj),[c,l]=(0,X.useState)([]),[u,d]=(0,X.useState)(t),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(t?null:`Access denied. Admin privileges required.`),v=(0,X.useCallback)(async e=>{try{d(!0);let t=await Tj.logs.getLogs(e);l(jj(t)),_(null)}catch(e){let t=e instanceof Error?e.message:`Failed to load server logs`;_(t),n({title:`Error`,description:t,variant:`destructive`})}finally{d(!1)}},[n]);(0,X.useEffect)(()=>{t&&v(i)},[i,t,v]),(0,X.useEffect)(()=>{if(!t||m)return;let e=new AbortController;return p(!0),Tj.logs.streamLogs(i,{signal:e.signal,onEntry:e=>{l(t=>jj([...t,e]))},onError:e=>{_(e.message)}}).catch(e=>{let t=e instanceof Error?e.message:`Log stream stopped`;_(t),n({title:`Stream error`,description:t,variant:`destructive`})}).finally(()=>{p(!1)}),()=>{e.abort()}},[i,t,m,n]),(0,X.useEffect)(()=>{!r.current||m||(r.current.scrollTop=r.current.scrollHeight)},[c,m]);let y=()=>{a({tail:Math.min(Math.max(Number(o.tail)||Aj.tail,1),500),level:o.level||``,module:o.module.trim()})},b=(0,X.useMemo)(()=>[{value:``,label:`All levels`},{value:`trace`,label:`Trace`},{value:`debug`,label:`Debug`},{value:`info`,label:`Info`},{value:`warn`,label:`Warn`},{value:`error`,label:`Error`},{value:`fatal`,label:`Fatal`}],[]);return t?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{onBack:e,title:`Server Logs`,description:`Live tail for the unified canvas-server logger`,actions:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(ui,{className:`w-4 h-4 ${f?`text-success`:`text-muted-foreground`}`}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:m?`Paused`:f?`Streaming`:`Disconnected`})]})}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-[140px_180px_1fr_auto]`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`tail`,children:`Tail`}),(0,Z.jsx)(q,{id:`tail`,type:`number`,min:1,max:500,value:o.tail,onChange:e=>s(t=>({...t,tail:Number(e.target.value)}))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`level`,children:`Level`}),(0,Z.jsx)(`select`,{id:`level`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:o.level,onChange:e=>s(t=>({...t,level:e.target.value})),children:b.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value||`all`))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`module`,children:`Module filter`}),(0,Z.jsx)(q,{id:`module`,placeholder:`auth, http, workspace...`,value:o.module,onChange:e=>s(t=>({...t,module:e.target.value}))})]}),(0,Z.jsx)(`div`,{className:`flex items-end`,children:(0,Z.jsx)(Y,{onClick:y,className:`w-full`,children:`Apply`})})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>h(e=>!e),children:[m?(0,Z.jsx)(Ar,{className:`w-4 h-4 mr-2`}):(0,Z.jsx)(Jr,{className:`w-4 h-4 mr-2`}),m?`Resume`:`Pause`]}),(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>v(i),children:[(0,Z.jsx)(Ba,{className:`w-4 h-4 mr-2`}),`Refresh`]}),(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>l([]),children:[(0,Z.jsx)(Qr,{className:`w-4 h-4 mr-2`}),`Clear buffer`]}),(0,Z.jsxs)(`span`,{className:`text-sm text-muted-foreground ml-auto`,children:[`Showing `,c.length,` lines`]})]}),g&&(0,Z.jsx)(`div`,{className:`rounded-md border border-destructive/30 bg-destructive/5 px-4 py-3 text-sm text-destructive`,children:g}),(0,Z.jsx)(`div`,{className:`border rounded-lg overflow-hidden`,children:(0,Z.jsx)(`div`,{ref:r,"data-scheme":`dark`,className:`bg-background text-success font-mono text-xs h-viewport-pane overflow-auto p-4 rounded-md`,children:u?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading logs...`}):c.length===0?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Z.jsx)(`div`,{className:`whitespace-pre-wrap break-words`,children:c.map((e,t)=>(0,Z.jsx)(`div`,{className:Mj(e),children:e.line},`${e.time||`log`}-${t}`))})})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}var Pj={async listRoles(e){let t=new URLSearchParams;e?.type&&t.append(`type`,e.type),e?.userId&&t.append(`userId`,e.userId),e?.workspaceId&&t.append(`workspaceId`,e.workspaceId),e?.status&&t.append(`status`,e.status);let n=t.toString(),r=n?`${no.roles}?${n}`:no.roles;return(await J.get(r)).roles||[]},async getRole(e){return(await J.get(`${no.roles}/${e}`)).role},async createRole(e){return(await J.post(no.roles,e)).role},async deleteRole(e,t=!1){let n=t?`?force=true`:``;await J.delete(`${no.roles}/${e}${n}`)},async startRole(e){return(await J.post(`${no.roles}/${e}/start`,{})).role},async stopRole(e){await J.post(`${no.roles}/${e}/stop`,{})},async restartRole(e){return(await J.post(`${no.roles}/${e}/restart`,{})).role},async getRoleLogs(e,t=100){return(await J.get(`${no.roles}/${e}/logs?tail=${t}`)).logs||[]},async getRoleStats(e){return(await J.get(`${no.roles}/${e}/stats`)).stats},async getRoleHealth(e){return(await J.get(`${no.roles}/${e}/health`)).health},async listTemplates(){return(await J.get(`${no.roleTemplates}`)).templates||[]},async getTemplate(e){return(await J.get(`${no.roleTemplates}/${e}`)).template}};function Fj({status:e}){let t={running:{icon:kr,color:`text-success`,bg:`bg-success-subtle`,label:`Running`},stopped:{icon:Bn,color:`text-muted-foreground`,bg:`bg-muted`,label:`Stopped`},starting:{icon:Zn,color:`text-info`,bg:`bg-info-subtle`,label:`Starting`},stopping:{icon:Zn,color:`text-warning`,bg:`bg-warning-subtle`,label:`Stopping`},error:{icon:er,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Error`},created:{icon:ui,color:`text-muted-foreground`,bg:`bg-muted`,label:`Created`},configured:{icon:ui,color:`text-info`,bg:`bg-info-subtle`,label:`Configured`},removed:{icon:Bn,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Removed`}},n=t[e]||t.created,r=n.icon;return(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${n.bg} ${n.color}`,children:[(0,Z.jsx)(r,{className:`w-3 h-3`}),n.label]})}function Ij({type:e}){return(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${e===`global`?`bg-accent text-primary`:`bg-info-subtle text-info`}`,children:[(0,Z.jsx)(pi,{className:`w-3 h-3`}),e===`global`?`Global`:`Workspace`]})}function Lj(){let e=yD(),t=du()?.userType===`admin`,[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)([]),[o,s]=(0,X.useState)(t),[c,l]=(0,X.useState)(t?null:`Access denied. Admin privileges required.`),[u,d]=(0,X.useState)(!1);Ae(()=>d(!1),u);let[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(!1);Ae(()=>h(!1),m);let[g,_]=(0,X.useState)([]),[v,y]=(0,X.useState)({type:``,status:``,search:``}),[b,x]=(0,X.useState)({template:``,name:``,type:`global`}),{showToast:S}=wo(),C=(0,X.useRef)(v);(0,X.useEffect)(()=>{C.current=v},[v]);let w=(0,X.useCallback)(async()=>{try{s(!0);let{type:e,status:t}=C.current,n=await Pj.listRoles({type:e||void 0,status:t||void 0});r(n),l(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch roles`;l(t)}finally{s(!1)}},[]),T=(0,X.useCallback)(async()=>{try{let e=await Pj.listTemplates();a(e)}catch(e){console.error(`Failed to fetch templates:`,e)}},[]);(0,X.useEffect)(()=>{t&&(w(),T())},[t,w,T]);let E=async()=>{if(!b.template||!b.name){S({title:`Validation Error`,description:`Template and name are required`,variant:`destructive`});return}try{await Pj.createRole(b),S({title:`Success`,description:`Role "${b.name}" created successfully`}),d(!1),M(),w()}catch(e){let t=e instanceof Error?e.message:`Failed to create role`;S({title:`Error`,description:t,variant:`destructive`})}},D=async e=>{try{await Pj.startRole(e.id),S({title:`Success`,description:`Role "${e.name}" started successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to start role`;S({title:`Error`,description:t,variant:`destructive`})}},O=async e=>{try{await Pj.stopRole(e.id),S({title:`Success`,description:`Role "${e.name}" stopped successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to stop role`;S({title:`Error`,description:t,variant:`destructive`})}},k=async e=>{try{await Pj.restartRole(e.id),S({title:`Success`,description:`Role "${e.name}" restarted successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to restart role`;S({title:`Error`,description:t,variant:`destructive`})}},A=async e=>{if(confirm(`Are you sure you want to delete role "${e.name}"?`))try{await Pj.deleteRole(e.id,e.status===`running`),S({title:`Success`,description:`Role "${e.name}" deleted successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to delete role`;S({title:`Error`,description:t,variant:`destructive`})}},j=async e=>{try{let t=await Pj.getRoleLogs(e.id,100);_(t),p(e),h(!0)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch logs`;S({title:`Error`,description:t,variant:`destructive`})}},M=()=>{x({template:``,name:``,type:`global`})},N=()=>{M(),d(!0)},P=()=>{d(!1),M()},ee=n.filter(e=>!v.search||e.name.toLowerCase().includes(v.search.toLowerCase())||e.template.toLowerCase().includes(v.search.toLowerCase()));return t?c&&!t?(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:c})}):(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{onBack:e,title:`Role Management`,description:`Manage global and workspace roles for Canvas services`,actions:(0,Z.jsxs)(Y,{onClick:N,className:`gap-2`,children:[(0,Z.jsx)(br,{className:`w-4 h-4`}),`Create Role`]})}),(0,Z.jsxs)(`div`,{className:`flex gap-4 items-end`,children:[(0,Z.jsxs)(`div`,{className:`flex-1`,children:[(0,Z.jsx)(G,{htmlFor:`search`,children:`Search`}),(0,Z.jsx)(q,{id:`search`,placeholder:`Search by name or template...`,value:v.search,onChange:e=>y({...v,search:e.target.value})})]}),(0,Z.jsxs)(`div`,{className:`w-48`,children:[(0,Z.jsx)(G,{htmlFor:`type`,children:`Type`}),(0,Z.jsxs)(`select`,{id:`type`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:v.type,onChange:e=>y({...v,type:e.target.value}),children:[(0,Z.jsx)(`option`,{value:``,children:`All Types`}),(0,Z.jsx)(`option`,{value:`global`,children:`Global`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`})]})]}),(0,Z.jsxs)(`div`,{className:`w-48`,children:[(0,Z.jsx)(G,{htmlFor:`status`,children:`Status`}),(0,Z.jsxs)(`select`,{id:`status`,className:`w-full px-3 py-2 border rounded-md bg-background`,value:v.status,onChange:e=>y({...v,status:e.target.value}),children:[(0,Z.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Z.jsx)(`option`,{value:`running`,children:`Running`}),(0,Z.jsx)(`option`,{value:`stopped`,children:`Stopped`}),(0,Z.jsx)(`option`,{value:`starting`,children:`Starting`}),(0,Z.jsx)(`option`,{value:`error`,children:`Error`})]})]}),(0,Z.jsxs)(Y,{onClick:w,variant:`outline`,children:[(0,Z.jsx)(Ba,{className:`w-4 h-4 mr-2`}),`Refresh`]})]}),o?(0,Z.jsx)(`div`,{className:`text-center py-8`,children:`Loading roles...`}):ee.length===0?(0,Z.jsxs)(`div`,{className:`text-center py-8 border rounded-lg`,children:[(0,Z.jsx)(pi,{className:`w-12 h-12 mx-auto text-muted-foreground mb-4`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:v.search||v.type||v.status?`No roles match your filters`:`No roles created yet`}),!v.search&&!v.type&&!v.status&&(0,Z.jsxs)(Y,{onClick:N,variant:`outline`,className:`mt-4`,children:[(0,Z.jsx)(br,{className:`w-4 h-4 mr-2`}),`Create Your First Role`]})]}):(0,Z.jsx)(`div`,{className:`border rounded-lg`,children:(0,Z.jsxs)(`table`,{className:`w-full`,children:[(0,Z.jsx)(`thead`,{className:`bg-muted/50`,children:(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Name`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Template`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Type`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Status`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Container`}),(0,Z.jsx)(`th`,{className:`text-left p-4 font-medium`,children:`Created`}),(0,Z.jsx)(`th`,{className:`text-right p-4 font-medium`,children:`Actions`})]})}),(0,Z.jsx)(`tbody`,{className:`divide-y`,children:ee.map(e=>(0,Z.jsxs)(`tr`,{className:`hover:bg-muted/50`,children:[(0,Z.jsx)(`td`,{className:`p-4 font-medium`,children:e.name}),(0,Z.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:e.template}),(0,Z.jsx)(`td`,{className:`p-4`,children:(0,Z.jsx)(Ij,{type:e.type})}),(0,Z.jsx)(`td`,{className:`p-4`,children:(0,Z.jsx)(Fj,{status:e.status})}),(0,Z.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:e.container?.name||`-`}),(0,Z.jsx)(`td`,{className:`p-4 text-sm text-muted-foreground`,children:new Date(e.createdAt).toLocaleDateString()}),(0,Z.jsx)(`td`,{className:`p-4`,children:(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[e.status===`stopped`||e.status===`created`?(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(e),title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-4 h-4`})}):e.status===`running`?(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>O(e),title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-4 h-4`})}):null,e.status===`running`&&(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>k(e),title:`Restart`,children:(0,Z.jsx)(Ba,{className:`w-4 h-4`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>j(e),title:`View Logs`,children:(0,Z.jsx)(Ki,{className:`w-4 h-4`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>A(e),title:`Delete`,className:`text-destructive hover:text-destructive`,children:(0,Z.jsx)(ti,{className:`w-4 h-4`})})]})})]},e.id))})]})}),u&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsx)(`div`,{className:`bg-background rounded-lg shadow-elevation-3 max-w-lg w-full mx-4 max-h-viewport-modal overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`p-6 space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(`h2`,{className:`text-xl font-bold`,children:`Create New Role`}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:P,children:(0,Z.jsx)(vr,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`template`,children:`Template *`}),(0,Z.jsxs)(`select`,{id:`template`,className:`w-full px-3 py-2 border rounded-md bg-background mt-1`,value:b.template,onChange:e=>x({...b,template:e.target.value}),children:[(0,Z.jsx)(`option`,{value:``,children:`Select a template...`}),i.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,` - `,e.description]},e.id))]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Role Name *`}),(0,Z.jsx)(q,{id:`name`,placeholder:`e.g., canvas-sshd`,value:b.name,onChange:e=>x({...b,name:e.target.value})})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`roleType`,children:`Type *`}),(0,Z.jsxs)(`select`,{id:`roleType`,className:`w-full px-3 py-2 border rounded-md bg-background mt-1`,value:b.type,onChange:e=>x({...b,type:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`global`,children:`Global (Server-wide)`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace (User-scoped)`})]})]}),b.template&&(0,Z.jsxs)(`div`,{className:`p-4 bg-muted rounded-lg`,children:[(0,Z.jsx)(`h3`,{className:`font-medium mb-2`,children:`Template Info`}),i.find(e=>e.id===b.template)&&(0,Z.jsxs)(`div`,{className:`text-sm space-y-1 text-muted-foreground`,children:[(0,Z.jsxs)(`p`,{children:[(0,Z.jsx)(`strong`,{children:`Image:`}),` `,i.find(e=>e.id===b.template)?.container.image]}),(0,Z.jsxs)(`p`,{children:[(0,Z.jsx)(`strong`,{children:`Category:`}),` `,i.find(e=>e.id===b.template)?.category]}),i.find(e=>e.id===b.template)?.documentation?.readme&&(0,Z.jsx)(`p`,{className:`mt-2`,children:i.find(e=>e.id===b.template)?.documentation?.readme})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2 pt-4 border-t`,children:[(0,Z.jsx)(Y,{variant:`outline`,onClick:P,children:`Cancel`}),(0,Z.jsx)(Y,{onClick:E,children:`Create Role`})]})]})})}),m&&f&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-background rounded-lg shadow-elevation-3 max-w-4xl w-full mx-4 max-h-viewport-modal flex flex-col`,children:[(0,Z.jsxs)(`div`,{className:`p-6 border-b flex items-center justify-between`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-xl font-bold`,children:`Role Logs`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:f.name})]}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>h(!1),children:(0,Z.jsx)(vr,{className:`w-4 h-4`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto p-6`,children:(0,Z.jsx)(`div`,{"data-scheme":`dark`,className:`bg-background text-success p-4 rounded font-mono text-xs overflow-x-auto`,children:g.length===0?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Z.jsx)(`pre`,{children:g.join(`
|
|
36
|
+
`)})})}),(0,Z.jsx)(`div`,{className:`p-4 border-t flex justify-end`,children:(0,Z.jsx)(Y,{onClick:()=>h(!1),children:`Close`})})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function Rj(){let e=yD(),t=du(),n=t?.userType===`admin`,[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(n),[s,c]=(0,X.useState)(n?null:`Access denied. Admin privileges required.`),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)({status:``,userType:``,search:``}),[x,S]=(0,X.useState)({name:``,email:``,password:``,userType:`user`,status:`active`}),{showToast:C}=wo();(0,X.useEffect)(()=>{n&&(async()=>{try{let e=await gu(),t=!!e?.strategies?.local?.requireEmailVerification;g(t),v(e?.strategies?.local?.passwordPolicy||null)}catch{g(!1),v(null)}})()},[n]);let w=e=>{let t=e.trim().toLowerCase();return t.length<3||t.length>39?`Username must be 3-39 characters long`:/^[a-z0-9_-]+$/.test(t)?null:`Username can only contain lowercase letters, numbers, underscores, and hyphens`},T=e=>{let t=e||``,n=_||{},r=n.minLength??12,i=n.maxLength??128,a=[];return t.length<r&&a.push(`at least ${r} characters`),t.length>i&&a.push(`no more than ${i} characters`),(n.requireUppercase??!0)&&!/[A-Z]/.test(t)&&a.push(`an uppercase letter`),(n.requireLowercase??!0)&&!/[a-z]/.test(t)&&a.push(`a lowercase letter`),(n.requireNumbers??!0)&&!/[0-9]/.test(t)&&a.push(`a number`),(n.requireSpecialChars??!0)&&!/[^A-Za-z0-9]/.test(t)&&a.push(`a special character`),a.length?`Password must contain ${a.join(`, `).replace(/, ([^,]*)$/,` and $1`)}.`:null},E=()=>{let e=_||{},t=[],n=e.minLength??12;return t.push(`${n}+ chars`),(e.requireUppercase??!0)&&t.push(`uppercase`),(e.requireLowercase??!0)&&t.push(`lowercase`),(e.requireNumbers??!0)&&t.push(`number`),(e.requireSpecialChars??!0)&&t.push(`special`),t.join(`, `)},D=e=>{if(!e)return`-`;let t=new Date(e);return isNaN(t.getTime())?`-`:t.toLocaleString()},O=async e=>{try{await _u(e),C({title:`Verification email`,description:`If the account exists, a verification email was sent.`})}catch(e){let t=e instanceof Error?e.message:`Failed to send verification email`;C({title:`Error`,description:t,variant:`destructive`})}},k=(0,X.useCallback)(async()=>{try{o(!0);let{status:e,userType:t}=y,n=await Tj.users.listUsers({status:e||void 0,userType:t||void 0});i(n),c(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch users`;c(t),C({title:`Error`,description:t,variant:`destructive`})}finally{o(!1)}},[y,C]);(0,X.useEffect)(()=>{n&&k()},[k,n]);let A=async e=>{if(e.preventDefault(),!x.name.trim()||!x.email.trim()){C({title:`Validation Error`,description:`Name and email are required`,variant:`destructive`});return}let t=w(x.name);if(t){C({title:`Validation Error`,description:t,variant:`destructive`});return}if(!x.password.trim()){C({title:`Validation Error`,description:`Password is required`,variant:`destructive`});return}let n=T(x.password);if(n){C({title:`Validation Error`,description:n,variant:`destructive`});return}u(!0);try{let e={name:x.name.trim().toLowerCase(),email:x.email.trim(),userType:x.userType,status:x.status};if(x.password.trim()&&(e.password=x.password),await Tj.users.createUser(e),h&&x.status===`pending`)try{await _u(x.email.trim())}catch{}S({name:``,email:``,password:``,userType:`user`,status:h?`pending`:`active`}),m(!1),await k(),C({title:`Success`,description:`User created successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to create user`;C({title:`Error`,description:t,variant:`destructive`})}finally{u(!1)}},j=async e=>{if(e.preventDefault(),!d)return;let t=w(x.name);if(t){C({title:`Validation Error`,description:t,variant:`destructive`});return}if(x.password.trim()){let e=T(x.password);if(e){C({title:`Validation Error`,description:e,variant:`destructive`});return}}u(!0);try{let e={name:x.name.trim().toLowerCase(),email:x.email.trim(),userType:x.userType,status:x.status};x.password.trim()&&(e.password=x.password),await Tj.users.updateUser(d.id,e),f(null),m(!1),await k(),C({title:`Success`,description:`User updated successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to update user`;C({title:`Error`,description:t,variant:`destructive`})}finally{u(!1)}},M=async(e,t)=>{if(confirm(`Are you sure you want to delete user "${t}"? This action cannot be undone.`))try{await Tj.users.deleteUser(e),await k(),C({title:`Success`,description:`User deleted successfully`})}catch(e){let t=e instanceof Error?e.message:`Failed to delete user`;C({title:`Error`,description:t,variant:`destructive`})}},N=()=>{f(null),S({name:``,email:``,password:``,userType:`user`,status:h?`pending`:`active`}),m(!0)},P=e=>{f(e),S({name:e.name,email:e.email,password:``,userType:e.userType,status:e.status}),m(!0)},ee=()=>{m(!1),f(null)};Ae(ee,p);let F=r.filter(e=>y.search===``||e.name.toLowerCase().includes(y.search.toLowerCase())||e.email.toLowerCase().includes(y.search.toLowerCase()));return n?(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{onBack:e,title:`User Management`,description:`Manage user accounts and permissions`}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 md:flex-row md:items-center md:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 md:flex-row md:items-center`,children:[(0,Z.jsx)(q,{placeholder:`Search users...`,value:y.search,onChange:e=>b(t=>({...t,search:e.target.value})),className:`md:w-64`}),(0,Z.jsxs)(`select`,{value:y.status,onChange:e=>b(t=>({...t,status:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Statuses`}),(0,Z.jsx)(`option`,{value:`active`,children:`Active`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Z.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,Z.jsx)(`option`,{value:`deleted`,children:`Deleted`})]}),(0,Z.jsxs)(`select`,{value:y.userType,onChange:e=>b(t=>({...t,userType:e.target.value})),className:`px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:``,children:`All Types`}),(0,Z.jsx)(`option`,{value:`user`,children:`User`}),(0,Z.jsx)(`option`,{value:`admin`,children:`Admin`})]})]}),(0,Z.jsxs)(Y,{onClick:N,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create User`]})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[a&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading users...`}),s&&!r.length&&(0,Z.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Z.jsx)(`p`,{children:s})}),!a&&!s&&F.length===0&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No users found`}),F.length>0&&(0,Z.jsx)(`div`,{className:`border rounded-md`,children:(0,Z.jsx)(`div`,{className:`overflow-x-auto`,children:(0,Z.jsxs)(`table`,{className:`w-full`,children:[(0,Z.jsx)(`thead`,{children:(0,Z.jsxs)(`tr`,{className:`bg-muted/50`,children:[(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Name`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Email`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Type`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Status`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Created`}),(0,Z.jsx)(`th`,{className:`text-left p-3 font-medium`,children:`Updated`}),(0,Z.jsx)(`th`,{className:`text-right p-3 font-medium`,children:`Actions`})]})}),(0,Z.jsx)(`tbody`,{children:F.map(e=>(0,Z.jsxs)(`tr`,{className:`border-t`,children:[(0,Z.jsx)(`td`,{className:`p-3 font-medium`,children:e.name}),(0,Z.jsx)(`td`,{className:`p-3`,children:e.email}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.userType===`admin`?`bg-destructive-subtle text-destructive`:`bg-info-subtle text-info`}`,children:e.userType})}),(0,Z.jsx)(`td`,{className:`p-3`,children:(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs ${e.status===`active`?`bg-success-subtle text-success`:e.status===`inactive`?`bg-warning-subtle text-warning`:e.status===`pending`?`bg-info-subtle text-info`:`bg-destructive-subtle text-destructive`}`,children:e.status})}),(0,Z.jsx)(`td`,{className:`p-3`,children:D(e.createdAt)}),(0,Z.jsx)(`td`,{className:`p-3`,children:D(e.updatedAt)}),(0,Z.jsxs)(`td`,{className:`p-3 text-right space-x-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>P(e),children:(0,Z.jsx)(Za,{className:`h-4 w-4`})}),h&&e.status===`pending`&&(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>O(e.email),title:`Resend activation email`,children:`Resend activation`}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:()=>M(e.id,e.name),className:`text-destructive hover:bg-destructive/10 hover:text-destructive`,disabled:e.id===t?.id,title:e.id===t?.id?`Cannot delete your own account`:`Delete user`,children:(0,Z.jsx)(ti,{className:`h-4 w-4`})})]})]},e.id))})]})})})]}),p&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-card rounded-lg p-6 w-full max-w-md mx-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-semibold`,children:d?`Edit User`:`Create New User`}),(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,onClick:ee,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`form`,{onSubmit:d?j:A,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`name`,children:`Username`}),(0,Z.jsx)(q,{id:`name`,type:`text`,value:x.name,onChange:e=>S(t=>({...t,name:e.target.value.toLowerCase().replace(/\s+/g,``)})),placeholder:`Enter username`,disabled:l,required:!0}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:`3-39 characters, lowercase letters, numbers, underscores, and hyphens only`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`email`,children:`Email`}),(0,Z.jsx)(q,{id:`email`,type:`email`,value:x.email,onChange:e=>S(t=>({...t,email:e.target.value})),placeholder:`Enter email address`,disabled:l,required:!0})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(G,{htmlFor:`password`,children:[`Password `,d&&`(leave blank to keep current)`]}),(0,Z.jsx)(q,{id:`password`,type:`password`,value:x.password,onChange:e=>S(t=>({...t,password:e.target.value})),placeholder:d?`Leave blank to keep current`:`Enter password`,disabled:l,required:!d}),!d&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[`Must satisfy: `,E()]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`userType`,children:`User Type`}),(0,Z.jsxs)(`select`,{id:`userType`,value:x.userType,onChange:e=>S(t=>({...t,userType:e.target.value})),disabled:l,className:`w-full px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:`user`,children:`User`}),(0,Z.jsx)(`option`,{value:`admin`,children:`Admin`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(G,{htmlFor:`status`,children:`Status`}),(0,Z.jsxs)(`select`,{id:`status`,value:x.status,onChange:e=>S(t=>({...t,status:e.target.value})),disabled:l,className:`w-full px-3 py-2 border border-border rounded-md`,children:[(0,Z.jsx)(`option`,{value:`active`,children:`Active`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`}),(0,Z.jsx)(`option`,{value:`pending`,children:`Pending`}),(0,Z.jsx)(`option`,{value:`deleted`,children:`Deleted`})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-4`,children:[(0,Z.jsx)(Y,{type:`submit`,disabled:l,className:`flex-1`,children:l?`Processing...`:d?`Update User`:`Create User`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:ee,disabled:l,children:`Cancel`})]})]})]})})]}):(0,Z.jsx)(`div`,{className:`text-center space-y-4`,children:(0,Z.jsx)(`div`,{className:`text-destructive`,children:`Access denied. Admin privileges required.`})})}function zj(){let e=yD(),{showToast:t}=wo(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(``),f=du()?.userType===`admin`,p=(0,X.useCallback)(()=>nj().then(e=>{r(e),d((e.allowHosts||[]).join(`, `)),l(null)}).catch(e=>l(e instanceof Error?e.message:`Failed to load server defaults`)).finally(()=>a(!1)),[]);(0,X.useEffect)(()=>{p()},[p]);let m=()=>{a(!0),p()};return(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[(0,Z.jsx)(sw,{onBack:e,compact:!0,className:`mb-6`,title:`Server search & AI defaults`,description:`Entire server · Set the embedding defaults accounts inherit. Account and workspace overrides take priority. Running workspaces adopt new defaults when restarted.`,actions:(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:m,disabled:i,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})}),!f&&(0,Z.jsxs)(`div`,{className:`mb-4 flex items-start gap-2 rounded-md border p-3 text-xs`,children:[(0,Z.jsx)(ha,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:`Read-only. Changing server defaults requires an admin account. This is what your workspaces inherit.`})]}),i?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):c||!n?(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Server defaults unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:c||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:m,children:`Retry`})]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Config file: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:n.configPath})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-semibold`,children:`Endpoint allowlist`}),(0,Z.jsx)(`p`,{className:`mb-2 mt-1 text-[11px] text-muted-foreground`,children:`Provider URLs are fetched by the server, so they are an SSRF surface. Link-local and cloud-metadata targets are always refused; list additional hosts here to permit them. Comma-separated, empty = only the always-blocked ranges apply.`}),(0,Z.jsx)(q,{value:u,disabled:!f,onChange:e=>d(e.target.value),placeholder:`gpu.internal, embeddings.example.com`,className:`h-8 text-sm`})]}),(0,Z.jsx)(bj,{value:n.serverDefaults||{},effective:n.serverDefaults||{},inherited:{},saving:o,disabled:!f,saveLabel:`Save server defaults`,onSave:async e=>{s(!0);try{let n=u.split(`,`).map(e=>e.trim()).filter(Boolean),r=await rj({...e,...n.length?{allowHosts:n}:{}});t({title:`Server defaults saved`,description:`Written to ${r.configPath}. Every user inherits these, so running workspaces keep their current tables until restarted.`}),await p()}catch(e){t({title:`Save failed`,description:e instanceof Error?e.message:`Failed to save`,variant:`destructive`})}finally{s(!1)}}},JSON.stringify(n.serverDefaults))]})]})}function Bj(){return J.get(no.admin.authConfig)}function Vj(e){return J.put(no.admin.authConfig,e)}function Hj(e,t,n){return J.post(`${no.admin.authConfig}/test`,{strategy:`ldap`,name:e,server:t,email:n})}function Uj(e,t,n){return J.post(`${no.admin.authConfig}/test`,{strategy:`imap`,domain:e,email:t,password:n})}var Wj=0,Gj=()=>`row-${++Wj}`;function Kj(e){let{servers:t,...n}=e.strategies.ldap,{domains:r,...i}=e.strategies.imap;return{allowUserRegistrations:e.allowUserRegistrations,local:e.strategies.local,ldap:{...n,servers:Object.entries(t).map(([e,t])=>({...t,id:Gj(),name:e,originalName:e}))},imap:{...i,domains:Object.entries(r).map(([e,t])=>({...t,id:Gj(),domain:e}))},google:e.strategies.google??{enabled:!1,defaultUserType:`user`,defaultStatus:`active`,clientId:``,clientSecretSet:!1,allowedDomains:[],autoCreateUsers:!0,webOrigins:[]}}}function qj(e){let{id:t,name:n,originalName:r,...i}=e;return{...i,...r&&r!==e.name?{previousName:r}:{}}}function Jj(e){return{allowUserRegistrations:e.allowUserRegistrations,strategies:{local:e.local,ldap:{enabled:e.ldap.enabled,defaultUserType:e.ldap.defaultUserType,defaultStatus:e.ldap.defaultStatus,servers:Object.fromEntries(e.ldap.servers.map(e=>[e.name.trim(),qj(e)]))},imap:{enabled:e.imap.enabled,defaultUserType:e.imap.defaultUserType,defaultStatus:e.imap.defaultStatus,domains:Object.fromEntries(e.imap.domains.map(({id:e,domain:t,...n})=>[t.trim().toLowerCase(),n]))},google:e.google}}}function Yj({value:e,onChange:t,placeholder:n,disabled:r}){let i=e.join(`, `),[a,o]=(0,X.useState)(i),[s,c]=(0,X.useState)(i);return i!==s&&(c(i),a.split(/[\s,]+/).filter(Boolean).join(`, `)!==i&&o(i)),(0,Z.jsx)(q,{className:`h-8 text-sm`,value:a,placeholder:n,disabled:r,onChange:e=>{o(e.target.value),t(e.target.value.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean))}})}var Xj={originalName:null,url:`ldap://`,bindDN:``,bindPasswordSet:!1,bindPassword:void 0,searchBase:``,searchFilter:`(mail={{email}})`,attributes:[`mail`,`cn`,`displayName`,`memberOf`],groupAttribute:`memberOf`,tls:!1},Zj={domain:``,name:``,host:``,port:993,secure:!0,startTLS:!1,requireAppPassword:!1},Qj=`h-8 rounded-md border border-input bg-transparent px-2 text-sm outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50`;function $j({label:e,hint:t,children:n,className:r}){return(0,Z.jsxs)(`label`,{className:K(`flex min-w-0 flex-col gap-1`,r),children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium`,children:e}),n,t&&(0,Z.jsx)(`span`,{className:`text-[11px] text-muted-foreground`,children:t})]})}function eM({checked:e,onChange:t,disabled:n,label:r,hint:i}){return(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 text-sm`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:e,disabled:n,onChange:e=>t(e.target.checked)}),(0,Z.jsxs)(`span`,{children:[r,i&&(0,Z.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:i})]})]})}function tM({title:e,description:t,enabled:n,onToggle:r,disabled:i,children:a}){return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-semibold`,children:e}),(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:t})]}),r&&(0,Z.jsxs)(`label`,{className:`flex shrink-0 items-center gap-2 text-xs font-medium`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:!!n,disabled:i,onChange:e=>r(e.target.checked)}),n?`Enabled`:`Disabled`]})]}),(0,Z.jsx)(`div`,{className:K(`mt-4 space-y-4`,r&&!n&&`opacity-60`),children:a})]})}function nM({result:e}){return e?(0,Z.jsxs)(`div`,{className:K(`flex items-start gap-2 rounded-md border p-2 text-xs`,e.ok?`border-emerald-500/40 bg-emerald-500/5`:`border-destructive/40 bg-destructive/5`),children:[e.ok?(0,Z.jsx)(Sr,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-emerald-600`}):(0,Z.jsx)(Bn,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 text-destructive`}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`p`,{children:e.message}),e.user&&e.user.groups.length>0&&(0,Z.jsxs)(`p`,{className:`mt-1 break-all text-muted-foreground`,children:[`Groups: `,e.user.groups.join(` · `)]})]})]}):null}function rM({value:e,onChange:t,disabled:n}){return(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-4`,children:[(0,Z.jsx)($j,{label:`New accounts are`,children:(0,Z.jsxs)(`select`,{className:Qj,value:e.defaultUserType,disabled:n,onChange:e=>t({defaultUserType:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`user`,children:`Users`}),(0,Z.jsx)(`option`,{value:`admin`,children:`Admins`})]})}),(0,Z.jsx)($j,{label:`Initial status`,children:(0,Z.jsxs)(`select`,{className:Qj,value:e.defaultStatus,disabled:n,onChange:e=>t({defaultStatus:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`active`,children:`Active — can sign in right away`}),(0,Z.jsx)(`option`,{value:`pending`,children:`Pending — an admin activates them`}),(0,Z.jsx)(`option`,{value:`inactive`,children:`Inactive`})]})})]}),e.defaultUserType===`admin`&&(0,Z.jsxs)(`p`,{className:`flex items-start gap-1.5 text-[11px] text-destructive`,children:[(0,Z.jsx)(ha,{className:`mt-0.5 h-3.5 w-3.5 shrink-0`}),`Everyone who can sign in through this backend becomes a server admin on first login.`]})]})}function iM({row:e,index:t,onChange:n,onRemove:r,disabled:i}){let[a,o]=(0,X.useState)(``),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(null),d=async()=>{c(!0),u(null);try{u(await Hj(e.originalName??e.name,qj(e),a.trim()||void 0))}catch(e){u({ok:!1,message:e instanceof Error?e.message:`Test failed`})}finally{c(!1)}},f=e.bindPassword===null?`cleared on save`:typeof e.bindPassword==`string`?`replaced on save`:e.bindPasswordSet?`stored — leave empty to keep it`:`none set`;return(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:[`#`,t+1]}),(0,Z.jsx)(q,{className:`h-8 max-w-[14rem] font-mono text-sm`,value:e.name,disabled:i,onChange:e=>n({name:e.target.value}),placeholder:`primary`,"aria-label":`Server name`}),(0,Z.jsx)(`div`,{className:`flex-1`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:r,disabled:i,"aria-label":`Remove server`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsx)($j,{label:`Server URL`,hint:`ldap:// or ldaps://host:port`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.url,disabled:i,onChange:e=>n({url:e.target.value}),placeholder:`ldaps://dc1.example.com:636`})}),(0,Z.jsx)($j,{label:`Search base`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.searchBase,disabled:i,onChange:e=>n({searchBase:e.target.value}),placeholder:`ou=users,dc=example,dc=com`})}),(0,Z.jsx)($j,{label:`Bind DN`,hint:`Service account used to look users up. Empty = anonymous search.`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.bindDN,disabled:i,onChange:e=>n({bindDN:e.target.value}),placeholder:`cn=canvas,ou=services,dc=example,dc=com`})}),(0,Z.jsx)($j,{label:`Bind password`,hint:(0,Z.jsxs)(Z.Fragment,{children:[`Currently: `,f,e.bindPasswordSet&&e.bindPassword!==null&&(0,Z.jsxs)(Z.Fragment,{children:[` · `,(0,Z.jsx)(`button`,{type:`button`,className:`underline hover:text-foreground`,disabled:i,onClick:()=>n({bindPassword:null}),children:`clear`})]})]}),children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`password`,autoComplete:`new-password`,value:typeof e.bindPassword==`string`?e.bindPassword:``,disabled:i,onChange:e=>n({bindPassword:e.target.value===``?void 0:e.target.value}),placeholder:e.bindPasswordSet&&e.bindPassword!==null?`••••••••`:``})}),(0,Z.jsx)($j,{label:`User search filter`,hint:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`font-mono`,children:`{{email}}`}),` is replaced by the address typed at sign-in.`]}),children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.searchFilter,disabled:i,onChange:e=>n({searchFilter:e.target.value})})}),(0,Z.jsx)($j,{label:`Group attribute`,hint:`Group memberships drive team workspace sharing.`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.groupAttribute,disabled:i,onChange:e=>n({groupAttribute:e.target.value}),placeholder:`memberOf`})}),(0,Z.jsx)($j,{label:`Attributes to read`,hint:`Comma-separated.`,className:`sm:col-span-2`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.attributes.join(`, `),disabled:i,onChange:e=>n({attributes:e.target.value.split(`,`).map(e=>e.trim()).filter(Boolean)})})})]}),(0,Z.jsx)(eM,{checked:e.tls,disabled:i,onChange:e=>n({tls:e}),label:`Accept self-signed certificates`,hint:`Skips certificate verification for ldaps://. Only for directories with a private CA.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2 border-t pt-3`,children:[(0,Z.jsx)($j,{label:`Test`,hint:`Binds with the settings above (unsaved edits included). Add an e-mail to also look that user up.`,className:`min-w-[14rem] flex-1`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`email`,value:a,onChange:e=>o(e.target.value),placeholder:`someone@example.com (optional)`})}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:d,disabled:s||i,className:`mb-5`,children:[s&&(0,Z.jsx)(Ti,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Test connection`]})]}),(0,Z.jsx)(nM,{result:l})]})}function aM({row:e,onChange:t,onRemove:n,disabled:r}){let[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null);return(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`shrink-0 text-xs text-muted-foreground`,children:`@`}),(0,Z.jsx)(q,{className:`h-8 max-w-[16rem] font-mono text-sm`,value:e.domain,disabled:r,onChange:e=>t({domain:e.target.value}),placeholder:`example.com`,"aria-label":`E-mail domain`}),(0,Z.jsx)(`div`,{className:`flex-1`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:n,disabled:r,"aria-label":`Remove domain`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-[1fr_6rem_1fr]`,children:[(0,Z.jsx)($j,{label:`IMAP host`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:e.host,disabled:r,onChange:e=>t({host:e.target.value}),placeholder:`imap.example.com`})}),(0,Z.jsx)($j,{label:`Port`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`number`,min:1,max:65535,value:e.port,disabled:r,onChange:e=>t({port:Number(e.target.value)})})}),(0,Z.jsx)($j,{label:`Label on the sign-in form`,hint:`Optional.`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,value:e.name,disabled:r,onChange:e=>t({name:e.target.value}),placeholder:`Example Mail`})})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-x-6 gap-y-2`,children:[(0,Z.jsx)(eM,{checked:e.secure,disabled:r,onChange:e=>t({secure:e,...e?{startTLS:!1}:{}}),label:`TLS from the start`,hint:`Usually port 993.`}),(0,Z.jsx)(eM,{checked:e.startTLS,disabled:r||e.secure,onChange:e=>t({startTLS:e}),label:`Require STARTTLS`,hint:`Plain port 143 upgraded to TLS.`}),(0,Z.jsx)(eM,{checked:e.requireAppPassword,disabled:r,onChange:e=>t({requireAppPassword:e}),label:`Needs an app password`,hint:`Shown as a hint on the sign-in form.`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2 border-t pt-3`,children:[(0,Z.jsx)($j,{label:`Test sign-in`,hint:`A real IMAP login with these credentials, logged straight out. Nothing is stored.`,className:`min-w-[12rem] flex-1`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`email`,value:i,onChange:e=>a(e.target.value),placeholder:`someone@${e.domain||`example.com`}`})}),(0,Z.jsx)($j,{label:`Password`,className:`mb-5 min-w-[10rem] flex-1`,children:(0,Z.jsx)(q,{className:`h-8 text-sm`,type:`password`,autoComplete:`off`,value:o,onChange:e=>s(e.target.value)})}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:async()=>{l(!0),d(null);try{let{id:t,domain:n,...r}=e;d(await Uj(r,i.trim(),o))}catch(e){d({ok:!1,message:e instanceof Error?e.message:`Test failed`})}finally{l(!1),s(``)}},disabled:c||r||!i||!o,className:`mb-5`,children:[c&&(0,Z.jsx)(Ti,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Test`]})]}),(0,Z.jsx)(nM,{result:u})]})}function oM(){let e=yD(),{showToast:t}=wo(),n=du()?.userType===`admin`,[r,i]=(0,X.useState)(``),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),_=(0,X.useCallback)(()=>Bj().then(e=>{let t=Kj(e.config);i(e.configPath),o(t),c(t),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to load auth configuration`)).finally(()=>u(!1)),[]);(0,X.useEffect)(()=>{n&&_()},[n,_]);let v=(0,X.useMemo)(()=>!!s&&!!a&&JSON.stringify(Jj(s))!==JSON.stringify(Jj(a)),[s,a]),y=e=>c(t=>t&&e(t)),b=(e,t)=>y(n=>({...n,ldap:{...n.ldap,servers:n.ldap.servers.map(n=>n.id===e?{...n,...t}:n)}})),x=(e,t)=>y(n=>({...n,imap:{...n.imap,domains:n.imap.domains.map(n=>n.id===e?{...n,...t}:n)}})),S=async()=>{if(!s)return;let e=s.ldap.servers.map(e=>e.name.trim()),n=s.imap.domains.map(e=>e.domain.trim().toLowerCase());if(e.some(e=>!e)||new Set(e).size!==e.length){g(`Every LDAP server needs a unique name.`);return}if(n.some(e=>!e)||new Set(n).size!==n.length){g(`Every IMAP domain must be filled in and listed once.`);return}f(!0),g(null);try{let e=Kj((await Vj(Jj(s))).config);o(e),c(e),t({title:`Authentication settings saved`,description:`Applied immediately — the next sign-in uses them.`})}catch(e){g(e instanceof Error?e.message.replace(/^HTTP \d+:\s*/,``):`Failed to save`)}finally{f(!1)}},C=(0,Z.jsx)(sw,{onBack:e,compact:!0,className:`mb-6`,title:`Authentication`,description:`Entire server · Choose how people sign in: local passwords, your LDAP directory, or their mail server over IMAP.`,actions:n&&(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>{u(!0),_()},disabled:l||d,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Reload`]})});return n?(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6 pb-24`,children:[C,l&&!s?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):p||!s?(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Authentication settings unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:p||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>{u(!0),_()},children:`Retry`})]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Config file: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:r}),` · Sign-in picks the backend from the account: existing users keep the method they were created with; a new address tries LDAP first (when enabled), then IMAP for a listed domain, then local.`]}),(0,Z.jsxs)(tM,{title:`Sign-up & local passwords`,description:`Accounts whose password is stored on this server.`,children:[(0,Z.jsx)(eM,{checked:s.allowUserRegistrations,onChange:e=>y(t=>({...t,allowUserRegistrations:e})),label:`Allow self-registration`,hint:`Off = only admins create accounts (and LDAP/IMAP users on first sign-in).`}),(0,Z.jsx)(eM,{checked:s.local.enabled,onChange:e=>y(t=>({...t,local:{...t.local,enabled:e}})),label:`Local password accounts`,hint:`Off refuses new local registrations. Existing local accounts — admins included — can still sign in, so this cannot lock you out.`}),(0,Z.jsx)(eM,{checked:s.local.requireEmailVerification,onChange:e=>y(t=>({...t,local:{...t.local,requireEmailVerification:e}})),label:`Require e-mail verification`,hint:`Needs working SMTP (config/smtp.json).`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`mb-2 text-xs font-medium`,children:`Password policy`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-start gap-4`,children:[(0,Z.jsx)($j,{label:`Min length`,children:(0,Z.jsx)(q,{className:`h-8 w-24 text-sm`,type:`number`,min:1,max:1024,value:s.local.passwordPolicy.minLength,onChange:e=>y(t=>({...t,local:{...t.local,passwordPolicy:{...t.local.passwordPolicy,minLength:Number(e.target.value)}}}))})}),(0,Z.jsx)($j,{label:`Max length`,children:(0,Z.jsx)(q,{className:`h-8 w-24 text-sm`,type:`number`,min:1,max:1024,value:s.local.passwordPolicy.maxLength,onChange:e=>y(t=>({...t,local:{...t.local,passwordPolicy:{...t.local.passwordPolicy,maxLength:Number(e.target.value)}}}))})}),(0,Z.jsx)(`div`,{className:`grid grid-cols-2 gap-x-6 gap-y-1 pt-1`,children:[[`requireUppercase`,`Uppercase letter`],[`requireLowercase`,`Lowercase letter`],[`requireNumbers`,`Number`],[`requireSpecialChars`,`Special character`]].map(([e,t])=>(0,Z.jsx)(eM,{checked:s.local.passwordPolicy[e],label:t,onChange:t=>y(n=>({...n,local:{...n.local,passwordPolicy:{...n.local.passwordPolicy,[e]:t}}}))},e))})]})]})]}),(0,Z.jsxs)(tM,{title:`LDAP / Active Directory`,description:`Users sign in with their directory password. Servers are tried in order, so later ones act as fallbacks.`,enabled:s.ldap.enabled,onToggle:e=>y(t=>({...t,ldap:{...t.ldap,enabled:e}})),children:[(0,Z.jsx)(rM,{value:s.ldap,onChange:e=>y(t=>({...t,ldap:{...t.ldap,...e}}))}),s.ldap.servers.map((e,t)=>(0,Z.jsx)(iM,{row:e,index:t,onChange:t=>b(e.id,t),onRemove:()=>y(t=>({...t,ldap:{...t.ldap,servers:t.ldap.servers.filter(t=>t.id!==e.id)}}))},e.id)),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>y(e=>({...e,ldap:{...e.ldap,servers:[...e.ldap.servers,{...Xj,id:Gj(),name:e.ldap.servers.length?`server${e.ldap.servers.length+1}`:`primary`}]}})),children:[(0,Z.jsx)(br,{className:`mr-2 h-3.5 w-3.5`}),` Add LDAP server`]})]}),(0,Z.jsxs)(tM,{title:`IMAP (mail server sign-in)`,description:`Users of a listed e-mail domain sign in with their mailbox password — the server checks it by logging in to IMAP.`,enabled:s.imap.enabled,onToggle:e=>y(t=>({...t,imap:{...t.imap,enabled:e}})),children:[(0,Z.jsx)(rM,{value:s.imap,onChange:e=>y(t=>({...t,imap:{...t.imap,...e}}))}),s.imap.domains.map(e=>(0,Z.jsx)(aM,{row:e,onChange:t=>x(e.id,t),onRemove:()=>y(t=>({...t,imap:{...t.imap,domains:t.imap.domains.filter(t=>t.id!==e.id)}}))},e.id)),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>y(e=>({...e,imap:{...e.imap,domains:[...e.imap.domains,{...Zj,id:Gj()}]}})),children:[(0,Z.jsx)(br,{className:`mr-2 h-3.5 w-3.5`}),` Add mail domain`]})]}),(0,Z.jsxs)(tM,{title:`Google sign-in`,description:(0,Z.jsxs)(Z.Fragment,{children:[`One-click sign-in with a Google account via OAuth. Needs a Google Cloud OAuth client of type `,(0,Z.jsx)(`em`,{children:`Web application`}),` whose authorized redirect URI is `,(0,Z.jsx)(`code`,{className:`select-all`,children:`${yo}/oauth/google/callback`}),`.`]}),enabled:s.google.enabled,onToggle:e=>y(t=>({...t,google:{...t.google,enabled:e}})),children:[(0,Z.jsx)(rM,{value:s.google,onChange:e=>y(t=>({...t,google:{...t.google,...e}}))}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsx)($j,{label:`OAuth client id`,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,value:s.google.clientId,autoComplete:`off`,onChange:e=>y(t=>({...t,google:{...t.google,clientId:e.target.value}}))})}),(0,Z.jsx)($j,{label:`OAuth client secret`,hint:s.google.clientSecretSet&&s.google.clientSecret===void 0?`A secret is stored; leave blank to keep it.`:void 0,children:(0,Z.jsx)(q,{className:`h-8 font-mono text-sm`,type:`password`,autoComplete:`off`,value:s.google.clientSecret??``,placeholder:s.google.clientSecretSet?`••••••••`:``,onChange:e=>y(t=>({...t,google:{...t.google,clientSecret:e.target.value===``?void 0:e.target.value}}))})}),(0,Z.jsx)($j,{label:`Allowed e-mail domains`,hint:`Comma separated. Empty = any Google account may sign in.`,children:(0,Z.jsx)(Yj,{value:s.google.allowedDomains,placeholder:`example.com, example.org`,onChange:e=>y(t=>({...t,google:{...t.google,allowedDomains:e}}))})}),(0,Z.jsx)($j,{label:`Extra web origins`,hint:`Only when the web UI is served from another origin than the API (e.g. a Vite dev server).`,children:(0,Z.jsx)(Yj,{value:s.google.webOrigins,placeholder:`http://localhost:5173`,onChange:e=>y(t=>({...t,google:{...t.google,webOrigins:e}}))})})]}),(0,Z.jsx)(eM,{checked:s.google.autoCreateUsers,label:`Create an account on first sign-in`,hint:`Off: only users that already exist (by e-mail) can sign in with Google.`,onChange:e=>y(t=>({...t,google:{...t.google,autoCreateUsers:e}}))})]}),(v||h)&&(0,Z.jsxs)(`div`,{className:`sticky bottom-4 z-10 rounded-lg border bg-card p-3 shadow-elevation-4`,children:[h&&(0,Z.jsx)(`ul`,{className:`mb-2 space-y-0.5 text-xs text-destructive`,children:h.split(`; `).map(e=>(0,Z.jsx)(`li`,{children:e},e))}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-end gap-2`,children:[(0,Z.jsx)(`span`,{className:`mr-auto text-xs text-muted-foreground`,children:v?`Unsaved changes`:``}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:d,onClick:()=>{c(a),g(null)},children:`Discard`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,disabled:d||!v,onClick:()=>void S(),children:[d&&(0,Z.jsx)(Ti,{className:`mr-2 h-3.5 w-3.5 animate-spin`}),`Save`]})]})]})]})]}):(0,Z.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[C,(0,Z.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border p-3 text-xs`,children:[(0,Z.jsx)(ha,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:`Authentication settings are only available to server admins.`})]})]})}function sM({value:e,onChange:t,models:n,loading:r,error:i,refresh:a,disabled:o,id:s}){let c=(0,X.useId)(),l=n.find(t=>t.id===e);return(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{id:s,"aria-label":`Model`,list:c,value:e,onChange:e=>t(e.target.value,n.find(t=>t.id===e.target.value)),placeholder:`Choose or enter a model ID`,disabled:o}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,disabled:o||r,onClick:a,children:`Refresh models`})]}),(0,Z.jsx)(`datalist`,{id:c,children:n.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,role:`status`,children:r?`Loading models…`:i||(n.length?`${n.length} models available`:`Enter provider credentials to load available models. You can also enter a model ID.`)}),l&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Context: `,l.contextWindow?.toLocaleString()??`not reported`,` · Max output: `,l.maxTokens?.toLocaleString()??`not reported`,` tokens`,l.limitsSource===`runtime`?` (runtime catalogue)`:l.limitsSource===`provider`?` (provider)`:``]})]})}function cM(e,t,n,r){let[i,a]=(0,X.useState)(0),o=JSON.stringify([e,t,n,r,i]),[s,c]=(0,X.useState)({key:``,models:[],loading:!1,error:``}),l=!!t.trim()||!!r||[`ollama`,`lm-studio`,`vllm`,`custom`].includes(e);return(0,X.useEffect)(()=>{if(!l)return;let i=new AbortController,a=setTimeout(()=>{c({key:o,models:[],loading:!0,error:``}),yO({provider:e,apiKey:t.trim()||void 0,baseUrl:n.trim()||void 0,agentIdentifier:r},i.signal).then(e=>{i.signal.aborted||c({key:o,models:e,loading:!1,error:``})}).catch(e=>{i.signal.aborted||c({key:o,models:[],loading:!1,error:e instanceof Error?e.message:`Unable to load models`})})},700);return()=>{clearTimeout(a),i.abort()}},[o,l,e,t,n,r]),{...s.key===o?s:{models:[],loading:l,error:``},refresh:()=>a(e=>e+1)}}function lM({agent:e,onStart:t,onStop:n,onEnter:r}){let[i,a]=(0,X.useState)(!1),o=async()=>{a(!0);try{await t(e.name)}finally{a(!1)}},s=async()=>{a(!0);try{await n(e.name)}finally{a(!1)}},c=()=>{switch(e.status){case`active`:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-success`});case`inactive`:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-warning`});case`error`:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-destructive`});default:return(0,Z.jsx)(yi,{className:`h-4 w-4 text-muted-foreground`})}},l=()=>{switch(e.llmProvider){case`anthropic`:return(0,Z.jsx)(ri,{className:`h-4 w-4 text-warning`});case`openai`:return(0,Z.jsx)(ri,{className:`h-4 w-4 text-success`});case`ollama`:return(0,Z.jsx)(lr,{className:`h-4 w-4 text-info`});default:return(0,Z.jsx)(ri,{className:`h-4 w-4 text-muted-foreground`})}},u=()=>{switch(e.status){case`active`:return`text-success bg-success-subtle border-success`;case`inactive`:return`text-warning bg-warning-subtle border-warning`;case`error`:return`text-destructive bg-destructive-subtle border-destructive`;case`available`:return`text-info bg-info-subtle border-info`;default:return`text-foreground bg-muted border-border`}},d=e.status===`available`||e.status===`inactive`,f=e.status===`active`;return(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 hover:shadow-elevation-2 transition-shadow bg-card`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[l(),(0,Z.jsx)(`h3`,{className:`text-lg font-semibold truncate`,children:e.label||e.name}),e.color&&(0,Z.jsx)(`div`,{className:`w-4 h-4 rounded border flex-shrink-0`,style:{backgroundColor:e.color},title:`Color: ${e.color}`})]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground font-mono`,children:e.name}),e.description&&(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1 line-clamp-2`,children:e.description})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 flex-shrink-0`,children:[c(),(0,Z.jsx)(`span`,{className:`px-2 py-1 rounded-full text-xs font-medium border ${u()}`,children:e.status})]})]}),(0,Z.jsxs)(`div`,{className:`grid grid-cols-2 gap-4 text-sm`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Provider:`}),(0,Z.jsx)(`div`,{className:`font-medium capitalize`,children:e.llmProvider})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Model:`}),(0,Z.jsx)(`div`,{className:`font-mono text-xs`,children:e.model})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Created:`}),(0,Z.jsx)(`div`,{children:new Date(e.createdAt).toLocaleDateString()})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Last Access:`}),(0,Z.jsx)(`div`,{children:e.lastAccessed?new Date(e.lastAccessed).toLocaleDateString():`Never`})]})]}),e.config.mcp?.servers&&e.config.mcp.servers.length>0&&(0,Z.jsxs)(`div`,{className:`text-sm`,children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`MCP Servers:`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-1`,children:e.config.mcp.servers.map((e,t)=>(0,Z.jsx)(`span`,{className:`px-2 py-1 bg-secondary text-secondary-foreground rounded text-xs`,children:e.name},t))})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-2 border-t`,children:[d&&(0,Z.jsxs)(Y,{onClick:o,disabled:i,size:`sm`,variant:`outline`,className:`flex-1`,children:[(0,Z.jsx)(Ar,{className:`mr-2 h-4 w-4`}),`Start`]}),f&&(0,Z.jsxs)(Y,{onClick:s,disabled:i,size:`sm`,variant:`outline`,className:`flex-1`,children:[(0,Z.jsx)(Sa,{className:`mr-2 h-4 w-4`}),`Stop`]}),(0,Z.jsxs)(Y,{onClick:()=>r(e.name),size:`sm`,className:`flex-1`,children:[(0,Z.jsx)(Ea,{className:`mr-2 h-4 w-4`}),`Chat`]})]})]})}function uM(){let e={anthropic:`https://api.anthropic.com`,openai:`https://api.openai.com/v1`,ollama:`http://localhost:11434/v1`},t={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`},[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(``),[u,d]=(0,X.useState)(``),[f,p]=(0,X.useState)(on()),[m,h]=(0,X.useState)(``),[g,_]=(0,X.useState)(`anthropic`),[v,y]=(0,X.useState)(t.anthropic),[b,x]=(0,X.useState)({apiKey:``,baseUrl:e.anthropic,maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096}),S=cM(g,b.apiKey,b.baseUrl),C=S.models.find(e=>e.id===v),[w,T]=(0,X.useState)(``),[E,D]=(0,X.useState)(!1),O=aw(),[k,A]=hw(),{showToast:j}=wo(),M=ft(),N=Cw();fw(N,`agent`,{"agent:status:changed":e=>{r(t=>t.map(t=>t.id===e.agentId?{...t,status:e.status,isActive:e.isActive}:t))},"agent:created":e=>{r(t=>[...t,e.agent])},"agent:deleted":e=>{r(t=>t.filter(t=>t.id!==e.agentId))}});let P=n=>{_(n),y(t[n]),x({apiKey:``,baseUrl:e[n],maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096})};(0,X.useEffect)(()=>((async()=>{try{a(!0);let e=await ZD();r(e),s(null)}catch(e){console.error(`Agent fetch error:`,e);let t=`Failed to fetch agents`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to fetch agents`}s(t),j({title:`Error`,description:t,variant:`destructive`})}finally{a(!1)}})(),()=>{}),[N,j]);let ee=async t=>{if(t.preventDefault(),c.trim()){D(!0);try{let t=await cO({name:c,label:m||c,description:u||void 0,color:f,llmProvider:g,model:v,apiKey:b.apiKey.trim()||void 0,baseUrl:b.baseUrl.trim()||void 0,config:{type:g,model:v,prompts:w?{system:w}:void 0,connectors:{[g]:{maxTokens:b.maxTokens,temperature:b.temperature,topP:b.topP,frequencyPenalty:b.frequencyPenalty,presencePenalty:b.presencePenalty,...g===`ollama`?{numCtx:b.numCtx}:{}}}},mcp:{enabled:!0,servers:[{name:`weather`,command:`node`,args:[`src/managers/agent/mcp-servers/weather.js`]}]}});r(e=>[...e,t]),l(``),d(``),p(on()),h(``),T(``),x({apiKey:``,baseUrl:e[g],maxTokens:4096,temperature:.7,topP:1,frequencyPenalty:0,presencePenalty:0,numCtx:4096}),j({title:`Success`,description:`Agent '${t.label||t.name}' created.`}),A(!1)}catch(e){console.error(`Agent creation error:`,e);let t=`Failed to create agent`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to create agent`}j({title:`Error`,description:t,variant:`destructive`})}finally{D(!1)}}},F=async e=>{try{let t=await dO(e);r(e=>e.map(e=>e.name===t.name?t:e)),j({title:`Success`,description:`Agent '${t.label||t.name}' started.`})}catch(e){console.error(`Agent start error:`,e);let t=`Failed to start agent`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to start agent`}j({title:`Error`,description:t,variant:`destructive`})}},I=async e=>{try{await fO(e),r(t=>t.map(t=>t.name===e?{...t,status:`inactive`,isActive:!1}:t)),j({title:`Success`,description:`Agent '${e}' stopped.`})}catch(e){console.error(`Agent stop error:`,e);let t=`Failed to stop agent`;if(e instanceof Error)t=e.message;else if(typeof e==`object`&&e){let n=e;t=n.message||n.error||n.payload?.message||n.payload?.error||n.statusText||`Failed to stop agent`}j({title:`Error`,description:t,variant:`destructive`})}},te=e=>{M(`/agents/${e}`)};return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`AI Agents`,description:`Create and manage your AI agents with multiple LLM providers`,actions:!O.local&&!k&&(0,Z.jsxs)(Y,{onClick:()=>A(!0),className:`max-sm:h-9 max-sm:w-9 max-sm:p-0`,"aria-label":`Create agent`,title:`Create agent`,children:[(0,Z.jsx)(br,{className:`h-4 w-4 sm:mr-2`}),(0,Z.jsx)(`span`,{className:`max-sm:hidden`,children:`Create Agent`})]})}),!O.local&&k&&(0,Z.jsx)(pw,{title:`Create New Agent`,onClose:()=>A(!1),children:(0,Z.jsxs)(`form`,{onSubmit:ee,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsx)(q,{value:c,onChange:e=>l(e.target.value),placeholder:`Agent Name (e.g., 'my-assistant')`,disabled:E}),(0,Z.jsx)(q,{value:m,onChange:e=>h(e.target.value),placeholder:`Agent Label (display name, optional)`,disabled:E})]}),(0,Z.jsx)(q,{value:u,onChange:e=>d(e.target.value),placeholder:`Description (optional)`,disabled:E}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`agent-provider`,className:`text-sm font-medium`,children:`LLM Provider`}),(0,Z.jsxs)(`select`,{id:`agent-provider`,value:g,onChange:e=>P(e.target.value),className:`w-full mt-1 px-3 py-2 border border-input bg-background rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-ring`,disabled:E,children:[(0,Z.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,Z.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,Z.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`agent-model`,className:`text-sm font-medium`,children:`Model`}),(0,Z.jsx)(sM,{id:`agent-model`,value:v,onChange:(e,t)=>{y(e),t?.maxTokens&&x(e=>({...e,maxTokens:t.maxTokens}))},...S,disabled:E})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`system-prompt`,className:`text-sm font-medium`,children:`System Prompt (Optional)`}),(0,Z.jsx)(`textarea`,{id:`system-prompt`,value:w,onChange:e=>T(e.target.value),placeholder:`Enter system prompt to define agent behavior...`,className:`w-full mt-1 px-3 py-2 border border-input bg-background rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-ring min-h-[80px] resize-y`,disabled:E})]}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`api-key`,className:`text-sm font-medium`,children:`API Key (Optional)`}),(0,Z.jsx)(q,{id:`api-key`,type:`password`,value:b.apiKey,onChange:e=>x(t=>({...t,apiKey:e.target.value})),placeholder:`Enter your API key`,disabled:E})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`baseUrl`,className:`text-sm font-medium`,children:`Base URL (Optional)`}),(0,Z.jsx)(q,{id:`baseUrl`,value:b.baseUrl,onChange:e=>x(t=>({...t,baseUrl:e.target.value})),placeholder:e[g],disabled:E})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-medium`,children:`LLM Parameters`}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2 lg:grid-cols-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`max-tokens`,className:`text-sm font-medium`,children:`Max Output Tokens`}),(0,Z.jsx)(q,{id:`max-tokens`,type:`number`,min:`1`,max:C?.maxTokens,value:b.maxTokens,onChange:e=>x(t=>({...t,maxTokens:parseInt(e.target.value)||4096})),disabled:E})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`temperature`,className:`text-sm font-medium`,children:`Temperature`}),(0,Z.jsx)(q,{id:`temperature`,type:`number`,min:`0`,max:`2`,step:`0.1`,value:b.temperature,onChange:e=>x(t=>({...t,temperature:Number.isNaN(e.target.valueAsNumber)?.7:e.target.valueAsNumber})),disabled:E})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`top-p`,className:`text-sm font-medium`,children:`Top P`}),(0,Z.jsx)(q,{id:`top-p`,type:`number`,min:`0`,max:`1`,step:`0.1`,value:b.topP,onChange:e=>x(t=>({...t,topP:Number.isNaN(e.target.valueAsNumber)?1:e.target.valueAsNumber})),disabled:E})]}),g===`ollama`&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`num-ctx`,className:`text-sm font-medium`,children:`Context Length`}),(0,Z.jsx)(q,{id:`num-ctx`,type:`number`,min:`1024`,max:C?.contextWindow,value:b.numCtx,onChange:e=>x(t=>({...t,numCtx:parseInt(e.target.value)||4096})),disabled:E})]})]}),g!==`ollama`&&(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`frequency-penalty`,className:`text-sm font-medium`,children:`Frequency Penalty`}),(0,Z.jsx)(q,{id:`frequency-penalty`,type:`number`,min:`-2`,max:`2`,step:`0.1`,value:b.frequencyPenalty,onChange:e=>x(t=>({...t,frequencyPenalty:parseFloat(e.target.value)||0})),disabled:E})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`presence-penalty`,className:`text-sm font-medium`,children:`Presence Penalty`}),(0,Z.jsx)(q,{id:`presence-penalty`,type:`number`,min:`-2`,max:`2`,step:`0.1`,value:b.presencePenalty,onChange:e=>x(t=>({...t,presencePenalty:parseFloat(e.target.value)||0})),disabled:E})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{htmlFor:`agent-color`,className:`text-sm font-medium`,children:`Agent Color`}),(0,Z.jsx)(q,{id:`agent-color`,type:`color`,value:f,onChange:e=>p(e.target.value),className:`h-10 w-16 p-1`,disabled:E}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>p(on()),disabled:E,children:`Randomize`})]}),(0,Z.jsxs)(Y,{type:`submit`,disabled:E||!c.trim(),children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Agent`]})]})}),(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Your Agents`}),i&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`Loading agents...`}),o&&(0,Z.jsx)(`div`,{className:`text-center text-destructive`,children:(0,Z.jsx)(`p`,{children:o})}),!i&&!o&&n.length===0&&(0,Z.jsx)(`p`,{className:`text-center text-muted-foreground`,children:`No agents found`}),n.length>0&&(0,Z.jsx)(`div`,{className:`grid gap-4`,children:n.map(e=>(0,Z.jsx)(lM,{agent:e,onStart:F,onStop:I,onEnter:te},e.id))})]})]})}function dM(e){let t=e?.usage;if(!t)return null;let n=t.totalTokens,r=t.input,i=t.output;return typeof n==`number`&&typeof r==`number`&&typeof i==`number`?`${n} tok (${r} in / ${i} out)`:typeof n==`number`?`${n} tok`:null}function fM(e){let t=e?.usage?.cost?.total;return typeof t==`number`?`$${t.toFixed(t<.01?6:4)}`:null}function pM({reasoning:e,metadata:t,isStreaming:n=!1,compact:r=!1}){let i=t?.model,a=[t?.provider,i,dM(t),fM(t)].filter(Boolean);return!e&&a.length===0?null:(0,Z.jsxs)(Z.Fragment,{children:[e&&(0,Z.jsxs)(`details`,{open:n,className:`mb-2 rounded border border-border bg-background ${r?`px-2 py-1.5`:`px-3 py-2`}`,children:[(0,Z.jsx)(`summary`,{className:`cursor-pointer font-medium text-foreground ${r?`text-[11px]`:`text-xs`}`,children:`Reasoning`}),(0,Z.jsx)(F,{content:e,className:`mt-1 text-foreground ${r?`text-[11px]`:`text-xs`}`})]}),a.length>0&&(0,Z.jsx)(`div`,{className:`mt-2 text-muted-foreground ${r?`text-[11px]`:`text-xs`}`,children:a.join(` • `)})]})}function mM({message:e,isStreaming:t=!1,connectionStatus:n=`disconnected`}){let[r,i]=(0,X.useState)(``),[a,o]=(0,X.useState)(!0);(0,X.useEffect)(()=>{if(!t||e.isComplete)return;let n=e.content,r=0,a=setInterval(()=>{r<n.length?(i(n.substring(0,r+1)),r++):clearInterval(a)},20);return()=>clearInterval(a)},[e.content,t,e.isComplete]);let s=t&&!e.isComplete?r:e.content;return(0,X.useEffect)(()=>{if(!t||e.isComplete)return;let n=setInterval(()=>{o(e=>!e)},500);return()=>{clearInterval(n),o(!0)}},[t,e.isComplete]),(0,Z.jsx)(`div`,{className:`flex ${e.role===`user`?`justify-end`:`justify-start`}`,children:(0,Z.jsxs)(`div`,{className:`max-w-[70%] p-3 rounded-lg ${e.role===`user`?`bg-primary text-primary-foreground`:`bg-muted`} ${t&&!e.isComplete?`border-2 border-info`:``}`,children:[(0,Z.jsx)(pM,{reasoning:e.role===`assistant`?e.metadata?.reasoning?.trim():void 0,metadata:e.role===`assistant`?e.metadata:void 0,isStreaming:t&&!e.isComplete}),(0,Z.jsxs)(`div`,{className:`text-sm`,children:[e.role===`assistant`?(0,Z.jsx)(F,{content:s}):(0,Z.jsx)(`span`,{className:`whitespace-pre-wrap break-words`,children:s}),t&&!e.isComplete&&(0,Z.jsx)(`span`,{className:`inline-block w-2 ${a?`bg-current`:`bg-transparent`}`,children:`|`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between text-xs mt-2 opacity-70`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{children:new Date(e.timestamp).toLocaleTimeString()}),t&&!e.isComplete&&(0,Z.jsx)(`span`,{className:`text-info`,children:`• streaming...`})]}),e.role===`assistant`&&(()=>{switch(n){case`websocket`:return(0,Z.jsx)(`span`,{title:`WebSocket`,children:(0,Z.jsx)(Ja,{className:`h-3 w-3 text-success`})});case`sse`:return(0,Z.jsx)(`span`,{title:`Server-Sent Events`,children:(0,Z.jsx)($i,{className:`h-3 w-3 text-info`})});case`rest`:return(0,Z.jsx)(`span`,{title:`REST API`,children:(0,Z.jsx)(yi,{className:`h-3 w-3 text-warning`})});default:return(0,Z.jsx)(`span`,{title:`Disconnected`,children:(0,Z.jsx)(Hn,{className:`h-3 w-3 text-destructive`})})}})()]})]})})}var hM=(0,X.createContext)(null);function gM(e){let t=(0,X.useContext)(hM);if(!t)throw Error(`useAgentSessions must be used within an AgentSessionProvider`);let{getState:n,refresh:r,create:i,select:a,rename:o,remove:s}=t,c=n(e),l=(0,X.useCallback)(()=>r(e),[r,e]),u=(0,X.useCallback)(t=>i(e,t),[i,e]),d=(0,X.useCallback)(t=>a(e,t),[a,e]),f=(0,X.useCallback)((t,n)=>o(e,t,n),[o,e]),p=(0,X.useCallback)(t=>s(e,t),[s,e]);return(0,X.useMemo)(()=>({...c,refresh:l,create:u,select:d,rename:f,remove:p}),[c,l,u,d,f,p])}function _M(e={}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!1),[a,o]=(0,X.useState)(!1),s=(0,X.useRef)(e),c=(0,X.useRef)(null),l=(0,X.useRef)(!1);(0,X.useEffect)(()=>{s.current=e},[e]);let u=(0,X.useCallback)(()=>{if(!s.current.agentId||c.current||l.current)return;let e=localStorage.getItem(`authToken`);if(!e){console.warn(`No auth token available for WebSocket connection`);return}console.log(`[WebSocket] Using token type: ${e.startsWith(`canvas-`)?`API`:`JWT`}, length: ${e.length}`),l.current=!0,o(!0);let t=xo(no.ws,{auth:{token:e},transports:[`websocket`],reconnection:!0,reconnectionAttempts:5,reconnectionDelay:1e3,timeout:1e4,forceNew:!0});t.on(`connect`,()=>{console.log(`Agent WebSocket connected successfully`),i(!0),l.current=!1,o(!1)}),t.on(`connect_error`,e=>{console.error(`Agent WebSocket connection error:`,e),i(!1),l.current=!1,o(!1),(e.message?.includes(`Auth error`)||e.message?.includes(`token`))&&console.warn(`WebSocket auth failed, will fallback to SSE for streaming`)}),t.on(`disconnect`,e=>{console.log(`Agent WebSocket disconnected:`,e),i(!1),l.current=!1,o(!1)}),t.on(`agent:chat:chunk`,e=>{console.log(`Received chat chunk:`,e),s.current.onMessage&&s.current.onMessage(e)}),t.on(`agent:chat:complete`,e=>{console.log(`Chat stream complete:`,e),s.current.onComplete&&s.current.onComplete(e.agentId,e.messageId,e.messages)}),t.on(`agent:chat:error`,e=>{console.error(`Chat stream error:`,e),s.current.onError&&s.current.onError(e)}),t.on(`agent:chat:start`,e=>{console.log(`Chat stream started:`,e)}),c.current=t,n(t)},[]),d=(0,X.useCallback)(()=>{let e=c.current;e&&(e.removeAllListeners(),e.close()),c.current=null,l.current=!1,n(null),i(!1),o(!1)},[]),f=(0,X.useCallback)(e=>{t&&r&&(console.log(`Subscribing to agent channel: ${e}`),t.emit(`agent:subscribe`,{agentId:e}))},[t,r]),p=(0,X.useCallback)(e=>{t&&r&&(console.log(`Unsubscribing from agent channel: ${e}`),t.emit(`agent:unsubscribe`,{agentId:e}))},[t,r]),m=(0,X.useCallback)((e,n)=>{if(!t||!r)throw Error(`WebSocket not connected`);let i=`msg_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;return console.log(`Starting streaming chat for agent ${e}, message ${i}`),t.emit(`agent:chat:stream`,{agentId:e,messageId:i,...n}),i},[t,r]);return(0,X.useEffect)(()=>{if(e.agentId)return u(),()=>{d()}},[e.agentId,u,d]),(0,X.useEffect)(()=>{if(r&&e.agentId)return f(e.agentId),()=>{e.agentId&&p(e.agentId)}},[r,e.agentId,f,p]),{socket:t,isConnected:r,isConnecting:a,connect:u,disconnect:d,joinAgentChannel:f,leaveAgentChannel:p,startStreamingChat:m}}function vM(e){if(!e)return``;if(typeof e.errorMessage==`string`&&e.errorMessage.trim())return e.errorMessage.trim();let t=e.content;return typeof t==`string`?t:Array.isArray(t)&&t.filter(e=>e?.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
|
|
37
|
+
`)||``}function yM(e,t){return`${e||``}${t||``}`.trim()||void 0}function bM(e,t){if(!e&&!t)return;let{reasoningDelta:n,...r}=e||{};return{...r,...t?{reasoning:t}:{}}}function xM(e){let{agentId:t,initialMessages:n=[],historyKey:r,loadHistory:i=!0,onError:a,enableWebSocket:o=!0,enableSSE:s=!0,enableFallback:c=!0,llmProvider:l}=e,[u,d]=(0,X.useState)(gO(n)),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(null),[g,_]=(0,X.useState)(`disconnected`),[v,y]=(0,X.useState)(null),b=(0,X.useRef)(n);(0,X.useEffect)(()=>{b.current=n});let x=`${t}${String(i)}${r??``}`,[S,C]=(0,X.useState)(x);S!==x&&(C(x),(!t||!i)&&d(gO(n))),(0,X.useEffect)(()=>{let e=!1;if(!(!t||!i))return $D(t).then(t=>{e||d(gO(t.messages))}).catch(()=>{e||d(gO(b.current))}),()=>{e=!0}},[t,i,r]);let w=(0,X.useRef)(null),T=(0,X.useRef)(null),{isConnected:E,startStreamingChat:D}=_M({agentId:o?t:void 0,onMessage:j,onComplete:M,onError:N}),O=o&&E,[k,A]=(0,X.useState)(!1);k!==O&&(A(O),_(O?`websocket`:e=>e===`websocket`?`disconnected`:e));function j(e){e.messageId===T.current&&(console.log(`Processing WebSocket chunk:`,{type:e.type,content:e.content,delta:e.delta}),e.type===`content`||e.type===`chunk`?h(t=>t?{...t,content:t.content+(e.delta||e.content||``),isComplete:!1,metadata:t.metadata}:{role:`assistant`,content:e.delta||e.content||``,timestamp:new Date().toISOString(),isComplete:!1}):e.type===`thinking`?h(t=>{let n=yM(t?.metadata?.reasoning,e.delta);return t?{...t,metadata:{...t.metadata||{},...n?{reasoning:n}:{}}}:{role:`assistant`,content:``,timestamp:new Date().toISOString(),isComplete:!1,metadata:n?{reasoning:n}:void 0}}):(e.type===`complete`||e.type===`done`)&&h(e=>{if(e){let t={...e,isComplete:!0};return d(e=>[...e,t]),p(!1),T.current=null,null}return null}))}function M(e,t,n){if(t===T.current){let e=Array.isArray(n)?[...n].reverse().find(e=>e?.role===`assistant`):null,t=vM(e),r=VD(e);h(e=>{if(e){let n={...e,content:t||e.content,isComplete:!0,metadata:{...e.metadata||{},...r||{}}};d(e=>[...e,n])}else t&&d(e=>[...e,{role:`assistant`,content:t,timestamp:new Date().toISOString(),isComplete:!0,metadata:r}]);return null}),p(!1),T.current=null}}function N(e){e.messageId===T.current&&(console.error(`WebSocket streaming error:`,e),y(e.error),p(!1),T.current=null,a&&a(Error(e.error)))}let P=(0,X.useCallback)(async(e,n={})=>{if(f)throw Error(`Cannot send message while streaming`);y(null);let r={role:`user`,content:e||(n.images?.length?`[${n.images.length} image${n.images.length===1?``:`s`} attached]`:``),timestamp:new Date().toISOString(),isComplete:!0};d(e=>[...e,r]),p(!0);let i={message:e,images:n.images,context:u.slice(-10),mcpContext:n.mcpContext??!0,maxTokens:n.maxTokens,temperature:n.temperature},m=Array.isArray(n.images)&&n.images.length>0,g=o&&E&&l!==`ollama`&&!m,v=s;if(l===`ollama`&&console.log(`🦙 Ollama detected: Using SSE streaming (WebSocket not supported by Ollama)`),g)try{console.log(`🔌 Attempting WebSocket streaming for ${l||`unknown`} provider...`);let e=D(t,i);T.current=e,_(`websocket`);return}catch(e){console.warn(`WebSocket streaming failed for ${l||`unknown`}, falling back to SSE:`,e)}if(v){let e=!1;try{console.log(`📡 ${l===`ollama`?`Using`:`Attempting`} SSE streaming for ${l||`unknown`} provider...`),_(`sse`),w.current=new AbortController;let r=``;await mO(t,i.message,{onStart:()=>{e=!0},onMessage:(e,t,n)=>{r+=e;let i=typeof n?.reasoningDelta==`string`?n.reasoningDelta:``;if(h(e=>{let a=n?.reasoning||yM(e?.metadata?.reasoning,i);return{role:`assistant`,content:r,timestamp:e?.timestamp||new Date().toISOString(),isComplete:t,metadata:bM({...e?.metadata||{},...n},a)}}),t){let e=n?.reasoning;d(t=>[...t,{role:`assistant`,content:r,timestamp:new Date().toISOString(),isComplete:!0,metadata:bM(n,e)}]),h(null),p(!1)}},onError:e=>{console.error(`SSE streaming error:`,e),y(e.message),p(!1),a&&a(e)},context:u.slice(-10).map(e=>({role:e.role,content:e.content,timestamp:e.timestamp,metadata:e.metadata})),images:n.images,mcpContext:n.mcpContext??!0,maxTokens:n.maxTokens,temperature:n.temperature});return}catch(t){if(e){console.warn(`SSE stream failed after server accepted prompt for ${l||`unknown`}; refusing REST fallback to avoid duplicate prompt.`);return}console.warn(`SSE streaming failed for ${l||`unknown`}, falling back to REST:`,t)}}if(c)try{console.log(`⚙️ Using REST API fallback for ${l||`unknown`} provider...`),_(`rest`);let r=await hO(t,{message:e,images:n.images,context:u.slice(-10).map(e=>({role:e.role,content:e.content,timestamp:e.timestamp,metadata:e.metadata})),mcpContext:n.mcpContext??!0,maxTokens:n.maxTokens,temperature:n.temperature}),i={role:`assistant`,content:r.content,timestamp:new Date().toISOString(),isComplete:!0,metadata:r.metadata};d(e=>[...e,i]),p(!1)}catch(e){console.error(`All chat methods failed:`,e);let t=e instanceof Error?e.message:`Failed to send message`;y(t),p(!1),a&&a(e instanceof Error?e:Error(t))}else y(`All streaming methods failed and fallback is disabled`),p(!1)},[t,u,f,E,D,o,s,c,l,a]),ee=(0,X.useCallback)(()=>{d([]),h(null),y(null)},[]),F=(0,X.useCallback)(()=>{w.current&&=(w.current.abort(),null),T.current=null,p(!1),h(null)},[]);return(0,X.useEffect)(()=>()=>{w.current&&w.current.abort()},[]),{messages:u,isStreaming:f,currentStreamingMessage:m,connectionStatus:g,error:v,sendMessage:P,clearMessages:ee,stopStreaming:F,allMessages:m?[...u,m]:u,isWebSocketConnected:g===`websocket`,isUsingSSE:g===`sse`,isUsingREST:g===`rest`}}function SM(e){let{sessions:t,create:n}=gM(e),r=(t?.sessions.length??0)>0;return{hasSession:r,ensureSession:async()=>r?null:n({mode:`persistent`})}}async function CM(e){let t=await new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let[,e=``]=(typeof r.result==`string`?r.result:``).split(`,`,2);t(e)},r.onerror=()=>n(r.error||Error(`Failed to read image`)),r.readAsDataURL(e)});return{id:`${e.name}-${e.size}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,type:`image`,data:t,mimeType:e.type||`image/png`,name:e.name}}function wM(e){return String(e||``).trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)}function TM({agentId:e,routeAgentId:t,initialMessages:n,llmProvider:r,sessionKey:i}){let{showToast:a}=wo(),{hasSession:o,ensureSession:s}=SM(e),c=ft(),l=(0,X.useRef)(null),u=(0,X.useRef)(null),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)([]),{allMessages:h,isStreaming:g,currentStreamingMessage:_,connectionStatus:v,error:y,sendMessage:b,clearMessages:x,stopStreaming:S}=xM({agentId:e,initialMessages:n,historyKey:i,loadHistory:!1,llmProvider:r,enableWebSocket:!1,onError:e=>{a({title:`Chat Error`,description:e.message,variant:`destructive`})}});return(0,X.useEffect)(()=>{l.current?.scrollIntoView({behavior:`smooth`})},[h,_]),(0,X.useEffect)(()=>{g||u.current?.focus()},[g,i]),(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col rounded-lg border`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between border-b px-4 py-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Chat`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current session conversation`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`span`,{children:v}),h.length>0&&(0,Z.jsx)(`button`,{type:`button`,onClick:x,disabled:g,className:`text-destructive hover:underline disabled:opacity-50`,children:`Clear visible chat`})]})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4 space-y-4`,children:[h.length===0?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(Ea,{className:`mx-auto mb-4 h-10 w-10 opacity-40`}),(0,Z.jsx)(`p`,{className:`text-sm`,children:o?`No messages yet.`:`No session yet.`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs`,children:o?`Send a message to start the conversation.`:`Type a message to auto-create a session, or pick one in the Sessions panel.`})]})}):h.map((e,t)=>(0,Z.jsx)(mM,{message:e,isStreaming:g&&e===_,connectionStatus:v},`${e.timestamp}-${t}`)),y&&(0,Z.jsx)(`div`,{className:`rounded-lg bg-destructive/10 p-3 text-sm text-destructive`,children:y}),(0,Z.jsx)(`div`,{ref:l})]}),(0,Z.jsxs)(`div`,{className:`border-t p-4`,children:[p.length>0&&(0,Z.jsx)(`div`,{className:`mb-3 flex flex-wrap gap-2`,children:p.map(e=>(0,Z.jsxs)(`div`,{className:`group relative overflow-hidden rounded-md border bg-muted/20`,children:[(0,Z.jsx)(`img`,{src:`data:${e.mimeType};base64,${e.data}`,alt:e.name||`Pasted image`,className:`h-16 w-16 object-cover`}),(0,Z.jsx)(`div`,{className:`max-w-16 truncate px-2 py-1 text-[10px] text-muted-foreground`,children:e.name||e.mimeType}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>m(t=>t.filter(t=>t.id!==e.id)),className:`absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded-full bg-background/90 text-muted-foreground hover:text-foreground`,title:`Remove image`,children:(0,Z.jsx)(vr,{className:`h-3 w-3`})})]},e.id))}),(0,Z.jsxs)(`form`,{onSubmit:async e=>{e.preventDefault();let n=d.trim();if(!(!n&&p.length===0)){f(``);try{let e=await s();e?.current.sessionId&&c(`/agents/${encodeURIComponent(t)}/${encodeURIComponent(e.current.sessionId)}`,{replace:!0}),await b(n,{images:p.map(({id:e,...t})=>t)}),m([])}catch(e){a({title:`Chat Error`,description:e instanceof Error?e.message:`Failed to send message`,variant:`destructive`})}}},className:`flex gap-2`,children:[(0,Z.jsx)(`textarea`,{ref:u,value:d,onChange:e=>f(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),e.currentTarget.form?.requestSubmit())},onPaste:async e=>{let t=Array.from(e.clipboardData.items).filter(e=>e.kind===`file`&&e.type.startsWith(`image/`)).map(e=>e.getAsFile()).filter(e=>!!e);if(t.length!==0)try{let e=await Promise.all(t.map(CM));m(t=>[...t,...e])}catch(e){a({title:`Paste Error`,description:e instanceof Error?e.message:`Failed to read pasted image`,variant:`destructive`})}},placeholder:g?`Streaming in progress...`:o?`Type a message...`:`Type to start a new session…`,disabled:g,rows:2,className:`flex min-h-10 flex-1 resize-y rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50`}),g?(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:S,children:`Stop`}):(0,Z.jsx)(Y,{type:`submit`,disabled:!d.trim()&&p.length===0,children:`Send`})]}),(0,Z.jsxs)(`div`,{className:`mt-2 flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Z.jsx)(zn,{className:`h-3.5 w-3.5`}),`Paste image files from clipboard directly into the input.`]})]})]})}function EM(){let{agentId:e,sessionId:t}=yt(),n=vn(),r=ft(),{showToast:i}=wo(),{selectEntity:a,goBack:o}=qC(),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1),y=(0,X.useRef)(null),{current:b,sessions:x,refresh:S,select:C}=gM(e||``),w=(0,X.useMemo)(()=>x?.sessions?x.currentSessionId?x.sessions.find(e=>e.id===x.currentSessionId)||null:x.currentSessionPath?x.sessions.find(e=>e.path===x.currentSessionPath)||null:x.sessions.find(e=>e.isCurrent)||null:null,[x]),T=[b?.mode||`persistent`,b?.sessionId||b?.sessionFile||`initial`].join(`:`);return(0,X.useEffect)(()=>{e&&(async()=>{u(!0);try{let i=await QD(e);a(i.id),c(i);let o=i.name||i.id;if(o&&decodeURIComponent(e)!==o){let e=n.pathname.endsWith(`/settings`)?`/agents/${encodeURIComponent(o)}/settings`:t?`/agents/${encodeURIComponent(o)}/${encodeURIComponent(t)}`:`/agents/${encodeURIComponent(o)}`;r(e,{replace:!0})}await S(),g(null)}catch(e){let t=e instanceof Error?e.message:`Failed to load agent`;g(t),i({title:`Error`,description:t,variant:`destructive`})}finally{u(!1)}})()},[e,t,n.pathname,r,S,a,i]),(0,X.useEffect)(()=>{if(!e||!t||!x)return;let n=decodeURIComponent(t),r=wM(n),a=x.sessions.find(e=>e.id===n||e.slug===n||wM(e.name)===r),o=!!(a&&(x.currentSessionId===a.id||x.currentSessionPath===a.path||b?.sessionId===a.id||b?.sessionFile===a.path)),s=b?.sessionId===n||x.currentSessionId===n;if(b?.mode===`persistent`&&o){y.current=null;return}if(!a){b?.mode===`persistent`&&s&&(y.current=null);return}y.current!==a.id&&(y.current=a.id,C({mode:`persistent`,sessionId:a.id}).catch(e=>{i({title:`Session Error`,description:e instanceof Error?e.message:`Failed to select session`,variant:`destructive`})}).finally(()=>{y.current===a.id&&(y.current=null)}))},[e,t,x,b?.mode,b?.sessionId,b?.sessionFile,C,i]),(0,X.useEffect)(()=>{if(!e)return;let t=async()=>{try{let t=await pO(e);c(e=>e?{...e,isActive:t.isActive,status:t.status,lastAccessed:t.lastAccessed}:null)}catch{}};t();let n=setInterval(t,5e3);return()=>clearInterval(n)},[e]),l?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,Z.jsxs)(`div`,{className:`text-center text-muted-foreground`,children:[(0,Z.jsx)(Nr,{className:`mx-auto mb-3 h-8 w-8 animate-pulse`}),(0,Z.jsx)(`p`,{children:`Loading agent...`})]})}):!s||h?(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,Z.jsxs)(`div`,{className:`text-center text-destructive`,children:[(0,Z.jsx)(Nr,{className:`mx-auto mb-3 h-8 w-8`}),(0,Z.jsx)(`p`,{children:h||`Agent not found`})]})}):(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Z.jsx)(lw,{title:`Back to previous view`,onBack:o}),(0,Z.jsx)(`span`,{className:`h-3 w-3 shrink-0 rounded-full`,style:{backgroundColor:s.color||`#9ca3af`}}),(0,Z.jsx)(`h1`,{className:`truncate text-xl font-semibold`,children:s.label||s.name}),(0,Z.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground`,children:s.status})]}),(0,Z.jsx)(`p`,{className:`mt-1 truncate text-sm text-muted-foreground`,children:s.description||`${s.llmProvider} / ${s.model}`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[s.isActive?(0,Z.jsxs)(Y,{variant:`outline`,onClick:async()=>{if(e){m(!0);try{let t=await fO(e);c(t),i({title:`Stopped`,description:`${t.label||t.name} is inactive`})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to stop agent`,variant:`destructive`})}finally{m(!1)}}},disabled:p,children:[(0,Z.jsx)(Sa,{className:`mr-2 h-4 w-4`}),p?`Stopping...`:`Stop`]}):(0,Z.jsxs)(Y,{onClick:async()=>{if(e){f(!0);try{let t=await dO(e);c(t),i({title:`Started`,description:`${t.label||t.name} is active`})}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to start agent`,variant:`destructive`})}finally{f(!1)}}},disabled:d,children:[(0,Z.jsx)(Ar,{className:`mr-2 h-4 w-4`}),d?`Starting...`:`Start`]}),(0,Z.jsxs)(Y,{variant:`outline`,onClick:()=>{a(s.id),r(`/agents/${encodeURIComponent(s.name||s.id)}/settings/identity`)},children:[(0,Z.jsx)(Wi,{className:`mr-2 h-4 w-4`}),`Settings`]}),(0,Z.jsx)(cw,{className:`h-9 w-9`})]})]}),(0,Z.jsxs)(`div`,{className:`grid min-h-0 flex-1 grid-cols-1 gap-4 grid-rows-[minmax(0,1fr)_auto] xl:grid-rows-none xl:grid-cols-[minmax(0,1.2fr)_minmax(320px,0.8fr)]`,children:[(0,Z.jsx)(TM,{agentId:s.id,routeAgentId:s.name||s.id,initialMessages:b?.messages||[],llmProvider:s.llmProvider,sessionKey:T},T),(0,Z.jsxs)(`div`,{className:`flex min-h-0 flex-col rounded-lg border`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>v(e=>!e),"aria-expanded":_,className:K(`flex w-full items-center justify-between gap-2 px-4 py-3 text-left xl:pointer-events-none`,_?`border-b`:`xl:border-b`),children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Contextual Information`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current session and runtime state.`})]}),(0,Z.jsx)(qr,{className:K(`h-4 w-4 shrink-0 text-muted-foreground transition-transform xl:hidden`,_&&`rotate-180`)})]}),(0,Z.jsxs)(`div`,{className:K(`space-y-4 overflow-y-auto p-4 text-sm max-xl:max-h-viewport-half`,!_&&`max-xl:hidden`),children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Mode`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:b?.mode||x?.mode||`persistent`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Selected Session`}),(0,Z.jsx)(`div`,{className:`mt-1 break-all`,children:w?.name||(w?.isExperimental?`Experimental`:null)||b?.sessionId||`Default session`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Known Sessions`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:x?.sessions.length||0})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Thinking Level`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:b?.thinkingLevel||`high`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Model`}),(0,Z.jsx)(`div`,{className:`mt-1`,children:b?.model?.modelId||s.model||`Not set`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-xs uppercase tracking-wide text-muted-foreground`,children:`Session File`}),(0,Z.jsx)(`div`,{className:`mt-1 break-all text-xs text-muted-foreground`,children:b?.sessionFile||`In-memory / not persisted yet`})]}),(0,Z.jsxs)(`div`,{className:`rounded-lg border bg-muted/20 p-4 text-sm text-muted-foreground`,children:[(0,Z.jsxs)(`div`,{className:`mb-2 flex items-center gap-2 font-medium text-foreground`,children:[(0,Z.jsx)(yi,{className:`h-4 w-4`}),`Shape`]}),(0,Z.jsx)(`p`,{children:`Session selection lives in M2. Main content stays focused on the active conversation and its context.`})]})]})]})]})]})}var DM={anthropic:`claude-3-5-sonnet-20241022`,openai:`gpt-4o`,ollama:`qwen2.5-coder:latest`,"lm-studio":``,vllm:``,custom:``},OM={anthropic:`https://api.anthropic.com`,openai:`https://api.openai.com/v1`,ollama:`http://localhost:11434/v1`,"lm-studio":`http://localhost:1234/v1`,vllm:`http://localhost:8000/v1`,custom:``};function kM(e){return OM[e]||``}function AM(e,t,n){return[e.trim()?`## Role\n${e.trim()}`:``,t.trim()?`## Identity\n${t.trim()}`:``,n.trim()?`## Instructions\n${n.trim()}`:``].filter(Boolean).join(`
|
|
38
38
|
|
|
39
|
-
`)}function OM({label:e,hint:t,children:n}){return(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:e}),t&&(0,Z.jsx)(`p`,{className:`mb-1 mt-0.5 text-xs text-muted-foreground`,children:t}),(0,Z.jsx)(`div`,{className:t?void 0:`mt-1`,children:n})]})}var kM=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-y`,AM=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`;function jM(){let{agentId:e,tab:t}=yt(),n=ft(),{showToast:r}=wo(),{selectEntity:i,goBack:a}=qC(),o=De(),s=FD(t);(0,X.useEffect)(()=>{t!==s&&e&&n(`/agents/${encodeURIComponent(e)}/settings/${s}`,{replace:!0})},[t,s,e,n]);let[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!0),[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(!1),[v,y]=(0,X.useState)(``),[b,x]=(0,X.useState)(``),[S,C]=(0,X.useState)(``),[w,T]=(0,X.useState)(on()),[E,D]=(0,X.useState)(``),[O,k]=(0,X.useState)(``),[A,j]=(0,X.useState)(``),[M,N]=(0,X.useState)(``),[P,ee]=(0,X.useState)(`anthropic`),[F,I]=(0,X.useState)(``),[te,L]=(0,X.useState)(``),[R,ne]=(0,X.useState)(``),[re,ie]=(0,X.useState)(.7),[ae,z]=(0,X.useState)(4096),[oe,se]=(0,X.useState)(1),[B,ce]=(0,X.useState)([]),[V,le]=(0,X.useState)(``),[ue,de]=(0,X.useState)(``),[fe,pe]=(0,X.useState)(``),[me,he]=(0,X.useState)(``),[ge,_e]=(0,X.useState)(!1),[ve,ye]=(0,X.useState)(null),[be,xe]=(0,X.useState)(null),[H,Se]=(0,X.useState)(null),[Ce,U]=(0,X.useState)(!1),[W,we]=(0,X.useState)(null),[Te,Ee]=(0,X.useState)(`context`),[Oe,ke]=(0,X.useState)(``),[Ae,je]=(0,X.useState)(`/`),[Me,Ne]=(0,X.useState)(``),[Pe,Fe]=(0,X.useState)(!0),[Ie,Le]=(0,X.useState)(!1),[Re,ze]=(0,X.useState)([]),[Be,Ve]=(0,X.useState)([]),[He,Ue]=(0,X.useState)(null),[We,Ge]=(0,X.useState)(`{}`),[Ke,G]=(0,X.useState)(null),[qe,Je]=(0,X.useState)(e);qe!==e&&(Je(e),d(!0),l(null)),(0,X.useEffect)(()=>{if(!e)return;let t=!1;return QD(e).then(async e=>{if(t)return;let n=e.config?.identity||{};l(e),i(e.id),y(e.name||``),x(e.label||``),C(e.description||``),T(e.color||on()),D(n.role||``),k(n.identity||``),j(n.instructions||``),N(e.config?.prompts?.system||``),ee(e.llmProvider||`anthropic`),I(e.config?.apiKey||``),L(e.config?.baseUrl||EM(e.llmProvider)),ne(e.model||wM[e.llmProvider]||``);let r=e.config?.connectors?.[e.llmProvider];r&&(ie(r.temperature??.7),z(r.maxTokens??4096),se(r.topP??1)),Ge(JSON.stringify(e.config?.tools??{},null,2)),G(null),p(null);try{ce(await aO(e.id))}catch{ce([])}}).catch(e=>{t||p(e instanceof Error?e.message:`Failed to load agent`)}).finally(()=>{t||d(!1)}),()=>{t=!0}},[e,i]),(0,X.useEffect)(()=>{if(s!==`access`&&s!==`tools`||!c?.id)return;let e=c.id,t=!1;return Promise.all([KD(c.id).catch(()=>null),Uo().catch(()=>[]),ml().catch(()=>[]),XD(c.id).catch(()=>null)]).then(([n,r,i,a])=>{t||(xe(n),ze(r),Ve(i),Ue(a?a.tools:[]),n&&(Ee(n.binding.type),ke(n.binding.workspace||``),je(n.binding.path||`/`),Ne(n.binding.context||``),Fe(n.permissions.includes(`read`)),Le(n.permissions.includes(`write`))),Se(e))}),()=>{t=!0}},[s,c?.id]);let Ye=()=>{let e=DM(E,O,A),t;try{let e=JSON.parse(We);e&&typeof e==`object`&&!Array.isArray(e)&&(t=e)}catch{}return{...t===void 0?{}:{tools:t},name:v.trim(),label:b.trim(),description:S.trim()||void 0,color:w,llmProvider:P,model:R,apiKey:F||void 0,baseUrl:te||void 0,config:{type:P,model:R,identity:{role:E.trim()||void 0,identity:O.trim()||void 0,instructions:A.trim()||void 0},prompts:M.trim()||e?{system:M.trim()||e}:void 0,connectors:{[P]:{temperature:re,maxTokens:ae,topP:oe}}}}},Xe=async e=>{if(e.preventDefault(),c){h(!0);try{let e=await lO(c.id,Ye());l(e),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Saved`,description:`Agent updated`}),e.name&&e.name!==c.name&&n(`/agents/${encodeURIComponent(e.name)}/settings/${s}`,{replace:!0})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{h(!1)}}},Ze=async()=>{if(c&&window.confirm(`Delete agent "${c.label||c.name}"? This cannot be undone.`)){_(!0);try{await uO(c.id),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Deleted`,description:`Agent removed`}),n(`/agents`)}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Delete failed`,variant:`destructive`})}finally{_(!1)}}},Qe=()=>{le(``),de(``),pe(``),he(``)},$e=async()=>{if(!(!c||!me.trim()&&!fe.trim())){_e(!0);try{let e=await oO(c.id,me.trim()?{source:me.trim()}:{name:V,description:ue,content:fe});ce(e),Qe(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Installed`,description:`Skill saved`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Skill install failed`,variant:`destructive`})}finally{_e(!1)}}},et=async e=>{if(c){ye(e);try{let t=await sO(c.id,e);ce(t),(V===e||me===e)&&Qe(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Removed`,description:`Skill "${e}" removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Skill remove failed`,variant:`destructive`})}finally{ye(null)}}},tt=()=>Te===`global`?{type:`global`}:Te===`context`?Me?{type:`context`,context:Me}:null:Oe?Te===`path`?{type:`path`,workspace:Oe,path:Ae.trim()||`/`}:{type:`workspace`,workspace:Oe}:null,nt=async()=>{if(!c||Ce)return;let e=tt(),t=[];if(Pe&&t.push(`read`),Ie&&t.push(`write`),!e||t.length===0){r({title:`Invalid binding`,description:`Pick a scope target and at least one permission`,variant:`destructive`});return}if(!(e.type===`global`&&!window.confirm(`Global scope lets this agent ${Ie?`read and write`:`read`} ALL your workspaces. Continue?`))){U(!0);try{let n=await qD(c.id,{binding:e,permissions:t});xe(n.access),we(n.token),r({title:`Bound`,description:`Access bound — copy the token now, it is not shown again`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Bind failed`,variant:`destructive`})}finally{U(!1)}}},rt=async()=>{if(!(!c||Ce)){U(!0);try{let e=await JD(c.id);xe(e.access),we(e.token),r({title:`Rotated`,description:`New token minted — the previous one no longer works`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Rotate failed`,variant:`destructive`})}finally{U(!1)}}},it=async()=>{if(!(!c||Ce)&&window.confirm(`Revoke this agent's canvas access? Its token stops working immediately.`)){U(!0);try{await YD(c.id),xe(null),we(null),r({title:`Revoked`,description:`Agent access removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Revoke failed`,variant:`destructive`})}finally{U(!1)}}},at=e=>{if(e.type===`global`)return`Global — all workspaces`;if(e.type===`context`){let t=Be.find(t=>t.id===e.context);return`Context ${t?`${t.id} (${t.url})`:e.context} — follows the context live`}let t=e.workspaceName||e.workspace;return e.type===`path`?`Workspace ${t}, path ${e.path||`/`}`:`Workspace ${t} (whole tree)`};if(u)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!c||f)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-destructive`,children:f||`Agent not found`});let ot=PD.find(e=>e.id===s),st=encodeURIComponent(c.name||c.id),ct=s===`identity`||s===`provider`||s===`models`||s===`tools`;return(0,Z.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6 border-b pb-4`,title:`${ot.label} - ${c.label||c.name}`,description:ot.description,backTo:`/agents/${st}`,onBack:o?a:void 0}),(0,Z.jsxs)(`form`,{onSubmit:Xe,className:`space-y-6`,children:[s===`identity`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsx)(OM,{label:`Name`,hint:`ID: ${c.id}`,children:(0,Z.jsx)(q,{value:v,onChange:e=>y(e.target.value),placeholder:`lucy`})}),(0,Z.jsx)(OM,{label:`Label`,children:(0,Z.jsx)(q,{value:b,onChange:e=>x(e.target.value),placeholder:`Display name`})})]}),(0,Z.jsx)(OM,{label:`Description`,children:(0,Z.jsx)(q,{value:S,onChange:e=>C(e.target.value),placeholder:`Short description`})}),(0,Z.jsx)(OM,{label:`Color`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(q,{type:`color`,value:w,onChange:e=>T(e.target.value),className:`h-10 w-16 p-1`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>T(on()),children:`Randomize`})]})})]}),(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Persona`}),(0,Z.jsx)(OM,{label:`Role`,children:(0,Z.jsx)(q,{value:E,onChange:e=>D(e.target.value),placeholder:`e.g. Software Engineer`})}),(0,Z.jsx)(OM,{label:`Identity`,children:(0,Z.jsx)(`textarea`,{value:O,onChange:e=>k(e.target.value),placeholder:`Who this agent is…`,className:`${kM} min-h-[80px]`})}),(0,Z.jsx)(OM,{label:`Instructions`,children:(0,Z.jsx)(`textarea`,{value:A,onChange:e=>j(e.target.value),placeholder:`Behavioral instructions…`,className:`${kM} min-h-[80px]`})}),(0,Z.jsx)(OM,{label:`System Prompt`,hint:`Compiled from Role + Identity + Instructions. Override manually.`,children:(0,Z.jsx)(`textarea`,{value:M,onChange:e=>N(e.target.value),placeholder:`System prompt sent to the LLM…`,className:`${kM} min-h-[140px] font-mono text-xs`})})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Z.jsxs)(Y,{type:`button`,variant:`destructive`,disabled:g,onClick:Ze,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-4 w-4`}),g?`Deleting...`:`Delete Agent`]})]})]}),s===`provider`&&(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(OM,{label:`Provider`,children:(0,Z.jsxs)(`select`,{value:P,onChange:e=>{let t=e.target.value;ee(t),ne(wM[t]||``),L(EM(t))},className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,children:[(0,Z.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,Z.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,Z.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`}),(0,Z.jsx)(`option`,{value:`lm-studio`,children:`LM Studio (Local)`}),(0,Z.jsx)(`option`,{value:`vllm`,children:`vLLM (Local)`}),(0,Z.jsx)(`option`,{value:`custom`,children:`Custom`})]})}),(0,Z.jsx)(OM,{label:`API Key`,hint:[`ollama`,`lm-studio`,`vllm`].includes(P)?`Any value works for local providers.`:void 0,children:(0,Z.jsx)(q,{type:`password`,value:F,onChange:e=>I(e.target.value),placeholder:P===`ollama`?`ollama`:P===`lm-studio`?`lm-studio`:`sk-…`})}),(0,Z.jsx)(OM,{label:`Host / Base URL`,children:(0,Z.jsx)(q,{value:te,onChange:e=>L(e.target.value),placeholder:EM(P)||`https://api.example.com`})})]}),s===`models`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Main Model`}),(0,Z.jsx)(OM,{label:`Model`,children:(0,Z.jsx)(q,{value:R,onChange:e=>ne(e.target.value),placeholder:`Model name`})}),(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[(0,Z.jsx)(OM,{label:`Temperature`,children:(0,Z.jsx)(q,{type:`number`,min:0,max:2,step:.1,value:re,onChange:e=>ie(parseFloat(e.target.value)||.7)})}),(0,Z.jsx)(OM,{label:`Max Tokens`,children:(0,Z.jsx)(q,{type:`number`,min:1,max:2e5,value:ae,onChange:e=>z(parseInt(e.target.value)||4096)})}),(0,Z.jsx)(OM,{label:`Top P`,children:(0,Z.jsx)(q,{type:`number`,min:0,max:1,step:.1,value:oe,onChange:e=>se(parseFloat(e.target.value)||1)})})]})]}),[`Governance`,`Memory Management`,`Subagent / Tool Use`].map(e=>(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-4`,children:[(0,Z.jsxs)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:[e,` Model`]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Coming soon`})]},e))]}),s===`tools`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Runtime Tools`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Injected at start (pi defineTool): coding tools plus canvas tools scoped by the token binding (Access / ACL). Definitions live in the runtime — read-only here until the agent-runtime workspace lands.`})]}),He===null?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}):He.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No tools resolved.`}):(0,Z.jsx)(`div`,{className:`space-y-1.5`,children:He.map(e=>(0,Z.jsxs)(`details`,{className:`rounded-md border px-3 py-2`,children:[(0,Z.jsxs)(`summary`,{className:`cursor-pointer text-sm`,children:[(0,Z.jsx)(`code`,{className:`font-mono text-xs font-medium`,children:e.name}),(0,Z.jsx)(`span`,{className:`ml-2 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,children:e.source})]}),e.description&&(0,Z.jsx)(`p`,{className:`mt-2 whitespace-pre-wrap text-xs text-muted-foreground`,children:e.description}),e.parameters!=null&&(0,Z.jsx)(`pre`,{className:`mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-[11px]`,children:JSON.stringify(e.parameters,null,2)})]},e.name))}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:be?at(be.binding):`Unbound — no canvas tools are injected. Bind under Access / ACL.`})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Tools Config`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`config.tools JSON, merged server-side — e.g. {"canvas": {"enabled": false}} gates the canvas tools. Saved with Save Changes.`})]}),(0,Z.jsx)(`textarea`,{value:We,onChange:e=>{Ge(e.target.value);try{JSON.parse(e.target.value),G(null)}catch(e){G(e instanceof Error?e.message:`Invalid JSON`)}},className:`${kM} min-h-[120px] font-mono text-xs`}),Ke&&(0,Z.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Invalid JSON (not saved): `,Ke]})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Skills`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Installed skills are saved immediately, independent of Save Changes.`})]}),B.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No skills installed.`}):B.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.name}),(0,Z.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.package?e.source:e.description||`No description`})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{le(e.name),de(e.description||``),pe(e.content||``),he(e.source||``)},children:`Edit`}),(0,Z.jsx)(Y,{type:`button`,variant:`destructive`,size:`sm`,disabled:ve===(e.source||e.name),onClick:()=>et(e.source||e.name),children:ve===(e.source||e.name)?`Removing…`:`Remove`})]})]},e.name)),(0,Z.jsxs)(`div`,{className:`space-y-4 rounded-md border p-4`,children:[(0,Z.jsx)(OM,{label:`Package Source`,hint:`Use this for whole pi packages. Leave empty to save inline SKILL.md content.`,children:(0,Z.jsx)(q,{value:me,onChange:e=>he(e.target.value),placeholder:`npm:@foo/pi-tools or git:github.com/badlogic/pi-doom`})}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsx)(OM,{label:`Name`,children:(0,Z.jsx)(q,{value:V,onChange:e=>le(e.target.value),placeholder:`skill-name, or read from frontmatter`,disabled:!!me.trim()})}),(0,Z.jsx)(OM,{label:`Description`,children:(0,Z.jsx)(q,{value:ue,onChange:e=>de(e.target.value),placeholder:`What this skill helps with`,disabled:!!me.trim()})})]}),(0,Z.jsx)(OM,{label:`SKILL.md Content`,children:(0,Z.jsx)(`textarea`,{value:fe,onChange:e=>pe(e.target.value),placeholder:`# Skill instructions…`,disabled:!!me.trim(),className:`${kM} min-h-[160px] font-mono text-xs`})}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,disabled:ge||!me.trim()&&!fe.trim(),onClick:$e,children:ge?`Saving…`:`Install / Update Skill`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:Qe,children:`Clear`})]})]})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`MCP Servers`}),(c.config?.mcp?.servers||[]).length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No MCP servers configured.`}):(c.config?.mcp?.servers||[]).map((e,t)=>(0,Z.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,Z.jsxs)(`div`,{className:`font-mono text-xs text-muted-foreground`,children:[e.command,` `,(e.args||[]).join(` `)]})]},t))]})]}),s===`access`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Canvas Access`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`The agent talks to canvas through its own scoped token; the server clamps every request to the binding. Bind, rotate and revoke apply immediately.`})]}),H===c.id?be?(0,Z.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium`,children:at(be.binding)}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Permissions: `,be.permissions.join(`, `)||`none`,be.boundAt?` · bound ${new Date(be.boundAt).toLocaleString()}`:``,be.rotatedAt?` · token rotated ${new Date(be.rotatedAt).toLocaleString()}`:``]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:Ce,onClick:rt,children:`Rotate Token`}),(0,Z.jsx)(Y,{type:`button`,variant:`destructive`,size:`sm`,disabled:Ce,onClick:it,children:`Revoke Access`})]})]}):(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Unbound — this agent has no canvas access.`}):(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}),W&&(0,Z.jsxs)(`div`,{className:`space-y-2 rounded-md border border-warning/50 bg-warning/10 p-3`,children:[(0,Z.jsx)(`div`,{className:`text-xs font-medium`,children:`Agent token — shown once, store it now`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`code`,{className:`flex-1 truncate rounded bg-background px-2 py-1 font-mono text-xs`,children:W}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>navigator.clipboard?.writeText(W),children:`Copy`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>we(null),children:`Dismiss`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`In-process agents receive it automatically (canvas.env); external runtimes (agentd) take it as CANVAS_TOKEN.`})]})]}),(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:be?`Rebind`:`Bind`}),(0,Z.jsx)(OM,{label:`Scope`,hint:`Context bindings follow the context live; global spans all workspaces.`,children:(0,Z.jsxs)(`select`,{value:Te,onChange:e=>Ee(e.target.value),className:AM,children:[(0,Z.jsx)(`option`,{value:`context`,children:`Context (follows live)`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Z.jsx)(`option`,{value:`path`,children:`Workspace path`}),(0,Z.jsx)(`option`,{value:`global`,children:`Global (all workspaces)`})]})}),Te===`context`&&(0,Z.jsx)(OM,{label:`Context`,children:(0,Z.jsxs)(`select`,{value:Me,onChange:e=>Ne(e.target.value),className:AM,children:[(0,Z.jsx)(`option`,{value:``,children:`Select a context…`}),Be.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.id,` — `,e.url]},e.id))]})}),(Te===`workspace`||Te===`path`)&&(0,Z.jsx)(OM,{label:`Workspace`,children:(0,Z.jsxs)(`select`,{value:Oe,onChange:e=>ke(e.target.value),className:AM,children:[(0,Z.jsx)(`option`,{value:``,children:`Select a workspace…`}),Re.map(e=>(0,Z.jsx)(`option`,{value:e.name||e.id,children:e.label||e.name},e.id))]})}),Te===`path`&&(0,Z.jsx)(OM,{label:`Base path`,hint:`The agent is clamped to this subtree.`,children:(0,Z.jsx)(q,{value:Ae,onChange:e=>je(e.target.value),placeholder:`/work/projects/foo`})}),(0,Z.jsx)(OM,{label:`Permissions`,children:(0,Z.jsxs)(`div`,{className:`flex gap-4 text-sm`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:Pe,onChange:e=>Fe(e.target.checked)}),` read`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:Ie,onChange:e=>Le(e.target.checked)}),` write`]})]})}),(0,Z.jsx)(Y,{type:`button`,disabled:Ce,onClick:nt,children:Ce?`Working…`:be?`Rebind & Mint Token`:`Bind & Mint Token`})]})]}),s===`memory`&&(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Memory Engine`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Loop-based memory management. Settings coming soon.`})]}),s===`integrations`&&(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Integrations`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`IMAP, chat, SQL and REST API accounts. Coming soon.`})]}),ct&&(0,Z.jsx)(Y,{type:`submit`,disabled:m,children:m?`Saving…`:`Save Changes`})]})]})})}var MM=`workspace:backups`,NM=e=>`${no.workspaces}/${encodeURIComponent(e)}/db/backups`,PM=e=>J.get(NM(e)),FM=e=>J.post(NM(e),{action:`backup`}),IM=(e,t)=>J.post(NM(e),{action:`restore`,backupId:t,confirm:!0}),LM=new Map;function RM(e,t,n){let r=JSON.stringify([t,n.id]),i=LM.get(r);if(i)return i;let a=(async()=>{let r=n.action===`restore`,i=e({title:r?`Restoring workspace database`:`Backing up workspace database`,description:r?`Stopping the workspace and preserving its current database…`:`Copying and verifying all datasets…`});try{let e=n;for(;e.status===`running`;){let n=await PM(t),r=n.jobs.find(t=>t.id===e.id);if(!r)throw Error(`The server restarted. Refresh the backup list to check the result.`);e=r,window.dispatchEvent(new CustomEvent(MM,{detail:{workspace:t,status:n}})),e.status===`running`&&await new Promise(e=>setTimeout(e,1500))}if(e.status===`failed`)throw Error(e.error||`Database operation failed`);i.done({title:r?`Workspace database restored`:`Workspace backup verified`,description:r?`The workspace is stopped. Start it when you are ready; search indexes will rebuild.`:`Documents, relations and virtual tree placements are saved.`})}catch(e){throw i.fail({title:`Workspace backup needs attention`,description:e instanceof Error?e.message:String(e),variant:`destructive`}),e}})();return LM.set(r,a),a.finally(()=>LM.delete(r)).catch(()=>{}),a}var zM={startup:`Startup`,hourly:`Hourly`,manual:`Manual`,"pre-restore":`Before restore`};function BM({workspaceId:e,onRestored:t}){let{showToast:n,showProgress:r}=wo(),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),f=(0,X.useRef)(!1),p=(0,X.useRef)(!1),m=(0,X.useRef)(0),h=(0,X.useCallback)(()=>{let t=++m.current;return PM(e).then(n=>{if(!(!f.current||t!==m.current)){a(n),s(null);for(let t of n.jobs.filter(e=>e.status===`running`))RM(r,e,t).catch(()=>{})}}).catch(e=>{f.current&&t===m.current&&s(e instanceof Error?e.message:String(e))})},[e,r]);(0,X.useEffect)(()=>{f.current=!0,h();let t=t=>{let n=t.detail;n.workspace===e&&a(n.status)};return window.addEventListener(MM,t),()=>{f.current=!1,window.removeEventListener(MM,t)}},[e,h]);let g=async i=>{if(!p.current){p.current=!0,d(!0);try{let n=i?await IM(e,i.id):await FM(e);f.current&&a(e=>e&&{...e,jobs:[n,...e.jobs]}),await RM(r,e,n),i&&t()}catch(e){n({title:`Database operation did not complete`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{p.current=!1,f.current&&(d(!1),h())}}},_=u||!!i?.jobs.some(e=>e.status===`running`),v=i?.jobs[0];return(0,Z.jsxs)(`div`,{className:`min-w-0 space-y-5`,children:[(0,Z.jsxs)(`section`,{className:`space-y-4 rounded border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Z.jsx)(ra,{className:`h-5 w-5 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`font-semibold`,children:`Workspace checkpoints`}),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,className:`ml-auto`,disabled:_||!i||!!o,onClick:()=>void g(),children:[_?(0,Z.jsx)(Ti,{className:`mr-2 h-4 w-4 animate-spin`}):(0,Z.jsx)(ra,{className:`mr-2 h-4 w-4`}),`Back up now`]})]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Save a checkpoint before a bulk action. Each backup includes every document, relation and virtual tree placement in this workspace’s database.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-x-5 gap-y-2 text-sm`,children:[(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`strong`,{children:i?.retention.hourly??24}),` hourly backups`]}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`strong`,{children:i?.retention.startup??14}),` startup backups`]}),(0,Z.jsx)(`span`,{children:`Manual checkpoints kept`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Hourly backups run while the workspace is active. These checkpoints cover the database only; files in storage backends and workspace settings need their own backups.`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsxs)(`h2`,{className:`text-sm font-semibold`,children:[`Verified checkpoints`,i?` · ${i.backups.length}`:``]}),(0,Z.jsx)(Y,{variant:`ghost`,size:`icon`,className:`h-8 w-8`,onClick:()=>void h(),"aria-label":`Refresh backups`,children:(0,Z.jsx)(Er,{className:`h-4 w-4`})})]}),o&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:o}),v&&(0,Z.jsx)(`p`,{role:`status`,className:`text-sm ${v.status===`failed`?`text-destructive`:`text-muted-foreground`}`,children:v.status===`running`?`Database operation in progress…`:v.status===`failed`?v.error:v.action===`restore`?`Database restored. The workspace is stopped and ready to start.`:`Backup complete and verified.`}),!i&&!o&&(0,Z.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Loading backups…`}),i?.backups.length===0&&(0,Z.jsx)(`p`,{className:`rounded border border-dashed p-6 text-sm text-muted-foreground`,children:`No verified checkpoints yet. Create one before your next bulk action.`}),(0,Z.jsx)(`div`,{className:`space-y-2`,children:i?.backups.map(e=>(0,Z.jsxs)(`article`,{className:`flex min-w-0 flex-wrap items-center gap-3 rounded border p-3`,children:[(0,Z.jsx)(sr,{className:`h-4 w-4 shrink-0 text-muted-foreground`,"aria-label":`Verified`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 basis-40`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:new Date(e.createdAt).toLocaleString()}),(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[zM[e.kind],` · `,Ts(e.bytes),` · `,(e.datasets.documents?.count??0).toLocaleString(),` documents`]})]}),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:_,onClick:()=>l(e),children:[(0,Z.jsx)(Vr,{className:`mr-2 h-3.5 w-3.5`}),`Restore`]})]},e.id))}),(0,Z.jsx)(vo,{open:!!c,onOpenChange:e=>{e||l(null)},children:(0,Z.jsxs)(lo,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,Z.jsxs)(_o,{children:[(0,Z.jsx)(io,{children:`Restore this workspace checkpoint?`}),(0,Z.jsxs)(ro,{children:[`The workspace will stop and its current database will be backed up first. Documents, relations and virtual tree placements will return to `,c?new Date(c.createdAt).toLocaleString():`the selected checkpoint`,`. Files in storage backends and workspace settings will stay as they are. The workspace stays stopped after restoration.`]})]}),(0,Z.jsxs)(mo,{children:[(0,Z.jsx)(go,{children:`Cancel`}),(0,Z.jsx)(po,{disabled:_,onClick:()=>{c&&g(c)},children:`Back up current & restore`})]})]})})]})}var VM={collect:`Collect unused blobs`,verify:`Verify integrity`,compact:`Compact index`},HM=e=>e.status===`queued`||e.status===`running`,UM=e=>`${no.workspaces}/${encodeURIComponent(e)}/cache/maintenance`,WM=e=>J.get(UM(e)),GM=(e,t,n)=>J.post(UM(e),{store:t,action:n,...n===`verify`?{confirm:!0}:{}});function KM(e){if(e.status===`failed`)return e.error||`Maintenance failed`;if(e.status===`queued`)return`Waiting for active storage operations…`;if(e.status===`running`)return e.action===`verify`?`Reading and checking stored content…`:`Processing the cache index…`;let t=e.result||{};return e.action===`compact`?`${(t.compactedCount||0).toLocaleString()} keys compacted`:e.action===`verify`?`${(t.verifiedContent||0).toLocaleString()} blobs verified · ${(t.badContentCount||0).toLocaleString()} corrupted blobs removed · ${Ts(t.reclaimedSize||0)} reclaimed`:`${(t.reclaimedCount||0).toLocaleString()} unused blobs removed · ${Ts(t.reclaimedSize||0)} reclaimed`}var qM=new Map,JM=`workspace:cache-maintenance`;function YM(e,t,n){let r=JSON.stringify([t,n.id]),i=qM.get(r);if(i)return i;let a=(async()=>{let r=e({title:VM[n.action],description:`${n.store} · ${KM(n)}`});try{let e=n;for(;HM(e);){let i=await WM(t),a=i.jobs.find(e=>e.id===n.id);if(!a)throw Error(`Maintenance receipt is no longer available. The server may have restarted; refresh the cache settings.`);if(e=a,window.dispatchEvent(new CustomEvent(JM,{detail:{workspace:t,status:i}})),!HM(e))break;r.update({title:VM[e.action],description:`${e.store} · ${KM(e)}`}),await new Promise(e=>setTimeout(e,2e3))}if(e.status===`failed`)throw Error(KM(e));r.done({title:`${VM[e.action]} complete`,description:`${e.store} · ${KM(e)}`})}catch(e){throw r.fail({title:`Cache maintenance needs attention`,description:`${n.store} · ${e instanceof Error?e.message:String(e)}`,variant:`destructive`}),e}})();return qM.set(r,a),a.finally(()=>{qM.get(r)===a&&qM.delete(r)}).catch(()=>{}),a}function XM({workspaceId:e,children:t}){let{showToast:n,showProgress:r}=wo(),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(`workspace:cache`),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(null),m=(0,X.useRef)(!1),h=(0,X.useRef)(!1),g=(0,X.useCallback)(()=>WM(e).then(t=>{if(h.current){a(t),p(null);for(let n of t.jobs.filter(HM))YM(r,e,n).catch(()=>{})}}).catch(e=>{h.current&&p(e instanceof Error?e.message:`Cannot load maintenance status`)}),[e,r]);(0,X.useEffect)(()=>{h.current=!0,g();let t=t=>{let{workspace:n,status:r}=t.detail;n===e&&(a(r),p(null))};return window.addEventListener(JM,t),()=>{h.current=!1,window.removeEventListener(JM,t)}},[e,g]);let _=async t=>{if(!(m.current||i?.jobs.some(HM))){m.current=!0,l(!0);try{let n=await GM(e,o,t);h.current&&a(e=>e&&{...e,jobs:[n,...e.jobs.filter(e=>e.id!==n.id)]}),YM(r,e,n).catch(()=>{})}catch(e){n({title:`Could not start maintenance`,description:e instanceof Error?e.message:String(e),variant:`destructive`}),g()}finally{m.current=!1,h.current&&l(!1)}}},v=c||!!i?.jobs.some(HM),y=i?.stores.find(e=>e.id===o),b=i?.jobs[0];return(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-(--panel-radius) border p-4`,"aria-label":`Workspace cache maintenance`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`h2`,{className:`flex items-center gap-2 text-sm font-semibold`,children:[(0,Z.jsx)(Fa,{className:`h-4 w-4 shrink-0`}),`Workspace cache`]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Thumbnails, cached resources and pending transfers. Maintenance runs only when requested.`})]}),t&&(0,Z.jsx)(`fieldset`,{disabled:v,children:t})]}),(0,Z.jsxs)(`div`,{className:`space-y-3 border-t pt-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`label`,{htmlFor:`cache-maintenance-store`,className:`text-xs font-medium`,children:`Store`}),(0,Z.jsxs)(`select`,{id:`cache-maintenance-store`,value:o,onChange:e=>s(e.target.value),disabled:v,className:`min-w-0 max-w-full rounded-md border bg-background px-2 py-1.5 text-xs`,children:[(0,Z.jsx)(`option`,{value:`workspace:cache`,children:`workspace:cache`}),(0,Z.jsx)(`option`,{value:`workspace:data`,children:`workspace:data`})]}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`icon`,onClick:()=>void g(),"aria-label":`Refresh cache maintenance status`,className:`ml-auto h-8 w-8`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o===`workspace:data`?`Managed document blobs. Referenced content is kept during collection.`:`Working cache, including content awaiting transfer. Referenced content is kept during collection.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canCollect||!!f,onClick:()=>void _(`collect`),children:[(0,Z.jsx)(Qr,{className:`mr-2 h-3.5 w-3.5`}),`Collect unused blobs`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canCompact||!!f,onClick:()=>void _(`compact`),children:[(0,Z.jsx)(ra,{className:`mr-2 h-3.5 w-3.5`}),`Compact index`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canVerify||!!f,onClick:()=>d(!0),children:[(0,Z.jsx)(Fi,{className:`mr-2 h-3.5 w-3.5`}),`Verify integrity`]})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Collection removes unreferenced blobs. Compaction trims index history. Verification reads every blob and may remove corrupted content. Storage writes may wait during maintenance.`}),!i&&!f&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,role:`status`,children:`Loading maintenance status…`}),y&&!y.canCollect&&!y.canVerify&&!y.canCompact&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Update canvas-stored to enable maintenance for this store.`}),f&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:f}),b&&(0,Z.jsxs)(`div`,{className:`rounded-md bg-muted/50 p-3 text-xs`,role:`status`,"aria-live":`polite`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[HM(b)&&(0,Z.jsx)(Ti,{className:`h-3.5 w-3.5 animate-spin`}),VM[b.action],` · `,b.store]}),(0,Z.jsx)(`p`,{className:`mt-1 ${b.status===`failed`?`text-destructive`:`text-muted-foreground`}`,children:KM(b)}),(0,Z.jsx)(`p`,{className:`mt-1 text-muted-foreground`,children:b.finishedAt?`Finished ${new Date(b.finishedAt).toLocaleString()}`:`Requested ${new Date(b.createdAt).toLocaleString()}`})]})]}),(0,Z.jsx)(vo,{open:u,onOpenChange:d,children:(0,Z.jsxs)(lo,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,Z.jsxs)(_o,{children:[(0,Z.jsxs)(io,{children:[`Verify `,o,`?`]}),(0,Z.jsx)(ro,{children:`This reads all stored content and can take a long time. Corrupted blobs and their index entries may be removed. Keep a recovery backup before running it. Storage writes may wait until it finishes.`})]}),(0,Z.jsxs)(mo,{children:[(0,Z.jsx)(go,{children:`Cancel`}),(0,Z.jsx)(po,{disabled:v,onClick:()=>void _(`verify`),children:`Verify and repair`})]})]})})]})}function ZM({workspaceId:e,backend:t,onSaved:n}){let r=t?.config||{},i=()=>({name:String(r.label||``),bucket:String(r.bucket||``),prefix:String(r.prefix||``),endpoint:String(r.endpoint||``),region:String(r.region||`us-east-1`),accessKeyId:``,secretAccessKey:``,sessionToken:``}),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(i),[l,u]=(0,X.useState)(r.forcePathStyle!==!1),[d,f]=(0,X.useState)(r.readOnly===!0),[p,m]=(0,X.useState)(r.watch===!0),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(!1),{showToast:y}=wo(),b=e=>({value:s[e],onChange:t=>c(n=>({...n,[e]:t.target.value}))});return a?(0,Z.jsxs)(`form`,{onSubmit:async r=>{r.preventDefault(),v(!0);try{let r={label:s.name.trim(),bucket:s.bucket.trim(),prefix:s.prefix.trim(),endpoint:s.endpoint.trim(),region:s.region.trim()||`us-east-1`,forcePathStyle:l,readOnly:d,watch:p,...Object.fromEntries([`accessKeyId`,`secretAccessKey`,`sessionToken`].flatMap(e=>{let t=s[e].trim();return t?[[e,t]]:[]})),...h?{sessionToken:``}:{}};t?await Fo(e,`s3`,t.address,r):await Zs(e,`s3`,r),o(!1),c(i()),y({title:t?`S3 backend updated`:`S3 backend added`,description:`Use Re-sync to check indexing progress, and filing policies to automate copies.`}),await n()}catch(e){y({title:`Could not connect S3`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{v(!1)}},className:`w-full space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`h2`,{className:`flex items-center gap-2 text-sm font-semibold`,children:[(0,Z.jsx)(Fa,{className:`h-4 w-4`}),t?`Edit S3 connection`:`Add S3-compatible bucket`]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Amazon S3, MinIO, Garage, RustFS or Ceph RGW. Connect an existing bucket, optionally scoped to a prefix. Supports browsing, reads and filing copies; mirror policies and overwrites are unavailable.`}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Name`,(0,Z.jsx)(q,{...b(`name`),required:!0,placeholder:`Accounting archive`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Bucket`,(0,Z.jsx)(q,{...b(`bucket`),disabled:!!t,required:!0,placeholder:`accounting`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Endpoint (blank for Amazon S3)`,(0,Z.jsx)(q,{...b(`endpoint`),disabled:!!t,type:`url`,placeholder:`https://s3.example.com`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Region`,(0,Z.jsx)(q,{...b(`region`),required:!0,placeholder:`us-east-1`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs sm:col-span-2`,children:[`Prefix (optional)`,(0,Z.jsx)(q,{...b(`prefix`),disabled:!!t,placeholder:`Augmentd/Accounting`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Access key ID`,(0,Z.jsx)(q,{...b(`accessKeyId`),required:!t,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Secret access key`,(0,Z.jsx)(q,{...b(`secretAccessKey`),type:`password`,required:!t,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs sm:col-span-2`,children:[`Session token (optional)`,(0,Z.jsx)(q,{...b(`sessionToken`),disabled:h,type:`password`,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),t&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)}),`Clear stored session token`]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),`Path-style addressing`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked)}),`Read-only`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:p,onChange:e=>m(e.target.checked)}),`Poll for changes`]})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Writable connections test conflict protection using a temporary object, then delete it. The key needs list/read/write access and delete access under .canvas-probe/. Initial indexing reads file bytes; polling can incur request and download charges. Upload limit: 5 GiB per file.`}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,disabled:_,onClick:()=>{o(!1),c(i())},children:`Cancel`}),(0,Z.jsx)(Y,{disabled:_,children:_?`Checking connection…`:`Save connection`})]})]}):(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,onClick:()=>{c(i()),u(r.forcePathStyle!==!1),f(r.readOnly===!0),m(r.watch===!0),g(!1),o(!0)},children:[t?(0,Z.jsx)(Lr,{className:`mr-2 h-3.5 w-3.5`}):(0,Z.jsx)(br,{className:`mr-2 h-3.5 w-3.5`}),t?`Edit S3 connection`:`Add S3 bucket`]})}function QM({workspaceId:e,isActive:t,currentMode:n,onChanged:r}){let[i,a]=(0,X.useState)(n===`workspace`?`workspace`:`secrets`),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(``),[u,d]=(0,X.useState)(``),[f,p]=(0,X.useState)(``),[m,h]=(0,X.useState)(``),[g,_]=(0,X.useState)(!1);return(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`font-semibold text-sm`,children:`Workspace protection`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Protect service credentials with a PIN or password. Optionally require it to start the whole workspace. Files and document contents are not encrypted.`}),t&&(0,Z.jsx)(`p`,{className:`text-sm`,children:`Stop the workspace before changing protection.`}),(0,Z.jsxs)(`form`,{className:`space-y-3`,onSubmit:async t=>{if(t.preventDefault(),h(``),o!==c){h(`PIN/password confirmation does not match`);return}_(!0);try{let t=await J.put(`${no.workspaces}/${e}/protection`,{mode:i,passphrase:o,currentPassphrase:u||void 0});p(t.recoveryKey),s(``),l(``),d(``)}catch(e){h(e instanceof Error?e.message:`Could not save protection`)}finally{_(!1)}},children:[(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Protection mode`,(0,Z.jsxs)(`select`,{className:`block rounded border bg-background p-2 w-full`,value:i,onChange:e=>a(e.target.value),disabled:t||g,children:[(0,Z.jsx)(`option`,{value:`secrets`,children:`Secrets only — allow start without integrations`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Whole workspace — require PIN/password to start`})]})]}),(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Current PIN/password or recovery key (if already protected)`,(0,Z.jsx)(q,{type:`password`,autoComplete:`current-password`,value:u,onChange:e=>d(e.target.value),disabled:t||g})]}),(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`New PIN/password`,(0,Z.jsx)(q,{type:`password`,autoComplete:`new-password`,minLength:4,maxLength:1024,required:!0,value:o,onChange:e=>s(e.target.value),disabled:t||g})]}),(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Confirm new PIN/password`,(0,Z.jsx)(q,{type:`password`,autoComplete:`new-password`,required:!0,value:c,onChange:e=>l(e.target.value),disabled:t||g})]}),(0,Z.jsx)(Y,{disabled:t||g||!!f,children:g?`Saving…`:`Save protection`})]}),m&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:m}),f&&(0,Z.jsxs)(`div`,{className:`space-y-2 rounded border p-3`,children:[(0,Z.jsx)(`p`,{className:`text-sm`,children:`Save this recovery key now. It is shown only once and replaces any previous recovery key.`}),(0,Z.jsx)(`code`,{className:`block break-all select-all`,children:f}),(0,Z.jsx)(Y,{variant:`outline`,onClick:()=>{p(``),r()},children:`I saved the recovery key`})]})]})}var $M=`h-8 rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`;function eN({title:e,hint:t,children:n}){let[r,i]=(0,X.useState)(!1);return(0,Z.jsxs)(`section`,{className:`overflow-hidden rounded-lg border`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>i(e=>!e),"aria-expanded":r,className:`flex w-full items-center justify-between gap-4 px-4 py-3 text-left transition-colors hover:bg-muted/40`,children:[(0,Z.jsxs)(`span`,{className:`min-w-0`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium`,children:e}),(0,Z.jsx)(`span`,{className:`mt-0.5 block text-xs text-muted-foreground`,children:t})]}),(0,Z.jsx)(qr,{className:K(`h-4 w-4 shrink-0 text-muted-foreground transition-transform motion-reduce:transition-none`,r&&`rotate-180`)})]}),r&&(0,Z.jsx)(`div`,{className:`border-t p-4`,children:n})]})}function tN({workspaceId:e,workspaceName:t,refreshKey:n,onRefresh:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),l=(0,X.useCallback)(()=>GA(e).then(e=>o(e.queue??null)).catch(()=>{}),[e]);(0,X.useEffect)(()=>{l();let e=window.setInterval(()=>{o(e=>(e&&(e.pending>0||e.draining)&&l(),e))},3e3);return()=>window.clearInterval(e)},[l,n]);let u=async()=>{if(a){c(!0);try{let e=await Oc(!a.paused,t);i({title:e.paused?`Embedding paused`:`Embedding resumed`,description:e.paused?`${e.pending.toLocaleString()} job(s) held for this workspace. Resume any time; a restart also resumes.`:`${e.pending.toLocaleString()} job(s) draining.`}),await l()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to toggle the embedding queue (admin only)`,variant:`destructive`})}finally{c(!1)}}},d=!!a?.draining,f=a?a.paused?`bg-warning`:d?`bg-success`:`bg-muted-foreground/40`:`bg-muted-foreground/40`;return(0,Z.jsxs)(`section`,{className:`flex flex-wrap items-center justify-between gap-x-4 gap-y-2 rounded-lg border bg-muted/30 px-4 py-2.5`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 text-sm`,children:[(0,Z.jsxs)(`span`,{className:`relative flex h-2 w-2 shrink-0`,"aria-hidden":!0,children:[d&&(0,Z.jsx)(`span`,{className:`absolute inline-flex h-full w-full animate-ping rounded-full bg-success opacity-60 motion-reduce:hidden`}),(0,Z.jsx)(`span`,{className:K(`relative inline-flex h-2 w-2 rounded-full`,f)})]}),(0,Z.jsx)(`span`,{className:`font-medium`,children:a?a.pending>0?(0,Z.jsxs)(Z.Fragment,{children:[a.pending.toLocaleString(),` `,(0,Z.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`pending`})]}):a.paused?`Paused`:`Idle`:`Queue unavailable`}),a?.paused&&a.pending>0&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`held`}),a?.ingestDisabled&&(0,Z.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,title:`CANVAS_INFERD_INGEST_DISABLED=true: nothing new is enqueued; existing vectors still serve search`,children:`ingest disabled`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[a&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:s,onClick:u,title:a.paused?`Resume embedding; the held backlog drains`:`Pause after the current batch. Stops the CPU-heavy model inference; documents keep indexing and stay searchable by text.`,children:s?`…`:a.paused?`Resume`:`Pause`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:r,title:`Reload config, queue and tables`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5`})})]})]})}function nN({workspaceId:e,tables:t,error:n,onChanged:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)(null),s=t.filter(e=>!e.active),c=async t=>{if(window.confirm(`Reclaim "${t.name}"?\n\nThis permanently deletes the vectors for ${t.model||`that model`} and its "already embedded" ledger. Switching back to it afterwards would cost a full re-embed rather than being instant.\n\nThis is the only irreversible step in the whole flow.`)){o(t.name);try{let n=await QA(e,t.name);if(!n.dropped)throw Error(n.error||`Failed to drop the vector table`);i({title:`Reclaimed`,description:`Dropped '${n.name||t.name}'.`}),r()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to reclaim`,variant:`destructive`})}finally{o(null)}}};return n?(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/40 bg-destructive-subtle p-4`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium text-destructive`,children:`Vector tables unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:n})]}):s.length===0?null:(0,Z.jsx)(eN,{title:`Previous models (${s.length})`,hint:`Kept on disk so switching back is instant. Reclaiming deletes their vectors for good (the only irreversible step here).`,children:(0,Z.jsx)(`div`,{className:`divide-y`,children:s.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-2 first:pt-0 last:pb-0`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`p`,{className:`truncate font-mono text-xs`,children:[e.model||`unknown model`,e.dim?` · ${e.dim}-d`:``]}),(0,Z.jsxs)(`p`,{className:`truncate font-mono text-[11px] text-muted-foreground`,children:[`└─ `,e.name]})]}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,className:`text-destructive hover:text-destructive`,disabled:a===e.name,onClick:()=>c(e),title:`Permanently delete this model's vectors and ledger`,children:[(0,Z.jsx)(Qr,{className:`mr-1.5 h-3.5 w-3.5`}),a===e.name?`Reclaiming…`:`Reclaim`]})]},e.name))})})}function rN({workspaceId:e,workspaceName:t,spaces:n,onDone:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)(``),[s,c]=(0,X.useState)(``),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1);return(0,Z.jsxs)(eN,{title:`Fill a space`,hint:`Embed documents that are missing from a space. Narrow it to one subtree to try a model on a single project first.`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Space`}),(0,Z.jsxs)(`select`,{className:`${$M} w-full`,value:a,onChange:e=>o(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:`all spaces`}),n.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))]})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`label`,{className:`text-xs font-medium`,children:[`Limit to a path `,(0,Z.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:s,onChange:e=>c(e.target.value),placeholder:`ctx://work/project or dir://photos`,className:`h-8 font-mono text-sm`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>m(!0),title:`Pick a context or directory path from the tree`,children:(0,Z.jsx)(fr,{className:`h-3.5 w-3.5`})})]})]})]}),(0,Z.jsxs)(`label`,{className:`mt-3 flex items-start gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:l,onChange:e=>u(e.target.checked)}),(0,Z.jsxs)(`span`,{children:[`Re-embed documents that are already embedded`,l&&s.trim()&&(0,Z.jsx)(`span`,{className:`mt-1 block text-[11px] text-warning`,children:`Combined with a path limit this clears the WHOLE space, not just that subtree. A partial clear is not expressible in the ledger. Leave this off unless you mean to redo everything.`})]})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,className:`mt-3`,onClick:async()=>{f(!0);try{let t=await XA(e,{space:a||void 0,reindex:l,scope:s.trim()||void 0});t.ingestDisabled?i({title:`Ingest disabled`,description:`CANVAS_INFERD_INGEST_DISABLED=true: nothing was enqueued. Existing vectors still serve search.`,variant:`destructive`}):i({title:`Fill enqueued`,description:`${t.enqueued.toLocaleString()} document(s) queued${t.scope?` under ${t.scope}`:``}. The status line reports progress.`}),r()}catch(e){i({title:`Fill failed`,description:e instanceof Error?e.message:`Failed to enqueue`,variant:`destructive`})}finally{f(!1)}},disabled:d,children:d?`Queueing…`:`Start fill`}),p&&(0,Z.jsx)(Le,{onClose:()=>m(!1),children:(0,Z.jsx)(y,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,fixedWorkspaceName:t,multiple:!1,onClose:()=>m(!1),onConfirm:(e,t)=>{let n=e[0];if(n){let e=t.treeType===`directory`?`dir`:`ctx`;c(`${e}://${n.replace(/^\/+/,``)}`)}m(!1)}})})]})}var iN=[{provider:`blip`,model:`HuggingFaceTB/SmolVLM-500M-Instruct`,task:`instruct`,label:`SmolVLM 500M: prompted description (recommended)`,note:`~500 MB. Follows the prompt below, so architecture/materials/setting can be asked for.`},{provider:`blip`,model:`HuggingFaceTB/SmolVLM-256M-Instruct`,task:`instruct`,label:`SmolVLM 256M: prompted, smaller`,note:`~250 MB. Same prompting, weaker; for memory-tight boxes.`},{provider:`blip`,model:`onnx-community/Florence-2-base-ft`,task:`florence2`,label:`Florence-2 base: detailed caption`,note:`Detailed multi-sentence captions, but not steerable: no prompt, fixed task token.`},{provider:`blip`,model:`Xenova/vit-gpt2-image-captioning`,task:`caption`,label:`vit-gpt2: one short sentence (weakest)`,note:`The old default. Terse and repetition-prone; kept for continuity and low memory.`}],aN=`custom`,oN=[{value:`instruct`,label:`Instruct VLM (image + prompt)`},{value:`florence2`,label:`Florence-2 (task token)`},{value:`caption`,label:`Plain captioner (image only)`}],sN=`Describe this photograph in two or three sentences. If it shows a building or interior, name the architectural style, the main materials and the setting. Describe only what is visible.`;function cN({workspaceId:e,config:t,saving:n,onSave:r}){let{showToast:i}=wo(),a=t.workspace||{},o=t.effective||{},s=iN[0],c=a.summarize?.image||o.summarize?.image||{},[l,u]=(0,X.useState)(()=>o.summarize?.image?.enabled===!0||a.summarize?.image?.enabled===!0),[d,f]=(0,X.useState)(()=>{let e=iN.find(e=>e.provider===(c.provider||s.provider)&&e.model===c.model);return e?`${e.provider}::${e.model}`:c.model?aN:`${s.provider}::${s.model}`}),[p,m]=(0,X.useState)(()=>iN.some(e=>e.model===c.model)?``:c.model||``),[h,g]=(0,X.useState)(()=>c.task||`instruct`),[_,v]=(0,X.useState)(()=>c.prompt||``),[y,b]=(0,X.useState)(!1),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(!1),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(!1),k=iN.find(e=>`${e.provider}::${e.model}`===d),A=d===aN,j=A?{provider:s.provider,model:p.trim(),task:h,label:`Custom`,note:``}:k||s,M=j.task===`instruct`,N=(0,X.useCallback)(()=>GA(e).then(e=>S(e.summarize||null)).catch(()=>{}),[e]);(0,X.useEffect)(()=>{N();let e=window.setInterval(()=>{S(e=>(e?.running&&N(),e))},2e3);return()=>window.clearInterval(e)},[N]);let P=async()=>{await r({...a,summarize:{...a.summarize||{},image:{enabled:l,provider:j.provider,model:j.model,task:j.task,...M&&_.trim()?{prompt:_.trim()}:{}}}}),b(!1)},ee=async()=>{E(!0);try{S(await qA(e)),i({title:`Stopping image summaries`,description:`The image being captioned finishes first; the rest are left for a later run.`})}catch(e){i({title:`Could not stop`,description:e instanceof Error?e.message:`Failed to stop`,variant:`destructive`})}finally{E(!1)}},F=async(t=!1)=>{w(!0);try{let n=await KA(e,{force:t});S(n),i({title:t?`Rebuilding image summaries`:`Backfilling image summaries`,description:`${n.total.toLocaleString()} candidate image(s). First run downloads model weights.`})}catch(e){i({title:`Summaries failed to start`,description:e instanceof Error?e.message:`Failed to start`,variant:`destructive`})}finally{w(!1)}},I=o.summarize?.image?.enabled===!0,te=x?.running===!0,L=x?.errors?.[0]?.error;return(0,Z.jsx)(eN,{title:`Summaries`,hint:`Generate descriptions for indexed images (metadata.summary); searchable via full-text and dense search`,children:(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:l,disabled:n,onChange:e=>{u(e.target.checked),b(!0)}}),`Images`]}),(0,Z.jsxs)(`select`,{className:$M,value:d,disabled:n||!l,onChange:e=>{f(e.target.value),b(!0)},children:[iN.map(e=>(0,Z.jsx)(`option`,{value:`${e.provider}::${e.model}`,children:e.label},`${e.provider}::${e.model}`)),(0,Z.jsx)(`option`,{value:aN,children:`Custom model…`})]}),!A&&(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:j.model})]}),A&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(q,{className:`h-8 w-72 font-mono text-xs`,placeholder:`org/model-id (Transformers.js / ONNX)`,value:p,disabled:n||!l,onChange:e=>{m(e.target.value),b(!0)}}),(0,Z.jsx)(`select`,{className:$M,value:h,disabled:n||!l,onChange:e=>{g(e.target.value),b(!0)},children:oN.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),l&&j.note&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:j.note}),l&&M&&(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`textarea`,{className:`w-full rounded-md border border-input bg-transparent p-2 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`,rows:3,placeholder:sN,value:_,disabled:n,onChange:e=>{v(e.target.value),b(!0)}}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`What to ask of every image. Empty uses the default shown above. Captions are indexed, so ask for the words you would search by.`})]}),x&&(x.running||x.total>0||x.finishedAt)&&(0,Z.jsxs)(`p`,{className:K(`text-xs`,x.aborted?`text-destructive`:`text-muted-foreground`),children:[te?`Running`:x.aborted?`Stopped`:x.cancelled?`Cancelled`:`Last run`,`: `,x.described,`/`,x.total,` described`,x.skipped?`, ${x.skipped} skipped`:``,x.failed?`, ${x.failed} failed`:``,x.aborted?`. ${x.abortedReason||`model worker died`}. Remaining images were not attempted; generate again to retry.`:x.cancelled?`. Stopped by you. The remaining images were left untouched; generate again to continue.`:L?`. ${L}`:``]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:D,disabled:n||te,onChange:e=>O(e.target.checked)}),(0,Z.jsxs)(`span`,{children:[`Re-caption images that already have a summary`,D&&(0,Z.jsxs)(`span`,{className:`mt-1 block text-[11px] text-warning`,children:[`Replaces every existing `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`metadata.summary`}),`, including ones written by a different model. Leave this off to fill in only what is missing.`]})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Enable + save, then run. Only the local caption provider is wired today. Candidates come from `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`data/mime/image`}),`.`]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>void P(),disabled:n||!y,children:`Save summaries`}),(0,Z.jsx)(Y,{size:`sm`,onClick:()=>void F(D),disabled:n||y||C||te||!I,title:I?y?`Save config first`:D?`Re-caption every image, replacing existing summaries`:`Caption images that have no summary yet`:`Enable image summaries and save first`,children:te||C?`Running…`:D?`Rebuild`:`Backfill`}),te&&(0,Z.jsx)(Y,{size:`sm`,variant:`destructive`,onClick:()=>void ee(),disabled:T,title:`Finish the current image, then stop. The rest are left for later.`,children:T?`Stopping…`:`Stop`})]})]})]})})}function lN({workspaceId:e,workspaceName:t}){let{showToast:n}=wo(),[r,i]=(0,X.useState)(null),[a,o]=(0,X.useState)([]),[s,c]=(0,X.useState)(),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)([]),[_,v]=(0,X.useState)(0),y=(0,X.useCallback)(()=>JA(e).then(e=>{i(e),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to load the embedding config`)).finally(()=>u(!1)),[e]),b=(0,X.useCallback)(()=>ZA(e).then(e=>{o(e.tables||[]),c(e.error)}).catch(e=>c(e instanceof Error?e.message:`Failed to list vector tables`)),[e]);(0,X.useEffect)(()=>{y(),b()},[y,b]);let x=()=>{u(!0),y(),b(),v(e=>e+1)},S=async t=>{f(!0);try{let r=await YA(e,t);g(r.movedSpaces||[]),r.movedSpaces?.length?n({title:`Saved; fill to finish`,description:`${r.movedSpaces.join(`, `)} now targets a new model. The switch is live, but the new table is empty until you fill it.`}):r.applied===!1?n({title:`Saved; applies on next start`,description:`The workspace is not running, so the new spaces take effect when it starts.`}):n({title:`Saved`,description:`Embedding config updated.`}),await y(),await b()}catch(e){n({title:`Save failed`,description:e instanceof Error?e.message:`Failed to save`,variant:`destructive`})}finally{f(!1)}},C=async t=>{try{let r=await XA(e,{space:t});if(r.ingestDisabled){n({title:`Ingest disabled`,description:`CANVAS_INFERD_INGEST_DISABLED=true: nothing was enqueued. Existing vectors still serve search.`,variant:`destructive`});return}n({title:`Filling ${t}`,description:`${r.enqueued.toLocaleString()} document(s) queued. The status line reports progress.`}),g(e=>e.filter(e=>e!==t)),v(e=>e+1),b()}catch(e){n({title:`Fill failed`,description:e instanceof Error?e.message:`Failed to enqueue`,variant:`destructive`})}};if(l)return(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading the embedding config…`]});if(p||!r)return(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-lg border border-destructive/40 bg-destructive-subtle p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Embedding config unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:p||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:x,children:`Try again`})]});let w=Object.keys(r.effective.spaces||{}).sort();return(0,Z.jsxs)(`div`,{className:`space-y-5`,children:[(0,Z.jsx)(tN,{workspaceId:e,workspaceName:t,refreshKey:_,onRefresh:x}),(0,Z.jsx)(yj,{value:r.workspace||{},effective:r.effective||{},inherited:r.inherited||{},resolvedSpaces:r.spaces,invalid:r.invalid,attention:h,onFill:C,saving:d,saveLabel:`Save embedding config`,onSave:S},JSON.stringify(r.workspace)),(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsx)(cN,{workspaceId:e,config:r,saving:d,onSave:S},`summarize:${JSON.stringify(r.workspace?.summarize||{})}`),(0,Z.jsx)(rN,{workspaceId:e,workspaceName:t,spaces:w,onDone:()=>{b(),v(e=>e+1)}}),(0,Z.jsx)(nN,{workspaceId:e,tables:a,error:s,onChanged:()=>{b()}})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Stored in this workspace's own `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`workspace.json`}),`, so it travels with the workspace. Settings resolve in layers: built-in, then server, then your defaults, then this workspace, which wins. Changes apply live, with no restart.`]})]})}function uN(e){let t=(e||``).split(`.`).pop()?.toLowerCase();switch(t){case`js`:case`mjs`:case`ts`:return[l({typescript:t===`ts`})];case`json`:return[c()];case`sh`:case`bash`:return[a.define(u)];default:return[]}}function dN({value:e,onChange:t,path:n,className:r=``}){let i=(0,X.useMemo)(()=>uN(n),[n]),{resolvedScheme:a}=Ll();return(0,Z.jsx)(o,{value:e,onChange:t,extensions:i,theme:a===`dark`?`dark`:`light`,className:r,basicSetup:{lineNumbers:!0,foldGutter:!0,highlightActiveLine:!0,bracketMatching:!0,autocompletion:!1}})}var fN=[`pending`,`approved`,`declined`,`failed`,`expired`,`all`],pN={pending:`text-warning dark:text-warning`,approved:`text-success dark:text-success`,declined:`text-muted-foreground`,failed:`text-destructive`,expired:`text-muted-foreground line-through`};function mN(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return`now`;if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<24?`${r}h`:`${Math.floor(r/24)}d`}function hN(e,t){return t.split(`.`).reduce((e,t)=>typeof e==`object`&&e?e[t]:void 0,e)}function gN(e){let t=e.split(`.`);return t.slice(Math.max(t.length-2,2)).join(`.`)}var _N=/(body|content|message|text|prompt)$/i;function vN({workspaceId:e,id:t,children:n}){let{open:r}=I(),{showToast:i}=wo(),[a,o]=(0,X.useState)(!1),s=async n=>{n.stopPropagation(),o(!0);try{r(await xc(e,t),e)}catch(e){i({title:`Document ${t} not available`,description:e instanceof Error?e.message:void 0,variant:`destructive`})}finally{o(!1)}};return(0,Z.jsx)(`button`,{type:`button`,disabled:a,onClick:e=>void s(e),className:`text-primary underline-offset-2 hover:underline disabled:opacity-60`,title:`Open document ${t}`,children:n??`doc ${t}`})}function yN({workspaceId:e,text:t}){let n=t.split(/(\bdoc \d+\b)/);return(0,Z.jsx)(Z.Fragment,{children:n.map((t,n)=>{let r=/^doc (\d+)$/.exec(t);return r?(0,Z.jsx)(vN,{workspaceId:e,id:Number(r[1])},n):(0,Z.jsx)(X.Fragment,{children:t},n)})})}function bN({action:e,amend:t,onAmend:n}){return e.editable?.length?(0,Z.jsx)(`div`,{className:`space-y-2`,children:e.editable.map(r=>{let i=hN(e,r),a=typeof i==`string`,o=r in t?t[r]:i,s=a?String(o??``):JSON.stringify(o,null,2),c=a&&(_N.test(r)||s.length>80);return(0,Z.jsxs)(`label`,{className:`block text-xs`,children:[(0,Z.jsxs)(`span`,{className:`font-medium text-muted-foreground`,children:[gN(r),(0,Z.jsx)(`span`,{className:`ml-1.5 font-mono text-[10px] opacity-60`,children:r}),r in t&&(0,Z.jsx)(`span`,{className:`ml-1.5 text-warning dark:text-warning`,children:`edited`})]}),c?(0,Z.jsx)(`textarea`,{className:`mt-1 w-full rounded-md border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:ring-2 focus:ring-ring min-h-[100px]`,value:s,onChange:e=>n(r,e.target.value)}):(0,Z.jsx)(`input`,{className:`mt-1 w-full h-8 rounded-md border bg-background px-2 font-mono text-xs outline-none focus:ring-2 focus:ring-ring`,value:s,onChange:e=>{if(a){n(r,e.target.value);return}try{n(r,JSON.parse(e.target.value))}catch{n(r,e.target.value)}}})]},r)})}):null}function xN({workspaceId:e,onPendingCount:t}){let{showToast:n}=wo(),r=Cw(),[i,a]=(0,X.useState)(`pending`),[o,s]=(0,X.useState)([]),[c,l]=(0,X.useState)(!0),[u,d]=(0,X.useState)(new Set),[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)({}),[g,_]=(0,X.useState)(!1),v=(0,X.useCallback)(()=>en(e,{status:i===`all`?void 0:i,limit:200}).then(e=>{s(e),d(t=>new Set(e.filter(e=>e.status===`pending`&&t.has(e.actionId)).map(e=>e.actionId))),t?.(i===`pending`?e.length:e.filter(e=>e.status===`pending`).length)}).catch(()=>{n({title:`Error`,description:`Failed to load pending actions`,variant:`destructive`})}).finally(()=>l(!1)),[e,i]),y=(0,X.useCallback)(async()=>{l(!0),await v()},[v]),[b,x]=(0,X.useState)(`${e}|${i}`),S=`${e}|${i}`;S!==b&&(x(S),l(!0)),(0,X.useEffect)(()=>{v()},[v]),fw(r,`workspace:${e}`,(0,X.useMemo)(()=>{let e=()=>{y()};return{"action.proposed":e,"action.approved":e,"action.declined":e,"action.failed":e}},[y]));let C=o.filter(e=>e.status===`pending`),w=C.length>0&&C.every(e=>u.has(e.actionId)),T=()=>{d(w?new Set:new Set(C.map(e=>e.actionId)))},E=e=>{d(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},D=(e,t,n)=>{h(r=>({...r,[e]:{...r[e],[t]:n}}))},O=async(t,r)=>{if(!(!t.length&&!r.length)){_(!0);try{let i=await gt(e,{approve:t.map(e=>{let t=m[e];return t&&Object.keys(t).length?{actionId:e,amend:t}:e}),decline:r}),a=i.results.filter(e=>e.status===`error`||e.status===`failed`);a.length?n({title:`${a.length} of ${i.decided} failed`,description:a.map(e=>`${e.actionId}: ${e.error??`execution failed`}`).join(`; `),variant:`destructive`}):n({title:t.length&&r.length?`Decisions applied`:t.length?`Approved ${t.length}`:`Declined ${r.length}`,description:t.length?`Approved actions executed with their original provenance.`:void 0}),h(e=>{let n={...e};for(let e of[...t,...r])delete n[e];return n}),d(new Set),f&&[...t,...r].includes(f)&&p(null),await y()}catch(e){n({title:`Decision failed`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{_(!1)}}};return(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 flex-wrap`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`select`,{className:`h-8 rounded-md border bg-background px-2 text-xs outline-none focus:ring-2 focus:ring-ring`,value:i,onChange:e=>a(e.target.value),children:fN.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>void y(),title:`Reload`,children:(0,Z.jsx)(Er,{className:`h-4 w-4`})})]}),u.size>0&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[u.size,` selected`]}),(0,Z.jsxs)(Y,{size:`sm`,disabled:g,onClick:()=>void O([...u],[]),children:[(0,Z.jsx)(sr,{className:`mr-1 h-3.5 w-3.5`}),` Approve`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:g,onClick:()=>void O([],[...u]),children:[(0,Z.jsx)(vr,{className:`mr-1 h-3.5 w-3.5`}),` Decline`]})]})]}),(0,Z.jsx)(`div`,{className:`border rounded-lg overflow-auto max-h-[560px]`,children:c?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:`Loading...`}):o.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:i===`pending`?`Nothing waiting for review. Rules or hooks with approval enabled queue their actions here.`:`No ${i===`all`?``:i+` `}actions recorded.`}):(0,Z.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,Z.jsx)(`thead`,{className:`text-xs text-muted-foreground border-b sticky top-0 bg-background`,children:(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{className:`px-3 py-2 w-8`,children:C.length>0&&(0,Z.jsx)(`input`,{type:`checkbox`,checked:w,onChange:T,title:`Select all pending`})}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Proposed action`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Handler`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Age`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Status`}),(0,Z.jsx)(`th`,{className:`px-2 py-2 w-40`})]})}),(0,Z.jsx)(`tbody`,{children:o.map(t=>{let n=t.status===`pending`||t.status===`failed`,r=f===t.actionId,i=t.envelope?.payload?.document;return(0,Z.jsxs)(X.Fragment,{children:[(0,Z.jsxs)(`tr`,{className:`border-b last:border-0 align-top hover:bg-muted/40 cursor-pointer`,onClick:()=>p(r?null:t.actionId),children:[(0,Z.jsx)(`td`,{className:`px-3 py-2`,onClick:e=>e.stopPropagation(),children:t.status===`pending`&&(0,Z.jsx)(`input`,{type:`checkbox`,checked:u.has(t.actionId),onChange:()=>E(t.actionId)})}),(0,Z.jsxs)(`td`,{className:`px-3 py-2`,children:[(0,Z.jsxs)(`span`,{className:`flex items-center gap-1 font-medium`,children:[r?(0,Z.jsx)(qr,{className:`h-3 w-3 shrink-0`}):(0,Z.jsx)(Xa,{className:`h-3 w-3 shrink-0`}),t.title,t.editable?.length>0&&(0,Z.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide rounded bg-muted-foreground/15 px-1 py-0.5 text-muted-foreground shrink-0`,children:`editable`})]}),t.summary&&(0,Z.jsx)(`span`,{className:`block text-xs text-muted-foreground pl-4`,children:(0,Z.jsx)(yN,{workspaceId:e,text:t.summary})})]}),(0,Z.jsxs)(`td`,{className:`px-3 py-2 font-mono text-xs whitespace-nowrap`,children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[t.handlerType,`:`]}),t.handler,t.event&&(0,Z.jsxs)(`span`,{className:`block text-muted-foreground`,children:[t.event,i?.id!=null&&(0,Z.jsxs)(Z.Fragment,{children:[` · `,(0,Z.jsx)(vN,{workspaceId:e,id:i.id})]})]})]}),(0,Z.jsx)(`td`,{className:`px-3 py-2 text-xs whitespace-nowrap`,title:t.ts,children:mN(t.ts)}),(0,Z.jsxs)(`td`,{className:`px-3 py-2 text-xs`,children:[(0,Z.jsx)(`span`,{className:pN[t.status],children:t.status}),t.amended&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground`,children:`amended`}),t.decidedBy&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground truncate max-w-[120px]`,title:t.decidedBy,children:t.decidedBy})]}),(0,Z.jsx)(`td`,{className:`px-2 py-2 whitespace-nowrap text-right`,onClick:e=>e.stopPropagation(),children:n&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Y,{size:`sm`,className:`h-7 px-2`,disabled:g,title:t.status===`failed`?`Retry (re-approve)`:`Approve and execute`,onClick:()=>void O([t.actionId],[]),children:(0,Z.jsx)(sr,{className:`h-3.5 w-3.5`})}),t.status===`pending`&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-7 px-2 text-muted-foreground`,disabled:g,title:`Decline`,onClick:()=>void O([],[t.actionId]),children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})})]}),r&&(0,Z.jsxs)(`tr`,{className:`border-b last:border-0 bg-muted/20`,children:[(0,Z.jsx)(`td`,{className:`px-3 py-3`}),(0,Z.jsxs)(`td`,{className:`px-3 py-3 space-y-3`,colSpan:5,children:[n&&t.editable?.length>0&&(0,Z.jsx)(bN,{action:t,amend:m[t.actionId]??{},onAmend:(e,n)=>D(t.actionId,e,n)}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`Actions on approve`}),(0,Z.jsx)(`pre`,{className:`mt-1 rounded border bg-background p-2 font-mono text-xs overflow-auto max-h-56`,children:JSON.stringify(t.actions,null,2)})]}),t.result&&t.result.length>0&&(0,Z.jsx)(`div`,{className:`text-xs font-mono`,children:t.result.map((e,t)=>(0,Z.jsxs)(`span`,{className:`mr-2 ${e.status===`error`?`text-destructive`:`text-muted-foreground`}`,children:[e.action,`:`,e.status,e.error?` (${e.error})`:``]},t))}),(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground font-mono`,children:[t.actionId,` · origin `,t.provenance?.origin,t.provenance?.causedBy?` · causedBy ${t.provenance.causedBy}`:``,t.expiresAt?` · expires ${new Date(t.expiresAt).toLocaleString()}`:``]})]})]})]},t.actionId)})})]})})]})}var SN=`#!/usr/bin/env bash
|
|
39
|
+
`)}function jM({label:e,hint:t,children:n}){return(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:e}),t&&(0,Z.jsx)(`p`,{className:`mb-1 mt-0.5 text-xs text-muted-foreground`,children:t}),(0,Z.jsx)(`div`,{className:t?void 0:`mt-1`,children:n})]})}var MM=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring resize-y`,NM=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`;function PM(){let{agentId:e,tab:t}=yt(),n=ft(),{showToast:r}=wo(),{selectEntity:i,goBack:a}=qC(),o=De(),s=FD(t);(0,X.useEffect)(()=>{t!==s&&e&&n(`/agents/${encodeURIComponent(e)}/settings/${s}`,{replace:!0})},[t,s,e,n]);let[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!0),[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(!1),[v,y]=(0,X.useState)(``),[b,x]=(0,X.useState)(``),[S,C]=(0,X.useState)(``),[w,T]=(0,X.useState)(on()),[E,D]=(0,X.useState)(``),[O,k]=(0,X.useState)(``),[A,j]=(0,X.useState)(``),[M,N]=(0,X.useState)(``),[P,ee]=(0,X.useState)(`anthropic`),[F,I]=(0,X.useState)(``),[te,L]=(0,X.useState)(``),[R,ne]=(0,X.useState)(``),[re,ie]=(0,X.useState)(.7),[ae,z]=(0,X.useState)(4096),[oe,se]=(0,X.useState)(1),B=cM(P,F,te,c?.id),ce=B.models.find(e=>e.id===R),[V,le]=(0,X.useState)([]),[ue,de]=(0,X.useState)(``),[fe,pe]=(0,X.useState)(``),[me,he]=(0,X.useState)(``),[ge,_e]=(0,X.useState)(``),[ve,ye]=(0,X.useState)(!1),[be,xe]=(0,X.useState)(null),[H,Se]=(0,X.useState)(null),[Ce,U]=(0,X.useState)(null),[W,we]=(0,X.useState)(!1),[Te,Ee]=(0,X.useState)(null),[Oe,ke]=(0,X.useState)(`context`),[Ae,je]=(0,X.useState)(``),[Me,Ne]=(0,X.useState)(`/`),[Pe,Fe]=(0,X.useState)(``),[Ie,Le]=(0,X.useState)(!0),[Re,ze]=(0,X.useState)(!1),[Be,Ve]=(0,X.useState)([]),[He,Ue]=(0,X.useState)([]),[We,Ge]=(0,X.useState)(null),[Ke,G]=(0,X.useState)(`{}`),[qe,Je]=(0,X.useState)(null),[Ye,Xe]=(0,X.useState)(e);Ye!==e&&(Xe(e),d(!0),l(null)),(0,X.useEffect)(()=>{if(!e)return;let t=!1;return QD(e).then(async e=>{if(t)return;let n=e.config?.identity||{};l(e),i(e.id),y(e.name||``),x(e.label||``),C(e.description||``),T(e.color||on()),D(n.role||``),k(n.identity||``),j(n.instructions||``),N(e.config?.prompts?.system||``),ee(e.llmProvider||`anthropic`),I(e.config?.apiKey||``),L(e.config?.baseUrl||kM(e.llmProvider)),ne(e.model||DM[e.llmProvider]||``);let r=e.config?.connectors?.[e.llmProvider];r&&(ie(r.temperature??.7),z(r.maxTokens??4096),se(r.topP??1)),G(JSON.stringify(e.config?.tools??{},null,2)),Je(null),p(null);try{le(await aO(e.id))}catch{le([])}}).catch(e=>{t||p(e instanceof Error?e.message:`Failed to load agent`)}).finally(()=>{t||d(!1)}),()=>{t=!0}},[e,i]),(0,X.useEffect)(()=>{if(s!==`access`&&s!==`tools`||!c?.id)return;let e=c.id,t=!1;return Promise.all([KD(c.id).catch(()=>null),Uo().catch(()=>[]),ml().catch(()=>[]),XD(c.id).catch(()=>null)]).then(([n,r,i,a])=>{t||(Se(n),Ve(r),Ue(i),Ge(a?a.tools:[]),n&&(ke(n.binding.type),je(n.binding.workspace||``),Ne(n.binding.path||`/`),Fe(n.binding.context||``),Le(n.permissions.includes(`read`)),ze(n.permissions.includes(`write`))),U(e))}),()=>{t=!0}},[s,c?.id]);let Ze=()=>{let e=AM(E,O,A),t;try{let e=JSON.parse(Ke);e&&typeof e==`object`&&!Array.isArray(e)&&(t=e)}catch{}return{...t===void 0?{}:{tools:t},name:v.trim(),label:b.trim(),description:S.trim()||void 0,color:w,llmProvider:P,model:R,apiKey:F.trim()||(P===c?.llmProvider?void 0:``),baseUrl:te||void 0,config:{type:P,model:R,identity:{role:E.trim()||void 0,identity:O.trim()||void 0,instructions:A.trim()||void 0},prompts:M.trim()||e?{system:M.trim()||e}:void 0,connectors:{[P]:{temperature:re,maxTokens:ae,topP:oe}}}}},Qe=async e=>{if(e.preventDefault(),c){h(!0);try{let e=await lO(c.id,Ze());l(e),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Saved`,description:`Agent updated`}),e.name&&e.name!==c.name&&n(`/agents/${encodeURIComponent(e.name)}/settings/${s}`,{replace:!0})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{h(!1)}}},$e=async()=>{if(c&&window.confirm(`Delete agent "${c.label||c.name}"? This cannot be undone.`)){_(!0);try{await uO(c.id),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Deleted`,description:`Agent removed`}),n(`/agents`)}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Delete failed`,variant:`destructive`})}finally{_(!1)}}},et=()=>{de(``),pe(``),he(``),_e(``)},tt=async()=>{if(!(!c||!ge.trim()&&!me.trim())){ye(!0);try{let e=await oO(c.id,ge.trim()?{source:ge.trim()}:{name:ue,description:fe,content:me});le(e),et(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Installed`,description:`Skill saved`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Skill install failed`,variant:`destructive`})}finally{ye(!1)}}},nt=async e=>{if(c){xe(e);try{let t=await sO(c.id,e);le(t),(ue===e||ge===e)&&et(),window.dispatchEvent(new CustomEvent(`agents:refresh`)),r({title:`Removed`,description:`Skill "${e}" removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Skill remove failed`,variant:`destructive`})}finally{xe(null)}}},rt=()=>Oe===`global`?{type:`global`}:Oe===`context`?Pe?{type:`context`,context:Pe}:null:Ae?Oe===`path`?{type:`path`,workspace:Ae,path:Me.trim()||`/`}:{type:`workspace`,workspace:Ae}:null,it=async()=>{if(!c||W)return;let e=rt(),t=[];if(Ie&&t.push(`read`),Re&&t.push(`write`),!e||t.length===0){r({title:`Invalid binding`,description:`Pick a scope target and at least one permission`,variant:`destructive`});return}if(!(e.type===`global`&&!window.confirm(`Global scope lets this agent ${Re?`read and write`:`read`} ALL your workspaces. Continue?`))){we(!0);try{let n=await qD(c.id,{binding:e,permissions:t});Se(n.access),Ee(n.token),r({title:`Bound`,description:`Access bound — copy the token now, it is not shown again`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Bind failed`,variant:`destructive`})}finally{we(!1)}}},at=async()=>{if(!(!c||W)){we(!0);try{let e=await JD(c.id);Se(e.access),Ee(e.token),r({title:`Rotated`,description:`New token minted — the previous one no longer works`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Rotate failed`,variant:`destructive`})}finally{we(!1)}}},ot=async()=>{if(!(!c||W)&&window.confirm(`Revoke this agent's canvas access? Its token stops working immediately.`)){we(!0);try{await YD(c.id),Se(null),Ee(null),r({title:`Revoked`,description:`Agent access removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Revoke failed`,variant:`destructive`})}finally{we(!1)}}},st=e=>{if(e.type===`global`)return`Global — all workspaces`;if(e.type===`context`){let t=He.find(t=>t.id===e.context);return`Context ${t?`${t.id} (${t.url})`:e.context} — follows the context live`}let t=e.workspaceName||e.workspace;return e.type===`path`?`Workspace ${t}, path ${e.path||`/`}`:`Workspace ${t} (whole tree)`};if(u)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!c||f)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-destructive`,children:f||`Agent not found`});let ct=PD.find(e=>e.id===s),lt=encodeURIComponent(c.name||c.id),ut=s===`identity`||s===`provider`||s===`models`||s===`tools`;return(0,Z.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6 border-b pb-4`,title:`${ct.label} - ${c.label||c.name}`,description:ct.description,backTo:`/agents/${lt}`,onBack:o?a:void 0}),(0,Z.jsxs)(`form`,{onSubmit:Qe,className:`space-y-6`,children:[s===`identity`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsx)(jM,{label:`Name`,hint:`ID: ${c.id}`,children:(0,Z.jsx)(q,{value:v,onChange:e=>y(e.target.value),placeholder:`lucy`})}),(0,Z.jsx)(jM,{label:`Label`,children:(0,Z.jsx)(q,{value:b,onChange:e=>x(e.target.value),placeholder:`Display name`})})]}),(0,Z.jsx)(jM,{label:`Description`,children:(0,Z.jsx)(q,{value:S,onChange:e=>C(e.target.value),placeholder:`Short description`})}),(0,Z.jsx)(jM,{label:`Color`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(q,{type:`color`,value:w,onChange:e=>T(e.target.value),className:`h-10 w-16 p-1`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>T(on()),children:`Randomize`})]})})]}),(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Persona`}),(0,Z.jsx)(jM,{label:`Role`,children:(0,Z.jsx)(q,{value:E,onChange:e=>D(e.target.value),placeholder:`e.g. Software Engineer`})}),(0,Z.jsx)(jM,{label:`Identity`,children:(0,Z.jsx)(`textarea`,{value:O,onChange:e=>k(e.target.value),placeholder:`Who this agent is…`,className:`${MM} min-h-[80px]`})}),(0,Z.jsx)(jM,{label:`Instructions`,children:(0,Z.jsx)(`textarea`,{value:A,onChange:e=>j(e.target.value),placeholder:`Behavioral instructions…`,className:`${MM} min-h-[80px]`})}),(0,Z.jsx)(jM,{label:`System Prompt`,hint:`Compiled from Role + Identity + Instructions. Override manually.`,children:(0,Z.jsx)(`textarea`,{value:M,onChange:e=>N(e.target.value),placeholder:`System prompt sent to the LLM…`,className:`${MM} min-h-[140px] font-mono text-xs`})})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Z.jsxs)(Y,{type:`button`,variant:`destructive`,disabled:g,onClick:$e,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-4 w-4`}),g?`Deleting...`:`Delete Agent`]})]})]}),s===`provider`&&(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(jM,{label:`Provider`,children:(0,Z.jsxs)(`select`,{value:P,onChange:e=>{let t=e.target.value;ee(t),I(``),ne(DM[t]||``),L(kM(t))},className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,children:[(0,Z.jsx)(`option`,{value:`anthropic`,children:`Anthropic Claude`}),(0,Z.jsx)(`option`,{value:`openai`,children:`OpenAI GPT`}),(0,Z.jsx)(`option`,{value:`ollama`,children:`Ollama (Local)`}),(0,Z.jsx)(`option`,{value:`lm-studio`,children:`LM Studio (Local)`}),(0,Z.jsx)(`option`,{value:`vllm`,children:`vLLM (Local)`}),(0,Z.jsx)(`option`,{value:`custom`,children:`Custom`})]})}),(0,Z.jsx)(jM,{label:`API Key`,hint:[`ollama`,`lm-studio`,`vllm`].includes(P)?`Any value works for local providers.`:void 0,children:(0,Z.jsx)(q,{type:`password`,value:F,onChange:e=>I(e.target.value),placeholder:P===`ollama`?`ollama`:P===`lm-studio`?`lm-studio`:`sk-…`})}),(0,Z.jsx)(jM,{label:`Host / Base URL`,children:(0,Z.jsx)(q,{value:te,onChange:e=>L(e.target.value),placeholder:kM(P)||`https://api.example.com`})})]}),s===`models`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Main Model`}),(0,Z.jsx)(jM,{label:`Model`,children:(0,Z.jsx)(sM,{value:R,onChange:(e,t)=>{ne(e),t?.maxTokens&&z(t.maxTokens)},...B})}),(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-3`,children:[(0,Z.jsx)(jM,{label:`Temperature`,children:(0,Z.jsx)(q,{type:`number`,min:0,max:2,step:.1,value:re,onChange:e=>ie(Number.isNaN(e.target.valueAsNumber)?.7:e.target.valueAsNumber)})}),(0,Z.jsx)(jM,{label:`Max Output Tokens`,children:(0,Z.jsx)(q,{type:`number`,min:1,max:ce?.maxTokens,value:ae,onChange:e=>z(parseInt(e.target.value)||4096)})}),(0,Z.jsx)(jM,{label:`Top P`,children:(0,Z.jsx)(q,{type:`number`,min:0,max:1,step:.1,value:oe,onChange:e=>se(Number.isNaN(e.target.valueAsNumber)?1:e.target.valueAsNumber)})})]})]}),[`Governance`,`Memory Management`,`Subagent / Tool Use`].map(e=>(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-4`,children:[(0,Z.jsxs)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:[e,` Model`]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Coming soon`})]},e))]}),s===`tools`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Runtime Tools`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Injected at start (pi defineTool): coding tools plus canvas tools scoped by the token binding (Access / ACL). Definitions live in the runtime — read-only here until the agent-runtime workspace lands.`})]}),We===null?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}):We.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No tools resolved.`}):(0,Z.jsx)(`div`,{className:`space-y-1.5`,children:We.map(e=>(0,Z.jsxs)(`details`,{className:`rounded-md border px-3 py-2`,children:[(0,Z.jsxs)(`summary`,{className:`cursor-pointer text-sm`,children:[(0,Z.jsx)(`code`,{className:`font-mono text-xs font-medium`,children:e.name}),(0,Z.jsx)(`span`,{className:`ml-2 rounded bg-muted px-1.5 py-0.5 text-[10px] uppercase text-muted-foreground`,children:e.source})]}),e.description&&(0,Z.jsx)(`p`,{className:`mt-2 whitespace-pre-wrap text-xs text-muted-foreground`,children:e.description}),e.parameters!=null&&(0,Z.jsx)(`pre`,{className:`mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-[11px]`,children:JSON.stringify(e.parameters,null,2)})]},e.name))}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:H?st(H.binding):`Unbound — no canvas tools are injected. Bind under Access / ACL.`})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Tools Config`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`config.tools JSON, merged server-side — e.g. {"canvas": {"enabled": false}} gates the canvas tools. Saved with Save Changes.`})]}),(0,Z.jsx)(`textarea`,{value:Ke,onChange:e=>{G(e.target.value);try{JSON.parse(e.target.value),Je(null)}catch(e){Je(e instanceof Error?e.message:`Invalid JSON`)}},className:`${MM} min-h-[120px] font-mono text-xs`}),qe&&(0,Z.jsxs)(`p`,{className:`text-xs text-destructive`,children:[`Invalid JSON (not saved): `,qe]})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Skills`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Installed skills are saved immediately, independent of Save Changes.`})]}),V.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No skills installed.`}):V.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.name}),(0,Z.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.package?e.source:e.description||`No description`})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{de(e.name),pe(e.description||``),he(e.content||``),_e(e.source||``)},children:`Edit`}),(0,Z.jsx)(Y,{type:`button`,variant:`destructive`,size:`sm`,disabled:be===(e.source||e.name),onClick:()=>nt(e.source||e.name),children:be===(e.source||e.name)?`Removing…`:`Remove`})]})]},e.name)),(0,Z.jsxs)(`div`,{className:`space-y-4 rounded-md border p-4`,children:[(0,Z.jsx)(jM,{label:`Package Source`,hint:`Use this for whole pi packages. Leave empty to save inline SKILL.md content.`,children:(0,Z.jsx)(q,{value:ge,onChange:e=>_e(e.target.value),placeholder:`npm:@foo/pi-tools or git:github.com/badlogic/pi-doom`})}),(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsx)(jM,{label:`Name`,children:(0,Z.jsx)(q,{value:ue,onChange:e=>de(e.target.value),placeholder:`skill-name, or read from frontmatter`,disabled:!!ge.trim()})}),(0,Z.jsx)(jM,{label:`Description`,children:(0,Z.jsx)(q,{value:fe,onChange:e=>pe(e.target.value),placeholder:`What this skill helps with`,disabled:!!ge.trim()})})]}),(0,Z.jsx)(jM,{label:`SKILL.md Content`,children:(0,Z.jsx)(`textarea`,{value:me,onChange:e=>he(e.target.value),placeholder:`# Skill instructions…`,disabled:!!ge.trim(),className:`${MM} min-h-[160px] font-mono text-xs`})}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,disabled:ve||!ge.trim()&&!me.trim(),onClick:tt,children:ve?`Saving…`:`Install / Update Skill`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,onClick:et,children:`Clear`})]})]})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`MCP Servers`}),(c.config?.mcp?.servers||[]).length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`No MCP servers configured.`}):(c.config?.mcp?.servers||[]).map((e,t)=>(0,Z.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,Z.jsxs)(`div`,{className:`font-mono text-xs text-muted-foreground`,children:[e.command,` `,(e.args||[]).join(` `)]})]},t))]})]}),s===`access`&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Canvas Access`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`The agent talks to canvas through its own scoped token; the server clamps every request to the binding. Bind, rotate and revoke apply immediately.`})]}),Ce===c.id?H?(0,Z.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium`,children:st(H.binding)}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Permissions: `,H.permissions.join(`, `)||`none`,H.boundAt?` · bound ${new Date(H.boundAt).toLocaleString()}`:``,H.rotatedAt?` · token rotated ${new Date(H.rotatedAt).toLocaleString()}`:``]}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-1`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:W,onClick:at,children:`Rotate Token`}),(0,Z.jsx)(Y,{type:`button`,variant:`destructive`,size:`sm`,disabled:W,onClick:ot,children:`Revoke Access`})]})]}):(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Unbound — this agent has no canvas access.`}):(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Loading…`}),Te&&(0,Z.jsxs)(`div`,{className:`space-y-2 rounded-md border border-warning/50 bg-warning/10 p-3`,children:[(0,Z.jsx)(`div`,{className:`text-xs font-medium`,children:`Agent token — shown once, store it now`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`code`,{className:`flex-1 truncate rounded bg-background px-2 py-1 font-mono text-xs`,children:Te}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>navigator.clipboard?.writeText(Te),children:`Copy`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>Ee(null),children:`Dismiss`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`In-process agents receive it automatically (canvas.env); external runtimes (agentd) take it as CANVAS_TOKEN.`})]})]}),(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:H?`Rebind`:`Bind`}),(0,Z.jsx)(jM,{label:`Scope`,hint:`Context bindings follow the context live; global spans all workspaces.`,children:(0,Z.jsxs)(`select`,{value:Oe,onChange:e=>ke(e.target.value),className:NM,children:[(0,Z.jsx)(`option`,{value:`context`,children:`Context (follows live)`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Workspace`}),(0,Z.jsx)(`option`,{value:`path`,children:`Workspace path`}),(0,Z.jsx)(`option`,{value:`global`,children:`Global (all workspaces)`})]})}),Oe===`context`&&(0,Z.jsx)(jM,{label:`Context`,children:(0,Z.jsxs)(`select`,{value:Pe,onChange:e=>Fe(e.target.value),className:NM,children:[(0,Z.jsx)(`option`,{value:``,children:`Select a context…`}),He.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.id,` — `,e.url]},e.id))]})}),(Oe===`workspace`||Oe===`path`)&&(0,Z.jsx)(jM,{label:`Workspace`,children:(0,Z.jsxs)(`select`,{value:Ae,onChange:e=>je(e.target.value),className:NM,children:[(0,Z.jsx)(`option`,{value:``,children:`Select a workspace…`}),Be.map(e=>(0,Z.jsx)(`option`,{value:e.name||e.id,children:e.label||e.name},e.id))]})}),Oe===`path`&&(0,Z.jsx)(jM,{label:`Base path`,hint:`The agent is clamped to this subtree.`,children:(0,Z.jsx)(q,{value:Me,onChange:e=>Ne(e.target.value),placeholder:`/work/projects/foo`})}),(0,Z.jsx)(jM,{label:`Permissions`,children:(0,Z.jsxs)(`div`,{className:`flex gap-4 text-sm`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:Ie,onChange:e=>Le(e.target.checked)}),` read`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:Re,onChange:e=>ze(e.target.checked)}),` write`]})]})}),(0,Z.jsx)(Y,{type:`button`,disabled:W,onClick:it,children:W?`Working…`:H?`Rebind & Mint Token`:`Bind & Mint Token`})]})]}),s===`memory`&&(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Memory Engine`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Loop-based memory management. Settings coming soon.`})]}),s===`integrations`&&(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground`,children:`Integrations`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`IMAP, chat, SQL and REST API accounts. Coming soon.`})]}),ut&&(0,Z.jsx)(Y,{type:`submit`,disabled:m,children:m?`Saving…`:`Save Changes`})]})]})})}var FM=`workspace:backups`,IM=e=>`${no.workspaces}/${encodeURIComponent(e)}/db/backups`,LM=e=>J.get(IM(e)),RM=e=>J.post(IM(e),{action:`backup`}),zM=(e,t)=>J.post(IM(e),{action:`restore`,backupId:t,confirm:!0}),BM=new Map;function VM(e,t,n){let r=JSON.stringify([t,n.id]),i=BM.get(r);if(i)return i;let a=(async()=>{let r=n.action===`restore`,i=e({title:r?`Restoring workspace database`:`Backing up workspace database`,description:r?`Stopping the workspace and preserving its current database…`:`Copying and verifying all datasets…`});try{let e=n;for(;e.status===`running`;){let n=await LM(t),r=n.jobs.find(t=>t.id===e.id);if(!r)throw Error(`The server restarted. Refresh the backup list to check the result.`);e=r,window.dispatchEvent(new CustomEvent(FM,{detail:{workspace:t,status:n}})),e.status===`running`&&await new Promise(e=>setTimeout(e,1500))}if(e.status===`failed`)throw Error(e.error||`Database operation failed`);i.done({title:r?`Workspace database restored`:`Workspace backup verified`,description:r?`The workspace is stopped. Start it when you are ready; search indexes will rebuild.`:`Documents, relations and virtual tree placements are saved.`})}catch(e){throw i.fail({title:`Workspace backup needs attention`,description:e instanceof Error?e.message:String(e),variant:`destructive`}),e}})();return BM.set(r,a),a.finally(()=>BM.delete(r)).catch(()=>{}),a}var HM={startup:`Startup`,hourly:`Hourly`,manual:`Manual`,"pre-restore":`Before restore`};function UM({workspaceId:e,onRestored:t}){let{showToast:n,showProgress:r}=wo(),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),f=(0,X.useRef)(!1),p=(0,X.useRef)(!1),m=(0,X.useRef)(0),h=(0,X.useCallback)(()=>{let t=++m.current;return LM(e).then(n=>{if(!(!f.current||t!==m.current)){a(n),s(null);for(let t of n.jobs.filter(e=>e.status===`running`))VM(r,e,t).catch(()=>{})}}).catch(e=>{f.current&&t===m.current&&s(e instanceof Error?e.message:String(e))})},[e,r]);(0,X.useEffect)(()=>{f.current=!0,h();let t=t=>{let n=t.detail;n.workspace===e&&a(n.status)};return window.addEventListener(FM,t),()=>{f.current=!1,window.removeEventListener(FM,t)}},[e,h]);let g=async i=>{if(!p.current){p.current=!0,d(!0);try{let n=i?await zM(e,i.id):await RM(e);f.current&&a(e=>e&&{...e,jobs:[n,...e.jobs]}),await VM(r,e,n),i&&t()}catch(e){n({title:`Database operation did not complete`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{p.current=!1,f.current&&(d(!1),h())}}},_=u||!!i?.jobs.some(e=>e.status===`running`),v=i?.jobs[0];return(0,Z.jsxs)(`div`,{className:`min-w-0 space-y-5`,children:[(0,Z.jsxs)(`section`,{className:`space-y-4 rounded border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,Z.jsx)(ra,{className:`h-5 w-5 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`font-semibold`,children:`Workspace checkpoints`}),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,className:`ml-auto`,disabled:_||!i||!!o,onClick:()=>void g(),children:[_?(0,Z.jsx)(Ti,{className:`mr-2 h-4 w-4 animate-spin`}):(0,Z.jsx)(ra,{className:`mr-2 h-4 w-4`}),`Back up now`]})]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Save a checkpoint before a bulk action. Each backup includes every document, relation and virtual tree placement in this workspace’s database.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-x-5 gap-y-2 text-sm`,children:[(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`strong`,{children:i?.retention.hourly??24}),` hourly backups`]}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`strong`,{children:i?.retention.startup??14}),` startup backups`]}),(0,Z.jsx)(`span`,{children:`Manual checkpoints kept`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Hourly backups run while the workspace is active. These checkpoints cover the database only; files in storage backends and workspace settings need their own backups.`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsxs)(`h2`,{className:`text-sm font-semibold`,children:[`Verified checkpoints`,i?` · ${i.backups.length}`:``]}),(0,Z.jsx)(Y,{variant:`ghost`,size:`icon`,className:`h-8 w-8`,onClick:()=>void h(),"aria-label":`Refresh backups`,children:(0,Z.jsx)(Er,{className:`h-4 w-4`})})]}),o&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:o}),v&&(0,Z.jsx)(`p`,{role:`status`,className:`text-sm ${v.status===`failed`?`text-destructive`:`text-muted-foreground`}`,children:v.status===`running`?`Database operation in progress…`:v.status===`failed`?v.error:v.action===`restore`?`Database restored. The workspace is stopped and ready to start.`:`Backup complete and verified.`}),!i&&!o&&(0,Z.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Loading backups…`}),i?.backups.length===0&&(0,Z.jsx)(`p`,{className:`rounded border border-dashed p-6 text-sm text-muted-foreground`,children:`No verified checkpoints yet. Create one before your next bulk action.`}),(0,Z.jsx)(`div`,{className:`space-y-2`,children:i?.backups.map(e=>(0,Z.jsxs)(`article`,{className:`flex min-w-0 flex-wrap items-center gap-3 rounded border p-3`,children:[(0,Z.jsx)(sr,{className:`h-4 w-4 shrink-0 text-muted-foreground`,"aria-label":`Verified`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 basis-40`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:new Date(e.createdAt).toLocaleString()}),(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[HM[e.kind],` · `,Ts(e.bytes),` · `,(e.datasets.documents?.count??0).toLocaleString(),` documents`]})]}),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:_,onClick:()=>l(e),children:[(0,Z.jsx)(Vr,{className:`mr-2 h-3.5 w-3.5`}),`Restore`]})]},e.id))}),(0,Z.jsx)(vo,{open:!!c,onOpenChange:e=>{e||l(null)},children:(0,Z.jsxs)(lo,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,Z.jsxs)(_o,{children:[(0,Z.jsx)(io,{children:`Restore this workspace checkpoint?`}),(0,Z.jsxs)(ro,{children:[`The workspace will stop and its current database will be backed up first. Documents, relations and virtual tree placements will return to `,c?new Date(c.createdAt).toLocaleString():`the selected checkpoint`,`. Files in storage backends and workspace settings will stay as they are. The workspace stays stopped after restoration.`]})]}),(0,Z.jsxs)(mo,{children:[(0,Z.jsx)(go,{children:`Cancel`}),(0,Z.jsx)(po,{disabled:_,onClick:()=>{c&&g(c)},children:`Back up current & restore`})]})]})})]})}var WM={collect:`Collect unused blobs`,verify:`Verify integrity`,compact:`Compact index`},GM=e=>e.status===`queued`||e.status===`running`,KM=e=>`${no.workspaces}/${encodeURIComponent(e)}/cache/maintenance`,qM=e=>J.get(KM(e)),JM=(e,t,n)=>J.post(KM(e),{store:t,action:n,...n===`verify`?{confirm:!0}:{}});function YM(e){if(e.status===`failed`)return e.error||`Maintenance failed`;if(e.status===`queued`)return`Waiting for active storage operations…`;if(e.status===`running`)return e.action===`verify`?`Reading and checking stored content…`:`Processing the cache index…`;let t=e.result||{};return e.action===`compact`?`${(t.compactedCount||0).toLocaleString()} keys compacted`:e.action===`verify`?`${(t.verifiedContent||0).toLocaleString()} blobs verified · ${(t.badContentCount||0).toLocaleString()} corrupted blobs removed · ${Ts(t.reclaimedSize||0)} reclaimed`:`${(t.reclaimedCount||0).toLocaleString()} unused blobs removed · ${Ts(t.reclaimedSize||0)} reclaimed`}var XM=new Map,ZM=`workspace:cache-maintenance`;function QM(e,t,n){let r=JSON.stringify([t,n.id]),i=XM.get(r);if(i)return i;let a=(async()=>{let r=e({title:WM[n.action],description:`${n.store} · ${YM(n)}`});try{let e=n;for(;GM(e);){let i=await qM(t),a=i.jobs.find(e=>e.id===n.id);if(!a)throw Error(`Maintenance receipt is no longer available. The server may have restarted; refresh the cache settings.`);if(e=a,window.dispatchEvent(new CustomEvent(ZM,{detail:{workspace:t,status:i}})),!GM(e))break;r.update({title:WM[e.action],description:`${e.store} · ${YM(e)}`}),await new Promise(e=>setTimeout(e,2e3))}if(e.status===`failed`)throw Error(YM(e));r.done({title:`${WM[e.action]} complete`,description:`${e.store} · ${YM(e)}`})}catch(e){throw r.fail({title:`Cache maintenance needs attention`,description:`${n.store} · ${e instanceof Error?e.message:String(e)}`,variant:`destructive`}),e}})();return XM.set(r,a),a.finally(()=>{XM.get(r)===a&&XM.delete(r)}).catch(()=>{}),a}function $M({workspaceId:e,children:t}){let{showToast:n,showProgress:r}=wo(),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(`workspace:cache`),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(null),m=(0,X.useRef)(!1),h=(0,X.useRef)(!1),g=(0,X.useCallback)(()=>qM(e).then(t=>{if(h.current){a(t),p(null);for(let n of t.jobs.filter(GM))QM(r,e,n).catch(()=>{})}}).catch(e=>{h.current&&p(e instanceof Error?e.message:`Cannot load maintenance status`)}),[e,r]);(0,X.useEffect)(()=>{h.current=!0,g();let t=t=>{let{workspace:n,status:r}=t.detail;n===e&&(a(r),p(null))};return window.addEventListener(ZM,t),()=>{h.current=!1,window.removeEventListener(ZM,t)}},[e,g]);let _=async t=>{if(!(m.current||i?.jobs.some(GM))){m.current=!0,l(!0);try{let n=await JM(e,o,t);h.current&&a(e=>e&&{...e,jobs:[n,...e.jobs.filter(e=>e.id!==n.id)]}),QM(r,e,n).catch(()=>{})}catch(e){n({title:`Could not start maintenance`,description:e instanceof Error?e.message:String(e),variant:`destructive`}),g()}finally{m.current=!1,h.current&&l(!1)}}},v=c||!!i?.jobs.some(GM),y=i?.stores.find(e=>e.id===o),b=i?.jobs[0];return(0,Z.jsxs)(`section`,{className:`space-y-4 rounded-(--panel-radius) border p-4`,"aria-label":`Workspace cache maintenance`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`h2`,{className:`flex items-center gap-2 text-sm font-semibold`,children:[(0,Z.jsx)(Fa,{className:`h-4 w-4 shrink-0`}),`Workspace cache`]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Thumbnails, cached resources and pending transfers. Maintenance runs only when requested.`})]}),t&&(0,Z.jsx)(`fieldset`,{disabled:v,children:t})]}),(0,Z.jsxs)(`div`,{className:`space-y-3 border-t pt-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`label`,{htmlFor:`cache-maintenance-store`,className:`text-xs font-medium`,children:`Store`}),(0,Z.jsxs)(`select`,{id:`cache-maintenance-store`,value:o,onChange:e=>s(e.target.value),disabled:v,className:`min-w-0 max-w-full rounded-md border bg-background px-2 py-1.5 text-xs`,children:[(0,Z.jsx)(`option`,{value:`workspace:cache`,children:`workspace:cache`}),(0,Z.jsx)(`option`,{value:`workspace:data`,children:`workspace:data`})]}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`icon`,onClick:()=>void g(),"aria-label":`Refresh cache maintenance status`,className:`ml-auto h-8 w-8`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:o===`workspace:data`?`Managed document blobs. Referenced content is kept during collection.`:`Working cache, including content awaiting transfer. Referenced content is kept during collection.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canCollect||!!f,onClick:()=>void _(`collect`),children:[(0,Z.jsx)(Qr,{className:`mr-2 h-3.5 w-3.5`}),`Collect unused blobs`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canCompact||!!f,onClick:()=>void _(`compact`),children:[(0,Z.jsx)(ra,{className:`mr-2 h-3.5 w-3.5`}),`Compact index`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:v||!y?.canVerify||!!f,onClick:()=>d(!0),children:[(0,Z.jsx)(Fi,{className:`mr-2 h-3.5 w-3.5`}),`Verify integrity`]})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Collection removes unreferenced blobs. Compaction trims index history. Verification reads every blob and may remove corrupted content. Storage writes may wait during maintenance.`}),!i&&!f&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,role:`status`,children:`Loading maintenance status…`}),y&&!y.canCollect&&!y.canVerify&&!y.canCompact&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Update canvas-stored to enable maintenance for this store.`}),f&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:f}),b&&(0,Z.jsxs)(`div`,{className:`rounded-md bg-muted/50 p-3 text-xs`,role:`status`,"aria-live":`polite`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[GM(b)&&(0,Z.jsx)(Ti,{className:`h-3.5 w-3.5 animate-spin`}),WM[b.action],` · `,b.store]}),(0,Z.jsx)(`p`,{className:`mt-1 ${b.status===`failed`?`text-destructive`:`text-muted-foreground`}`,children:YM(b)}),(0,Z.jsx)(`p`,{className:`mt-1 text-muted-foreground`,children:b.finishedAt?`Finished ${new Date(b.finishedAt).toLocaleString()}`:`Requested ${new Date(b.createdAt).toLocaleString()}`})]})]}),(0,Z.jsx)(vo,{open:u,onOpenChange:d,children:(0,Z.jsxs)(lo,{className:`max-w-[calc(100vw-2rem)] sm:max-w-lg`,children:[(0,Z.jsxs)(_o,{children:[(0,Z.jsxs)(io,{children:[`Verify `,o,`?`]}),(0,Z.jsx)(ro,{children:`This reads all stored content and can take a long time. Corrupted blobs and their index entries may be removed. Keep a recovery backup before running it. Storage writes may wait until it finishes.`})]}),(0,Z.jsxs)(mo,{children:[(0,Z.jsx)(go,{children:`Cancel`}),(0,Z.jsx)(po,{disabled:v,onClick:()=>void _(`verify`),children:`Verify and repair`})]})]})})]})}function eN({workspaceId:e,backend:t,onSaved:n}){let r=t?.config||{},i=()=>({name:String(r.label||``),bucket:String(r.bucket||``),prefix:String(r.prefix||``),endpoint:String(r.endpoint||``),region:String(r.region||`us-east-1`),accessKeyId:``,secretAccessKey:``,sessionToken:``}),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(i),[l,u]=(0,X.useState)(r.forcePathStyle!==!1),[d,f]=(0,X.useState)(r.readOnly===!0),[p,m]=(0,X.useState)(r.watch===!0),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(!1),{showToast:y}=wo(),b=e=>({value:s[e],onChange:t=>c(n=>({...n,[e]:t.target.value}))});return a?(0,Z.jsxs)(`form`,{onSubmit:async r=>{r.preventDefault(),v(!0);try{let r={label:s.name.trim(),bucket:s.bucket.trim(),prefix:s.prefix.trim(),endpoint:s.endpoint.trim(),region:s.region.trim()||`us-east-1`,forcePathStyle:l,readOnly:d,watch:p,...Object.fromEntries([`accessKeyId`,`secretAccessKey`,`sessionToken`].flatMap(e=>{let t=s[e].trim();return t?[[e,t]]:[]})),...h?{sessionToken:``}:{}};t?await Fo(e,`s3`,t.address,r):await Zs(e,`s3`,r),o(!1),c(i()),y({title:t?`S3 backend updated`:`S3 backend added`,description:`Use Re-sync to check indexing progress, and filing policies to automate copies.`}),await n()}catch(e){y({title:`Could not connect S3`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{v(!1)}},className:`w-full space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`h2`,{className:`flex items-center gap-2 text-sm font-semibold`,children:[(0,Z.jsx)(Fa,{className:`h-4 w-4`}),t?`Edit S3 connection`:`Add S3-compatible bucket`]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Amazon S3, MinIO, Garage, RustFS or Ceph RGW. Connect an existing bucket, optionally scoped to a prefix. Supports browsing, reads and filing copies; mirror policies and overwrites are unavailable.`}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Name`,(0,Z.jsx)(q,{...b(`name`),required:!0,placeholder:`Accounting archive`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Bucket`,(0,Z.jsx)(q,{...b(`bucket`),disabled:!!t,required:!0,placeholder:`accounting`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Endpoint (blank for Amazon S3)`,(0,Z.jsx)(q,{...b(`endpoint`),disabled:!!t,type:`url`,placeholder:`https://s3.example.com`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Region`,(0,Z.jsx)(q,{...b(`region`),required:!0,placeholder:`us-east-1`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs sm:col-span-2`,children:[`Prefix (optional)`,(0,Z.jsx)(q,{...b(`prefix`),disabled:!!t,placeholder:`Augmentd/Accounting`})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Access key ID`,(0,Z.jsx)(q,{...b(`accessKeyId`),required:!t,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs`,children:[`Secret access key`,(0,Z.jsx)(q,{...b(`secretAccessKey`),type:`password`,required:!t,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),(0,Z.jsxs)(`label`,{className:`space-y-1 text-xs sm:col-span-2`,children:[`Session token (optional)`,(0,Z.jsx)(q,{...b(`sessionToken`),disabled:h,type:`password`,autoComplete:`off`,placeholder:t?`Leave blank to keep stored value`:``})]}),t&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)}),`Clear stored session token`]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),`Path-style addressing`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked)}),`Read-only`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:p,onChange:e=>m(e.target.checked)}),`Poll for changes`]})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Writable connections test conflict protection using a temporary object, then delete it. The key needs list/read/write access and delete access under .canvas-probe/. Initial indexing reads file bytes; polling can incur request and download charges. Upload limit: 5 GiB per file.`}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,disabled:_,onClick:()=>{o(!1),c(i())},children:`Cancel`}),(0,Z.jsx)(Y,{disabled:_,children:_?`Checking connection…`:`Save connection`})]})]}):(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,onClick:()=>{c(i()),u(r.forcePathStyle!==!1),f(r.readOnly===!0),m(r.watch===!0),g(!1),o(!0)},children:[t?(0,Z.jsx)(Lr,{className:`mr-2 h-3.5 w-3.5`}):(0,Z.jsx)(br,{className:`mr-2 h-3.5 w-3.5`}),t?`Edit S3 connection`:`Add S3 bucket`]})}function tN({workspaceId:e,isActive:t,currentMode:n,onChanged:r}){let[i,a]=(0,X.useState)(n===`workspace`?`workspace`:`secrets`),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(``),[u,d]=(0,X.useState)(``),[f,p]=(0,X.useState)(``),[m,h]=(0,X.useState)(``),[g,_]=(0,X.useState)(!1);return(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`font-semibold text-sm`,children:`Workspace protection`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Protect service credentials with a PIN or password. Optionally require it to start the whole workspace. Files and document contents are not encrypted.`}),t&&(0,Z.jsx)(`p`,{className:`text-sm`,children:`Stop the workspace before changing protection.`}),(0,Z.jsxs)(`form`,{className:`space-y-3`,onSubmit:async t=>{if(t.preventDefault(),h(``),o!==c){h(`PIN/password confirmation does not match`);return}_(!0);try{let t=await J.put(`${no.workspaces}/${e}/protection`,{mode:i,passphrase:o,currentPassphrase:u||void 0});p(t.recoveryKey),s(``),l(``),d(``)}catch(e){h(e instanceof Error?e.message:`Could not save protection`)}finally{_(!1)}},children:[(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Protection mode`,(0,Z.jsxs)(`select`,{className:`block rounded border bg-background p-2 w-full`,value:i,onChange:e=>a(e.target.value),disabled:t||g,children:[(0,Z.jsx)(`option`,{value:`secrets`,children:`Secrets only — allow start without integrations`}),(0,Z.jsx)(`option`,{value:`workspace`,children:`Whole workspace — require PIN/password to start`})]})]}),(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Current PIN/password or recovery key (if already protected)`,(0,Z.jsx)(q,{type:`password`,autoComplete:`current-password`,value:u,onChange:e=>d(e.target.value),disabled:t||g})]}),(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`New PIN/password`,(0,Z.jsx)(q,{type:`password`,autoComplete:`new-password`,minLength:4,maxLength:1024,required:!0,value:o,onChange:e=>s(e.target.value),disabled:t||g})]}),(0,Z.jsxs)(`label`,{className:`block text-sm space-y-1`,children:[`Confirm new PIN/password`,(0,Z.jsx)(q,{type:`password`,autoComplete:`new-password`,required:!0,value:c,onChange:e=>l(e.target.value),disabled:t||g})]}),(0,Z.jsx)(Y,{disabled:t||g||!!f,children:g?`Saving…`:`Save protection`})]}),m&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:m}),f&&(0,Z.jsxs)(`div`,{className:`space-y-2 rounded border p-3`,children:[(0,Z.jsx)(`p`,{className:`text-sm`,children:`Save this recovery key now. It is shown only once and replaces any previous recovery key.`}),(0,Z.jsx)(`code`,{className:`block break-all select-all`,children:f}),(0,Z.jsx)(Y,{variant:`outline`,onClick:()=>{p(``),r()},children:`I saved the recovery key`})]})]})}var nN=`h-8 rounded-md border bg-background px-2 text-sm outline-none focus:ring-2 focus:ring-ring`;function rN({title:e,hint:t,children:n}){let[r,i]=(0,X.useState)(!1);return(0,Z.jsxs)(`section`,{className:`overflow-hidden rounded-lg border`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>i(e=>!e),"aria-expanded":r,className:`flex w-full items-center justify-between gap-4 px-4 py-3 text-left transition-colors hover:bg-muted/40`,children:[(0,Z.jsxs)(`span`,{className:`min-w-0`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium`,children:e}),(0,Z.jsx)(`span`,{className:`mt-0.5 block text-xs text-muted-foreground`,children:t})]}),(0,Z.jsx)(qr,{className:K(`h-4 w-4 shrink-0 text-muted-foreground transition-transform motion-reduce:transition-none`,r&&`rotate-180`)})]}),r&&(0,Z.jsx)(`div`,{className:`border-t p-4`,children:n})]})}function iN({workspaceId:e,workspaceName:t,refreshKey:n,onRefresh:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),l=(0,X.useCallback)(()=>KA(e).then(e=>o(e.queue??null)).catch(()=>{}),[e]);(0,X.useEffect)(()=>{l();let e=window.setInterval(()=>{o(e=>(e&&(e.pending>0||e.draining)&&l(),e))},3e3);return()=>window.clearInterval(e)},[l,n]);let u=async()=>{if(a){c(!0);try{let e=await Oc(!a.paused,t);i({title:e.paused?`Embedding paused`:`Embedding resumed`,description:e.paused?`${e.pending.toLocaleString()} job(s) held for this workspace. Resume any time; a restart also resumes.`:`${e.pending.toLocaleString()} job(s) draining.`}),await l()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to toggle the embedding queue (admin only)`,variant:`destructive`})}finally{c(!1)}}},d=!!a?.draining,f=a?a.paused?`bg-warning`:d?`bg-success`:`bg-muted-foreground/40`:`bg-muted-foreground/40`;return(0,Z.jsxs)(`section`,{className:`flex flex-wrap items-center justify-between gap-x-4 gap-y-2 rounded-lg border bg-muted/30 px-4 py-2.5`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 text-sm`,children:[(0,Z.jsxs)(`span`,{className:`relative flex h-2 w-2 shrink-0`,"aria-hidden":!0,children:[d&&(0,Z.jsx)(`span`,{className:`absolute inline-flex h-full w-full animate-ping rounded-full bg-success opacity-60 motion-reduce:hidden`}),(0,Z.jsx)(`span`,{className:K(`relative inline-flex h-2 w-2 rounded-full`,f)})]}),(0,Z.jsx)(`span`,{className:`font-medium`,children:a?a.pending>0?(0,Z.jsxs)(Z.Fragment,{children:[a.pending.toLocaleString(),` `,(0,Z.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`pending`})]}):a.paused?`Paused`:`Idle`:`Queue unavailable`}),a?.paused&&a.pending>0&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`held`}),a?.ingestDisabled&&(0,Z.jsx)(`span`,{className:`rounded bg-warning-subtle px-1.5 py-0.5 text-[10px] font-medium text-warning`,title:`CANVAS_INFERD_INGEST_DISABLED=true: nothing new is enqueued; existing vectors still serve search`,children:`ingest disabled`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[a&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,disabled:s,onClick:u,title:a.paused?`Resume embedding; the held backlog drains`:`Pause after the current batch. Stops the CPU-heavy model inference; documents keep indexing and stay searchable by text.`,children:s?`…`:a.paused?`Resume`:`Pause`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`ghost`,onClick:r,title:`Reload config, queue and tables`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5`})})]})]})}function aN({workspaceId:e,tables:t,error:n,onChanged:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)(null),s=t.filter(e=>!e.active),c=async t=>{if(window.confirm(`Reclaim "${t.name}"?\n\nThis permanently deletes the vectors for ${t.model||`that model`} and its "already embedded" ledger. Switching back to it afterwards would cost a full re-embed rather than being instant.\n\nThis is the only irreversible step in the whole flow.`)){o(t.name);try{let n=await $A(e,t.name);if(!n.dropped)throw Error(n.error||`Failed to drop the vector table`);i({title:`Reclaimed`,description:`Dropped '${n.name||t.name}'.`}),r()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to reclaim`,variant:`destructive`})}finally{o(null)}}};return n?(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/40 bg-destructive-subtle p-4`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium text-destructive`,children:`Vector tables unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:n})]}):s.length===0?null:(0,Z.jsx)(rN,{title:`Previous models (${s.length})`,hint:`Kept on disk so switching back is instant. Reclaiming deletes their vectors for good (the only irreversible step here).`,children:(0,Z.jsx)(`div`,{className:`divide-y`,children:s.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-2 first:pt-0 last:pb-0`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`p`,{className:`truncate font-mono text-xs`,children:[e.model||`unknown model`,e.dim?` · ${e.dim}-d`:``]}),(0,Z.jsxs)(`p`,{className:`truncate font-mono text-[11px] text-muted-foreground`,children:[`└─ `,e.name]})]}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`ghost`,className:`text-destructive hover:text-destructive`,disabled:a===e.name,onClick:()=>c(e),title:`Permanently delete this model's vectors and ledger`,children:[(0,Z.jsx)(Qr,{className:`mr-1.5 h-3.5 w-3.5`}),a===e.name?`Reclaiming…`:`Reclaim`]})]},e.name))})})}function oN({workspaceId:e,workspaceName:t,spaces:n,onDone:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)(``),[s,c]=(0,X.useState)(``),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1);return(0,Z.jsxs)(rN,{title:`Fill a space`,hint:`Embed documents that are missing from a space. Narrow it to one subtree to try a model on a single project first.`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Space`}),(0,Z.jsxs)(`select`,{className:`${nN} w-full`,value:a,onChange:e=>o(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:`all spaces`}),n.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))]})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(`label`,{className:`text-xs font-medium`,children:[`Limit to a path `,(0,Z.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:s,onChange:e=>c(e.target.value),placeholder:`ctx://work/project or dir://photos`,className:`h-8 font-mono text-sm`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>m(!0),title:`Pick a context or directory path from the tree`,children:(0,Z.jsx)(fr,{className:`h-3.5 w-3.5`})})]})]})]}),(0,Z.jsxs)(`label`,{className:`mt-3 flex items-start gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:l,onChange:e=>u(e.target.checked)}),(0,Z.jsxs)(`span`,{children:[`Re-embed documents that are already embedded`,l&&s.trim()&&(0,Z.jsx)(`span`,{className:`mt-1 block text-[11px] text-warning`,children:`Combined with a path limit this clears the WHOLE space, not just that subtree. A partial clear is not expressible in the ledger. Leave this off unless you mean to redo everything.`})]})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,className:`mt-3`,onClick:async()=>{f(!0);try{let t=await ZA(e,{space:a||void 0,reindex:l,scope:s.trim()||void 0});t.ingestDisabled?i({title:`Ingest disabled`,description:`CANVAS_INFERD_INGEST_DISABLED=true: nothing was enqueued. Existing vectors still serve search.`,variant:`destructive`}):i({title:`Fill enqueued`,description:`${t.enqueued.toLocaleString()} document(s) queued${t.scope?` under ${t.scope}`:``}. The status line reports progress.`}),r()}catch(e){i({title:`Fill failed`,description:e instanceof Error?e.message:`Failed to enqueue`,variant:`destructive`})}finally{f(!1)}},disabled:d,children:d?`Queueing…`:`Start fill`}),p&&(0,Z.jsx)(Le,{onClose:()=>m(!1),children:(0,Z.jsx)(y,{sizeClassName:`h-full w-[380px] max-w-[90vw] max-md:w-full`,fixedWorkspaceName:t,multiple:!1,onClose:()=>m(!1),onConfirm:(e,t)=>{let n=e[0];if(n){let e=t.treeType===`directory`?`dir`:`ctx`;c(`${e}://${n.replace(/^\/+/,``)}`)}m(!1)}})})]})}var sN=[{provider:`blip`,model:`HuggingFaceTB/SmolVLM-500M-Instruct`,task:`instruct`,label:`SmolVLM 500M: prompted description (recommended)`,note:`~500 MB. Follows the prompt below, so architecture/materials/setting can be asked for.`},{provider:`blip`,model:`HuggingFaceTB/SmolVLM-256M-Instruct`,task:`instruct`,label:`SmolVLM 256M: prompted, smaller`,note:`~250 MB. Same prompting, weaker; for memory-tight boxes.`},{provider:`blip`,model:`onnx-community/Florence-2-base-ft`,task:`florence2`,label:`Florence-2 base: detailed caption`,note:`Detailed multi-sentence captions, but not steerable: no prompt, fixed task token.`},{provider:`blip`,model:`Xenova/vit-gpt2-image-captioning`,task:`caption`,label:`vit-gpt2: one short sentence (weakest)`,note:`The old default. Terse and repetition-prone; kept for continuity and low memory.`}],cN=`custom`,lN=[{value:`instruct`,label:`Instruct VLM (image + prompt)`},{value:`florence2`,label:`Florence-2 (task token)`},{value:`caption`,label:`Plain captioner (image only)`}],uN=`Describe this photograph in two or three sentences. If it shows a building or interior, name the architectural style, the main materials and the setting. Describe only what is visible.`;function dN({workspaceId:e,config:t,saving:n,onSave:r}){let{showToast:i}=wo(),a=t.workspace||{},o=t.effective||{},s=sN[0],c=a.summarize?.image||o.summarize?.image||{},[l,u]=(0,X.useState)(()=>o.summarize?.image?.enabled===!0||a.summarize?.image?.enabled===!0),[d,f]=(0,X.useState)(()=>{let e=sN.find(e=>e.provider===(c.provider||s.provider)&&e.model===c.model);return e?`${e.provider}::${e.model}`:c.model?cN:`${s.provider}::${s.model}`}),[p,m]=(0,X.useState)(()=>sN.some(e=>e.model===c.model)?``:c.model||``),[h,g]=(0,X.useState)(()=>c.task||`instruct`),[_,v]=(0,X.useState)(()=>c.prompt||``),[y,b]=(0,X.useState)(!1),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(!1),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(!1),k=sN.find(e=>`${e.provider}::${e.model}`===d),A=d===cN,j=A?{provider:s.provider,model:p.trim(),task:h,label:`Custom`,note:``}:k||s,M=j.task===`instruct`,N=(0,X.useCallback)(()=>KA(e).then(e=>S(e.summarize||null)).catch(()=>{}),[e]);(0,X.useEffect)(()=>{N();let e=window.setInterval(()=>{S(e=>(e?.running&&N(),e))},2e3);return()=>window.clearInterval(e)},[N]);let P=async()=>{await r({...a,summarize:{...a.summarize||{},image:{enabled:l,provider:j.provider,model:j.model,task:j.task,...M&&_.trim()?{prompt:_.trim()}:{}}}}),b(!1)},ee=async()=>{E(!0);try{S(await JA(e)),i({title:`Stopping image summaries`,description:`The image being captioned finishes first; the rest are left for a later run.`})}catch(e){i({title:`Could not stop`,description:e instanceof Error?e.message:`Failed to stop`,variant:`destructive`})}finally{E(!1)}},F=async(t=!1)=>{w(!0);try{let n=await qA(e,{force:t});S(n),i({title:t?`Rebuilding image summaries`:`Backfilling image summaries`,description:`${n.total.toLocaleString()} candidate image(s). First run downloads model weights.`})}catch(e){i({title:`Summaries failed to start`,description:e instanceof Error?e.message:`Failed to start`,variant:`destructive`})}finally{w(!1)}},I=o.summarize?.image?.enabled===!0,te=x?.running===!0,L=x?.errors?.[0]?.error;return(0,Z.jsx)(rN,{title:`Summaries`,hint:`Generate descriptions for indexed images (metadata.summary); searchable via full-text and dense search`,children:(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:l,disabled:n,onChange:e=>{u(e.target.checked),b(!0)}}),`Images`]}),(0,Z.jsxs)(`select`,{className:nN,value:d,disabled:n||!l,onChange:e=>{f(e.target.value),b(!0)},children:[sN.map(e=>(0,Z.jsx)(`option`,{value:`${e.provider}::${e.model}`,children:e.label},`${e.provider}::${e.model}`)),(0,Z.jsx)(`option`,{value:cN,children:`Custom model…`})]}),!A&&(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:j.model})]}),A&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(q,{className:`h-8 w-72 font-mono text-xs`,placeholder:`org/model-id (Transformers.js / ONNX)`,value:p,disabled:n||!l,onChange:e=>{m(e.target.value),b(!0)}}),(0,Z.jsx)(`select`,{className:nN,value:h,disabled:n||!l,onChange:e=>{g(e.target.value),b(!0)},children:lN.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),l&&j.note&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:j.note}),l&&M&&(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`textarea`,{className:`w-full rounded-md border border-input bg-transparent p-2 text-xs outline-none focus-visible:ring-1 focus-visible:ring-ring`,rows:3,placeholder:uN,value:_,disabled:n,onChange:e=>{v(e.target.value),b(!0)}}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`What to ask of every image. Empty uses the default shown above. Captions are indexed, so ask for the words you would search by.`})]}),x&&(x.running||x.total>0||x.finishedAt)&&(0,Z.jsxs)(`p`,{className:K(`text-xs`,x.aborted?`text-destructive`:`text-muted-foreground`),children:[te?`Running`:x.aborted?`Stopped`:x.cancelled?`Cancelled`:`Last run`,`: `,x.described,`/`,x.total,` described`,x.skipped?`, ${x.skipped} skipped`:``,x.failed?`, ${x.failed} failed`:``,x.aborted?`. ${x.abortedReason||`model worker died`}. Remaining images were not attempted; generate again to retry.`:x.cancelled?`. Stopped by you. The remaining images were left untouched; generate again to continue.`:L?`. ${L}`:``]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-0.5`,checked:D,disabled:n||te,onChange:e=>O(e.target.checked)}),(0,Z.jsxs)(`span`,{children:[`Re-caption images that already have a summary`,D&&(0,Z.jsxs)(`span`,{className:`mt-1 block text-[11px] text-warning`,children:[`Replaces every existing `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`metadata.summary`}),`, including ones written by a different model. Leave this off to fill in only what is missing.`]})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Enable + save, then run. Only the local caption provider is wired today. Candidates come from `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`data/mime/image`}),`.`]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>void P(),disabled:n||!y,children:`Save summaries`}),(0,Z.jsx)(Y,{size:`sm`,onClick:()=>void F(D),disabled:n||y||C||te||!I,title:I?y?`Save config first`:D?`Re-caption every image, replacing existing summaries`:`Caption images that have no summary yet`:`Enable image summaries and save first`,children:te||C?`Running…`:D?`Rebuild`:`Backfill`}),te&&(0,Z.jsx)(Y,{size:`sm`,variant:`destructive`,onClick:()=>void ee(),disabled:T,title:`Finish the current image, then stop. The rest are left for later.`,children:T?`Stopping…`:`Stop`})]})]})]})})}function fN({workspaceId:e,workspaceName:t}){let{showToast:n}=wo(),[r,i]=(0,X.useState)(null),[a,o]=(0,X.useState)([]),[s,c]=(0,X.useState)(),[l,u]=(0,X.useState)(!0),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)([]),[_,v]=(0,X.useState)(0),y=(0,X.useCallback)(()=>YA(e).then(e=>{i(e),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to load the embedding config`)).finally(()=>u(!1)),[e]),b=(0,X.useCallback)(()=>QA(e).then(e=>{o(e.tables||[]),c(e.error)}).catch(e=>c(e instanceof Error?e.message:`Failed to list vector tables`)),[e]);(0,X.useEffect)(()=>{y(),b()},[y,b]);let x=()=>{u(!0),y(),b(),v(e=>e+1)},S=async t=>{f(!0);try{let r=await XA(e,t);g(r.movedSpaces||[]),r.movedSpaces?.length?n({title:`Saved; fill to finish`,description:`${r.movedSpaces.join(`, `)} now targets a new model. The switch is live, but the new table is empty until you fill it.`}):r.applied===!1?n({title:`Saved; applies on next start`,description:`The workspace is not running, so the new spaces take effect when it starts.`}):n({title:`Saved`,description:`Embedding config updated.`}),await y(),await b()}catch(e){n({title:`Save failed`,description:e instanceof Error?e.message:`Failed to save`,variant:`destructive`})}finally{f(!1)}},C=async t=>{try{let r=await ZA(e,{space:t});if(r.ingestDisabled){n({title:`Ingest disabled`,description:`CANVAS_INFERD_INGEST_DISABLED=true: nothing was enqueued. Existing vectors still serve search.`,variant:`destructive`});return}n({title:`Filling ${t}`,description:`${r.enqueued.toLocaleString()} document(s) queued. The status line reports progress.`}),g(e=>e.filter(e=>e!==t)),v(e=>e+1),b()}catch(e){n({title:`Fill failed`,description:e instanceof Error?e.message:`Failed to enqueue`,variant:`destructive`})}};if(l)return(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading the embedding config…`]});if(p||!r)return(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`rounded-lg border border-destructive/40 bg-destructive-subtle p-4 text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium text-destructive`,children:`Embedding config unavailable`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:p||`No config returned.`})]}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:x,children:`Try again`})]});let w=Object.keys(r.effective.spaces||{}).sort();return(0,Z.jsxs)(`div`,{className:`space-y-5`,children:[(0,Z.jsx)(iN,{workspaceId:e,workspaceName:t,refreshKey:_,onRefresh:x}),(0,Z.jsx)(bj,{value:r.workspace||{},effective:r.effective||{},inherited:r.inherited||{},resolvedSpaces:r.spaces,invalid:r.invalid,attention:h,onFill:C,saving:d,saveLabel:`Save embedding config`,onSave:S},JSON.stringify(r.workspace)),(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsx)(dN,{workspaceId:e,config:r,saving:d,onSave:S},`summarize:${JSON.stringify(r.workspace?.summarize||{})}`),(0,Z.jsx)(oN,{workspaceId:e,workspaceName:t,spaces:w,onDone:()=>{b(),v(e=>e+1)}}),(0,Z.jsx)(aN,{workspaceId:e,tables:a,error:s,onChanged:()=>{b()}})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Stored in this workspace's own `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`workspace.json`}),`, so it travels with the workspace. Settings resolve in layers: built-in, then server, then your defaults, then this workspace, which wins. Changes apply live, with no restart.`]})]})}function pN(e){let t=(e||``).split(`.`).pop()?.toLowerCase();switch(t){case`js`:case`mjs`:case`ts`:return[l({typescript:t===`ts`})];case`json`:return[c()];case`sh`:case`bash`:return[a.define(u)];default:return[]}}function mN({value:e,onChange:t,path:n,className:r=``}){let i=(0,X.useMemo)(()=>pN(n),[n]),{resolvedScheme:a}=Ll();return(0,Z.jsx)(o,{value:e,onChange:t,extensions:i,theme:a===`dark`?`dark`:`light`,className:r,basicSetup:{lineNumbers:!0,foldGutter:!0,highlightActiveLine:!0,bracketMatching:!0,autocompletion:!1}})}var hN=[`pending`,`approved`,`declined`,`failed`,`expired`,`all`],gN={pending:`text-warning dark:text-warning`,approved:`text-success dark:text-success`,declined:`text-muted-foreground`,failed:`text-destructive`,expired:`text-muted-foreground line-through`};function _N(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/6e4);if(n<1)return`now`;if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<24?`${r}h`:`${Math.floor(r/24)}d`}function vN(e,t){return t.split(`.`).reduce((e,t)=>typeof e==`object`&&e?e[t]:void 0,e)}function yN(e){let t=e.split(`.`);return t.slice(Math.max(t.length-2,2)).join(`.`)}var bN=/(body|content|message|text|prompt)$/i;function xN({workspaceId:e,id:t,children:n}){let{open:r}=I(),{showToast:i}=wo(),[a,o]=(0,X.useState)(!1),s=async n=>{n.stopPropagation(),o(!0);try{r(await xc(e,t),e)}catch(e){i({title:`Document ${t} not available`,description:e instanceof Error?e.message:void 0,variant:`destructive`})}finally{o(!1)}};return(0,Z.jsx)(`button`,{type:`button`,disabled:a,onClick:e=>void s(e),className:`text-primary underline-offset-2 hover:underline disabled:opacity-60`,title:`Open document ${t}`,children:n??`doc ${t}`})}function SN({workspaceId:e,text:t}){let n=t.split(/(\bdoc \d+\b)/);return(0,Z.jsx)(Z.Fragment,{children:n.map((t,n)=>{let r=/^doc (\d+)$/.exec(t);return r?(0,Z.jsx)(xN,{workspaceId:e,id:Number(r[1])},n):(0,Z.jsx)(X.Fragment,{children:t},n)})})}function CN({action:e,amend:t,onAmend:n}){return e.editable?.length?(0,Z.jsx)(`div`,{className:`space-y-2`,children:e.editable.map(r=>{let i=vN(e,r),a=typeof i==`string`,o=r in t?t[r]:i,s=a?String(o??``):JSON.stringify(o,null,2),c=a&&(bN.test(r)||s.length>80);return(0,Z.jsxs)(`label`,{className:`block text-xs`,children:[(0,Z.jsxs)(`span`,{className:`font-medium text-muted-foreground`,children:[yN(r),(0,Z.jsx)(`span`,{className:`ml-1.5 font-mono text-[10px] opacity-60`,children:r}),r in t&&(0,Z.jsx)(`span`,{className:`ml-1.5 text-warning dark:text-warning`,children:`edited`})]}),c?(0,Z.jsx)(`textarea`,{className:`mt-1 w-full rounded-md border bg-background px-2 py-1.5 font-mono text-xs outline-none focus:ring-2 focus:ring-ring min-h-[100px]`,value:s,onChange:e=>n(r,e.target.value)}):(0,Z.jsx)(`input`,{className:`mt-1 w-full h-8 rounded-md border bg-background px-2 font-mono text-xs outline-none focus:ring-2 focus:ring-ring`,value:s,onChange:e=>{if(a){n(r,e.target.value);return}try{n(r,JSON.parse(e.target.value))}catch{n(r,e.target.value)}}})]},r)})}):null}function wN({workspaceId:e,onPendingCount:t}){let{showToast:n}=wo(),r=Cw(),[i,a]=(0,X.useState)(`pending`),[o,s]=(0,X.useState)([]),[c,l]=(0,X.useState)(!0),[u,d]=(0,X.useState)(new Set),[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)({}),[g,_]=(0,X.useState)(!1),v=(0,X.useCallback)(()=>en(e,{status:i===`all`?void 0:i,limit:200}).then(e=>{s(e),d(t=>new Set(e.filter(e=>e.status===`pending`&&t.has(e.actionId)).map(e=>e.actionId))),t?.(i===`pending`?e.length:e.filter(e=>e.status===`pending`).length)}).catch(()=>{n({title:`Error`,description:`Failed to load pending actions`,variant:`destructive`})}).finally(()=>l(!1)),[e,i]),y=(0,X.useCallback)(async()=>{l(!0),await v()},[v]),[b,x]=(0,X.useState)(`${e}|${i}`),S=`${e}|${i}`;S!==b&&(x(S),l(!0)),(0,X.useEffect)(()=>{v()},[v]),fw(r,`workspace:${e}`,(0,X.useMemo)(()=>{let e=()=>{y()};return{"action.proposed":e,"action.approved":e,"action.declined":e,"action.failed":e}},[y]));let C=o.filter(e=>e.status===`pending`),w=C.length>0&&C.every(e=>u.has(e.actionId)),T=()=>{d(w?new Set:new Set(C.map(e=>e.actionId)))},E=e=>{d(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},D=(e,t,n)=>{h(r=>({...r,[e]:{...r[e],[t]:n}}))},O=async(t,r)=>{if(!(!t.length&&!r.length)){_(!0);try{let i=await gt(e,{approve:t.map(e=>{let t=m[e];return t&&Object.keys(t).length?{actionId:e,amend:t}:e}),decline:r}),a=i.results.filter(e=>e.status===`error`||e.status===`failed`);a.length?n({title:`${a.length} of ${i.decided} failed`,description:a.map(e=>`${e.actionId}: ${e.error??`execution failed`}`).join(`; `),variant:`destructive`}):n({title:t.length&&r.length?`Decisions applied`:t.length?`Approved ${t.length}`:`Declined ${r.length}`,description:t.length?`Approved actions executed with their original provenance.`:void 0}),h(e=>{let n={...e};for(let e of[...t,...r])delete n[e];return n}),d(new Set),f&&[...t,...r].includes(f)&&p(null),await y()}catch(e){n({title:`Decision failed`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{_(!1)}}};return(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 flex-wrap`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`select`,{className:`h-8 rounded-md border bg-background px-2 text-xs outline-none focus:ring-2 focus:ring-ring`,value:i,onChange:e=>a(e.target.value),children:hN.map(e=>(0,Z.jsx)(`option`,{value:e,children:e},e))}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>void y(),title:`Reload`,children:(0,Z.jsx)(Er,{className:`h-4 w-4`})})]}),u.size>0&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[u.size,` selected`]}),(0,Z.jsxs)(Y,{size:`sm`,disabled:g,onClick:()=>void O([...u],[]),children:[(0,Z.jsx)(sr,{className:`mr-1 h-3.5 w-3.5`}),` Approve`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:g,onClick:()=>void O([],[...u]),children:[(0,Z.jsx)(vr,{className:`mr-1 h-3.5 w-3.5`}),` Decline`]})]})]}),(0,Z.jsx)(`div`,{className:`border rounded-lg overflow-auto max-h-[560px]`,children:c?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:`Loading...`}):o.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:i===`pending`?`Nothing waiting for review. Rules or hooks with approval enabled queue their actions here.`:`No ${i===`all`?``:i+` `}actions recorded.`}):(0,Z.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,Z.jsx)(`thead`,{className:`text-xs text-muted-foreground border-b sticky top-0 bg-background`,children:(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{className:`px-3 py-2 w-8`,children:C.length>0&&(0,Z.jsx)(`input`,{type:`checkbox`,checked:w,onChange:T,title:`Select all pending`})}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Proposed action`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Handler`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Age`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Status`}),(0,Z.jsx)(`th`,{className:`px-2 py-2 w-40`})]})}),(0,Z.jsx)(`tbody`,{children:o.map(t=>{let n=t.status===`pending`||t.status===`failed`,r=f===t.actionId,i=t.envelope?.payload?.document;return(0,Z.jsxs)(X.Fragment,{children:[(0,Z.jsxs)(`tr`,{className:`border-b last:border-0 align-top hover:bg-muted/40 cursor-pointer`,onClick:()=>p(r?null:t.actionId),children:[(0,Z.jsx)(`td`,{className:`px-3 py-2`,onClick:e=>e.stopPropagation(),children:t.status===`pending`&&(0,Z.jsx)(`input`,{type:`checkbox`,checked:u.has(t.actionId),onChange:()=>E(t.actionId)})}),(0,Z.jsxs)(`td`,{className:`px-3 py-2`,children:[(0,Z.jsxs)(`span`,{className:`flex items-center gap-1 font-medium`,children:[r?(0,Z.jsx)(qr,{className:`h-3 w-3 shrink-0`}):(0,Z.jsx)(Xa,{className:`h-3 w-3 shrink-0`}),t.title,t.editable?.length>0&&(0,Z.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide rounded bg-muted-foreground/15 px-1 py-0.5 text-muted-foreground shrink-0`,children:`editable`})]}),t.summary&&(0,Z.jsx)(`span`,{className:`block text-xs text-muted-foreground pl-4`,children:(0,Z.jsx)(SN,{workspaceId:e,text:t.summary})})]}),(0,Z.jsxs)(`td`,{className:`px-3 py-2 font-mono text-xs whitespace-nowrap`,children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[t.handlerType,`:`]}),t.handler,t.event&&(0,Z.jsxs)(`span`,{className:`block text-muted-foreground`,children:[t.event,i?.id!=null&&(0,Z.jsxs)(Z.Fragment,{children:[` · `,(0,Z.jsx)(xN,{workspaceId:e,id:i.id})]})]})]}),(0,Z.jsx)(`td`,{className:`px-3 py-2 text-xs whitespace-nowrap`,title:t.ts,children:_N(t.ts)}),(0,Z.jsxs)(`td`,{className:`px-3 py-2 text-xs`,children:[(0,Z.jsx)(`span`,{className:gN[t.status],children:t.status}),t.amended&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground`,children:`amended`}),t.decidedBy&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground truncate max-w-[120px]`,title:t.decidedBy,children:t.decidedBy})]}),(0,Z.jsx)(`td`,{className:`px-2 py-2 whitespace-nowrap text-right`,onClick:e=>e.stopPropagation(),children:n&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Y,{size:`sm`,className:`h-7 px-2`,disabled:g,title:t.status===`failed`?`Retry (re-approve)`:`Approve and execute`,onClick:()=>void O([t.actionId],[]),children:(0,Z.jsx)(sr,{className:`h-3.5 w-3.5`})}),t.status===`pending`&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-7 px-2 text-muted-foreground`,disabled:g,title:`Decline`,onClick:()=>void O([],[t.actionId]),children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})})]}),r&&(0,Z.jsxs)(`tr`,{className:`border-b last:border-0 bg-muted/20`,children:[(0,Z.jsx)(`td`,{className:`px-3 py-3`}),(0,Z.jsxs)(`td`,{className:`px-3 py-3 space-y-3`,colSpan:5,children:[n&&t.editable?.length>0&&(0,Z.jsx)(CN,{action:t,amend:m[t.actionId]??{},onAmend:(e,n)=>D(t.actionId,e,n)}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground`,children:`Actions on approve`}),(0,Z.jsx)(`pre`,{className:`mt-1 rounded border bg-background p-2 font-mono text-xs overflow-auto max-h-56`,children:JSON.stringify(t.actions,null,2)})]}),t.result&&t.result.length>0&&(0,Z.jsx)(`div`,{className:`text-xs font-mono`,children:t.result.map((e,t)=>(0,Z.jsxs)(`span`,{className:`mr-2 ${e.status===`error`?`text-destructive`:`text-muted-foreground`}`,children:[e.action,`:`,e.status,e.error?` (${e.error})`:``]},t))}),(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground font-mono`,children:[t.actionId,` · origin `,t.provenance?.origin,t.provenance?.causedBy?` · causedBy ${t.provenance.causedBy}`:``,t.expiresAt?` · expires ${new Date(t.expiresAt).toLocaleString()}`:``]})]})]})]},t.actionId)})})]})})]})}var TN=`#!/usr/bin/env bash
|
|
40
40
|
# Called from a hook via: spawn('bash', [script, ...args])
|
|
41
41
|
set -euo pipefail
|
|
42
|
-
`;function
|
|
43
|
-
`).catch(()=>{})}c(`hooks`),U(`rules.json`)}}),s===`runs`&&(0,Z.jsx)(`div`,{className:`border rounded-lg overflow-auto max-h-[560px]`,children:h?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:`Loading...`}):te.length===0?(0,Z.jsxs)(`p`,{className:`text-sm text-muted-foreground p-3`,children:[`No runs recorded yet`,R?` (failed only)`:``,`. Runs appear here every time a rule or hook executes.`]}):(0,Z.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,Z.jsx)(`thead`,{className:`text-xs text-muted-foreground border-b sticky top-0 bg-background`,children:(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Time`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Handler`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Event`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Docs`}),(0,Z.jsx)(`th`,{className:`text-right font-medium px-3 py-2`,children:`ms`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Status`}),(0,Z.jsx)(`th`,{className:`px-2 py-2`})]})}),(0,Z.jsx)(`tbody`,{children:te.map(e=>(0,Z.jsxs)(X.Fragment,{children:[(0,Z.jsxs)(`tr`,{className:`border-b last:border-0 align-top hover:bg-muted/40`,children:[(0,Z.jsx)(`td`,{className:`px-3 py-1.5 whitespace-nowrap text-xs text-muted-foreground`,title:e.ts,children:new Date(e.ts).toLocaleString()}),(0,Z.jsxs)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.handlerType,`:`]}),e.handler,e.origin!==`user`&&(0,Z.jsxs)(`span`,{className:`ml-1.5 text-[10px] uppercase tracking-wide rounded bg-muted-foreground/15 px-1 py-0.5 text-muted-foreground`,children:[e.origin,e.depth?` d${e.depth}`:``]})]}),(0,Z.jsxs)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:[e.event,e.batch?` (batch)`:``]}),(0,Z.jsx)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:(e.docIds||[]).join(`, `)}),(0,Z.jsx)(`td`,{className:`px-3 py-1.5 text-right font-mono text-xs`,children:e.durationMs}),(0,Z.jsxs)(`td`,{className:`px-3 py-1.5 text-xs`,children:[(0,Z.jsx)(`span`,{className:e.status===`error`?`text-destructive font-medium`:e.status===`skipped`?`text-muted-foreground`:`text-success dark:text-success`,children:e.status}),e.error&&(0,Z.jsx)(`span`,{className:`block text-destructive/80 font-mono break-all`,children:e.error}),e.skipReason&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground`,children:e.skipReason}),e.actions&&e.actions.length>0&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground font-mono`,children:e.actions.map(e=>`${e.action}:${e.status}`).join(` `)}),e.actions?.filter(e=>e.error).map((e,t)=>(0,Z.jsxs)(`span`,{className:`block break-all font-mono ${e.status===`error`?`text-destructive/80`:`text-muted-foreground`}`,children:[e.action,`: `,e.error]},t))]}),(0,Z.jsxs)(`td`,{className:`px-2 py-1.5 whitespace-nowrap`,children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-6 px-1.5 touch-target`,title:e.traceLines?`Execution log (${e.traceLines} lines)`:`Execution log`,onClick:()=>se(e.runId),children:[(0,Z.jsx)(bi,{className:`h-3.5 w-3.5`}),(0,Z.jsx)(qr,{className:`ml-0.5 h-3 w-3 transition-transform ${z?.runId===e.runId?`rotate-180`:``}`})]}),e.handlerType!==`dispatch`&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:`Replay this run (reloads the document, re-runs the handler)`,disabled:B!==null,onClick:()=>be(e),children:(0,Z.jsx)(Vr,{className:`h-3 w-3 ${B===e.runId?`animate-spin`:``}`})})]})]}),z?.runId===e.runId&&(0,Z.jsx)(`tr`,{className:`border-b last:border-0 bg-muted/30`,children:(0,Z.jsx)(`td`,{colSpan:7,className:`px-3 py-2`,children:(0,Z.jsx)(wN,{state:z})})})]},e.runId))})]})}),H&&d&&O&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 bg-muted/30 text-sm`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`h4`,{className:`font-medium mb-2`,children:[`Hook context (`,(0,Z.jsx)(`span`,{className:`font-mono`,children:`ctx`}),`)`]}),(0,Z.jsx)(`div`,{className:`space-y-2`,children:O.contextApi?.map(e=>(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-xs`,children:e.signature}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]},e.name))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`h4`,{className:`font-medium mb-2`,children:[`Classifier (`,(0,Z.jsx)(`span`,{className:`font-mono`,children:`const c = ctx.classify()`}),`)`]}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:O.classifier.predicates.map(e=>(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-xs`,children:e},e))}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-2`,children:[`Fields: `,O.classifier.fields.map(e=>(0,Z.jsxs)(`code`,{className:`font-mono`,children:[e,` `]},e)),`(never throws; all predicates are false for a null/unknown document).`]})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Full reference: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`docs/hooks.md`}),` in the server repo.`]})]}),E&&s===`scripts`&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-3 flex gap-2 items-center bg-muted/50`,children:[(0,Z.jsx)(q,{placeholder:`on-image.sh`,value:M,onChange:e=>N(e.target.value),className:`font-mono text-sm`}),(0,Z.jsx)(Y,{size:`sm`,onClick:Me,disabled:F,children:`Create`}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(!1),children:`Cancel`})]}),E&&s===`hooks`&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-3 bg-muted/50`,children:[(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mb-1`,children:`1. When (event)`}),(0,Z.jsx)(`select`,{className:`w-full h-9 rounded-md border bg-background px-2 font-mono text-sm outline-none focus:ring-2 focus:ring-ring`,value:A,onChange:e=>j(e.target.value),children:(O?.events??[]).map(e=>(0,Z.jsxs)(`option`,{value:e.name,children:[e.name,`: `,e.description]},e.name))}),O&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1 font-mono`,children:[`payload: `,O.events.find(e=>e.name===A)?.payload]}),(0,Z.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mt-3 mb-1`,children:`2. Name`}),(0,Z.jsx)(q,{placeholder:`my-hook`,value:M,onChange:e=>N(e.target.value),className:`font-mono text-sm`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mb-1`,children:`3. Then (actions; pick any)`}),(0,Z.jsx)(`div`,{className:`space-y-1 max-h-52 overflow-auto pr-1`,children:(O?.actions??[]).map(e=>(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 text-sm rounded px-2 py-1 hover:bg-muted cursor-pointer`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:P.includes(e.id),onChange:()=>Ne(e.id)}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:e.label}),(0,Z.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:e.description})]})]},e.id))})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Y,{size:`sm`,onClick:Pe,disabled:F||!O,children:F?`Creating…`:`Create skeleton`}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(!1),children:`Cancel`}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Creates a disabled skeleton. Edit the TODOs, then enable it. Simple match→action automations can also go into `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`rules.json`}),` (no code).`]})]})]}),H&&(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,Z.jsx)(`div`,{className:`md:col-span-1 border rounded-lg p-2 max-h-[480px] overflow-auto`,children:h?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-2`,children:`Loading...`}):p.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-2`,children:`No hooks yet.`}):Object.entries(Ie).map(([e,t])=>(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(`div`,{className:`text-xs font-semibold text-muted-foreground px-2 py-1`,children:e}),t.map(e=>{let t=pt(e.path);return(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded px-2 py-1 cursor-pointer text-sm ${v===e.path?`bg-muted`:`hover:bg-muted/50`} ${t?``:`opacity-50`}`,onClick:()=>U(e.path),children:[(0,Z.jsxs)(`span`,{className:`font-mono truncate flex items-center gap-1.5`,children:[e.path,s===`hooks`&&yn(e.path)&&(0,Z.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide rounded bg-muted-foreground/15 px-1 py-0.5 text-muted-foreground shrink-0`,children:`example`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center`,children:[s===`hooks`&&zt(e.path)&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:zt(e.path)?.startsWith(`document.`)?`Run against up to ${he} existing documents`:`Run now`,disabled:pe!==null,onClick:t=>{t.stopPropagation(),Ee(e.path)},children:(0,Z.jsx)(Ar,{className:`h-3 w-3 ${pe===e.path?`animate-pulse`:``}`})}),s===`hooks`&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:t?`Disable`:`Enable`,onClick:t=>{t.stopPropagation(),Te(e.path)},children:t?(0,Z.jsx)(Vn,{className:`h-3 w-3`}):(0,Z.jsx)(Xi,{className:`h-3 w-3 text-muted-foreground`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive touch-target`,onClick:t=>{t.stopPropagation(),De(e.path)},children:(0,Z.jsx)(Qr,{className:`h-3 w-3`})})]})]},e.path)})]},e))}),(0,Z.jsx)(`div`,{className:le?`fixed inset-0 z-50 bg-background p-4 flex flex-col`:`md:col-span-2 border rounded-lg p-2 flex flex-col`,children:v?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`mb-2 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`span`,{className:`font-mono text-sm truncate`,children:[v,S?` •`:``]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[s===`hooks`&&zt(v)&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,className:`h-8`,title:pt(v)?`Disable this hook (renames it with a disabled- prefix)`:`Enable this hook (strips the prefix)`,onClick:()=>Te(v),children:pt(v)?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Vn,{className:`mr-1.5 h-3.5 w-3.5`}),` Enabled`]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Xi,{className:`mr-1.5 h-3.5 w-3.5 text-muted-foreground`}),` Disabled`]})}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8`,title:`Run this hook now`,disabled:pe!==null||S,onClick:()=>Ee(v),children:[(0,Z.jsx)(Ar,{className:`mr-1.5 h-3.5 w-3.5 ${pe===v?`animate-pulse`:``}`}),` Run`]})]}),(0,Z.jsxs)(Y,{size:`sm`,onClick:we,disabled:w||!S,children:[(0,Z.jsx)(Yn,{className:`mr-2 h-4 w-4`}),` Save`]}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-8 w-8 p-0`,title:le?`Exit full screen (Esc)`:`Edit full screen`,onClick:()=>ue(!le),children:le?(0,Z.jsx)(ei,{className:`h-4 w-4`}):(0,Z.jsx)(ba,{className:`h-4 w-4`})})]})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-auto rounded border text-sm ${le?``:`min-h-[400px] max-h-viewport-pane`}`,children:(0,Z.jsx)(dN,{value:b,path:v,onChange:e=>{x(e),C(!0)}})})]}):(0,Z.jsxs)(`div`,{className:`flex-1 flex items-center justify-center text-sm text-muted-foreground min-h-[400px]`,children:[`Select a `,s===`hooks`?`hook`:`script`,` to edit, or create a new one.`]})})]}),(s===`rules`||s===`hooks`)&&(0,Z.jsxs)(`label`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground`,title:`1–10000. Raise it when "Apply to existing items" reports fewer matches than you expect.`,children:[(0,Z.jsx)(Ci,{className:`h-3.5 w-3.5 shrink-0`}),(0,Z.jsx)(`span`,{children:`Apply / run in batches of`}),(0,Z.jsx)(q,{type:`number`,min:1,max:1e4,step:100,value:_e,onChange:e=>ve(e.target.value),onBlur:ye,onKeyDown:e=>{e.key===`Enter`&&(ye(),e.target.blur())},className:`h-7 w-20 px-2 text-xs`}),(0,Z.jsx)(`span`,{children:`documents per pass — the rule "Apply" button and manual hook runs stop after that many.`})]}),(0,Z.jsxs)(`p`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Z.jsx)(or,{className:`h-3.5 w-3.5 shrink-0`}),(0,Z.jsxs)(`span`,{children:[`Everything here lives in the workspace git repo. Clone it with`,` `,(0,Z.jsxs)(`code`,{className:`break-all rounded bg-muted px-1 py-0.5 font-mono select-all`,children:[`git clone `,Le.replace(`://`,`://canvas@`)]}),` `,`(password: a canvas API token; the `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`canvas@`}),` username is arbitrary but git needs one). Pushes hot-reload hooks.`]})]})]})}function wN({state:e}){if(e.error)return(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:e.error});if(!e.run)return(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading…`});let t=e.run,n={error:`text-destructive`,warn:`text-warning`,info:`text-foreground`,debug:`text-muted-foreground`};return(0,Z.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`run `,(0,Z.jsx)(`span`,{className:`font-mono`,children:t.runId})]}),(0,Z.jsxs)(`span`,{children:[`trigger `,(0,Z.jsx)(`span`,{className:`font-mono`,children:t.trigger})]}),t.eventId&&(0,Z.jsxs)(`span`,{children:[`event `,(0,Z.jsx)(`span`,{className:`font-mono`,children:t.eventId})]}),(0,Z.jsxs)(`span`,{children:[t.durationMs,` ms`]})]}),t.actions&&t.actions.length>0&&(0,Z.jsx)(`ol`,{className:`space-y-0.5 font-mono`,children:t.actions.map((e,t)=>(0,Z.jsxs)(`li`,{className:e.status===`error`?`text-destructive`:e.status===`skipped`?`text-muted-foreground`:``,children:[t+1,`. `,e.action,` → `,e.status,e.error?` — ${e.error}`:``]},t))}),t.trace&&t.trace.length>0?(0,Z.jsx)(`pre`,{className:`max-h-96 overflow-auto rounded-md border bg-background p-2 font-mono text-[11px] leading-relaxed whitespace-pre-wrap break-all`,children:t.trace.map((e,t)=>(0,Z.jsxs)(`span`,{className:`block ${n[e.level]||``}`,children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[`+`,String(e.t).padStart(5,` `),`ms `]}),(0,Z.jsxs)(`span`,{className:`uppercase text-muted-foreground`,children:[e.level.padEnd(5,` `),` `]}),e.msg]},t))}):(0,Z.jsxs)(`p`,{className:`text-muted-foreground`,children:[`No execution log recorded for this run`,t.error?``:` (older runs predate tracing)`,`.`]})]})}var TN=e=>`/workspaces/${e}/storage-policies`;function EN(){return`policy-${crypto.randomUUID().slice(0,8)}`}function DN(e){return e.filter(e=>e.enabled&&e.capabilities?.upload&&!e.config?.readOnly&&e.driver!==`cacache`)}var ON=new Set([`file`]);function kN(e,t){return`${e===`directory`?`dir`:`ctx`}:${t.startsWith(`/`)?t:`/${t}`}`}function AN(e){let t=/^(ctx|dir):(\/.*)$/.exec(e);return t?{tree:t[1]===`dir`?`directory`:`context`,path:t[2]}:null}function jN(e){return(AN(e)?.path??e).replace(/^\/+/,``)}function MN(e){return`${e.backend}:${e.folder||`/`}`}async function NN(e){let t=await J.get(TN(e));return{...t,policies:t?.policies??[],revision:t.revision,blobBackend:t?.blobBackend??null}}async function PN(e,t,n){return J.put(TN(e),{policies:t,revision:n})}async function FN(e,t,n={}){return await J.post(`${TN(e)}/${encodeURIComponent(t)}/apply`,n)}async function IN(e,t,n){let{policies:r,revision:i}=n??await NN(e),a=r.findIndex(e=>e.id===t.id);return PN(e,a===-1?[...r,t]:r.map((e,n)=>n===a?t:e),i)}async function LN(e,t,n,r={}){let i={folders:0,processed:0,matched:0,failed:0},a=0;for(;a!==null;){let o=await FN(e,t,{limit:r.limit??100,offset:a,dryRun:r.dryRun});if(i.folders+=o.folders??0,i.processed+=o.processed??0,i.matched+=o.matched??0,i.failed+=o.failed??0,n?.(o,i),o.nextOffset===void 0)throw Error(`The policy is saved, but applying it to existing documents needs an updated server.`);a=o.nextOffset}return i}function RN(e,t,n){let r=kN(t,n),i=r.endsWith(`/`)?r:`${r}/`;return e.filter(e=>{if(!e.enabled)return!1;if(e.path===r)return!0;if(!e.recursive)return!1;let t=e.path.endsWith(`/`)?e.path:`${e.path}/`;return i.startsWith(t)})}function zN(e){let t=new Set;for(let n of e)for(let e of n.targets)t.add(MN(e));return[...t].join(`, `)}async function BN(e,t){await J.post(`${TN(e)}/operations/${encodeURIComponent(t)}/retry`,{})}function VN(e){return!e||!e.mime&&!e.filename&&(!e.schema||e.schema===`file`)?`files`:e.mime===`image/*`&&!e.filename&&(!e.schema||e.schema===`file`)?`images`:`custom`}function HN(e,t){return{backend:e?.address??``,folder:t,recursive:!0,recreateDirectories:!!e&&ON.has(e.driver),onConflict:`error`}}function UN({workspaceId:e,path:t,policy:n,onClose:r,onSaved:i}){let a=!!n,[o]=(0,X.useState)(()=>n?.id??EN()),[s,c]=(0,X.useState)(n?.kind||`mirror`),[l,u]=(0,X.useState)(n?.description??``),[d,f]=(0,X.useState)(n?.recursive??!0),[p,m]=(0,X.useState)(()=>VN(n?.filter)),[h,g]=(0,X.useState)(n?.filter?.mime??``),[_,v]=(0,X.useState)(n?.filter?.filename??``),[y,b]=(0,X.useState)(n?.targets??[]),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(!1),[k,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(``),[N,P]=(0,X.useState)(0),[ee,F]=(0,X.useState)(0),[I,te]=(0,X.useState)(0);Ae(r,!D);let L=()=>{D||r()},R=(0,X.useMemo)(()=>jN(t),[t]),ne=(0,X.useMemo)(()=>DN(C??[]).filter(e=>s===`filing`||e.driver===`file`),[C,s]),re=(0,X.useMemo)(()=>new Map(ne.map(e=>[e.address,e])),[ne]);(0,X.useEffect)(()=>{let t=!1;return Promise.all([Rc(e),NN(e)]).then(([e,r])=>{if(t)return;if(n&&JSON.stringify(r.policies.find(e=>e.id===n.id))!==JSON.stringify(n))throw Error(`This policy changed. Close and reopen the editor.`);S(r),w(e);let i=DN(e).find(e=>n?.kind===`filing`||e.driver===`file`);i&&b(e=>e.length?e:[HN(i,R)])}).catch(e=>{t||(w([]),M(e instanceof Error?e.message:`Could not load backends`))}),()=>{t=!0}},[e,R,n]);let ae=(e,t)=>b(n=>n.map((n,r)=>r===e?{...n,...t}:n)),z=(e,t)=>{let n=re.get(t),r=!!n&&ON.has(n.driver);ae(e,{backend:t,recreateDirectories:r?y[e].recreateDirectories:!1})},oe=()=>{if(!y.length)throw Error(`Add at least one target.`);let e=y.map(e=>{if(!e.backend)throw Error(`Choose a backend for every target.`);let t={backend:e.backend,folder:e.folder.trim().replace(/^\/+|\/+$/g,``),recursive:e.recursive,recreateDirectories:e.recreateDirectories,onConflict:e.onConflict??`error`};if(s===`filing`&&e.key?.trim()&&(t.key=e.key.trim()),s===`filing`&&(t.recreateDirectories=!1),s===`mirror`&&t.folder.includes(`{{`))throw Error(`Folder templates require a filing policy.`);return t}),r;return p===`images`?r={schema:`file`,mime:`image/*`}:p===`custom`&&(r={schema:`file`},h.trim()&&(r.mime=h.trim()),_.trim()&&(r.filename=_.trim())),{id:o,kind:s,enabled:n?.enabled??!0,...l.trim()?{description:l.trim()}:{},path:t,recursive:d,...r?{filter:r}:{},targets:e}},se=async()=>{if(!D){O(!0),M(``);try{let t=oe();T||(await IN(e,t,x),E(!0),i?.(t)),P(0),F(0),te(0),await LN(e,o,(e,t)=>{P(t.matched),F(t.folders),te(t.failed)}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`)),A(!0)}catch(e){M(e instanceof Error?e.message:`Could not save the storage policy`)}finally{O(!1)}}},B=!!x&&y.length>0&&y.every(e=>e.backend);return(0,Z.jsx)(Le,{onClose:L,children:(0,Z.jsxs)(`section`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`storage-policy-title`,className:`${ie} flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,children:[(0,Z.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Z.jsxs)(`h2`,{id:`storage-policy-title`,className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Z.jsx)(gr,{className:`h-4 w-4`}),a?`Edit storage policy`:`Storage policy`]}),(0,Z.jsx)(`button`,{type:`button`,onClick:L,disabled:D,"aria-label":`Close`,className:`p-1 disabled:opacity-40`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Virtual path`}),(0,Z.jsx)(`p`,{className:`mt-1 break-words text-sm`,children:t})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Documents filed here are copied to every target in order. Uploads stay local until every destination has been verified. Mirrors move removed copies to Trash; filing policies keep their copies.`}),(0,Z.jsxs)(`fieldset`,{disabled:D||T,className:`space-y-3 text-sm`,children:[(0,Z.jsxs)(`label`,{className:`block`,children:[`Behavior`,(0,Z.jsxs)(`select`,{"aria-label":`Storage behavior`,className:`ml-2 rounded border bg-background p-2`,value:s,onChange:e=>c(e.target.value),children:[(0,Z.jsx)(`option`,{value:`mirror`,children:`Mirror (recoverable removal)`}),(0,Z.jsx)(`option`,{value:`filing`,children:`File copies (keep after unlink)`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-description`,children:`Description (optional)`}),(0,Z.jsx)(`input`,{id:`policy-description`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:l,onChange:e=>u(e.target.value),placeholder:`e.g. Accounting archive`})]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked),className:`mt-1`}),`Apply to subfolders`]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-filter`,children:`Documents`}),(0,Z.jsxs)(`select`,{id:`policy-filter`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:p,onChange:e=>m(e.target.value),children:[(0,Z.jsx)(`option`,{value:`files`,children:`Files`}),(0,Z.jsx)(`option`,{value:`images`,children:`Images`}),(0,Z.jsx)(`option`,{value:`custom`,children:`Custom…`})]}),p===`custom`&&(0,Z.jsxs)(`div`,{className:`mt-2 grid grid-cols-2 gap-2`,children:[(0,Z.jsx)(`input`,{"aria-label":`MIME type`,className:`rounded-md border bg-background p-2`,value:h,onChange:e=>g(e.target.value),placeholder:`image/*`}),(0,Z.jsx)(`input`,{"aria-label":`Filename glob`,className:`rounded-md border bg-background p-2`,value:_,onChange:e=>v(e.target.value),placeholder:`img*`})]})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Targets`}),C===null&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading backends…`}),C!==null&&!ne.length&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:`No writable backend available. Add a folder or drive under Files & storage first.`}),y.map((e,t)=>{let n=re.get(e.backend),r=s===`mirror`&&!!n&&ON.has(n.driver);return(0,Z.jsxs)(`fieldset`,{disabled:D||T,className:`space-y-2 rounded-lg border p-2 text-sm`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`select`,{"aria-label":`Backend`,className:`min-w-0 flex-1 rounded-md border bg-background p-2`,value:e.backend,onChange:e=>z(t,e.target.value),children:[!e.backend&&(0,Z.jsx)(`option`,{value:``,children:`Choose a backend…`}),ne.map(e=>(0,Z.jsxs)(`option`,{value:e.address,children:[e.address,` (`,e.driver,`)`]},e.address)),e.backend&&!n&&(0,Z.jsxs)(`option`,{value:e.backend,children:[e.backend,` (unavailable)`]})]}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Remove target`,onClick:()=>b(e=>e.filter((e,n)=>n!==t)),className:`p-1 disabled:opacity-40`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-folder-${t}`,children:`Folder on the backend`}),(0,Z.jsx)(`input`,{id:`policy-folder-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:e.folder,onChange:e=>ae(t,{folder:e.target.value}),placeholder:`(backend root)`})]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:e.recursive,onChange:e=>ae(t,{recursive:e.target.checked}),className:`mt-1`}),`Recreate sub-folder path in destination`]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 ${r?``:`opacity-60`}`,title:r?void 0:`Empty folders require a mirror on a supported file backend.`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:r&&e.recreateDirectories,disabled:!r,onChange:e=>ae(t,{recreateDirectories:e.target.checked}),className:`mt-1`}),`Create folders on the backend`]}),(0,Z.jsxs)(`details`,{children:[(0,Z.jsx)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:`Advanced`}),(0,Z.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[s===`filing`&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-key-${t}`,children:`File-name template (optional)`}),(0,Z.jsx)(`input`,{id:`policy-key-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2 font-mono text-xs`,value:e.key??``,onChange:e=>ae(t,{key:e.target.value}),placeholder:`{{YYYY}}{{MM}}{{DD}}_{{basename}}{{ext}}`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-conflict-${t}`,children:`On name conflict`}),(0,Z.jsxs)(`select`,{id:`policy-conflict-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:e.onConflict??`error`,onChange:e=>ae(t,{onConflict:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`error`,children:`Stop with an error`}),(0,Z.jsx)(`option`,{value:`rename`,children:`Rename the new file`}),n?.driver===`file`&&(0,Z.jsx)(`option`,{value:`overwrite`,children:`Overwrite (retain previous bytes)`})]})]})]})]})]},t)}),!T&&(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:D||!ne.length,onClick:()=>b(e=>[...e,HN(ne.find(t=>!e.some(e=>e.backend===t.address))??ne[0],R)]),children:[(0,Z.jsx)(br,{className:`mr-1 h-4 w-4`}),`Add target…`]})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Applies to existing and future documents. Transfer progress and errors appear in Storage policies settings.`}),D&&(0,Z.jsx)(`p`,{role:`status`,className:`text-sm`,children:T?`Applying to existing documents… ${N} planned, ${ee} folders`:`Saving storage policy…`}),k&&(0,Z.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[`Storage policy saved. `,N,` documents and `,ee,` folders planned. Replication continues in the background.`]}),I>0&&(0,Z.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[I,` document operations failed. Check operation status in Storage policies settings.`]}),j&&(0,Z.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[T?`The policy is saved. `:``,j]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t p-3`,children:[(0,Z.jsx)(Y,{variant:`ghost`,disabled:D,onClick:L,children:`Cancel`}),k?(0,Z.jsx)(Y,{onClick:r,children:`Done`}):(0,Z.jsx)(Y,{disabled:D||!B,onClick:se,children:D?`Applying…`:T?`Retry existing documents`:a?`Save policy`:`Enable policy`})]})]})})}var WN={policies:[],revision:``,loading:!1,error:``},GN=new Map,KN=new Set;function qN(){for(let e of KN)e()}function JN(e){return KN.add(e),()=>{KN.delete(e)}}function YN(e,t){GN.set(e,t),qN()}async function XN(e){YN(e,{...GN.get(e)??WN,loading:!0,error:``});try{let{policies:t,revision:n,status:r}=await NN(e);YN(e,{policies:t,revision:n,status:r,loading:!1,error:``})}catch(t){YN(e,{policies:[],revision:``,loading:!1,error:t instanceof Error?t.message:`Could not load storage policies`})}}function ZN(e){GN.delete(e),qN()}function QN(e){let t=(0,X.useSyncExternalStore)(JN,()=>e&&GN.get(e)||WN),n=!!e&&!GN.has(e);(0,X.useEffect)(()=>{e&&n&&XN(e)},[e,n]);let r=(0,X.useCallback)(async()=>{e&&await XN(e)},[e]);return(0,X.useEffect)(()=>{if(!e||!t.policies.length)return;let n=window.setInterval(()=>{!document.hidden&&!GN.get(e)?.loading&&XN(e)},5e3);return()=>window.clearInterval(n)},[e,t.policies.length]),{policies:t.policies,revision:t.revision,status:t.status,loading:t.loading,error:t.error,refresh:r}}function $N({checked:e,disabled:t,onClick:n,label:r}){return(0,Z.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":e,"aria-label":r,disabled:t,onClick:n,className:`relative inline-flex h-5 w-9 shrink-0 rounded-full border-2 border-transparent transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${e?`bg-primary`:`bg-muted-foreground/30`}`,children:(0,Z.jsx)(`span`,{className:`pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow transition-transform ${e?`translate-x-4`:`translate-x-0`}`})})}function eP({children:e,title:t}){return(0,Z.jsx)(`span`,{title:t,className:`rounded border px-1 py-px text-[10px] uppercase tracking-wide text-muted-foreground`,children:e})}function tP(e){let t=e.filter;return!t||!t.mime&&!t.filename&&(!t.schema||t.schema===`file`)?`Files`:t.mime===`image/*`&&!t.filename?`Images`:[t.schema&&t.schema!==`file`?t.schema:null,t.mime,t.filename].filter(Boolean).join(` · `)}function nP({workspaceId:e}){let{policies:t,revision:n,status:r,loading:i,error:a,refresh:o}=QN(e),{showToast:s}=wo(),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(``),m=(e,t)=>s({title:`Error`,description:e instanceof Error?e.message:t,variant:`destructive`}),h=async r=>{d(r.id);try{await PN(e,t.map(e=>e.id===r.id?{...e,enabled:!e.enabled}:e),n),ZN(e)}catch(e){m(e,`Could not update the policy`)}finally{d(null)}},g=async r=>{if(window.confirm(`Delete the storage policy for "${r.path}"? Files already placed on the targets stay where they are.`)){d(r.id);try{await PN(e,t.filter(e=>e.id!==r.id),n),ZN(e)}catch(e){m(e,`Could not delete the policy`)}finally{d(null)}}},_=async t=>{d(t.id),p(`Applying…`);try{let n=await LN(e,t.id,(e,t)=>p(`Applying… ${t.matched} planned, ${t.folders} folders`));s({title:n.failed?`Planning errors`:`Replication queued`,description:`${n.matched} documents and ${n.folders} folders planned${n.failed?`, ${n.failed} failed — see operation status`:``}.`,variant:n.failed?`destructive`:void 0}),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`))}catch(e){m(e,`Could not apply the policy`)}finally{d(null),p(``)}};return(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(gr,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Storage policies`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`A mirror keeps filed documents on its targets and moves removed copies to Trash. A filing policy makes copies that stay on the targets. Uploads are kept locally until every required destination has been verified.`}),r?.error&&(0,Z.jsx)(`p`,{role:`alert`,className:`mt-2 text-xs text-destructive`,children:r.error.message}),r?.operations?.operations.filter(e=>e.state!==`complete`).map(t=>(0,Z.jsxs)(`div`,{className:`mt-2 rounded border p-2 text-xs`,children:[(0,Z.jsxs)(`p`,{children:[t.owner,`: `,t.state]}),(0,Z.jsx)(`p`,{children:t.error?.message}),t.outcomes.map(e=>(0,Z.jsxs)(`p`,{children:[e.backend,`:`,e.key,` — `,e.state]},`${e.backend}:${e.key}`)),t.state===`blocked`&&(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>{BN(e,t.id).then(o).catch(e=>m(e,`Retry failed`))},children:`Retry`})]},t.id)),a&&(0,Z.jsx)(`p`,{role:`alert`,className:`mt-2 text-xs text-destructive`,children:a})]}),i&&!t.length&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading…`}),!i&&!t.length&&(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(gr,{className:`mx-auto h-6 w-6 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`mt-2 text-sm`,children:`No storage policies yet.`}),(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Right-click a folder in the context or directory tree and choose `,(0,Z.jsx)(`span`,{className:`font-medium text-foreground`,children:`Storage policy…`}),` to mirror it to a backend.`]})]}),t.map(e=>{let t=u===e.id;return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4 ${e.enabled?``:`opacity-70`}`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`h3`,{className:`break-all font-mono text-sm font-semibold`,children:e.path}),e.recursive&&(0,Z.jsx)(eP,{children:`subfolders`}),(0,Z.jsx)(eP,{children:tP(e)}),!e.enabled&&(0,Z.jsx)(eP,{children:`disabled`})]}),e.description&&(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}),(0,Z.jsx)(`ul`,{className:`mt-2 space-y-1`,children:e.targets.map((e,t)=>(0,Z.jsxs)(`li`,{className:`flex flex-wrap items-center gap-2 text-xs`,children:[(0,Z.jsx)(`span`,{className:`font-mono`,children:MN(e)}),e.recursive&&(0,Z.jsx)(eP,{children:`sub-path`}),e.recreateDirectories&&(0,Z.jsx)(eP,{children:`folders`}),e.key&&(0,Z.jsx)(eP,{title:e.key,children:`named`}),e.onConflict&&e.onConflict!==`error`&&(0,Z.jsx)(eP,{children:e.onConflict})]},`${e.backend}:${t}`))}),t&&f&&(0,Z.jsx)(`p`,{role:`status`,className:`mt-2 text-xs text-muted-foreground`,children:f})]}),(0,Z.jsx)($N,{checked:e.enabled,disabled:t,onClick:()=>h(e),label:e.enabled?`Disable policy`:`Enable policy`})]}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:t,onClick:()=>l(e),children:[(0,Z.jsx)(Lr,{className:`mr-1 h-3.5 w-3.5`}),`Edit`]}),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:t||!e.enabled,onClick:()=>_(e),children:[(0,Z.jsx)(Ar,{className:`mr-1 h-3.5 w-3.5`}),`Apply to existing`]}),(0,Z.jsxs)(Y,{variant:`ghost`,size:`sm`,onClick:()=>{o()},children:[(0,Z.jsx)(ui,{className:`mr-1 h-3.5 w-3.5`}),`Refresh status`]}),(0,Z.jsxs)(Y,{variant:`ghost`,size:`sm`,disabled:t,className:`text-destructive`,onClick:()=>g(e),children:[(0,Z.jsx)(Qr,{className:`mr-1 h-3.5 w-3.5`}),`Delete`]})]})]},e.id)}),c&&(0,Z.jsx)(UN,{workspaceId:e,path:c.path,policy:c,onClose:()=>l(null),onSaved:()=>{ZN(e),o()}})]})}var rP=e=>`${no.workspaces}/${encodeURIComponent(e)}`;async function iP(e){return await J.get(`${rP(e)}/mirrors`)||[]}async function aP(e,t){await J.delete(`${rP(e)}/mirrors/${encodeURIComponent(t)}`)}async function oP(e,t=10){return J.get(`${rP(e)}/mirrors/protection?sample=${t}`)}async function sP(e,t,n){return(await J.patch(`${rP(e)}/mirrors/${encodeURIComponent(t)}`,n)).replica}async function cP(e){return await J.get(`${rP(e)}/sync/conflicts`)||[]}async function lP(e,t,n){return J.post(`${rP(e)}/sync/conflicts/${t}/resolve`,{keep:n})}var uP=e=>{if(e==null||e===``)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})},dP=e=>e==null?`—`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:e<1073741824?`${(e/1024/1024).toFixed(1)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`,fP=e=>e?e.slice(0,12):`—`;function pP({mirror:e,now:t,busy:n,onForget:r,onRequired:i}){let a=e.mirror,o=!e.lastSeen||t-new Date(e.lastSeen).getTime()>6e5,s=e.replica?.role===`cache`||a.client===`fuse`,c=e.replica?.required===!0,l=a.direction||(a.client===`fuse`?`bi`:void 0);return(0,Z.jsx)(`div`,{className:`rounded-lg border p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Z.jsx)(Ha,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:e.name||e.deviceId}),a.client&&(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono uppercase`,children:a.client}),l&&(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono`,title:l===`pull`?`Backup target: the hub is the only writer`:l===`push`?`One-shot import: local is the only writer`:`Both ways`,children:l===`pull`?`⇣ pull`:l===`push`?`⇡ push`:`⇅ bi`}),c&&(0,Z.jsx)(`span`,{className:`rounded bg-emerald-500/15 px-1.5 py-0.5 text-[10px] font-mono text-emerald-700 dark:text-emerald-300`,title:`Counts toward protection`,children:`required`}),(0,Z.jsx)(`span`,{className:`rounded px-1.5 py-0.5 text-[10px] font-mono ${o?`bg-muted text-muted-foreground`:`bg-emerald-500/15 text-emerald-700 dark:text-emerald-300`}`,children:a.state||(o?`offline`:`online`)})]}),a.path&&(0,Z.jsx)(`p`,{className:`mt-0.5 text-[11px] font-mono text-muted-foreground truncate`,children:a.path}),(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-x-4 gap-y-0.5 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{title:`Change-log entries the device has not applied yet`,children:[`lag `,e.lag??`—`]}),(0,Z.jsxs)(`span`,{title:`Local changes waiting to be pushed`,children:[`pending `,a.pending??0]}),(a.failed??0)>0&&(0,Z.jsxs)(`span`,{className:`text-destructive`,children:[`failed `,a.failed]}),(a.conflicts??0)>0&&(0,Z.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`conflicts `,a.conflicts]}),(a.skipped??0)>0&&(0,Z.jsxs)(`span`,{children:[`skipped `,a.skipped]}),(a.reverted??0)>0&&(0,Z.jsxs)(`span`,{title:`Local edits parked in .workspace/conflicts and replaced by the hub version`,children:[`reverted `,a.reverted]}),e.behind!=null&&(0,Z.jsxs)(`span`,{title:`Documents whose current version this device does not hold yet`,className:e.behind>0&&c?`text-amber-600 dark:text-amber-400`:``,children:[`behind `,e.behind]}),(0,Z.jsxs)(`span`,{children:[`last sync `,uP(a.lastSync)]}),(0,Z.jsxs)(`span`,{children:[`seen `,uP(e.lastSeen)]}),a.prefixes&&a.prefixes.length>0&&(0,Z.jsx)(`span`,{className:`font-mono`,children:a.prefixes.join(`, `)})]}),a.lastError&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-destructive`,children:a.lastError}),(0,Z.jsxs)(`label`,{className:`mt-2 flex items-center gap-2 text-[11px] ${s?`text-muted-foreground`:``}`,title:s?`A cache never counts toward protection`:`A document is protected once every required replica holds its current version`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`h-3 w-3`,checked:c,disabled:n||s,onChange:e=>i(e.target.checked)}),`required for protection`]})]})]}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:r,disabled:n,title:`Forget this mirror record (the device is not revoked)`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})})}function mP({p:e}){let t=e.required.length===0,n=e.unprotected??0,r=t||n>0?ha:Fi,i=t?`text-muted-foreground`:n>0?`text-amber-600 dark:text-amber-400`:`text-emerald-700 dark:text-emerald-300`;return(0,Z.jsx)(`div`,{className:`rounded-lg border p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Z.jsx)(r,{className:`h-4 w-4 mt-0.5 shrink-0 ${i}`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 text-[11px]`,children:[t?(0,Z.jsxs)(`p`,{className:`text-sm`,children:[`No replica is marked `,(0,Z.jsx)(`span`,{className:`font-medium`,children:`required`}),` yet — nothing is counted as protected. Tick it on the device that must hold every document (the backup).`]}):(0,Z.jsxs)(`p`,{className:`text-sm`,children:[(0,Z.jsxs)(`span`,{className:`font-medium ${i}`,children:[e.protected??0,` of `,e.total-e.unversioned]}),` documents are held at their current version by every required replica`,n>0&&(0,Z.jsxs)(`span`,{className:i,children:[` · `,n,` not yet`]}),e.partial&&(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[` (first `,e.total,` checked)`]})]}),e.oldestUnprotected.length>0&&(0,Z.jsxs)(`ul`,{className:`mt-1 space-y-0.5 font-mono text-muted-foreground`,children:[e.oldestUnprotected.slice(0,5).map(e=>(0,Z.jsxs)(`li`,{className:`truncate`,title:`document ${e.docId} v${e.version}`,children:[e.key,` `,(0,Z.jsxs)(`span`,{className:`opacity-70`,children:[`· `,uP(e.mtime)]})]},`${e.docId}:${e.key}`)),e.oldestUnprotected.length>5&&(0,Z.jsxs)(`li`,{children:[`… and `,e.oldestUnprotected.length-5,` more`]})]})]})]})})}function hP({conflict:e,busy:t,onResolve:n}){let r=!e.hub;return(0,Z.jsxs)(`div`,{className:`rounded-lg border p-3 space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Z.jsx)(dr,{className:`h-4 w-4 text-amber-500 mt-0.5 shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium font-mono break-all`,children:e.key}),(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`from `,(0,Z.jsx)(`span`,{className:`font-medium`,children:e.deviceName||e.device||`unknown device`}),` · `,uP(e.ts),e.mode===`rename`&&e.conflictKey&&(0,Z.jsxs)(Z.Fragment,{children:[` · already on disk as `,(0,Z.jsx)(`span`,{className:`font-mono`,children:e.conflictKey})]})]})]})]}),(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 gap-2 text-[11px] sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`rounded border border-dashed p-2`,children:[(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`Hub version (keeps the name)`}),e.hub?(0,Z.jsxs)(`div`,{className:`font-mono`,children:[fP(e.hub.sha256),` · `,dP(e.hub.size),` · `,uP(e.hub.mtime)]}):(0,Z.jsx)(`div`,{className:`italic text-muted-foreground`,children:`no file at this key any more`})]}),(0,Z.jsxs)(`div`,{className:`rounded border border-dashed p-2`,children:[(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`Incoming version (the device’s)`}),(0,Z.jsxs)(`div`,{className:`font-mono`,children:[fP(e.incoming.sha256),` · `,dP(e.incoming.size),` · `,uP(e.incoming.mtime)]})]})]}),e.resolvable?(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t||r,onClick:()=>n(`hub`),title:`Discard the device's version`,children:`Keep hub`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:()=>n(`incoming`),title:`The device's bytes replace the hub's; tags, relations and placements move over`,children:`Keep incoming`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:()=>n(`both`),title:`Keep the hub file and add the device's version under a conflict name`,children:`Keep both`})]}):(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Dropbox-style conflict copy: both files are on disk, delete the one you do not need.`})]})}function gP({workspaceId:e,workspaceUuid:t}){let{showToast:n}=wo(),[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)([]),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(0),h=(0,X.useRef)(null),g=(0,X.useCallback)(async(t=!1)=>{if(e){t||u(!0);try{let[t,n,r]=await Promise.all([iP(e),cP(e),oP(e).catch(()=>null)]);i(t),o(n),c(r),m(Date.now())}catch(e){t||n({title:`Error`,description:e instanceof Error?e.message:`Failed to load sync state`,variant:`destructive`})}finally{t||u(!1)}}},[e]);(0,X.useEffect)(()=>{g()},[g]),(0,X.useEffect)(()=>{if(!t)return;let e=`workspace:${t}`,n=()=>B.emit(`subscribe`,{channel:e}),r=B.on(`connect`,n);n();let i=e=>{let n=e;n?.workspaceId&&n.workspaceId!==t||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,g(!0)},800))},a=[`backend.changed`,`sync.conflict.created`,`sync.conflict.resolved`].map(e=>B.on(e,i));return()=>{r(),a.forEach(e=>e()),B.emit(`unsubscribe`,{channel:e}),h.current&&=(clearTimeout(h.current),null)}},[t,g]);let _=async t=>{f(`mirror:${t}`);try{await aP(e,t),i(e=>e.filter(e=>e.deviceId!==t)),n({title:`Forgotten`,description:`Mirror record removed. The device keeps running and will report again if it still syncs this workspace.`})}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to forget mirror`,variant:`destructive`})}finally{f(null)}},v=async(t,r)=>{f(`mirror:${t}`);try{let n=await sP(e,t,{required:r});i(e=>e.map(e=>e.deviceId===t?{...e,replica:{role:n.role,required:n.required}}:e)),c(await oP(e).catch(()=>null))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to update replica policy`,variant:`destructive`})}finally{f(null)}},y=async(t,r)=>{f(`conflict:${t.docId}`);try{let i=await lP(e,t.docId,r);o(e=>e.filter(e=>e.docId!==t.docId));let a=r===`hub`?`kept the hub version`:r===`incoming`?`the device version now holds the name`:`kept both (${i.resultKey||`conflict copy`})`;n({title:`Resolved`,description:`${t.key}: ${a}`})}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to resolve conflict`,variant:`destructive`})}finally{f(null)}};return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Device mirrors`}),(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Devices keeping this workspace’s files in sync (canvas-fuse `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`--mirror`}),`, canvas-edge). Lag counts change-log entries the device has not applied yet.`]})]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>g(),disabled:l,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${l?`animate-spin`:``}`}),`Refresh`]})]}),l&&r.length===0&&a.length===0?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):r.length===0?(0,Z.jsxs)(`div`,{className:`rounded-lg border border-dashed p-4 text-xs text-muted-foreground`,children:[`No device mirrors this workspace yet. Mount it with `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`canvas-fuse mount -w <workspace> ~/Workspaces --mirror`}),` on a device and it shows up here.`]}):(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[s&&(0,Z.jsx)(mP,{p:s}),r.map(e=>(0,Z.jsx)(pP,{mirror:e,now:p,busy:d===`mirror:${e.deviceId}`,onForget:()=>_(e.deviceId),onRequired:t=>v(e.deviceId,t)},e.deviceId))]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Conflicts`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`A device and the hub both changed the same file. The hub’s version keeps the filename; decide what happens to the device’s. Tags, relations and placements follow whichever version survives.`})]}),a.length===0?(0,Z.jsx)(`div`,{className:`rounded-lg border border-dashed p-4 text-xs text-muted-foreground`,children:`Nothing to resolve.`}):(0,Z.jsx)(`div`,{className:`space-y-2`,children:a.map(e=>(0,Z.jsx)(hP,{conflict:e,busy:d===`conflict:${e.docId}`,onResolve:t=>y(e,t)},e.docId))})]})}function _P({workspaceId:e,address:t,selectedChats:n=[],onSaved:r}){let[i,a]=(0,X.useState)(n),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(``);return(0,X.useEffect)(()=>{if(!c)return;let n=!1,r,i=async()=>{try{let r=await ue(e,t);n||(d(r),p(``))}catch(e){n||p(e instanceof Error?e.message:`Connection unavailable`)}n||(r=setTimeout(()=>void i(),3e3))};return i(),()=>{n=!0,clearTimeout(r)}},[e,t,c]),(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>{c||a(n),l(!c)},children:c?`Close connection panel`:`Pair / connection status`}),c&&(0,Z.jsxs)(`div`,{className:`space-y-2 p-2 text-xs`,children:[(0,Z.jsx)(`p`,{children:f||u?.state||`Connecting…`}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>{window.confirm(`Forget the current session and pair this account again?`)&&rn(e,t).catch(e=>p(e.message))},children:`Pair again`}),u?.qr&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{children:`WhatsApp → Settings → Linked devices → Link a device.`}),(0,Z.jsx)(`img`,{className:`max-w-full`,src:u.qr,width:256,height:256,alt:`WhatsApp device pairing QR code`})]}),u?.chats.length?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{children:`Select conversations to synchronize into this workspace.`}),(0,Z.jsx)(`div`,{className:`max-h-48 overflow-auto`,children:u.chats.map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,disabled:o,checked:i.includes(e.id),onChange:t=>a(n=>t.target.checked?[...n,e.id]:n.filter(t=>t!==e.id))}),e.name,` · `,(0,Z.jsx)(`code`,{children:e.id})]},e.id))}),(0,Z.jsx)(Y,{size:`sm`,disabled:o,onClick:async()=>{s(!0),p(``);try{await Fo(e,`whatsapp`,t,{chats:i}),await r?.()}catch(e){p(e instanceof Error?e.message:`Could not save conversations`)}finally{s(!1)}},children:o?`Saving…`:`Save conversations and sync`}),!i.length&&(0,Z.jsx)(`p`,{children:`No conversations selected; messages will not be synchronized.`})]}):null]})]})}async function vP(){return(await J.get(`/oauth/google/redirect-uri`)).redirectUri}async function yP(e){let t=window.open(`about:blank`,`canvas-google-oauth`,`popup=yes,width=540,height=720`),n;try{n=await J.post(`/oauth/google/start`,e)}catch(e){throw t?.close(),e}if(!t)throw Error(`Popup blocked — allow popups for this site and try again`);t.location.href=n.url;let r=new URL(yo,window.location.origin).origin;return new Promise((e,i)=>{let a=!1,o=e=>{a||(a=!0,window.removeEventListener(`message`,s),window.clearInterval(c),window.clearTimeout(l),e())},s=t=>{if(t.origin!==r)return;let a=t.data;!a||a.type!==`canvas:oauth`||a.provider!==`google`||a.state!==n.state||(a.ok&&a.refreshToken?o(()=>e({refreshToken:a.refreshToken,account:a.account})):o(()=>i(Error(a.error||`Google sign-in failed`))))};window.addEventListener(`message`,s);let c=window.setInterval(()=>{t.closed&&window.setTimeout(()=>o(()=>i(Error(`Sign-in window closed before finishing`))),500)},500),l=window.setTimeout(()=>o(()=>{t.close(),i(Error(`Sign-in timed out`))}),n.expiresInMs||6e5)})}function bP({clientId:e,clientSecret:t,scope:n,onLinked:r,disabled:i}){let[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(null),{showToast:l}=wo(),u=e.trim().length>0&&t.trim().length>0;(0,X.useEffect)(()=>{let e=!1;return vP().then(t=>{e||c(t)}).catch(()=>{}),()=>{e=!0}},[]);let d=async()=>{o(!0);try{let i=await yP({clientId:e.trim(),clientSecret:t.trim(),scope:n});r(i),l({title:`Google account linked`,description:i.account?`Refresh token obtained for ${i.account}`:`Refresh token obtained`})}catch(e){l({title:`Google sign-in failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{o(!1)}};return(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:i||a||!u,onClick:()=>{d()},title:u?`Open the Google consent screen and fill in the refresh token`:`Enter the OAuth client id and secret first`,children:[(0,Z.jsx)(f,{icon:`mdi:google`,width:14,height:14,className:`mr-2`}),a?`Waiting for Google…`:`Sign in with Google to get a refresh token`]}),s&&(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground/80 break-all`,children:[`Register this redirect URI on the OAuth client (Google Cloud Console → Credentials → your Web application client → Authorized redirect URIs):`,` `,(0,Z.jsx)(`code`,{className:`select-all`,children:s})]})]})}var xP={git:{label:`Git repository`,icon:`mdi:git`,blurb:`Create a local repository or clone a remote into the workspace. Branches appear under Backends → Workspace → Git. Use Auto-Link on a branch or folder afterward to file its documents into a virtual tree.`,fields:[{key:`address`,label:`Repository name`,placeholder:`company-ui`,required:!0},{key:`url`,label:`Remote URL`,placeholder:`git@github.com:company/ui.git`,hint:`Leave empty for a local repository. Private repos use the server’s SSH keys or Git credential helper.`},{key:`branches`,label:`Branches to browse (empty means all)`,list:!0,placeholder:`main, jira-1234/myusername-int-qf`}]},github:{label:`GitHub Issues`,icon:`mdi:github`,blurb:`Issues from the listed github.com or GitHub Enterprise repos sync as todos. Token optional for public repos.`,fields:[{key:`address`,label:`Account label`,placeholder:`e.g. canvas-ui`,required:!0},{key:`baseUrl`,label:`GitHub Enterprise URL`,placeholder:`https://ghe.example.com`,hint:`Leave blank for github.com. Works with GitHub Enterprise Server (ghe.example.com) and GHE.com (yourco.ghe.com) — the web address is enough.`},{key:`token`,label:`Personal access token`,hint:`Optional for public repos; required for write-back and @me filters.`,secret:!0},{key:`repos`,label:`Repositories`,placeholder:`owner/repo, one per line`,hint:`owner/repo or the repo’s URL. Issues from each repo sync as todos.`,list:!0,required:!0},{key:`assignee`,label:`Only issues assigned to`,placeholder:`@me, a login, * or none`,hint:`Filters are applied by GitHub and combined with AND. Changing one re-syncs from scratch.`},{key:`creator`,label:`Only issues opened by`,placeholder:`@me or a login`},{key:`mentioned`,label:`Only issues mentioning`,placeholder:`@me or a login`},{key:`labels`,label:`Only issues with all of these labels`,placeholder:`one per line`,list:!0},{key:`openOnly`,label:`Skip closed issues on first import`,hint:`Issues closed later still sync as completed.`,bool:!0},{key:`writeBack`,label:`Manage issues from Canvas`,hint:`Create, edit and close issues. Needs a PAT with repo scope.`,bool:!0},{key:`pruneRemoved`,label:`Remove items deleted at the source`,hint:`After each sync, issues that no longer exist in the repo are dropped from the mirror (kept as location-less orphans until database retention GC; skipped whenever the repo can’t be fully listed).`,bool:!0}]},slack:{label:`Slack`,icon:`mdi:slack`,blurb:`Channel messages sync as message documents. Bot/user token with channels:read + channels:history.`,fields:[{key:`address`,label:`Workspace label`,placeholder:`e.g. acme`,required:!0},{key:`token`,label:`Token (xoxb-… / xoxp-…)`,secret:!0,required:!0},{key:`channels`,label:`Conversations (channel names or IDs; DM IDs need im:read + im:history)`,list:!0},{key:`directMessages`,label:`Include direct messages`,hint:`Requires im:read, im:history, mpim:read and mpim:history.`,bool:!0},{key:`writeBack`,label:`Allow sending from Canvas`,hint:`Token also needs chat:write.`,bool:!0},{key:`allowAgentSend`,label:`Allow agents with workspace write access to send`,bool:!0}]},whatsapp:{label:`WhatsApp (linked device)`,icon:`mdi:whatsapp`,blurb:`Pair your phone with Canvas, then choose conversations. Uses Baileys; separate from WhatsApp Business.`,fields:[{key:`address`,label:`Account label`,placeholder:`personal`,hint:`Any unique label; no phone number required. Keep it unchanged after pairing.`,required:!0},{key:`chats`,label:`Conversation IDs to sync (one per line; available after pairing)`,list:!0},{key:`writeBack`,label:`Allow sending from Canvas`,bool:!0},{key:`allowAgentSend`,label:`Allow agents with workspace write access to send`,bool:!0}]},gcal:{label:`Google Calendar`,icon:`mdi:calendar-month`,blurb:`Events sync as calendar entries (recurring series kept as series). Offline-access OAuth credentials.`,fields:[{key:`address`,label:`Account label`,placeholder:`e.g. me-gmail`,required:!0},{key:`clientId`,label:`OAuth client id`,required:!0},{key:`clientSecret`,label:`OAuth client secret`,secret:!0,required:!0},{key:`refreshToken`,label:`Refresh token`,secret:!0,required:!0,oauth:`google`,oauthScope:`calendar.readonly`},{key:`calendars`,label:`Calendar ids (empty = primary)`,list:!0}]},caldav:{label:`CalDAV`,icon:`mdi:calendar-sync`,blurb:`Any CalDAV endpoint (GroupOffice, Nextcloud, Radicale, SOGo…). Read-only by default; enable write-back to create events from Canvas.`,fields:[{key:`address`,label:`Account label`,placeholder:`e.g. groupoffice`,required:!0},{key:`url`,label:`CalDAV URL (calendar home or one calendar)`,placeholder:`https://host/caldav/user`,required:!0},{key:`username`,label:`Username`},{key:`password`,label:`Password`,secret:!0},{key:`calendars`,label:`Calendars (names, empty = all)`,list:!0},{key:`writeBack`,label:`Create events from Canvas`,hint:`Write-back into the CalDAV calendar.`,bool:!0}]},teams:{label:`MS Teams`,icon:`mdi:microsoft-teams`,blurb:`Channel messages via Microsoft Graph (app-only credentials, admin-consented ChannelMessage.Read.All).`,fields:[{key:`address`,label:`Tenant label`,placeholder:`e.g. corp`,required:!0},{key:`tenantId`,label:`Tenant id`,required:!0},{key:`clientId`,label:`Client id`,required:!0},{key:`clientSecret`,label:`Client secret`,secret:!0,required:!0},{key:`teams`,label:`Team ids (one per line)`,list:!0,required:!0}]}};function SP(e){return e.split(/[\n,]/).map(e=>e.trim()).filter(Boolean)}function CP({workspaceId:e}){let{showToast:t}=wo(),[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)({}),[u,d]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),h=(0,X.useCallback)(async()=>{let t=await Rc(e).catch(()=>[]);r(t.filter(e=>e.kind===`connector`))},[e]),g=async()=>{m(!0);try{await h()}finally{m(!1)}};(0,X.useEffect)(()=>{let t=!1;return Rc(e).then(e=>{t||r(e.filter(e=>e.kind===`connector`))}).catch(()=>{}),()=>{t=!0}},[e]);let _=n.some(e=>e.status===`syncing`);(0,X.useEffect)(()=>{if(!_)return;let e=setInterval(()=>{h()},4e3);return()=>clearInterval(e)},[_,h]);let v=e=>{let t=xP[e.driver];if(!t)return;let n=e.config||{},r={};for(let i of t.fields){if(i.key===`address`){r.address=e.address;continue}if(i.secret)continue;if(i.key===`writeBack`){r.writeBack=n.readOnly===!1&&(![`slack`,`whatsapp`].includes(e.driver)||n.sendEnabled===!0)?`true`:``;continue}let t=n[i.key];if(i.list){r[i.key]=Array.isArray(t)?t.join(`
|
|
44
|
-
`):``;continue}t!=null&&(r[i.key]=String(t))}l(r),a(e.driver),s(e)},y=()=>{a(null),s(null),l({})},b=async()=>{if(!i)return;let n=xP[i],r={};for(let e of n.fields){let n=(c[e.key]||``).trim();if(!n){if(e.required&&!(o&&e.secret)){t({title:`${e.label} is required`,variant:`destructive`});return}o&&!e.secret&&(r[e.key]=e.list?[]:!e.bool&&``);continue}r[e.key]=e.list?SP(n):e.bool?n===`true`:n}n.fields.some(e=>e.key===`writeBack`)&&([`slack`,`whatsapp`].includes(i)&&(r.sendEnabled=r.writeBack===!0),r.readOnly=r.writeBack!==!0,delete r.writeBack),i===`git`&&(r.enabled=!0),d(!0);try{o?await Fo(e,o.driver,o.address,r):await Zs(e,i,r),y(),await h(),t({title:o?`Connector updated; sync restarted`:`Connector saved; first sync started`})}catch(e){t({title:`Failed to save connector`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{d(!1)}},x=async n=>{try{n.driver===`git`&&n.enabled===!1?await Fo(e,n.driver,n.address,{enabled:!0}):await Js(e,n.driver,n.address),t({title:`Syncing ${n.driver}/${n.address}`}),setTimeout(()=>{h()},1500)}catch(e){t({title:`Sync failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}},S=async n=>{let r=n.driver===`git`?`Stop syncing ${n.address}? Its checkout and existing tree documents will stay available.`:`Remove ${n.driver}/${n.address}? Synced documents stay in the backends tree until purged.`;if(window.confirm(r))try{await Xo(e,n.driver,n.address),await h()}catch(e){t({title:`Remove failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}};return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Connectors`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Git repositories, GitHub issues, Slack, Google Calendar, CalDAV and MS Teams, polled into the backends tree (read-only unless write-back is enabled).`})]}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:p,onClick:()=>{g()},title:`Refresh`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5 ${p?`animate-spin`:``}`})})]}),n.length>0&&(0,Z.jsx)(`div`,{className:`mt-3 space-y-2`,children:n.map(t=>{let n=xP[t.driver];return(0,Z.jsxs)(`div`,{className:`rounded-md border p-3`,children:[t.driver===`whatsapp`&&(0,Z.jsx)(_P,{workspaceId:e,address:t.address,selectedChats:Array.isArray(t.config?.chats)?t.config.chats:[],onSaved:h}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(f,{icon:n?.icon||`mdi:cloud-sync`,width:16,height:16,className:`shrink-0`}),(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:n?.label||t.driver}),(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:t.address}),(0,Z.jsx)(`span`,{className:`flex-1`}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t.status===`syncing`,onClick:()=>{x(t)},children:[(0,Z.jsx)(Er,{className:`mr-1 h-3 w-3 ${t.status===`syncing`?`animate-spin`:``}`}),t.status===`syncing`?`Syncing`:t.driver===`git`&&t.enabled===!1?`Resume sync`:`Sync now`]}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>v(t),title:`Edit connector`,children:(0,Z.jsx)(Lr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>{S(t)},disabled:t.driver===`git`&&t.enabled===!1,title:t.driver===`git`?`Stop syncing`:`Remove connector`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5 text-destructive`})})]}),(0,Z.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`status: `,t.status]}),t.lastSyncAt&&(0,Z.jsxs)(`span`,{children:[`last sync: `,new Date(t.lastSyncAt).toLocaleString()]}),t.treePath&&(0,Z.jsx)(`span`,{className:`font-mono`,children:t.treePath})]}),t.lastError&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-destructive`,children:t.lastError})]},`${t.driver}:${t.address}`)})}),i?(0,Z.jsxs)(`div`,{className:`mt-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(f,{icon:xP[i].icon,width:16,height:16}),(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:o?`Edit ${xP[i].label}`:xP[i].label}),o&&(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:o.address}),(0,Z.jsx)(`span`,{className:`flex-1`}),(0,Z.jsx)(`button`,{type:`button`,onClick:y,className:`p-1 text-muted-foreground hover:text-foreground`,"aria-label":`Cancel`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:xP[i].blurb}),(0,Z.jsx)(`div`,{className:`mt-2 grid gap-2 sm:grid-cols-2`,children:xP[i].fields.map(e=>(0,Z.jsxs)(`label`,{className:`text-xs ${e.list||e.bool?`sm:col-span-2`:``}`,children:[!e.bool&&(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:e.label}),e.bool?(0,Z.jsxs)(`span`,{className:`mt-1 flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:c[e.key]===`true`,onChange:t=>l(n=>({...n,[e.key]:t.target.checked?`true`:``})),className:`h-4 w-4 accent-primary`}),(0,Z.jsx)(`span`,{children:e.label})]}):e.list?(0,Z.jsx)(`textarea`,{value:c[e.key]||``,onChange:t=>l(n=>({...n,[e.key]:t.target.value})),placeholder:e.placeholder,rows:2,className:`mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`}):(0,Z.jsx)(q,{type:e.secret?`password`:`text`,value:c[e.key]||``,disabled:!!o&&e.key===`address`,onChange:t=>l(n=>({...n,[e.key]:t.target.value})),placeholder:o&&e.secret?`Leave blank to keep current`:e.placeholder,autoComplete:`off`,className:`mt-1 h-8 text-xs`}),e.hint&&(0,Z.jsx)(`span`,{className:`mt-0.5 block text-[11px] text-muted-foreground/80`,children:e.hint}),e.oauth===`google`&&(0,Z.jsx)(`span`,{className:`mt-1.5 block`,children:(0,Z.jsx)(bP,{clientId:c.clientId||``,clientSecret:c.clientSecret||``,scope:e.oauthScope||`calendar.readonly`,disabled:u,onLinked:({refreshToken:t,account:n})=>l(r=>({...r,[e.key]:t,address:(r.address||``).trim()||(n?n.replace(/[^a-z0-9]+/gi,`-`).replace(/^-|-$/g,``).toLowerCase():``)}))})})]},e.key))}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,className:`mt-3`,disabled:u,onClick:()=>{b()},children:u?`Saving…`:o?`Save changes & sync`:`Save & sync`})]}):(0,Z.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:Object.entries(xP).map(([e,t])=>(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{a(e),l({})},children:[(0,Z.jsx)(br,{className:`mr-1 h-3 w-3`}),(0,Z.jsx)(f,{icon:t.icon,width:14,height:14,className:`mr-1`}),t.label]},e))})]})}var wP={host:``,port:993,tls:!0,allowSelfSigned:!0,user:``,password:``,pollInterval:6e4,initialSyncDays:180,smtp:{enabled:!1,host:``,port:587,secure:!1,user:``,password:``,from:``,sentFolder:`Sent`,appendSent:!1,allowAgentSend:!1}};function TP(e){let t=e.config||{};return{host:String(t.host||``),port:Number(t.port??993),tls:t.tls!==!1,allowSelfSigned:t.allowSelfSigned!==!1,user:String(t.user||e.address),password:``,pollInterval:Number(t.pollInterval??6e4),initialSyncDays:Number(t.initialSyncDays??180),smtp:{...wP.smtp,...t.smtp||{},password:``}}}function EP(e,t,n,r){let{password:i,...a}=e.smtp;return{host:e.host.trim(),user:e.user.trim(),port:Number(e.port)||993,tls:e.tls,allowSelfSigned:e.allowSelfSigned,pollInterval:Number(e.pollInterval)||6e4,initialSyncDays:Math.max(0,Number(e.initialSyncDays)||0),smtp:{...a,...(!t||r)&&i?{password:i}:{}},...(!t||n)&&e.password?{password:e.password}:{}}}function DP({workspaceId:e,enabled:t}){let[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)([]);(0,X.useEffect)(()=>{let t=!0;return Rc(e).then(e=>{t&&a(e.filter(e=>e.kind===`storage`))}).catch(()=>{}),()=>{t=!1}},[e]);let[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(wP),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(!1),[v,y]=(0,X.useState)(!1),b=(0,X.useRef)(0),[x,S]=(0,X.useState)([]),[C,w]=(0,X.useState)([`INBOX`]),[T,E]=(0,X.useState)(!0),[D,O]=(0,X.useState)(!1),[k,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(null),{showToast:N,showProgress:P}=wo(),ee=(0,X.useMemo)(()=>[...n].sort((e,t)=>e.address.localeCompare(t.address)),[n]),F=(0,X.useMemo)(()=>n.find(e=>e.address===c)||null,[n,c]),I=(0,X.useCallback)(()=>Rc(e,`imap`).then(e=>r(e)).catch(e=>{N({title:`Error`,description:e instanceof Error?e.message:`Failed to load IMAP accounts`,variant:`destructive`})}).finally(()=>E(!1)),[e,N]),te=(0,X.useCallback)(async()=>{E(!0),await I()},[I]),[L,R]=(0,X.useState)(e);e!==L&&(R(e),E(!0),l(null),d(!1),p(wP),S([]),w([`INBOX`]),y(!1),h(!1),_(!1)),(0,X.useEffect)(()=>{I()},[I]),(0,X.useEffect)(()=>()=>{b.current++},[e]);let ne=(0,X.useCallback)(async(t,n)=>{let r=++b.current;O(!0);try{let i=t?await Rs(e,`imap`,t.address):await ns(e,`imap`,{host:(n?.host||``).trim(),port:Number(n?.port)||993,tls:n?.tls!==!1,allowSelfSigned:n?.allowSelfSigned!==!1,user:(n?.user||``).trim(),password:n?.password||``,folder:`INBOX`});r===b.current&&S(i.filter(e=>e.selectable))}catch(e){r===b.current&&N({title:`IMAP Error`,description:e instanceof Error?e.message:`Failed to discover folders`,variant:`destructive`})}finally{r===b.current&&O(!1)}},[e,N]),re=()=>{b.current++,O(!1),d(!1),l(null),p(wP),S([]),w([`INBOX`]),h(!1),_(!1),y(!1)},ie=e=>{if(!k){if(c===e.address){re();return}b.current++,O(!1),d(!1),l(e.address),p(TP(e)),S([]),w((e.containers||[]).map(e=>e.name)),h(!1),_(!1),y(!1)}},ae=()=>{re(),d(!0)},z=(e,t)=>{y(!0),p(n=>({...n,[e]:t}))},oe=e=>{y(!0),w(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},se=(0,X.useMemo)(()=>{let e=new Map(x.map(e=>[e.path,e]));for(let t of C)e.has(t)||e.set(t,{name:t,path:t,delimiter:`/`,selectable:!0,attributes:[]});return[...e.values()].sort((e,t)=>e.path.localeCompare(t.path))},[x,C]),B=async()=>{A(!0);try{let t=C.length?C:[`INBOX`],n=EP(f,!!F,m,g);if(F){await Fo(e,`imap`,F.address,n);let r=new Set((F.containers||[]).map(e=>e.name)),i=t.filter(e=>!r.has(e)),a=[...r].filter(e=>!t.includes(e));i.length&&await Ns(e,`imap`,F.address,i);for(let t of a)await Os(e,`imap`,F.address,t)}else{await Zs(e,`imap`,{...n,password:f.password,folder:t[0]});let r=f.user.trim();t.length>1&&await Ns(e,`imap`,r,t.slice(1))}await te(),d(!1),l(f.user.trim()),p({...f,password:``,smtp:{...f.smtp,password:``}}),h(!1),_(!1),y(!1),N({title:`Saved`,description:`IMAP account ${f.user.trim()} saved; sync runs in the background`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to save IMAP account`,variant:`destructive`})}finally{A(!1)}},ce=async()=>{if(!(!F||!window.confirm(`Delete IMAP account ${F.address} and all its folders?`))){M(`delete:${F.address}`);try{await Xo(e,`imap`,F.address),await te(),re(),N({title:`Deleted`,description:`IMAP account ${F.address} deleted`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to delete account`,variant:`destructive`})}finally{M(null)}}},V=async(t,n)=>{M(`${t}:${n}`);try{t===`test`?await jc(e,`imap`,n):await et(P,e,`imap`,n,e=>{r(t=>t.map(t=>t.address===n?e:t))}),await te(),t===`test`&&N({title:`Success`,description:`${n} saved account test completed`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to ${t}`,variant:`destructive`})}finally{M(null)}},le=async(t,n)=>{M(`folder-sync:${t}:${n}`);try{await js(e,`imap`,t,n),await te(),N({title:`Sync started`,description:`${t} · ${n} · rescanning the saved lookback window`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to sync folder`,variant:`destructive`})}finally{M(null)}},ue=(0,Z.jsxs)(`form`,{className:`grid gap-3`,autoComplete:`off`,"aria-label":`IMAP account settings`,onSubmit:e=>e.preventDefault(),children:[(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-host`,children:`Host`}),(0,Z.jsx)(q,{id:`imap-host`,name:`imap-host`,autoComplete:`off`,value:f.host,readOnly:!!F,onChange:e=>z(`host`,e.target.value),placeholder:`imap.example.com`})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-user`,children:`User (account)`}),(0,Z.jsx)(q,{id:`imap-user`,name:`imap-username`,autoComplete:`section-imap username`,value:f.user,readOnly:!!F,onChange:e=>z(`user`,e.target.value),placeholder:`me@example.com`})]}),(0,Z.jsx)(`div`,{className:`grid gap-2`,children:!F||m?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(G,{htmlFor:`imap-password`,children:F?`New IMAP password`:`Password`}),(0,Z.jsx)(q,{id:`imap-password`,name:`imap-password`,type:`password`,autoComplete:`section-imap new-password`,"data-lpignore":`true`,"data-1p-ignore":`true`,value:f.password,onChange:e=>z(`password`,e.target.value),placeholder:F?`Leave blank to keep current password`:`Password`})]}):(0,Z.jsxs)(`div`,{className:`flex items-center gap-3 text-sm`,children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Saved IMAP password`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>h(!0),children:`Change IMAP password`})]})}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-port`,children:`Port`}),(0,Z.jsx)(q,{id:`imap-port`,type:`number`,value:String(f.port),onChange:e=>z(`port`,Number(e.target.value||993))})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(G,{children:`Folders to sync`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>void ne(F,f),disabled:D||!!F&&v||!F&&(!f.host.trim()||!f.user.trim()||!f.password),children:[D?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(ni,{className:`h-3 w-3`}),` Discover folders`]})]}),(0,Z.jsx)(`div`,{className:`max-h-56 overflow-y-auto rounded-md border p-2`,children:se.length===0?(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:D?`Discovering folders…`:F?`No folders found on the server.`:`Fill in host, user and password, then discover the account’s folders. INBOX is synced by default.`}):(0,Z.jsx)(`div`,{className:`space-y-0.5`,children:se.map(e=>{let t=e.path.split(e.delimiter||`/`).length-1,n=x.some(t=>t.path===e.path);return(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 rounded px-2 py-1 text-xs hover:bg-accent/50`,style:{paddingLeft:`${8+t*14}px`},children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:C.includes(e.path),onChange:()=>oe(e.path)}),(0,Z.jsx)(`span`,{className:`font-mono truncate`,children:e.path}),!n&&x.length>0&&(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`(subscribed, not on server)`})]},e.path)})})}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[C.length,` folder`,C.length===1?``:`s`,` selected; each synced as its own container. Unchecking a synced folder removes it on Save.`]})]}),(0,Z.jsxs)(`fieldset`,{className:`rounded border p-3 space-y-3 sm:col-span-2`,children:[(0,Z.jsx)(`legend`,{className:`px-1 text-sm font-medium`,children:`Outgoing email (SMTP)`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:!F||!f.smtp.enabled||k,onClick:()=>s(F.address),children:`Send test email`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Save your SMTP settings before testing. The test uses the saved account.`}),o&&(0,Z.jsx)(Ue,{workspaceId:e,initialAccount:{driver:`imap`,address:o},testEmail:!0,onClose:()=>s(null)}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.enabled,onChange:e=>z(`smtp`,{...f.smtp,enabled:e.target.checked})}),`Allow sending from Canvas`]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[[`host`,`user`,`from`,`sentFolder`].map(e=>(0,Z.jsxs)(`label`,{className:`text-xs`,children:[{host:`SMTP host`,user:`SMTP username`,from:`From address`,sentFolder:`Sent folder`}[e],(0,Z.jsx)(q,{name:`smtp-${e}`,value:f.smtp[e],autoComplete:e===`user`?`section-smtp username`:`off`,onChange:t=>z(`smtp`,{...f.smtp,[e]:t.target.value})})]},e)),f.smtp.enabled&&(!F||g)&&(0,Z.jsxs)(`label`,{className:`text-xs`,children:[`SMTP password (blank keeps current)`,(0,Z.jsx)(q,{name:`smtp-password`,type:`password`,autoComplete:`section-smtp new-password`,"data-lpignore":`true`,"data-1p-ignore":`true`,value:f.smtp.password,onChange:e=>z(`smtp`,{...f.smtp,password:e.target.value})})]}),F&&f.smtp.enabled&&!g&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>_(!0),children:`Change SMTP password`}),(0,Z.jsxs)(`label`,{className:`text-xs`,children:[`Port`,(0,Z.jsx)(q,{type:`number`,min:1,max:65535,value:f.smtp.port,onChange:e=>z(`smtp`,{...f.smtp,port:Number(e.target.value)})})]})]}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.secure,onChange:e=>z(`smtp`,{...f.smtp,secure:e.target.checked})}),`Implicit TLS (usually port 465; otherwise STARTTLS is required)`]}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.appendSent,onChange:e=>z(`smtp`,{...f.smtp,appendSent:e.target.checked})}),`Save a copy in the IMAP Sent folder (leave off if your provider does this automatically)`]}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.allowAgentSend,onChange:e=>z(`smtp`,{...f.smtp,allowAgentSend:e.target.checked})}),`Allow agents with workspace write access to send`]})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-lookback`,children:`Sync lookback (days)`}),(0,Z.jsx)(q,{id:`imap-lookback`,type:`number`,min:`0`,value:String(f.initialSyncDays),onChange:e=>z(`initialSyncDays`,Number(e.target.value||0))}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Used for the first sync and every Resync. Set 0 to import the whole mailbox. Saving a wider window automatically fetches older mail; a narrower window keeps messages already imported.`})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-poll`,children:`Poll interval (ms)`}),(0,Z.jsx)(q,{id:`imap-poll`,type:`number`,value:String(f.pollInterval),onChange:e=>z(`pollInterval`,Number(e.target.value||6e4))})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.tls,onChange:e=>z(`tls`,e.target.checked)}),` TLS`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.allowSelfSigned,onChange:e=>z(`allowSelfSigned`,e.target.checked)}),` Allow self-signed`]})]})]});return(0,Z.jsxs)(`div`,{className:`space-y-3 border-t pt-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`h4`,{className:`text-sm font-medium`,children:`IMAP Accounts`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Each account mirrors under /imap/<account> in the backends tree; its folders are synced as containers. Click an account to edit its settings.`})]}),!t&&(0,Z.jsx)(`p`,{className:`rounded-md border bg-muted/40 p-2 text-xs text-muted-foreground`,children:`Enable the IMAP service before polling starts. Accounts can still be configured while it is off.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:u?re:ae,children:[(0,Z.jsx)(la,{className:`h-3 w-3`}),` `,u?`Cancel`:`New Account`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,onClick:te,disabled:T,children:[T?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Er,{className:`h-3 w-3`}),` Refresh`]})]}),(0,Z.jsx)(`div`,{className:`rounded-md border`,children:(0,Z.jsx)(`div`,{className:`max-h-[32rem] overflow-y-auto p-2 space-y-1`,children:ee.length===0?(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No IMAP accounts configured.`}):ee.map(t=>{let n=c===t.address;return(0,Z.jsxs)(`div`,{className:`rounded px-2 py-2 text-xs transition-colors ${n?`bg-accent/40`:`hover:bg-accent/50`}`,children:[(0,Z.jsxs)(`button`,{onClick:()=>ie(t),className:`w-full text-left`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsxs)(`span`,{className:`flex items-center gap-1.5 font-medium`,children:[n?(0,Z.jsx)(qr,{className:`h-3 w-3 shrink-0`}):(0,Z.jsx)(Xa,{className:`h-3 w-3 shrink-0`}),t.address]}),(0,Z.jsx)(`span`,{className:`shrink-0 ${t.status===`error`?`text-destructive`:`text-muted-foreground`}`,children:t.status})]}),(0,Z.jsxs)(`div`,{className:`pl-[18px] text-muted-foreground`,children:[String(t.config?.host||``),` · `,(t.containers||[]).length,` folder(s)`]}),t.lastError&&(0,Z.jsxs)(`div`,{className:`pl-[18px] text-destructive`,children:[`error: `,t.lastError]})]}),n&&(0,Z.jsxs)(`div`,{className:`mt-2 space-y-3 border-t pt-2`,children:[(0,Z.jsx)(`div`,{className:`space-y-0.5`,children:(t.containers||[]).map(n=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded bg-background/60 px-2 py-1`,children:[(0,Z.jsx)(`span`,{className:`font-mono truncate`,children:n.name}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,Z.jsx)(`button`,{title:`Resync folder`,className:`p-1 hover:bg-accent rounded`,onClick:()=>le(t.address,n.name),disabled:!!j||v||k,children:j===`folder-sync:${t.address}:${n.name}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Er,{className:`h-3 w-3`})}),(0,Z.jsx)(`button`,{title:`Remove folder`,className:`p-1 hover:bg-destructive/10 text-destructive rounded`,onClick:()=>Os(e,`imap`,t.address,n.name).then(te).catch(e=>N({title:`Error`,description:e instanceof Error?e.message:`Failed to remove folder`,variant:`destructive`})),disabled:!!j,children:(0,Z.jsx)(Qr,{className:`h-3 w-3`})})]})]},n.name))}),(t.containers||[]).map(n=>(0,Z.jsxs)(`div`,{className:`rounded border p-2`,children:[(0,Z.jsx)(`p`,{className:`mb-2 font-medium`,children:n.name}),(0,Z.jsx)(Xw,{value:n.removalPolicy,backends:i,source:`imap:${n.mailboxId}`,destination:!1,onSave:async r=>{await qw(e,t.address,n.name,r),await te()}})]},`removal:${n.name}`)),ue,(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:v?`Save changes before testing, discovering folders or resyncing.`:`Test and Discover folders use the saved connection settings. Resync fetches the saved lookback window again.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,onClick:B,disabled:k||!v,children:[k?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Yn,{className:`h-3 w-3`}),` Save`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:!!j||v||k,onClick:()=>V(`test`,t.address),children:[j===`test:${t.address}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(la,{className:`h-3 w-3`}),` Test`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:!!j||v||k,onClick:()=>V(`sync`,t.address),children:[j===`sync:${t.address}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Er,{className:`h-3 w-3`}),` Resync all`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`destructive`,disabled:!!j,onClick:ce,children:[j===`delete:${t.address}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Qr,{className:`h-3 w-3`}),` Delete`]})]})]})]},t.address)})})}),u&&(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsx)(`h5`,{className:`text-xs font-medium`,children:`New IMAP account`}),ue,(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,onClick:B,disabled:k,children:[k?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Yn,{className:`h-3 w-3`}),` Save`]}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:re,children:`Cancel`})]})]})]})}function OP({workspaceId:e}){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!0),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(``),[l,u]=(0,X.useState)([`read`]),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)(!0),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(new Set),[y,b]=(0,X.useState)(``),[x,S]=(0,X.useState)(!1),{showToast:C}=wo(),[w,T]=(0,X.useState)(e);e!==w&&(T(e),i(!0));let E=(0,X.useCallback)(()=>J.get(`/workspaces/${e}/tokens`).then(e=>{n((e||[]).map(e=>({...e,hash:e.hash||e.tokenHash||``})).filter(e=>e.hash))}).catch(()=>{C({title:`Error`,description:`Failed to load workspace tokens`,variant:`destructive`})}).finally(()=>{i(!1)}),[e,C]);(0,X.useEffect)(()=>{E()},[E]);let D=async()=>{if(!s.trim()){C({title:`Error`,description:`Token description is required`,variant:`destructive`});return}try{o(!0);let t=null;if(!p&&d){let e=new Date(d);e.setHours(23,59,59,999),t=e.toISOString()}let n={description:s,permissions:l,expiresAt:t},r=await J.post(`/workspaces/${e}/tokens`,n);r&&r.token&&b(r.token),c(``),u([`read`]),f(``),m(!0),g(!1),i(!0),await E(),C({title:`Success`,description:`Workspace sharing token created successfully`,variant:`default`})}catch{C({title:`Error`,description:`Failed to create token`,variant:`destructive`})}finally{o(!1)}},O=async t=>{try{await J.delete(`/workspaces/${e}/tokens/${t}`),C({title:`Success`,description:`Token revoked successfully`}),i(!0),await E()}catch{C({title:`Error`,description:`Failed to revoke token`,variant:`destructive`})}},k=e=>{let t=new Set(_);t.has(e)?t.delete(e):t.add(e),v(t)},A=e=>_.has(e)?e:`${e.substring(0,8)}...${e.substring(e.length-8)}`,j=async e=>{try{await navigator.clipboard.writeText(e),C({title:`Copied`,description:`Token hash copied to clipboard`})}catch{C({title:`Error`,description:`Failed to copy to clipboard`,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-medium`,children:`Workspace Sharing Tokens`}),(0,Z.jsxs)(Y,{onClick:()=>g(!h),size:`sm`,variant:`outline`,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Token`]})]}),h&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 bg-muted/50`,children:[(0,Z.jsx)(q,{placeholder:`Token description (e.g., 'John's laptop')`,value:s,onChange:e=>c(e.target.value)}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium mb-2 block`,children:`Permissions`}),(0,Z.jsx)(`div`,{className:`flex gap-2 flex-wrap`,children:[`read`,`write`,`admin`].map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:l.includes(e),onChange:t=>{t.target.checked?u([...l,e]):u(l.filter(t=>t!==e))}}),(0,Z.jsx)(`span`,{className:`text-sm`,children:e})]},e))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium mb-2 block`,children:`Token Expiry`}),(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:p,onChange:e=>{m(e.target.checked),e.target.checked&&f(``)}}),(0,Z.jsx)(`span`,{className:`text-sm`,children:`Never expires`})]}),!p&&(0,Z.jsx)(q,{type:`date`,placeholder:`Expiry date`,value:d,onChange:e=>f(e.target.value),min:new Date().toISOString().split(`T`)[0]})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{onClick:D,disabled:a,children:`Create Token`}),(0,Z.jsx)(Y,{variant:`outline`,onClick:()=>g(!1),children:`Cancel`})]})]}),y&&(0,Z.jsxs)(`div`,{className:`p-4 border rounded-md bg-muted/50`,children:[(0,Z.jsxs)(`div`,{className:`flex justify-between items-center mb-2`,children:[(0,Z.jsx)(`h3`,{className:`font-semibold`,children:`Your New Workspace Sharing Token`}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:async()=>{try{await navigator.clipboard.writeText(y),S(!0),C({title:`Success`,description:`Token copied to clipboard`}),setTimeout(()=>S(!1),2e3)}catch{C({title:`Error`,description:`Failed to copy token to clipboard`,variant:`destructive`})}},children:x?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(sr,{className:`mr-2 h-4 w-4`}),`Copied`]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Jn,{className:`mr-2 h-4 w-4`}),`Copy`]})})]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mb-2`,children:`Make sure to copy your workspace sharing token now. You won't be able to see it again!`}),(0,Z.jsx)(`div`,{className:`p-2 bg-background border rounded font-mono text-sm break-all outline-none focus:ring-2 focus:ring-ring`,children:y}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,className:`mt-2`,onClick:()=>b(``),children:`Dismiss`})]}),(0,Z.jsx)(kP,{workspaceId:e}),r?(0,Z.jsxs)(`div`,{className:`text-center py-4`,children:[(0,Z.jsx)(`div`,{className:`animate-spin rounded-full h-6 w-6 border-b-2 border-primary mx-auto touch-target`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:`Loading tokens...`})]}):t.length===0?(0,Z.jsxs)(`div`,{className:`text-center py-8 text-muted-foreground`,children:[(0,Z.jsx)(`p`,{children:`No sharing tokens created yet.`}),(0,Z.jsx)(`p`,{className:`text-sm`,children:`Create a token to share this workspace with others.`})]}):(0,Z.jsx)(`div`,{className:`space-y-3`,children:t.map(e=>(0,Z.jsxs)(`div`,{className:`border rounded-lg p-3 flex items-center justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,Z.jsx)(`span`,{className:`font-medium text-sm`,children:e.description}),(0,Z.jsx)(`span`,{className:`text-xs bg-muted px-2 py-1 rounded`,children:e.permissions.join(`, `)})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`span`,{className:`font-mono`,children:A(e.hash)}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>k(e.hash),children:_.has(e.hash)?(0,Z.jsx)(Ei,{className:`h-3 w-3`}):(0,Z.jsx)(ja,{className:`h-3 w-3`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>j(e.hash),children:(0,Z.jsx)(Jn,{className:`h-3 w-3`})})]}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Created: `,new Date(e.createdAt).toLocaleDateString(),e.expiresAt?(0,Z.jsxs)(`span`,{children:[` • Expires: `,new Date(e.expiresAt).toLocaleDateString()]}):(0,Z.jsx)(`span`,{children:` • Never expires`})]})]}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>O(e.hash),className:`text-destructive hover:text-destructive`,children:(0,Z.jsx)(Qr,{className:`h-4 w-4`})})]},e.hash))})]})}function kP({workspaceId:e}){let{showToast:t}=wo(),[n,r]=(0,X.useState)(``),[i,a]=(0,X.useState)([`read`]),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)([]),u=(0,X.useCallback)(()=>J.get(`/workspaces/${e}/shares`).then(e=>l(Array.isArray(e)?e:e?.emailShares||[])).catch(()=>{}),[e]);(0,X.useEffect)(()=>{u()},[u]);let d=async()=>{if(n.trim())try{s(!0),await J.post(`/workspaces/${e}/shares`,{userEmail:n.trim(),permissions:i}),r(``),a([`read`]),await u(),t({title:`Success`,description:`Access granted`})}catch(e){t({title:`Error`,description:e instanceof Error?e.message:`Failed to grant access`,variant:`destructive`})}finally{s(!1)}},f=async n=>{try{await J.delete(`/workspaces/${e}/shares/${encodeURIComponent(n)}`),await u(),t({title:`Success`,description:`Access revoked`})}catch(e){t({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke`,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsx)(`h4`,{className:`font-medium`,children:`Email-based Shares`}),(0,Z.jsxs)(`div`,{className:`flex gap-2 flex-wrap items-center`,children:[(0,Z.jsx)(q,{placeholder:`user@local.server`,value:n,onChange:e=>r(e.target.value),className:`max-w-xs`}),(0,Z.jsx)(`div`,{className:`flex gap-2`,children:[`read`,`write`,`admin`].map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:i.includes(e),onChange:t=>{t.target.checked?a([...i,e]):a(i.filter(t=>t!==e))}}),e]},e))}),(0,Z.jsx)(Y,{size:`sm`,onClick:d,disabled:o,children:`Add`})]}),c.length>0&&(0,Z.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between border rounded p-2`,children:[(0,Z.jsxs)(`div`,{className:`text-sm`,children:[(0,Z.jsx)(`div`,{className:`font-medium`,children:e.userEmail}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.permissions.join(`, `),e.grantedAt?` • ${new Date(e.grantedAt).toLocaleDateString()}`:``]})]}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>f(e.userEmail),className:`text-destructive hover:text-destructive`,children:`Revoke`})]},e.userEmail))})]})}var AP=[{value:`read`,label:`Read`,hint:`Browse and search`},{value:`write`,label:`Read & write`,hint:`Add, edit and organise documents`},{value:`admin`,label:`Admin`,hint:`Everything except sharing and deleting`}],jP=e=>e.includes(`admin`)?`admin`:e.includes(`write`)?`write`:`read`;function MP({workspaceId:e}){let{showToast:t}=wo(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(`user`),[u,d]=(0,X.useState)(``),[f,p]=(0,X.useState)(`read`),[m,h]=(0,X.useState)(e);e!==m&&(h(e),a(!0));let g=(0,X.useCallback)(()=>cs(e).then(r).catch(()=>r(null)).finally(()=>a(!1)),[e]);(0,X.useEffect)(()=>{g()},[g]);let _=n?.isOwner===!0,v=n?.members??[],y=async n=>{n.preventDefault();let r=u.trim();if(r){s(`grant`);try{let n=await kc(e,c===`user`?{email:r}:{group:r},[f]);d(``),await g();let i=c===`user`?r:`group ${r}`;t({title:`Shared`,description:n.type===`user`&&n.userExists===!1?`${i} has no account here yet — the share applies as soon as they sign in.`:`Access granted to ${i}.`})}catch(e){t({title:`Could not share`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{s(null)}}},b=async(n,r)=>{let i=`${n.type}:${n.principal}`;s(i);try{await Vo(e,n.type,n.principal,[r]),await g()}catch(e){t({title:`Could not update`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{s(null)}},x=async n=>{let r=`${n.type}:${n.principal}`;s(r);try{await fc(e,n.type,n.principal),await g(),t({title:`Access revoked`,description:`${n.principal} no longer has access.`})}catch(e){t({title:`Could not revoke`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{s(null)}};return n&&n.shareable===!1?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Your universe workspace is private and cannot be shared.`}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_?`People and groups who can open this workspace.`:`You are a member of this workspace; only its owner can change the list.`}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{a(!0),g()},disabled:i,children:[(0,Z.jsx)(Er,{className:K(`mr-2 h-3.5 w-3.5`,i&&`animate-spin`)}),`Refresh`]})]}),i?(0,Z.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`Loading members…`}):v.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Not shared with anyone.`}):v.map(e=>{let t=`${e.type}:${e.principal}`,n=jP(e.permissions);return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-md border p-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-start gap-2`,children:[e.type===`group`?(0,Z.jsx)(ar,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}):(0,Z.jsx)(Hr,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm font-medium`,title:e.principal,children:e.principal}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.type===`group`?`Group`:`User`,e.description?` · ${e.description}`:``,e.grantedAt?` · since ${new Date(e.grantedAt).toLocaleDateString()}`:``]}),e.type===`user`&&e.userExists===!1&&(0,Z.jsxs)(`div`,{className:`mt-1 flex items-center gap-1 text-[11px] text-warning`,children:[(0,Z.jsx)(er,{className:`h-3 w-3`}),` No account yet — applies at first sign-in`]})]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[_?(0,Z.jsx)(`select`,{value:n,disabled:o===t,onChange:t=>b(e,t.target.value),className:`rounded-md border border-input bg-background px-2 py-1 text-xs focus:outline-none focus:ring-2 focus:ring-ring`,title:`Access level`,children:AP.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))}):(0,Z.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs`,children:AP.find(e=>e.value===n)?.label}),_&&(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:o===t,onClick:()=>x(e),title:`Revoke access`,children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})})]})]},t)})]}),_&&(0,Z.jsxs)(`form`,{onSubmit:y,className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-sm font-medium`,children:[`Share with`,(0,Z.jsx)(`div`,{className:`inline-flex overflow-hidden rounded-md border`,children:[`user`,`group`].map(e=>(0,Z.jsx)(`button`,{type:`button`,onClick:()=>l(e),className:K(`px-3 py-1 text-xs`,c===e?`bg-primary text-primary-foreground`:`bg-background text-muted-foreground hover:bg-muted`),children:e===`user`?`a person`:`a group`},e))})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-[1fr_auto]`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(q,{type:c===`user`?`email`:`text`,value:u,onChange:e=>d(e.target.value),placeholder:c===`user`?`colleague@corp.tld`:`team-a or cn=team-a,ou=groups,dc=corp,dc=tld`,autoComplete:`off`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:c===`user`?`The share is keyed by e-mail: it works even before the person signs in for the first time.`:`Directory group (LDAP/AD memberOf — full DN or just the CN) or a group an admin assigned to local accounts.`})]}),(0,Z.jsx)(`div`,{children:(0,Z.jsx)(`select`,{value:f,onChange:e=>p(e.target.value),className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,title:AP.find(e=>e.value===f)?.hint,children:AP.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))})})]}),(0,Z.jsx)(Y,{type:`submit`,size:`sm`,disabled:o===`grant`||!u.trim(),children:o===`grant`?`Sharing…`:`Share workspace`})]})]})}function NP({workspaceId:e,workspaceName:t,isActive:n,onChanged:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)([]),[s,c]=(0,X.useState)(!0),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1),y=(0,X.useCallback)(async()=>{try{o(await bs(e))}catch{o([])}finally{c(!1)}},[e]);(0,X.useEffect)(()=>{y()},[y]);let b=async()=>{if(!(n&&!window.confirm(`'${t}' is running. It has to be stopped to be exported — its index is only consistent on disk once it has flushed.\n\nStop it and export now?`))){u(!0);try{let t=await Vc(e,{stop:!0});f(t.stoppedWorkspace),i({title:`Workspace exported`,description:`${t.name} — ${Ts(t.size)}`}),await y(),t.stoppedWorkspace&&r?.()}catch(e){i({title:`Export failed`,description:e instanceof Error?e.message:`Failed to export workspace`,variant:`destructive`})}finally{u(!1)}}},x=async()=>{m(!0);try{await Ks(e),f(!1),i({title:`Workspace started`,description:`'${t}' is running again.`}),r?.()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to start workspace`,variant:`destructive`})}finally{m(!1)}},S=async e=>{g(e.name);try{await qo(e.name)}catch(e){i({title:`Download failed`,description:e instanceof Error?e.message:`Failed to download archive`,variant:`destructive`})}finally{g(null)}},C=async e=>{if(window.confirm(`Delete ${e.name}? The archive is removed from the server; any copy you already downloaded is untouched.`)){g(e.name);try{await Lo(e.name),await y()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to delete archive`,variant:`destructive`})}finally{g(null)}}};return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Zr,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Export & Import`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Export packs this workspace into a single compressed archive you can download and move elsewhere. The workspace is stopped first — an export of a running workspace would capture a half-written index.`}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:l,onClick:b,children:[(0,Z.jsx)(Zr,{className:`mr-2 h-3.5 w-3.5 ${l?`animate-pulse`:``}`}),l?`Exporting…`:`Export Workspace`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:s||l,onClick:()=>void y(),children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${s?`animate-spin`:``}`}),`Refresh`]}),d&&(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:p,onClick:x,children:p?`Starting…`:`Start workspace again`})]}),(0,Z.jsxs)(`div`,{className:`mt-4 border-t pt-3`,children:[(0,Z.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Archives`}),s?(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`No exports yet.`}):(0,Z.jsx)(`ul`,{className:`mt-2 space-y-2`,children:a.map(e=>(0,Z.jsxs)(`li`,{className:`flex flex-col gap-2 rounded-md border p-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate font-mono text-xs`,children:e.name}),(0,Z.jsxs)(`div`,{className:`mt-0.5 text-[11px] text-muted-foreground`,children:[Ts(e.size),` · `,new Date(e.createdAt).toLocaleString()]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:h===e.name,onClick:()=>S(e),title:`Download (${Ts(e.size)})`,children:(0,Z.jsx)(zi,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:h===e.name,onClick:()=>C(e),className:`text-destructive hover:text-destructive`,title:`Delete archive`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})]},e.name))})]}),(0,Z.jsxs)(`div`,{className:`mt-4 space-y-3 border-t pt-3`,children:[(0,Z.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Import workspace`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:l,onClick:()=>v(e=>!e),children:_?`Close import`:`Import workspace…`}),_&&(0,Z.jsx)(Nw,{disabled:l,onImported:()=>r?.()})]})]})}var PP={"workspace:home":{title:`Workspace Home`,description:`User-managed roaming home folder, exported through WebDAV and watched for changes. Mirrored into the backends tree.`},"workspace:data":{title:`Workspace Data`,description:`Managed content-addressable blob store (deduped, checksum-keyed). Opaque by design: the tree is the navigation; not meant for direct edits or export.`},imap:{title:`IMAP`,description:`Mailbox data source; ingested mail lands in the backends tree.`}},FP=[{id:`git`,title:`Git`,description:`Git-backed dotfile access.`},{id:`webdav`,title:`WebDAV`,description:`Mountable access to the workspace home backend.`},{id:`imapSync`,title:`IMAP Sync Worker`,description:`Background mailbox polling and ingestion.`}];function IP({checked:e,disabled:t,onClick:n}){return(0,Z.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":e,disabled:t,onClick:n,className:`relative inline-flex h-5 w-9 shrink-0 rounded-full border-2 border-transparent transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${e?`bg-primary`:`bg-muted-foreground/30`}`,children:(0,Z.jsx)(`span`,{className:`pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow transition-transform ${e?`translate-x-4`:`translate-x-0`}`})})}function LP({workspaceId:e,onAdded:t}){let[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(!1),{showToast:m}=wo(),h=()=>{a(``),s(``),l(!1),d(!1)};return n?(0,Z.jsxs)(`form`,{onSubmit:async n=>{if(n.preventDefault(),!(!i.trim()||!o.trim())){p(!0);try{await Zs(e,`file`,{name:i.trim(),path:o.trim(),watch:c,readOnly:u}),m({title:`Added`,description:`${i.trim()} mounted; initial scan running in the background`}),h(),r(!1),await t()}catch(e){m({title:`Error`,description:e instanceof Error?e.message:`Failed to add folder backend`,variant:`destructive`})}finally{p(!1)}}},className:`w-full space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(ni,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Add local folder`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Index a folder on the server host as a data source. Files stay in place; the index records them as device-scoped locations, so they remain addressable if the workspace moves to another server.`}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Name`}),(0,Z.jsx)(q,{value:i,onChange:e=>a(e.target.value),placeholder:`Financial Reports`,required:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Absolute path on server`}),(0,Z.jsx)(q,{value:o,onChange:e=>s(e.target.value),placeholder:`/mnt/data/reports`,required:!0,className:`font-mono`})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-6 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,children:[`watch`,(0,Z.jsx)(IP,{checked:c,onClick:()=>l(e=>!e)})]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,title:`Never delete bytes in this folder. Destroy degrades to a reference drop. Recommended for folders managed outside Canvas.`,children:[`read-only`,(0,Z.jsx)(IP,{checked:u,onClick:()=>d(e=>!e)})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{type:`submit`,size:`sm`,disabled:f||!i.trim()||!o.trim(),children:f?`Adding…`:`Add folder`}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,disabled:f,onClick:()=>{h(),r(!1)},children:`Cancel`})]})]}):(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(!0),children:[(0,Z.jsx)(ni,{className:`mr-2 h-3.5 w-3.5`}),`Add local folder`]})}function RP({workspaceId:e,onAdded:t}){let[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)({name:``,clientId:``,clientSecret:``,refreshToken:``,folderId:``}),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),{showToast:p}=wo(),m=e=>t=>a(n=>({...n,[e]:t.target.value})),h=()=>{a({name:``,clientId:``,clientSecret:``,refreshToken:``,folderId:``}),s(!1),l(!1)},g=i.name.trim()&&i.clientId.trim()&&i.clientSecret.trim()&&i.refreshToken.trim();return n?(0,Z.jsxs)(`form`,{onSubmit:async n=>{if(n.preventDefault(),g){d(!0);try{await Zs(e,`gdrive`,{name:i.name.trim(),clientId:i.clientId.trim(),clientSecret:i.clientSecret.trim(),refreshToken:i.refreshToken.trim(),folderId:i.folderId.trim()||`root`,watch:o,readOnly:c}),p({title:`Added`,description:`${i.name.trim()} connected; initial scan running in the background`}),h(),r(!1),await t()}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to add Google Drive backend`,variant:`destructive`})}finally{d(!1)}}},className:`w-full space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(f,{icon:`mdi:google-drive`,width:16,height:16,className:`text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Add Google Drive`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Index a Drive folder (or the whole My Drive) as a remote data source. Files are hashed from Drive metadata, uploads are queued through the workspace cache. Needs a Google OAuth client (Web application) — enter its id and secret, then sign in to obtain the offline-access refresh token, or paste one you already have.`}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Name`}),(0,Z.jsx)(q,{value:i.name,onChange:m(`name`),placeholder:`Work Drive`,required:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Folder id (empty = My Drive root)`}),(0,Z.jsx)(q,{value:i.folderId,onChange:m(`folderId`),placeholder:`1AbC…`,className:`font-mono`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`OAuth client id`}),(0,Z.jsx)(q,{value:i.clientId,onChange:m(`clientId`),required:!0,className:`font-mono`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`OAuth client secret`}),(0,Z.jsx)(q,{type:`password`,value:i.clientSecret,onChange:m(`clientSecret`),required:!0,className:`font-mono`,autoComplete:`off`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1 sm:col-span-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Refresh token`}),(0,Z.jsx)(q,{type:`password`,value:i.refreshToken,onChange:m(`refreshToken`),required:!0,className:`font-mono`,autoComplete:`off`,placeholder:`Sign in below, or paste an offline-access refresh token`}),(0,Z.jsx)(bP,{clientId:i.clientId,clientSecret:i.clientSecret,scope:c?`drive.readonly`:`drive`,disabled:u,onLinked:({refreshToken:e,account:t})=>a(n=>({...n,refreshToken:e,name:n.name.trim()||(t?`Drive (${t})`:n.name)}))})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-6 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,title:`Poll the Drive changes feed (every 60s) so edits made in Drive show up without a manual re-sync.`,children:[`watch`,(0,Z.jsx)(IP,{checked:o,onClick:()=>s(e=>!e)})]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,title:`Never delete files in this Drive. Destroy degrades to a reference drop.`,children:[`read-only`,(0,Z.jsx)(IP,{checked:c,onClick:()=>l(e=>!e)})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{type:`submit`,size:`sm`,disabled:u||!g,children:u?`Checking…`:`Add Drive`}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,disabled:u,onClick:()=>{h(),r(!1)},children:`Cancel`})]})]}):(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(!0),children:[(0,Z.jsx)(f,{icon:`mdi:google-drive`,width:14,height:14,className:`mr-2`}),`Add Google Drive`]})}function zP({workspaceId:e,backend:t}){let[n,r]=(0,X.useState)(t.usage??null),[i,a]=(0,X.useState)(!1),{showToast:o}=wo();return(0,Z.jsxs)(`button`,{type:`button`,onClick:async()=>{a(!0);try{r(await Zo(e,t.driver,t.address))}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed to compute size`,variant:`destructive`})}finally{a(!1)}},disabled:i,className:`flex items-center gap-1.5 rounded border px-2 py-1 text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50`,title:n?`Computed ${new Date(n.computedAt).toLocaleString()}; click to refresh`:`Compute on-disk size (walks the backend folder; may take a while)`,children:[(0,Z.jsx)(Fr,{className:`h-3 w-3 ${i?`animate-pulse`:``}`}),i?`Calculating…`:n?Ts(n.bytes):`Size`]})}function BP({workspaceId:e}){let[t,n]=(0,X.useState)(!1),{showToast:r}=wo();return(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:async()=>{n(!0);try{let{removed:t}=await oc(e);r({title:`Thumbnail cache cleared`,description:`${t} cached thumbnail(s) removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Failed to clear thumbnail cache`,variant:`destructive`})}finally{n(!1)}},title:`Remove all cached thumbnails; they regenerate on demand`,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-3.5 w-3.5 ${t?`animate-pulse`:``}`}),t?`Clearing…`:`Clear thumbnails`]})}function VP({workspaceId:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!1),{showToast:a}=wo();return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Fr,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Disk usage`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Total on-disk size of this workspace (index, blobs, home, cache): what an export or sync would move. Computed on demand; may take a while on large workspaces.`})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-3`,children:[t&&(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:Ts(t.bytes)}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:r,onClick:async()=>{i(!0);try{n(await uc(e))}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to compute workspace size`,variant:`destructive`})}finally{i(!1)}},children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${r?`animate-spin`:``}`}),r?`Calculating…`:t?`Recalculate`:`Calculate size`]})]})]}),t&&(0,Z.jsx)(`div`,{className:`mt-3 grid grid-cols-2 gap-x-6 gap-y-1 border-t pt-3 sm:grid-cols-3`,children:Object.entries(t.breakdown).sort(([,e],[,t])=>t-e).map(([e,t])=>(0,Z.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-xs`,children:[(0,Z.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,children:e}),(0,Z.jsx)(`span`,{children:Ts(t)})]},e))})]})}function HP({backend:e,busy:t,onSave:n}){let r=e.config||{},i=Array.isArray(r.exclude)?r.exclude:[],a=Array.isArray(r.effectiveExclusions)?r.effectiveExclusions:[],o=Math.max(a.length-i.length,0),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(i.join(`
|
|
42
|
+
`;function EN({workspaceId:e,prefillRule:t,onPrefillConsumed:n,initialSection:r,initialRunsHandler:i,initialRunId:a}){let{showToast:o}=wo(),[s,c]=(0,X.useState)(r??`rules`),[l,u]=(0,X.useState)(t);t!==l&&(u(t),t&&c(`rules`));let[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)([]),[h,g]=(0,X.useState)(!0),[v,y]=(0,X.useState)(null),[b,x]=(0,X.useState)(``),[S,C]=(0,X.useState)(!1),[w,T]=(0,X.useState)(!1),[E,D]=(0,X.useState)(!1),[O,k]=(0,X.useState)(null),[A,j]=(0,X.useState)(`document.inserted`),[M,N]=(0,X.useState)(``),[P,ee]=(0,X.useState)([]),[F,I]=(0,X.useState)(!1),[te,L]=(0,X.useState)([]),[R,re]=(0,X.useState)(!1),[ie,ae]=(0,X.useState)(i||null),[z,oe]=(0,X.useState)(a?{runId:a,run:null}:null),se=e=>{oe(t=>t?.runId===e?null:{runId:e,run:null})};(0,X.useEffect)(()=>{if(!z||z.run||z.error)return;let t=!1;return dn(e,z.runId).then(e=>{t||oe(t=>t?.runId===e.runId?{runId:e.runId,run:e}:t)}).catch(e=>{t||oe(t=>t?.runId===z.runId?{...t,error:e instanceof Error?e.message:`Failed to load run`}:t)}),()=>{t=!0}},[e,z]);let[B,V]=(0,X.useState)(null),[le,ue]=(0,X.useState)(!1),[de,fe]=(0,X.useState)(0),[pe,me]=(0,X.useState)(null),[he,ge]=(0,X.useState)(()=>At()),[_e,ve]=(0,X.useState)(()=>String(At())),ye=()=>{let e=jn(_(_e));ge(e),ve(String(e))};(0,X.useEffect)(()=>{let t=!1;return en(e,{status:`pending`,limit:500}).then(e=>{t||fe(e.length)}).catch(()=>{}),()=>{t=!0}},[e]),Ae(()=>ue(!1),le);let be=async t=>{if(confirm(`Replay ${t.handlerType} "${t.handler}" for ${t.event} (docs ${(t.docIds||[]).join(`, `)})?`)){V(t.runId);try{let n=await Et(e,t.runId);o({title:`Replayed`,description:`${t.handler} → ${n.status}`}),await Se()}catch(e){o({title:`Replay failed`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{V(null)}}},xe=s===`scripts`?{list:Fe,get:ne,save:Ve,del:Re}:{list:bt,get:rt,save:Sn,del:Kt},H=s===`hooks`||s===`scripts`,Se=async()=>{if(s!==`rules`&&s!==`pending`){if(s===`runs`){try{g(!0),L(await Ht(e,{limit:100,failed:R||void 0,handler:ie||void 0}))}catch{o({title:`Error`,description:`Failed to load hook runs`,variant:`destructive`})}finally{g(!1)}return}try{g(!0),m(await xe.list(e))}catch{o({title:`Error`,description:`Failed to load ${s}`,variant:`destructive`})}finally{g(!1)}}};(0,X.useEffect)(()=>{Se()},[e,s,R,ie]);let Ce=e=>{e!==s&&(S&&!confirm(`Discard unsaved changes?`)||(c(e),y(null),x(``),C(!1),D(!1)))},U=async t=>{if(!(S&&!confirm(`Discard unsaved changes?`)))try{y(t),x(await xe.get(e,t)),C(!1)}catch{o({title:`Error`,description:`Failed to open ${t}`,variant:`destructive`})}},we=async()=>{if(v)try{T(!0),await xe.save(e,v,b),C(!1),o({title:`Saved`,description:`${v} saved`}),await Se()}catch{o({title:`Error`,description:`Failed to save ${v}`,variant:`destructive`})}finally{T(!1)}},Te=async t=>{let n=pt(t);try{let r=await ot(e,t,!n);v===t&&y(r),await Se(),o({title:n?`Disabled`:`Enabled`,description:r})}catch{o({title:`Error`,description:`Failed to toggle ${t}`,variant:`destructive`})}},Ee=async t=>{let n=zt(t);if(!n||!pt(t)&&!confirm(`${t} is disabled. Run it anyway?`))return;let r=n.startsWith(`document.`);if(!(r&&!confirm(`Run ${t} against up to ${he} existing documents (event ${n})?`))){me(t);try{if(r){let r=await W(e,{hookFile:t,event:n,limit:he});o({title:`Run finished`,description:`${r.processed} documents processed, ${r.failed} failed. Details in the Runs tab`,...r.failed?{variant:`destructive`}:{}})}else{let r=await $e(e,{hookFile:t,event:n});o({title:r.status===`error`?`Run failed`:`Run finished`,description:r.status===`error`?`${t}: ${r.error||`see the Runs tab`}`:`${t} → ${r.status}${r.durationMs==null?``:` in ${r.durationMs}ms`}`,...r.status===`error`?{variant:`destructive`}:{}})}}catch(e){o({title:`Run failed`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{me(null)}}},De=async t=>{if(confirm(`Delete ${s===`hooks`?`hook`:`script`} ${t}?`))try{await xe.del(e,t),v===t&&(y(null),x(``),C(!1)),await Se(),o({title:`Deleted`,description:`${t} deleted`})}catch{o({title:`Error`,description:`Failed to delete ${t}`,variant:`destructive`})}},Oe=async()=>{if(!O)try{k(await Xt(e))}catch{o({title:`Error`,description:`Failed to load hook metadata`,variant:`destructive`})}},ke=async()=>{D(!E),s===`hooks`&&await Oe()},je=async()=>{f(!d),await Oe()},Me=async()=>{let t=M.trim().replace(/^\/+/,``);if(!t){o({title:`Error`,description:`Give the script a name (e.g. on-image.sh)`,variant:`destructive`});return}try{I(!0),await Ve(e,t,TN),D(!1),N(``),await Se(),await U(t)}catch{o({title:`Error`,description:`Failed to create script`,variant:`destructive`})}finally{I(!1)}},Ne=e=>{ee(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},Pe=async()=>{if(!M.trim()){o({title:`Error`,description:`Give the hook a name`,variant:`destructive`});return}try{I(!0);let{path:t}=await cn(e,{event:A,name:M.trim(),actions:P});D(!1),N(``),ee([]),await Se(),await U(t),o({title:`Created`,description:`${t}. Edit the TODOs, then enable it`})}catch{o({title:`Error`,description:`Failed to create hook`,variant:`destructive`})}finally{I(!1)}},Ie=s===`hooks`?lt(p):{scripts:p},Le=`${yo}/workspaces/${e}/git/internal`;return(0,Z.jsxs)(`div`,{className:`@container space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-3 @3xl:flex-row @3xl:items-start @3xl:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 @3xl:min-w-[18rem] @3xl:flex-1`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-medium`,children:`Automation`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Rules are simple click-to-build automations (Outlook-style). Hooks are their programmable big brother; scripts are the shell helpers hooks spawn. Everything commits to the workspace git repo.`})]}),(0,Z.jsx)(`div`,{className:`flex min-w-0 flex-col gap-2 @3xl:max-w-[60%] @3xl:flex-row @3xl:items-center`,children:(0,Z.jsx)(`div`,{className:`w-full min-w-0 @3xl:w-auto`,children:(0,Z.jsx)(ce,{className:`border-b-0`,active:s,onChange:Ce,tabs:[{id:`pending`,label:de>0?`Pending (${de})`:`Pending`,icon:wr},{id:`rules`,label:`Rules`,icon:Ta},{id:`hooks`,label:`Hooks`,icon:or},{id:`scripts`,label:`Scripts`,icon:ai},{id:`runs`,label:`Runs`,icon:xr}]})})})]}),(s===`runs`||H)&&(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-2`,children:[s===`runs`&&(0,Z.jsxs)(Z.Fragment,{children:[ie&&(0,Z.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded-full border bg-muted/50 px-2.5 py-1 font-mono text-xs hover:bg-muted`,title:`Showing runs of this rule / hook only — click to clear`,onClick:()=>ae(null),children:[ie,` `,(0,Z.jsx)(vr,{className:`h-3 w-3`})]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:R,onChange:e=>re(e.target.checked)}),`failed only`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,onClick:Se,title:`Reload`,children:[(0,Z.jsx)(Er,{className:`mr-1.5 h-4 w-4`}),` Reload`]})]}),H&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,onClick:Se,title:`Reload`,children:[(0,Z.jsx)(Er,{className:`mr-1.5 h-4 w-4`}),` Reload`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,onClick:je,title:`Hook context API & classifier reference`,children:[(0,Z.jsx)(Ln,{className:`mr-1.5 h-4 w-4`}),` Reference`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:ke,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),` `,s===`hooks`?`New Hook`:`New Script`]})]})]}),s===`pending`&&(0,Z.jsx)(wN,{workspaceId:e,onPendingCount:fe}),s===`rules`&&(0,Z.jsx)(Mn,{workspaceId:e,backfillLimit:he,onShowRuns:e=>{ae(e),Ce(`runs`)},prefill:t,onPrefillConsumed:n,onOpenJson:async()=>{try{await rt(e,`rules.json`)}catch{await Sn(e,`rules.json`,JSON.stringify({$schema:`canvas.hook-rules/v1`,rules:[]},null,2)+`
|
|
43
|
+
`).catch(()=>{})}c(`hooks`),U(`rules.json`)}}),s===`runs`&&(0,Z.jsx)(`div`,{className:`border rounded-lg overflow-auto max-h-[560px]`,children:h?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-3`,children:`Loading...`}):te.length===0?(0,Z.jsxs)(`p`,{className:`text-sm text-muted-foreground p-3`,children:[`No runs recorded yet`,R?` (failed only)`:``,`. Runs appear here every time a rule or hook executes.`]}):(0,Z.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,Z.jsx)(`thead`,{className:`text-xs text-muted-foreground border-b sticky top-0 bg-background`,children:(0,Z.jsxs)(`tr`,{children:[(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Time`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Handler`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Event`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Docs`}),(0,Z.jsx)(`th`,{className:`text-right font-medium px-3 py-2`,children:`ms`}),(0,Z.jsx)(`th`,{className:`text-left font-medium px-3 py-2`,children:`Status`}),(0,Z.jsx)(`th`,{className:`px-2 py-2`})]})}),(0,Z.jsx)(`tbody`,{children:te.map(e=>(0,Z.jsxs)(X.Fragment,{children:[(0,Z.jsxs)(`tr`,{className:`border-b last:border-0 align-top hover:bg-muted/40`,children:[(0,Z.jsx)(`td`,{className:`px-3 py-1.5 whitespace-nowrap text-xs text-muted-foreground`,title:e.ts,children:new Date(e.ts).toLocaleString()}),(0,Z.jsxs)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.handlerType,`:`]}),e.handler,e.origin!==`user`&&(0,Z.jsxs)(`span`,{className:`ml-1.5 text-[10px] uppercase tracking-wide rounded bg-muted-foreground/15 px-1 py-0.5 text-muted-foreground`,children:[e.origin,e.depth?` d${e.depth}`:``]})]}),(0,Z.jsxs)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:[e.event,e.batch?` (batch)`:``]}),(0,Z.jsx)(`td`,{className:`px-3 py-1.5 font-mono text-xs`,children:(e.docIds||[]).join(`, `)}),(0,Z.jsx)(`td`,{className:`px-3 py-1.5 text-right font-mono text-xs`,children:e.durationMs}),(0,Z.jsxs)(`td`,{className:`px-3 py-1.5 text-xs`,children:[(0,Z.jsx)(`span`,{className:e.status===`error`?`text-destructive font-medium`:e.status===`skipped`?`text-muted-foreground`:`text-success dark:text-success`,children:e.status}),e.error&&(0,Z.jsx)(`span`,{className:`block text-destructive/80 font-mono break-all`,children:e.error}),e.skipReason&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground`,children:e.skipReason}),e.actions&&e.actions.length>0&&(0,Z.jsx)(`span`,{className:`block text-muted-foreground font-mono`,children:e.actions.map(e=>`${e.action}:${e.status}`).join(` `)}),e.actions?.filter(e=>e.error).map((e,t)=>(0,Z.jsxs)(`span`,{className:`block break-all font-mono ${e.status===`error`?`text-destructive/80`:`text-muted-foreground`}`,children:[e.action,`: `,e.error]},t))]}),(0,Z.jsxs)(`td`,{className:`px-2 py-1.5 whitespace-nowrap`,children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,className:`h-6 px-1.5 touch-target`,title:e.traceLines?`Execution log (${e.traceLines} lines)`:`Execution log`,onClick:()=>se(e.runId),children:[(0,Z.jsx)(bi,{className:`h-3.5 w-3.5`}),(0,Z.jsx)(qr,{className:`ml-0.5 h-3 w-3 transition-transform ${z?.runId===e.runId?`rotate-180`:``}`})]}),e.handlerType!==`dispatch`&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:`Replay this run (reloads the document, re-runs the handler)`,disabled:B!==null,onClick:()=>be(e),children:(0,Z.jsx)(Vr,{className:`h-3 w-3 ${B===e.runId?`animate-spin`:``}`})})]})]}),z?.runId===e.runId&&(0,Z.jsx)(`tr`,{className:`border-b last:border-0 bg-muted/30`,children:(0,Z.jsx)(`td`,{colSpan:7,className:`px-3 py-2`,children:(0,Z.jsx)(DN,{state:z})})})]},e.runId))})]})}),H&&d&&O&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 bg-muted/30 text-sm`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`h4`,{className:`font-medium mb-2`,children:[`Hook context (`,(0,Z.jsx)(`span`,{className:`font-mono`,children:`ctx`}),`)`]}),(0,Z.jsx)(`div`,{className:`space-y-2`,children:O.contextApi?.map(e=>(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-xs`,children:e.signature}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]},e.name))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`h4`,{className:`font-medium mb-2`,children:[`Classifier (`,(0,Z.jsx)(`span`,{className:`font-mono`,children:`const c = ctx.classify()`}),`)`]}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:O.classifier.predicates.map(e=>(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 font-mono text-xs`,children:e},e))}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-2`,children:[`Fields: `,O.classifier.fields.map(e=>(0,Z.jsxs)(`code`,{className:`font-mono`,children:[e,` `]},e)),`(never throws; all predicates are false for a null/unknown document).`]})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Full reference: `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`docs/hooks.md`}),` in the server repo.`]})]}),E&&s===`scripts`&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-3 flex gap-2 items-center bg-muted/50`,children:[(0,Z.jsx)(q,{placeholder:`on-image.sh`,value:M,onChange:e=>N(e.target.value),className:`font-mono text-sm`}),(0,Z.jsx)(Y,{size:`sm`,onClick:Me,disabled:F,children:`Create`}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(!1),children:`Cancel`})]}),E&&s===`hooks`&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-3 bg-muted/50`,children:[(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mb-1`,children:`1. When (event)`}),(0,Z.jsx)(`select`,{className:`w-full h-9 rounded-md border bg-background px-2 font-mono text-sm outline-none focus:ring-2 focus:ring-ring`,value:A,onChange:e=>j(e.target.value),children:(O?.events??[]).map(e=>(0,Z.jsxs)(`option`,{value:e.name,children:[e.name,`: `,e.description]},e.name))}),O&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1 font-mono`,children:[`payload: `,O.events.find(e=>e.name===A)?.payload]}),(0,Z.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mt-3 mb-1`,children:`2. Name`}),(0,Z.jsx)(q,{placeholder:`my-hook`,value:M,onChange:e=>N(e.target.value),className:`font-mono text-sm`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-xs font-semibold text-muted-foreground block mb-1`,children:`3. Then (actions; pick any)`}),(0,Z.jsx)(`div`,{className:`space-y-1 max-h-52 overflow-auto pr-1`,children:(O?.actions??[]).map(e=>(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 text-sm rounded px-2 py-1 hover:bg-muted cursor-pointer`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`mt-1`,checked:P.includes(e.id),onChange:()=>Ne(e.id)}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:e.label}),(0,Z.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:e.description})]})]},e.id))})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Y,{size:`sm`,onClick:Pe,disabled:F||!O,children:F?`Creating…`:`Create skeleton`}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(!1),children:`Cancel`}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Creates a disabled skeleton. Edit the TODOs, then enable it. Simple match→action automations can also go into `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`rules.json`}),` (no code).`]})]})]}),H&&(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:[(0,Z.jsx)(`div`,{className:`md:col-span-1 border rounded-lg p-2 max-h-[480px] overflow-auto`,children:h?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-2`,children:`Loading...`}):p.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground p-2`,children:`No hooks yet.`}):Object.entries(Ie).map(([e,t])=>(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(`div`,{className:`text-xs font-semibold text-muted-foreground px-2 py-1`,children:e}),t.map(e=>{let t=pt(e.path);return(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded px-2 py-1 cursor-pointer text-sm ${v===e.path?`bg-muted`:`hover:bg-muted/50`} ${t?``:`opacity-50`}`,onClick:()=>U(e.path),children:[(0,Z.jsxs)(`span`,{className:`font-mono truncate flex items-center gap-1.5`,children:[e.path,s===`hooks`&&yn(e.path)&&(0,Z.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide rounded bg-muted-foreground/15 px-1 py-0.5 text-muted-foreground shrink-0`,children:`example`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center`,children:[s===`hooks`&&zt(e.path)&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:zt(e.path)?.startsWith(`document.`)?`Run against up to ${he} existing documents`:`Run now`,disabled:pe!==null,onClick:t=>{t.stopPropagation(),Ee(e.path)},children:(0,Z.jsx)(Ar,{className:`h-3 w-3 ${pe===e.path?`animate-pulse`:``}`})}),s===`hooks`&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 touch-target`,title:t?`Disable`:`Enable`,onClick:t=>{t.stopPropagation(),Te(e.path)},children:t?(0,Z.jsx)(Vn,{className:`h-3 w-3`}):(0,Z.jsx)(Xi,{className:`h-3 w-3 text-muted-foreground`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive touch-target`,onClick:t=>{t.stopPropagation(),De(e.path)},children:(0,Z.jsx)(Qr,{className:`h-3 w-3`})})]})]},e.path)})]},e))}),(0,Z.jsx)(`div`,{className:le?`fixed inset-0 z-50 bg-background p-4 flex flex-col`:`md:col-span-2 border rounded-lg p-2 flex flex-col`,children:v?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`mb-2 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`span`,{className:`font-mono text-sm truncate`,children:[v,S?` •`:``]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[s===`hooks`&&zt(v)&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,className:`h-8`,title:pt(v)?`Disable this hook (renames it with a disabled- prefix)`:`Enable this hook (strips the prefix)`,onClick:()=>Te(v),children:pt(v)?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Vn,{className:`mr-1.5 h-3.5 w-3.5`}),` Enabled`]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Xi,{className:`mr-1.5 h-3.5 w-3.5 text-muted-foreground`}),` Disabled`]})}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,className:`h-8`,title:`Run this hook now`,disabled:pe!==null||S,onClick:()=>Ee(v),children:[(0,Z.jsx)(Ar,{className:`mr-1.5 h-3.5 w-3.5 ${pe===v?`animate-pulse`:``}`}),` Run`]})]}),(0,Z.jsxs)(Y,{size:`sm`,onClick:we,disabled:w||!S,children:[(0,Z.jsx)(Yn,{className:`mr-2 h-4 w-4`}),` Save`]}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-8 w-8 p-0`,title:le?`Exit full screen (Esc)`:`Edit full screen`,onClick:()=>ue(!le),children:le?(0,Z.jsx)(ei,{className:`h-4 w-4`}):(0,Z.jsx)(ba,{className:`h-4 w-4`})})]})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-auto rounded border text-sm ${le?``:`min-h-[400px] max-h-viewport-pane`}`,children:(0,Z.jsx)(mN,{value:b,path:v,onChange:e=>{x(e),C(!0)}})})]}):(0,Z.jsxs)(`div`,{className:`flex-1 flex items-center justify-center text-sm text-muted-foreground min-h-[400px]`,children:[`Select a `,s===`hooks`?`hook`:`script`,` to edit, or create a new one.`]})})]}),(s===`rules`||s===`hooks`)&&(0,Z.jsxs)(`label`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground`,title:`1–10000. Raise it when "Apply to existing items" reports fewer matches than you expect.`,children:[(0,Z.jsx)(Ci,{className:`h-3.5 w-3.5 shrink-0`}),(0,Z.jsx)(`span`,{children:`Apply / run in batches of`}),(0,Z.jsx)(q,{type:`number`,min:1,max:1e4,step:100,value:_e,onChange:e=>ve(e.target.value),onBlur:ye,onKeyDown:e=>{e.key===`Enter`&&(ye(),e.target.blur())},className:`h-7 w-20 px-2 text-xs`}),(0,Z.jsx)(`span`,{children:`documents per pass — the rule "Apply" button and manual hook runs stop after that many.`})]}),(0,Z.jsxs)(`p`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Z.jsx)(or,{className:`h-3.5 w-3.5 shrink-0`}),(0,Z.jsxs)(`span`,{children:[`Everything here lives in the workspace git repo. Clone it with`,` `,(0,Z.jsxs)(`code`,{className:`break-all rounded bg-muted px-1 py-0.5 font-mono select-all`,children:[`git clone `,Le.replace(`://`,`://canvas@`)]}),` `,`(password: a canvas API token; the `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`canvas@`}),` username is arbitrary but git needs one). Pushes hot-reload hooks.`]})]})]})}function DN({state:e}){if(e.error)return(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:e.error});if(!e.run)return(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading…`});let t=e.run,n={error:`text-destructive`,warn:`text-warning`,info:`text-foreground`,debug:`text-muted-foreground`};return(0,Z.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`run `,(0,Z.jsx)(`span`,{className:`font-mono`,children:t.runId})]}),(0,Z.jsxs)(`span`,{children:[`trigger `,(0,Z.jsx)(`span`,{className:`font-mono`,children:t.trigger})]}),t.eventId&&(0,Z.jsxs)(`span`,{children:[`event `,(0,Z.jsx)(`span`,{className:`font-mono`,children:t.eventId})]}),(0,Z.jsxs)(`span`,{children:[t.durationMs,` ms`]})]}),t.actions&&t.actions.length>0&&(0,Z.jsx)(`ol`,{className:`space-y-0.5 font-mono`,children:t.actions.map((e,t)=>(0,Z.jsxs)(`li`,{className:e.status===`error`?`text-destructive`:e.status===`skipped`?`text-muted-foreground`:``,children:[t+1,`. `,e.action,` → `,e.status,e.error?` — ${e.error}`:``]},t))}),t.trace&&t.trace.length>0?(0,Z.jsx)(`pre`,{className:`max-h-96 overflow-auto rounded-md border bg-background p-2 font-mono text-[11px] leading-relaxed whitespace-pre-wrap break-all`,children:t.trace.map((e,t)=>(0,Z.jsxs)(`span`,{className:`block ${n[e.level]||``}`,children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[`+`,String(e.t).padStart(5,` `),`ms `]}),(0,Z.jsxs)(`span`,{className:`uppercase text-muted-foreground`,children:[e.level.padEnd(5,` `),` `]}),e.msg]},t))}):(0,Z.jsxs)(`p`,{className:`text-muted-foreground`,children:[`No execution log recorded for this run`,t.error?``:` (older runs predate tracing)`,`.`]})]})}var ON=e=>`/workspaces/${e}/storage-policies`;function kN(){return`policy-${crypto.randomUUID().slice(0,8)}`}function AN(e){return e.filter(e=>e.enabled&&e.capabilities?.upload&&!e.config?.readOnly&&e.driver!==`cacache`)}var jN=new Set([`file`]);function MN(e,t){return`${e===`directory`?`dir`:`ctx`}:${t.startsWith(`/`)?t:`/${t}`}`}function NN(e){let t=/^(ctx|dir):(\/.*)$/.exec(e);return t?{tree:t[1]===`dir`?`directory`:`context`,path:t[2]}:null}function PN(e){return(NN(e)?.path??e).replace(/^\/+/,``)}function FN(e){return`${e.backend}:${e.folder||`/`}`}async function IN(e){let t=await J.get(ON(e));return{...t,policies:t?.policies??[],revision:t.revision,blobBackend:t?.blobBackend??null}}async function LN(e,t,n){return J.put(ON(e),{policies:t,revision:n})}async function RN(e,t,n={}){return await J.post(`${ON(e)}/${encodeURIComponent(t)}/apply`,n)}async function zN(e,t,n){let{policies:r,revision:i}=n??await IN(e),a=r.findIndex(e=>e.id===t.id);return LN(e,a===-1?[...r,t]:r.map((e,n)=>n===a?t:e),i)}async function BN(e,t,n,r={}){let i={folders:0,processed:0,matched:0,failed:0},a=0;for(;a!==null;){let o=await RN(e,t,{limit:r.limit??100,offset:a,dryRun:r.dryRun});if(i.folders+=o.folders??0,i.processed+=o.processed??0,i.matched+=o.matched??0,i.failed+=o.failed??0,n?.(o,i),o.nextOffset===void 0)throw Error(`The policy is saved, but applying it to existing documents needs an updated server.`);a=o.nextOffset}return i}function VN(e,t,n){let r=MN(t,n),i=r.endsWith(`/`)?r:`${r}/`;return e.filter(e=>{if(!e.enabled)return!1;if(e.path===r)return!0;if(!e.recursive)return!1;let t=e.path.endsWith(`/`)?e.path:`${e.path}/`;return i.startsWith(t)})}function HN(e){let t=new Set;for(let n of e)for(let e of n.targets)t.add(FN(e));return[...t].join(`, `)}async function UN(e,t){await J.post(`${ON(e)}/operations/${encodeURIComponent(t)}/retry`,{})}function WN(e){return!e||!e.mime&&!e.filename&&(!e.schema||e.schema===`file`)?`files`:e.mime===`image/*`&&!e.filename&&(!e.schema||e.schema===`file`)?`images`:`custom`}function GN(e,t){return{backend:e?.address??``,folder:t,recursive:!0,recreateDirectories:!!e&&jN.has(e.driver),onConflict:`error`}}function KN({workspaceId:e,path:t,policy:n,onClose:r,onSaved:i}){let a=!!n,[o]=(0,X.useState)(()=>n?.id??kN()),[s,c]=(0,X.useState)(n?.kind||`mirror`),[l,u]=(0,X.useState)(n?.description??``),[d,f]=(0,X.useState)(n?.recursive??!0),[p,m]=(0,X.useState)(()=>WN(n?.filter)),[h,g]=(0,X.useState)(n?.filter?.mime??``),[_,v]=(0,X.useState)(n?.filter?.filename??``),[y,b]=(0,X.useState)(n?.targets??[]),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(null),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(!1),[k,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(``),[N,P]=(0,X.useState)(0),[ee,F]=(0,X.useState)(0),[I,te]=(0,X.useState)(0);Ae(r,!D);let L=()=>{D||r()},R=(0,X.useMemo)(()=>PN(t),[t]),ne=(0,X.useMemo)(()=>AN(C??[]).filter(e=>s===`filing`||e.driver===`file`),[C,s]),re=(0,X.useMemo)(()=>new Map(ne.map(e=>[e.address,e])),[ne]);(0,X.useEffect)(()=>{let t=!1;return Promise.all([Rc(e),IN(e)]).then(([e,r])=>{if(t)return;if(n&&JSON.stringify(r.policies.find(e=>e.id===n.id))!==JSON.stringify(n))throw Error(`This policy changed. Close and reopen the editor.`);S(r),w(e);let i=AN(e).find(e=>n?.kind===`filing`||e.driver===`file`);i&&b(e=>e.length?e:[GN(i,R)])}).catch(e=>{t||(w([]),M(e instanceof Error?e.message:`Could not load backends`))}),()=>{t=!0}},[e,R,n]);let ae=(e,t)=>b(n=>n.map((n,r)=>r===e?{...n,...t}:n)),z=(e,t)=>{let n=re.get(t),r=!!n&&jN.has(n.driver);ae(e,{backend:t,recreateDirectories:r?y[e].recreateDirectories:!1})},oe=()=>{if(!y.length)throw Error(`Add at least one target.`);let e=y.map(e=>{if(!e.backend)throw Error(`Choose a backend for every target.`);let t={backend:e.backend,folder:e.folder.trim().replace(/^\/+|\/+$/g,``),recursive:e.recursive,recreateDirectories:e.recreateDirectories,onConflict:e.onConflict??`error`};if(s===`filing`&&e.key?.trim()&&(t.key=e.key.trim()),s===`filing`&&(t.recreateDirectories=!1),s===`mirror`&&t.folder.includes(`{{`))throw Error(`Folder templates require a filing policy.`);return t}),r;return p===`images`?r={schema:`file`,mime:`image/*`}:p===`custom`&&(r={schema:`file`},h.trim()&&(r.mime=h.trim()),_.trim()&&(r.filename=_.trim())),{id:o,kind:s,enabled:n?.enabled??!0,...l.trim()?{description:l.trim()}:{},path:t,recursive:d,...r?{filter:r}:{},targets:e}},se=async()=>{if(!D){O(!0),M(``);try{let t=oe();T||(await zN(e,t,x),E(!0),i?.(t)),P(0),F(0),te(0),await BN(e,o,(e,t)=>{P(t.matched),F(t.folders),te(t.failed)}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`)),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`)),A(!0)}catch(e){M(e instanceof Error?e.message:`Could not save the storage policy`)}finally{O(!1)}}},B=!!x&&y.length>0&&y.every(e=>e.backend);return(0,Z.jsx)(Le,{onClose:L,children:(0,Z.jsxs)(`section`,{role:`dialog`,"aria-modal":`true`,"aria-labelledby":`storage-policy-title`,className:`${ie} flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card shadow-elevation-4`,children:[(0,Z.jsxs)(`div`,{className:`flex h-12 shrink-0 items-center justify-between border-b px-4`,children:[(0,Z.jsxs)(`h2`,{id:`storage-policy-title`,className:`flex items-center gap-2 text-sm font-medium`,children:[(0,Z.jsx)(gr,{className:`h-4 w-4`}),a?`Edit storage policy`:`Storage policy`]}),(0,Z.jsx)(`button`,{type:`button`,onClick:L,disabled:D,"aria-label":`Close`,className:`p-1 disabled:opacity-40`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Virtual path`}),(0,Z.jsx)(`p`,{className:`mt-1 break-words text-sm`,children:t})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Documents filed here are copied to every target in order. Uploads stay local until every destination has been verified. Mirrors move removed copies to Trash; filing policies keep their copies.`}),(0,Z.jsxs)(`fieldset`,{disabled:D||T,className:`space-y-3 text-sm`,children:[(0,Z.jsxs)(`label`,{className:`block`,children:[`Behavior`,(0,Z.jsxs)(`select`,{"aria-label":`Storage behavior`,className:`ml-2 rounded border bg-background p-2`,value:s,onChange:e=>c(e.target.value),children:[(0,Z.jsx)(`option`,{value:`mirror`,children:`Mirror (recoverable removal)`}),(0,Z.jsx)(`option`,{value:`filing`,children:`File copies (keep after unlink)`})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-description`,children:`Description (optional)`}),(0,Z.jsx)(`input`,{id:`policy-description`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:l,onChange:e=>u(e.target.value),placeholder:`e.g. Accounting archive`})]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:d,onChange:e=>f(e.target.checked),className:`mt-1`}),`Apply to subfolders`]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-filter`,children:`Documents`}),(0,Z.jsxs)(`select`,{id:`policy-filter`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:p,onChange:e=>m(e.target.value),children:[(0,Z.jsx)(`option`,{value:`files`,children:`Files`}),(0,Z.jsx)(`option`,{value:`images`,children:`Images`}),(0,Z.jsx)(`option`,{value:`custom`,children:`Custom…`})]}),p===`custom`&&(0,Z.jsxs)(`div`,{className:`mt-2 grid grid-cols-2 gap-2`,children:[(0,Z.jsx)(`input`,{"aria-label":`MIME type`,className:`rounded-md border bg-background p-2`,value:h,onChange:e=>g(e.target.value),placeholder:`image/*`}),(0,Z.jsx)(`input`,{"aria-label":`Filename glob`,className:`rounded-md border bg-background p-2`,value:_,onChange:e=>v(e.target.value),placeholder:`img*`})]})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Targets`}),C===null&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading backends…`}),C!==null&&!ne.length&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:`No writable backend available. Add a folder or drive under Files & storage first.`}),y.map((e,t)=>{let n=re.get(e.backend),r=s===`mirror`&&!!n&&jN.has(n.driver);return(0,Z.jsxs)(`fieldset`,{disabled:D||T,className:`space-y-2 rounded-lg border p-2 text-sm`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsxs)(`select`,{"aria-label":`Backend`,className:`min-w-0 flex-1 rounded-md border bg-background p-2`,value:e.backend,onChange:e=>z(t,e.target.value),children:[!e.backend&&(0,Z.jsx)(`option`,{value:``,children:`Choose a backend…`}),ne.map(e=>(0,Z.jsxs)(`option`,{value:e.address,children:[e.address,` (`,e.driver,`)`]},e.address)),e.backend&&!n&&(0,Z.jsxs)(`option`,{value:e.backend,children:[e.backend,` (unavailable)`]})]}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Remove target`,onClick:()=>b(e=>e.filter((e,n)=>n!==t)),className:`p-1 disabled:opacity-40`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-folder-${t}`,children:`Folder on the backend`}),(0,Z.jsx)(`input`,{id:`policy-folder-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:e.folder,onChange:e=>ae(t,{folder:e.target.value}),placeholder:`(backend root)`})]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:e.recursive,onChange:e=>ae(t,{recursive:e.target.checked}),className:`mt-1`}),`Recreate sub-folder path in destination`]}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2 ${r?``:`opacity-60`}`,title:r?void 0:`Empty folders require a mirror on a supported file backend.`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:r&&e.recreateDirectories,disabled:!r,onChange:e=>ae(t,{recreateDirectories:e.target.checked}),className:`mt-1`}),`Create folders on the backend`]}),(0,Z.jsxs)(`details`,{children:[(0,Z.jsx)(`summary`,{className:`cursor-pointer text-xs text-muted-foreground`,children:`Advanced`}),(0,Z.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[s===`filing`&&(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-key-${t}`,children:`File-name template (optional)`}),(0,Z.jsx)(`input`,{id:`policy-key-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2 font-mono text-xs`,value:e.key??``,onChange:e=>ae(t,{key:e.target.value}),placeholder:`{{YYYY}}{{MM}}{{DD}}_{{basename}}{{ext}}`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`block text-xs text-muted-foreground`,htmlFor:`policy-conflict-${t}`,children:`On name conflict`}),(0,Z.jsxs)(`select`,{id:`policy-conflict-${t}`,className:`mt-1 w-full rounded-md border bg-background p-2`,value:e.onConflict??`error`,onChange:e=>ae(t,{onConflict:e.target.value}),children:[(0,Z.jsx)(`option`,{value:`error`,children:`Stop with an error`}),(0,Z.jsx)(`option`,{value:`rename`,children:`Rename the new file`}),n?.driver===`file`&&(0,Z.jsx)(`option`,{value:`overwrite`,children:`Overwrite (retain previous bytes)`})]})]})]})]})]},t)}),!T&&(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:D||!ne.length,onClick:()=>b(e=>[...e,GN(ne.find(t=>!e.some(e=>e.backend===t.address))??ne[0],R)]),children:[(0,Z.jsx)(br,{className:`mr-1 h-4 w-4`}),`Add target…`]})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Applies to existing and future documents. Transfer progress and errors appear in Storage policies settings.`}),D&&(0,Z.jsx)(`p`,{role:`status`,className:`text-sm`,children:T?`Applying to existing documents… ${N} planned, ${ee} folders`:`Saving storage policy…`}),k&&(0,Z.jsxs)(`p`,{role:`status`,className:`text-sm`,children:[`Storage policy saved. `,N,` documents and `,ee,` folders planned. Replication continues in the background.`]}),I>0&&(0,Z.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[I,` document operations failed. Check operation status in Storage policies settings.`]}),j&&(0,Z.jsxs)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:[T?`The policy is saved. `:``,j]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t p-3`,children:[(0,Z.jsx)(Y,{variant:`ghost`,disabled:D,onClick:L,children:`Cancel`}),k?(0,Z.jsx)(Y,{onClick:r,children:`Done`}):(0,Z.jsx)(Y,{disabled:D||!B,onClick:se,children:D?`Applying…`:T?`Retry existing documents`:a?`Save policy`:`Enable policy`})]})]})})}var qN={policies:[],revision:``,loading:!1,error:``},JN=new Map,YN=new Set;function XN(){for(let e of YN)e()}function ZN(e){return YN.add(e),()=>{YN.delete(e)}}function QN(e,t){JN.set(e,t),XN()}async function $N(e){QN(e,{...JN.get(e)??qN,loading:!0,error:``});try{let{policies:t,revision:n,status:r}=await IN(e);QN(e,{policies:t,revision:n,status:r,loading:!1,error:``})}catch(t){QN(e,{policies:[],revision:``,loading:!1,error:t instanceof Error?t.message:`Could not load storage policies`})}}function eP(e){JN.delete(e),XN()}function tP(e){let t=(0,X.useSyncExternalStore)(ZN,()=>e&&JN.get(e)||qN),n=!!e&&!JN.has(e);(0,X.useEffect)(()=>{e&&n&&$N(e)},[e,n]);let r=(0,X.useCallback)(async()=>{e&&await $N(e)},[e]);return(0,X.useEffect)(()=>{if(!e||!t.policies.length)return;let n=window.setInterval(()=>{!document.hidden&&!JN.get(e)?.loading&&$N(e)},5e3);return()=>window.clearInterval(n)},[e,t.policies.length]),{policies:t.policies,revision:t.revision,status:t.status,loading:t.loading,error:t.error,refresh:r}}function nP({checked:e,disabled:t,onClick:n,label:r}){return(0,Z.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":e,"aria-label":r,disabled:t,onClick:n,className:`relative inline-flex h-5 w-9 shrink-0 rounded-full border-2 border-transparent transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${e?`bg-primary`:`bg-muted-foreground/30`}`,children:(0,Z.jsx)(`span`,{className:`pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow transition-transform ${e?`translate-x-4`:`translate-x-0`}`})})}function rP({children:e,title:t}){return(0,Z.jsx)(`span`,{title:t,className:`rounded border px-1 py-px text-[10px] uppercase tracking-wide text-muted-foreground`,children:e})}function iP(e){let t=e.filter;return!t||!t.mime&&!t.filename&&(!t.schema||t.schema===`file`)?`Files`:t.mime===`image/*`&&!t.filename?`Images`:[t.schema&&t.schema!==`file`?t.schema:null,t.mime,t.filename].filter(Boolean).join(` · `)}function aP({workspaceId:e}){let{policies:t,revision:n,status:r,loading:i,error:a,refresh:o}=tP(e),{showToast:s}=wo(),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(``),m=(e,t)=>s({title:`Error`,description:e instanceof Error?e.message:t,variant:`destructive`}),h=async r=>{d(r.id);try{await LN(e,t.map(e=>e.id===r.id?{...e,enabled:!e.enabled}:e),n),eP(e)}catch(e){m(e,`Could not update the policy`)}finally{d(null)}},g=async r=>{if(window.confirm(`Delete the storage policy for "${r.path}"? Files already placed on the targets stay where they are.`)){d(r.id);try{await LN(e,t.filter(e=>e.id!==r.id),n),eP(e)}catch(e){m(e,`Could not delete the policy`)}finally{d(null)}}},_=async t=>{d(t.id),p(`Applying…`);try{let n=await BN(e,t.id,(e,t)=>p(`Applying… ${t.matched} planned, ${t.folders} folders`));s({title:n.failed?`Planning errors`:`Replication queued`,description:`${n.matched} documents and ${n.folders} folders planned${n.failed?`, ${n.failed} failed — see operation status`:``}.`,variant:n.failed?`destructive`:void 0}),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`))}catch(e){m(e,`Could not apply the policy`)}finally{d(null),p(``)}};return(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(gr,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Storage policies`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`A mirror keeps filed documents on its targets and moves removed copies to Trash. A filing policy makes copies that stay on the targets. Uploads are kept locally until every required destination has been verified.`}),r?.error&&(0,Z.jsx)(`p`,{role:`alert`,className:`mt-2 text-xs text-destructive`,children:r.error.message}),r?.operations?.operations.filter(e=>e.state!==`complete`).map(t=>(0,Z.jsxs)(`div`,{className:`mt-2 rounded border p-2 text-xs`,children:[(0,Z.jsxs)(`p`,{children:[t.owner,`: `,t.state]}),(0,Z.jsx)(`p`,{children:t.error?.message}),t.outcomes.map(e=>(0,Z.jsxs)(`p`,{children:[e.backend,`:`,e.key,` — `,e.state]},`${e.backend}:${e.key}`)),t.state===`blocked`&&(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>{UN(e,t.id).then(o).catch(e=>m(e,`Retry failed`))},children:`Retry`})]},t.id)),a&&(0,Z.jsx)(`p`,{role:`alert`,className:`mt-2 text-xs text-destructive`,children:a})]}),i&&!t.length&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading…`}),!i&&!t.length&&(0,Z.jsxs)(`section`,{className:`rounded-lg border border-dashed p-6 text-center`,children:[(0,Z.jsx)(gr,{className:`mx-auto h-6 w-6 text-muted-foreground`}),(0,Z.jsx)(`p`,{className:`mt-2 text-sm`,children:`No storage policies yet.`}),(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Right-click a folder in the context or directory tree and choose `,(0,Z.jsx)(`span`,{className:`font-medium text-foreground`,children:`Storage policy…`}),` to mirror it to a backend.`]})]}),t.map(e=>{let t=u===e.id;return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4 ${e.enabled?``:`opacity-70`}`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`h3`,{className:`break-all font-mono text-sm font-semibold`,children:e.path}),e.recursive&&(0,Z.jsx)(rP,{children:`subfolders`}),(0,Z.jsx)(rP,{children:iP(e)}),!e.enabled&&(0,Z.jsx)(rP,{children:`disabled`})]}),e.description&&(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}),(0,Z.jsx)(`ul`,{className:`mt-2 space-y-1`,children:e.targets.map((e,t)=>(0,Z.jsxs)(`li`,{className:`flex flex-wrap items-center gap-2 text-xs`,children:[(0,Z.jsx)(`span`,{className:`font-mono`,children:FN(e)}),e.recursive&&(0,Z.jsx)(rP,{children:`sub-path`}),e.recreateDirectories&&(0,Z.jsx)(rP,{children:`folders`}),e.key&&(0,Z.jsx)(rP,{title:e.key,children:`named`}),e.onConflict&&e.onConflict!==`error`&&(0,Z.jsx)(rP,{children:e.onConflict})]},`${e.backend}:${t}`))}),t&&f&&(0,Z.jsx)(`p`,{role:`status`,className:`mt-2 text-xs text-muted-foreground`,children:f})]}),(0,Z.jsx)(nP,{checked:e.enabled,disabled:t,onClick:()=>h(e),label:e.enabled?`Disable policy`:`Enable policy`})]}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:t,onClick:()=>l(e),children:[(0,Z.jsx)(Lr,{className:`mr-1 h-3.5 w-3.5`}),`Edit`]}),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:t||!e.enabled,onClick:()=>_(e),children:[(0,Z.jsx)(Ar,{className:`mr-1 h-3.5 w-3.5`}),`Apply to existing`]}),(0,Z.jsxs)(Y,{variant:`ghost`,size:`sm`,onClick:()=>{o()},children:[(0,Z.jsx)(ui,{className:`mr-1 h-3.5 w-3.5`}),`Refresh status`]}),(0,Z.jsxs)(Y,{variant:`ghost`,size:`sm`,disabled:t,className:`text-destructive`,onClick:()=>g(e),children:[(0,Z.jsx)(Qr,{className:`mr-1 h-3.5 w-3.5`}),`Delete`]})]})]},e.id)}),c&&(0,Z.jsx)(KN,{workspaceId:e,path:c.path,policy:c,onClose:()=>l(null),onSaved:()=>{eP(e),o()}})]})}var oP=e=>`${no.workspaces}/${encodeURIComponent(e)}`;async function sP(e){return await J.get(`${oP(e)}/mirrors`)||[]}async function cP(e,t){await J.delete(`${oP(e)}/mirrors/${encodeURIComponent(t)}`)}async function lP(e,t=10){return J.get(`${oP(e)}/mirrors/protection?sample=${t}`)}async function uP(e,t,n){return(await J.patch(`${oP(e)}/mirrors/${encodeURIComponent(t)}`,n)).replica}async function dP(e){return await J.get(`${oP(e)}/sync/conflicts`)||[]}async function fP(e,t,n){return J.post(`${oP(e)}/sync/conflicts/${t}/resolve`,{keep:n})}var pP=e=>{if(e==null||e===``)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})},mP=e=>e==null?`—`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:e<1073741824?`${(e/1024/1024).toFixed(1)} MB`:`${(e/1024/1024/1024).toFixed(2)} GB`,hP=e=>e?e.slice(0,12):`—`;function gP({mirror:e,now:t,busy:n,onForget:r,onRequired:i}){let a=e.mirror,o=!e.lastSeen||t-new Date(e.lastSeen).getTime()>6e5,s=e.replica?.role===`cache`||a.client===`fuse`,c=e.replica?.required===!0,l=a.direction||(a.client===`fuse`?`bi`:void 0);return(0,Z.jsx)(`div`,{className:`rounded-lg border p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Z.jsx)(Ha,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:e.name||e.deviceId}),a.client&&(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono uppercase`,children:a.client}),l&&(0,Z.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-mono`,title:l===`pull`?`Backup target: the hub is the only writer`:l===`push`?`One-shot import: local is the only writer`:`Both ways`,children:l===`pull`?`⇣ pull`:l===`push`?`⇡ push`:`⇅ bi`}),c&&(0,Z.jsx)(`span`,{className:`rounded bg-emerald-500/15 px-1.5 py-0.5 text-[10px] font-mono text-emerald-700 dark:text-emerald-300`,title:`Counts toward protection`,children:`required`}),(0,Z.jsx)(`span`,{className:`rounded px-1.5 py-0.5 text-[10px] font-mono ${o?`bg-muted text-muted-foreground`:`bg-emerald-500/15 text-emerald-700 dark:text-emerald-300`}`,children:a.state||(o?`offline`:`online`)})]}),a.path&&(0,Z.jsx)(`p`,{className:`mt-0.5 text-[11px] font-mono text-muted-foreground truncate`,children:a.path}),(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-x-4 gap-y-0.5 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{title:`Change-log entries the device has not applied yet`,children:[`lag `,e.lag??`—`]}),(0,Z.jsxs)(`span`,{title:`Local changes waiting to be pushed`,children:[`pending `,a.pending??0]}),(a.failed??0)>0&&(0,Z.jsxs)(`span`,{className:`text-destructive`,children:[`failed `,a.failed]}),(a.conflicts??0)>0&&(0,Z.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`conflicts `,a.conflicts]}),(a.skipped??0)>0&&(0,Z.jsxs)(`span`,{children:[`skipped `,a.skipped]}),(a.reverted??0)>0&&(0,Z.jsxs)(`span`,{title:`Local edits parked in .workspace/conflicts and replaced by the hub version`,children:[`reverted `,a.reverted]}),e.behind!=null&&(0,Z.jsxs)(`span`,{title:`Documents whose current version this device does not hold yet`,className:e.behind>0&&c?`text-amber-600 dark:text-amber-400`:``,children:[`behind `,e.behind]}),(0,Z.jsxs)(`span`,{children:[`last sync `,pP(a.lastSync)]}),(0,Z.jsxs)(`span`,{children:[`seen `,pP(e.lastSeen)]}),a.prefixes&&a.prefixes.length>0&&(0,Z.jsx)(`span`,{className:`font-mono`,children:a.prefixes.join(`, `)})]}),a.lastError&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-destructive`,children:a.lastError}),(0,Z.jsxs)(`label`,{className:`mt-2 flex items-center gap-2 text-[11px] ${s?`text-muted-foreground`:``}`,title:s?`A cache never counts toward protection`:`A document is protected once every required replica holds its current version`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`h-3 w-3`,checked:c,disabled:n||s,onChange:e=>i(e.target.checked)}),`required for protection`]})]})]}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:r,disabled:n,title:`Forget this mirror record (the device is not revoked)`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})})}function _P({p:e}){let t=e.required.length===0,n=e.unprotected??0,r=t||n>0?ha:Fi,i=t?`text-muted-foreground`:n>0?`text-amber-600 dark:text-amber-400`:`text-emerald-700 dark:text-emerald-300`;return(0,Z.jsx)(`div`,{className:`rounded-lg border p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Z.jsx)(r,{className:`h-4 w-4 mt-0.5 shrink-0 ${i}`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 text-[11px]`,children:[t?(0,Z.jsxs)(`p`,{className:`text-sm`,children:[`No replica is marked `,(0,Z.jsx)(`span`,{className:`font-medium`,children:`required`}),` yet — nothing is counted as protected. Tick it on the device that must hold every document (the backup).`]}):(0,Z.jsxs)(`p`,{className:`text-sm`,children:[(0,Z.jsxs)(`span`,{className:`font-medium ${i}`,children:[e.protected??0,` of `,e.total-e.unversioned]}),` documents are held at their current version by every required replica`,n>0&&(0,Z.jsxs)(`span`,{className:i,children:[` · `,n,` not yet`]}),e.partial&&(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[` (first `,e.total,` checked)`]})]}),e.oldestUnprotected.length>0&&(0,Z.jsxs)(`ul`,{className:`mt-1 space-y-0.5 font-mono text-muted-foreground`,children:[e.oldestUnprotected.slice(0,5).map(e=>(0,Z.jsxs)(`li`,{className:`truncate`,title:`document ${e.docId} v${e.version}`,children:[e.key,` `,(0,Z.jsxs)(`span`,{className:`opacity-70`,children:[`· `,pP(e.mtime)]})]},`${e.docId}:${e.key}`)),e.oldestUnprotected.length>5&&(0,Z.jsxs)(`li`,{children:[`… and `,e.oldestUnprotected.length-5,` more`]})]})]})]})})}function vP({conflict:e,busy:t,onResolve:n}){let r=!e.hub;return(0,Z.jsxs)(`div`,{className:`rounded-lg border p-3 space-y-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,Z.jsx)(dr,{className:`h-4 w-4 text-amber-500 mt-0.5 shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium font-mono break-all`,children:e.key}),(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`from `,(0,Z.jsx)(`span`,{className:`font-medium`,children:e.deviceName||e.device||`unknown device`}),` · `,pP(e.ts),e.mode===`rename`&&e.conflictKey&&(0,Z.jsxs)(Z.Fragment,{children:[` · already on disk as `,(0,Z.jsx)(`span`,{className:`font-mono`,children:e.conflictKey})]})]})]})]}),(0,Z.jsxs)(`div`,{className:`grid grid-cols-1 gap-2 text-[11px] sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`rounded border border-dashed p-2`,children:[(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`Hub version (keeps the name)`}),e.hub?(0,Z.jsxs)(`div`,{className:`font-mono`,children:[hP(e.hub.sha256),` · `,mP(e.hub.size),` · `,pP(e.hub.mtime)]}):(0,Z.jsx)(`div`,{className:`italic text-muted-foreground`,children:`no file at this key any more`})]}),(0,Z.jsxs)(`div`,{className:`rounded border border-dashed p-2`,children:[(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`Incoming version (the device’s)`}),(0,Z.jsxs)(`div`,{className:`font-mono`,children:[hP(e.incoming.sha256),` · `,mP(e.incoming.size),` · `,pP(e.incoming.mtime)]})]})]}),e.resolvable?(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t||r,onClick:()=>n(`hub`),title:`Discard the device's version`,children:`Keep hub`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:()=>n(`incoming`),title:`The device's bytes replace the hub's; tags, relations and placements move over`,children:`Keep incoming`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:()=>n(`both`),title:`Keep the hub file and add the device's version under a conflict name`,children:`Keep both`})]}):(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Dropbox-style conflict copy: both files are on disk, delete the one you do not need.`})]})}function yP({workspaceId:e,workspaceUuid:t}){let{showToast:n}=wo(),[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)([]),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(0),h=(0,X.useRef)(null),g=(0,X.useCallback)(async(t=!1)=>{if(e){t||u(!0);try{let[t,n,r]=await Promise.all([sP(e),dP(e),lP(e).catch(()=>null)]);i(t),o(n),c(r),m(Date.now())}catch(e){t||n({title:`Error`,description:e instanceof Error?e.message:`Failed to load sync state`,variant:`destructive`})}finally{t||u(!1)}}},[e]);(0,X.useEffect)(()=>{g()},[g]),(0,X.useEffect)(()=>{if(!t)return;let e=`workspace:${t}`,n=()=>B.emit(`subscribe`,{channel:e}),r=B.on(`connect`,n);n();let i=e=>{let n=e;n?.workspaceId&&n.workspaceId!==t||(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,g(!0)},800))},a=[`backend.changed`,`sync.conflict.created`,`sync.conflict.resolved`].map(e=>B.on(e,i));return()=>{r(),a.forEach(e=>e()),B.emit(`unsubscribe`,{channel:e}),h.current&&=(clearTimeout(h.current),null)}},[t,g]);let _=async t=>{f(`mirror:${t}`);try{await cP(e,t),i(e=>e.filter(e=>e.deviceId!==t)),n({title:`Forgotten`,description:`Mirror record removed. The device keeps running and will report again if it still syncs this workspace.`})}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to forget mirror`,variant:`destructive`})}finally{f(null)}},v=async(t,r)=>{f(`mirror:${t}`);try{let n=await uP(e,t,{required:r});i(e=>e.map(e=>e.deviceId===t?{...e,replica:{role:n.role,required:n.required}}:e)),c(await lP(e).catch(()=>null))}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to update replica policy`,variant:`destructive`})}finally{f(null)}},y=async(t,r)=>{f(`conflict:${t.docId}`);try{let i=await fP(e,t.docId,r);o(e=>e.filter(e=>e.docId!==t.docId));let a=r===`hub`?`kept the hub version`:r===`incoming`?`the device version now holds the name`:`kept both (${i.resultKey||`conflict copy`})`;n({title:`Resolved`,description:`${t.key}: ${a}`})}catch(e){n({title:`Error`,description:e instanceof Error?e.message:`Failed to resolve conflict`,variant:`destructive`})}finally{f(null)}};return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Device mirrors`}),(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Devices keeping this workspace’s files in sync (canvas-fuse `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`--mirror`}),`, canvas-edge). Lag counts change-log entries the device has not applied yet.`]})]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>g(),disabled:l,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${l?`animate-spin`:``}`}),`Refresh`]})]}),l&&r.length===0&&a.length===0?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading…`]}):r.length===0?(0,Z.jsxs)(`div`,{className:`rounded-lg border border-dashed p-4 text-xs text-muted-foreground`,children:[`No device mirrors this workspace yet. Mount it with `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`canvas-fuse mount -w <workspace> ~/Workspaces --mirror`}),` on a device and it shows up here.`]}):(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[s&&(0,Z.jsx)(_P,{p:s}),r.map(e=>(0,Z.jsx)(gP,{mirror:e,now:p,busy:d===`mirror:${e.deviceId}`,onForget:()=>_(e.deviceId),onRequired:t=>v(e.deviceId,t)},e.deviceId))]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Conflicts`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`A device and the hub both changed the same file. The hub’s version keeps the filename; decide what happens to the device’s. Tags, relations and placements follow whichever version survives.`})]}),a.length===0?(0,Z.jsx)(`div`,{className:`rounded-lg border border-dashed p-4 text-xs text-muted-foreground`,children:`Nothing to resolve.`}):(0,Z.jsx)(`div`,{className:`space-y-2`,children:a.map(e=>(0,Z.jsx)(vP,{conflict:e,busy:d===`conflict:${e.docId}`,onResolve:t=>y(e,t)},e.docId))})]})}function bP({workspaceId:e,address:t,selectedChats:n=[],onSaved:r}){let[i,a]=(0,X.useState)(n),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(``);return(0,X.useEffect)(()=>{if(!c)return;let n=!1,r,i=async()=>{try{let r=await ue(e,t);n||(d(r),p(``))}catch(e){n||p(e instanceof Error?e.message:`Connection unavailable`)}n||(r=setTimeout(()=>void i(),3e3))};return i(),()=>{n=!0,clearTimeout(r)}},[e,t,c]),(0,Z.jsxs)(`div`,{className:`mb-2`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>{c||a(n),l(!c)},children:c?`Close connection panel`:`Pair / connection status`}),c&&(0,Z.jsxs)(`div`,{className:`space-y-2 p-2 text-xs`,children:[(0,Z.jsx)(`p`,{children:f||u?.state||`Connecting…`}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>{window.confirm(`Forget the current session and pair this account again?`)&&rn(e,t).catch(e=>p(e.message))},children:`Pair again`}),u?.qr&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{children:`WhatsApp → Settings → Linked devices → Link a device.`}),(0,Z.jsx)(`img`,{className:`max-w-full`,src:u.qr,width:256,height:256,alt:`WhatsApp device pairing QR code`})]}),u?.chats.length?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{children:`Select conversations to synchronize into this workspace.`}),(0,Z.jsx)(`div`,{className:`max-h-48 overflow-auto`,children:u.chats.map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,disabled:o,checked:i.includes(e.id),onChange:t=>a(n=>t.target.checked?[...n,e.id]:n.filter(t=>t!==e.id))}),e.name,` · `,(0,Z.jsx)(`code`,{children:e.id})]},e.id))}),(0,Z.jsx)(Y,{size:`sm`,disabled:o,onClick:async()=>{s(!0),p(``);try{await Fo(e,`whatsapp`,t,{chats:i}),await r?.()}catch(e){p(e instanceof Error?e.message:`Could not save conversations`)}finally{s(!1)}},children:o?`Saving…`:`Save conversations and sync`}),!i.length&&(0,Z.jsx)(`p`,{children:`No conversations selected; messages will not be synchronized.`})]}):null]})]})}async function xP(){return(await J.get(`/oauth/google/redirect-uri`)).redirectUri}async function SP(e){let t=window.open(`about:blank`,`canvas-google-oauth`,`popup=yes,width=540,height=720`),n;try{n=await J.post(`/oauth/google/start`,e)}catch(e){throw t?.close(),e}if(!t)throw Error(`Popup blocked — allow popups for this site and try again`);t.location.href=n.url;let r=new URL(yo,window.location.origin).origin;return new Promise((e,i)=>{let a=!1,o=e=>{a||(a=!0,window.removeEventListener(`message`,s),window.clearInterval(c),window.clearTimeout(l),e())},s=t=>{if(t.origin!==r)return;let a=t.data;!a||a.type!==`canvas:oauth`||a.provider!==`google`||a.state!==n.state||(a.ok&&a.refreshToken?o(()=>e({refreshToken:a.refreshToken,account:a.account})):o(()=>i(Error(a.error||`Google sign-in failed`))))};window.addEventListener(`message`,s);let c=window.setInterval(()=>{t.closed&&window.setTimeout(()=>o(()=>i(Error(`Sign-in window closed before finishing`))),500)},500),l=window.setTimeout(()=>o(()=>{t.close(),i(Error(`Sign-in timed out`))}),n.expiresInMs||6e5)})}function CP({clientId:e,clientSecret:t,scope:n,onLinked:r,disabled:i}){let[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(null),{showToast:l}=wo(),u=e.trim().length>0&&t.trim().length>0;(0,X.useEffect)(()=>{let e=!1;return xP().then(t=>{e||c(t)}).catch(()=>{}),()=>{e=!0}},[]);let d=async()=>{o(!0);try{let i=await SP({clientId:e.trim(),clientSecret:t.trim(),scope:n});r(i),l({title:`Google account linked`,description:i.account?`Refresh token obtained for ${i.account}`:`Refresh token obtained`})}catch(e){l({title:`Google sign-in failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{o(!1)}};return(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:i||a||!u,onClick:()=>{d()},title:u?`Open the Google consent screen and fill in the refresh token`:`Enter the OAuth client id and secret first`,children:[(0,Z.jsx)(f,{icon:`mdi:google`,width:14,height:14,className:`mr-2`}),a?`Waiting for Google…`:`Sign in with Google to get a refresh token`]}),s&&(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground/80 break-all`,children:[`Register this redirect URI on the OAuth client (Google Cloud Console → Credentials → your Web application client → Authorized redirect URIs):`,` `,(0,Z.jsx)(`code`,{className:`select-all`,children:s})]})]})}var wP={git:{label:`Git repository`,icon:`mdi:git`,blurb:`Create a local repository or clone a remote into the workspace. Branches appear under Backends → Workspace → Git. Use Auto-Link on a branch or folder afterward to file its documents into a virtual tree.`,fields:[{key:`address`,label:`Repository name`,placeholder:`company-ui`,required:!0},{key:`url`,label:`Remote URL`,placeholder:`git@github.com:company/ui.git`,hint:`Leave empty for a local repository. Private repos use the server’s SSH keys or Git credential helper.`},{key:`branches`,label:`Branches to browse (empty means all)`,list:!0,placeholder:`main, jira-1234/myusername-int-qf`}]},github:{label:`GitHub Issues`,icon:`mdi:github`,blurb:`Issues from the listed github.com or GitHub Enterprise repos sync as todos. Token optional for public repos.`,fields:[{key:`address`,label:`Account label`,placeholder:`e.g. canvas-ui`,required:!0},{key:`baseUrl`,label:`GitHub Enterprise URL`,placeholder:`https://ghe.example.com`,hint:`Leave blank for github.com. Works with GitHub Enterprise Server (ghe.example.com) and GHE.com (yourco.ghe.com) — the web address is enough.`},{key:`token`,label:`Personal access token`,hint:`Optional for public repos; required for write-back and @me filters.`,secret:!0},{key:`repos`,label:`Repositories`,placeholder:`owner/repo, one per line`,hint:`owner/repo or the repo’s URL. Issues from each repo sync as todos.`,list:!0,required:!0},{key:`assignee`,label:`Only issues assigned to`,placeholder:`@me, a login, * or none`,hint:`Filters are applied by GitHub and combined with AND. Changing one re-syncs from scratch.`},{key:`creator`,label:`Only issues opened by`,placeholder:`@me or a login`},{key:`mentioned`,label:`Only issues mentioning`,placeholder:`@me or a login`},{key:`labels`,label:`Only issues with all of these labels`,placeholder:`one per line`,list:!0},{key:`openOnly`,label:`Skip closed issues on first import`,hint:`Issues closed later still sync as completed.`,bool:!0},{key:`writeBack`,label:`Manage issues from Canvas`,hint:`Create, edit and close issues. Needs a PAT with repo scope.`,bool:!0},{key:`pruneRemoved`,label:`Remove items deleted at the source`,hint:`After each sync, issues that no longer exist in the repo are dropped from the mirror (kept as location-less orphans until database retention GC; skipped whenever the repo can’t be fully listed).`,bool:!0}]},slack:{label:`Slack`,icon:`mdi:slack`,blurb:`Channel messages sync as message documents. Bot/user token with channels:read + channels:history.`,fields:[{key:`address`,label:`Workspace label`,placeholder:`e.g. acme`,required:!0},{key:`token`,label:`Token (xoxb-… / xoxp-…)`,secret:!0,required:!0},{key:`channels`,label:`Conversations (channel names or IDs; DM IDs need im:read + im:history)`,list:!0},{key:`directMessages`,label:`Include direct messages`,hint:`Requires im:read, im:history, mpim:read and mpim:history.`,bool:!0},{key:`writeBack`,label:`Allow sending from Canvas`,hint:`Token also needs chat:write.`,bool:!0},{key:`allowAgentSend`,label:`Allow agents with workspace write access to send`,bool:!0}]},whatsapp:{label:`WhatsApp (linked device)`,icon:`mdi:whatsapp`,blurb:`Pair your phone with Canvas, then choose conversations. Uses Baileys; separate from WhatsApp Business.`,fields:[{key:`address`,label:`Account label`,placeholder:`personal`,hint:`Any unique label; no phone number required. Keep it unchanged after pairing.`,required:!0},{key:`chats`,label:`Conversation IDs to sync (one per line; available after pairing)`,list:!0},{key:`writeBack`,label:`Allow sending from Canvas`,bool:!0},{key:`allowAgentSend`,label:`Allow agents with workspace write access to send`,bool:!0}]},gcal:{label:`Google Calendar`,icon:`mdi:calendar-month`,blurb:`Events sync as calendar entries (recurring series kept as series). Offline-access OAuth credentials.`,fields:[{key:`address`,label:`Account label`,placeholder:`e.g. me-gmail`,required:!0},{key:`clientId`,label:`OAuth client id`,required:!0},{key:`clientSecret`,label:`OAuth client secret`,secret:!0,required:!0},{key:`refreshToken`,label:`Refresh token`,secret:!0,required:!0,oauth:`google`,oauthScope:`calendar.readonly`},{key:`calendars`,label:`Calendar ids (empty = primary)`,list:!0}]},caldav:{label:`CalDAV`,icon:`mdi:calendar-sync`,blurb:`Any CalDAV endpoint (GroupOffice, Nextcloud, Radicale, SOGo…). Read-only by default; enable write-back to create events from Canvas.`,fields:[{key:`address`,label:`Account label`,placeholder:`e.g. groupoffice`,required:!0},{key:`url`,label:`CalDAV URL (calendar home or one calendar)`,placeholder:`https://host/caldav/user`,required:!0},{key:`username`,label:`Username`},{key:`password`,label:`Password`,secret:!0},{key:`calendars`,label:`Calendars (names, empty = all)`,list:!0},{key:`writeBack`,label:`Create events from Canvas`,hint:`Write-back into the CalDAV calendar.`,bool:!0}]},teams:{label:`MS Teams`,icon:`mdi:microsoft-teams`,blurb:`Channel messages via Microsoft Graph (app-only credentials, admin-consented ChannelMessage.Read.All).`,fields:[{key:`address`,label:`Tenant label`,placeholder:`e.g. corp`,required:!0},{key:`tenantId`,label:`Tenant id`,required:!0},{key:`clientId`,label:`Client id`,required:!0},{key:`clientSecret`,label:`Client secret`,secret:!0,required:!0},{key:`teams`,label:`Team ids (one per line)`,list:!0,required:!0}]}};function TP(e){return e.split(/[\n,]/).map(e=>e.trim()).filter(Boolean)}function EP({workspaceId:e}){let{showToast:t}=wo(),[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)({}),[u,d]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),h=(0,X.useCallback)(async()=>{let t=await Rc(e).catch(()=>[]);r(t.filter(e=>e.kind===`connector`))},[e]),g=async()=>{m(!0);try{await h()}finally{m(!1)}};(0,X.useEffect)(()=>{let t=!1;return Rc(e).then(e=>{t||r(e.filter(e=>e.kind===`connector`))}).catch(()=>{}),()=>{t=!0}},[e]);let _=n.some(e=>e.status===`syncing`);(0,X.useEffect)(()=>{if(!_)return;let e=setInterval(()=>{h()},4e3);return()=>clearInterval(e)},[_,h]);let v=e=>{let t=wP[e.driver];if(!t)return;let n=e.config||{},r={};for(let i of t.fields){if(i.key===`address`){r.address=e.address;continue}if(i.secret)continue;if(i.key===`writeBack`){r.writeBack=n.readOnly===!1&&(![`slack`,`whatsapp`].includes(e.driver)||n.sendEnabled===!0)?`true`:``;continue}let t=n[i.key];if(i.list){r[i.key]=Array.isArray(t)?t.join(`
|
|
44
|
+
`):``;continue}t!=null&&(r[i.key]=String(t))}l(r),a(e.driver),s(e)},y=()=>{a(null),s(null),l({})},b=async()=>{if(!i)return;let n=wP[i],r={};for(let e of n.fields){let n=(c[e.key]||``).trim();if(!n){if(e.required&&!(o&&e.secret)){t({title:`${e.label} is required`,variant:`destructive`});return}o&&!e.secret&&(r[e.key]=e.list?[]:!e.bool&&``);continue}r[e.key]=e.list?TP(n):e.bool?n===`true`:n}n.fields.some(e=>e.key===`writeBack`)&&([`slack`,`whatsapp`].includes(i)&&(r.sendEnabled=r.writeBack===!0),r.readOnly=r.writeBack!==!0,delete r.writeBack),i===`git`&&(r.enabled=!0),d(!0);try{o?await Fo(e,o.driver,o.address,r):await Zs(e,i,r),y(),await h(),t({title:o?`Connector updated; sync restarted`:`Connector saved; first sync started`})}catch(e){t({title:`Failed to save connector`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}finally{d(!1)}},x=async n=>{try{n.driver===`git`&&n.enabled===!1?await Fo(e,n.driver,n.address,{enabled:!0}):await Js(e,n.driver,n.address),t({title:`Syncing ${n.driver}/${n.address}`}),setTimeout(()=>{h()},1500)}catch(e){t({title:`Sync failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}},S=async n=>{let r=n.driver===`git`?`Stop syncing ${n.address}? Its checkout and existing tree documents will stay available.`:`Remove ${n.driver}/${n.address}? Synced documents stay in the backends tree until purged.`;if(window.confirm(r))try{await Xo(e,n.driver,n.address),await h()}catch(e){t({title:`Remove failed`,description:e instanceof Error?e.message:String(e),variant:`destructive`})}};return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Connectors`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Git repositories, GitHub issues, Slack, Google Calendar, CalDAV and MS Teams, polled into the backends tree (read-only unless write-back is enabled).`})]}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:p,onClick:()=>{g()},title:`Refresh`,children:(0,Z.jsx)(Er,{className:`h-3.5 w-3.5 ${p?`animate-spin`:``}`})})]}),n.length>0&&(0,Z.jsx)(`div`,{className:`mt-3 space-y-2`,children:n.map(t=>{let n=wP[t.driver];return(0,Z.jsxs)(`div`,{className:`rounded-md border p-3`,children:[t.driver===`whatsapp`&&(0,Z.jsx)(bP,{workspaceId:e,address:t.address,selectedChats:Array.isArray(t.config?.chats)?t.config.chats:[],onSaved:h}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(f,{icon:n?.icon||`mdi:cloud-sync`,width:16,height:16,className:`shrink-0`}),(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:n?.label||t.driver}),(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:t.address}),(0,Z.jsx)(`span`,{className:`flex-1`}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t.status===`syncing`,onClick:()=>{x(t)},children:[(0,Z.jsx)(Er,{className:`mr-1 h-3 w-3 ${t.status===`syncing`?`animate-spin`:``}`}),t.status===`syncing`?`Syncing`:t.driver===`git`&&t.enabled===!1?`Resume sync`:`Sync now`]}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>v(t),title:`Edit connector`,children:(0,Z.jsx)(Lr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>{S(t)},disabled:t.driver===`git`&&t.enabled===!1,title:t.driver===`git`?`Stop syncing`:`Remove connector`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5 text-destructive`})})]}),(0,Z.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`status: `,t.status]}),t.lastSyncAt&&(0,Z.jsxs)(`span`,{children:[`last sync: `,new Date(t.lastSyncAt).toLocaleString()]}),t.treePath&&(0,Z.jsx)(`span`,{className:`font-mono`,children:t.treePath})]}),t.lastError&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-destructive`,children:t.lastError})]},`${t.driver}:${t.address}`)})}),i?(0,Z.jsxs)(`div`,{className:`mt-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(f,{icon:wP[i].icon,width:16,height:16}),(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:o?`Edit ${wP[i].label}`:wP[i].label}),o&&(0,Z.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:o.address}),(0,Z.jsx)(`span`,{className:`flex-1`}),(0,Z.jsx)(`button`,{type:`button`,onClick:y,className:`p-1 text-muted-foreground hover:text-foreground`,"aria-label":`Cancel`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:wP[i].blurb}),(0,Z.jsx)(`div`,{className:`mt-2 grid gap-2 sm:grid-cols-2`,children:wP[i].fields.map(e=>(0,Z.jsxs)(`label`,{className:`text-xs ${e.list||e.bool?`sm:col-span-2`:``}`,children:[!e.bool&&(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:e.label}),e.bool?(0,Z.jsxs)(`span`,{className:`mt-1 flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:c[e.key]===`true`,onChange:t=>l(n=>({...n,[e.key]:t.target.checked?`true`:``})),className:`h-4 w-4 accent-primary`}),(0,Z.jsx)(`span`,{children:e.label})]}):e.list?(0,Z.jsx)(`textarea`,{value:c[e.key]||``,onChange:t=>l(n=>({...n,[e.key]:t.target.value})),placeholder:e.placeholder,rows:2,className:`mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`}):(0,Z.jsx)(q,{type:e.secret?`password`:`text`,value:c[e.key]||``,disabled:!!o&&e.key===`address`,onChange:t=>l(n=>({...n,[e.key]:t.target.value})),placeholder:o&&e.secret?`Leave blank to keep current`:e.placeholder,autoComplete:`off`,className:`mt-1 h-8 text-xs`}),e.hint&&(0,Z.jsx)(`span`,{className:`mt-0.5 block text-[11px] text-muted-foreground/80`,children:e.hint}),e.oauth===`google`&&(0,Z.jsx)(`span`,{className:`mt-1.5 block`,children:(0,Z.jsx)(CP,{clientId:c.clientId||``,clientSecret:c.clientSecret||``,scope:e.oauthScope||`calendar.readonly`,disabled:u,onLinked:({refreshToken:t,account:n})=>l(r=>({...r,[e.key]:t,address:(r.address||``).trim()||(n?n.replace(/[^a-z0-9]+/gi,`-`).replace(/^-|-$/g,``).toLowerCase():``)}))})})]},e.key))}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,className:`mt-3`,disabled:u,onClick:()=>{b()},children:u?`Saving…`:o?`Save changes & sync`:`Save & sync`})]}):(0,Z.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:Object.entries(wP).map(([e,t])=>(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{a(e),l({})},children:[(0,Z.jsx)(br,{className:`mr-1 h-3 w-3`}),(0,Z.jsx)(f,{icon:t.icon,width:14,height:14,className:`mr-1`}),t.label]},e))})]})}var DP={host:``,port:993,tls:!0,allowSelfSigned:!0,user:``,password:``,pollInterval:6e4,initialSyncDays:180,smtp:{enabled:!1,host:``,port:587,secure:!1,user:``,password:``,from:``,sentFolder:`Sent`,appendSent:!1,allowAgentSend:!1}};function OP(e){let t=e.config||{};return{host:String(t.host||``),port:Number(t.port??993),tls:t.tls!==!1,allowSelfSigned:t.allowSelfSigned!==!1,user:String(t.user||e.address),password:``,pollInterval:Number(t.pollInterval??6e4),initialSyncDays:Number(t.initialSyncDays??180),smtp:{...DP.smtp,...t.smtp||{},password:``}}}function kP(e,t,n,r){let{password:i,...a}=e.smtp;return{host:e.host.trim(),user:e.user.trim(),port:Number(e.port)||993,tls:e.tls,allowSelfSigned:e.allowSelfSigned,pollInterval:Number(e.pollInterval)||6e4,initialSyncDays:Math.max(0,Number(e.initialSyncDays)||0),smtp:{...a,...(!t||r)&&i?{password:i}:{}},...(!t||n)&&e.password?{password:e.password}:{}}}function AP({workspaceId:e,enabled:t}){let[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)([]);(0,X.useEffect)(()=>{let t=!0;return Rc(e).then(e=>{t&&a(e.filter(e=>e.kind===`storage`))}).catch(()=>{}),()=>{t=!1}},[e]);let[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(DP),[m,h]=(0,X.useState)(!1),[g,_]=(0,X.useState)(!1),[v,y]=(0,X.useState)(!1),b=(0,X.useRef)(0),[x,S]=(0,X.useState)([]),[C,w]=(0,X.useState)([`INBOX`]),[T,E]=(0,X.useState)(!0),[D,O]=(0,X.useState)(!1),[k,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(null),{showToast:N,showProgress:P}=wo(),ee=(0,X.useMemo)(()=>[...n].sort((e,t)=>e.address.localeCompare(t.address)),[n]),F=(0,X.useMemo)(()=>n.find(e=>e.address===c)||null,[n,c]),I=(0,X.useCallback)(()=>Rc(e,`imap`).then(e=>r(e)).catch(e=>{N({title:`Error`,description:e instanceof Error?e.message:`Failed to load IMAP accounts`,variant:`destructive`})}).finally(()=>E(!1)),[e,N]),te=(0,X.useCallback)(async()=>{E(!0),await I()},[I]),[L,R]=(0,X.useState)(e);e!==L&&(R(e),E(!0),l(null),d(!1),p(DP),S([]),w([`INBOX`]),y(!1),h(!1),_(!1)),(0,X.useEffect)(()=>{I()},[I]),(0,X.useEffect)(()=>()=>{b.current++},[e]);let ne=(0,X.useCallback)(async(t,n)=>{let r=++b.current;O(!0);try{let i=t?await Rs(e,`imap`,t.address):await ns(e,`imap`,{host:(n?.host||``).trim(),port:Number(n?.port)||993,tls:n?.tls!==!1,allowSelfSigned:n?.allowSelfSigned!==!1,user:(n?.user||``).trim(),password:n?.password||``,folder:`INBOX`});r===b.current&&S(i.filter(e=>e.selectable))}catch(e){r===b.current&&N({title:`IMAP Error`,description:e instanceof Error?e.message:`Failed to discover folders`,variant:`destructive`})}finally{r===b.current&&O(!1)}},[e,N]),re=()=>{b.current++,O(!1),d(!1),l(null),p(DP),S([]),w([`INBOX`]),h(!1),_(!1),y(!1)},ie=e=>{if(!k){if(c===e.address){re();return}b.current++,O(!1),d(!1),l(e.address),p(OP(e)),S([]),w((e.containers||[]).map(e=>e.name)),h(!1),_(!1),y(!1)}},ae=()=>{re(),d(!0)},z=(e,t)=>{y(!0),p(n=>({...n,[e]:t}))},oe=e=>{y(!0),w(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},se=(0,X.useMemo)(()=>{let e=new Map(x.map(e=>[e.path,e]));for(let t of C)e.has(t)||e.set(t,{name:t,path:t,delimiter:`/`,selectable:!0,attributes:[]});return[...e.values()].sort((e,t)=>e.path.localeCompare(t.path))},[x,C]),B=async()=>{A(!0);try{let t=C.length?C:[`INBOX`],n=kP(f,!!F,m,g);if(F){await Fo(e,`imap`,F.address,n);let r=new Set((F.containers||[]).map(e=>e.name)),i=t.filter(e=>!r.has(e)),a=[...r].filter(e=>!t.includes(e));i.length&&await Ns(e,`imap`,F.address,i);for(let t of a)await Os(e,`imap`,F.address,t)}else{await Zs(e,`imap`,{...n,password:f.password,folder:t[0]});let r=f.user.trim();t.length>1&&await Ns(e,`imap`,r,t.slice(1))}await te(),d(!1),l(f.user.trim()),p({...f,password:``,smtp:{...f.smtp,password:``}}),h(!1),_(!1),y(!1),N({title:`Saved`,description:`IMAP account ${f.user.trim()} saved; sync runs in the background`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to save IMAP account`,variant:`destructive`})}finally{A(!1)}},ce=async()=>{if(!(!F||!window.confirm(`Delete IMAP account ${F.address} and all its folders?`))){M(`delete:${F.address}`);try{await Xo(e,`imap`,F.address),await te(),re(),N({title:`Deleted`,description:`IMAP account ${F.address} deleted`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to delete account`,variant:`destructive`})}finally{M(null)}}},V=async(t,n)=>{M(`${t}:${n}`);try{t===`test`?await jc(e,`imap`,n):await et(P,e,`imap`,n,e=>{r(t=>t.map(t=>t.address===n?e:t))}),await te(),t===`test`&&N({title:`Success`,description:`${n} saved account test completed`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to ${t}`,variant:`destructive`})}finally{M(null)}},le=async(t,n)=>{M(`folder-sync:${t}:${n}`);try{await js(e,`imap`,t,n),await te(),N({title:`Sync started`,description:`${t} · ${n} · rescanning the saved lookback window`})}catch(e){N({title:`Error`,description:e instanceof Error?e.message:`Failed to sync folder`,variant:`destructive`})}finally{M(null)}},ue=(0,Z.jsxs)(`form`,{className:`grid gap-3`,autoComplete:`off`,"aria-label":`IMAP account settings`,onSubmit:e=>e.preventDefault(),children:[(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-host`,children:`Host`}),(0,Z.jsx)(q,{id:`imap-host`,name:`imap-host`,autoComplete:`off`,value:f.host,readOnly:!!F,onChange:e=>z(`host`,e.target.value),placeholder:`imap.example.com`})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-user`,children:`User (account)`}),(0,Z.jsx)(q,{id:`imap-user`,name:`imap-username`,autoComplete:`section-imap username`,value:f.user,readOnly:!!F,onChange:e=>z(`user`,e.target.value),placeholder:`me@example.com`})]}),(0,Z.jsx)(`div`,{className:`grid gap-2`,children:!F||m?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(G,{htmlFor:`imap-password`,children:F?`New IMAP password`:`Password`}),(0,Z.jsx)(q,{id:`imap-password`,name:`imap-password`,type:`password`,autoComplete:`section-imap new-password`,"data-lpignore":`true`,"data-1p-ignore":`true`,value:f.password,onChange:e=>z(`password`,e.target.value),placeholder:F?`Leave blank to keep current password`:`Password`})]}):(0,Z.jsxs)(`div`,{className:`flex items-center gap-3 text-sm`,children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Saved IMAP password`}),(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>h(!0),children:`Change IMAP password`})]})}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-port`,children:`Port`}),(0,Z.jsx)(q,{id:`imap-port`,type:`number`,value:String(f.port),onChange:e=>z(`port`,Number(e.target.value||993))})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(G,{children:`Folders to sync`}),(0,Z.jsxs)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>void ne(F,f),disabled:D||!!F&&v||!F&&(!f.host.trim()||!f.user.trim()||!f.password),children:[D?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(ni,{className:`h-3 w-3`}),` Discover folders`]})]}),(0,Z.jsx)(`div`,{className:`max-h-56 overflow-y-auto rounded-md border p-2`,children:se.length===0?(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:D?`Discovering folders…`:F?`No folders found on the server.`:`Fill in host, user and password, then discover the account’s folders. INBOX is synced by default.`}):(0,Z.jsx)(`div`,{className:`space-y-0.5`,children:se.map(e=>{let t=e.path.split(e.delimiter||`/`).length-1,n=x.some(t=>t.path===e.path);return(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 rounded px-2 py-1 text-xs hover:bg-accent/50`,style:{paddingLeft:`${8+t*14}px`},children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:C.includes(e.path),onChange:()=>oe(e.path)}),(0,Z.jsx)(`span`,{className:`font-mono truncate`,children:e.path}),!n&&x.length>0&&(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`(subscribed, not on server)`})]},e.path)})})}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[C.length,` folder`,C.length===1?``:`s`,` selected; each synced as its own container. Unchecking a synced folder removes it on Save.`]})]}),(0,Z.jsxs)(`fieldset`,{className:`rounded border p-3 space-y-3 sm:col-span-2`,children:[(0,Z.jsx)(`legend`,{className:`px-1 text-sm font-medium`,children:`Outgoing email (SMTP)`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:!F||!f.smtp.enabled||k,onClick:()=>s(F.address),children:`Send test email`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Save your SMTP settings before testing. The test uses the saved account.`}),o&&(0,Z.jsx)(Ue,{workspaceId:e,initialAccount:{driver:`imap`,address:o},testEmail:!0,onClose:()=>s(null)}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.enabled,onChange:e=>z(`smtp`,{...f.smtp,enabled:e.target.checked})}),`Allow sending from Canvas`]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[[`host`,`user`,`from`,`sentFolder`].map(e=>(0,Z.jsxs)(`label`,{className:`text-xs`,children:[{host:`SMTP host`,user:`SMTP username`,from:`From address`,sentFolder:`Sent folder`}[e],(0,Z.jsx)(q,{name:`smtp-${e}`,value:f.smtp[e],autoComplete:e===`user`?`section-smtp username`:`off`,onChange:t=>z(`smtp`,{...f.smtp,[e]:t.target.value})})]},e)),f.smtp.enabled&&(!F||g)&&(0,Z.jsxs)(`label`,{className:`text-xs`,children:[`SMTP password (blank keeps current)`,(0,Z.jsx)(q,{name:`smtp-password`,type:`password`,autoComplete:`section-smtp new-password`,"data-lpignore":`true`,"data-1p-ignore":`true`,value:f.smtp.password,onChange:e=>z(`smtp`,{...f.smtp,password:e.target.value})})]}),F&&f.smtp.enabled&&!g&&(0,Z.jsx)(Y,{type:`button`,size:`sm`,variant:`outline`,onClick:()=>_(!0),children:`Change SMTP password`}),(0,Z.jsxs)(`label`,{className:`text-xs`,children:[`Port`,(0,Z.jsx)(q,{type:`number`,min:1,max:65535,value:f.smtp.port,onChange:e=>z(`smtp`,{...f.smtp,port:Number(e.target.value)})})]})]}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.secure,onChange:e=>z(`smtp`,{...f.smtp,secure:e.target.checked})}),`Implicit TLS (usually port 465; otherwise STARTTLS is required)`]}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.appendSent,onChange:e=>z(`smtp`,{...f.smtp,appendSent:e.target.checked})}),`Save a copy in the IMAP Sent folder (leave off if your provider does this automatically)`]}),(0,Z.jsxs)(`label`,{className:`flex gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.smtp.allowAgentSend,onChange:e=>z(`smtp`,{...f.smtp,allowAgentSend:e.target.checked})}),`Allow agents with workspace write access to send`]})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-lookback`,children:`Sync lookback (days)`}),(0,Z.jsx)(q,{id:`imap-lookback`,type:`number`,min:`0`,value:String(f.initialSyncDays),onChange:e=>z(`initialSyncDays`,Number(e.target.value||0))}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Used for the first sync and every Resync. Set 0 to import the whole mailbox. Saving a wider window automatically fetches older mail; a narrower window keeps messages already imported.`})]}),(0,Z.jsxs)(`div`,{className:`grid gap-2`,children:[(0,Z.jsx)(G,{htmlFor:`imap-poll`,children:`Poll interval (ms)`}),(0,Z.jsx)(q,{id:`imap-poll`,type:`number`,value:String(f.pollInterval),onChange:e=>z(`pollInterval`,Number(e.target.value||6e4))})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-4 text-xs`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.tls,onChange:e=>z(`tls`,e.target.checked)}),` TLS`]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:f.allowSelfSigned,onChange:e=>z(`allowSelfSigned`,e.target.checked)}),` Allow self-signed`]})]})]});return(0,Z.jsxs)(`div`,{className:`space-y-3 border-t pt-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`h4`,{className:`text-sm font-medium`,children:`IMAP Accounts`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Each account mirrors under /imap/<account> in the backends tree; its folders are synced as containers. Click an account to edit its settings.`})]}),!t&&(0,Z.jsx)(`p`,{className:`rounded-md border bg-muted/40 p-2 text-xs text-muted-foreground`,children:`Enable the IMAP service before polling starts. Accounts can still be configured while it is off.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:u?re:ae,children:[(0,Z.jsx)(la,{className:`h-3 w-3`}),` `,u?`Cancel`:`New Account`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`ghost`,onClick:te,disabled:T,children:[T?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Er,{className:`h-3 w-3`}),` Refresh`]})]}),(0,Z.jsx)(`div`,{className:`rounded-md border`,children:(0,Z.jsx)(`div`,{className:`max-h-[32rem] overflow-y-auto p-2 space-y-1`,children:ee.length===0?(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No IMAP accounts configured.`}):ee.map(t=>{let n=c===t.address;return(0,Z.jsxs)(`div`,{className:`rounded px-2 py-2 text-xs transition-colors ${n?`bg-accent/40`:`hover:bg-accent/50`}`,children:[(0,Z.jsxs)(`button`,{onClick:()=>ie(t),className:`w-full text-left`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsxs)(`span`,{className:`flex items-center gap-1.5 font-medium`,children:[n?(0,Z.jsx)(qr,{className:`h-3 w-3 shrink-0`}):(0,Z.jsx)(Xa,{className:`h-3 w-3 shrink-0`}),t.address]}),(0,Z.jsx)(`span`,{className:`shrink-0 ${t.status===`error`?`text-destructive`:`text-muted-foreground`}`,children:t.status})]}),(0,Z.jsxs)(`div`,{className:`pl-[18px] text-muted-foreground`,children:[String(t.config?.host||``),` · `,(t.containers||[]).length,` folder(s)`]}),t.lastError&&(0,Z.jsxs)(`div`,{className:`pl-[18px] text-destructive`,children:[`error: `,t.lastError]})]}),n&&(0,Z.jsxs)(`div`,{className:`mt-2 space-y-3 border-t pt-2`,children:[(0,Z.jsx)(`div`,{className:`space-y-0.5`,children:(t.containers||[]).map(n=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 rounded bg-background/60 px-2 py-1`,children:[(0,Z.jsx)(`span`,{className:`font-mono truncate`,children:n.name}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,Z.jsx)(`button`,{title:`Resync folder`,className:`p-1 hover:bg-accent rounded`,onClick:()=>le(t.address,n.name),disabled:!!j||v||k,children:j===`folder-sync:${t.address}:${n.name}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Er,{className:`h-3 w-3`})}),(0,Z.jsx)(`button`,{title:`Remove folder`,className:`p-1 hover:bg-destructive/10 text-destructive rounded`,onClick:()=>Os(e,`imap`,t.address,n.name).then(te).catch(e=>N({title:`Error`,description:e instanceof Error?e.message:`Failed to remove folder`,variant:`destructive`})),disabled:!!j,children:(0,Z.jsx)(Qr,{className:`h-3 w-3`})})]})]},n.name))}),(t.containers||[]).map(n=>(0,Z.jsxs)(`div`,{className:`rounded border p-2`,children:[(0,Z.jsx)(`p`,{className:`mb-2 font-medium`,children:n.name}),(0,Z.jsx)(Xw,{value:n.removalPolicy,backends:i,source:`imap:${n.mailboxId}`,destination:!1,onSave:async r=>{await qw(e,t.address,n.name,r),await te()}})]},`removal:${n.name}`)),ue,(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:v?`Save changes before testing, discovering folders or resyncing.`:`Test and Discover folders use the saved connection settings. Resync fetches the saved lookback window again.`}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,onClick:B,disabled:k||!v,children:[k?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Yn,{className:`h-3 w-3`}),` Save`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:!!j||v||k,onClick:()=>V(`test`,t.address),children:[j===`test:${t.address}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(la,{className:`h-3 w-3`}),` Test`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:!!j||v||k,onClick:()=>V(`sync`,t.address),children:[j===`sync:${t.address}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Er,{className:`h-3 w-3`}),` Resync all`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`destructive`,disabled:!!j,onClick:ce,children:[j===`delete:${t.address}`?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Qr,{className:`h-3 w-3`}),` Delete`]})]})]})]},t.address)})})}),u&&(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsx)(`h5`,{className:`text-xs font-medium`,children:`New IMAP account`}),ue,(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,onClick:B,disabled:k,children:[k?(0,Z.jsx)(Ti,{className:`h-3 w-3 animate-spin`}):(0,Z.jsx)(Yn,{className:`h-3 w-3`}),` Save`]}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:re,children:`Cancel`})]})]})]})}function jP({workspaceId:e}){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!0),[a,o]=(0,X.useState)(!1),[s,c]=(0,X.useState)(``),[l,u]=(0,X.useState)([`read`]),[d,f]=(0,X.useState)(``),[p,m]=(0,X.useState)(!0),[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(new Set),[y,b]=(0,X.useState)(``),[x,S]=(0,X.useState)(!1),{showToast:C}=wo(),[w,T]=(0,X.useState)(e);e!==w&&(T(e),i(!0));let E=(0,X.useCallback)(()=>J.get(`/workspaces/${e}/tokens`).then(e=>{n((e||[]).map(e=>({...e,hash:e.hash||e.tokenHash||``})).filter(e=>e.hash))}).catch(()=>{C({title:`Error`,description:`Failed to load workspace tokens`,variant:`destructive`})}).finally(()=>{i(!1)}),[e,C]);(0,X.useEffect)(()=>{E()},[E]);let D=async()=>{if(!s.trim()){C({title:`Error`,description:`Token description is required`,variant:`destructive`});return}try{o(!0);let t=null;if(!p&&d){let e=new Date(d);e.setHours(23,59,59,999),t=e.toISOString()}let n={description:s,permissions:l,expiresAt:t},r=await J.post(`/workspaces/${e}/tokens`,n);r&&r.token&&b(r.token),c(``),u([`read`]),f(``),m(!0),g(!1),i(!0),await E(),C({title:`Success`,description:`Workspace sharing token created successfully`,variant:`default`})}catch{C({title:`Error`,description:`Failed to create token`,variant:`destructive`})}finally{o(!1)}},O=async t=>{try{await J.delete(`/workspaces/${e}/tokens/${t}`),C({title:`Success`,description:`Token revoked successfully`}),i(!0),await E()}catch{C({title:`Error`,description:`Failed to revoke token`,variant:`destructive`})}},k=e=>{let t=new Set(_);t.has(e)?t.delete(e):t.add(e),v(t)},A=e=>_.has(e)?e:`${e.substring(0,8)}...${e.substring(e.length-8)}`,j=async e=>{try{await navigator.clipboard.writeText(e),C({title:`Copied`,description:`Token hash copied to clipboard`})}catch{C({title:`Error`,description:`Failed to copy to clipboard`,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsx)(`h3`,{className:`text-lg font-medium`,children:`Workspace Sharing Tokens`}),(0,Z.jsxs)(Y,{onClick:()=>g(!h),size:`sm`,variant:`outline`,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Token`]})]}),h&&(0,Z.jsxs)(`div`,{className:`border rounded-lg p-4 space-y-4 bg-muted/50`,children:[(0,Z.jsx)(q,{placeholder:`Token description (e.g., 'John's laptop')`,value:s,onChange:e=>c(e.target.value)}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium mb-2 block`,children:`Permissions`}),(0,Z.jsx)(`div`,{className:`flex gap-2 flex-wrap`,children:[`read`,`write`,`admin`].map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:l.includes(e),onChange:t=>{t.target.checked?u([...l,e]):u(l.filter(t=>t!==e))}}),(0,Z.jsx)(`span`,{className:`text-sm`,children:e})]},e))})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium mb-2 block`,children:`Token Expiry`}),(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:p,onChange:e=>{m(e.target.checked),e.target.checked&&f(``)}}),(0,Z.jsx)(`span`,{className:`text-sm`,children:`Never expires`})]}),!p&&(0,Z.jsx)(q,{type:`date`,placeholder:`Expiry date`,value:d,onChange:e=>f(e.target.value),min:new Date().toISOString().split(`T`)[0]})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{onClick:D,disabled:a,children:`Create Token`}),(0,Z.jsx)(Y,{variant:`outline`,onClick:()=>g(!1),children:`Cancel`})]})]}),y&&(0,Z.jsxs)(`div`,{className:`p-4 border rounded-md bg-muted/50`,children:[(0,Z.jsxs)(`div`,{className:`flex justify-between items-center mb-2`,children:[(0,Z.jsx)(`h3`,{className:`font-semibold`,children:`Your New Workspace Sharing Token`}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:async()=>{try{await navigator.clipboard.writeText(y),S(!0),C({title:`Success`,description:`Token copied to clipboard`}),setTimeout(()=>S(!1),2e3)}catch{C({title:`Error`,description:`Failed to copy token to clipboard`,variant:`destructive`})}},children:x?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(sr,{className:`mr-2 h-4 w-4`}),`Copied`]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Jn,{className:`mr-2 h-4 w-4`}),`Copy`]})})]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mb-2`,children:`Make sure to copy your workspace sharing token now. You won't be able to see it again!`}),(0,Z.jsx)(`div`,{className:`p-2 bg-background border rounded font-mono text-sm break-all outline-none focus:ring-2 focus:ring-ring`,children:y}),(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,className:`mt-2`,onClick:()=>b(``),children:`Dismiss`})]}),(0,Z.jsx)(MP,{workspaceId:e}),r?(0,Z.jsxs)(`div`,{className:`text-center py-4`,children:[(0,Z.jsx)(`div`,{className:`animate-spin rounded-full h-6 w-6 border-b-2 border-primary mx-auto touch-target`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:`Loading tokens...`})]}):t.length===0?(0,Z.jsxs)(`div`,{className:`text-center py-8 text-muted-foreground`,children:[(0,Z.jsx)(`p`,{children:`No sharing tokens created yet.`}),(0,Z.jsx)(`p`,{className:`text-sm`,children:`Create a token to share this workspace with others.`})]}):(0,Z.jsx)(`div`,{className:`space-y-3`,children:t.map(e=>(0,Z.jsxs)(`div`,{className:`border rounded-lg p-3 flex items-center justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,Z.jsx)(`span`,{className:`font-medium text-sm`,children:e.description}),(0,Z.jsx)(`span`,{className:`text-xs bg-muted px-2 py-1 rounded`,children:e.permissions.join(`, `)})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`span`,{className:`font-mono`,children:A(e.hash)}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>k(e.hash),children:_.has(e.hash)?(0,Z.jsx)(Ei,{className:`h-3 w-3`}):(0,Z.jsx)(ja,{className:`h-3 w-3`})}),(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,onClick:()=>j(e.hash),children:(0,Z.jsx)(Jn,{className:`h-3 w-3`})})]}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`Created: `,new Date(e.createdAt).toLocaleDateString(),e.expiresAt?(0,Z.jsxs)(`span`,{children:[` • Expires: `,new Date(e.expiresAt).toLocaleDateString()]}):(0,Z.jsx)(`span`,{children:` • Never expires`})]})]}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>O(e.hash),className:`text-destructive hover:text-destructive`,children:(0,Z.jsx)(Qr,{className:`h-4 w-4`})})]},e.hash))})]})}function MP({workspaceId:e}){let{showToast:t}=wo(),[n,r]=(0,X.useState)(``),[i,a]=(0,X.useState)([`read`]),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)([]),u=(0,X.useCallback)(()=>J.get(`/workspaces/${e}/shares`).then(e=>l(Array.isArray(e)?e:e?.emailShares||[])).catch(()=>{}),[e]);(0,X.useEffect)(()=>{u()},[u]);let d=async()=>{if(n.trim())try{s(!0),await J.post(`/workspaces/${e}/shares`,{userEmail:n.trim(),permissions:i}),r(``),a([`read`]),await u(),t({title:`Success`,description:`Access granted`})}catch(e){t({title:`Error`,description:e instanceof Error?e.message:`Failed to grant access`,variant:`destructive`})}finally{s(!1)}},f=async n=>{try{await J.delete(`/workspaces/${e}/shares/${encodeURIComponent(n)}`),await u(),t({title:`Success`,description:`Access revoked`})}catch(e){t({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke`,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsx)(`h4`,{className:`font-medium`,children:`Email-based Shares`}),(0,Z.jsxs)(`div`,{className:`flex gap-2 flex-wrap items-center`,children:[(0,Z.jsx)(q,{placeholder:`user@local.server`,value:n,onChange:e=>r(e.target.value),className:`max-w-xs`}),(0,Z.jsx)(`div`,{className:`flex gap-2`,children:[`read`,`write`,`admin`].map(e=>(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:i.includes(e),onChange:t=>{t.target.checked?a([...i,e]):a(i.filter(t=>t!==e))}}),e]},e))}),(0,Z.jsx)(Y,{size:`sm`,onClick:d,disabled:o,children:`Add`})]}),c.length>0&&(0,Z.jsx)(`div`,{className:`space-y-2`,children:c.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between border rounded p-2`,children:[(0,Z.jsxs)(`div`,{className:`text-sm`,children:[(0,Z.jsx)(`div`,{className:`font-medium`,children:e.userEmail}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.permissions.join(`, `),e.grantedAt?` • ${new Date(e.grantedAt).toLocaleDateString()}`:``]})]}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>f(e.userEmail),className:`text-destructive hover:text-destructive`,children:`Revoke`})]},e.userEmail))})]})}var NP=[{value:`read`,label:`Read`,hint:`Browse and search`},{value:`write`,label:`Read & write`,hint:`Add, edit and organise documents`},{value:`admin`,label:`Admin`,hint:`Everything except sharing and deleting`}],PP=e=>e.includes(`admin`)?`admin`:e.includes(`write`)?`write`:`read`;function FP({workspaceId:e}){let{showToast:t}=wo(),[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(`user`),[u,d]=(0,X.useState)(``),[f,p]=(0,X.useState)(`read`),[m,h]=(0,X.useState)(e);e!==m&&(h(e),a(!0));let g=(0,X.useCallback)(()=>cs(e).then(r).catch(()=>r(null)).finally(()=>a(!1)),[e]);(0,X.useEffect)(()=>{g()},[g]);let _=n?.isOwner===!0,v=n?.members??[],y=async n=>{n.preventDefault();let r=u.trim();if(r){s(`grant`);try{let n=await kc(e,c===`user`?{email:r}:{group:r},[f]);d(``),await g();let i=c===`user`?r:`group ${r}`;t({title:`Shared`,description:n.type===`user`&&n.userExists===!1?`${i} has no account here yet — the share applies as soon as they sign in.`:`Access granted to ${i}.`})}catch(e){t({title:`Could not share`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{s(null)}}},b=async(n,r)=>{let i=`${n.type}:${n.principal}`;s(i);try{await Vo(e,n.type,n.principal,[r]),await g()}catch(e){t({title:`Could not update`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{s(null)}},x=async n=>{let r=`${n.type}:${n.principal}`;s(r);try{await fc(e,n.type,n.principal),await g(),t({title:`Access revoked`,description:`${n.principal} no longer has access.`})}catch(e){t({title:`Could not revoke`,description:e instanceof Error?e.message:`Unknown error`,variant:`destructive`})}finally{s(null)}};return n&&n.shareable===!1?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Your universe workspace is private and cannot be shared.`}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_?`People and groups who can open this workspace.`:`You are a member of this workspace; only its owner can change the list.`}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>{a(!0),g()},disabled:i,children:[(0,Z.jsx)(Er,{className:K(`mr-2 h-3.5 w-3.5`,i&&`animate-spin`)}),`Refresh`]})]}),i?(0,Z.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`Loading members…`}):v.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Not shared with anyone.`}):v.map(e=>{let t=`${e.type}:${e.principal}`,n=PP(e.permissions);return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-md border p-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-start gap-2`,children:[e.type===`group`?(0,Z.jsx)(ar,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}):(0,Z.jsx)(Hr,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm font-medium`,title:e.principal,children:e.principal}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.type===`group`?`Group`:`User`,e.description?` · ${e.description}`:``,e.grantedAt?` · since ${new Date(e.grantedAt).toLocaleDateString()}`:``]}),e.type===`user`&&e.userExists===!1&&(0,Z.jsxs)(`div`,{className:`mt-1 flex items-center gap-1 text-[11px] text-warning`,children:[(0,Z.jsx)(er,{className:`h-3 w-3`}),` No account yet — applies at first sign-in`]})]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[_?(0,Z.jsx)(`select`,{value:n,disabled:o===t,onChange:t=>b(e,t.target.value),className:`rounded-md border border-input bg-background px-2 py-1 text-xs focus:outline-none focus:ring-2 focus:ring-ring`,title:`Access level`,children:NP.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))}):(0,Z.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-xs`,children:NP.find(e=>e.value===n)?.label}),_&&(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:o===t,onClick:()=>x(e),title:`Revoke access`,children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})})]})]},t)})]}),_&&(0,Z.jsxs)(`form`,{onSubmit:y,className:`space-y-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-sm font-medium`,children:[`Share with`,(0,Z.jsx)(`div`,{className:`inline-flex overflow-hidden rounded-md border`,children:[`user`,`group`].map(e=>(0,Z.jsx)(`button`,{type:`button`,onClick:()=>l(e),className:K(`px-3 py-1 text-xs`,c===e?`bg-primary text-primary-foreground`:`bg-background text-muted-foreground hover:bg-muted`),children:e===`user`?`a person`:`a group`},e))})]}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-[1fr_auto]`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(q,{type:c===`user`?`email`:`text`,value:u,onChange:e=>d(e.target.value),placeholder:c===`user`?`colleague@corp.tld`:`team-a or cn=team-a,ou=groups,dc=corp,dc=tld`,autoComplete:`off`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:c===`user`?`The share is keyed by e-mail: it works even before the person signs in for the first time.`:`Directory group (LDAP/AD memberOf — full DN or just the CN) or a group an admin assigned to local accounts.`})]}),(0,Z.jsx)(`div`,{children:(0,Z.jsx)(`select`,{value:f,onChange:e=>p(e.target.value),className:`w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,title:NP.find(e=>e.value===f)?.hint,children:NP.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))})})]}),(0,Z.jsx)(Y,{type:`submit`,size:`sm`,disabled:o===`grant`||!u.trim(),children:o===`grant`?`Sharing…`:`Share workspace`})]})]})}function IP({workspaceId:e,workspaceName:t,isActive:n,onChanged:r}){let{showToast:i}=wo(),[a,o]=(0,X.useState)([]),[s,c]=(0,X.useState)(!0),[l,u]=(0,X.useState)(!1),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(!1),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1),y=(0,X.useCallback)(async()=>{try{o(await bs(e))}catch{o([])}finally{c(!1)}},[e]);(0,X.useEffect)(()=>{y()},[y]);let b=async()=>{if(!(n&&!window.confirm(`'${t}' is running. It has to be stopped to be exported — its index is only consistent on disk once it has flushed.\n\nStop it and export now?`))){u(!0);try{let t=await Vc(e,{stop:!0});f(t.stoppedWorkspace),i({title:`Workspace exported`,description:`${t.name} — ${Ts(t.size)}`}),await y(),t.stoppedWorkspace&&r?.()}catch(e){i({title:`Export failed`,description:e instanceof Error?e.message:`Failed to export workspace`,variant:`destructive`})}finally{u(!1)}}},x=async()=>{m(!0);try{await Ks(e),f(!1),i({title:`Workspace started`,description:`'${t}' is running again.`}),r?.()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to start workspace`,variant:`destructive`})}finally{m(!1)}},S=async e=>{g(e.name);try{await qo(e.name)}catch(e){i({title:`Download failed`,description:e instanceof Error?e.message:`Failed to download archive`,variant:`destructive`})}finally{g(null)}},C=async e=>{if(window.confirm(`Delete ${e.name}? The archive is removed from the server; any copy you already downloaded is untouched.`)){g(e.name);try{await Lo(e.name),await y()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to delete archive`,variant:`destructive`})}finally{g(null)}}};return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Zr,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Export & Import`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Export packs this workspace into a single compressed archive you can download and move elsewhere. The workspace is stopped first — an export of a running workspace would capture a half-written index.`}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:l,onClick:b,children:[(0,Z.jsx)(Zr,{className:`mr-2 h-3.5 w-3.5 ${l?`animate-pulse`:``}`}),l?`Exporting…`:`Export Workspace`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:s||l,onClick:()=>void y(),children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${s?`animate-spin`:``}`}),`Refresh`]}),d&&(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:p,onClick:x,children:p?`Starting…`:`Start workspace again`})]}),(0,Z.jsxs)(`div`,{className:`mt-4 border-t pt-3`,children:[(0,Z.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Archives`}),s?(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-muted-foreground`,children:`No exports yet.`}):(0,Z.jsx)(`ul`,{className:`mt-2 space-y-2`,children:a.map(e=>(0,Z.jsxs)(`li`,{className:`flex flex-col gap-2 rounded-md border p-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate font-mono text-xs`,children:e.name}),(0,Z.jsxs)(`div`,{className:`mt-0.5 text-[11px] text-muted-foreground`,children:[Ts(e.size),` · `,new Date(e.createdAt).toLocaleString()]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:h===e.name,onClick:()=>S(e),title:`Download (${Ts(e.size)})`,children:(0,Z.jsx)(zi,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:h===e.name,onClick:()=>C(e),className:`text-destructive hover:text-destructive`,title:`Delete archive`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})]},e.name))})]}),(0,Z.jsxs)(`div`,{className:`mt-4 space-y-3 border-t pt-3`,children:[(0,Z.jsx)(`h3`,{className:`text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:`Import workspace`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:l,onClick:()=>v(e=>!e),children:_?`Close import`:`Import workspace…`}),_&&(0,Z.jsx)(Nw,{disabled:l,onImported:()=>r?.()})]})]})}var LP={"workspace:home":{title:`Workspace Home`,description:`User-managed roaming home folder, exported through WebDAV and watched for changes. Mirrored into the backends tree.`},"workspace:data":{title:`Workspace Data`,description:`Managed content-addressable blob store (deduped, checksum-keyed). Opaque by design: the tree is the navigation; not meant for direct edits or export.`},imap:{title:`IMAP`,description:`Mailbox data source; ingested mail lands in the backends tree.`}},RP=[{id:`git`,title:`Git`,description:`Git-backed dotfile access.`},{id:`webdav`,title:`WebDAV`,description:`Mountable access to the workspace home backend.`},{id:`imapSync`,title:`IMAP Sync Worker`,description:`Background mailbox polling and ingestion.`}];function zP({checked:e,disabled:t,onClick:n}){return(0,Z.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":e,disabled:t,onClick:n,className:`relative inline-flex h-5 w-9 shrink-0 rounded-full border-2 border-transparent transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${e?`bg-primary`:`bg-muted-foreground/30`}`,children:(0,Z.jsx)(`span`,{className:`pointer-events-none inline-block h-4 w-4 rounded-full bg-background shadow transition-transform ${e?`translate-x-4`:`translate-x-0`}`})})}function BP({workspaceId:e,onAdded:t}){let[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(!1),{showToast:m}=wo(),h=()=>{a(``),s(``),l(!1),d(!1)};return n?(0,Z.jsxs)(`form`,{onSubmit:async n=>{if(n.preventDefault(),!(!i.trim()||!o.trim())){p(!0);try{await Zs(e,`file`,{name:i.trim(),path:o.trim(),watch:c,readOnly:u}),m({title:`Added`,description:`${i.trim()} mounted; initial scan running in the background`}),h(),r(!1),await t()}catch(e){m({title:`Error`,description:e instanceof Error?e.message:`Failed to add folder backend`,variant:`destructive`})}finally{p(!1)}}},className:`w-full space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(ni,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Add local folder`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Index a folder on the server host as a data source. Files stay in place; the index records them as device-scoped locations, so they remain addressable if the workspace moves to another server.`}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Name`}),(0,Z.jsx)(q,{value:i,onChange:e=>a(e.target.value),placeholder:`Financial Reports`,required:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Absolute path on server`}),(0,Z.jsx)(q,{value:o,onChange:e=>s(e.target.value),placeholder:`/mnt/data/reports`,required:!0,className:`font-mono`})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-6 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,children:[`watch`,(0,Z.jsx)(zP,{checked:c,onClick:()=>l(e=>!e)})]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,title:`Never delete bytes in this folder. Destroy degrades to a reference drop. Recommended for folders managed outside Canvas.`,children:[`read-only`,(0,Z.jsx)(zP,{checked:u,onClick:()=>d(e=>!e)})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{type:`submit`,size:`sm`,disabled:f||!i.trim()||!o.trim(),children:f?`Adding…`:`Add folder`}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,disabled:f,onClick:()=>{h(),r(!1)},children:`Cancel`})]})]}):(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(!0),children:[(0,Z.jsx)(ni,{className:`mr-2 h-3.5 w-3.5`}),`Add local folder`]})}function VP({workspaceId:e,onAdded:t}){let[n,r]=(0,X.useState)(!1),[i,a]=(0,X.useState)({name:``,clientId:``,clientSecret:``,refreshToken:``,folderId:``}),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),{showToast:p}=wo(),m=e=>t=>a(n=>({...n,[e]:t.target.value})),h=()=>{a({name:``,clientId:``,clientSecret:``,refreshToken:``,folderId:``}),s(!1),l(!1)},g=i.name.trim()&&i.clientId.trim()&&i.clientSecret.trim()&&i.refreshToken.trim();return n?(0,Z.jsxs)(`form`,{onSubmit:async n=>{if(n.preventDefault(),g){d(!0);try{await Zs(e,`gdrive`,{name:i.name.trim(),clientId:i.clientId.trim(),clientSecret:i.clientSecret.trim(),refreshToken:i.refreshToken.trim(),folderId:i.folderId.trim()||`root`,watch:o,readOnly:c}),p({title:`Added`,description:`${i.name.trim()} connected; initial scan running in the background`}),h(),r(!1),await t()}catch(e){p({title:`Error`,description:e instanceof Error?e.message:`Failed to add Google Drive backend`,variant:`destructive`})}finally{d(!1)}}},className:`w-full space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(f,{icon:`mdi:google-drive`,width:16,height:16,className:`text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Add Google Drive`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Index a Drive folder (or the whole My Drive) as a remote data source. Files are hashed from Drive metadata, uploads are queued through the workspace cache. Needs a Google OAuth client (Web application) — enter its id and secret, then sign in to obtain the offline-access refresh token, or paste one you already have.`}),(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Name`}),(0,Z.jsx)(q,{value:i.name,onChange:m(`name`),placeholder:`Work Drive`,required:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Folder id (empty = My Drive root)`}),(0,Z.jsx)(q,{value:i.folderId,onChange:m(`folderId`),placeholder:`1AbC…`,className:`font-mono`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`OAuth client id`}),(0,Z.jsx)(q,{value:i.clientId,onChange:m(`clientId`),required:!0,className:`font-mono`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`OAuth client secret`}),(0,Z.jsx)(q,{type:`password`,value:i.clientSecret,onChange:m(`clientSecret`),required:!0,className:`font-mono`,autoComplete:`off`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1 sm:col-span-2`,children:[(0,Z.jsx)(`label`,{className:`text-xs font-medium`,children:`Refresh token`}),(0,Z.jsx)(q,{type:`password`,value:i.refreshToken,onChange:m(`refreshToken`),required:!0,className:`font-mono`,autoComplete:`off`,placeholder:`Sign in below, or paste an offline-access refresh token`}),(0,Z.jsx)(CP,{clientId:i.clientId,clientSecret:i.clientSecret,scope:c?`drive.readonly`:`drive`,disabled:u,onLinked:({refreshToken:e,account:t})=>a(n=>({...n,refreshToken:e,name:n.name.trim()||(t?`Drive (${t})`:n.name)}))})]})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-6 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,title:`Poll the Drive changes feed (every 60s) so edits made in Drive show up without a manual re-sync.`,children:[`watch`,(0,Z.jsx)(zP,{checked:o,onClick:()=>s(e=>!e)})]}),(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5`,title:`Never delete files in this Drive. Destroy degrades to a reference drop.`,children:[`read-only`,(0,Z.jsx)(zP,{checked:c,onClick:()=>l(e=>!e)})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(Y,{type:`submit`,size:`sm`,disabled:u||!g,children:u?`Checking…`:`Add Drive`}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,disabled:u,onClick:()=>{h(),r(!1)},children:`Cancel`})]})]}):(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>r(!0),children:[(0,Z.jsx)(f,{icon:`mdi:google-drive`,width:14,height:14,className:`mr-2`}),`Add Google Drive`]})}function HP({workspaceId:e,backend:t}){let[n,r]=(0,X.useState)(t.usage??null),[i,a]=(0,X.useState)(!1),{showToast:o}=wo();return(0,Z.jsxs)(`button`,{type:`button`,onClick:async()=>{a(!0);try{r(await Zo(e,t.driver,t.address))}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed to compute size`,variant:`destructive`})}finally{a(!1)}},disabled:i,className:`flex items-center gap-1.5 rounded border px-2 py-1 text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-50`,title:n?`Computed ${new Date(n.computedAt).toLocaleString()}; click to refresh`:`Compute on-disk size (walks the backend folder; may take a while)`,children:[(0,Z.jsx)(Fr,{className:`h-3 w-3 ${i?`animate-pulse`:``}`}),i?`Calculating…`:n?Ts(n.bytes):`Size`]})}function UP({workspaceId:e}){let[t,n]=(0,X.useState)(!1),{showToast:r}=wo();return(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:t,onClick:async()=>{n(!0);try{let{removed:t}=await oc(e);r({title:`Thumbnail cache cleared`,description:`${t} cached thumbnail(s) removed`})}catch(e){r({title:`Error`,description:e instanceof Error?e.message:`Failed to clear thumbnail cache`,variant:`destructive`})}finally{n(!1)}},title:`Remove all cached thumbnails; they regenerate on demand`,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-3.5 w-3.5 ${t?`animate-pulse`:``}`}),t?`Clearing…`:`Clear thumbnails`]})}function WP({workspaceId:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!1),{showToast:a}=wo();return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Fr,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Disk usage`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Total on-disk size of this workspace (index, blobs, home, cache): what an export or sync would move. Computed on demand; may take a while on large workspaces.`})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-3`,children:[t&&(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:Ts(t.bytes)}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:r,onClick:async()=>{i(!0);try{n(await uc(e))}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to compute workspace size`,variant:`destructive`})}finally{i(!1)}},children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${r?`animate-spin`:``}`}),r?`Calculating…`:t?`Recalculate`:`Calculate size`]})]})]}),t&&(0,Z.jsx)(`div`,{className:`mt-3 grid grid-cols-2 gap-x-6 gap-y-1 border-t pt-3 sm:grid-cols-3`,children:Object.entries(t.breakdown).sort(([,e],[,t])=>t-e).map(([e,t])=>(0,Z.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-xs`,children:[(0,Z.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,children:e}),(0,Z.jsx)(`span`,{children:Ts(t)})]},e))})]})}function GP({backend:e,busy:t,onSave:n}){let r=e.config||{},i=Array.isArray(r.exclude)?r.exclude:[],a=Array.isArray(r.effectiveExclusions)?r.effectiveExclusions:[],o=Math.max(a.length-i.length,0),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(i.join(`
|
|
45
45
|
`)),[d,f]=(0,X.useState)(!1),p=i.join(`
|
|
46
46
|
`),[m,h]=(0,X.useState)(p);return m!==p&&(h(p),u(p)),(0,Z.jsxs)(`div`,{className:`mt-3 border-t pt-3`,children:[(0,Z.jsxs)(`button`,{type:`button`,className:`text-[11px] font-medium text-muted-foreground hover:text-foreground`,onClick:()=>c(!s),children:[`Sync exclusions `,i.length>0?`(${i.length} custom`:`(defaults only`,o>0?`, ${o} default)`:`)`,` `,s?`▾`:`▸`]}),s&&(0,Z.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,Z.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`One glob pattern per line, e.g. `,(0,Z.jsx)(`code`,{className:`font-mono`,children:`**/node_modules/**`}),` or `,(0,Z.jsx)(`code`,{className:`font-mono`,children:`**/target/**`}),`. Defaults (dotfiles, node_modules, __pycache__, caches, …) always apply. Changes take effect immediately for the watcher; run Re-sync to also unlink already-mirrored entries.`]}),(0,Z.jsx)(`textarea`,{className:`w-full min-h-[80px] rounded-md border bg-background p-2 font-mono text-xs`,value:l,onChange:e=>u(e.target.value),placeholder:`**/node_modules/**
|
|
47
47
|
**/dist/**`,spellCheck:!1}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,size:`sm`,disabled:t||l.split(`
|
|
@@ -49,11 +49,11 @@ set -euo pipefail
|
|
|
49
49
|
`)===i.join(`
|
|
50
50
|
`),onClick:()=>n(l.split(`
|
|
51
51
|
`).map(e=>e.trim()).filter(Boolean)),children:`Save exclusions`}),o>0&&(0,Z.jsxs)(`button`,{type:`button`,className:`text-[11px] text-muted-foreground hover:text-foreground`,onClick:()=>f(!d),children:[d?`Hide`:`Show`,` default patterns`]})]}),d&&(0,Z.jsx)(`pre`,{className:`max-h-40 overflow-auto rounded-md bg-muted/50 p-2 font-mono text-[11px] text-muted-foreground`,children:a.filter(e=>!i.includes(e)).join(`
|
|
52
|
-
`)})]})]})}function UP({device:e,linked:t,busy:n,onLink:r,onUnlink:i,onUpdate:a}){let[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(e.name),[u,d]=(0,X.useState)(e.description??``),f=()=>{c.trim()&&(c!==e.name||u!==(e.description??``))&&a({name:c.trim(),description:u.trim()||void 0}),s(!1)},p=()=>{l(e.name),d(e.description??``),s(!1)};return(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Z.jsx)(mr,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[o?(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(q,{value:c,onChange:e=>l(e.target.value),className:`h-7 text-sm`,placeholder:`Device name`,autoFocus:!0,onKeyDown:e=>{e.key===`Enter`&&f(),e.key===`Escape`&&p()}}),(0,Z.jsx)(q,{value:u,onChange:e=>d(e.target.value),className:`h-7 text-xs`,placeholder:`Description (optional)`,onKeyDown:e=>{e.key===`Enter`&&f(),e.key===`Escape`&&p()}})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),e.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]}),(0,Z.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-x-3 gap-y-0.5 text-[11px] text-muted-foreground font-mono`,children:[(0,Z.jsx)(`span`,{children:e.deviceId}),e.platform&&(0,Z.jsx)(`span`,{children:e.platform}),e.arch&&(0,Z.jsx)(`span`,{children:e.arch}),e.type&&(0,Z.jsx)(`span`,{children:e.type})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[o?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:f,disabled:!c.trim(),children:(0,Z.jsx)(sr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:p,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]}):(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>s(!0),title:`Edit name/description`,children:(0,Z.jsx)(Lr,{className:`h-3.5 w-3.5`})}),t?(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:n,onClick:i,className:`text-destructive hover:text-destructive`,title:`Remove from workspace`,children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})}):(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:n,onClick:r,title:`Link to workspace`,children:(0,Z.jsx)(Ri,{className:`h-3.5 w-3.5`})}),t&&(0,Z.jsx)(`span`,{className:`rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-medium text-primary`,children:`linked`})]})]})})}function WP({allDevices:e,linkedDevices:t,isLoading:n,deviceBusy:r,onRefresh:i,onLink:a,onUnlink:o,onUpdate:s}){let c=new Set(t.map(e=>e.deviceId));return n?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading devices…`]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[c.size,` of `,e.length,` registered device`,e.length===1?``:`s`,` linked to this workspace.`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:i,disabled:n,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),e.length===0?(0,Z.jsxs)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:[`No devices registered. Devices register themselves on first connection via `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`POST /auth/devices/register`}),`.`]}):(0,Z.jsx)(`div`,{className:`space-y-2`,children:e.map(e=>(0,Z.jsx)(UP,{device:e,linked:c.has(e.deviceId),busy:r===e.deviceId,onLink:()=>a(e.deviceId),onUnlink:()=>o(e.deviceId),onUpdate:t=>s(e.deviceId,t)},e.deviceId))})]})}function GP({label:e,value:t,mono:n=!1}){return(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-4 py-2 border-b last:border-0`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:e}),(0,Z.jsx)(`span`,{className:`text-xs text-right ${n?`font-mono`:``}`,children:t??`—`})]})}function KP({workspaceName:e,current:t,weights:n,floorMode:r,relativeMargin:i,onDone:a}){let[o,s]=(0,X.useState)(t==null?``:String(t)),[c,l]=(0,X.useState)(r??`relative`),[u,d]=(0,X.useState)(i==null?`0.035`:String(i)),[f,p]=(0,X.useState)(n?.fts==null?`2`:String(n.fts)),[m,h]=(0,X.useState)(n?.dense==null?`1`:String(n.dense)),[g,_]=(0,X.useState)(n?.image==null?`2`:String(n.image)),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(null),[S,C]=(0,X.useState)(cE);return(0,Z.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`How photo relevance is decided`}),(0,Z.jsxs)(`select`,{value:c,onChange:e=>l(e.target.value),className:`h-8 rounded-md border border-input bg-transparent px-2 text-xs`,children:[(0,Z.jsx)(`option`,{value:`relative`,children:`Relative to the best match (recommended)`}),(0,Z.jsx)(`option`,{value:`absolute`,children:`Absolute distance cutoff`})]}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Photo-vs-text distances shift with every query and every model, so one fixed cutoff travels badly: a value tuned for one model keeps everything (or nothing) on the next. Relative anchors on the best match for THIS query and survives a re-embed.`})]}),c===`relative`&&(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`Window width (distance from the best match)`}),(0,Z.jsx)(q,{value:u,onChange:e=>d(e.target.value),placeholder:`0.035`,className:`h-8 w-28 font-mono text-xs`,inputMode:`decimal`}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Wider keeps photos that match your query only partly, which is what a photo matching TWO things (a snowy window) looks like, since it sits further from each one than a pure example does. Too wide and everything gets in.`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:c===`relative`?`Hard ceiling (cosine distance, 0–2; blank = off)`:`Image relevance floor (cosine distance, 0–2; blank = off)`}),(0,Z.jsx)(q,{value:o,onChange:e=>s(e.target.value),placeholder:`0.95`,className:`h-8 w-28 font-mono text-xs`,inputMode:`decimal`}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:c===`relative`?`Nothing beyond this counts as a match however close it is to the best one. This is what lets a search of something you have no photos of come back empty. Without it, a relative window always returns its nearest photo.`:`Lower = stricter (fewer, more-relevant photos); raise if relevant photos are missing.`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`Hybrid fusion weights (0 disables a signal)`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap items-end gap-x-3 gap-y-2`,children:[[`lexical`,f,p],[`text semantic`,m,h],[`image`,g,_]].map(([e,t,n])=>(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:e}),(0,Z.jsx)(q,{value:t,onChange:e=>n(e.target.value),className:`h-8 w-16 font-mono text-xs`,inputMode:`decimal`})]},e))}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Ranking mix: lexical (filenames/content) · text semantics · photo matches. Equal lexical/image ranks a matching photo like a matching document.`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:async()=>{y(!0),x(null);try{let t=o.trim(),n=t===``?null:Number(t);if(n!==null&&!Number.isFinite(n)){x(`Enter a number (e.g. 0.95) or leave empty`);return}let r={fts:Number(f),dense:Number(m),image:Number(g)};if(Object.values(r).some(e=>!Number.isFinite(e)||e<0)){x(`Weights must be numbers ≥ 0`);return}let i=Number(u.trim());if(c===`relative`&&(!Number.isFinite(i)||i<=0)){x(`Window width must be a positive number (e.g. 0.035)`);return}await Vs(e,{imageMaxDistance:n,imageFloorMode:c,...c===`relative`?{imageRelativeMargin:i}:{},searchWeights:r}),x(`Saved`),a()}catch(e){x(e instanceof Error?e.message:`Failed to save`)}finally{y(!1)}},disabled:v,children:v?`Saving…`:`Save`}),b&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:b})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5 border-t border-border pt-3`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:S,onChange:e=>{lE(e.target.checked),C(e.target.checked)}}),(0,Z.jsx)(`span`,{children:`Debug query`})]}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Attaches the raw (unfloored) image distances to each search and shows them above the document list: the numbers this floor should be picked from. Local to this browser; costs a little extra work per query, so leave it off day to day.`})]})]})}function qP({stats:e,isLoading:t,onRefresh:n,workspaceName:r}){return t?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading stats…`]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Live snapshot from synapsd. Click refresh for updated counts.`}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:n,disabled:t,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),(0,Z.jsx)(ZP,{workspaceName:r,vectorSpaces:Object.keys(e?.semantic?.vectorSpaces||{}),onDone:n}),e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Z.jsx)(Fa,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Core Index`})]}),(0,Z.jsx)(GP,{label:`Backend`,value:e.dbBackend,mono:!0}),(0,Z.jsx)(GP,{label:`Status`,value:e.status}),(0,Z.jsx)(GP,{label:`Path`,value:e.dbPath,mono:!0}),(0,Z.jsx)(GP,{label:`Documents`,value:e.documentCount?.toLocaleString()}),(0,Z.jsx)(GP,{label:`Metadata entries`,value:e.metadataCount?.toLocaleString()}),(0,Z.jsx)(GP,{label:`Checksum index`,value:e.checksumIndexSize?.toLocaleString()}),(0,Z.jsx)(GP,{label:`Bitmap store`,value:e.bitmapStoreSize?.toLocaleString()}),(0,Z.jsx)(GP,{label:`Bitmap cache`,value:e.bitmapCacheSize?.toLocaleString()}),(0,Z.jsx)(GP,{label:`Deleted (pending GC)`,value:e.deletedDocumentsCount?.toLocaleString()})]}),e.fts&&(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Z.jsx)(ui,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Full-Text Search (LanceDB)`})]}),`ready`in e.fts&&(0,Z.jsx)(GP,{label:`Ready`,value:String(e.fts.ready)}),e.fts.rowCount!==void 0&&(0,Z.jsx)(GP,{label:`Row count`,value:e.fts.rowCount?.toLocaleString()}),e.fts.error&&(0,Z.jsx)(GP,{label:`Error`,value:(0,Z.jsx)(`span`,{className:`text-destructive`,children:e.fts.error})})]}),e.semantic&&(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Z.jsx)(ui,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Semantic / Vector Search`})]}),(0,Z.jsx)(GP,{label:`Enabled`,value:String(e.semantic.enabled)}),e.semantic.enabled&&(0,Z.jsxs)(Z.Fragment,{children:[e.inferd?.routing?Object.entries(e.inferd.routing).map(([e,t])=>(0,Z.jsx)(GP,{label:`Embeds → ${e}`,value:(0,Z.jsx)(`span`,{className:`font-mono text-[11px]`,children:t.join(`, `)})},`route-${e}`)):(0,Z.jsx)(GP,{label:`Text-embeddable (gap default)`,value:e.semantic.embeddableSchemas?.join(`, `)}),e.semantic.vectorSpaces&&Object.entries(e.semantic.vectorSpaces).map(([e,t])=>(0,Z.jsx)(GP,{label:`Space: ${e} (${t.dim??`?`}-d)`,value:t.error?(0,Z.jsx)(`span`,{className:`text-destructive`,children:t.error}):`${(t.embeddedDocs??0).toLocaleString()} docs · ${(t.chunkRows??0).toLocaleString()} vectors`},e)),(0,Z.jsx)(GP,{label:`Photo relevance`,value:e.semantic.imageFloorMode===`absolute`?`absolute cutoff`:`relative ±${e.semantic.imageRelativeMargin??.035}`,mono:!0}),(0,Z.jsx)(GP,{label:e.semantic.imageFloorMode===`absolute`?`Image relevance floor`:`Hard ceiling`,value:e.semantic.imageMaxDistance==null?`off`:e.semantic.imageMaxDistance,mono:!0}),(0,Z.jsx)(GP,{label:`Fusion weights (lexical · text · image)`,value:`${e.semantic.searchWeights?.fts??2} · ${e.semantic.searchWeights?.dense??1} · ${e.semantic.searchWeights?.image??2}`,mono:!0}),(0,Z.jsx)(KP,{workspaceName:r,current:e.semantic.imageMaxDistance,weights:e.semantic.searchWeights,floorMode:e.semantic.imageFloorMode,relativeMargin:e.semantic.imageRelativeMargin,onDone:n})]})]})]}):(0,Z.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`No stats available.`})]})}function JP(){let{workspaceName:e}=yt();return(0,Z.jsx)(YP,{},e)}function YP(){let{workspaceName:e,tab:t}=yt(),[n,r]=$t(),i=n.get(`section`),a=[`pending`,`rules`,`hooks`,`scripts`,`runs`].find(e=>e===i),o=n.get(`handler`)||void 0,s=n.get(`run`)||void 0,c=n.get(`addRuleKind`),l=n.get(`addRulePath`),u=n.get(`addRuleTarget`),d=n.get(`addRuleStoreTo`),p=n.get(`addRuleStoreFolder`),m=(0,X.useMemo)(()=>c===`store`||c===`download`?!l&&!d&&!p?null:{kind:c,path:l||``,storeTo:d||``,storeFolder:p||``}:l?{kind:`mirror`,path:l,target:u||`dir:/`}:null,[c,l,u,d,p]),h=(0,X.useCallback)(()=>{r(e=>{for(let t of[`addRuleKind`,`addRulePath`,`addRuleTarget`,`addRuleStoreTo`,`addRuleStoreFolder`])e.delete(t);return e},{replace:!0})},[r]),g=ft(),{showToast:_,showProgress:v}=wo(),y=De(),{goBack:b}=qC(),x=jD(t);(0,X.useEffect)(()=>{t!==x&&g(`/workspaces/${e}/settings/${x}`,{replace:!0})},[t,x,e,g]);let[S,C]=(0,X.useState)(null),w=se(S),[T,E]=(0,X.useState)(0),[D,O]=(0,X.useState)(!0),[k,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(!1),[N,P]=(0,X.useState)(``),[ee,F]=(0,X.useState)(``),[I,te]=(0,X.useState)(`#FFFFFF`),[L,R]=(0,X.useState)(null),[ne,re]=(0,X.useState)(null),[ie,ae]=(0,X.useState)([]),[z,oe]=(0,X.useState)(null),[B,ce]=(0,X.useState)([]),[V,le]=(0,X.useState)(null),[ue,de]=(0,X.useState)(null),[fe,pe]=(0,X.useState)(!1),[me,he]=(0,X.useState)([]),[ge,_e]=(0,X.useState)([]),[ve,ye]=(0,X.useState)(!1),[be,xe]=(0,X.useState)(null),H=e||S?.id||``,Se=(0,X.useRef)(H);(0,X.useEffect)(()=>{Se.current=H});let Ce=(0,X.useCallback)(async e=>{let t=e??Se.current;if(t)try{let e=await Mo(t);ae(e.publicCanvasShares)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load shares`,variant:`destructive`})}},[_]),U=(0,X.useCallback)(async e=>{let t=e??Se.current;if(t){pe(!0);try{let e=await Ec(t);de(e)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load DB stats`,variant:`destructive`})}finally{pe(!1)}}},[_]),W=(0,X.useCallback)(async e=>{let t=e??Se.current;if(t){ye(!0);try{let[e,n]=await Promise.all([xD(),wD(t)]);he(e),_e(n)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load devices`,variant:`destructive`})}finally{ye(!1)}}},[_]),we=async e=>{xe(e);try{let t=me.find(t=>t.deviceId===e);if(!t)throw Error(`Device not found in your account`);await TD(H,t),await W(),_({title:`Linked`,description:`Device linked to workspace`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to link device`,variant:`destructive`})}finally{xe(null)}},Te=async e=>{xe(e);try{await ED(H,e),_e(t=>t.filter(t=>t.deviceId!==e)),_({title:`Unlinked`,description:`Device removed from workspace`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to unlink device`,variant:`destructive`})}finally{xe(null)}},Ee=async(e,t)=>{xe(`edit:${e}`);try{let n=await SD(e,t);he(t=>t.map(t=>t.deviceId===e?{...t,...n}:t)),_({title:`Saved`,description:`Device updated`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update device`,variant:`destructive`})}finally{xe(null)}},Oe=(0,X.useCallback)(async e=>{let t=e??Se.current;if(!t)return;let[n,r]=await Promise.all([wc(t).catch(()=>null),Rc(t).catch(()=>[])]);oe(n),ce(r.filter(e=>e.kind===`storage`))},[]),ke=B.some(e=>e.resyncing);(0,X.useEffect)(()=>{if(!w||!ke||!H)return;let e=setInterval(()=>{Oe()},4e3);return()=>clearInterval(e)},[w,ke,H,Oe]),(0,X.useEffect)(()=>{let t=!1;async function n(){try{let n=await Uo();if(t)return;let r=n.find(t=>t.id===e)??n.find(t=>t.name===e);if(C(r??null),r){if(!se(r))return;P(r.label||``),F(r.description||``),te(r.color||`#FFFFFF`),R(r.icon??null),r.status===`active`&&await Promise.all([Ce(e||r.id),Oe(e||r.id)])}}catch{t||_({title:`Error`,description:`Failed to load workspace`,variant:`destructive`})}finally{t||O(!1)}}return n(),()=>{t=!0}},[e,Ce,Oe,_,T]),(0,X.useEffect)(()=>{let e=()=>E(e=>e+1);return window.addEventListener(`workspaces:refresh`,e),()=>window.removeEventListener(`workspaces:refresh`,e)},[]);let Ae=(0,X.useRef)(!1),je=(0,X.useRef)(!1);(0,X.useEffect)(()=>{Ae.current=!!ue||fe,je.current=ve||me.length>0}),(0,X.useEffect)(()=>{w&&(S?.status===`active`&&x===`db`&&H&&!Ae.current&&U(),S?.status===`active`&&x===`devices`&&H&&!je.current&&W())},[w,x,H,S?.status,U,W]);let Me=async e=>{if(e.preventDefault(),S){A(!0);try{await Pc(H,{label:N.trim(),description:ee.trim(),color:I,icon:L}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),_({title:`Saved`,description:`Workspace settings updated`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{A(!1)}}},Ne=async()=>{if(S&&window.prompt(`Destroy workspace "${S.label||S.name}" and all its documents? This cannot be undone. Type the workspace name "${S.name}" to confirm:`)===S.name){M(!0);try{await fs(H),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),_({title:`Destroyed`,description:`${S.label||S.name} has been removed`}),g(`/workspaces`)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Destroy failed`,variant:`destructive`})}finally{M(!1)}}},Pe=()=>{for(let t of[e,S?.name,S?.id])t&&Ms(t,`backends`);window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:H}}))},Fe=async e=>{if(e.config?.supported!==!1){le(`backend:${e.address}`);try{await Fo(H,e.driver,e.address,{enabled:!e.enabled}),await Oe(),Pe(),_({title:`Saved`,description:`${e.address} ${e.enabled?`disabled`:`enabled`}`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update backend`,variant:`destructive`})}finally{le(null)}}},Ie=async(e,t,n)=>{le(`${n}:${e.address}`);try{await Fo(H,e.driver,e.address,t),await Oe()}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update backend`,variant:`destructive`})}finally{le(null)}},Le=async e=>{let t=typeof e.config?.label==`string`&&e.config.label||e.address;if(window.confirm(`Remove backend "${t}"? No files are deleted; indexed entries remain until purged from the backends tree.`)){le(`remove:${e.address}`);try{await Xo(H,e.driver,e.address),await Oe(),Pe(),_({title:`Removed`,description:`${t} unmounted`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to remove backend`,variant:`destructive`})}finally{le(null)}}},Re=async e=>{le(`resync:${e.address}`);try{await et(v,H,e.driver,e.address,e=>{ce(t=>t.map(t=>t.driver===e.driver&&t.address===e.address?e:t))}),await Oe()}catch{}finally{le(null)}},ze=async e=>{le(`test:${e.address}`);try{await jc(H,e.driver,e.address),_({title:`Connected`,description:`${e.address}: credentials and root folder verified`})}catch(e){_({title:`Connection failed`,description:e instanceof Error?e.message:`Test failed`,variant:`destructive`})}finally{le(null)}},Be=async e=>{le(`stopsync:${e.address}`);try{await mc(H,e.driver,e.address),await Oe(),_({title:`Sync stopped`,description:`${e.address}: indexed files are kept; Re-sync resumes where it left off`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to stop sync`,variant:`destructive`})}finally{le(null)}},Ve=async(e,t)=>{le(`service:${e}`);try{t?await $s(H,e):await ps(H,e),await Oe(),_({title:t?`Disabled`:`Enabled`,description:`${e} ${t?`disabled`:`enabled`}`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to toggle service`,variant:`destructive`})}finally{le(null)}},He=async e=>{let t=`${window.location.origin}${e.url}`;await navigator.clipboard?.writeText(t),_({title:`Copied`,description:t})},Ue=async e=>{if(S&&window.confirm(`Revoke public share for "${e.path}"?`)){le(`share:${e.code}`);try{await Cc(H,e.code),await Ce(H),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:H}})),_({title:`Revoked`,description:`Public canvas link no longer works`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke share`,variant:`destructive`})}finally{le(null)}}},We=kD.find(e=>e.id===x);return D?(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`}):S?w?(0,Z.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6 border-b pb-4`,title:`${We.label} - ${S.label||S.name}`,description:`This workspace · ${We.description}`,backTo:`/workspaces/${e}`,onBack:y?b:void 0}),S.status!==`active`&&x!==`general`&&x!==`backups`&&(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Start this workspace to access these settings. General settings and protection remain available while stopped.`}),x===`backups`&&(0,Z.jsx)(BM,{workspaceId:H,onRestored:()=>E(e=>e+1)}),x===`general`&&(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`form`,{onSubmit:Me,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ws-id`,className:`text-sm font-medium`,children:`Workspace ID`}),(0,Z.jsx)(q,{id:`ws-id`,value:S.id,readOnly:!0,className:`font-mono text-sm`,onFocus:e=>e.currentTarget.select()})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ws-label`,className:`text-sm font-medium`,children:`Label`}),(0,Z.jsx)(q,{id:`ws-label`,value:N,onChange:e=>P(e.target.value),placeholder:`Workspace Label`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ws-description`,className:`text-sm font-medium`,children:`Description`}),(0,Z.jsx)(q,{id:`ws-description`,value:ee,onChange:e=>F(e.target.value),placeholder:`Description (optional)`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:`Icon & color`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`button`,{type:`button`,title:`Pick icon & color`,onClick:e=>re({x:Math.min(e.clientX,window.innerWidth-290),y:Math.min(e.clientY,window.innerHeight-360)}),className:`flex h-10 w-10 items-center justify-center rounded-md border hover:bg-accent`,children:(0,Z.jsx)(f,{icon:L||`ph:stack-fill`,width:22,height:22,color:Jt(I)})}),(0,Z.jsx)(q,{id:`ws-color`,type:`color`,value:I,onChange:e=>te(e.target.value),className:`h-10 w-16 p-1`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>te(on()),children:`Randomize`})]})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:k||!N.trim(),children:k?`Saving...`:`Save Changes`})]}),ne&&(0,Z.jsx)(dw,{x:ne.x,y:ne.y,current:{icon:L??void 0,color:I},onChange:e=>{`icon`in e&&R(e.icon??null),`color`in e&&e.color&&te(e.color)},onClose:()=>re(null)}),(0,Z.jsx)(QM,{currentMode:S.protection?.mode,workspaceId:H,isActive:S.status===`active`,onChanged:()=>E(e=>e+1)}),S.status===`active`&&(0,Z.jsx)(XP,{workspaceName:e}),S.status===`active`&&(0,Z.jsx)(VP,{workspaceId:H}),(0,Z.jsx)(NP,{workspaceId:H,workspaceName:S.label||S.name,isActive:S.status===`active`,onChanged:()=>E(e=>e+1)}),(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Z.jsxs)(Y,{variant:`destructive`,disabled:j,onClick:Ne,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-4 w-4`}),j?`Destroying...`:`Destroy Workspace`]})]})]}),S.status===`active`&&x===`shares`&&(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Members`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Share this workspace with teammates by e-mail or with a whole directory group. It shows up in their workspace list on this server.`})]}),(0,Z.jsx)(MP,{workspaceId:H})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Public Canvas Shares`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Active public canvas links for this workspace.`})]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>Ce(),children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),ie.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`No public canvas shares. Good.`}):ie.map(e=>{let t=`${window.location.origin}${e.url}`;return(0,Z.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate font-mono text-sm`,children:e.path}),(0,Z.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[e.treeName,` / `,e.treeType,` - created `,new Date(e.createdAt).toLocaleString()]}),e.lockedBy?.length>0&&(0,Z.jsxs)(`div`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`locks: `,e.lockedBy.join(`, `)]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>He(e),children:(0,Z.jsx)(Jn,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>window.open(t,`_blank`,`noreferrer`),children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`share:${e.code}`,onClick:()=>Ue(e),className:`text-destructive hover:text-destructive`,children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})})]})]}),(0,Z.jsx)(`div`,{className:`mt-2 truncate rounded bg-muted/40 px-2 py-1 font-mono text-xs text-muted-foreground`,children:t})]},e.code)})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Workspace ACL Tokens`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Generate token-based workspace access for devices, scripts, and other users.`})]}),(0,Z.jsx)(OP,{workspaceId:H})]})]}),S.status===`active`&&x===`data`&&(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[B.map(e=>{let t=e.config||{},n=e.address,r=t.device||null,i=e.driver===`gdrive`,a=e.driver===`s3`,o=(e.driver===`file`||i||a)&&t.managed!==!0&&!PP[n],s=PP[n]||{title:typeof t.label==`string`&&t.label||n,description:a?`S3 bucket ${t.bucket||``}${t.prefix?`/${t.prefix}`:``}${t.endpoint?` at ${t.endpoint}`:``}. Filing copies only.`:i?`Google Drive${typeof t.account==`string`&&t.account&&t.account!==t.label?` (${t.account})`:``}, folder ${typeof t.folderId==`string`&&t.folderId?t.folderId:`root`}${e.treePath?`, mirrored at ${e.treePath}`:``}.`:o?`Local folder${r?.name?` on ${r.name}`:``}, indexed in place${e.treePath?` and mirrored at ${e.treePath}`:``}.`:`Workspace data backend.`},c=t.supported!==!1,l=n===`workspace:data`,u=c&&!l,d=u&&t.managed!==!0,p=vt(e);return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(f,{icon:p.icon,width:16,height:16,color:p.color,className:`shrink-0`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:s.title}),!c&&(0,Z.jsx)(`span`,{className:`rounded bg-muted px-2 py-0.5 text-[11px] text-muted-foreground`,children:`unsupported`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:s.description}),typeof t.root==`string`&&t.root&&(0,Z.jsx)(`p`,{className:`mt-2 truncate font-mono text-xs text-muted-foreground`,children:t.root}),(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`status: `,e.status]}),e.resyncing&&(0,Z.jsxs)(`span`,{className:`flex items-center gap-1 rounded bg-primary/10 px-1.5 py-0.5 font-medium text-primary`,children:[(0,Z.jsx)(Er,{className:`h-3 w-3 animate-spin`}),`indexing`,e.progress?` ${e.progress.scanned}${e.progress.total==null?``:` / ${e.progress.total}`}`:``]}),r?.name&&(0,Z.jsxs)(`span`,{title:r.id,children:[`device: `,r.name]}),t.readOnly===!0&&(0,Z.jsx)(`span`,{className:`rounded bg-warning/15 px-1.5 py-0.5 font-medium text-warning`,children:`read-only`}),e.lastSyncAt&&(0,Z.jsxs)(`span`,{children:[`last scan: `,new Date(e.lastSyncAt).toLocaleString()]})]}),e.lastError&&(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-destructive`,children:e.lastError}),t.readOnly===!0&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-warning`,children:`Read-only: the web UI / REST API never deletes bytes on this backend. Destroy degrades to a reference drop. Recommended when the folder is exported elsewhere (e.g. via Samba).`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-3`,children:[e.capabilities?.sync&&c&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,title:`Scan this backend in the background whenever the workspace starts. Manual scans remain available when off.`,children:[`Scan on start`,(0,Z.jsx)(IP,{checked:t.scanOnStart===!0,disabled:V===`startup:${n}`,onClick:()=>Ie(e,{scanOnStart:t.scanOnStart!==!0},`startup`)})]}),(e.driver===`file`||i||a)&&u&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,title:i?`Poll the Drive changes feed so edits made in Drive show up without a manual re-sync.`:void 0,children:[`Watch for changes`,(0,Z.jsx)(IP,{checked:!!t.watch,disabled:!e.enabled||V===`watch:${n}`,onClick:()=>Ie(e,{watch:!t.watch},`watch`)})]}),d&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,title:`Read-only: Destroy never deletes bytes on this backend (references are dropped instead). Important when the folder is exported via Samba or shared otherwise.`,children:[`read-only`,(0,Z.jsx)(IP,{checked:t.readOnly===!0,disabled:V===`readonly:${n}`,onClick:()=>Ie(e,{readOnly:t.readOnly!==!0},`readonly`)})]}),(e.driver===`file`||e.driver===`cacache`)&&c&&(0,Z.jsx)(zP,{workspaceId:H,backend:e}),e.capabilities?.test&&(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`test:${n}`,onClick:()=>ze(e),title:`Verify credentials and root folder`,children:[(0,Z.jsx)(ui,{className:`mr-2 h-3.5 w-3.5`}),V===`test:${n}`?`Testing…`:`Test`]}),e.capabilities?.sync&&(e.resyncing?(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`stopsync:${n}`,onClick:()=>Be(e),title:`Stop the running scan. Files indexed so far are kept; Re-sync later resumes where it left off (unchanged files are skipped).`,children:[(0,Z.jsx)(Sa,{className:`mr-2 h-3.5 w-3.5 fill-current`}),V===`stopsync:${n}`?`Stopping…`:`Stop sync`]}):(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`resync:${n}`,onClick:()=>Re(e),children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${V===`resync:${n}`?`animate-spin`:``}`}),`Re-sync`]})),l?(0,Z.jsx)(`span`,{className:`rounded bg-muted px-2 py-0.5 text-[11px] text-muted-foreground`,title:`Structural workspace store; cannot be disabled`,children:`always on`}):(0,Z.jsx)(IP,{checked:!!e.enabled,disabled:!u||V===`backend:${n}`,onClick:()=>Fe(e)}),o&&(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:V===`remove:${n}`,title:`Unmount this folder (no files are deleted)`,onClick:()=>Le(e),children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})]}),c&&(0,Z.jsx)(Xw,{value:t.removalPolicy,backends:B,source:n,destination:t.propagatedRemovalSupported===!0,onSave:async t=>{await Fo(H,e.driver,e.address,{removalPolicy:t}),await Oe()}}),a&&(0,Z.jsx)(ZM,{workspaceId:H,backend:e,onSaved:async()=>{await Oe(),Pe()}}),e.driver===`file`&&c&&!l&&(0,Z.jsx)(HP,{backend:e,busy:V===`exclude:${n}`,onSave:t=>Ie(e,{exclude:t},`exclude`)})]},n)}),(0,Z.jsx)(XM,{workspaceId:H,children:(0,Z.jsx)(BP,{workspaceId:H})},H),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-start`,children:[(0,Z.jsx)(LP,{workspaceId:H,onAdded:async()=>{await Oe(),Pe()}}),(0,Z.jsx)(RP,{workspaceId:H,onAdded:async()=>{await Oe(),Pe()}}),(0,Z.jsx)(ZM,{workspaceId:H,onSaved:async()=>{await Oe(),Pe()}})]}),e&&(0,Z.jsx)(`section`,{className:`border-t pt-4`,children:(0,Z.jsx)(Qw,{workspaceName:e})})]}),S.status===`active`&&x===`db`&&(0,Z.jsxs)(`div`,{className:`space-y-8`,children:[H&&(0,Z.jsxs)(`section`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Embeddings`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Which model turns this workspace's content into vectors, and where those vectors live.`})]}),(0,Z.jsx)(lN,{workspaceId:H,workspaceName:e})]}),(0,Z.jsx)(qP,{stats:ue,isLoading:fe,onRefresh:()=>U(),workspaceName:e})]}),S.status===`active`&&x===`devices`&&(0,Z.jsx)(WP,{allDevices:me,linkedDevices:ge,isLoading:ve,deviceBusy:be,onRefresh:()=>W(),onLink:we,onUnlink:Te,onUpdate:Ee}),S.status===`active`&&x===`sync`&&(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsx)(gP,{workspaceId:H,workspaceUuid:S?.id})}),S.status===`active`&&x===`services`&&(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[H&&(0,Z.jsx)(CP,{workspaceId:H}),(0,Z.jsx)(`div`,{className:`space-y-3`,children:FP.map(e=>{let t=z?.[e.id]||z?.[e.id===`git`?`dotfiles`:e.id===`webdav`?`home`:`imap`],n=!!t?.enabled;return(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(pi,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:e.title})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}),(0,Z.jsxs)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:[`initialized: `,t?.initialized?`true`:`false`]})]}),(0,Z.jsx)(IP,{checked:n,disabled:V===`service:${e.id}`,onClick:()=>Ve(e.id,n)})]})},e.id)})}),(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsx)(DP,{workspaceId:H,enabled:!!(z?.imap?.enabled||z?.imapSync?.enabled)})})]}),S.status===`active`&&x===`policies`&&(0,Z.jsx)(nP,{workspaceId:H}),S.status===`active`&&x===`hooks`&&(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsx)(CN,{workspaceId:H,prefillRule:m,onPrefillConsumed:h,initialSection:a,initialRunsHandler:o,initialRunId:s})})]})}):(0,Z.jsxs)(`div`,{className:`space-y-3 p-6`,children:[(0,Z.jsx)(`h1`,{className:`font-semibold`,children:S.label||S.name}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Workspace settings are available to owners and admins.`}),(0,Z.jsx)(Y,{variant:`outline`,onClick:()=>g(`/workspaces/${e}`),children:`Back to workspace`})]}):(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Workspace not found`})}function XP({workspaceName:e}){let{selected:t,setSelected:n,tree:r,setTree:i,toggle:a}=Ew(),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null);return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Default folders`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Create a set of common folders with matching icons and colors.`}),(0,Z.jsx)(`div`,{className:`mt-3`,children:(0,Z.jsx)(Dw,{selected:t,onToggle:a,tree:r,onTreeChange:i,disabled:o,idPrefix:`settings-default-folders`})}),(0,Z.jsxs)(`div`,{className:`mt-3 flex items-center gap-3`,children:[(0,Z.jsx)(Y,{type:`button`,size:`sm`,disabled:o||t.size===0,onClick:async()=>{s(!0),l(null);let{ok:i,failed:a}=await Tw(e,Array.from(t),r);s(!1),l(a?`${i} created, ${a} failed`:`${i} folder(s) created`),n(new Set)},children:o?`Creating…`:`Create ${t.size||``} folder(s)`}),c&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:c})]})]})}function ZP({workspaceName:e,vectorSpaces:t,onDone:n}){let[r,i]=(0,X.useState)(null),[a,o]=(0,X.useState)(null),s=async(e,t,r)=>{if(!(r&&!window.confirm(r))){i(e),o(null);try{let e=await t();o(e.message),n()}catch(e){o(e instanceof Error?e.message:`Reindex failed`)}finally{i(null)}}},c=[{title:`Bitmaps`,ops:[{key:`timelines`,label:`Reindex timelines`,description:`Rebuild the created/updated timelines from document data.`,fn:()=>vc(e)},{key:`mime`,label:`Reindex MIME types`,description:`Rebuild the per-MIME-type presence bitmaps (data/mime/*) from stored docs. Backfills blobs indexed before mime bitmaps existed.`,fn:()=>Wo(e)}]},{title:`Full-text (BM25)`,ops:[{key:`fts`,label:`Backfill`,description:`Index documents missing from the full-text table. Fast, skips already-indexed.`,fn:()=>$o(e)},{key:`fts-rebuild`,label:`Rebuild`,description:`Wipe the full-text table and rebuild from scratch. Use when counts drift.`,confirm:`Wipe the FTS index and rebuild it from scratch?`,fn:()=>$o(e,!0)},{key:`fts-optimize`,label:`Optimize`,description:`Compact fragments + prune old versions of the full-text table.`,fn:()=>ws(e,`fts`)}]},...t.length>0?[{title:`Vector tables (LanceDB)`,ops:t.map(t=>({key:`${t}-optimize`,label:`Optimize ${t}`,description:`Compact fragments + prune old versions of the '${t}' vector table and rebuild its ANN index.`,fn:()=>ws(e,t)}))}]:[]];return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-1 flex items-center gap-2`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Index maintenance`})]}),(0,Z.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Runs against this workspace. Reindex operations are idempotent.`}),(0,Z.jsx)(`div`,{className:`space-y-4`,children:c.map(e=>(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h3`,{className:`mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e.title}),(0,Z.jsx)(`div`,{className:`space-y-2`,children:e.ops.map(e=>(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,className:`w-44 justify-start`,disabled:r!==null,onClick:()=>s(e.key,e.fn,e.confirm),children:[r===e.key&&(0,Z.jsx)(Er,{className:`mr-2 h-3 w-3 animate-spin`}),e.label]}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 basis-52 text-xs text-muted-foreground`,children:e.description})]},e.key))})]},e.title))}),a&&(0,Z.jsx)(`p`,{className:`mt-3 text-xs text-muted-foreground`,children:a})]})}var QP=[{value:`documentRead`,label:`Read`},{value:`documentWrite`,label:`Write`},{value:`documentReadWrite`,label:`Read & write`}];function $P(){let{contextId:e,tab:t}=yt(),[n]=$t(),r=n.get(`ownerId`)||void 0,i=ft(),{showToast:a}=wo(),{selectEntity:o,goBack:s,closeM2:c}=qC(),l=De(),u=ND(t),d=r?`?ownerId=${encodeURIComponent(r)}`:``;(0,X.useEffect)(()=>{t!==u&&e&&i(`/contexts/${e}/settings/${u}${d}`,{replace:!0})},[t,u,e,d,i]);let[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(!0),[g,_]=(0,X.useState)(!1),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(``),[S,w]=(0,X.useState)(``),[T,E]=(0,X.useState)(null),[D,O]=(0,X.useState)(``),[k,A]=(0,X.useState)(``),[j,M]=(0,X.useState)(),[N,P]=(0,X.useState)([]),[ee,F]=(0,X.useState)(!1),[I,te]=(0,X.useState)(``),[L,R]=(0,X.useState)(QP[0].value),[ne,re]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!e)return;let t=!1;return Tl(e,r).then(e=>{t||(p(e),o(e.id),x(e.name||``),w(e.description||``),E(typeof e.metadata?.ui?.color==`string`?e.metadata.ui.color:null),O(e.url||``),A(e.baseUrl||``))}).catch(()=>{t||a({title:`Error`,description:`Failed to load context`,variant:`destructive`})}).finally(()=>{t||h(!1)}),()=>{t=!0}},[e,r,o,a]);let ie=(t=e)=>{t&&(F(!0),jl(t).then(P).catch(()=>P([])).finally(()=>F(!1)))};(0,X.useEffect)(()=>{if(u!==`shares`||!e)return;let t=!1;return jl(e).then(e=>{t||P(e)}).catch(()=>{t||P([])}),()=>{t=!0}},[u,e]);let ae=async t=>{if(t.preventDefault(),e){_(!0);try{let t=await dl(e,{name:b.trim(),description:S.trim(),metadata:{...f?.metadata,ui:{...f?.metadata?.ui,color:T}}},r);p(t),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),a({title:`Saved`,description:`Context updated`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{_(!1)}}},z=async t=>{if(t.preventDefault(),e){_(!0);try{await Promise.all([sl(e,D.trim(),r,j),xl(e,{baseUrl:k.trim()||null},r)]),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),a({title:`Saved`,description:`Context URL updated`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{_(!1)}}},oe=async()=>{if(e&&window.confirm(`Delete context "${e}"? This cannot be undone.`)){y(!0);try{await gl(e,r),c(),o(null),a({title:`Deleted`,description:`Context "${e}" removed`}),i(`/contexts`,{replace:!0})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Delete failed`,variant:`destructive`})}finally{y(!1)}}},se=async t=>{if(t.preventDefault(),!(!e||!I.trim())){re(`grant`);try{await vl(e,I.trim(),L),te(``),ie(),a({title:`Shared`,description:`Access granted to ${I.trim()}`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to grant access`,variant:`destructive`})}finally{re(null)}}},B=async t=>{if(e&&window.confirm(`Revoke ${t.userEmail}'s access to "${e}"?`)){re(t.userEmail);try{await cl(e,t.userEmail),ie(),a({title:`Revoked`,description:`${t.userEmail} no longer has access`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke access`,variant:`destructive`})}finally{re(null)}}};if(m)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!f)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Context not found`});let ce=MD.find(e=>e.id===u),V=`/contexts/${e}${d}`;return(0,Z.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-3xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6 border-b pb-4`,title:`${ce.label} - ${f.name||f.id}`,description:ce.description,backTo:V,onBack:l?s:void 0}),u===`general`&&(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`form`,{onSubmit:ae,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:`Context ID`}),(0,Z.jsx)(`div`,{className:`mt-1 flex h-10 items-center rounded-md bg-muted px-3 font-mono text-sm text-muted-foreground`,children:f.id})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-name`,className:`text-sm font-medium`,children:`Name`}),(0,Z.jsx)(q,{id:`ctx-name`,value:b,onChange:e=>x(e.target.value),placeholder:`My Context`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-description`,className:`text-sm font-medium`,children:`Description`}),(0,Z.jsx)(q,{id:`ctx-description`,value:S,onChange:e=>w(e.target.value),placeholder:`Optional description`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-color`,className:`text-sm font-medium`,children:`Color`}),(0,Z.jsxs)(`div`,{className:`mt-1 flex items-center gap-2`,children:[(0,Z.jsx)(q,{id:`ctx-color`,type:`color`,value:/^#[0-9a-f]{6}$/i.test(T||f.color||``)?T||f.color:`#808080`,onChange:e=>E(e.target.value),className:`h-10 w-16 p-1`,disabled:g}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:g||T===null,onClick:()=>E(null),children:`Use inherited color`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:T===null?`Using the tree folder or workspace color.`:`Applies only to this context.`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:`Workspace`}),(0,Z.jsx)(`div`,{className:`mt-1 flex h-10 items-center rounded-md bg-muted px-3 text-sm text-muted-foreground`,children:f.workspaceName||f.workspaceId||f.workspace})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:g,children:g?`Saving...`:`Save Changes`})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Z.jsxs)(Y,{variant:`destructive`,disabled:v,onClick:oe,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-4 w-4`}),v?`Deleting...`:`Delete Context`]})]})]}),u===`location`&&(0,Z.jsxs)(`form`,{onSubmit:z,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-url`,className:`text-sm font-medium`,children:`URL`}),(0,Z.jsx)(C,{id:`ctx-url`,value:D,onChange:O,fixedWorkspaceName:f.workspaceName,pickerTitle:`Switch context to…`,placeholder:`workspace://path`,onPickTarget:(e,t)=>{O(`${t.workspaceName}://${e.replace(/^\/+/,``)}`),M(t.treeName)}}),j&&(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Destination tree: `,j]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`label`,{htmlFor:`ctx-base-url`,className:`text-sm font-medium`,children:[`Base URL `,(0,Z.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Z.jsx)(C,{id:`ctx-base-url`,value:k,onChange:A,fixedWorkspaceName:f.workspaceName,placeholder:`workspace://base/path`,pickerTitle:`Pick a base path…`})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:g,children:g?`Saving...`:`Save Changes`})]}),u===`shares`&&(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`People with access`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Only the context owner can see and change this list.`})]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>ie(),disabled:ee,children:[(0,Z.jsx)(Er,{className:K(`mr-2 h-3.5 w-3.5`,ee&&`animate-spin`)}),`Refresh`]})]}),N.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Not shared with anyone.`}):N.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.userEmail}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[QP.find(t=>t.value===e.accessLevel)?.label||e.accessLevel||`unknown access`,e.sharedAt&&` - since ${new Date(e.sharedAt).toLocaleDateString()}`]})]}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:ne===e.userEmail,onClick:()=>B(e),children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})})]},e.userEmail))]}),(0,Z.jsxs)(`form`,{onSubmit:se,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Grant access`}),(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`share-email`,className:`text-sm font-medium`,children:`User email`}),(0,Z.jsx)(q,{id:`share-email`,type:`email`,value:I,onChange:e=>te(e.target.value),placeholder:`person@example.com`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`The user must already have an account on this server.`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`share-level`,className:`text-sm font-medium`,children:`Access level`}),(0,Z.jsx)(`select`,{id:`share-level`,value:L,onChange:e=>R(e.target.value),className:`mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,children:QP.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))})]})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:ne===`grant`||!I.trim(),children:ne===`grant`?`Sharing...`:`Share context`})]})]})]})})}function eF({status:e}){let t={running:{icon:kr,color:`text-success`,bg:`bg-success-subtle`,label:`Running`},stopped:{icon:Bn,color:`text-muted-foreground`,bg:`bg-muted`,label:`Stopped`},starting:{icon:Zn,color:`text-info`,bg:`bg-info-subtle`,label:`Starting`},stopping:{icon:Zn,color:`text-warning`,bg:`bg-warning-subtle`,label:`Stopping`},error:{icon:er,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Error`},created:{icon:ui,color:`text-muted-foreground`,bg:`bg-muted`,label:`Created`},configured:{icon:ui,color:`text-info`,bg:`bg-info-subtle`,label:`Configured`},removed:{icon:Bn,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Removed`}},n=t[e]||t.created,r=n.icon;return(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${n.bg} ${n.color}`,children:[(0,Z.jsx)(r,{className:`w-3 h-3`}),n.label]})}function tF(){let[e,t]=(0,X.useState)([]),[n,r]=(0,X.useState)(!0),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null);Ae(()=>s(null),o!==null);let[c,l]=hw(),[u,d]=(0,X.useState)([]),[f,p]=(0,X.useState)([]),[m,h]=(0,X.useState)(``),[g,_]=(0,X.useState)(``),[v,y]=(0,X.useState)(``),[b,x]=(0,X.useState)(!1),{showToast:S}=wo(),C=du(),w=(0,X.useCallback)(async()=>{try{r(!0);let e=await Nj.listRoles({type:`workspace`,userId:C?.id});t(e),a(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch roles`;a(t)}finally{r(!1)}},[C?.id]);(0,X.useEffect)(()=>{let e=()=>w();e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[w]),(0,X.useEffect)(()=>{c&&(Nj.listTemplates().then(e=>{let t=e.filter(e=>e.type===`workspace`);d(t),h(e=>e||t[0]?.id||``)}).catch(()=>d([])),Uo().then(e=>{p(e),y(t=>t||e[0]?.id||``)}).catch(()=>p([])))},[c]);let T=async e=>{if(e.preventDefault(),!(!m||!g.trim()||!v)){x(!0);try{let e=await Nj.createRole({template:m,name:g.trim(),type:`workspace`,userId:C?.id,workspaceId:v});_(``),l(!1),await w(),S({title:`Created`,description:`Role "${e.name}" created`})}catch(e){S({title:`Error`,description:e instanceof Error?e.message:`Failed to create role`,variant:`destructive`})}finally{x(!1)}}},E=async e=>{try{await Nj.startRole(e.id),S({title:`Success`,description:`Role "${e.name}" started successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to start role`;S({title:`Error`,description:t,variant:`destructive`})}},D=async e=>{try{await Nj.stopRole(e.id),S({title:`Success`,description:`Role "${e.name}" stopped successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to stop role`;S({title:`Error`,description:t,variant:`destructive`})}},O=async e=>{try{await Nj.restartRole(e.id),S({title:`Success`,description:`Role "${e.name}" restarted successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to restart role`;S({title:`Error`,description:t,variant:`destructive`})}},k=async e=>{try{let t=await Nj.getRoleLogs(e.id,100);s({role:e,logs:t})}catch(e){let t=e instanceof Error?e.message:`Failed to fetch logs`;S({title:`Error`,description:t,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`My Roles`,description:`Manage your workspace roles and services`,actions:(0,Z.jsxs)(Z.Fragment,{children:[!c&&(0,Z.jsxs)(Y,{onClick:()=>l(!0),children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Role`]}),(0,Z.jsxs)(Y,{onClick:w,variant:`outline`,children:[(0,Z.jsx)(Ba,{className:`mr-2 h-4 w-4`}),`Refresh`]})]})}),c&&(0,Z.jsx)(pw,{title:`Create New Role`,onClose:()=>l(!1),children:(0,Z.jsxs)(`form`,{onSubmit:T,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`role-template`,className:`mb-1 block text-sm font-medium`,children:`Template`}),(0,Z.jsxs)(`select`,{id:`role-template`,className:`w-full rounded-md border border-border bg-background px-3 py-2`,value:m,onChange:e=>h(e.target.value),disabled:b||u.length===0,children:[u.length===0&&(0,Z.jsx)(`option`,{value:``,children:`No workspace templates available`}),u.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,` - `,e.description]},e.id))]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`role-name`,className:`mb-1 block text-sm font-medium`,children:`Role Name`}),(0,Z.jsx)(q,{id:`role-name`,value:g,onChange:e=>_(e.target.value),placeholder:`e.g., canvas-sshd`,disabled:b})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`role-workspace`,className:`mb-1 block text-sm font-medium`,children:`Workspace`}),(0,Z.jsxs)(`select`,{id:`role-workspace`,className:`w-full rounded-md border border-border bg-background px-3 py-2`,value:v,onChange:e=>y(e.target.value),disabled:b||f.length===0,children:[f.length===0&&(0,Z.jsx)(`option`,{value:``,children:`No workspaces available. Create one first.`}),f.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.label||e.name},e.id))]})]}),(0,Z.jsxs)(Y,{type:`submit`,disabled:b||!m||!g.trim()||!v,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),b?`Creating…`:`Create Role`]})]})}),n?(0,Z.jsx)(`div`,{className:`text-center py-8`,children:`Loading roles...`}):i?(0,Z.jsx)(`div`,{className:`text-center py-8 text-destructive`,children:i}):e.length===0?(0,Z.jsxs)(`div`,{className:`text-center py-12 border rounded-lg`,children:[(0,Z.jsx)(pi,{className:`w-12 h-12 mx-auto text-muted-foreground mb-4`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:`You don't have any workspace roles yet`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:`Contact your administrator to set up roles for your workspaces`})]}):(0,Z.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:e.map(e=>(0,Z.jsxs)(`div`,{className:`border rounded-lg p-6 space-y-4 hover:shadow-elevation-2 transition-shadow`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex-1`,children:[(0,Z.jsx)(`h3`,{className:`font-semibold text-lg`,children:e.name}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.template})]}),(0,Z.jsx)(eF,{status:e.status})]}),e.container&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Z.jsx)(pi,{className:`w-3 h-3`}),(0,Z.jsx)(`span`,{className:`truncate`,children:e.container.name})]})}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-2`,children:[e.status===`stopped`||e.status===`created`?(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>E(e),className:`flex-1`,children:[(0,Z.jsx)(Ar,{className:`w-4 h-4 mr-2`}),`Start`]}):e.status===`running`?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(e),className:`flex-1`,children:[(0,Z.jsx)(Sa,{className:`w-4 h-4 mr-2`}),`Stop`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>O(e),className:`flex-1`,children:[(0,Z.jsx)(Ba,{className:`w-4 h-4 mr-2`}),`Restart`]})]}):(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:!0,className:`flex-1`,children:[(0,Z.jsx)(Zn,{className:`w-4 h-4 mr-2`}),e.status]}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>k(e),title:`View Logs`,children:(0,Z.jsx)(Ki,{className:`w-4 h-4`})})]})]},e.id))}),(0,Z.jsxs)(`div`,{className:`border-t pt-6`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold mb-4`,children:`Global Services`}),(0,Z.jsxs)(`div`,{className:`text-sm text-muted-foreground space-y-2`,children:[(0,Z.jsx)(`p`,{children:`Global roles are server-wide services managed by your administrator. These include services like SSH access, storage, and other shared infrastructure.`}),(0,Z.jsx)(`p`,{children:`To check the status of global services, contact your system administrator.`})]})]}),o&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-background rounded-lg shadow-elevation-3 max-w-4xl w-full mx-4 max-h-viewport-modal flex flex-col`,children:[(0,Z.jsxs)(`div`,{className:`p-6 border-b`,children:[(0,Z.jsxs)(`h2`,{className:`text-xl font-bold`,children:[o.role.name,` - Logs`]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o.role.template})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto p-6`,children:(0,Z.jsx)(`div`,{"data-scheme":`dark`,className:`bg-background text-success p-4 rounded font-mono text-xs overflow-x-auto`,children:o.logs.length===0?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Z.jsx)(`pre`,{children:o.logs.join(`
|
|
53
|
-
`)})})}),(0,Z.jsx)(`div`,{className:`p-4 border-t flex justify-end`,children:(0,Z.jsx)(Y,{onClick:()=>s(null),children:`Close`})})]})})]})}function nF(){return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`Remotes`,description:`Connect to remote Canvas instances`}),(0,Z.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Z.jsxs)(`div`,{className:`text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Remote connection management is currently under development. Check back later for updates.`})]})})]})}var rF=[`note`,`todo`,`link`,`file`,`photo`];function iF(){let{kind:e}=yt(),t=ft();return e===`sketch`?(0,Z.jsx)(ht,{to:`/apps/sketch?add=1`,replace:!0}):!e||!rF.includes(e)?(0,Z.jsx)(ht,{to:`/home`,replace:!0}):(0,Z.jsx)(XE,{initialKind:e,onInitialCardClose:()=>t(`/home`)})}var aF=(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(sn,{index:!0,element:(0,Z.jsx)(oD,{})},`r1`),(0,Z.jsx)(sn,{path:`home`,element:(0,Z.jsx)(aD,{})},`r2`),(0,Z.jsx)(sn,{path:`share-target`,element:(0,Z.jsx)(pD,{})},`r3`),(0,Z.jsx)(sn,{path:`apps`,element:(0,Z.jsx)(rw,{})},`apps-index`),(0,Z.jsx)(sn,{path:`apps/:appletId`,element:(0,Z.jsx)(xC,{})},`apps-host`),(0,Z.jsx)(sn,{path:`apps/add/:kind`,element:(0,Z.jsx)(iF,{})},`r4`),(0,Z.jsx)(sn,{path:`workspaces`,element:(0,Z.jsx)(Rw,{})},`r5`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName`,element:(0,Z.jsx)(yE,{})},`r6`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/by-id/:documentId`,element:(0,Z.jsx)(wE,{})},`workspace-document-by-id`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/:documentId`,element:(0,Z.jsx)(wE,{})},`workspace-document`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/by-hash/:algo/:checksum`,element:(0,Z.jsx)(wE,{})},`workspace-document-by-hash`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/by-checksum/:algo/:checksum`,element:(0,Z.jsx)(wE,{})},`workspace-document-by-checksum`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/settings`,element:(0,Z.jsx)(JP,{})},`r7`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/settings/:tab`,element:(0,Z.jsx)(JP,{})},`r8`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/path/*`,element:(0,Z.jsx)(yE,{})},`r9`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/trees/:treeName`,element:(0,Z.jsx)(yE,{})},`r10`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/trees/:treeName/path/*`,element:(0,Z.jsx)(yE,{})},`r11`),(0,Z.jsx)(sn,{path:`contexts`,element:(0,Z.jsx)(gD,{})},`r12`),(0,Z.jsx)(sn,{path:`contexts/:contextId`,element:(0,Z.jsx)(vD,{})},`r13`),(0,Z.jsx)(sn,{path:`contexts/:contextId/settings`,element:(0,Z.jsx)($P,{})},`r14`),(0,Z.jsx)(sn,{path:`contexts/:contextId/settings/:tab`,element:(0,Z.jsx)($P,{})},`r15`),(0,Z.jsx)(sn,{path:`agents`,element:(0,Z.jsx)(sM,{})},`r16`),(0,Z.jsx)(sn,{path:`agents/:agentId`,element:(0,Z.jsx)(CM,{})},`r17`),(0,Z.jsx)(sn,{path:`agents/:agentId/:sessionId`,element:(0,Z.jsx)(CM,{})},`r18`),(0,Z.jsx)(sn,{path:`agents/:agentId/settings`,element:(0,Z.jsx)(jM,{})},`r19`),(0,Z.jsx)(sn,{path:`agents/:agentId/settings/:tab`,element:(0,Z.jsx)(jM,{})},`r20`),(0,Z.jsx)(sn,{path:`roles`,element:(0,Z.jsx)(tF,{})},`r21`),(0,Z.jsx)(sn,{path:`remotes`,element:(0,Z.jsx)(nF,{})},`r22`),(0,Z.jsx)(sn,{path:`settings`,element:(0,Z.jsx)(SO,{})},`settings`),(0,Z.jsx)(sn,{path:`appearance`,element:(0,Z.jsx)(Hk,{})},`r23`),(0,Z.jsx)(sn,{path:`key-bindings`,element:(0,Z.jsx)(Zk,{})},`key-bindings`),(0,Z.jsx)(sn,{path:`offline`,element:(0,Z.jsx)(IA,{})},`r24`),(0,Z.jsx)(sn,{path:`about`,element:(0,Z.jsx)(zA,{})},`r25`),(0,Z.jsx)(sn,{path:`api-tokens`,element:(0,Z.jsx)(bD,{})},`r26`),(0,Z.jsx)(sn,{path:`devices`,element:(0,Z.jsx)(OD,{})},`r27`),(0,Z.jsx)(sn,{path:`embedding`,element:(0,Z.jsx)(bj,{})},`r28`),(0,Z.jsx)(sn,{path:`shared`,element:(0,Z.jsx)(xj,{})},`r29`),(0,Z.jsx)(sn,{path:`admin/users`,element:(0,Z.jsx)(Lj,{})},`r30`),(0,Z.jsx)(sn,{path:`admin/contexts`,element:(0,Z.jsx)(Dj,{})},`r31`),(0,Z.jsx)(sn,{path:`admin/workspaces`,element:(0,Z.jsx)(Ej,{})},`r32`),(0,Z.jsx)(sn,{path:`admin/agents`,element:(0,Z.jsx)(Oj,{})},`r33`),(0,Z.jsx)(sn,{path:`admin/logs`,element:(0,Z.jsx)(Mj,{})},`r34`),(0,Z.jsx)(sn,{path:`admin/roles`,element:(0,Z.jsx)(Ij,{})},`r35`),(0,Z.jsx)(sn,{path:`admin/embedding`,element:(0,Z.jsx)(Rj,{})},`r36`),(0,Z.jsx)(sn,{path:`admin/auth`,element:(0,Z.jsx)(aM,{})},`r37`)]});function oF(e){if(typeof e!=`string`||!e.startsWith(`/`)||e.startsWith(`//`)||/[\\\u0000-\u0020]/.test(e))return null;let t=new URL(e,`https://canvas.invalid`);return t.origin!==`https://canvas.invalid`||/^\/(?:login|register|pub|share-target|apps|next)(?:\/|$)/.test(t.pathname)||t.pathname===`/`||[...t.searchParams.keys()].some(e=>/token|password|secret|code/i.test(e))?null:t.pathname+t.search+t.hash}function sF(e){let t=2166136261;for(let n of e)t=Math.imul(t^n.charCodeAt(0),16777619);return`canvas:last-screen:${t>>>0}`}var cF=un(aF),lF=e=>{let t=oF(e);return t&&ct(cF,t)?t:null};function uF(){let e=vn(),[t]=(0,X.useState)(()=>{if(e.pathname!==`/`||e.search||e.hash)return null;try{let t=localStorage.getItem(`authToken`);return t?{key:e.key,path:lF(localStorage.getItem(sF(t)))||`/home`}:null}catch{return{key:e.key,path:`/home`}}}),n=t&&e.key===t.key&&e.pathname===`/`;return(0,X.useEffect)(()=>{if(n)return;let t=lF(e.pathname+e.search+e.hash);if(t)try{let e=localStorage.getItem(`authToken`);e&&localStorage.setItem(sF(e),t)}catch{}},[e.pathname,e.search,e.hash,n]),n?(0,Z.jsx)(ht,{to:t.path,replace:!0}):null}var dF={activeSection:null,m0Open:!1,m1Open:!1,m2Open:!1,m2View:null,selectedEntityId:null,user:null};function fF(e,t){switch(t.type){case`RESTORE_MENU`:return{...e,...t.menu,user:e.user};case`SET_SECTION`:return{...e,activeSection:t.section,m1Open:t.section!==null,m2Open:!1,m2View:null,selectedEntityId:null};case`TOGGLE_SECTION`:return e.activeSection===t.section&&e.m1Open?{...e,activeSection:null,m1Open:!1,m2Open:!1,m2View:null}:{...e,activeSection:t.section,m1Open:!0,m2Open:!1,m2View:null,selectedEntityId:null};case`TOGGLE_M0`:return e.m0Open?{...e,m0Open:!1,activeSection:null,m1Open:!1,m2Open:!1,m2View:null}:{...e,m0Open:!0};case`CLOSE_M0`:return{...e,m0Open:!1};case`CLOSE_M1`:return{...e,activeSection:null,m1Open:!1,m2Open:!1,m2View:null};case`OPEN_M2`:return{...e,m2Open:!0,m2View:t.view,selectedEntityId:t.entityId===void 0?e.selectedEntityId:t.entityId};case`OPEN_M2_DRAWER`:return{...e,m0Open:!0,activeSection:t.section,m1Open:!0,m2Open:!0,m2View:t.view,selectedEntityId:t.entityId};case`OPEN_M1_DRAWER`:return{...e,m0Open:!0,activeSection:t.section,m1Open:!0,m2Open:!1,m2View:null,selectedEntityId:null};case`CLOSE_M2`:return{...e,m2Open:!1,m2View:null};case`SELECT_ENTITY`:return{...e,selectedEntityId:t.entityId};case`SYNC_FROM_URL`:{let n=!t.mobile&&!e.m2Open&&e.m2View===null&&t.section===e.activeSection&&t.entityId===e.selectedEntityId;return t.section===e.activeSection&&t.entityId===e.selectedEntityId&&t.m2View===e.m2View&&!(t.mobile&&(e.m1Open||e.m0Open))?e:{...e,activeSection:t.section,m0Open:!t.mobile&&e.m0Open,m1Open:!t.mobile&&t.section!==null,selectedEntityId:t.entityId,m2Open:!n&&t.m2View!==null,m2View:n?null:t.m2View}}case`SET_USER`:return{...e,user:t.user};default:return e}}function pF({children:e}){let[t,n]=(0,X.useReducer)(fF,dF),r=vn(),i=ft(),a=(0,X.useRef)(t);(0,X.useLayoutEffect)(()=>{a.current=t},[t]),YC(t,n);let o=(0,X.useCallback)((e,t=!1,o=!1)=>{let s=fF(a.current,e);if(a.current=s,n(e),!GC())return;let{activeSection:c,m0Open:l,m1Open:u,m2Open:d,m2View:f,selectedEntityId:p}=s;i({pathname:r.pathname,search:r.search,hash:r.hash},{replace:t,state:{...r.state,canvasMenu:{activeSection:c,m0Open:l,m1Open:u,m2Open:d,m2View:f,selectedEntityId:p},canvasMenuBack:o}})},[r,i]),s=(0,X.useCallback)(e=>{if(GC()&&a.current.m1Open){let{activeSection:t,m0Open:n,m1Open:o,m2Open:s,m2View:c,selectedEntityId:l}=a.current;i(e,{replace:!0,state:{...r.state,canvasMenu:{activeSection:t,m0Open:n,m1Open:o,m2Open:s,m2View:c,selectedEntityId:l},canvasMenuBack:!1}})}i(e)},[r.state,i]),c=(0,X.useCallback)(()=>{if(window.history.state?.idx>0){i(-1);return}let e=a.current;if(e.m1Open&&e.m2Open)o({type:`CLOSE_M2`},!0,!0);else if(e.m1Open)o({type:`CLOSE_M1`},!0,!0);else if(e.m0Open)o({type:`CLOSE_M0`},!0,!0);else{let{section:e,entityId:t,m2View:n}=JC(r.pathname);if(!GC()){i(e?`/${e}`:`/`);return}o(e&&t?{type:`OPEN_M2_DRAWER`,section:e,view:n,entityId:t}:{type:`TOGGLE_M0`},!0,!0)}},[o,r.pathname,i]);(0,X.useEffect)(()=>{let e=du();if(e){n({type:`SET_USER`,user:e});return}let t=!1;return fu().then(e=>{!t&&e&&n({type:`SET_USER`,user:e})}).catch(()=>{}),()=>{t=!0}},[]);let l={state:t,dispatch:n,setSection:(0,X.useCallback)(e=>{o({type:`SET_SECTION`,section:e})},[o]),toggleSection:(0,X.useCallback)(e=>{o({type:`TOGGLE_SECTION`,section:e})},[o]),toggleM0:(0,X.useCallback)(()=>{o({type:`TOGGLE_M0`},a.current.m0Open)},[o]),closeM0:(0,X.useCallback)(()=>{o({type:`CLOSE_M0`},!0)},[o]),closeM1:(0,X.useCallback)(()=>{o({type:`CLOSE_M1`},!0)},[o]),openM2:(0,X.useCallback)((e,t)=>{o({type:`OPEN_M2`,view:e,entityId:t})},[o]),openM2Drawer:(0,X.useCallback)((e,t,n)=>{o({type:`OPEN_M2_DRAWER`,section:e,view:t,entityId:n})},[o]),openM1Drawer:(0,X.useCallback)(e=>{o({type:`OPEN_M1_DRAWER`,section:e})},[o]),closeM2:(0,X.useCallback)(()=>{GC()&&a.current.m1Open&&a.current.m2Open?c():n({type:`CLOSE_M2`})},[c]),selectEntity:(0,X.useCallback)(e=>{n({type:`SELECT_ENTITY`,entityId:e})},[]),goBack:c,navigateFromMenu:s};return(0,Z.jsx)(KC.Provider,{value:l,children:e})}function mF(){return(0,X.useSyncExternalStore)(ho,oo,()=>!1)}function hF(e,t){let n=null,r=!1,i,a;function o(){clearTimeout(i),!r&&oo()&&(i=setTimeout(()=>{s()},3e4))}function s(s=!1){if(n)return n;if(r)return Promise.resolve(!1);clearTimeout(i),a=new AbortController;let c=setTimeout(()=>a?.abort(),5e3);return n=(async()=>{try{let n=await fetch(e,{cache:`no-store`,credentials:`omit`,signal:a.signal});if(!n.ok||n.headers.get(`x-canvas-offline`)===`fallback`)throw Error(`Unavailable`);if((await n.json()).status!==`success`)throw Error(`Not a Canvas response`);if(r)return!1;let i=oo();return co(),(i||s)&&t(),!0}catch{return r||fo(),!1}finally{clearTimeout(c),n=null,o()}})(),n}let c=ho(o),l=()=>{s()};return window.addEventListener(`online`,l),o(),{retry:s,stop(){r=!0,clearTimeout(i),a?.abort(),c(),window.removeEventListener(`online`,l)}}}var gF;function _F(){gF=hF(`${yo}/ping`,()=>B.retryNow());let e=()=>{gF?.retry()},t=B.on(`connect_error`,e),n=B.on(`disconnect`,e);return()=>{t(),n(),gF?.stop(),gF=void 0}}function vF(){return gF?.retry(!0)??Promise.resolve(!1)}function yF(){let e=mF(),[t,n]=(0,X.useState)(!1);return e?(0,Z.jsxs)(`details`,{className:`relative`,children:[(0,Z.jsx)(`summary`,{"aria-label":`Offline — connection options`,title:`Offline — cached content available`,className:`flex h-10 w-10 cursor-pointer list-none items-center justify-center rounded-lg text-amber-600 hover:bg-accent/50 [&::-webkit-details-marker]:hidden`,children:(0,Z.jsx)(Hn,{className:`h-5 w-5`})}),(0,Z.jsxs)(`div`,{className:`absolute bottom-0 left-full z-50 ml-2 w-60 max-w-[calc(100vw-5rem)] rounded-lg border bg-popover p-3 text-popover-foreground shadow-lg`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,role:`status`,children:`Offline`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`You can browse cached documents. We’ll reconnect automatically when the server is available.`}),(0,Z.jsx)(`button`,{type:`button`,disabled:t,onClick:async()=>{n(!0);try{await vF()}finally{n(!1)}},className:`mt-3 rounded-md bg-secondary px-3 py-2 text-xs font-medium hover:bg-accent disabled:opacity-50`,children:t?`Checking…`:`Retry now`})]})]}):null}var bF=Rr,xF=Kn,SF=La,CF=X.forwardRef(({className:e,sideOffset:t=4,...n},r)=>(0,Z.jsx)(Va,{children:(0,Z.jsx)(_i,{ref:r,sideOffset:t,className:K(`z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in duration-fast fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]`,e),...n})}));CF.displayName=_i.displayName;var wF=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(li,{ref:n,className:K(`relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full`,e),...t}));wF.displayName=li.displayName;var TF=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Wa,{ref:n,className:K(`aspect-square h-full w-full`,e),...t}));TF.displayName=Wa.displayName;var EF=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Na,{ref:n,className:K(`flex h-full w-full items-center justify-center rounded-full bg-muted`,e),...t}));EF.displayName=Na.displayName;function DF({section:e,icon:t,label:n,disabled:r}){let{state:i,toggleSection:a}=qC(),o=i.activeSection===e;return(0,Z.jsxs)(xF,{children:[(0,Z.jsx)(SF,{asChild:!0,children:(0,Z.jsxs)(`button`,{type:`button`,disabled:r,"aria-label":n,onClick:()=>!r&&e&&a(e),className:K(`relative flex items-center justify-center w-10 h-10 rounded-lg transition-colors`,o?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`,r&&`opacity-30 cursor-not-allowed`),children:[o&&(0,Z.jsx)(`span`,{className:`absolute right-0 top-1/2 -translate-y-1/2 w-0.5 h-5 bg-foreground rounded-l`}),t]})}),(0,Z.jsx)(CF,{side:`right`,sideOffset:8,children:n})]})}function OF({path:e,icon:t,label:n,section:r=`settings`}){let i=ft(),{setSection:a}=qC();return(0,Z.jsxs)(xF,{children:[(0,Z.jsx)(SF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":n,onClick:()=>{a(r),i(e)},className:`flex items-center justify-center w-10 h-10 rounded-lg text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors`,children:t})}),(0,Z.jsx)(CF,{side:`right`,sideOffset:8,children:n})]})}function kF(){let{state:e,toggleM0:t}=qC(),n=mF();return(0,Z.jsxs)(`button`,{type:`button`,onClick:t,"aria-label":`${e.m0Open?`Close menu`:`Open menu`}${n?` — offline, connection options in menu`:``}`,"data-shell":`rail`,className:`fixed bottom-rail-inset left-2 z-nav flex h-rail w-rail items-center justify-center rounded-full bg-foreground text-background shadow-elevation-4 md:hidden`,children:[e.m0Open?(0,Z.jsx)(vr,{className:`h-5 w-5`}):(0,Z.jsx)(sa,{className:`h-5 w-5`}),n&&(0,Z.jsx)(`span`,{"aria-hidden":!0,className:`absolute right-0 top-0 h-3 w-3 rounded-full border-2 border-background bg-amber-500`})]})}function AF(){let{state:e,closeM0:t,closeM1:n}=qC(),{state:r,setView:i,closeT1:a}=ol(),o=ft(),{showToast:s}=wo(),c=e.user?.userType===`admin`,l=aw(),u=()=>{r.t1Open?a():i(`tools`),n(),t()},d=(0,X.useCallback)(async()=>{try{await J.post(`/auth/logout`),localStorage.removeItem(`authToken`),o(`/login`)}catch{s({title:`Error`,description:`Logout failed`,variant:`destructive`})}},[o,s]);return(0,Z.jsxs)(bF,{delayDuration:200,children:[e.m0Open&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-nav-scrim bg-scrim animate-fade-in md:hidden`,onClick:t,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{"data-shell":`rail`,className:K(`flex flex-col items-center w-rail h-full rounded-(--panel-radius) bg-transparent shrink-0`,e.m0Open?`max-md:fixed max-md:left-2 max-md:top-2 max-md:bottom-rail-stack max-md:z-rail max-md:h-auto max-md:bg-card max-md:surface-glass max-md:shadow-elevation-5`:`max-md:hidden`),children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-center h-12 w-full shrink-0`,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Canvas home`,onClick:()=>o(`/home`),className:`flex items-center justify-center w-10 h-10 rounded-lg hover:bg-accent/50 transition-colors`,children:(0,Z.jsx)(`img`,{src:`/images/logo-br_128x128.png`,alt:``,className:`w-6 h-6`})})}),(0,Z.jsxs)(`nav`,{className:`flex flex-col items-center gap-1 py-2 flex-1 min-h-0 overflow-y-auto`,children:[(!l.local||l.workspace!==!1)&&(0,Z.jsx)(DF,{section:`contexts`,icon:(0,Z.jsx)(vi,{className:`w-5 h-5`}),label:`Contexts`}),(!l.local||l.workspace!==!1)&&(0,Z.jsx)(DF,{section:`workspaces`,icon:(0,Z.jsx)(Ga,{className:`w-5 h-5`}),label:`Workspaces`}),(!l.local||l.agent)&&(0,Z.jsx)(DF,{section:`agents`,icon:(0,Z.jsx)(ri,{className:`w-5 h-5`}),label:`Agents`}),(0,Z.jsx)(DF,{section:`apps`,icon:(0,Z.jsx)(Hi,{className:`w-5 h-5`}),label:`Apps`}),(!l.local||l.workspace!==!1)&&(0,Z.jsx)(OF,{path:`/roles`,section:null,icon:(0,Z.jsx)(Ma,{className:`w-5 h-5`}),label:`Roles`}),c&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`w-6 h-px bg-border my-2`}),(0,Z.jsx)(OF,{path:`/admin/users`,icon:(0,Z.jsx)(ar,{className:`w-5 h-5`}),label:`All Users`}),(0,Z.jsx)(OF,{path:`/admin/logs`,icon:(0,Z.jsx)(Ki,{className:`w-5 h-5`}),label:`Server Logs`}),(0,Z.jsx)(OF,{path:`/admin/workspaces`,icon:(0,Z.jsx)($r,{className:`w-5 h-5`}),label:`All Workspaces`}),(0,Z.jsx)(OF,{path:`/admin/agents`,icon:(0,Z.jsx)(ri,{className:`w-5 h-5`}),label:`All Agents`}),(0,Z.jsx)(OF,{path:`/admin/roles`,icon:(0,Z.jsx)(Ma,{className:`w-5 h-5`}),label:`All Roles`})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-1 py-2 shrink-0`,children:[(0,Z.jsx)(`div`,{className:`w-6 h-px bg-border mb-2`}),(0,Z.jsx)(yF,{}),(0,Z.jsxs)(xF,{children:[(0,Z.jsx)(SF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,onClick:u,"aria-label":r.t1Open?`Close toolbox`:`Open toolbox`,className:K(`flex items-center justify-center w-10 h-10 rounded-lg transition-colors`,r.t1Open?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`),children:(0,Z.jsx)(Pr,{className:`w-5 h-5`})})}),(0,Z.jsx)(CF,{side:`right`,sideOffset:8,children:`Toolbox`})]}),!l.local&&(0,Z.jsx)(OF,{path:`/settings`,section:`settings`,icon:(0,Z.jsx)(Wi,{className:`w-5 h-5`}),label:`Settings`}),(0,Z.jsxs)(xF,{children:[(0,Z.jsx)(SF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":e.user?.email?`Profile: ${e.user.email}`:`Profile`,onClick:()=>o(`/home`),className:`flex items-center justify-center w-10 h-10 rounded-lg hover:bg-accent/50 transition-colors`,children:(0,Z.jsx)(wF,{className:`h-7 w-7 touch-target`,children:(0,Z.jsx)(EF,{className:`text-[10px] bg-muted`,children:e.user?.email?(e=>e.split(`@`)[0].split(`.`).map(e=>e.charAt(0).toUpperCase()).join(``).slice(0,2))(e.user.email):`U`})})})}),(0,Z.jsx)(CF,{side:`right`,sideOffset:8,children:e.user?.email?.split(`@`)[0]||`Profile`})]}),(0,Z.jsxs)(xF,{children:[(0,Z.jsx)(SF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Log out`,onClick:d,className:`flex items-center justify-center w-10 h-10 rounded-lg text-destructive hover:bg-destructive/10 transition-colors`,children:(0,Z.jsx)(wa,{className:`w-5 h-5`})})}),(0,Z.jsx)(CF,{side:`right`,sideOffset:8,children:`Logout`})]})]})]})]})}var jF=220,MF=560;function NF({width:e,onResize:t,onDragging:n}){let r=(0,X.useRef)(null),i=e=>t(Math.min(MF,Math.max(jF,e))),a=()=>{r.current=null,n?.(!1)};return(0,Z.jsx)(`div`,{role:`separator`,"aria-label":`Resize menu`,"aria-orientation":`vertical`,"aria-valuemin":jF,"aria-valuemax":MF,"aria-valuenow":e,tabIndex:0,title:`Drag to resize; use arrow keys to adjust; Home resets width`,className:`absolute inset-y-0 right-0 z-30 flex w-3 touch-none select-none cursor-col-resize items-center justify-center hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:outline-none [@media(pointer:coarse)]:w-6`,onPointerDown:t=>{t.button!==0||r.current||(t.preventDefault(),t.stopPropagation(),r.current={id:t.pointerId,x:t.clientX,width:e},t.currentTarget.setPointerCapture(t.pointerId),n?.(!0))},onPointerMove:e=>{r.current?.id===e.pointerId&&i(r.current.width+e.clientX-r.current.x)},onPointerUp:e=>{r.current?.id===e.pointerId&&(a(),e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId))},onPointerCancel:a,onLostPointerCapture:a,onDoubleClick:()=>i(280),onKeyDown:t=>{[`ArrowLeft`,`ArrowRight`,`Home`].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),i(t.key===`Home`?280:e+(t.key===`ArrowRight`?1:-1)*(t.shiftKey?64:16)))},children:(0,Z.jsx)(`span`,{"aria-hidden":!0,className:`h-10 w-1 rounded-full bg-border`})})}function PF(e,t,n,r=!0){let i=De(),a=vn(),o=(0,X.useRef)(null);(0,X.useLayoutEffect)(()=>{let s=window.history.state?.idx??0,c=o.current,l=a.state?.canvasMenuBack||!!c&&(s<c.index||s===c.index&&c.backwards);if(o.current={active:t,viewKey:n,index:s,backwards:l},!r||!i||!t||!c||c.active&&c.viewKey===n)return;let u=e.current;if(!u||window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let d=Number.parseFloat(getComputedStyle(u).getPropertyValue(`--motion-scale`)),f=Number.isFinite(d)?Math.max(0,d):1,p=u.animate([{transform:`translateX(${l?`-100%`:`100%`})`},{transform:`translateX(0)`}],{duration:70*f,easing:`cubic-bezier(0.2, 0, 0, 1)`});return()=>p.cancel()},[r,i,t,n,a.key,a.state,e])}function FF(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),a=(0,X.useRef)(!1),o=(0,X.useRef)(!1),s=(0,X.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await ml();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch contexts:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,X.useRef)(s);(0,X.useEffect)(()=>{c.current=s});let l=(0,X.useCallback)(()=>{a.current=!1,s()},[s]);return(0,X.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,X.useEffect)(()=>{if(!e)return;let t=()=>B.emit(`subscribe`,{channel:`context`}),r=()=>B.emit(`unsubscribe`,{channel:`context`}),i=B.on(`connect`,()=>{t(),s()});t();let o=e=>{let t=e;!t?.id||!t?.userId||n(e=>e.some(e=>e.id===t.id&&e.userId===t.userId)?e:[...e,t])},l=e=>{let t=e;!t?.id||!t?.userId||n(e=>e.map(e=>e.id===t.id&&e.userId===t.userId?{...e,...t}:e))},u=e=>{let t=e,r=t?.contextId??t?.id;r&&n(e=>e.filter(e=>e.id!==r))},d=e=>{let t=e;!t?.id||!t?.userId||n(e=>e.map(e=>e.id===t.id&&e.userId===t.userId?{...e,...t}:e))},f=()=>{a.current=!1,c.current()},p=[[`context:created`,o],[`context.created`,o],[`context:updated`,l],[`context.updated`,l],[`context:deleted`,u],[`context.deleted`,u],[`context:url:changed`,d],[`context.url.set`,d],[`context:url:set`,d],[`workspace:status:changed`,f],[`workspace.status.changed`,f]];return p.forEach(([e,t])=>B.on(e,t)),()=>{r(),i?.(),p.forEach(([e,t])=>B.off(e,t))}},[e,s]),(0,X.useEffect)(()=>{let e=e=>{let t=e.detail;n(e=>e.filter(e=>!il(e,t)))};return window.addEventListener(ll,e),()=>window.removeEventListener(ll,e)},[]),(0,X.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`contexts:refresh`,e),()=>window.removeEventListener(`contexts:refresh`,e)},[s]),{contexts:(0,X.useMemo)(()=>Pw(t),[t]),isLoading:r,refresh:l}}function IF(){let{state:e,selectEntity:t,openM2:n,closeM2:r}=qC(),i=De(),{contexts:a,isLoading:o}=FF(e.activeSection===`contexts`),{showToast:s}=wo(),c=ft(),[l,u]=(0,X.useState)(null),d=l&&l.base===a?l.order:a,p=e=>e.isShared===!0||e.type===`shared`,{rowProps:m,handleProps:h,draggingIndex:g,insertLineClass:_}=Lw((e,t)=>{let n=Fw(d,e,t);u({base:a,order:n}),Iw(n,(e,t)=>p(e)?Promise.resolve():xl(e.id,{order:t})).then(({failed:e})=>{window.dispatchEvent(new CustomEvent(`contexts:refresh`)),e&&s({title:`Partial reorder`,description:`${e} context(s) could not be reordered`,variant:`destructive`})})}),v=e=>{t(e.id),c(`/contexts/${e.id}`)};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Contexts`})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{r(),c(`/contexts?create=1`)},title:`Create context`,"aria-label":`Create context`,className:`flex items-center justify-center w-6 h-6 rounded-full bg-foreground text-background hover:opacity-80 transition-opacity`,children:(0,Z.jsx)(br,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:o&&a.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):a.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No contexts found`}):(0,Z.jsx)(`div`,{className:`space-y-1.5 px-2`,children:d.map((r,a)=>{let o=e.selectedEntityId===r.id,s=p(r),l=r.workspaceActive!==!1,u=Jt(r.color);return(0,Z.jsxs)(`div`,{...m(a),"data-active":o||void 0,className:K(`group relative rounded-(--card-radius) py-2.5 pl-3 pr-7 transition-all shadow-elevation-1`,l?`cursor-pointer hover:shadow `+(o?`bg-accent shadow`:`bg-card hover:bg-accent/50`):`cursor-not-allowed opacity-50 bg-card`,_(a,d.length),g===a&&`opacity-60`),onClick:()=>l&&v(r),title:l?void 0:`Workspace "${r.workspaceName}" is not active`,children:[s?(0,Z.jsx)(`div`,{className:K(`absolute inset-y-0 right-0 w-4 rounded-r-(--card-radius)`,!u&&`bg-muted`),style:u?{backgroundColor:u}:void 0}):(0,Z.jsx)(`button`,{type:`button`,...h(a),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:K(`absolute inset-y-0 right-0 flex w-4 cursor-grab items-center justify-center rounded-r-(--card-radius) active:cursor-grabbing`,!u&&`bg-muted`),style:u?{backgroundColor:u}:void 0,children:(0,Z.jsx)(Un,{className:K(`h-3.5 w-3.5`,tt(u))})}),(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(f,{icon:r.icon||`ph:stack-fill`,width:16,height:16,color:u,className:K(`mt-0.5 shrink-0`,!u&&`text-muted-foreground`)}),(0,Z.jsx)(`span`,{className:`text-sm font-medium truncate flex-1`,children:r.name||r.id}),s&&(0,Z.jsx)(`span`,{className:`rounded-full bg-info/10 px-1.5 py-0.5 text-[9px] text-info shrink-0`,children:`Shared`}),l&&(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),t(r.id),n(`detail`,r.id)},className:`reveal-on-hover shrink-0 mt-0.5`,title:`Switch context URL`,children:(0,Z.jsx)(Ri,{className:`w-3.5 h-3.5 text-muted-foreground hover:text-foreground`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),t(r.id),i?n(`settings`,r.id):c(`/contexts/${r.id}/settings/general`)},className:`reveal-on-hover shrink-0 mt-0.5`,title:`Settings`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5 text-muted-foreground hover:text-foreground`})})]}),r.name&&(0,Z.jsx)(`div`,{className:`text-[10px] text-muted-foreground/60 truncate font-mono`,children:r.id}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5`,children:r.url||`/`}),r.ownerEmail&&(0,Z.jsx)(`div`,{className:`text-[10px] text-muted-foreground truncate mt-0.5`,children:r.ownerEmail})]},`${r.userId||`u`}-${r.id}`)})})})]})}function LF({title:e,onBack:t,action:n,className:r,icon:i,accentColor:a}){let{closeM1:o}=qC(),s=Jt(a);return(0,Z.jsxs)(`div`,{className:K(`flex items-center h-12 px-2 border-b border-border shrink-0 gap-1`,r),style:{borderBottomWidth:4,...s?{borderBottomColor:s}:{}},children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:t,className:`flex items-center gap-0.5 h-8 rounded px-1 hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors flex-1 min-w-0`,title:`Back`,"aria-label":`Back to previous view`,children:[(0,Z.jsx)(Wn,{className:`w-4 h-4 shrink-0`}),i&&(0,Z.jsx)(f,{icon:i,width:16,height:16,color:s,className:K(`mr-1 shrink-0`,!s&&`text-muted-foreground`)}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold truncate`,children:e})]}),n&&(0,Z.jsx)(`div`,{className:`shrink-0`,children:n}),(0,Z.jsx)(`button`,{type:`button`,onClick:o,className:`flex h-8 w-8 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Close menu`,"aria-label":`Close menu`,children:(0,Z.jsx)(vr,{className:`w-4 h-4`})})]})}function RF(e,t,n){let r=e.indexOf(n);if(r<0)return new Set;let i=t===null?-1:e.indexOf(t);return new Set(i<0?[n]:e.slice(Math.min(i,r),Math.max(i,r)+1))}function zF(e){let t=[...e];return t.filter(e=>!t.some(t=>t!==e&&e.startsWith(`${t}/`)))}var BF=22,VF=44,HF=4;function UF(e,t){if(!t)return null;let n=String(e||``).split(`/`).filter(Boolean);return n[0]===`workspace`&&n[1]===`git`?null:n[0]===`workspace`&&n.length>=2?{address:`workspace:${n[1]}`,key:n.slice(2).join(`/`)}:n[0]===`device`&&n.length>=3?{address:n[2],key:n.slice(3).join(`/`)}:n[0]===`file`&&n.length>=2?{address:n[1],key:n.slice(2).join(`/`)}:null}function WF(e,t){return!t||Hs(e)!==null}var GF=e=>Array.from(e.dataTransfer.types).includes(`application/json`);function KF(e,t){if(!t)return null;let n=String(e||``).split(`/`).filter(Boolean);return n[0]===`workspace`&&n[1]===`git`?n[2]||null:n[0]===`workspace`&&n.length>=2?`workspace:${n[1]}`:n[0]===`device`?n.length>=3?n[2]:null:n.length>=2?n[1]:null}function qF({x:e,y:t,node:n,path:r,isBackendsTree:i,isDirectoryTree:a,backends:o,onClose:s,onShowContent:c,onOpenToSide:l,sourceLayer:u,targetLayers:d,clipboard:f,onStartInlineCreate:p,onChangeIcon:m,onNewCanvas:h,onShareCanvas:g,onRemove:_,onRename:v,onExportSubtree:y,onImportSubtree:b,onImportDocuments:x,onExportDocuments:S,onLock:C,onUnlock:w,onDestroy:T,onMerge:E,onSubtract:D,onMergeDown:O,onSubtractDown:k,onResyncBackend:A,canResyncBackend:j,onAddRule:M,onAddStoreRule:N,onStoragePolicy:P,onRenameBackendFolder:ee,onDeleteBackendFolder:F,onRestoreTrash:I,onDiscardTrash:te,onCopy:L,onCut:R,onPaste:ne,pastedDocumentIds:re,onPasteDocuments:ie,isPinned:ae,onTogglePin:z}){let oe=u&&d.size>0&&u.path===r,se=!i&&(O||k)&&r!==`/`&&n.type!==`canvas`&&r.split(`/`).filter(Boolean).length>1,B=u&&d.size>0&&(u.path===r||d.has(r)),ce=async e=>{s();try{await e()}catch(e){alert(e instanceof Error?e.message:String(e))}},V=(e,t,n,r=!1)=>(0,Z.jsxs)(`button`,{type:`button`,className:K(`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,r&&`text-destructive hover:bg-destructive/10`),onClick:()=>ce(n),children:[e,t]});return i&&n.metadata?.backendTrash?(0,Z.jsxs)(Dn,{x:e,y:t,onClose:s,className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[c&&V((0,Z.jsx)(Qr,{className:`h-3 w-3`}),`Open Trash`,async()=>c(r)),r!==`/Trash`&&I&&V((0,Z.jsx)(Vr,{className:`h-3 w-3`}),`Restore original paths`,()=>I(r)),r!==`/Trash`&&te&&V((0,Z.jsx)(Qr,{className:`h-3 w-3`}),`Empty Trash`,()=>te(r),!0)]}):(0,Z.jsxs)(Dn,{x:e,y:t,onClose:s,className:`min-w-[11rem] rounded-md border bg-popover p-1 shadow-elevation-3`,children:[c&&V((0,Z.jsx)(ja,{className:`w-3 h-3`}),`Show layer content`,async()=>{c(r,n.id||void 0)}),l&&V((0,Z.jsx)(ja,{className:`w-3 h-3`}),`Open to the side`,async()=>{l(r)}),(c||l)&&(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),n.type===`canvas`&&g&&V((0,Z.jsx)(aa,{className:`w-3 h-3`}),`Share canvas`,async()=>{await g(r)}),n.type===`canvas`&&g&&(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),A&&(j?.(r)??!!KF(r,i))&&(0,Z.jsxs)(Z.Fragment,{children:[V((0,Z.jsx)(Er,{className:`w-3 h-3`}),`Refresh backend`,async()=>{await A(r)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),i&&KF(r,i)&&(M||N)&&(0,Z.jsxs)(Z.Fragment,{children:[M&&V((0,Z.jsx)(_a,{className:`w-3 h-3`}),`Auto-Link documents to…`,async()=>{M(r)}),N&&UF(r,i)&&V((0,Z.jsx)(Fr,{className:`w-3 h-3`}),`Create storage rule…`,async()=>{N(r)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),!i&&(N||P)&&r!==`/`&&(0,Z.jsxs)(Z.Fragment,{children:[N&&V((0,Z.jsx)(Fr,{className:`w-3 h-3`}),`Create rule…`,async()=>{N(r)}),N&&V((0,Z.jsx)(zi,{className:`w-3 h-3`}),`Create download rule…`,async()=>{N(r,`download`)}),P&&n.type!==`canvas`&&V((0,Z.jsx)(gr,{className:`w-3 h-3`}),`Storage policy…`,async()=>{P(r)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),(!i||UF(r,i))&&(0,Z.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,onClick:()=>{p(r),s()},children:[(0,Z.jsx)(br,{className:`w-3 h-3`}),`New folder here`]}),ee&&UF(r,i)?.key&&V((0,Z.jsx)(Za,{className:`w-3 h-3`}),`Rename folder`,async()=>{let e=r.split(`/`).pop()||``,t=prompt(`New folder name:`,e);!t||t===e||await ee(r,t)}),F&&i&&Dc(r,o)&&V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Delete from backend`,async()=>{confirm(`Delete folder "${r.split(`/`).pop()}" and its contents from the backend?`)&&await F(r)},!0),h&&!i&&(0,Z.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,onClick:()=>{h(r),s()},children:[(0,Z.jsx)(Pa,{className:`w-3 h-3 text-primary`}),`New canvas here…`]}),r!==`/`&&z&&V(ae?(0,Z.jsx)(ur,{className:`w-3 h-3`}):(0,Z.jsx)(tr,{className:`w-3 h-3`}),ae?`Unpin`:`Pin`,async()=>{await z()}),r!==`/`&&m&&(0,Z.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,onClick:()=>{m(),s()},children:[(0,Z.jsx)(Wr,{className:`w-3 h-3`}),`Change icon`]}),r!==`/`&&!n.locked&&v&&!i&&V((0,Z.jsx)(Za,{className:`w-3 h-3`}),`Rename`,async()=>{let e=r.split(`/`).pop()||``,t=prompt(`New name:`,e);!t||t===e||await v(r,t)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),V((0,Z.jsx)(Jn,{className:`w-3 h-3`}),`Copy`,async()=>L(r)),!i&&V((0,Z.jsx)(Ua,{className:`w-3 h-3`}),`Cut`,async()=>R(r)),f&&!i&&V((0,Z.jsx)(Tr,{className:`w-3 h-3`}),`Paste (${f.mode})`,async()=>ne(r)),re&&re.length>0&&ie&&WF(r,i)&&V((0,Z.jsx)(Tr,{className:`w-3 h-3`}),i?`Move ${re.length} message(s) here`:`Paste ${re.length} document(s)`,async()=>{await ie(r,re)}),x&&V((0,Z.jsx)(rr,{className:`w-3 h-3`}),`Import documents…`,()=>x(r)),S&&V((0,Z.jsx)(zi,{className:`w-3 h-3`}),`Export documents…`,()=>S(r)),(y||b)&&(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),y&&n.type!==`canvas`&&V((0,Z.jsx)(zi,{className:`w-3 h-3`}),`Export subtree…`,()=>y(r)),b&&!i&&n.type!==`canvas`&&V((0,Z.jsx)(rr,{className:`w-3 h-3`}),`Import subtree here…`,()=>b(r)),!i&&r!==`/`&&!n.locked&&_&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Remove`,async()=>{confirm(`Remove "${r}"${a?` and all children`:``}?`)&&await _(r,a)},!0),!a&&V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Remove recursive`,async()=>{confirm(`Remove "${r}" and all children?`)&&await _(r,!0)},!0)]}),!i&&(C||w||T)&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),n.locked?w&&V((0,Z.jsx)(ea,{className:`w-3 h-3`}),`Unlock layer`,async()=>{await w(n.id)}):C&&V((0,Z.jsx)(Si,{className:`w-3 h-3`}),`Lock layer`,async()=>{await C(n.id)}),n.locked&&n.lockedBy&&n.lockedBy.length>0&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`px-3 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground`,children:`Locked by`}),n.lockedBy.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3 py-1 text-xs`,children:[(0,Z.jsx)(`span`,{className:`truncate`,title:e,children:e}),w&&(0,Z.jsx)(`button`,{type:`button`,title:`Remove lock held by ${e}`,className:`shrink-0 text-muted-foreground hover:text-destructive`,onClick:()=>ce(async()=>{await w(n.id,e)}),children:(0,Z.jsx)(ea,{className:`w-3 h-3`})})]},e))]}),r!==`/`&&!n.locked&&T&&V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Destroy layer`,async()=>{confirm(`Permanently destroy layer "${n.label||n.name}" and its bitmap?`)&&await T(n.id)},!0)]}),se&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),O&&V((0,Z.jsx)(fa,{className:`w-3 h-3`}),`Merge down (into ancestors)`,async()=>{confirm(`Merge "${n.label||n.name}" into every layer above it on\n${r}\n\nAfter this, ${r} lists its documents.`)&&await O(r)}),k&&V((0,Z.jsx)(Ca,{className:`w-3 h-3`}),`Subtract from ancestors`,async()=>{confirm(`Remove "${n.label||n.name}"'s documents from every layer above it on\n${r}\n\nUndo of "Merge down". Documents an ancestor holds for other reasons are removed from it too.`)&&await k(r)})]}),oe&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),E&&V((0,Z.jsx)(vi,{className:`w-3 h-3`}),`Merge this layer into ${d.size} selected`,async()=>{confirm(`Merge "${r}" (source) INTO:\n${Array.from(d.keys()).join(`
|
|
52
|
+
`)})]})]})}function KP({device:e,linked:t,busy:n,onLink:r,onUnlink:i,onUpdate:a}){let[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(e.name),[u,d]=(0,X.useState)(e.description??``),f=()=>{c.trim()&&(c!==e.name||u!==(e.description??``))&&a({name:c.trim(),description:u.trim()||void 0}),s(!1)},p=()=>{l(e.name),d(e.description??``),s(!1)};return(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-3 min-w-0`,children:[(0,Z.jsx)(mr,{className:`h-4 w-4 text-muted-foreground mt-0.5 shrink-0`}),(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[o?(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(q,{value:c,onChange:e=>l(e.target.value),className:`h-7 text-sm`,placeholder:`Device name`,autoFocus:!0,onKeyDown:e=>{e.key===`Enter`&&f(),e.key===`Escape`&&p()}}),(0,Z.jsx)(q,{value:u,onChange:e=>d(e.target.value),className:`h-7 text-xs`,placeholder:`Description (optional)`,onKeyDown:e=>{e.key===`Enter`&&f(),e.key===`Escape`&&p()}})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),e.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground mt-0.5`,children:e.description})]}),(0,Z.jsxs)(`div`,{className:`mt-1.5 flex flex-wrap gap-x-3 gap-y-0.5 text-[11px] text-muted-foreground font-mono`,children:[(0,Z.jsx)(`span`,{children:e.deviceId}),e.platform&&(0,Z.jsx)(`span`,{children:e.platform}),e.arch&&(0,Z.jsx)(`span`,{children:e.arch}),e.type&&(0,Z.jsx)(`span`,{children:e.type})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[o?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:f,disabled:!c.trim(),children:(0,Z.jsx)(sr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:p,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]}):(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>s(!0),title:`Edit name/description`,children:(0,Z.jsx)(Lr,{className:`h-3.5 w-3.5`})}),t?(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:n,onClick:i,className:`text-destructive hover:text-destructive`,title:`Remove from workspace`,children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})}):(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:n,onClick:r,title:`Link to workspace`,children:(0,Z.jsx)(Ri,{className:`h-3.5 w-3.5`})}),t&&(0,Z.jsx)(`span`,{className:`rounded-full bg-primary/10 px-2 py-0.5 text-[11px] font-medium text-primary`,children:`linked`})]})]})})}function qP({allDevices:e,linkedDevices:t,isLoading:n,deviceBusy:r,onRefresh:i,onLink:a,onUnlink:o,onUpdate:s}){let c=new Set(t.map(e=>e.deviceId));return n?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading devices…`]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[c.size,` of `,e.length,` registered device`,e.length===1?``:`s`,` linked to this workspace.`]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:i,disabled:n,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),e.length===0?(0,Z.jsxs)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:[`No devices registered. Devices register themselves on first connection via `,(0,Z.jsx)(`span`,{className:`font-mono`,children:`POST /auth/devices/register`}),`.`]}):(0,Z.jsx)(`div`,{className:`space-y-2`,children:e.map(e=>(0,Z.jsx)(KP,{device:e,linked:c.has(e.deviceId),busy:r===e.deviceId,onLink:()=>a(e.deviceId),onUnlink:()=>o(e.deviceId),onUpdate:t=>s(e.deviceId,t)},e.deviceId))})]})}function JP({label:e,value:t,mono:n=!1}){return(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-4 py-2 border-b last:border-0`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:e}),(0,Z.jsx)(`span`,{className:`text-xs text-right ${n?`font-mono`:``}`,children:t??`—`})]})}function YP({workspaceName:e,current:t,weights:n,floorMode:r,relativeMargin:i,onDone:a}){let[o,s]=(0,X.useState)(t==null?``:String(t)),[c,l]=(0,X.useState)(r??`relative`),[u,d]=(0,X.useState)(i==null?`0.035`:String(i)),[f,p]=(0,X.useState)(n?.fts==null?`2`:String(n.fts)),[m,h]=(0,X.useState)(n?.dense==null?`1`:String(n.dense)),[g,_]=(0,X.useState)(n?.image==null?`2`:String(n.image)),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(null),[S,C]=(0,X.useState)(cE);return(0,Z.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`How photo relevance is decided`}),(0,Z.jsxs)(`select`,{value:c,onChange:e=>l(e.target.value),className:`h-8 rounded-md border border-input bg-transparent px-2 text-xs`,children:[(0,Z.jsx)(`option`,{value:`relative`,children:`Relative to the best match (recommended)`}),(0,Z.jsx)(`option`,{value:`absolute`,children:`Absolute distance cutoff`})]}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Photo-vs-text distances shift with every query and every model, so one fixed cutoff travels badly: a value tuned for one model keeps everything (or nothing) on the next. Relative anchors on the best match for THIS query and survives a re-embed.`})]}),c===`relative`&&(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`Window width (distance from the best match)`}),(0,Z.jsx)(q,{value:u,onChange:e=>d(e.target.value),placeholder:`0.035`,className:`h-8 w-28 font-mono text-xs`,inputMode:`decimal`}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Wider keeps photos that match your query only partly, which is what a photo matching TWO things (a snowy window) looks like, since it sits further from each one than a pure example does. Too wide and everything gets in.`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:c===`relative`?`Hard ceiling (cosine distance, 0–2; blank = off)`:`Image relevance floor (cosine distance, 0–2; blank = off)`}),(0,Z.jsx)(q,{value:o,onChange:e=>s(e.target.value),placeholder:`0.95`,className:`h-8 w-28 font-mono text-xs`,inputMode:`decimal`}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:c===`relative`?`Nothing beyond this counts as a match however close it is to the best one. This is what lets a search of something you have no photos of come back empty. Without it, a relative window always returns its nearest photo.`:`Lower = stricter (fewer, more-relevant photos); raise if relevant photos are missing.`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{className:`text-xs text-muted-foreground`,children:`Hybrid fusion weights (0 disables a signal)`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap items-end gap-x-3 gap-y-2`,children:[[`lexical`,f,p],[`text semantic`,m,h],[`image`,g,_]].map(([e,t,n])=>(0,Z.jsxs)(`div`,{className:`space-y-1`,children:[(0,Z.jsx)(`span`,{className:`block text-[11px] text-muted-foreground`,children:e}),(0,Z.jsx)(q,{value:t,onChange:e=>n(e.target.value),className:`h-8 w-16 font-mono text-xs`,inputMode:`decimal`})]},e))}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Ranking mix: lexical (filenames/content) · text semantics · photo matches. Equal lexical/image ranks a matching photo like a matching document.`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:async()=>{y(!0),x(null);try{let t=o.trim(),n=t===``?null:Number(t);if(n!==null&&!Number.isFinite(n)){x(`Enter a number (e.g. 0.95) or leave empty`);return}let r={fts:Number(f),dense:Number(m),image:Number(g)};if(Object.values(r).some(e=>!Number.isFinite(e)||e<0)){x(`Weights must be numbers ≥ 0`);return}let i=Number(u.trim());if(c===`relative`&&(!Number.isFinite(i)||i<=0)){x(`Window width must be a positive number (e.g. 0.035)`);return}await Vs(e,{imageMaxDistance:n,imageFloorMode:c,...c===`relative`?{imageRelativeMargin:i}:{},searchWeights:r}),x(`Saved`),a()}catch(e){x(e instanceof Error?e.message:`Failed to save`)}finally{y(!1)}},disabled:v,children:v?`Saving…`:`Save`}),b&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:b})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5 border-t border-border pt-3`,children:[(0,Z.jsxs)(`label`,{className:`flex items-center gap-2 text-xs`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:S,onChange:e=>{lE(e.target.checked),C(e.target.checked)}}),(0,Z.jsx)(`span`,{children:`Debug query`})]}),(0,Z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Attaches the raw (unfloored) image distances to each search and shows them above the document list: the numbers this floor should be picked from. Local to this browser; costs a little extra work per query, so leave it off day to day.`})]})]})}function XP({stats:e,isLoading:t,onRefresh:n,workspaceName:r}){return t?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 animate-spin`}),`Loading stats…`]}):(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Live snapshot from synapsd. Click refresh for updated counts.`}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:n,disabled:t,children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),(0,Z.jsx)(eF,{workspaceName:r,vectorSpaces:Object.keys(e?.semantic?.vectorSpaces||{}),onDone:n}),e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Z.jsx)(Fa,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Core Index`})]}),(0,Z.jsx)(JP,{label:`Backend`,value:e.dbBackend,mono:!0}),(0,Z.jsx)(JP,{label:`Status`,value:e.status}),(0,Z.jsx)(JP,{label:`Path`,value:e.dbPath,mono:!0}),(0,Z.jsx)(JP,{label:`Documents`,value:e.documentCount?.toLocaleString()}),(0,Z.jsx)(JP,{label:`Metadata entries`,value:e.metadataCount?.toLocaleString()}),(0,Z.jsx)(JP,{label:`Checksum index`,value:e.checksumIndexSize?.toLocaleString()}),(0,Z.jsx)(JP,{label:`Bitmap store`,value:e.bitmapStoreSize?.toLocaleString()}),(0,Z.jsx)(JP,{label:`Bitmap cache`,value:e.bitmapCacheSize?.toLocaleString()}),(0,Z.jsx)(JP,{label:`Deleted (pending GC)`,value:e.deletedDocumentsCount?.toLocaleString()})]}),e.fts&&(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Z.jsx)(ui,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Full-Text Search (LanceDB)`})]}),`ready`in e.fts&&(0,Z.jsx)(JP,{label:`Ready`,value:String(e.fts.ready)}),e.fts.rowCount!==void 0&&(0,Z.jsx)(JP,{label:`Row count`,value:e.fts.rowCount?.toLocaleString()}),e.fts.error&&(0,Z.jsx)(JP,{label:`Error`,value:(0,Z.jsx)(`span`,{className:`text-destructive`,children:e.fts.error})})]}),e.semantic&&(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3 flex items-center gap-2`,children:[(0,Z.jsx)(ui,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Semantic / Vector Search`})]}),(0,Z.jsx)(JP,{label:`Enabled`,value:String(e.semantic.enabled)}),e.semantic.enabled&&(0,Z.jsxs)(Z.Fragment,{children:[e.inferd?.routing?Object.entries(e.inferd.routing).map(([e,t])=>(0,Z.jsx)(JP,{label:`Embeds → ${e}`,value:(0,Z.jsx)(`span`,{className:`font-mono text-[11px]`,children:t.join(`, `)})},`route-${e}`)):(0,Z.jsx)(JP,{label:`Text-embeddable (gap default)`,value:e.semantic.embeddableSchemas?.join(`, `)}),e.semantic.vectorSpaces&&Object.entries(e.semantic.vectorSpaces).map(([e,t])=>(0,Z.jsx)(JP,{label:`Space: ${e} (${t.dim??`?`}-d)`,value:t.error?(0,Z.jsx)(`span`,{className:`text-destructive`,children:t.error}):`${(t.embeddedDocs??0).toLocaleString()} docs · ${(t.chunkRows??0).toLocaleString()} vectors`},e)),(0,Z.jsx)(JP,{label:`Photo relevance`,value:e.semantic.imageFloorMode===`absolute`?`absolute cutoff`:`relative ±${e.semantic.imageRelativeMargin??.035}`,mono:!0}),(0,Z.jsx)(JP,{label:e.semantic.imageFloorMode===`absolute`?`Image relevance floor`:`Hard ceiling`,value:e.semantic.imageMaxDistance==null?`off`:e.semantic.imageMaxDistance,mono:!0}),(0,Z.jsx)(JP,{label:`Fusion weights (lexical · text · image)`,value:`${e.semantic.searchWeights?.fts??2} · ${e.semantic.searchWeights?.dense??1} · ${e.semantic.searchWeights?.image??2}`,mono:!0}),(0,Z.jsx)(YP,{workspaceName:r,current:e.semantic.imageMaxDistance,weights:e.semantic.searchWeights,floorMode:e.semantic.imageFloorMode,relativeMargin:e.semantic.imageRelativeMargin,onDone:n})]})]})]}):(0,Z.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`No stats available.`})]})}function ZP(){let{workspaceName:e}=yt();return(0,Z.jsx)(QP,{},e)}function QP(){let{workspaceName:e,tab:t}=yt(),[n,r]=$t(),i=n.get(`section`),a=[`pending`,`rules`,`hooks`,`scripts`,`runs`].find(e=>e===i),o=n.get(`handler`)||void 0,s=n.get(`run`)||void 0,c=n.get(`addRuleKind`),l=n.get(`addRulePath`),u=n.get(`addRuleTarget`),d=n.get(`addRuleStoreTo`),p=n.get(`addRuleStoreFolder`),m=(0,X.useMemo)(()=>c===`store`||c===`download`?!l&&!d&&!p?null:{kind:c,path:l||``,storeTo:d||``,storeFolder:p||``}:l?{kind:`mirror`,path:l,target:u||`dir:/`}:null,[c,l,u,d,p]),h=(0,X.useCallback)(()=>{r(e=>{for(let t of[`addRuleKind`,`addRulePath`,`addRuleTarget`,`addRuleStoreTo`,`addRuleStoreFolder`])e.delete(t);return e},{replace:!0})},[r]),g=ft(),{showToast:_,showProgress:v}=wo(),y=De(),{goBack:b}=qC(),x=jD(t);(0,X.useEffect)(()=>{t!==x&&g(`/workspaces/${e}/settings/${x}`,{replace:!0})},[t,x,e,g]);let[S,C]=(0,X.useState)(null),w=se(S),[T,E]=(0,X.useState)(0),[D,O]=(0,X.useState)(!0),[k,A]=(0,X.useState)(!1),[j,M]=(0,X.useState)(!1),[N,P]=(0,X.useState)(``),[ee,F]=(0,X.useState)(``),[I,te]=(0,X.useState)(`#FFFFFF`),[L,R]=(0,X.useState)(null),[ne,re]=(0,X.useState)(null),[ie,ae]=(0,X.useState)([]),[z,oe]=(0,X.useState)(null),[B,ce]=(0,X.useState)([]),[V,le]=(0,X.useState)(null),[ue,de]=(0,X.useState)(null),[fe,pe]=(0,X.useState)(!1),[me,he]=(0,X.useState)([]),[ge,_e]=(0,X.useState)([]),[ve,ye]=(0,X.useState)(!1),[be,xe]=(0,X.useState)(null),H=e||S?.id||``,Se=(0,X.useRef)(H);(0,X.useEffect)(()=>{Se.current=H});let Ce=(0,X.useCallback)(async e=>{let t=e??Se.current;if(t)try{let e=await Mo(t);ae(e.publicCanvasShares)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load shares`,variant:`destructive`})}},[_]),U=(0,X.useCallback)(async e=>{let t=e??Se.current;if(t){pe(!0);try{let e=await Ec(t);de(e)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load DB stats`,variant:`destructive`})}finally{pe(!1)}}},[_]),W=(0,X.useCallback)(async e=>{let t=e??Se.current;if(t){ye(!0);try{let[e,n]=await Promise.all([xD(),wD(t)]);he(e),_e(n)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to load devices`,variant:`destructive`})}finally{ye(!1)}}},[_]),we=async e=>{xe(e);try{let t=me.find(t=>t.deviceId===e);if(!t)throw Error(`Device not found in your account`);await TD(H,t),await W(),_({title:`Linked`,description:`Device linked to workspace`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to link device`,variant:`destructive`})}finally{xe(null)}},Te=async e=>{xe(e);try{await ED(H,e),_e(t=>t.filter(t=>t.deviceId!==e)),_({title:`Unlinked`,description:`Device removed from workspace`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to unlink device`,variant:`destructive`})}finally{xe(null)}},Ee=async(e,t)=>{xe(`edit:${e}`);try{let n=await SD(e,t);he(t=>t.map(t=>t.deviceId===e?{...t,...n}:t)),_({title:`Saved`,description:`Device updated`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update device`,variant:`destructive`})}finally{xe(null)}},Oe=(0,X.useCallback)(async e=>{let t=e??Se.current;if(!t)return;let[n,r]=await Promise.all([wc(t).catch(()=>null),Rc(t).catch(()=>[])]);oe(n),ce(r.filter(e=>e.kind===`storage`))},[]),ke=B.some(e=>e.resyncing);(0,X.useEffect)(()=>{if(!w||!ke||!H)return;let e=setInterval(()=>{Oe()},4e3);return()=>clearInterval(e)},[w,ke,H,Oe]),(0,X.useEffect)(()=>{let t=!1;async function n(){try{let n=await Uo();if(t)return;let r=n.find(t=>t.id===e)??n.find(t=>t.name===e);if(C(r??null),r){if(!se(r))return;P(r.label||``),F(r.description||``),te(r.color||`#FFFFFF`),R(r.icon??null),r.status===`active`&&await Promise.all([Ce(e||r.id),Oe(e||r.id)])}}catch{t||_({title:`Error`,description:`Failed to load workspace`,variant:`destructive`})}finally{t||O(!1)}}return n(),()=>{t=!0}},[e,Ce,Oe,_,T]),(0,X.useEffect)(()=>{let e=()=>E(e=>e+1);return window.addEventListener(`workspaces:refresh`,e),()=>window.removeEventListener(`workspaces:refresh`,e)},[]);let Ae=(0,X.useRef)(!1),je=(0,X.useRef)(!1);(0,X.useEffect)(()=>{Ae.current=!!ue||fe,je.current=ve||me.length>0}),(0,X.useEffect)(()=>{w&&(S?.status===`active`&&x===`db`&&H&&!Ae.current&&U(),S?.status===`active`&&x===`devices`&&H&&!je.current&&W())},[w,x,H,S?.status,U,W]);let Me=async e=>{if(e.preventDefault(),S){A(!0);try{await Pc(H,{label:N.trim(),description:ee.trim(),color:I,icon:L}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),_({title:`Saved`,description:`Workspace settings updated`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{A(!1)}}},Ne=async()=>{if(S&&window.prompt(`Destroy workspace "${S.label||S.name}" and all its documents? This cannot be undone. Type the workspace name "${S.name}" to confirm:`)===S.name){M(!0);try{await fs(H),window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),_({title:`Destroyed`,description:`${S.label||S.name} has been removed`}),g(`/workspaces`)}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Destroy failed`,variant:`destructive`})}finally{M(!1)}}},Pe=()=>{for(let t of[e,S?.name,S?.id])t&&Ms(t,`backends`);window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:H}}))},Fe=async e=>{if(e.config?.supported!==!1){le(`backend:${e.address}`);try{await Fo(H,e.driver,e.address,{enabled:!e.enabled}),await Oe(),Pe(),_({title:`Saved`,description:`${e.address} ${e.enabled?`disabled`:`enabled`}`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update backend`,variant:`destructive`})}finally{le(null)}}},Ie=async(e,t,n)=>{le(`${n}:${e.address}`);try{await Fo(H,e.driver,e.address,t),await Oe()}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to update backend`,variant:`destructive`})}finally{le(null)}},Le=async e=>{let t=typeof e.config?.label==`string`&&e.config.label||e.address;if(window.confirm(`Remove backend "${t}"? No files are deleted; indexed entries remain until purged from the backends tree.`)){le(`remove:${e.address}`);try{await Xo(H,e.driver,e.address),await Oe(),Pe(),_({title:`Removed`,description:`${t} unmounted`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to remove backend`,variant:`destructive`})}finally{le(null)}}},Re=async e=>{le(`resync:${e.address}`);try{await et(v,H,e.driver,e.address,e=>{ce(t=>t.map(t=>t.driver===e.driver&&t.address===e.address?e:t))}),await Oe()}catch{}finally{le(null)}},ze=async e=>{le(`test:${e.address}`);try{await jc(H,e.driver,e.address),_({title:`Connected`,description:`${e.address}: credentials and root folder verified`})}catch(e){_({title:`Connection failed`,description:e instanceof Error?e.message:`Test failed`,variant:`destructive`})}finally{le(null)}},Be=async e=>{le(`stopsync:${e.address}`);try{await mc(H,e.driver,e.address),await Oe(),_({title:`Sync stopped`,description:`${e.address}: indexed files are kept; Re-sync resumes where it left off`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to stop sync`,variant:`destructive`})}finally{le(null)}},Ve=async(e,t)=>{le(`service:${e}`);try{t?await $s(H,e):await ps(H,e),await Oe(),_({title:t?`Disabled`:`Enabled`,description:`${e} ${t?`disabled`:`enabled`}`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to toggle service`,variant:`destructive`})}finally{le(null)}},He=async e=>{let t=`${window.location.origin}${e.url}`;await navigator.clipboard?.writeText(t),_({title:`Copied`,description:t})},Ue=async e=>{if(S&&window.confirm(`Revoke public share for "${e.path}"?`)){le(`share:${e.code}`);try{await Cc(H,e.code),await Ce(H),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`,{detail:{workspaceName:H}})),_({title:`Revoked`,description:`Public canvas link no longer works`})}catch(e){_({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke share`,variant:`destructive`})}finally{le(null)}}},We=kD.find(e=>e.id===x);return D?(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`}):S?w?(0,Z.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-5xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6 border-b pb-4`,title:`${We.label} - ${S.label||S.name}`,description:`This workspace · ${We.description}`,backTo:`/workspaces/${e}`,onBack:y?b:void 0}),S.status!==`active`&&x!==`general`&&x!==`backups`&&(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Start this workspace to access these settings. General settings and protection remain available while stopped.`}),x===`backups`&&(0,Z.jsx)(UM,{workspaceId:H,onRestored:()=>E(e=>e+1)}),x===`general`&&(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`form`,{onSubmit:Me,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ws-id`,className:`text-sm font-medium`,children:`Workspace ID`}),(0,Z.jsx)(q,{id:`ws-id`,value:S.id,readOnly:!0,className:`font-mono text-sm`,onFocus:e=>e.currentTarget.select()})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ws-label`,className:`text-sm font-medium`,children:`Label`}),(0,Z.jsx)(q,{id:`ws-label`,value:N,onChange:e=>P(e.target.value),placeholder:`Workspace Label`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ws-description`,className:`text-sm font-medium`,children:`Description`}),(0,Z.jsx)(q,{id:`ws-description`,value:ee,onChange:e=>F(e.target.value),placeholder:`Description (optional)`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:`Icon & color`}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`button`,{type:`button`,title:`Pick icon & color`,onClick:e=>re({x:Math.min(e.clientX,window.innerWidth-290),y:Math.min(e.clientY,window.innerHeight-360)}),className:`flex h-10 w-10 items-center justify-center rounded-md border hover:bg-accent`,children:(0,Z.jsx)(f,{icon:L||`ph:stack-fill`,width:22,height:22,color:Jt(I)})}),(0,Z.jsx)(q,{id:`ws-color`,type:`color`,value:I,onChange:e=>te(e.target.value),className:`h-10 w-16 p-1`}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>te(on()),children:`Randomize`})]})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:k||!N.trim(),children:k?`Saving...`:`Save Changes`})]}),ne&&(0,Z.jsx)(dw,{x:ne.x,y:ne.y,current:{icon:L??void 0,color:I},onChange:e=>{`icon`in e&&R(e.icon??null),`color`in e&&e.color&&te(e.color)},onClose:()=>re(null)}),(0,Z.jsx)(tN,{currentMode:S.protection?.mode,workspaceId:H,isActive:S.status===`active`,onChanged:()=>E(e=>e+1)}),S.status===`active`&&(0,Z.jsx)($P,{workspaceName:e}),S.status===`active`&&(0,Z.jsx)(WP,{workspaceId:H}),(0,Z.jsx)(IP,{workspaceId:H,workspaceName:S.label||S.name,isActive:S.status===`active`,onChanged:()=>E(e=>e+1)}),(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Z.jsxs)(Y,{variant:`destructive`,disabled:j,onClick:Ne,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-4 w-4`}),j?`Destroying...`:`Destroy Workspace`]})]})]}),S.status===`active`&&x===`shares`&&(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Members`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Share this workspace with teammates by e-mail or with a whole directory group. It shows up in their workspace list on this server.`})]}),(0,Z.jsx)(FP,{workspaceId:H})]}),(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Public Canvas Shares`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Active public canvas links for this workspace.`})]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>Ce(),children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5`}),`Refresh`]})]}),ie.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border p-4 text-sm text-muted-foreground`,children:`No public canvas shares. Good.`}):ie.map(e=>{let t=`${window.location.origin}${e.url}`;return(0,Z.jsxs)(`div`,{className:`rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between sm:gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate font-mono text-sm`,children:e.path}),(0,Z.jsxs)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:[e.treeName,` / `,e.treeType,` - created `,new Date(e.createdAt).toLocaleString()]}),e.lockedBy?.length>0&&(0,Z.jsxs)(`div`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`locks: `,e.lockedBy.join(`, `)]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 gap-2`,children:[(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>He(e),children:(0,Z.jsx)(Jn,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>window.open(t,`_blank`,`noreferrer`),children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`share:${e.code}`,onClick:()=>Ue(e),className:`text-destructive hover:text-destructive`,children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})})]})]}),(0,Z.jsx)(`div`,{className:`mt-2 truncate rounded bg-muted/40 px-2 py-1 font-mono text-xs text-muted-foreground`,children:t})]},e.code)})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-3`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Workspace ACL Tokens`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Generate token-based workspace access for devices, scripts, and other users.`})]}),(0,Z.jsx)(jP,{workspaceId:H})]})]}),S.status===`active`&&x===`data`&&(0,Z.jsxs)(`div`,{className:`space-y-3`,children:[B.map(e=>{let t=e.config||{},n=e.address,r=t.device||null,i=e.driver===`gdrive`,a=e.driver===`s3`,o=(e.driver===`file`||i||a)&&t.managed!==!0&&!LP[n],s=LP[n]||{title:typeof t.label==`string`&&t.label||n,description:a?`S3 bucket ${t.bucket||``}${t.prefix?`/${t.prefix}`:``}${t.endpoint?` at ${t.endpoint}`:``}. Filing copies only.`:i?`Google Drive${typeof t.account==`string`&&t.account&&t.account!==t.label?` (${t.account})`:``}, folder ${typeof t.folderId==`string`&&t.folderId?t.folderId:`root`}${e.treePath?`, mirrored at ${e.treePath}`:``}.`:o?`Local folder${r?.name?` on ${r.name}`:``}, indexed in place${e.treePath?` and mirrored at ${e.treePath}`:``}.`:`Workspace data backend.`},c=t.supported!==!1,l=n===`workspace:data`,u=c&&!l,d=u&&t.managed!==!0,p=vt(e);return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(f,{icon:p.icon,width:16,height:16,color:p.color,className:`shrink-0`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:s.title}),!c&&(0,Z.jsx)(`span`,{className:`rounded bg-muted px-2 py-0.5 text-[11px] text-muted-foreground`,children:`unsupported`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:s.description}),typeof t.root==`string`&&t.root&&(0,Z.jsx)(`p`,{className:`mt-2 truncate font-mono text-xs text-muted-foreground`,children:t.root}),(0,Z.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsxs)(`span`,{children:[`status: `,e.status]}),e.resyncing&&(0,Z.jsxs)(`span`,{className:`flex items-center gap-1 rounded bg-primary/10 px-1.5 py-0.5 font-medium text-primary`,children:[(0,Z.jsx)(Er,{className:`h-3 w-3 animate-spin`}),`indexing`,e.progress?` ${e.progress.scanned}${e.progress.total==null?``:` / ${e.progress.total}`}`:``]}),r?.name&&(0,Z.jsxs)(`span`,{title:r.id,children:[`device: `,r.name]}),t.readOnly===!0&&(0,Z.jsx)(`span`,{className:`rounded bg-warning/15 px-1.5 py-0.5 font-medium text-warning`,children:`read-only`}),e.lastSyncAt&&(0,Z.jsxs)(`span`,{children:[`last scan: `,new Date(e.lastSyncAt).toLocaleString()]})]}),e.lastError&&(0,Z.jsx)(`p`,{className:`mt-2 text-xs text-destructive`,children:e.lastError}),t.readOnly===!0&&(0,Z.jsx)(`p`,{className:`mt-1 text-[11px] text-warning`,children:`Read-only: the web UI / REST API never deletes bytes on this backend. Destroy degrades to a reference drop. Recommended when the folder is exported elsewhere (e.g. via Samba).`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 border-t pt-3`,children:[e.capabilities?.sync&&c&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,title:`Scan this backend in the background whenever the workspace starts. Manual scans remain available when off.`,children:[`Scan on start`,(0,Z.jsx)(zP,{checked:t.scanOnStart===!0,disabled:V===`startup:${n}`,onClick:()=>Ie(e,{scanOnStart:t.scanOnStart!==!0},`startup`)})]}),(e.driver===`file`||i||a)&&u&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,title:i?`Poll the Drive changes feed so edits made in Drive show up without a manual re-sync.`:void 0,children:[`Watch for changes`,(0,Z.jsx)(zP,{checked:!!t.watch,disabled:!e.enabled||V===`watch:${n}`,onClick:()=>Ie(e,{watch:!t.watch},`watch`)})]}),d&&(0,Z.jsxs)(`label`,{className:`flex items-center gap-1.5 text-[11px] text-muted-foreground`,title:`Read-only: Destroy never deletes bytes on this backend (references are dropped instead). Important when the folder is exported via Samba or shared otherwise.`,children:[`read-only`,(0,Z.jsx)(zP,{checked:t.readOnly===!0,disabled:V===`readonly:${n}`,onClick:()=>Ie(e,{readOnly:t.readOnly!==!0},`readonly`)})]}),(e.driver===`file`||e.driver===`cacache`)&&c&&(0,Z.jsx)(HP,{workspaceId:H,backend:e}),e.capabilities?.test&&(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`test:${n}`,onClick:()=>ze(e),title:`Verify credentials and root folder`,children:[(0,Z.jsx)(ui,{className:`mr-2 h-3.5 w-3.5`}),V===`test:${n}`?`Testing…`:`Test`]}),e.capabilities?.sync&&(e.resyncing?(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`stopsync:${n}`,onClick:()=>Be(e),title:`Stop the running scan. Files indexed so far are kept; Re-sync later resumes where it left off (unchanged files are skipped).`,children:[(0,Z.jsx)(Sa,{className:`mr-2 h-3.5 w-3.5 fill-current`}),V===`stopsync:${n}`?`Stopping…`:`Stop sync`]}):(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:V===`resync:${n}`,onClick:()=>Re(e),children:[(0,Z.jsx)(Er,{className:`mr-2 h-3.5 w-3.5 ${V===`resync:${n}`?`animate-spin`:``}`}),`Re-sync`]})),l?(0,Z.jsx)(`span`,{className:`rounded bg-muted px-2 py-0.5 text-[11px] text-muted-foreground`,title:`Structural workspace store; cannot be disabled`,children:`always on`}):(0,Z.jsx)(zP,{checked:!!e.enabled,disabled:!u||V===`backend:${n}`,onClick:()=>Fe(e)}),o&&(0,Z.jsx)(Y,{type:`button`,variant:`ghost`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:V===`remove:${n}`,title:`Unmount this folder (no files are deleted)`,onClick:()=>Le(e),children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})]}),c&&(0,Z.jsx)(Xw,{value:t.removalPolicy,backends:B,source:n,destination:t.propagatedRemovalSupported===!0,onSave:async t=>{await Fo(H,e.driver,e.address,{removalPolicy:t}),await Oe()}}),a&&(0,Z.jsx)(eN,{workspaceId:H,backend:e,onSaved:async()=>{await Oe(),Pe()}}),e.driver===`file`&&c&&!l&&(0,Z.jsx)(GP,{backend:e,busy:V===`exclude:${n}`,onSave:t=>Ie(e,{exclude:t},`exclude`)})]},n)}),(0,Z.jsx)($M,{workspaceId:H,children:(0,Z.jsx)(UP,{workspaceId:H})},H),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-start`,children:[(0,Z.jsx)(BP,{workspaceId:H,onAdded:async()=>{await Oe(),Pe()}}),(0,Z.jsx)(VP,{workspaceId:H,onAdded:async()=>{await Oe(),Pe()}}),(0,Z.jsx)(eN,{workspaceId:H,onSaved:async()=>{await Oe(),Pe()}})]}),e&&(0,Z.jsx)(`section`,{className:`border-t pt-4`,children:(0,Z.jsx)(Qw,{workspaceName:e})})]}),S.status===`active`&&x===`db`&&(0,Z.jsxs)(`div`,{className:`space-y-8`,children:[H&&(0,Z.jsxs)(`section`,{className:`space-y-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Embeddings`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Which model turns this workspace's content into vectors, and where those vectors live.`})]}),(0,Z.jsx)(fN,{workspaceId:H,workspaceName:e})]}),(0,Z.jsx)(XP,{stats:ue,isLoading:fe,onRefresh:()=>U(),workspaceName:e})]}),S.status===`active`&&x===`devices`&&(0,Z.jsx)(qP,{allDevices:me,linkedDevices:ge,isLoading:ve,deviceBusy:be,onRefresh:()=>W(),onLink:we,onUnlink:Te,onUpdate:Ee}),S.status===`active`&&x===`sync`&&(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsx)(yP,{workspaceId:H,workspaceUuid:S?.id})}),S.status===`active`&&x===`services`&&(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[H&&(0,Z.jsx)(EP,{workspaceId:H}),(0,Z.jsx)(`div`,{className:`space-y-3`,children:RP.map(e=>{let t=z?.[e.id]||z?.[e.id===`git`?`dotfiles`:e.id===`webdav`?`home`:`imap`],n=!!t?.enabled;return(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(pi,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:e.title})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:e.description}),(0,Z.jsxs)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:[`initialized: `,t?.initialized?`true`:`false`]})]}),(0,Z.jsx)(zP,{checked:n,disabled:V===`service:${e.id}`,onClick:()=>Ve(e.id,n)})]})},e.id)})}),(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsx)(AP,{workspaceId:H,enabled:!!(z?.imap?.enabled||z?.imapSync?.enabled)})})]}),S.status===`active`&&x===`policies`&&(0,Z.jsx)(aP,{workspaceId:H}),S.status===`active`&&x===`hooks`&&(0,Z.jsx)(`section`,{className:`rounded-lg border p-4`,children:(0,Z.jsx)(EN,{workspaceId:H,prefillRule:m,onPrefillConsumed:h,initialSection:a,initialRunsHandler:o,initialRunId:s})})]})}):(0,Z.jsxs)(`div`,{className:`space-y-3 p-6`,children:[(0,Z.jsx)(`h1`,{className:`font-semibold`,children:S.label||S.name}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Workspace settings are available to owners and admins.`}),(0,Z.jsx)(Y,{variant:`outline`,onClick:()=>g(`/workspaces/${e}`),children:`Back to workspace`})]}):(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Workspace not found`})}function $P({workspaceName:e}){let{selected:t,setSelected:n,tree:r,setTree:i,toggle:a}=Ew(),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null);return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Default folders`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Create a set of common folders with matching icons and colors.`}),(0,Z.jsx)(`div`,{className:`mt-3`,children:(0,Z.jsx)(Dw,{selected:t,onToggle:a,tree:r,onTreeChange:i,disabled:o,idPrefix:`settings-default-folders`})}),(0,Z.jsxs)(`div`,{className:`mt-3 flex items-center gap-3`,children:[(0,Z.jsx)(Y,{type:`button`,size:`sm`,disabled:o||t.size===0,onClick:async()=>{s(!0),l(null);let{ok:i,failed:a}=await Tw(e,Array.from(t),r);s(!1),l(a?`${i} created, ${a} failed`:`${i} folder(s) created`),n(new Set)},children:o?`Creating…`:`Create ${t.size||``} folder(s)`}),c&&(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:c})]})]})}function eF({workspaceName:e,vectorSpaces:t,onDone:n}){let[r,i]=(0,X.useState)(null),[a,o]=(0,X.useState)(null),s=async(e,t,r)=>{if(!(r&&!window.confirm(r))){i(e),o(null);try{let e=await t();o(e.message),n()}catch(e){o(e instanceof Error?e.message:`Reindex failed`)}finally{i(null)}}},c=[{title:`Bitmaps`,ops:[{key:`timelines`,label:`Reindex timelines`,description:`Rebuild the created/updated timelines from document data.`,fn:()=>vc(e)},{key:`mime`,label:`Reindex MIME types`,description:`Rebuild the per-MIME-type presence bitmaps (data/mime/*) from stored docs. Backfills blobs indexed before mime bitmaps existed.`,fn:()=>Wo(e)}]},{title:`Full-text (BM25)`,ops:[{key:`fts`,label:`Backfill`,description:`Index documents missing from the full-text table. Fast, skips already-indexed.`,fn:()=>$o(e)},{key:`fts-rebuild`,label:`Rebuild`,description:`Wipe the full-text table and rebuild from scratch. Use when counts drift.`,confirm:`Wipe the FTS index and rebuild it from scratch?`,fn:()=>$o(e,!0)},{key:`fts-optimize`,label:`Optimize`,description:`Compact fragments + prune old versions of the full-text table.`,fn:()=>ws(e,`fts`)}]},...t.length>0?[{title:`Vector tables (LanceDB)`,ops:t.map(t=>({key:`${t}-optimize`,label:`Optimize ${t}`,description:`Compact fragments + prune old versions of the '${t}' vector table and rebuild its ANN index.`,fn:()=>ws(e,t)}))}]:[]];return(0,Z.jsxs)(`section`,{className:`rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`mb-1 flex items-center gap-2`,children:[(0,Z.jsx)(Er,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Index maintenance`})]}),(0,Z.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Runs against this workspace. Reindex operations are idempotent.`}),(0,Z.jsx)(`div`,{className:`space-y-4`,children:c.map(e=>(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h3`,{className:`mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e.title}),(0,Z.jsx)(`div`,{className:`space-y-2`,children:e.ops.map(e=>(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,className:`w-44 justify-start`,disabled:r!==null,onClick:()=>s(e.key,e.fn,e.confirm),children:[r===e.key&&(0,Z.jsx)(Er,{className:`mr-2 h-3 w-3 animate-spin`}),e.label]}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 basis-52 text-xs text-muted-foreground`,children:e.description})]},e.key))})]},e.title))}),a&&(0,Z.jsx)(`p`,{className:`mt-3 text-xs text-muted-foreground`,children:a})]})}var tF=[{value:`documentRead`,label:`Read`},{value:`documentWrite`,label:`Write`},{value:`documentReadWrite`,label:`Read & write`}];function nF(){let{contextId:e,tab:t}=yt(),[n]=$t(),r=n.get(`ownerId`)||void 0,i=ft(),{showToast:a}=wo(),{selectEntity:o,goBack:s,closeM2:c}=qC(),l=De(),u=ND(t),d=r?`?ownerId=${encodeURIComponent(r)}`:``;(0,X.useEffect)(()=>{t!==u&&e&&i(`/contexts/${e}/settings/${u}${d}`,{replace:!0})},[t,u,e,d,i]);let[f,p]=(0,X.useState)(null),[m,h]=(0,X.useState)(!0),[g,_]=(0,X.useState)(!1),[v,y]=(0,X.useState)(!1),[b,x]=(0,X.useState)(``),[S,w]=(0,X.useState)(``),[T,E]=(0,X.useState)(null),[D,O]=(0,X.useState)(``),[k,A]=(0,X.useState)(``),[j,M]=(0,X.useState)(),[N,P]=(0,X.useState)([]),[ee,F]=(0,X.useState)(!1),[I,te]=(0,X.useState)(``),[L,R]=(0,X.useState)(tF[0].value),[ne,re]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!e)return;let t=!1;return Tl(e,r).then(e=>{t||(p(e),o(e.id),x(e.name||``),w(e.description||``),E(typeof e.metadata?.ui?.color==`string`?e.metadata.ui.color:null),O(e.url||``),A(e.baseUrl||``))}).catch(()=>{t||a({title:`Error`,description:`Failed to load context`,variant:`destructive`})}).finally(()=>{t||h(!1)}),()=>{t=!0}},[e,r,o,a]);let ie=(t=e)=>{t&&(F(!0),jl(t).then(P).catch(()=>P([])).finally(()=>F(!1)))};(0,X.useEffect)(()=>{if(u!==`shares`||!e)return;let t=!1;return jl(e).then(e=>{t||P(e)}).catch(()=>{t||P([])}),()=>{t=!0}},[u,e]);let ae=async t=>{if(t.preventDefault(),e){_(!0);try{let t=await dl(e,{name:b.trim(),description:S.trim(),metadata:{...f?.metadata,ui:{...f?.metadata?.ui,color:T}}},r);p(t),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),a({title:`Saved`,description:`Context updated`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{_(!1)}}},z=async t=>{if(t.preventDefault(),e){_(!0);try{await Promise.all([sl(e,D.trim(),r,j),xl(e,{baseUrl:k.trim()||null},r)]),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),a({title:`Saved`,description:`Context URL updated`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{_(!1)}}},oe=async()=>{if(e&&window.confirm(`Delete context "${e}"? This cannot be undone.`)){y(!0);try{await gl(e,r),c(),o(null),a({title:`Deleted`,description:`Context "${e}" removed`}),i(`/contexts`,{replace:!0})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Delete failed`,variant:`destructive`})}finally{y(!1)}}},se=async t=>{if(t.preventDefault(),!(!e||!I.trim())){re(`grant`);try{await vl(e,I.trim(),L),te(``),ie(),a({title:`Shared`,description:`Access granted to ${I.trim()}`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to grant access`,variant:`destructive`})}finally{re(null)}}},B=async t=>{if(e&&window.confirm(`Revoke ${t.userEmail}'s access to "${e}"?`)){re(t.userEmail);try{await cl(e,t.userEmail),ie(),a({title:`Revoked`,description:`${t.userEmail} no longer has access`})}catch(e){a({title:`Error`,description:e instanceof Error?e.message:`Failed to revoke access`,variant:`destructive`})}finally{re(null)}}};if(m)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Loading...`});if(!f)return(0,Z.jsx)(`div`,{className:`p-6 text-sm text-muted-foreground`,children:`Context not found`});let ce=MD.find(e=>e.id===u),V=`/contexts/${e}${d}`;return(0,Z.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto`,children:(0,Z.jsxs)(`div`,{className:`mx-auto max-w-3xl p-6 pb-12 max-md:px-4 max-md:pb-rail-stack`,children:[(0,Z.jsx)(sw,{compact:!0,className:`mb-6 border-b pb-4`,title:`${ce.label} - ${f.name||f.id}`,description:ce.description,backTo:V,onBack:l?s:void 0}),u===`general`&&(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsxs)(`form`,{onSubmit:ae,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:`Context ID`}),(0,Z.jsx)(`div`,{className:`mt-1 flex h-10 items-center rounded-md bg-muted px-3 font-mono text-sm text-muted-foreground`,children:f.id})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-name`,className:`text-sm font-medium`,children:`Name`}),(0,Z.jsx)(q,{id:`ctx-name`,value:b,onChange:e=>x(e.target.value),placeholder:`My Context`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-description`,className:`text-sm font-medium`,children:`Description`}),(0,Z.jsx)(q,{id:`ctx-description`,value:S,onChange:e=>w(e.target.value),placeholder:`Optional description`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-color`,className:`text-sm font-medium`,children:`Color`}),(0,Z.jsxs)(`div`,{className:`mt-1 flex items-center gap-2`,children:[(0,Z.jsx)(q,{id:`ctx-color`,type:`color`,value:/^#[0-9a-f]{6}$/i.test(T||f.color||``)?T||f.color:`#808080`,onChange:e=>E(e.target.value),className:`h-10 w-16 p-1`,disabled:g}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,disabled:g||T===null,onClick:()=>E(null),children:`Use inherited color`})]}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:T===null?`Using the tree folder or workspace color.`:`Applies only to this context.`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{className:`text-sm font-medium`,children:`Workspace`}),(0,Z.jsx)(`div`,{className:`mt-1 flex h-10 items-center rounded-md bg-muted px-3 text-sm text-muted-foreground`,children:f.workspaceName||f.workspaceId||f.workspace})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:g,children:g?`Saving...`:`Save Changes`})]}),(0,Z.jsxs)(`section`,{className:`rounded-lg border border-destructive/30 p-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-sm font-semibold text-destructive`,children:`Danger Zone`}),(0,Z.jsxs)(Y,{variant:`destructive`,disabled:v,onClick:oe,children:[(0,Z.jsx)(Qr,{className:`mr-2 h-4 w-4`}),v?`Deleting...`:`Delete Context`]})]})]}),u===`location`&&(0,Z.jsxs)(`form`,{onSubmit:z,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`ctx-url`,className:`text-sm font-medium`,children:`URL`}),(0,Z.jsx)(C,{id:`ctx-url`,value:D,onChange:O,fixedWorkspaceName:f.workspaceName,pickerTitle:`Switch context to…`,placeholder:`workspace://path`,onPickTarget:(e,t)=>{O(`${t.workspaceName}://${e.replace(/^\/+/,``)}`),M(t.treeName)}}),j&&(0,Z.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[`Destination tree: `,j]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`label`,{htmlFor:`ctx-base-url`,className:`text-sm font-medium`,children:[`Base URL `,(0,Z.jsx)(`span`,{className:`font-normal text-muted-foreground`,children:`(optional)`})]}),(0,Z.jsx)(C,{id:`ctx-base-url`,value:k,onChange:A,fixedWorkspaceName:f.workspaceName,placeholder:`workspace://base/path`,pickerTitle:`Pick a base path…`})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:g,children:g?`Saving...`:`Save Changes`})]}),u===`shares`&&(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`People with access`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Only the context owner can see and change this list.`})]}),(0,Z.jsxs)(Y,{type:`button`,variant:`outline`,size:`sm`,onClick:()=>ie(),disabled:ee,children:[(0,Z.jsx)(Er,{className:K(`mr-2 h-3.5 w-3.5`,ee&&`animate-spin`)}),`Refresh`]})]}),N.length===0?(0,Z.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:`Not shared with anyone.`}):N.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0`,children:[(0,Z.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.userEmail}),(0,Z.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[tF.find(t=>t.value===e.accessLevel)?.label||e.accessLevel||`unknown access`,e.sharedAt&&` - since ${new Date(e.sharedAt).toLocaleDateString()}`]})]}),(0,Z.jsx)(Y,{type:`button`,variant:`outline`,size:`sm`,className:`text-destructive hover:text-destructive`,disabled:ne===e.userEmail,onClick:()=>B(e),children:(0,Z.jsx)(nr,{className:`h-3.5 w-3.5`})})]},e.userEmail))]}),(0,Z.jsxs)(`form`,{onSubmit:se,className:`space-y-4 rounded-lg border p-4`,children:[(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Grant access`}),(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`share-email`,className:`text-sm font-medium`,children:`User email`}),(0,Z.jsx)(q,{id:`share-email`,type:`email`,value:I,onChange:e=>te(e.target.value),placeholder:`person@example.com`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`The user must already have an account on this server.`})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`share-level`,className:`text-sm font-medium`,children:`Access level`}),(0,Z.jsx)(`select`,{id:`share-level`,value:L,onChange:e=>R(e.target.value),className:`mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring`,children:tF.map(e=>(0,Z.jsx)(`option`,{value:e.value,children:e.label},e.value))})]})]}),(0,Z.jsx)(Y,{type:`submit`,disabled:ne===`grant`||!I.trim(),children:ne===`grant`?`Sharing...`:`Share context`})]})]})]})})}function rF({status:e}){let t={running:{icon:kr,color:`text-success`,bg:`bg-success-subtle`,label:`Running`},stopped:{icon:Bn,color:`text-muted-foreground`,bg:`bg-muted`,label:`Stopped`},starting:{icon:Zn,color:`text-info`,bg:`bg-info-subtle`,label:`Starting`},stopping:{icon:Zn,color:`text-warning`,bg:`bg-warning-subtle`,label:`Stopping`},error:{icon:er,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Error`},created:{icon:ui,color:`text-muted-foreground`,bg:`bg-muted`,label:`Created`},configured:{icon:ui,color:`text-info`,bg:`bg-info-subtle`,label:`Configured`},removed:{icon:Bn,color:`text-destructive`,bg:`bg-destructive-subtle`,label:`Removed`}},n=t[e]||t.created,r=n.icon;return(0,Z.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium ${n.bg} ${n.color}`,children:[(0,Z.jsx)(r,{className:`w-3 h-3`}),n.label]})}function iF(){let[e,t]=(0,X.useState)([]),[n,r]=(0,X.useState)(!0),[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(null);Ae(()=>s(null),o!==null);let[c,l]=hw(),[u,d]=(0,X.useState)([]),[f,p]=(0,X.useState)([]),[m,h]=(0,X.useState)(``),[g,_]=(0,X.useState)(``),[v,y]=(0,X.useState)(``),[b,x]=(0,X.useState)(!1),{showToast:S}=wo(),C=du(),w=(0,X.useCallback)(async()=>{try{r(!0);let e=await Pj.listRoles({type:`workspace`,userId:C?.id});t(e),a(null)}catch(e){let t=e instanceof Error?e.message:`Failed to fetch roles`;a(t)}finally{r(!1)}},[C?.id]);(0,X.useEffect)(()=>{let e=()=>w();e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[w]),(0,X.useEffect)(()=>{c&&(Pj.listTemplates().then(e=>{let t=e.filter(e=>e.type===`workspace`);d(t),h(e=>e||t[0]?.id||``)}).catch(()=>d([])),Uo().then(e=>{p(e),y(t=>t||e[0]?.id||``)}).catch(()=>p([])))},[c]);let T=async e=>{if(e.preventDefault(),!(!m||!g.trim()||!v)){x(!0);try{let e=await Pj.createRole({template:m,name:g.trim(),type:`workspace`,userId:C?.id,workspaceId:v});_(``),l(!1),await w(),S({title:`Created`,description:`Role "${e.name}" created`})}catch(e){S({title:`Error`,description:e instanceof Error?e.message:`Failed to create role`,variant:`destructive`})}finally{x(!1)}}},E=async e=>{try{await Pj.startRole(e.id),S({title:`Success`,description:`Role "${e.name}" started successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to start role`;S({title:`Error`,description:t,variant:`destructive`})}},D=async e=>{try{await Pj.stopRole(e.id),S({title:`Success`,description:`Role "${e.name}" stopped successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to stop role`;S({title:`Error`,description:t,variant:`destructive`})}},O=async e=>{try{await Pj.restartRole(e.id),S({title:`Success`,description:`Role "${e.name}" restarted successfully`}),w()}catch(e){let t=e instanceof Error?e.message:`Failed to restart role`;S({title:`Error`,description:t,variant:`destructive`})}},k=async e=>{try{let t=await Pj.getRoleLogs(e.id,100);s({role:e,logs:t})}catch(e){let t=e instanceof Error?e.message:`Failed to fetch logs`;S({title:`Error`,description:t,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`My Roles`,description:`Manage your workspace roles and services`,actions:(0,Z.jsxs)(Z.Fragment,{children:[!c&&(0,Z.jsxs)(Y,{onClick:()=>l(!0),children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),`Create Role`]}),(0,Z.jsxs)(Y,{onClick:w,variant:`outline`,children:[(0,Z.jsx)(Ba,{className:`mr-2 h-4 w-4`}),`Refresh`]})]})}),c&&(0,Z.jsx)(pw,{title:`Create New Role`,onClose:()=>l(!1),children:(0,Z.jsxs)(`form`,{onSubmit:T,className:`space-y-4`,children:[(0,Z.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`role-template`,className:`mb-1 block text-sm font-medium`,children:`Template`}),(0,Z.jsxs)(`select`,{id:`role-template`,className:`w-full rounded-md border border-border bg-background px-3 py-2`,value:m,onChange:e=>h(e.target.value),disabled:b||u.length===0,children:[u.length===0&&(0,Z.jsx)(`option`,{value:``,children:`No workspace templates available`}),u.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,` - `,e.description]},e.id))]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`role-name`,className:`mb-1 block text-sm font-medium`,children:`Role Name`}),(0,Z.jsx)(q,{id:`role-name`,value:g,onChange:e=>_(e.target.value),placeholder:`e.g., canvas-sshd`,disabled:b})]})]}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`label`,{htmlFor:`role-workspace`,className:`mb-1 block text-sm font-medium`,children:`Workspace`}),(0,Z.jsxs)(`select`,{id:`role-workspace`,className:`w-full rounded-md border border-border bg-background px-3 py-2`,value:v,onChange:e=>y(e.target.value),disabled:b||f.length===0,children:[f.length===0&&(0,Z.jsx)(`option`,{value:``,children:`No workspaces available. Create one first.`}),f.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.label||e.name},e.id))]})]}),(0,Z.jsxs)(Y,{type:`submit`,disabled:b||!m||!g.trim()||!v,children:[(0,Z.jsx)(br,{className:`mr-2 h-4 w-4`}),b?`Creating…`:`Create Role`]})]})}),n?(0,Z.jsx)(`div`,{className:`text-center py-8`,children:`Loading roles...`}):i?(0,Z.jsx)(`div`,{className:`text-center py-8 text-destructive`,children:i}):e.length===0?(0,Z.jsxs)(`div`,{className:`text-center py-12 border rounded-lg`,children:[(0,Z.jsx)(pi,{className:`w-12 h-12 mx-auto text-muted-foreground mb-4`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground`,children:`You don't have any workspace roles yet`}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground mt-2`,children:`Contact your administrator to set up roles for your workspaces`})]}):(0,Z.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4`,children:e.map(e=>(0,Z.jsxs)(`div`,{className:`border rounded-lg p-6 space-y-4 hover:shadow-elevation-2 transition-shadow`,children:[(0,Z.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,Z.jsxs)(`div`,{className:`flex-1`,children:[(0,Z.jsx)(`h3`,{className:`font-semibold text-lg`,children:e.name}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.template})]}),(0,Z.jsx)(rF,{status:e.status})]}),e.container&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,Z.jsx)(pi,{className:`w-3 h-3`}),(0,Z.jsx)(`span`,{className:`truncate`,children:e.container.name})]})}),(0,Z.jsxs)(`div`,{className:`flex gap-2 pt-2`,children:[e.status===`stopped`||e.status===`created`?(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>E(e),className:`flex-1`,children:[(0,Z.jsx)(Ar,{className:`w-4 h-4 mr-2`}),`Start`]}):e.status===`running`?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>D(e),className:`flex-1`,children:[(0,Z.jsx)(Sa,{className:`w-4 h-4 mr-2`}),`Stop`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,onClick:()=>O(e),className:`flex-1`,children:[(0,Z.jsx)(Ba,{className:`w-4 h-4 mr-2`}),`Restart`]})]}):(0,Z.jsxs)(Y,{size:`sm`,variant:`outline`,disabled:!0,className:`flex-1`,children:[(0,Z.jsx)(Zn,{className:`w-4 h-4 mr-2`}),e.status]}),(0,Z.jsx)(Y,{size:`sm`,variant:`outline`,onClick:()=>k(e),title:`View Logs`,children:(0,Z.jsx)(Ki,{className:`w-4 h-4`})})]})]},e.id))}),(0,Z.jsxs)(`div`,{className:`border-t pt-6`,children:[(0,Z.jsx)(`h2`,{className:`text-lg font-semibold mb-4`,children:`Global Services`}),(0,Z.jsxs)(`div`,{className:`text-sm text-muted-foreground space-y-2`,children:[(0,Z.jsx)(`p`,{children:`Global roles are server-wide services managed by your administrator. These include services like SSH access, storage, and other shared infrastructure.`}),(0,Z.jsx)(`p`,{children:`To check the status of global services, contact your system administrator.`})]})]}),o&&(0,Z.jsx)(`div`,{className:`fixed inset-0 bg-scrim flex items-center justify-center z-50`,children:(0,Z.jsxs)(`div`,{className:`bg-background rounded-lg shadow-elevation-3 max-w-4xl w-full mx-4 max-h-viewport-modal flex flex-col`,children:[(0,Z.jsxs)(`div`,{className:`p-6 border-b`,children:[(0,Z.jsxs)(`h2`,{className:`text-xl font-bold`,children:[o.role.name,` - Logs`]}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o.role.template})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto p-6`,children:(0,Z.jsx)(`div`,{"data-scheme":`dark`,className:`bg-background text-success p-4 rounded font-mono text-xs overflow-x-auto`,children:o.logs.length===0?(0,Z.jsx)(`div`,{className:`text-muted-foreground`,children:`No logs available`}):(0,Z.jsx)(`pre`,{children:o.logs.join(`
|
|
53
|
+
`)})})}),(0,Z.jsx)(`div`,{className:`p-4 border-t flex justify-end`,children:(0,Z.jsx)(Y,{onClick:()=>s(null),children:`Close`})})]})})]})}function aF(){return(0,Z.jsxs)(`div`,{className:`space-y-6`,children:[(0,Z.jsx)(sw,{title:`Remotes`,description:`Connect to remote Canvas instances`}),(0,Z.jsx)(`div`,{className:`flex flex-col items-center justify-center py-12 space-y-4`,children:(0,Z.jsxs)(`div`,{className:`text-center`,children:[(0,Z.jsx)(`h2`,{className:`text-2xl font-semibold mb-2`,children:`Coming Soon`}),(0,Z.jsx)(`p`,{className:`text-muted-foreground max-w-md`,children:`Remote connection management is currently under development. Check back later for updates.`})]})})]})}var oF=[`note`,`todo`,`link`,`file`,`photo`];function sF(){let{kind:e}=yt(),t=ft();return e===`sketch`?(0,Z.jsx)(ht,{to:`/apps/sketch?add=1`,replace:!0}):!e||!oF.includes(e)?(0,Z.jsx)(ht,{to:`/home`,replace:!0}):(0,Z.jsx)(XE,{initialKind:e,onInitialCardClose:()=>t(`/home`)})}var cF=(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(sn,{index:!0,element:(0,Z.jsx)(oD,{})},`r1`),(0,Z.jsx)(sn,{path:`home`,element:(0,Z.jsx)(aD,{})},`r2`),(0,Z.jsx)(sn,{path:`share-target`,element:(0,Z.jsx)(pD,{})},`r3`),(0,Z.jsx)(sn,{path:`apps`,element:(0,Z.jsx)(rw,{})},`apps-index`),(0,Z.jsx)(sn,{path:`apps/:appletId`,element:(0,Z.jsx)(xC,{})},`apps-host`),(0,Z.jsx)(sn,{path:`apps/add/:kind`,element:(0,Z.jsx)(sF,{})},`r4`),(0,Z.jsx)(sn,{path:`workspaces`,element:(0,Z.jsx)(Rw,{})},`r5`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName`,element:(0,Z.jsx)(yE,{})},`r6`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/by-id/:documentId`,element:(0,Z.jsx)(wE,{})},`workspace-document-by-id`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/:documentId`,element:(0,Z.jsx)(wE,{})},`workspace-document`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/by-hash/:algo/:checksum`,element:(0,Z.jsx)(wE,{})},`workspace-document-by-hash`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/documents/by-checksum/:algo/:checksum`,element:(0,Z.jsx)(wE,{})},`workspace-document-by-checksum`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/settings`,element:(0,Z.jsx)(ZP,{})},`r7`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/settings/:tab`,element:(0,Z.jsx)(ZP,{})},`r8`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/path/*`,element:(0,Z.jsx)(yE,{})},`r9`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/trees/:treeName`,element:(0,Z.jsx)(yE,{})},`r10`),(0,Z.jsx)(sn,{path:`workspaces/:workspaceName/trees/:treeName/path/*`,element:(0,Z.jsx)(yE,{})},`r11`),(0,Z.jsx)(sn,{path:`contexts`,element:(0,Z.jsx)(gD,{})},`r12`),(0,Z.jsx)(sn,{path:`contexts/:contextId`,element:(0,Z.jsx)(vD,{})},`r13`),(0,Z.jsx)(sn,{path:`contexts/:contextId/settings`,element:(0,Z.jsx)(nF,{})},`r14`),(0,Z.jsx)(sn,{path:`contexts/:contextId/settings/:tab`,element:(0,Z.jsx)(nF,{})},`r15`),(0,Z.jsx)(sn,{path:`agents`,element:(0,Z.jsx)(uM,{})},`r16`),(0,Z.jsx)(sn,{path:`agents/:agentId`,element:(0,Z.jsx)(EM,{})},`r17`),(0,Z.jsx)(sn,{path:`agents/:agentId/:sessionId`,element:(0,Z.jsx)(EM,{})},`r18`),(0,Z.jsx)(sn,{path:`agents/:agentId/settings`,element:(0,Z.jsx)(PM,{})},`r19`),(0,Z.jsx)(sn,{path:`agents/:agentId/settings/:tab`,element:(0,Z.jsx)(PM,{})},`r20`),(0,Z.jsx)(sn,{path:`roles`,element:(0,Z.jsx)(iF,{})},`r21`),(0,Z.jsx)(sn,{path:`remotes`,element:(0,Z.jsx)(aF,{})},`r22`),(0,Z.jsx)(sn,{path:`settings`,element:(0,Z.jsx)(CO,{})},`settings`),(0,Z.jsx)(sn,{path:`appearance`,element:(0,Z.jsx)(Uk,{})},`r23`),(0,Z.jsx)(sn,{path:`key-bindings`,element:(0,Z.jsx)(Qk,{})},`key-bindings`),(0,Z.jsx)(sn,{path:`offline`,element:(0,Z.jsx)(LA,{})},`r24`),(0,Z.jsx)(sn,{path:`about`,element:(0,Z.jsx)(BA,{})},`r25`),(0,Z.jsx)(sn,{path:`api-tokens`,element:(0,Z.jsx)(bD,{})},`r26`),(0,Z.jsx)(sn,{path:`devices`,element:(0,Z.jsx)(OD,{})},`r27`),(0,Z.jsx)(sn,{path:`embedding`,element:(0,Z.jsx)(xj,{})},`r28`),(0,Z.jsx)(sn,{path:`shared`,element:(0,Z.jsx)(Sj,{})},`r29`),(0,Z.jsx)(sn,{path:`admin/users`,element:(0,Z.jsx)(Rj,{})},`r30`),(0,Z.jsx)(sn,{path:`admin/contexts`,element:(0,Z.jsx)(Oj,{})},`r31`),(0,Z.jsx)(sn,{path:`admin/workspaces`,element:(0,Z.jsx)(Dj,{})},`r32`),(0,Z.jsx)(sn,{path:`admin/agents`,element:(0,Z.jsx)(kj,{})},`r33`),(0,Z.jsx)(sn,{path:`admin/logs`,element:(0,Z.jsx)(Nj,{})},`r34`),(0,Z.jsx)(sn,{path:`admin/roles`,element:(0,Z.jsx)(Lj,{})},`r35`),(0,Z.jsx)(sn,{path:`admin/embedding`,element:(0,Z.jsx)(zj,{})},`r36`),(0,Z.jsx)(sn,{path:`admin/auth`,element:(0,Z.jsx)(oM,{})},`r37`)]});function lF(e){if(typeof e!=`string`||!e.startsWith(`/`)||e.startsWith(`//`)||/[\\\u0000-\u0020]/.test(e))return null;let t=new URL(e,`https://canvas.invalid`);return t.origin!==`https://canvas.invalid`||/^\/(?:login|register|pub|share-target|apps|next)(?:\/|$)/.test(t.pathname)||t.pathname===`/`||[...t.searchParams.keys()].some(e=>/token|password|secret|code/i.test(e))?null:t.pathname+t.search+t.hash}function uF(e){let t=2166136261;for(let n of e)t=Math.imul(t^n.charCodeAt(0),16777619);return`canvas:last-screen:${t>>>0}`}var dF=un(cF),fF=e=>{let t=lF(e);return t&&ct(dF,t)?t:null};function pF(){let e=vn(),[t]=(0,X.useState)(()=>{if(e.pathname!==`/`||e.search||e.hash)return null;try{let t=localStorage.getItem(`authToken`);return t?{key:e.key,path:fF(localStorage.getItem(uF(t)))||`/home`}:null}catch{return{key:e.key,path:`/home`}}}),n=t&&e.key===t.key&&e.pathname===`/`;return(0,X.useEffect)(()=>{if(n)return;let t=fF(e.pathname+e.search+e.hash);if(t)try{let e=localStorage.getItem(`authToken`);e&&localStorage.setItem(uF(e),t)}catch{}},[e.pathname,e.search,e.hash,n]),n?(0,Z.jsx)(ht,{to:t.path,replace:!0}):null}var mF={activeSection:null,m0Open:!1,m1Open:!1,m2Open:!1,m2View:null,selectedEntityId:null,user:null};function hF(e,t){switch(t.type){case`RESTORE_MENU`:return{...e,...t.menu,user:e.user};case`SET_SECTION`:return{...e,activeSection:t.section,m1Open:t.section!==null,m2Open:!1,m2View:null,selectedEntityId:null};case`TOGGLE_SECTION`:return e.activeSection===t.section&&e.m1Open?{...e,activeSection:null,m1Open:!1,m2Open:!1,m2View:null}:{...e,activeSection:t.section,m1Open:!0,m2Open:!1,m2View:null,selectedEntityId:null};case`TOGGLE_M0`:return e.m0Open?{...e,m0Open:!1,activeSection:null,m1Open:!1,m2Open:!1,m2View:null}:{...e,m0Open:!0};case`CLOSE_M0`:return{...e,m0Open:!1};case`CLOSE_M1`:return{...e,activeSection:null,m1Open:!1,m2Open:!1,m2View:null};case`OPEN_M2`:return{...e,m2Open:!0,m2View:t.view,selectedEntityId:t.entityId===void 0?e.selectedEntityId:t.entityId};case`OPEN_M2_DRAWER`:return{...e,m0Open:!0,activeSection:t.section,m1Open:!0,m2Open:!0,m2View:t.view,selectedEntityId:t.entityId};case`OPEN_M1_DRAWER`:return{...e,m0Open:!0,activeSection:t.section,m1Open:!0,m2Open:!1,m2View:null,selectedEntityId:null};case`CLOSE_M2`:return{...e,m2Open:!1,m2View:null};case`SELECT_ENTITY`:return{...e,selectedEntityId:t.entityId};case`SYNC_FROM_URL`:{let n=!t.mobile&&!e.m2Open&&e.m2View===null&&t.section===e.activeSection&&t.entityId===e.selectedEntityId;return t.section===e.activeSection&&t.entityId===e.selectedEntityId&&t.m2View===e.m2View&&!(t.mobile&&(e.m1Open||e.m0Open))?e:{...e,activeSection:t.section,m0Open:!t.mobile&&e.m0Open,m1Open:!t.mobile&&t.section!==null,selectedEntityId:t.entityId,m2Open:!n&&t.m2View!==null,m2View:n?null:t.m2View}}case`SET_USER`:return{...e,user:t.user};default:return e}}function gF({children:e}){let[t,n]=(0,X.useReducer)(hF,mF),r=vn(),i=ft(),a=(0,X.useRef)(t);(0,X.useLayoutEffect)(()=>{a.current=t},[t]),YC(t,n);let o=(0,X.useCallback)((e,t=!1,o=!1)=>{let s=hF(a.current,e);if(a.current=s,n(e),!GC())return;let{activeSection:c,m0Open:l,m1Open:u,m2Open:d,m2View:f,selectedEntityId:p}=s;i({pathname:r.pathname,search:r.search,hash:r.hash},{replace:t,state:{...r.state,canvasMenu:{activeSection:c,m0Open:l,m1Open:u,m2Open:d,m2View:f,selectedEntityId:p},canvasMenuBack:o}})},[r,i]),s=(0,X.useCallback)(e=>{if(GC()&&a.current.m1Open){let{activeSection:t,m0Open:n,m1Open:o,m2Open:s,m2View:c,selectedEntityId:l}=a.current;i(e,{replace:!0,state:{...r.state,canvasMenu:{activeSection:t,m0Open:n,m1Open:o,m2Open:s,m2View:c,selectedEntityId:l},canvasMenuBack:!1}})}i(e)},[r.state,i]),c=(0,X.useCallback)(()=>{if(window.history.state?.idx>0){i(-1);return}let e=a.current;if(e.m1Open&&e.m2Open)o({type:`CLOSE_M2`},!0,!0);else if(e.m1Open)o({type:`CLOSE_M1`},!0,!0);else if(e.m0Open)o({type:`CLOSE_M0`},!0,!0);else{let{section:e,entityId:t,m2View:n}=JC(r.pathname);if(!GC()){i(e?`/${e}`:`/`);return}o(e&&t?{type:`OPEN_M2_DRAWER`,section:e,view:n,entityId:t}:{type:`TOGGLE_M0`},!0,!0)}},[o,r.pathname,i]);(0,X.useEffect)(()=>{let e=du();if(e){n({type:`SET_USER`,user:e});return}let t=!1;return fu().then(e=>{!t&&e&&n({type:`SET_USER`,user:e})}).catch(()=>{}),()=>{t=!0}},[]);let l={state:t,dispatch:n,setSection:(0,X.useCallback)(e=>{o({type:`SET_SECTION`,section:e})},[o]),toggleSection:(0,X.useCallback)(e=>{o({type:`TOGGLE_SECTION`,section:e})},[o]),toggleM0:(0,X.useCallback)(()=>{o({type:`TOGGLE_M0`},a.current.m0Open)},[o]),closeM0:(0,X.useCallback)(()=>{o({type:`CLOSE_M0`},!0)},[o]),closeM1:(0,X.useCallback)(()=>{o({type:`CLOSE_M1`},!0)},[o]),openM2:(0,X.useCallback)((e,t)=>{o({type:`OPEN_M2`,view:e,entityId:t})},[o]),openM2Drawer:(0,X.useCallback)((e,t,n)=>{o({type:`OPEN_M2_DRAWER`,section:e,view:t,entityId:n})},[o]),openM1Drawer:(0,X.useCallback)(e=>{o({type:`OPEN_M1_DRAWER`,section:e})},[o]),closeM2:(0,X.useCallback)(()=>{GC()&&a.current.m1Open&&a.current.m2Open?c():n({type:`CLOSE_M2`})},[c]),selectEntity:(0,X.useCallback)(e=>{n({type:`SELECT_ENTITY`,entityId:e})},[]),goBack:c,navigateFromMenu:s};return(0,Z.jsx)(KC.Provider,{value:l,children:e})}function _F(){return(0,X.useSyncExternalStore)(ho,oo,()=>!1)}function vF(e,t){let n=null,r=!1,i,a;function o(){clearTimeout(i),!r&&oo()&&(i=setTimeout(()=>{s()},3e4))}function s(s=!1){if(n)return n;if(r)return Promise.resolve(!1);clearTimeout(i),a=new AbortController;let c=setTimeout(()=>a?.abort(),5e3);return n=(async()=>{try{let n=await fetch(e,{cache:`no-store`,credentials:`omit`,signal:a.signal});if(!n.ok||n.headers.get(`x-canvas-offline`)===`fallback`)throw Error(`Unavailable`);if((await n.json()).status!==`success`)throw Error(`Not a Canvas response`);if(r)return!1;let i=oo();return co(),(i||s)&&t(),!0}catch{return r||fo(),!1}finally{clearTimeout(c),n=null,o()}})(),n}let c=ho(o),l=()=>{s()};return window.addEventListener(`online`,l),o(),{retry:s,stop(){r=!0,clearTimeout(i),a?.abort(),c(),window.removeEventListener(`online`,l)}}}var yF;function bF(){yF=vF(`${yo}/ping`,()=>B.retryNow());let e=()=>{yF?.retry()},t=B.on(`connect_error`,e),n=B.on(`disconnect`,e);return()=>{t(),n(),yF?.stop(),yF=void 0}}function xF(){return yF?.retry(!0)??Promise.resolve(!1)}function SF(){let e=_F(),[t,n]=(0,X.useState)(!1);return e?(0,Z.jsxs)(`details`,{className:`relative`,children:[(0,Z.jsx)(`summary`,{"aria-label":`Offline — connection options`,title:`Offline — cached content available`,className:`flex h-10 w-10 cursor-pointer list-none items-center justify-center rounded-lg text-amber-600 hover:bg-accent/50 [&::-webkit-details-marker]:hidden`,children:(0,Z.jsx)(Hn,{className:`h-5 w-5`})}),(0,Z.jsxs)(`div`,{className:`absolute bottom-0 left-full z-50 ml-2 w-60 max-w-[calc(100vw-5rem)] rounded-lg border bg-popover p-3 text-popover-foreground shadow-lg`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,role:`status`,children:`Offline`}),(0,Z.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`You can browse cached documents. We’ll reconnect automatically when the server is available.`}),(0,Z.jsx)(`button`,{type:`button`,disabled:t,onClick:async()=>{n(!0);try{await xF()}finally{n(!1)}},className:`mt-3 rounded-md bg-secondary px-3 py-2 text-xs font-medium hover:bg-accent disabled:opacity-50`,children:t?`Checking…`:`Retry now`})]})]}):null}var CF=Rr,wF=Kn,TF=La,EF=X.forwardRef(({className:e,sideOffset:t=4,...n},r)=>(0,Z.jsx)(Va,{children:(0,Z.jsx)(_i,{ref:r,sideOffset:t,className:K(`z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in duration-fast fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]`,e),...n})}));EF.displayName=_i.displayName;var DF=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(li,{ref:n,className:K(`relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full`,e),...t}));DF.displayName=li.displayName;var OF=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Wa,{ref:n,className:K(`aspect-square h-full w-full`,e),...t}));OF.displayName=Wa.displayName;var kF=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Na,{ref:n,className:K(`flex h-full w-full items-center justify-center rounded-full bg-muted`,e),...t}));kF.displayName=Na.displayName;function AF({section:e,icon:t,label:n,disabled:r}){let{state:i,toggleSection:a}=qC(),o=i.activeSection===e;return(0,Z.jsxs)(wF,{children:[(0,Z.jsx)(TF,{asChild:!0,children:(0,Z.jsxs)(`button`,{type:`button`,disabled:r,"aria-label":n,onClick:()=>!r&&e&&a(e),className:K(`relative flex items-center justify-center w-10 h-10 rounded-lg transition-colors`,o?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`,r&&`opacity-30 cursor-not-allowed`),children:[o&&(0,Z.jsx)(`span`,{className:`absolute right-0 top-1/2 -translate-y-1/2 w-0.5 h-5 bg-foreground rounded-l`}),t]})}),(0,Z.jsx)(EF,{side:`right`,sideOffset:8,children:n})]})}function jF({path:e,icon:t,label:n,section:r=`settings`}){let i=ft(),{setSection:a}=qC();return(0,Z.jsxs)(wF,{children:[(0,Z.jsx)(TF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":n,onClick:()=>{a(r),i(e)},className:`flex items-center justify-center w-10 h-10 rounded-lg text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors`,children:t})}),(0,Z.jsx)(EF,{side:`right`,sideOffset:8,children:n})]})}function MF(){let{state:e,toggleM0:t}=qC(),n=_F();return(0,Z.jsxs)(`button`,{type:`button`,onClick:t,"aria-label":`${e.m0Open?`Close menu`:`Open menu`}${n?` — offline, connection options in menu`:``}`,"data-shell":`rail`,className:`fixed bottom-rail-inset left-2 z-nav flex h-rail w-rail items-center justify-center rounded-full bg-foreground text-background shadow-elevation-4 md:hidden`,children:[e.m0Open?(0,Z.jsx)(vr,{className:`h-5 w-5`}):(0,Z.jsx)(sa,{className:`h-5 w-5`}),n&&(0,Z.jsx)(`span`,{"aria-hidden":!0,className:`absolute right-0 top-0 h-3 w-3 rounded-full border-2 border-background bg-amber-500`})]})}function NF(){let{state:e,closeM0:t,closeM1:n}=qC(),{state:r,setView:i,closeT1:a}=ol(),o=ft(),{showToast:s}=wo(),c=e.user?.userType===`admin`,l=aw(),u=()=>{r.t1Open?a():i(`tools`),n(),t()},d=(0,X.useCallback)(async()=>{try{await J.post(`/auth/logout`),localStorage.removeItem(`authToken`),o(`/login`)}catch{s({title:`Error`,description:`Logout failed`,variant:`destructive`})}},[o,s]);return(0,Z.jsxs)(CF,{delayDuration:200,children:[e.m0Open&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-nav-scrim bg-scrim animate-fade-in md:hidden`,onClick:t,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{"data-shell":`rail`,className:K(`flex flex-col items-center w-rail h-full rounded-(--panel-radius) bg-transparent shrink-0`,e.m0Open?`max-md:fixed max-md:left-2 max-md:top-2 max-md:bottom-rail-stack max-md:z-rail max-md:h-auto max-md:bg-card max-md:surface-glass max-md:shadow-elevation-5`:`max-md:hidden`),children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-center h-12 w-full shrink-0`,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Canvas home`,onClick:()=>o(`/home`),className:`flex items-center justify-center w-10 h-10 rounded-lg hover:bg-accent/50 transition-colors`,children:(0,Z.jsx)(`img`,{src:`/images/logo-br_128x128.png`,alt:``,className:`w-6 h-6`})})}),(0,Z.jsxs)(`nav`,{className:`flex flex-col items-center gap-1 py-2 flex-1 min-h-0 overflow-y-auto`,children:[(!l.local||l.workspace!==!1)&&(0,Z.jsx)(AF,{section:`contexts`,icon:(0,Z.jsx)(vi,{className:`w-5 h-5`}),label:`Contexts`}),(!l.local||l.workspace!==!1)&&(0,Z.jsx)(AF,{section:`workspaces`,icon:(0,Z.jsx)(Ga,{className:`w-5 h-5`}),label:`Workspaces`}),(!l.local||l.agent)&&(0,Z.jsx)(AF,{section:`agents`,icon:(0,Z.jsx)(ri,{className:`w-5 h-5`}),label:`Agents`}),(0,Z.jsx)(AF,{section:`apps`,icon:(0,Z.jsx)(Hi,{className:`w-5 h-5`}),label:`Apps`}),(!l.local||l.workspace!==!1)&&(0,Z.jsx)(jF,{path:`/roles`,section:null,icon:(0,Z.jsx)(Ma,{className:`w-5 h-5`}),label:`Roles`}),c&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`w-6 h-px bg-border my-2`}),(0,Z.jsx)(jF,{path:`/admin/users`,icon:(0,Z.jsx)(ar,{className:`w-5 h-5`}),label:`All Users`}),(0,Z.jsx)(jF,{path:`/admin/logs`,icon:(0,Z.jsx)(Ki,{className:`w-5 h-5`}),label:`Server Logs`}),(0,Z.jsx)(jF,{path:`/admin/workspaces`,icon:(0,Z.jsx)($r,{className:`w-5 h-5`}),label:`All Workspaces`}),(0,Z.jsx)(jF,{path:`/admin/agents`,icon:(0,Z.jsx)(ri,{className:`w-5 h-5`}),label:`All Agents`}),(0,Z.jsx)(jF,{path:`/admin/roles`,icon:(0,Z.jsx)(Ma,{className:`w-5 h-5`}),label:`All Roles`})]})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-1 py-2 shrink-0`,children:[(0,Z.jsx)(`div`,{className:`w-6 h-px bg-border mb-2`}),(0,Z.jsx)(SF,{}),(0,Z.jsxs)(wF,{children:[(0,Z.jsx)(TF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,onClick:u,"aria-label":r.t1Open?`Close toolbox`:`Open toolbox`,className:K(`flex items-center justify-center w-10 h-10 rounded-lg transition-colors`,r.t1Open?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`),children:(0,Z.jsx)(Pr,{className:`w-5 h-5`})})}),(0,Z.jsx)(EF,{side:`right`,sideOffset:8,children:`Toolbox`})]}),!l.local&&(0,Z.jsx)(jF,{path:`/settings`,section:`settings`,icon:(0,Z.jsx)(Wi,{className:`w-5 h-5`}),label:`Settings`}),(0,Z.jsxs)(wF,{children:[(0,Z.jsx)(TF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":e.user?.email?`Profile: ${e.user.email}`:`Profile`,onClick:()=>o(`/home`),className:`flex items-center justify-center w-10 h-10 rounded-lg hover:bg-accent/50 transition-colors`,children:(0,Z.jsx)(DF,{className:`h-7 w-7 touch-target`,children:(0,Z.jsx)(kF,{className:`text-[10px] bg-muted`,children:e.user?.email?(e=>e.split(`@`)[0].split(`.`).map(e=>e.charAt(0).toUpperCase()).join(``).slice(0,2))(e.user.email):`U`})})})}),(0,Z.jsx)(EF,{side:`right`,sideOffset:8,children:e.user?.email?.split(`@`)[0]||`Profile`})]}),(0,Z.jsxs)(wF,{children:[(0,Z.jsx)(TF,{asChild:!0,children:(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Log out`,onClick:d,className:`flex items-center justify-center w-10 h-10 rounded-lg text-destructive hover:bg-destructive/10 transition-colors`,children:(0,Z.jsx)(wa,{className:`w-5 h-5`})})}),(0,Z.jsx)(EF,{side:`right`,sideOffset:8,children:`Logout`})]})]})]})]})}var PF=220,FF=560;function IF({width:e,onResize:t,onDragging:n}){let r=(0,X.useRef)(null),i=e=>t(Math.min(FF,Math.max(PF,e))),a=()=>{r.current=null,n?.(!1)};return(0,Z.jsx)(`div`,{role:`separator`,"aria-label":`Resize menu`,"aria-orientation":`vertical`,"aria-valuemin":PF,"aria-valuemax":FF,"aria-valuenow":e,tabIndex:0,title:`Drag to resize; use arrow keys to adjust; Home resets width`,className:`absolute inset-y-0 right-0 z-30 flex w-3 touch-none select-none cursor-col-resize items-center justify-center hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:outline-none [@media(pointer:coarse)]:w-6`,onPointerDown:t=>{t.button!==0||r.current||(t.preventDefault(),t.stopPropagation(),r.current={id:t.pointerId,x:t.clientX,width:e},t.currentTarget.setPointerCapture(t.pointerId),n?.(!0))},onPointerMove:e=>{r.current?.id===e.pointerId&&i(r.current.width+e.clientX-r.current.x)},onPointerUp:e=>{r.current?.id===e.pointerId&&(a(),e.currentTarget.hasPointerCapture(e.pointerId)&&e.currentTarget.releasePointerCapture(e.pointerId))},onPointerCancel:a,onLostPointerCapture:a,onDoubleClick:()=>i(280),onKeyDown:t=>{[`ArrowLeft`,`ArrowRight`,`Home`].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),i(t.key===`Home`?280:e+(t.key===`ArrowRight`?1:-1)*(t.shiftKey?64:16)))},children:(0,Z.jsx)(`span`,{"aria-hidden":!0,className:`h-10 w-1 rounded-full bg-border`})})}function LF(e,t,n,r=!0){let i=De(),a=vn(),o=(0,X.useRef)(null);(0,X.useLayoutEffect)(()=>{let s=window.history.state?.idx??0,c=o.current,l=a.state?.canvasMenuBack||!!c&&(s<c.index||s===c.index&&c.backwards);if(o.current={active:t,viewKey:n,index:s,backwards:l},!r||!i||!t||!c||c.active&&c.viewKey===n)return;let u=e.current;if(!u||window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let d=Number.parseFloat(getComputedStyle(u).getPropertyValue(`--motion-scale`)),f=Number.isFinite(d)?Math.max(0,d):1,p=u.animate([{transform:`translateX(${l?`-100%`:`100%`})`},{transform:`translateX(0)`}],{duration:70*f,easing:`cubic-bezier(0.2, 0, 0, 1)`});return()=>p.cancel()},[r,i,t,n,a.key,a.state,e])}function RF(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),a=(0,X.useRef)(!1),o=(0,X.useRef)(!1),s=(0,X.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await ml();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch contexts:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,X.useRef)(s);(0,X.useEffect)(()=>{c.current=s});let l=(0,X.useCallback)(()=>{a.current=!1,s()},[s]);return(0,X.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,X.useEffect)(()=>{if(!e)return;let t=()=>B.emit(`subscribe`,{channel:`context`}),r=()=>B.emit(`unsubscribe`,{channel:`context`}),i=B.on(`connect`,()=>{t(),s()});t();let o=e=>{let t=e;!t?.id||!t?.userId||n(e=>e.some(e=>e.id===t.id&&e.userId===t.userId)?e:[...e,t])},l=e=>{let t=e;!t?.id||!t?.userId||n(e=>e.map(e=>e.id===t.id&&e.userId===t.userId?{...e,...t}:e))},u=e=>{let t=e,r=t?.contextId??t?.id;r&&n(e=>e.filter(e=>e.id!==r))},d=e=>{let t=e;!t?.id||!t?.userId||n(e=>e.map(e=>e.id===t.id&&e.userId===t.userId?{...e,...t}:e))},f=()=>{a.current=!1,c.current()},p=[[`context:created`,o],[`context.created`,o],[`context:updated`,l],[`context.updated`,l],[`context:deleted`,u],[`context.deleted`,u],[`context:url:changed`,d],[`context.url.set`,d],[`context:url:set`,d],[`workspace:status:changed`,f],[`workspace.status.changed`,f]];return p.forEach(([e,t])=>B.on(e,t)),()=>{r(),i?.(),p.forEach(([e,t])=>B.off(e,t))}},[e,s]),(0,X.useEffect)(()=>{let e=e=>{let t=e.detail;n(e=>e.filter(e=>!il(e,t)))};return window.addEventListener(ll,e),()=>window.removeEventListener(ll,e)},[]),(0,X.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`contexts:refresh`,e),()=>window.removeEventListener(`contexts:refresh`,e)},[s]),{contexts:(0,X.useMemo)(()=>Pw(t),[t]),isLoading:r,refresh:l}}function zF(){let{state:e,selectEntity:t,openM2:n,closeM2:r}=qC(),i=De(),{contexts:a,isLoading:o}=RF(e.activeSection===`contexts`),{showToast:s}=wo(),c=ft(),[l,u]=(0,X.useState)(null),d=l&&l.base===a?l.order:a,p=e=>e.isShared===!0||e.type===`shared`,{rowProps:m,handleProps:h,draggingIndex:g,insertLineClass:_}=Lw((e,t)=>{let n=Fw(d,e,t);u({base:a,order:n}),Iw(n,(e,t)=>p(e)?Promise.resolve():xl(e.id,{order:t})).then(({failed:e})=>{window.dispatchEvent(new CustomEvent(`contexts:refresh`)),e&&s({title:`Partial reorder`,description:`${e} context(s) could not be reordered`,variant:`destructive`})})}),v=e=>{t(e.id),c(`/contexts/${e.id}`)};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Contexts`})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{r(),c(`/contexts?create=1`)},title:`Create context`,"aria-label":`Create context`,className:`flex items-center justify-center w-6 h-6 rounded-full bg-foreground text-background hover:opacity-80 transition-opacity`,children:(0,Z.jsx)(br,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:o&&a.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):a.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No contexts found`}):(0,Z.jsx)(`div`,{className:`space-y-1.5 px-2`,children:d.map((r,a)=>{let o=e.selectedEntityId===r.id,s=p(r),l=r.workspaceActive!==!1,u=Jt(r.color);return(0,Z.jsxs)(`div`,{...m(a),"data-active":o||void 0,className:K(`group relative rounded-(--card-radius) py-2.5 pl-3 pr-7 transition-all shadow-elevation-1`,l?`cursor-pointer hover:shadow `+(o?`bg-accent shadow`:`bg-card hover:bg-accent/50`):`cursor-not-allowed opacity-50 bg-card`,_(a,d.length),g===a&&`opacity-60`),onClick:()=>l&&v(r),title:l?void 0:`Workspace "${r.workspaceName}" is not active`,children:[s?(0,Z.jsx)(`div`,{className:K(`absolute inset-y-0 right-0 w-4 rounded-r-(--card-radius)`,!u&&`bg-muted`),style:u?{backgroundColor:u}:void 0}):(0,Z.jsx)(`button`,{type:`button`,...h(a),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:K(`absolute inset-y-0 right-0 flex w-4 cursor-grab items-center justify-center rounded-r-(--card-radius) active:cursor-grabbing`,!u&&`bg-muted`),style:u?{backgroundColor:u}:void 0,children:(0,Z.jsx)(Un,{className:K(`h-3.5 w-3.5`,tt(u))})}),(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(f,{icon:r.icon||`ph:stack-fill`,width:16,height:16,color:u,className:K(`mt-0.5 shrink-0`,!u&&`text-muted-foreground`)}),(0,Z.jsx)(`span`,{className:`text-sm font-medium truncate flex-1`,children:r.name||r.id}),s&&(0,Z.jsx)(`span`,{className:`rounded-full bg-info/10 px-1.5 py-0.5 text-[9px] text-info shrink-0`,children:`Shared`}),l&&(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),t(r.id),n(`detail`,r.id)},className:`reveal-on-hover shrink-0 mt-0.5`,title:`Switch context URL`,children:(0,Z.jsx)(Ri,{className:`w-3.5 h-3.5 text-muted-foreground hover:text-foreground`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),t(r.id),i?n(`settings`,r.id):c(`/contexts/${r.id}/settings/general`)},className:`reveal-on-hover shrink-0 mt-0.5`,title:`Settings`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5 text-muted-foreground hover:text-foreground`})})]}),r.name&&(0,Z.jsx)(`div`,{className:`text-[10px] text-muted-foreground/60 truncate font-mono`,children:r.id}),(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5`,children:r.url||`/`}),r.ownerEmail&&(0,Z.jsx)(`div`,{className:`text-[10px] text-muted-foreground truncate mt-0.5`,children:r.ownerEmail})]},`${r.userId||`u`}-${r.id}`)})})})]})}function BF({title:e,onBack:t,action:n,className:r,icon:i,accentColor:a}){let{closeM1:o}=qC(),s=Jt(a);return(0,Z.jsxs)(`div`,{className:K(`flex items-center h-12 px-2 border-b border-border shrink-0 gap-1`,r),style:{borderBottomWidth:4,...s?{borderBottomColor:s}:{}},children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:t,className:`flex items-center gap-0.5 h-8 rounded px-1 hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors flex-1 min-w-0`,title:`Back`,"aria-label":`Back to previous view`,children:[(0,Z.jsx)(Wn,{className:`w-4 h-4 shrink-0`}),i&&(0,Z.jsx)(f,{icon:i,width:16,height:16,color:s,className:K(`mr-1 shrink-0`,!s&&`text-muted-foreground`)}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold truncate`,children:e})]}),n&&(0,Z.jsx)(`div`,{className:`shrink-0`,children:n}),(0,Z.jsx)(`button`,{type:`button`,onClick:o,className:`flex h-8 w-8 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Close menu`,"aria-label":`Close menu`,children:(0,Z.jsx)(vr,{className:`w-4 h-4`})})]})}function VF(e,t,n){let r=e.indexOf(n);if(r<0)return new Set;let i=t===null?-1:e.indexOf(t);return new Set(i<0?[n]:e.slice(Math.min(i,r),Math.max(i,r)+1))}function HF(e){let t=[...e];return t.filter(e=>!t.some(t=>t!==e&&e.startsWith(`${t}/`)))}var UF=22,WF=44,GF=4;function KF(e,t){if(!t)return null;let n=String(e||``).split(`/`).filter(Boolean);return n[0]===`workspace`&&n[1]===`git`?null:n[0]===`workspace`&&n.length>=2?{address:`workspace:${n[1]}`,key:n.slice(2).join(`/`)}:n[0]===`device`&&n.length>=3?{address:n[2],key:n.slice(3).join(`/`)}:n[0]===`file`&&n.length>=2?{address:n[1],key:n.slice(2).join(`/`)}:null}function qF(e,t){return!t||Hs(e)!==null}var JF=e=>Array.from(e.dataTransfer.types).includes(`application/json`);function YF(e,t){if(!t)return null;let n=String(e||``).split(`/`).filter(Boolean);return n[0]===`workspace`&&n[1]===`git`?n[2]||null:n[0]===`workspace`&&n.length>=2?`workspace:${n[1]}`:n[0]===`device`?n.length>=3?n[2]:null:n.length>=2?n[1]:null}function XF({x:e,y:t,node:n,path:r,isBackendsTree:i,isDirectoryTree:a,backends:o,onClose:s,onShowContent:c,onOpenToSide:l,sourceLayer:u,targetLayers:d,clipboard:f,onStartInlineCreate:p,onChangeIcon:m,onNewCanvas:h,onShareCanvas:g,onRemove:_,onRename:v,onExportSubtree:y,onImportSubtree:b,onImportDocuments:x,onExportDocuments:S,onLock:C,onUnlock:w,onDestroy:T,onMerge:E,onSubtract:D,onMergeDown:O,onSubtractDown:k,onResyncBackend:A,canResyncBackend:j,onAddRule:M,onAddStoreRule:N,onStoragePolicy:P,onRenameBackendFolder:ee,onDeleteBackendFolder:F,onRestoreTrash:I,onDiscardTrash:te,onCopy:L,onCut:R,onPaste:ne,pastedDocumentIds:re,onPasteDocuments:ie,isPinned:ae,onTogglePin:z}){let oe=u&&d.size>0&&u.path===r,se=!i&&(O||k)&&r!==`/`&&n.type!==`canvas`&&r.split(`/`).filter(Boolean).length>1,B=u&&d.size>0&&(u.path===r||d.has(r)),ce=async e=>{s();try{await e()}catch(e){alert(e instanceof Error?e.message:String(e))}},V=(e,t,n,r=!1)=>(0,Z.jsxs)(`button`,{type:`button`,className:K(`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,r&&`text-destructive hover:bg-destructive/10`),onClick:()=>ce(n),children:[e,t]});return i&&n.metadata?.backendTrash?(0,Z.jsxs)(Dn,{x:e,y:t,onClose:s,className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[c&&V((0,Z.jsx)(Qr,{className:`h-3 w-3`}),`Open Trash`,async()=>c(r)),r!==`/Trash`&&I&&V((0,Z.jsx)(Vr,{className:`h-3 w-3`}),`Restore original paths`,()=>I(r)),r!==`/Trash`&&te&&V((0,Z.jsx)(Qr,{className:`h-3 w-3`}),`Empty Trash`,()=>te(r),!0)]}):(0,Z.jsxs)(Dn,{x:e,y:t,onClose:s,className:`min-w-[11rem] rounded-md border bg-popover p-1 shadow-elevation-3`,children:[c&&V((0,Z.jsx)(ja,{className:`w-3 h-3`}),`Show layer content`,async()=>{c(r,n.id||void 0)}),l&&V((0,Z.jsx)(ja,{className:`w-3 h-3`}),`Open to the side`,async()=>{l(r)}),(c||l)&&(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),n.type===`canvas`&&g&&V((0,Z.jsx)(aa,{className:`w-3 h-3`}),`Share canvas`,async()=>{await g(r)}),n.type===`canvas`&&g&&(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),A&&(j?.(r)??!!YF(r,i))&&(0,Z.jsxs)(Z.Fragment,{children:[V((0,Z.jsx)(Er,{className:`w-3 h-3`}),`Refresh backend`,async()=>{await A(r)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),i&&YF(r,i)&&(M||N)&&(0,Z.jsxs)(Z.Fragment,{children:[M&&V((0,Z.jsx)(_a,{className:`w-3 h-3`}),`Auto-Link documents to…`,async()=>{M(r)}),N&&KF(r,i)&&V((0,Z.jsx)(Fr,{className:`w-3 h-3`}),`Create storage rule…`,async()=>{N(r)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),!i&&(N||P)&&r!==`/`&&(0,Z.jsxs)(Z.Fragment,{children:[N&&V((0,Z.jsx)(Fr,{className:`w-3 h-3`}),`Create rule…`,async()=>{N(r)}),N&&V((0,Z.jsx)(zi,{className:`w-3 h-3`}),`Create download rule…`,async()=>{N(r,`download`)}),P&&n.type!==`canvas`&&V((0,Z.jsx)(gr,{className:`w-3 h-3`}),`Storage policy…`,async()=>{P(r)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`})]}),(!i||KF(r,i))&&(0,Z.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,onClick:()=>{p(r),s()},children:[(0,Z.jsx)(br,{className:`w-3 h-3`}),`New folder here`]}),ee&&KF(r,i)?.key&&V((0,Z.jsx)(Za,{className:`w-3 h-3`}),`Rename folder`,async()=>{let e=r.split(`/`).pop()||``,t=prompt(`New folder name:`,e);!t||t===e||await ee(r,t)}),F&&i&&Dc(r,o)&&V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Delete from backend`,async()=>{confirm(`Delete folder "${r.split(`/`).pop()}" and its contents from the backend?`)&&await F(r)},!0),h&&!i&&(0,Z.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,onClick:()=>{h(r),s()},children:[(0,Z.jsx)(Pa,{className:`w-3 h-3 text-primary`}),`New canvas here…`]}),r!==`/`&&z&&V(ae?(0,Z.jsx)(ur,{className:`w-3 h-3`}):(0,Z.jsx)(tr,{className:`w-3 h-3`}),ae?`Unpin`:`Pin`,async()=>{await z()}),r!==`/`&&m&&(0,Z.jsxs)(`button`,{type:`button`,className:`flex items-center gap-2 w-full px-3 py-1.5 text-xs hover:bg-accent rounded-sm text-left`,onClick:()=>{m(),s()},children:[(0,Z.jsx)(Wr,{className:`w-3 h-3`}),`Change icon`]}),r!==`/`&&!n.locked&&v&&!i&&V((0,Z.jsx)(Za,{className:`w-3 h-3`}),`Rename`,async()=>{let e=r.split(`/`).pop()||``,t=prompt(`New name:`,e);!t||t===e||await v(r,t)}),(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),V((0,Z.jsx)(Jn,{className:`w-3 h-3`}),`Copy`,async()=>L(r)),!i&&V((0,Z.jsx)(Ua,{className:`w-3 h-3`}),`Cut`,async()=>R(r)),f&&!i&&V((0,Z.jsx)(Tr,{className:`w-3 h-3`}),`Paste (${f.mode})`,async()=>ne(r)),re&&re.length>0&&ie&&qF(r,i)&&V((0,Z.jsx)(Tr,{className:`w-3 h-3`}),i?`Move ${re.length} message(s) here`:`Paste ${re.length} document(s)`,async()=>{await ie(r,re)}),x&&V((0,Z.jsx)(rr,{className:`w-3 h-3`}),`Import documents…`,()=>x(r)),S&&V((0,Z.jsx)(zi,{className:`w-3 h-3`}),`Export documents…`,()=>S(r)),(y||b)&&(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),y&&n.type!==`canvas`&&V((0,Z.jsx)(zi,{className:`w-3 h-3`}),`Export subtree…`,()=>y(r)),b&&!i&&n.type!==`canvas`&&V((0,Z.jsx)(rr,{className:`w-3 h-3`}),`Import subtree here…`,()=>b(r)),!i&&r!==`/`&&!n.locked&&_&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Remove`,async()=>{confirm(`Remove "${r}"${a?` and all children`:``}?`)&&await _(r,a)},!0),!a&&V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Remove recursive`,async()=>{confirm(`Remove "${r}" and all children?`)&&await _(r,!0)},!0)]}),!i&&(C||w||T)&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),n.locked?w&&V((0,Z.jsx)(ea,{className:`w-3 h-3`}),`Unlock layer`,async()=>{await w(n.id)}):C&&V((0,Z.jsx)(Si,{className:`w-3 h-3`}),`Lock layer`,async()=>{await C(n.id)}),n.locked&&n.lockedBy&&n.lockedBy.length>0&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`px-3 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground`,children:`Locked by`}),n.lockedBy.map(e=>(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3 py-1 text-xs`,children:[(0,Z.jsx)(`span`,{className:`truncate`,title:e,children:e}),w&&(0,Z.jsx)(`button`,{type:`button`,title:`Remove lock held by ${e}`,className:`shrink-0 text-muted-foreground hover:text-destructive`,onClick:()=>ce(async()=>{await w(n.id,e)}),children:(0,Z.jsx)(ea,{className:`w-3 h-3`})})]},e))]}),r!==`/`&&!n.locked&&T&&V((0,Z.jsx)(Qr,{className:`w-3 h-3`}),`Destroy layer`,async()=>{confirm(`Permanently destroy layer "${n.label||n.name}" and its bitmap?`)&&await T(n.id)},!0)]}),se&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),O&&V((0,Z.jsx)(fa,{className:`w-3 h-3`}),`Merge down (into ancestors)`,async()=>{confirm(`Merge "${n.label||n.name}" into every layer above it on\n${r}\n\nAfter this, ${r} lists its documents.`)&&await O(r)}),k&&V((0,Z.jsx)(Ca,{className:`w-3 h-3`}),`Subtract from ancestors`,async()=>{confirm(`Remove "${n.label||n.name}"'s documents from every layer above it on\n${r}\n\nUndo of "Merge down". Documents an ancestor holds for other reasons are removed from it too.`)&&await k(r)})]}),oe&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),E&&V((0,Z.jsx)(vi,{className:`w-3 h-3`}),`Merge this layer into ${d.size} selected`,async()=>{confirm(`Merge "${r}" (source) INTO:\n${Array.from(d.keys()).join(`
|
|
54
54
|
`)}\n\nThe selected layers gain this layer's documents. This layer is unchanged.`)&&await E(n.id,Array.from(d.values()))}),D&&V((0,Z.jsx)(vi,{className:`w-3 h-3`}),`Subtract this layer from ${d.size} selected`,async()=>{confirm(`Subtract "${r}" (source) FROM:\n${Array.from(d.keys()).join(`
|
|
55
|
-
`)}\n\nThe selected layers lose this layer's documents. This layer is unchanged.`)&&await D(n.id,Array.from(d.values()))})]}),B&&!oe&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,Z.jsxs)(`div`,{className:`px-3 py-1.5 text-[10px] text-muted-foreground italic`,children:[`This is a target. Right-click the source (`,u?.path,`) to merge/subtract`]})]})]})}function JF({onConfirm:e,onCancel:t,placeholder:n=`folder name…`}){let r=(0,X.useRef)(null);(0,X.useEffect)(()=>{r.current?.focus()},[]);let i=()=>{let n=r.current?.value.trim()??``;n?e(n):t()};return(0,Z.jsxs)(`div`,{className:`flex min-h-11 items-center gap-2 rounded-(--card-radius) px-3 py-2.5 bg-card ring-1 ring-primary/50 shadow-elevation-3 text-sm font-medium`,children:[(0,Z.jsx)(Xa,{className:`w-4 h-4 opacity-0 shrink-0`}),(0,Z.jsx)(`input`,{ref:r,className:`flex-1 bg-transparent outline-none min-w-0 text-sm font-medium placeholder:font-normal placeholder:text-muted-foreground`,placeholder:n,onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),i()),e.key===`Escape`&&t()},onBlur:i})]})}function YF(e,t){return e===`/`?`/${t}`:`${e}/${t}`}function XF(e,t,n){let r=YF(t,e.name);return r.toLowerCase().includes(n)||(e.label||``).toLowerCase().includes(n)?!0:e.children?.some(e=>XF(e,r,n))??!1}function ZF({expansionState:e,node:t,parentPath:n,depth:r,isLast:i,selectedPath:a,pendingPath:o,contentPath:s,readOnly:c,sourceLayer:l,targetLayers:u,clipboard:d,searchQuery:p,inlineCreateParent:m,onSelect:h,onAltSelect:g,selectedPaths:_,onRangeSelect:v,onShowContent:y,onCtrl:b,onCtxMenu:x,onConfirmCreate:S,onCancelCreate:C,onOpenPicker:w,styleOverrides:T,dragOverPath:E,isCopyDrag:D,onDragStart:O,onDragEnter:k,onDragOver:A,onDragLeave:j,onDragEnd:M,onDrop:N,resyncingPaths:P,policyBadgeFor:ee,removingPaths:F,accordion:I=!1,trail:te=[]}){let L=Ke(),R=YF(n,t.name),ne=ee?.(R)??null,re=T.get(R)??Qt(t),[ie,ae]=(0,X.useState)(()=>e?.get(t.id||R)??(a!==`/`&&(a===R||a.startsWith(R+`/`)))),[z,oe]=(0,X.useState)(a);if(z!==a&&(oe(a),a!==`/`&&a.startsWith(R+`/`)&&ae(!0)),(0,X.useEffect)(()=>{e?.set(t.id||R,ie)},[e,t.id,R,ie]),p&&!XF(t,n,p))return null;let se=ie||m===R||p.length>0,B=t.children&&t.children.length>0,ce=a===R||_.has(R),V=o===R,le=l?.path===R,ue=u.has(R),de=t.type===`canvas`,fe=e=>{if(e.shiftKey){v(R,e);return}if(e.ctrlKey||e.metaKey){b(R,t.id);return}if(e.altKey&&g){g(R);return}h(R)},pe=e=>{!B||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||e.target.closest(`button, input, textarea, select, a, [contenteditable="true"]`)||(e.preventDefault(),e.stopPropagation(),ae(e=>!e))},me=[...te].reverse().find(Boolean)??null,he=re.color||me,ge=I?[...te,he]:te,_e=a!==`/`&&a.startsWith(R+`/`),ve=!le&&!ue,ye=ve&&ce,be=(e,t)=>`color-mix(in oklab, ${e} ${t}%, var(--card))`,xe=e=>`color-mix(in oklab, currentColor ${e}%, transparent)`,H=Math.min(r,5),Se=se&&!!B,Ce=ve&&!ye&&!t.locked&&Se,U=Math.min(3+H*2+(_e?4:0)+(V?3:0),18),W=ye?`var(--primary)`:le?be(`var(--info)`,12):ue?be(`var(--warning)`,12):Ce?`var(--accent)`:be(`var(--muted-foreground)`,U),we=ye?`text-primary-foreground`:Ce?`text-accent-foreground`:`text-foreground`,Te=I&&se&&B&&r<HF,Ee=(0,Z.jsxs)(`div`,{"data-tree-path":R,"data-selected":_.has(R)||void 0,"data-active":ce||void 0,className:K(`group relative flex cursor-pointer select-none items-stretch overflow-hidden text-sm`,`after:pointer-events-none after:absolute after:inset-0 after:bg-foreground/0 after:transition-colors hover:after:bg-foreground/[0.07]`,we,le&&`ring-1 ring-inset ring-info/40`,ue&&!le&&`ring-1 ring-inset ring-warning/40`,E===R&&!c&&!D&&`ring-2 ring-inset ring-info`,E===R&&!c&&D&&`ring-2 ring-inset ring-success`),style:{height:VF,background:W,borderBottom:`1px solid var(--border)`,...Te?{position:`sticky`,top:r*VF,zIndex:20-r}:{}},draggable:!c&&!t.metadata?.backendTrash,onClick:fe,onDoubleClick:pe,...c?{}:L,onContextMenu:e=>{c||(e.preventDefault(),x(e,R,t))},onDragStart:e=>{c||O(R,e)},onDragEnter:e=>{c||k(R,e)},onDragOver:e=>{c||A(R,e)},onDragLeave:e=>j(R,e),onDragEnd:()=>M(),onDrop:e=>{c||N(R,e)},children:[te.length>0&&(0,Z.jsx)(`span`,{className:`flex shrink-0 gap-px`,"aria-hidden":!0,children:te.map((e,t)=>(0,Z.jsx)(`span`,{className:`w-[3px]`,style:{background:e?`color-mix(in oklab, ${e} 35%, var(--border))`:`var(--border)`}},t))}),(()=>{let e=re.color?{background:re.color}:me?{background:`color-mix(in oklab, ${me} 45%, transparent)`}:{background:xe(10)},n=(0,Z.jsx)(f,{icon:re.icon||(de?`ph:squares-four-fill`:`ph:folder-fill`),width:18,height:18,className:K(`shrink-0`,re.color?tt(re.color):ye?`text-primary-foreground`:Ce?`text-current`:`text-foreground/80`)}),r=`flex w-10 shrink-0 items-center justify-center`;return w?(0,Z.jsx)(`button`,{type:`button`,className:r,style:e,title:`Change icon`,onClick:e=>{to()||(e.stopPropagation(),w(e,R,t))},onContextMenu:e=>{e.preventDefault(),e.stopPropagation(),w(e,R,t)},children:n}):(0,Z.jsx)(`span`,{className:r,style:e,children:n})})(),(0,Z.jsx)(`span`,{className:K(`min-w-0 flex-1 self-center truncate px-2.5`,ce||_e||Se?`font-semibold`:`font-medium`),title:t.description||void 0,children:t.label||t.name}),F.has(R)&&(0,Z.jsx)(Er,{className:`mr-1 h-3.5 w-3.5 shrink-0 animate-spin self-center`,"aria-label":F.get(R)}),P?.has(R)&&(0,Z.jsx)(Er,{className:`mr-1 h-3.5 w-3.5 shrink-0 animate-spin self-center opacity-70`,"aria-label":`Indexing`}),ne&&(0,Z.jsx)(gr,{className:`mr-1 h-3 w-3 shrink-0 self-center text-muted-foreground`,"aria-label":ne,children:(0,Z.jsx)(`title`,{children:ne})}),!c&&(0,Z.jsx)(`button`,{type:`button`,className:`reveal-on-hover shrink-0 self-center rounded p-1 hover:bg-foreground/10`,onClick:e=>{e.stopPropagation(),x(e,R,t)},children:(0,Z.jsx)(ia,{className:`h-4 w-4`})}),(0,Z.jsx)(`button`,{type:`button`,className:K(`relative z-[1] flex w-12 shrink-0 cursor-pointer items-center justify-center transition-colors`,`bg-[color-mix(in_oklab,currentColor_9%,transparent)] hover:bg-[color-mix(in_oklab,currentColor_24%,transparent)] active:bg-[color-mix(in_oklab,currentColor_32%,transparent)]`,!B&&m!==R&&`invisible`),style:{borderLeft:`1px solid ${xe(16)}`},"aria-label":se?`Collapse`:`Expand`,"aria-expanded":se,title:se?`Collapse`:`Expand`,onClick:e=>{e.stopPropagation(),ae(e=>!e)},children:se?(0,Z.jsx)(qr,{className:`h-5 w-5`,strokeWidth:2.25}):(0,Z.jsx)(Xa,{className:`h-5 w-5`,strokeWidth:2.25})})]});return(0,Z.jsxs)(`div`,{className:`relative`,children:[I?Ee:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`pointer-events-none absolute top-0 w-px bg-border`,style:{left:`-${BF/2}px`,...i?{height:`1.375rem`}:{bottom:0}}}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute top-[1.375rem] h-px bg-border`,style:{left:`-${BF/2}px`,width:`${BF/2}px`}}),(0,Z.jsxs)(`div`,{"data-tree-path":R,"data-selected":_.has(R)||void 0,"data-active":ce||void 0,className:K(`group relative flex min-h-11 items-center gap-2 rounded-(--card-radius) px-3 py-2.5 cursor-pointer transition-all select-none overflow-hidden`,`shadow-elevation-3 hover:shadow-elevation-4 text-sm`,`before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1.5 before:transition-colors`,le&&`ring-1 ring-info/40 bg-info/10 before:bg-info`,ue&&!le&&`ring-1 ring-warning/40 bg-warning/10 before:bg-warning`,!le&&!ue&&ce&&!t.locked&&`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`,!le&&!ue&&ce&&t.locked&&`bg-warning/15 hover:bg-warning/20 before:bg-primary`,!le&&!ue&&!ce&&V&&`bg-primary/[0.03] before:bg-transparent`,!le&&!ue&&!ce&&!V&&!t.locked&&`bg-card hover:bg-primary/[0.04] before:bg-transparent`,!le&&!ue&&!ce&&t.locked&&`bg-warning/15 hover:bg-warning/20 before:bg-warning`,E===R&&!c&&!D&&`ring-2 ring-info bg-info-subtle/50`,E===R&&!c&&D&&`ring-2 ring-success bg-success-subtle/50`),style:{borderRight:re.color?`4px solid ${re.color}`:`4px solid transparent`},draggable:!c&&!t.metadata?.backendTrash,onClick:fe,onDoubleClick:pe,...c?{}:L,onContextMenu:e=>{c||(e.preventDefault(),x(e,R,t))},onDragStart:e=>{c||O(R,e)},onDragEnter:e=>{c||k(R,e)},onDragOver:e=>{c||A(R,e)},onDragLeave:e=>j(R,e),onDragEnd:()=>M(),onDrop:e=>{c||N(R,e)},children:[(0,Z.jsx)(`button`,{type:`button`,className:K(`shrink-0 text-muted-foreground hover:text-foreground`,!B&&m!==R&&`invisible`),"aria-label":se?`Collapse`:`Expand`,"aria-expanded":se,onClick:e=>{e.stopPropagation(),ae(e=>!e)},children:se?(0,Z.jsx)(qr,{className:`w-4 h-4`}):(0,Z.jsx)(Xa,{className:`w-4 h-4`})}),(()=>{let e=(0,Z.jsx)(f,{icon:re.icon||(de?`ph:squares-four-fill`:`ph:folder-fill`),width:16,height:16,color:re.color||void 0,className:K(`shrink-0`,!re.color&&(de?`text-primary`:`text-muted-foreground`))});return w?(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 rounded p-0.5 -m-0.5 hover:bg-muted-foreground/10 touch-target`,title:`Change icon`,onClick:e=>{to()||(e.stopPropagation(),w(e,R,t))},onContextMenu:e=>{e.preventDefault(),e.stopPropagation(),w(e,R,t)},children:e}):e})(),(0,Z.jsx)(`span`,{className:`flex-1 truncate font-medium`,title:t.description||void 0,children:t.label||t.name}),F.has(R)&&(0,Z.jsx)(Er,{className:`h-3.5 w-3.5 shrink-0 animate-spin`,"aria-label":F.get(R)}),P?.has(R)&&(0,Z.jsx)(Er,{className:`w-3.5 h-3.5 shrink-0 animate-spin text-muted-foreground`,"aria-label":`Indexing`}),ne&&(0,Z.jsx)(gr,{className:`w-3 h-3 shrink-0 text-muted-foreground`,"aria-label":ne,children:(0,Z.jsx)(`title`,{children:ne})}),!c&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 reveal-on-hover p-1 rounded hover:bg-muted-foreground/10 text-muted-foreground`,onClick:e=>{e.stopPropagation(),x(e,R,t)},children:(0,Z.jsx)(ia,{className:`w-4 h-4`})})]})]}),se&&(B||m===R)&&(0,Z.jsxs)(`div`,{className:I?void 0:`ml-[22px] mt-2 mb-1 space-y-1.5`,children:[m===R&&(0,Z.jsx)(JF,{onConfirm:e=>S(R,e),onCancel:C}),t.children?.map((n,i)=>(0,Z.jsx)(ZF,{node:n,expansionState:e,parentPath:R,depth:r+1,isLast:i===(t.children?.length??0)-1,selectedPath:a,pendingPath:o,contentPath:s,readOnly:c,sourceLayer:l,targetLayers:u,clipboard:d,searchQuery:p,inlineCreateParent:m,onSelect:h,onAltSelect:g,selectedPaths:_,onRangeSelect:v,onShowContent:y,onCtrl:b,onCtxMenu:x,onConfirmCreate:S,onCancelCreate:C,onOpenPicker:w,styleOverrides:T,dragOverPath:E,isCopyDrag:D,onDragStart:O,onDragEnter:k,onDragOver:A,onDragLeave:j,onDragEnd:M,onDrop:N,resyncingPaths:P,policyBadgeFor:ee,removingPaths:F,accordion:I,trail:ge},n.id||n.name))]})]})}function QF({root:e,expansionState:t,workspaceId:n,treeName:r=`context`,isBackendsTree:i=!1,onRestoreTrash:a,onDiscardTrash:o,selectedPath:s,pendingPath:c,onSelect:l,isLoading:u=!1,readOnly:d=!1,onAddRule:f,onAddStoreRule:p,onStoragePolicy:m,policyBadgeFor:h,rootLabel:g,contentPath:_,onShowContent:v,onOpenToSide:y,onAltSelect:b,onInsertPath:x,onNewCanvas:S,onShareCanvas:C,onRemovePath:w,onRenamePath:T,onMovePath:E,onCopyPath:D,onExportSubtree:O,onImportSubtree:k,onImportDocuments:A,onExportDocuments:j,pastedDocumentIds:M,onPasteDocuments:N,onLockLayer:P,onUnlockLayer:ee,onDestroyLayer:F,onMergeLayer:I,onSubtractLayer:te,onMergeDown:L,onSubtractDown:R,onResyncBackend:ne,canResyncBackend:re,onCreateBackendFolder:ie,onRenameBackendFolder:ae,onDeleteBackendFolder:z,onUpdateNode:oe,isPathPinned:se,onTogglePin:B,searchQuery:ce=``,resyncingPaths:V,backends:le}){let ue=ck(),[fe,pe]=(0,X.useState)(new Set),me=(0,X.useRef)(null),he=e=>{me.current=e,pe(new Set),l(e)},ge=(e,t)=>{t.preventDefault();let n=t.currentTarget.closest(`[data-menu-tree]`)?.querySelectorAll(`[data-tree-path]`),r=Array.from(n||[],e=>e.dataset.treePath),i=me.current||s;pe(RF(r,i,e)),me.current=r.includes(i)?i:e},[_e,ve]=(0,X.useState)(null),[ye,be]=(0,X.useState)(null),[xe,H]=(0,X.useState)(new Map),[Se,Ce]=(0,X.useState)(null),[U,W]=(0,X.useState)(new Map),we=(0,X.useRef)(new Set),Te=(0,X.useCallback)(async(e,t=!1,n=!1,a=!1)=>{if(!(i?z:w)||[...we.current].some(t=>t===e||t.startsWith(e+`/`)||e.startsWith(t+`/`)))return!1;we.current.add(e);let o=i?`Deleting from backend…`:a?`Removing documents and backend files…`:n?`Removing and purging documents…`:`Removing folder…`;W(t=>new Map(t).set(e,o));try{return i?await z(e):await w(e,r===`directory`||t,n,a)}finally{we.current.delete(e),W(t=>{let n=new Map(t);return n.delete(e),n})}},[w,z,i,r]),[Ee,De]=(0,X.useState)(null),[Oe,ke]=(0,X.useState)(new Map),[Ae,je]=(0,X.useState)(e),Me=(0,X.useRef)(new Map),Ne=(0,X.useRef)(null),[Pe,Fe]=(0,X.useState)(null);if(e!==Ae){je(e);let t=Pe;ke(t?new Map([[t.path,t.style]]):new Map)}let[Ie,Le]=(0,X.useState)(null),[Re,ze]=(0,X.useState)(null),[Be,Ve]=(0,X.useState)(!1),[He,Ue]=(0,X.useState)(!1),[We,Ge]=(0,X.useState)(!1),Ke=(0,X.useRef)(!1),G=(0,X.useRef)(null),qe=(0,X.useRef)(r),Je=(0,X.useRef)(!1),Ye=(0,X.useRef)(!1);(0,X.useEffect)(()=>{let e=e=>{ve(e.detail??null)};return window.addEventListener(`tree:path-clipboard`,e),()=>window.removeEventListener(`tree:path-clipboard`,e)},[]),(0,X.useEffect)(()=>{let e=e=>{let t=e.ctrlKey||e.altKey||Ye.current;Je.current=t,Ve(t)};return window.addEventListener(`keydown`,e),window.addEventListener(`keyup`,e),()=>{window.removeEventListener(`keydown`,e),window.removeEventListener(`keyup`,e)}},[]);let Xe=(0,X.useCallback)((e,t,n)=>{if(_t(qe.current,e)||_t(r,t))return!1;if(qe.current!==r)return!0;let i=e.endsWith(`/`)?e.slice(0,-1):e,a=t.endsWith(`/`)?t.slice(0,-1):t,o=i.substring(0,i.lastIndexOf(`/`))||`/`;return!(a.startsWith(i+`/`)||i===a||!n&&a===o)},[r]),Ze=(0,X.useCallback)((e,t)=>{if(_t(r,e)){t.preventDefault();return}G.current=e,qe.current=r,t.dataTransfer.setData(`text/plain`,e),t.dataTransfer.setData(`application/x-canvas-tree-path`,JSON.stringify({path:e,treeName:r})),t.dataTransfer.effectAllowed=`copyMove`},[r]),Qe=e=>e.ctrlKey||e.altKey||Ye.current,$e=(0,X.useCallback)((e,t)=>{if(_t(r,e))return;let n=G.current,a=Qe(t);if(a!==Je.current&&(Je.current=a,Ve(a)),n){if(!Xe(n,e,a))return}else if(GF(t)&&!WF(e,i))return;t.preventDefault(),ze(e)},[Xe,r,i]),et=(0,X.useCallback)((e,t)=>{if(_t(r,e)){t.dataTransfer.dropEffect=`none`;return}let n=Qe(t);n!==Je.current&&(Je.current=n,Ve(n));let a=G.current;if(a){if(!Xe(a,e,n)){t.dataTransfer.dropEffect=`none`;return}}else if(GF(t)&&!WF(e,i)){t.dataTransfer.dropEffect=`none`;return}t.preventDefault(),t.dataTransfer.dropEffect=n&&!i?`copy`:`move`},[Xe,r,i]),tt=(0,X.useCallback)((e,t)=>{t.currentTarget.contains(t.relatedTarget)||ze(t=>t===e?null:t)},[]),nt=(0,X.useCallback)(()=>{G.current=null,qe.current=r,Je.current=!1,Ve(!1),ze(null)},[r]),rt=(0,X.useCallback)(async(e,t)=>{if(t.preventDefault(),t.stopPropagation(),_t(r,e))return;let a=(()=>{try{return JSON.parse(t.dataTransfer.getData(`application/json`))}catch{return null}})();if(a?.type===`document`&&Array.isArray(a.documentIds)&&a.documentIds.length){if(G.current=null,Je.current=!1,Ve(!1),ze(null),de(a,n,r,e))return;if(N&&WF(e,i))try{await N(e,a.documentIds)}catch(e){alert(e instanceof Error?e.message:String(e))}return}let o=(()=>{try{return JSON.parse(t.dataTransfer.getData(`application/x-canvas-tree-path`))}catch{return null}})(),s=o?.path||t.dataTransfer.getData(`text/plain`),c=o?.treeName||qe.current||r;if(_t(c,s))return;let l=Qe(t)||Je.current;if(G.current=null,qe.current=r,Je.current=!1,Ve(!1),ze(null),!s)return;let u=t.shiftKey,d=c!==r;if(!(!d&&s===e)&&!(!d&&!Xe(s,e,l)))try{if(l&&D)await D(s,e,u,c,r);else if(!l&&E){let t=Ke.current&&!i&&!!L;await E(s,e,u,c,r,t?{mergeDown:t}:void 0)}}catch(e){alert(e instanceof Error?e.message:String(e))}},[Xe,D,E,N,n,r,i,L]),it=ce.toLowerCase().trim(),ot=(0,X.useCallback)((e,t,n)=>{e.stopPropagation(),Ce({x:e.clientX,y:e.clientY,path:t,node:n})},[]),st=(0,X.useCallback)((e,t,n)=>{e.stopPropagation(),!n.metadata?.backendTrash&&(Ne.current=null,Fe(null),De({x:e.clientX,y:e.clientY,path:t,node:n}))},[]),ct=(0,X.useCallback)(e=>{if(!Ee||!oe)return;let t=Ee.path,n={...Oe.get(t)??(Ne.current?.path===t?Ne.current.style:Qt(Ee.node)),...e};Ne.current={path:t,style:n},Fe({path:t,style:n}),ke(e=>new Map(e).set(t,n));let r=Tt(Ee.node.metadata,n),i=Me.current,a=i.get(t);a&&clearTimeout(a),i.set(t,setTimeout(()=>{i.delete(t),oe(t,{metadata:r}).catch(e=>alert(e instanceof Error?e.message:String(e)))},350))},[Ee,oe,Oe]),lt=(0,X.useCallback)((e,t)=>{ye?e===ye.path?(be(null),H(new Map)):H(n=>{let r=new Map(n);return r.has(e)?r.delete(e):r.set(e,t),r}):(be({path:e,id:t}),H(new Map))},[ye]),ut=(0,X.useCallback)(async e=>{!_e||!E||!D||_e.treeName===r&&(e===_e.path||e.startsWith(_e.path+`/`))||(_e.mode===`cut`?(await E(_e.path,e,!1,_e.treeName,r),ve(null),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:null}))):await D(_e.path,e,!0,_e.treeName,r))},[_e,E,D,r]);(0,X.useEffect)(()=>{if(d)return;let e=e=>{let t=e.target;if(t?.tagName===`INPUT`||t?.tagName===`TEXTAREA`||e.key!==`F6`)return;if(e.preventDefault(),_e?.mode===`cut`){ut(s);return}let n={mode:`cut`,path:s,treeName:r};ve(n),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:n}))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[_e,ut,d,s,r]);let dt=(0,X.useCallback)(async(e,t)=>{Le(null);let n=e===`/`?`/${t}`:`${e}/${t}`;try{UF(e,i)&&ie?await ie(e,t)&&l(n):x&&await x(n,!0)&&l(n)}catch(e){alert(e instanceof Error?e.message:String(e))}},[x,ie,l,i]),ft=(0,X.useCallback)(()=>{Le(null)},[]),pt=(0,X.useCallback)((e,t)=>{let n={mode:t,path:e,treeName:r};ve(n),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:n}))},[r]),mt=(0,X.useCallback)(t=>{if(d||An(t.target)||s&&_t(r,s))return;if(at(t,`Mod+V`)){M?.length&&N&&s&&WF(s,i)?(t.preventDefault(),N(s,M).catch(()=>{})):_e&&s&&(t.preventDefault(),ut(s).catch(e=>alert(e instanceof Error?e.message:String(e))));return}if(s&&s!==`/`&&(at(t,`Mod+C`)||!i&&at(t,`Mod+X`))){t.preventDefault(),pt(s,t.key.toLowerCase()===`x`?`cut`:`copy`);return}if((i?!z||!Dc(s||``,le):!w)||t.key!==`Delete`&&t.key!==`Backspace`||!s||s===`/`)return;t.preventDefault();let n=xs(e,s);if(!i&&n?.locked){alert(`"${s}" is locked`);return}confirm(i?`Delete "${s}" and its contents from this backend?`:`Remove "${s}"${r===`directory`?` and all children`:``}?`)&&Te(s,!1).catch(e=>alert(e instanceof Error?e.message:String(e)))},[d,w,z,Te,s,e,M,N,_e,ut,i,pt,r,le]),ht=(0,X.useCallback)(()=>{Ue(e=>{let t=!e;return Ye.current=t,Je.current=t,Ve(t),t})},[]);if(u)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading tree…`});if(!e)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`No tree available`});let gt=ye||xe.size>0,vt={expansionState:t,accordion:ue,selectedPath:s,pendingPath:c,contentPath:_,readOnly:d,sourceLayer:ye,targetLayers:xe,clipboard:_e,searchQuery:it,inlineCreateParent:Ie,onSelect:he,onAltSelect:b,selectedPaths:fe,onRangeSelect:ge,onShowContent:v,onCtrl:lt,onCtxMenu:ot,onConfirmCreate:dt,onCancelCreate:ft,onOpenPicker:oe?st:void 0,styleOverrides:Oe,dragOverPath:Re,isCopyDrag:Be,onDragStart:Ze,onDragEnter:$e,onDragOver:et,onDragLeave:tt,onDragEnd:nt,onDrop:rt,resyncingPaths:V,backends:le,policyBadgeFor:i?void 0:h,removingPaths:U};return(0,Z.jsxs)(`div`,{"data-menu-tree":!0,className:`px-3 py-2 space-y-1.5 outline-none min-h-full`,tabIndex:0,onKeyDown:mt,onContextMenu:t=>{t.defaultPrevented||d||(t.preventDefault(),ot(t,`/`,e))},children:[U.size>0&&(0,Z.jsx)(`div`,{role:`status`,"aria-live":`polite`,className:`space-y-1 rounded-md border bg-muted/50 p-2 text-xs`,children:[...U].map(([e,t])=>(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(Er,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 animate-spin`,"aria-hidden":`true`}),(0,Z.jsxs)(`span`,{className:`min-w-0`,children:[(0,Z.jsx)(`span`,{className:`block`,children:t}),(0,Z.jsx)(`span`,{className:`block truncate text-muted-foreground`,title:e,children:e})]})]},e))}),!d&&(0,Z.jsxs)(`div`,{className:`flex items-center justify-end px-1 pb-0.5 text-[10px]`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:ht,title:`Toggle drag-drop mode (or hold Ctrl / Alt while dragging)`,className:K(`px-2 py-0.5 rounded-full border transition-colors select-none`,He?`border-success bg-success/15 text-success dark:text-success`:`border-border text-muted-foreground hover:bg-muted`),children:He?`Drag → Copy`:`Drag → Move`}),L&&!i&&!He&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>Ge(e=>(Ke.current=!e,!e)),title:`When moving a layer, also merge it into its new ancestors so the new path lists its documents`,className:K(`ml-1 px-2 py-0.5 rounded-full border transition-colors select-none`,We?`border-info bg-info/15 text-info dark:text-info`:`border-border text-muted-foreground hover:bg-muted`),children:We?`+ merge down`:`merge down: off`})]}),gt&&(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-1 pb-1 text-[10px] text-muted-foreground`,children:[(0,Z.jsx)(`span`,{children:ye?`Source: ${ye.path} · ${xe.size} target(s)`:`Select source with ⌃-click`}),(0,Z.jsx)(`button`,{type:`button`,className:`hover:text-foreground underline`,onClick:()=>{be(null),H(new Map)},children:`clear`})]}),(0,Z.jsxs)(`div`,{"data-active":s===`/`&&!_||void 0,className:K(`group relative flex min-h-11 items-center gap-2 rounded-(--card-radius) px-3 py-2.5 cursor-pointer transition-all select-none`,`shadow-elevation-3 hover:shadow-elevation-4 text-sm`,s===`/`&&!_?`bg-primary/[0.06]`:`bg-card hover:bg-primary/[0.04]`,Re===`/`&&!d&&!Be&&`ring-2 ring-info bg-info-subtle/50`,Re===`/`&&!d&&Be&&`ring-2 ring-success bg-success-subtle/50`),style:{borderRight:`4px solid transparent`},onClick:()=>he(`/`),onDragEnter:e=>{d||$e(`/`,e)},onDragOver:e=>{d||et(`/`,e)},onDragLeave:e=>tt(`/`,e),onDrop:e=>{d||rt(`/`,e)},onContextMenu:e=>{!d&&x&&(e.preventDefault(),Ce({x:e.clientX,y:e.clientY,path:`/`,node:{id:``,name:`/`,label:`/`,type:`root`,description:``,color:null,locked:!1,children:[]}}))},children:[(0,Z.jsx)(qr,{className:`w-4 h-4 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`flex-1 font-medium truncate`,children:[`/ `,g&&(0,Z.jsxs)(`span`,{className:`text-muted-foreground font-normal`,children:[`[`,g,`]`]})]}),!d&&x&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 reveal-on-hover p-1 rounded hover:bg-muted-foreground/10 text-muted-foreground`,onClick:e=>{e.stopPropagation(),Ce({x:e.clientX,y:e.clientY,path:`/`,node:{id:``,name:`/`,label:`/`,type:`root`,description:``,color:null,locked:!1,children:[]}})},children:(0,Z.jsx)(ia,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`div`,{className:ue?`mt-1.5 border-t border-border/60`:`ml-[22px] mt-1.5 space-y-1.5`,children:[Ie===`/`&&(0,Z.jsx)(JF,{onConfirm:e=>dt(`/`,e),onCancel:ft}),e.children?.map((t,n)=>(0,Z.jsx)(ZF,{node:t,parentPath:`/`,depth:0,isLast:n===(e.children?.length??0)-1,...vt},t.id||t.name)),!e.children?.length&&Ie!==`/`&&(0,Z.jsx)(`div`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`Empty tree`})]}),Se&&fe.size>1&&fe.has(Se.path)?(0,Z.jsxs)(Dn,{x:Se.x,y:Se.y,onClose:()=>Ce(null),className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[(0,Z.jsxs)(`div`,{className:`px-3 py-1.5 text-xs text-muted-foreground`,children:[fe.size,` folders selected`]}),(0,Z.jsx)(`button`,{type:`button`,className:`block w-full px-3 py-1.5 text-left text-xs hover:bg-accent`,onClick:()=>{navigator.clipboard?.writeText([...fe].join(`
|
|
56
|
-
`)),Ce(null)},children:`Copy paths`}),!d&&!i&&w&&(0,Z.jsx)(`button`,{type:`button`,className:`block w-full px-3 py-1.5 text-left text-xs text-destructive hover:bg-accent`,onClick:()=>{Ce(null);let e=
|
|
57
|
-
`)}`)&&(async()=>{for(let t of e)await Te(t,!0);pe(new Set)})().catch(e=>alert(e instanceof Error?e.message:String(e)))},children:`Remove folders…`}),(0,Z.jsx)(`button`,{type:`button`,className:`block w-full px-3 py-1.5 text-left text-xs hover:bg-accent`,onClick:()=>{pe(new Set),Ce(null)},children:`Clear selection`})]}):Se&&(0,Z.jsx)(qF,{x:Se.x,y:Se.y,node:Se.node,path:Se.path,isBackendsTree:i,backends:le,isDirectoryTree:r===`directory`,onClose:()=>Ce(null),onShowContent:Se.node.metadata?.backendTrash?l:v,onRestoreTrash:d?void 0:a,onDiscardTrash:d?void 0:o,onOpenToSide:y?e=>y(e,r):void 0,sourceLayer:ye,targetLayers:xe,clipboard:_e,onStartInlineCreate:e=>Le(e),onChangeIcon:oe?()=>st({clientX:Se.x,clientY:Se.y,stopPropagation:()=>{}},Se.path,Se.node):void 0,onNewCanvas:S,onShareCanvas:C,onImportDocuments:d?void 0:A,onExportDocuments:j,onExportSubtree:O,onImportSubtree:d?void 0:k,onRemove:!d&&w&&![...U.keys()].some(e=>e===Se.path||e.startsWith(Se.path+`/`)||Se.path.startsWith(e+`/`))?Te:void 0,onRename:d?void 0:T,onLock:d?void 0:P,onUnlock:d?void 0:ee,onDestroy:d?void 0:F,onMerge:d?void 0:I,onSubtract:d?void 0:te,onMergeDown:d?void 0:L,onSubtractDown:d?void 0:R,canResyncBackend:re,onResyncBackend:ne,onAddRule:f,onAddStoreRule:p,onStoragePolicy:!d&&!i?m:void 0,onRenameBackendFolder:ae,onDeleteBackendFolder:!d&&z&&![...U.keys()].some(e=>e===Se.path||e.startsWith(Se.path+`/`)||Se.path.startsWith(e+`/`))?e=>Te(e,!0):void 0,onCopy:e=>pt(e,`copy`),onCut:e=>pt(e,`cut`),onPaste:ut,pastedDocumentIds:M,onPasteDocuments:N,isPinned:se?se(Se.path):!1,onTogglePin:B?()=>B(Se.path,Se.node):void 0}),Ee&&oe&&(0,Z.jsx)(dw,{x:Ee.x,y:Ee.y,current:Oe.get(Ee.path)??Qt(Ee.node),onChange:ct,onClose:()=>De(null)})]})}function $F(){let{state:e,closeM2:t,closeM1:n,closeM0:r,openM2:i}=qC(),a=De(),o=ft(),s=e.selectedEntityId,{showToast:c}=wo(),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)(),[_,v]=(0,X.useState)(``),[y,b]=(0,X.useState)(`/`),[x,S]=(0,X.useState)(null),[w,T]=(0,X.useState)(!1),[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(!1),A=(0,X.useCallback)(async e=>{T(!0);try{let t=await yl(e);f(t),D(null)}catch(e){D(e instanceof Error?e.message:`Failed to load the tree`)}finally{T(!1)}},[]);(0,X.useEffect)(()=>{if(!s)return;let e=s,t=!1;async function n(){try{let n=await Tl(e);if(t)return;u(n),m(n.url||``),g(void 0),v(``),S(null),b(n.path||`/`),T(!0);try{let n=await yl(e);t||(f(n),D(null))}catch(e){t||D(e instanceof Error?e.message:`Failed to load the tree`)}finally{t||T(!1)}}catch{t||c({title:`Error`,description:`Failed to load context`,variant:`destructive`})}}n();let r=t=>{t.detail?.contextId===e&&n()};return window.addEventListener(`contexts:refresh`,r),()=>{t=!0,window.removeEventListener(`contexts:refresh`,r)}},[s,c]);let j=Ut({contextId:s??void 0,onRefresh:()=>{s&&A(s)}}),M=e=>{g(void 0),S(e),m(l?.workspaceName?`${l.workspaceName}://${e.replace(/^\//,``)}`:e)},N=l!=null&&(p.trim()!==(l.url||``)||h!==void 0);return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(LF,{title:s||`Context`,icon:l?.icon||`ph:stack-fill`,accentColor:l?.color,onBack:t,action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{s&&(a?i(`settings`,s):o(`/contexts/${s}/settings/general`))},className:`flex items-center justify-center w-8 h-8 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Settings`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})}),(0,Z.jsxs)(`div`,{className:`p-3 border-b border-border shrink-0`,children:[(0,Z.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-1.5 font-medium uppercase tracking-wide`,children:`Context URL`}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(C,{presentation:`breadcrumbs`,value:p,fixedWorkspaceName:l?.workspaceName,pickerTitle:`Switch context to…`,onPickTarget:(e,t)=>{m(`${t.workspaceName}://${e.replace(/^\/+/,``)}`),g(t.treeName),S(null)},onChange:e=>{m(e),S(h?null:`/`+e.replace(/^.*?:\/\//,``).replace(/^\/+/,``))},disabled:O,className:`min-w-0 flex-1`,inputClassName:K(`text-xs transition-colors`,N&&`border-warning/60 bg-warning/10`),placeholder:`workspace://path`}),(0,Z.jsx)(Y,{size:`sm`,className:`h-9 px-2 text-xs shrink-0`,onClick:async()=>{if(!s)return;let e=s;k(!0);try{await sl(e,p,void 0,h);let t=await Tl(e);u(t),m(t.url||``),b(t.path||`/`),S(null),g(void 0),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),await A(e),c({title:`Saved`,description:`Context URL updated`}),window.matchMedia(`(max-width: 767px)`).matches&&(n(),r())}catch(e){c({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{k(!1)}},disabled:O||!N,children:O?`…`:`Set`})]})]}),h&&(0,Z.jsxs)(`p`,{className:`px-3 py-1 text-xs text-muted-foreground`,children:[`Destination tree: `,h,` · press Set to apply`]}),(0,Z.jsx)(`div`,{className:`px-3 py-2 border-b shrink-0`,children:(0,Z.jsx)(q,{type:`search`,name:`context-tree-filter`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,"aria-label":`Search context tree`,placeholder:`Search paths…`,value:_,onChange:e=>v(e.target.value),className:`h-7 text-xs`})}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[(0,Z.jsxs)(`div`,{className:`text-[10px] text-muted-foreground px-3 pt-2 pb-1 font-medium uppercase tracking-wide shrink-0`,children:[l?.workspaceName||`Workspace`,` · `,d?.type===`directory`?`directory`:`context`,` tree`]}),E&&!d&&(0,Z.jsx)(`p`,{className:`px-3 pb-1 text-xs text-destructive`,children:E}),(0,Z.jsx)(QF,{root:d,workspaceId:l?.workspaceName,searchQuery:_,selectedPath:y,pendingPath:x,onSelect:M,isLoading:w,rootLabel:l?.workspaceName,...j})]})]})}function eI({items:e,activeId:t,onSelect:n}){let[r,i]=(0,X.useState)(``),a=e.filter(e=>wC(r,e.label,e.description||``));return(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:(0,Z.jsxs)(`div`,{className:`space-y-1 px-2`,children:[(0,Z.jsx)(q,{type:`search`,name:`settings-section-filter`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,"aria-label":`Search settings sections`,placeholder:`Find a setting…`,className:`mb-3`,value:r,onChange:e=>i(e.target.value)}),!a.length&&(0,Z.jsx)(`p`,{role:`status`,className:`p-3 text-sm text-muted-foreground`,children:`No matching settings.`}),a.map(e=>{let r=e.id===t;return(0,Z.jsxs)(`button`,{type:`button`,"aria-current":r?`page`:void 0,onClick:()=>n(e.id),className:K(`flex w-full items-center gap-2.5 rounded-md px-3 py-2 text-left transition-colors`,r?`bg-accent text-foreground`:`text-muted-foreground hover:bg-accent/50 hover:text-foreground`),children:[(0,Z.jsx)(`span`,{className:K(`shrink-0`,r?`text-foreground`:`text-muted-foreground`),children:e.icon}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.label}),e.description&&(0,Z.jsx)(`span`,{className:`mt-1 block text-xs leading-relaxed text-muted-foreground`,children:e.description})]}),(0,Z.jsx)(Xa,{className:K(`h-3.5 w-3.5 shrink-0`,r?`opacity-100`:`opacity-0`)})]},e.id)})]})})}function tI(){let{state:e,closeM2:t}=qC(),n=De(),r=ft(),i=vn(),a=e.selectedEntityId,[o,s]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!a)return;let e=!1;return Tl(a).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[a]);let c=i.pathname.split(`/`).filter(Boolean),l=c[2]===`settings`?ND(c[3]):null,u=a?`/contexts/${a}`:null,d=(0,X.useMemo)(()=>MD.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Z.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(LF,{title:`Settings: ${o?.name||a||`Context`}`,icon:o?.icon||`ph:stack-fill`,accentColor:o?.color??null,onBack:()=>u&&!n?r(u):t(),action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>u&&r(u),className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Open context`,children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})})}),(0,Z.jsx)(eI,{items:d,activeId:l,onSelect:e=>a&&r(`/contexts/${a}/settings/${e}`)})]})}function nI(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),a=(0,X.useRef)(!1),o=(0,X.useRef)(!1),s=(0,X.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await Uo();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch workspaces:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,X.useCallback)(()=>{a.current=!1,s()},[s]);return(0,X.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,X.useEffect)(()=>{if(!e)return;let t=()=>B.emit(`subscribe`,{channel:`workspace`}),r=()=>B.emit(`unsubscribe`,{channel:`workspace`}),i=B.on(`connect`,()=>{t(),s()});t();let a=e=>{let t=e,r=t?.workspaceId??t?.id,i=t?.status;!r||!i||n(e=>e.map(e=>e.id===r?{...e,status:i}:e))},o=e=>{let t=e?.workspace??e;t?.id&&n(e=>e.some(e=>e.id===t.id)?e:[...e,t])},c=e=>{let t=e,r=t?.workspaceId??t?.id;r&&n(e=>e.filter(e=>e.id!==r))},l=[[`workspaces.scanned`,e=>{let t=e?.report;t&&(t.discovered.length||t.adopted.length||t.updated.length||t.missing.length)&&s()}],[`workspace:status:changed`,a],[`workspace.status.changed`,a],[`workspace:created`,o],[`workspace.created`,o],[`workspace:deleted`,c],[`workspace.deleted`,c]];return l.forEach(([e,t])=>B.on(e,t)),()=>{r(),i?.(),l.forEach(([e,t])=>B.off(e,t))}},[e,s]),(0,X.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`workspaces:refresh`,e),()=>{window.removeEventListener(`workspaces:refresh`,e)}},[s]),{workspaces:(0,X.useMemo)(()=>Pw(t),[t]),isLoading:r,refresh:c}}function rI({status:e}){return(0,Z.jsx)(`span`,{className:K(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:`bg-muted-foreground`),title:e})}function iI(){let[e,t]=(0,X.useState)(null),n=aw(),{state:r,selectEntity:i,openM2:a,closeM2:o}=qC(),s=De(),{workspaces:c,isLoading:l}=nI(r.activeSection===`workspaces`),{showToast:u}=wo(),d=ft(),[p,m]=(0,X.useState)(new Set),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(new Map),y=(0,X.useRef)(new Map),[b,x]=(0,X.useState)(null),S=b&&b.base===c?b.order:c,{rowProps:C,handleProps:w,draggingIndex:T,insertLineClass:E}=Lw((e,t)=>{let n=Fw(S,e,t);x({base:c,order:n}),Iw(n,(e,t)=>Pc(ow(e),{order:t})).then(({failed:e})=>{window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),e&&u({title:`Partial reorder`,description:`${e} workspace(s) could not be reordered`,variant:`destructive`})})}),D=e=>_.get(ow(e))??{icon:e.icon??void 0,color:e.color??void 0},O=(e,t,n)=>{let r={...t,...n};v(t=>new Map(t).set(e,r));let i=y.current,a=i.get(e);a&&clearTimeout(a),i.set(e,setTimeout(()=>{i.delete(e);let t={icon:r.icon??null};r.color&&(t.color=r.color),Pc(e,t).then(()=>window.dispatchEvent(new CustomEvent(`workspaces:refresh`))).catch(e=>u({title:`Error`,description:e instanceof Error?e.message:`Update failed`,variant:`destructive`}))},350))},k=e=>{i(ow(e)),a(`detail`,ow(e)),!s&&xw(ow(e))&&d(Sw(ow(e)))},A=async(e,t)=>{e.stopPropagation(),m(e=>new Set(e).add(ow(t)));try{await Ks(ow(t)),u({title:`Success`,description:`${t.label||t.name} started`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Start failed`,variant:`destructive`})}finally{m(e=>{let n=new Set(e);return n.delete(ow(t)),n})}},j=async(e,t)=>{e.stopPropagation(),m(e=>new Set(e).add(ow(t)));try{await hc(ow(t)),u({title:`Success`,description:`${t.label||t.name} stopped`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Stop failed`,variant:`destructive`})}finally{m(e=>{let n=new Set(e);return n.delete(ow(t)),n})}};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,onContextMenu:e=>{e.defaultPrevented||n.local||e.target.closest(`[data-workspace-row]`)||(e.preventDefault(),t({x:e.clientX,y:e.clientY}))},children:[e&&(0,Z.jsx)(Dn,{...e,onClose:()=>t(null),className:`rounded-md border bg-popover p-1 shadow-elevation-3`,children:(0,Z.jsx)(`button`,{type:`button`,className:`px-3 py-1.5 text-xs hover:bg-accent`,onClick:()=>{t(null),o(),d(`/workspaces?create=1`)},children:`Create workspace…`})}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Workspaces`})]}),!n.local&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{o(),d(`/workspaces?create=1`)},title:`Create workspace`,"aria-label":`Create workspace`,className:`flex items-center justify-center w-6 h-6 rounded-full bg-foreground text-background hover:opacity-80 transition-opacity`,children:(0,Z.jsx)(br,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:l&&c.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):c.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No workspaces found`}):(0,Z.jsx)(`div`,{className:`space-y-1.5 px-2`,children:S.map((e,t)=>{let n=r.selectedEntityId===ow(e),o=se(e),c=p.has(ow(e)),l=e.status!==`active`,u=D(e),m=Jt(u.color);return(0,Z.jsxs)(`div`,{"data-workspace-row":!0,...C(t),"data-active":n||void 0,className:K(`group relative rounded-(--card-radius) py-2.5 pl-3 pr-7 transition-all shadow-elevation-1`,n?`bg-accent shadow cursor-pointer hover:shadow`:l?`bg-card opacity-60 cursor-not-allowed`:`bg-card hover:bg-accent/50 cursor-pointer hover:shadow`,E(t,S.length),T===t&&`opacity-60`),onClick:()=>{l||k(e)},children:[(0,Z.jsx)(`button`,{type:`button`,...w(t),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:K(`absolute inset-y-0 right-0 flex w-4 cursor-grab items-center justify-center rounded-r-(--card-radius) active:cursor-grabbing`,!m&&`bg-muted`),style:m?{backgroundColor:m}:void 0,children:(0,Z.jsx)(Un,{className:K(`h-3.5 w-3.5`,tt(m))})}),(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`button`,{type:`button`,title:o?`Change icon`:`Workspace appearance requires admin access`,onClick:t=>{!o||to()||(t.stopPropagation(),g({x:Math.min(t.clientX,window.innerWidth-290),y:Math.min(t.clientY,window.innerHeight-360),name:ow(e)}))},onContextMenu:t=>{o&&(t.preventDefault(),t.stopPropagation(),g({x:Math.min(t.clientX,window.innerWidth-290),y:Math.min(t.clientY,window.innerHeight-360),name:ow(e)}))},className:`shrink-0 rounded p-0.5 hover:bg-muted-foreground/10 touch-target`,children:(0,Z.jsx)(f,{icon:u.icon||`ph:stack-fill`,width:18,height:18,color:m,className:K(!m&&`text-muted-foreground`)})}),(0,Z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(rI,{status:e.status}),(0,Z.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e.label||e.name})]})}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[e.status===`active`?(0,Z.jsx)(`button`,{type:`button`,disabled:c,onClick:t=>j(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-3.5 h-3.5`})}):(0,Z.jsx)(`button`,{type:`button`,disabled:c,onClick:t=>A(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),i(ow(e)),s?a(`settings`,ow(e)):d(`/workspaces/${ow(e)}/settings/general`)},className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,disabled:!o,title:o?`Settings`:`Workspace settings require admin access`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})]})]}),e.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-3.5`,children:e.description}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mt-1 pl-3.5`,children:[e.host&&(0,Z.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.host}),e.ownerEmail&&(0,Z.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.ownerEmail})]})]},e.id||e.name)})})}),h&&(()=>{let e=c.find(e=>ow(e)===h.name);if(!e)return null;let t=D(e);return(0,Z.jsx)(dw,{x:h.x,y:h.y,current:t,onChange:e=>O(h.name,t,e),onClose:()=>g(null)})})()]})}function aI(e,t){let n=(0,X.useRef)(null),r=(0,X.useRef)(0);return(0,X.useEffect)(()=>{if(!e)return;let n=e=>{if(e.defaultPrevented||e.repeat||e.isComposing||e.getModifierState(`AltGraph`))return;let n=e.target;if(n instanceof Element&&n.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"], [role="dialog"], [role="alertdialog"]`)||document.querySelector(`[aria-modal="true"], dialog[open]`))return;let r=Jk(e);if(!r)return;let i=Kk(),a=r===i.previousTree?-1:+(r===i.nextTree);a&&(e.preventDefault(),t(a))};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[e,t]),{onTouchStart(e){r.current=0,n.current=e.touches.length===1?{x:e.touches[0].clientX,y:e.touches[0].clientY}:null},onTouchMove(e){e.touches.length!==1&&(n.current=null)},onTouchCancel(){n.current=null},onTouchEnd(i){if(!n.current||!e)return;let a=i.changedTouches[0],o=Xk(a.clientX-n.current.x,a.clientY-n.current.y);n.current=null,o&&(r.current=Date.now()+500,i.stopPropagation(),t(o))},onClickCapture(e){Date.now()<r.current&&(e.preventDefault(),e.stopPropagation(),r.current=0)}}}function oI(e,t,n,r=!1){if(!t.startsWith(`/`)||!n.length)throw Error(`Choose a source folder and at least one destination.`);let i=new Map;for(let e of n){if(![`context`,`directory`].includes(e.tree)||!e.path.startsWith(`/`))throw Error(`Choose a context or directory destination.`);if(e.path.includes(`{{`))throw Error(`Auto-Link destinations cannot contain {{ template markers.`);i.set(`${e.tree}:${e.path}`,e)}return{id:e,enabled:!0,description:`Auto-Link backends:${t} → ${[...i.keys()].join(`, `)}`,cascade:!0,when:{event:[`document.inserted`,`document.updated`,`document.linked`],...r?{path:`backends:${t}`}:{pathExact:`backends:${t}`}},then:[...i.values()].map(e=>({action:`link`,paths:[`${e.tree===`context`?`ctx`:`dir`}:${e.path}`],...r?{recursive:!0}:{}}))}}function sI(e,t,n,r=!1,i=`forward`,a=`copy`,o,s){let c=oI(e,t,n,r);if(i===`forward`)return[c];if(a===`move`&&!s?.trim())throw Error(`Choose the source backend whose copy should be moved.`);if(r&&n.some(e=>e.tree===`context`))throw Error(`Recursive storage requires a directory source. Context paths can store files in a fixed backend folder.`);let l=t.split(`/`).filter(Boolean);if(l.length<2||t.includes(`{{`)||l.some(e=>e===`.`||e===`..`))throw Error(`Choose a backend folder with a valid storage address.`);if(!o)throw Error(`Choose a writable backend folder.`);let u=o.address,d=o.key,f=[...new Map(n.map(e=>[`${e.tree}:${e.path}`,e])).values()],p={id:`${e}-reverse`,enabled:!0,description:`Auto-Link ${f.map(e=>`${e.tree}:${e.path}`).join(`, `)} → backends:${t} (${a})`,cascade:!1,when:{event:[`document.inserted`,`document.linked`],[r?`path`:`pathExact`]:f.map(e=>`${e.tree}:${e.path}`)},then:[{action:`store`,to:u,folder:d,mode:a,...a===`move`?{from:s.trim()}:{},autoLink:!0,onConflict:`error`,...r?{recursive:!0}:{}}]};return i===`both`?[c,p]:[p]}function cI(e,t){let n=nl(e,t);if(t.find(e=>e.driver===n.driver&&e.address===n.address)?.capabilities.paths!==!0)throw Error(`This backend has not reported support for folder paths. Choose a writable storage folder to copy or move files here.`);return n}function lI({workspaceId:e,sourcePath:t,onClose:n,onManageRules:r}){let[i,a]=(0,X.useState)([]),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(`forward`),u=c===`forward`||!i.some(e=>e.tree===`context`),[d,f]=(0,X.useState)(`copy`),[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)([]),[_,v]=(0,X.useState)(!0),[b,x]=(0,X.useState)(!1),[S,C]=(0,X.useState)(!0),[w]=(0,X.useState)(()=>`autolink-${crypto.randomUUID()}`),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(``),{showToast:k,showProgress:A}=wo(),j=()=>{T||n()},M=_?`Checking whether this backend can receive files…`:``;if(!_)try{cI(t,h)}catch(e){M=e instanceof Error?e.message:`Choose a writable storage folder.`}let N=e=>{l(e),e!==`forward`&&(C(!1),i.some(e=>e.tree===`context`)&&x(!1))},P=e=>`${e.replace(/\/+$/,``)}/${b?`Subfolder/`:``}example.pdf`;return(0,X.useEffect)(()=>{let t=!1;return Rc(e).then(e=>{t||g(e)}).catch(()=>{t||O(`Could not load storage backends. Reopen Autolink to retry.`)}).finally(()=>{t||v(!1)}),()=>{t=!0}},[e]),(0,Z.jsx)(tn,{label:o?`Choose virtual paths`:`Autolink documents`,onClose:o?()=>s(!1):j,children:o?(0,Z.jsx)(y,{fixedWorkspaceName:e,tabs:c!==`forward`&&b?[`directory`]:[`context`,`directory`],initialTab:c===`forward`?void 0:`directory`,title:`Choose virtual paths`,confirmLabel:`Add paths`,sizeClassName:`h-full w-full rounded-none border-0 shadow-none`,onClose:()=>s(!1),onConfirm:(e,t)=>{c!==`forward`&&t.treeType===`context`&&x(!1),a(n=>{let r=[...n];for(let n of e)r.some(e=>e.tree===t.treeType&&e.path===n)||r.push({tree:t.treeType,path:n});return r}),s(!1)}}):(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 border-b p-5`,children:[(0,Z.jsxs)(`h2`,{className:`flex items-center gap-2 text-lg font-semibold`,children:[(0,Z.jsx)(Ri,{className:`h-5 w-5`}),`Autolink documents`]}),(0,Z.jsx)(`button`,{type:`button`,onClick:j,disabled:T,"aria-label":`Close`,className:`p-1 disabled:opacity-40`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto p-5`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current backend folder`}),(0,Z.jsxs)(`p`,{className:`mt-1 break-words text-sm`,children:[`backends:`,t]})]}),(0,Z.jsxs)(`fieldset`,{disabled:T,className:`space-y-2 text-sm`,children:[(0,Z.jsx)(`label`,{className:`block font-medium`,htmlFor:`autolink-direction`,children:`Direction`}),(0,Z.jsxs)(`select`,{id:`autolink-direction`,className:`w-full rounded-md border bg-background p-2`,value:c,onChange:e=>N(e.target.value),children:[(0,Z.jsx)(`option`,{value:`forward`,children:`Backend → virtual folders (link)`}),(0,Z.jsx)(`option`,{value:`reverse`,disabled:!!M,children:`Virtual folders → backend (Copy/Move)`}),(0,Z.jsx)(`option`,{value:`both`,disabled:!!M,children:`Both directions`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:c===`forward`?`Link documents from this backend folder into the selected virtual folders. Files stay where they are.`:`When a document is added or explicitly linked to a selected virtual folder, ${d} its file to the current backend folder.${c===`both`?` Documents arriving on the backend are also linked into the virtual folders.`:``}`}),M&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_?M:`Reverse mapping unavailable: ${M}`}),c!==`forward`&&(0,Z.jsxs)(`div`,{className:`space-y-2 rounded-lg border p-3`,children:[(0,Z.jsx)(`label`,{className:`block font-medium`,htmlFor:`autolink-operation`,children:`File operation`}),(0,Z.jsxs)(`select`,{id:`autolink-operation`,className:`w-full rounded-md border bg-background p-2`,value:d,onChange:e=>f(e.target.value),children:[(0,Z.jsx)(`option`,{value:`copy`,children:`Copy files to this backend`}),(0,Z.jsx)(`option`,{value:`move`,children:`Move files to this backend`})]}),d===`copy`&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Keep the source file and its virtual-folder links.`}),d===`move`&&(0,Z.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,Z.jsx)(`label`,{className:`block`,htmlFor:`autolink-source-backend`,children:`Move files from`}),(0,Z.jsxs)(`select`,{id:`autolink-source-backend`,className:`w-full rounded-md border bg-background p-2`,value:p,onChange:e=>m(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:`Choose a source backend…`}),h.filter(e=>e.kind===`storage`&&e.enabled&&e.config?.readOnly!==!0).map(e=>(0,Z.jsx)(`option`,{value:e.address,children:e.address},e.address))]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Move the file from this source backend after it has been stored at the destination. Virtual-folder links stay in place. Files missing from this source are skipped; multiple source copies require Copy instead.`})]})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-medium`,children:c===`reverse`?`Watch virtual folders`:`Virtual folders`}),i.map((e,t)=>(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg border p-2 text-sm`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.tree===`context`?`Context tree`:`Directory tree`}),(0,Z.jsx)(`p`,{className:`break-words`,children:e.path})]}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Remove ${e.tree}:${e.path}`,disabled:T,onClick:()=>a(e=>e.filter((e,n)=>n!==t)),children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]},`${e.tree}:${e.path}`)),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:T,onClick:()=>s(!0),children:[(0,Z.jsx)(br,{className:`mr-1 h-4 w-4`}),`Add virtual path…`]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:c===`forward`?`Choose the virtual folders where backend documents should appear.`:`Choose a Directory tree folder to watch for newly added documents. Its files will be stored in the current backend folder.`})]}),(0,Z.jsxs)(`fieldset`,{disabled:T,className:`space-y-3 text-sm`,children:[(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:b,disabled:!u,onChange:e=>x(e.target.checked),className:`mt-1`}),`Include subfolders and recreate their path in the destination`]}),!u&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Context membership has no single folder path. To preserve subfolders on a backend, choose a directory source. Context paths store files directly in the selected backend folder.`}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:S,onChange:e=>C(e.target.checked),className:`mt-1`}),`Apply to existing documents`]})]}),!!i.length&&(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-lg border bg-muted/30 p-3 text-sm`,"aria-label":`Mapping preview`,children:[(0,Z.jsx)(`h3`,{className:`font-medium`,children:`Example result`}),i.map(e=>(0,Z.jsxs)(`div`,{className:`space-y-2 break-all text-xs`,children:[c!==`reverse`&&(0,Z.jsxs)(`p`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Link `}),`backends:`,P(t),(0,Z.jsx)(`br`,{}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Into `}),e.tree===`context`?`ctx`:`dir`,`:`,P(e.path)]}),c!==`forward`&&(0,Z.jsxs)(`p`,{children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[d===`move`?`Move`:`Copy`,` `]}),e.tree===`context`?`ctx`:`dir`,`:`,P(e.path),(0,Z.jsx)(`br`,{}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`To `}),`backends:`,P(t)]})]},`preview:${e.tree}:${e.path}`)),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:b?`The selected folders are the roots. Only the subfolder path beneath each root is recreated at its destination.`:`Only direct folder contents are included.`})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[S?`Existing matching documents are processed in the background on the server once enabled.`:c===`forward`?`Future backend arrivals and updates are linked automatically.`:`Newly added or explicitly linked virtual-folder documents are processed automatically.`,` `,c===`both`&&`Both directions creates two rules in workspace Rules. `,`Removing rules keeps existing files and links. Renames and deletions are not synchronized. Filename conflicts stop the transfer without overwriting.`]}),D&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:D})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t p-3`,children:[(0,Z.jsx)(Y,{variant:`ghost`,disabled:T,onClick:r,children:`Manage rules`}),(0,Z.jsx)(Y,{disabled:T||!i.length||c!==`forward`&&(!!M||d===`move`&&!p),onClick:async()=>{if(!T){E(!0),O(``);try{let r=c===`forward`?void 0:cI(t,await Rc(e)),a=sI(w,t,i,b,c,d,r,p);await Je(e,a),S?V(A,e,a.map(e=>e.id)):k({title:`Autolink enabled`,description:`Future documents are linked automatically.`}),n()}catch(e){O(e instanceof Error?e.message:`Could not configure Auto-Link`)}finally{E(!1)}}},children:T?`Saving…`:`Enable Autolink`})]})]})})}async function uI(){return await J.get(`${yo}/users/me/config/webui`)??{}}async function dI(e){return await J.put(`${yo}/users/me/config/webui`,e)??e}var fI=`application/x-canvas-workspace-pin`;function pI({pins:e,isLoading:t,searchQuery:n=``,activeKey:r,onOpen:i,onShowInTree:a,onUnpin:o,onMove:s}){let[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(null),p=n.toLowerCase().trim(),m=p?e.filter(e=>(e.label||e.name||``).toLowerCase().includes(p)||e.path.toLowerCase().includes(p)||(e.description||``).toLowerCase().includes(p)):e,h=()=>{l(null),d(null)},g=async()=>{let t=u,n=c;if(h(),!n||!t||t.id===n)return;let r=t.id;if(t.id&&!t.before&&(r=e[e.findIndex(e=>e.id===t.id)+1]?.id??null),r!==n)try{await s(n,r)}catch(e){alert(e instanceof Error?e.message:String(e))}};return t&&!e.length?(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading pins…`}):e.length?m.length?(0,Z.jsx)(`div`,{className:`p-2 flex flex-col gap-2`,onDragOver:e=>{c&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`)},onDrop:e=>{e.preventDefault(),c&&!u&&d({id:null,before:!1}),g()},children:m.map(e=>{let t=e.resolvable===!1,n=Jt(e.color),s=e.icon||(e.type===`canvas`?`ph:squares-four-fill`:`ph:folder-fill`),m=r===ss(e.tree,e.path),_=u?.id===e.id&&u.before,v=u?.id===e.id&&!u.before;return(0,Z.jsxs)(`div`,{role:`button`,tabIndex:0,"data-active":m||void 0,draggable:!p,onDragStart:t=>{t.dataTransfer.setData(fI,e.id),t.dataTransfer.setData(`text/plain`,e.path),t.dataTransfer.effectAllowed=`move`,l(e.id)},onDragEnd:h,onDragOver:t=>{if(!c||c===e.id)return;t.preventDefault(),t.stopPropagation(),t.dataTransfer.dropEffect=`move`;let n=t.currentTarget.getBoundingClientRect(),r=t.clientY<n.top+n.height/2;d(t=>t?.id===e.id&&t.before===r?t:{id:e.id,before:r})},onDrop:e=>{e.preventDefault(),e.stopPropagation(),g()},onClick:()=>{t||i(e)},onKeyDown:n=>{n.target===n.currentTarget&&(n.key===`Enter`||n.key===` `)&&!t&&(n.preventDefault(),i(e))},title:t?`${e.path} — folder no longer exists`:`Open ${e.tree}:${e.path}`,className:K(`group relative flex items-stretch gap-2.5 rounded-(--card-radius) border bg-card shadow-elevation-1 text-left transition-colors`,t?`opacity-70 cursor-default`:`cursor-pointer hover:bg-accent/40`,m&&`ring-1 ring-primary/60`,c===e.id&&`opacity-40`,_&&`border-t-2 border-t-primary`,v&&`border-b-2 border-b-primary`),style:{borderLeft:`5px solid ${n??`transparent`}`},children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-center w-12 shrink-0 rounded-l-[5px] my-0 self-stretch`,style:n?{backgroundColor:`${n}22`}:void 0,children:t?(0,Z.jsx)(dr,{className:`w-5 h-5 text-warning`}):(0,Z.jsx)(f,{icon:s,width:22,height:22,color:n,className:K(!n&&(e.type===`canvas`?`text-primary`:`text-muted-foreground`))})}),(0,Z.jsxs)(`div`,{className:`flex flex-col min-w-0 flex-1 py-2 pr-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-semibold leading-tight truncate`,children:e.label||e.name||e.path.split(`/`).pop()}),e.locked&&(0,Z.jsx)(Si,{className:`w-3 h-3 shrink-0 text-warning`})]}),(0,Z.jsxs)(`span`,{className:`text-[11px] text-muted-foreground truncate leading-tight font-mono mt-0.5`,children:[e.tree,`:`,e.path]}),e.description&&(0,Z.jsx)(`span`,{className:`text-[11px] text-muted-foreground/80 truncate leading-tight mt-1`,children:e.description}),t&&(0,Z.jsx)(`span`,{className:`text-[11px] text-warning leading-tight mt-1`,children:`Folder no longer exists`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col items-center justify-between py-1.5 pr-1.5 shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Z.jsx)(`button`,{type:`button`,disabled:t,onClick:t=>{t.stopPropagation(),a(e)},title:`Show in tree`,"aria-label":`Show in tree`,className:`flex items-center justify-center w-6 h-6 rounded text-muted-foreground reveal-on-hover focus-visible:opacity-100 hover:bg-accent hover:text-foreground transition-colors disabled:opacity-40 disabled:cursor-default`,children:(0,Z.jsx)(rr,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:async t=>{t.stopPropagation();try{await o(e)}catch(e){alert(e instanceof Error?e.message:String(e))}},title:`Unpin`,"aria-label":`Unpin`,className:`flex items-center justify-center w-6 h-6 rounded text-muted-foreground reveal-on-hover hover:bg-destructive/10 hover:text-destructive transition-colors`,children:(0,Z.jsx)(ur,{className:`w-3.5 h-3.5`})})]}),!p&&(0,Z.jsx)(Un,{className:`w-3.5 h-3.5 text-muted-foreground/50 cursor-grab active:cursor-grabbing`,"aria-hidden":!0})]})]},e.id)})}):(0,Z.jsxs)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:[`No pins match “`,n,`”`]}):(0,Z.jsxs)(`div`,{className:`px-3 py-6 text-xs text-muted-foreground text-center space-y-1`,children:[(0,Z.jsx)(`p`,{children:`No pinned folders yet.`}),(0,Z.jsxs)(`p`,{className:`text-muted-foreground/70`,children:[`Right-click a folder in the context, directory or backends tree and choose `,(0,Z.jsx)(`span`,{className:`font-medium`,children:`Pin`}),`.`]})]})}var mI=()=>({selectedPath:`/`,contentPath:null,searchQuery:``,expansion:new Map}),hI=[`pins`,`context`,`layers`,`directory`,`backends`],gI=e=>typeof e==`string`&&hI.includes(e),_I=e=>{let t=Array.isArray(e)?e.filter(gI).filter((e,t,n)=>n.indexOf(e)===t):[];return[...t,...hI.filter(e=>!t.includes(e))]},vI={pins:(0,Z.jsx)(tr,{className:`w-3.5 h-3.5`}),context:(0,Z.jsx)(or,{className:`w-3.5 h-3.5`}),layers:(0,Z.jsx)(vi,{className:`w-3.5 h-3.5`}),directory:(0,Z.jsx)(rr,{className:`w-3.5 h-3.5`}),backends:(0,Z.jsx)(Fa,{className:`w-3.5 h-3.5`})},yI={pins:`Pins`,context:`Context tree`,layers:`Context layers`,directory:`Directory tree`,backends:`Backends tree`},bI=e=>e===`directory`||e===`backends`?e:Tc,xI=(e,t)=>t?`layers`:e===`directory`?`directory`:e===`backends`?`backends`:`context`;function SI(){let{state:e}=qC();return e.selectedEntityId?(0,Z.jsx)(eT,{workspaceName:e.selectedEntityId,children:(0,Z.jsx)(CI,{},e.selectedEntityId)}):null}function CI(){let{state:e,closeM2:t,openM2:n,navigateFromMenu:r}=qC(),i=Nt(),a=De(),o=e.selectedEntityId,s=ft(),c=vn(),{treeName:l,path:u}=af(c.pathname),d=new URLSearchParams(c.search).get(`layer`)===`1`,f=new URLSearchParams(c.search).get(`layerId`),p=/\/trees\/|\/path(\/|$)/.test(c.pathname)||!!f,m=p?xI(l,f):hI[0],[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)(null),[x,S]=(0,X.useState)({icon:null,color:null}),[C,w]=(0,X.useState)(m),[T,E]=(0,X.useState)(null),[D,O]=(0,X.useState)(null),[k,A]=(0,X.useState)(null),[j,M]=(0,X.useState)([]),[N,P]=(0,X.useState)(!1),[ee,F]=(0,X.useState)(!1),[I,L]=(0,X.useState)(!1),[R,ne]=(0,X.useState)(!1),[re,ie]=(0,X.useState)(u),[ae,z]=(0,X.useState)([]),[oe,ce]=(0,X.useState)(new Set),[V,le]=(0,X.useState)(d&&u!==`/`?u:null),[ue,de]=(0,X.useState)(``),[fe,pe]=(0,X.useState)(null),[me,he]=(0,X.useState)(null),[ge,_e]=(0,X.useState)(null),{policies:ve,refresh:ye}=QN(o),be=(0,X.useCallback)(e=>{if(C!==`context`&&C!==`directory`||!ve.length)return null;let t=RN(ve,C,e);return t.length?`Storage policy targets: ${zN(t)} (see Settings for transfer status)`:null},[C,ve]),[xe,H]=(0,X.useState)([]),[Se,Ce]=(0,X.useState)(!1),[U,W]=(0,X.useState)(!1),we=(0,X.useRef)(null),Te=(0,X.useRef)(new Map),[Ee,Oe]=(0,X.useState)(()=>Object.fromEntries(hI.map(e=>[e,mI()])));(0,X.useLayoutEffect)(()=>{we.current&&(we.current.scrollTop=Te.current.get(C)??0)},[C]);let ke=Ee[C];(ke.selectedPath!==re||ke.contentPath!==V||ke.searchQuery!==ue)&&Oe({...Ee,[C]:{...ke,selectedPath:re,contentPath:V,searchQuery:ue}});let Ae=(0,X.useRef)(!1),[je,Me]=(0,X.useState)(!1),[Ne,Pe]=(0,X.useState)(hI),Fe=!p;(0,X.useEffect)(()=>{let e=!1;return uI().then(t=>{if(e)return;let n=_I(t?.m2?.tabOrder);Pe(n),Fe&&w(e=>e===hI[0]?n[0]:e)}).catch(()=>{}),()=>{e=!0}},[]);let Ie=(0,X.useCallback)(async e=>{let t=Ne;Pe(e);try{let t=await uI();await dI({...t,m2:{...t.m2,tabOrder:e}})}catch{Pe(t)}},[Ne]),[Le,Re]=(0,X.useState)(null),[ze,Be]=(0,X.useState)(null),Ve=()=>{Re(null),Be(null)},He=()=>{if(Le&&ze&&Le!==ze.id){let e=Ne.filter(e=>e!==Le),t=e.indexOf(ze.id);t>=0&&(e.splice(ze.before?t:t+1,0,Le),e.some((e,t)=>e!==Ne[t])&&Ie(e))}Ve()};(0,X.useEffect)(()=>{let e=e=>pe(e.detail??null);return window.addEventListener(`documents:clipboard`,e),()=>window.removeEventListener(`documents:clipboard`,e)},[]);let[Ue,We]=(0,X.useState)(u);u!==Ue&&(We(u),ie(u));let Ge=(0,X.useRef)(new Map),Ke=(0,X.useCallback)(async(e,t,n=!1,r=!1)=>{let i=Symbol();Ge.current.set(t,i);let a=()=>Ge.current.get(t)===i,o=t===`context`?P:t===`directory`?F:L,s=t===`context`?E:t===`directory`?O:A;n||o(!0);try{n&&!r&&Ms(e,t);let i=await _c(e,t);a()&&s(i)}catch{}finally{a()&&o(!1)}},[]),G=(0,X.useCallback)(async(e,t=!1)=>{let n=Symbol();Ge.current.set(`pins`,n);let r=()=>Ge.current.get(`pins`)===n;t||Ce(!0);try{let t=await rc(e);r()&&H(t)}catch{}finally{r()&&Ce(!1)}},[]),qe=(0,X.useCallback)(async(e,t=!1)=>{let n=Symbol();Ge.current.set(`layers`,n);let r=()=>Ge.current.get(`layers`)===n;t||ne(!0);try{let t=await zo(e,`context`);r()&&M(t)}catch{}finally{r()&&ne(!1)}},[]);(0,X.useEffect)(()=>{if(!o)return;let e=o,t=!1,n=Ge.current;async function r(){Ws(e).then(e=>{t||(v(e.label||e.name),g(se(e)),b(e.id||null),S({icon:e.icon??null,color:e.color??null}))}).catch(()=>{}),await Promise.all([Ke(e,`context`),Ke(e,`directory`),Ke(e,`backends`),qe(e),G(e)])}return r(),()=>{t=!0,n.clear()}},[o,Ke,qe,G]);let Je=(0,X.useCallback)((e,t,n=!1)=>{for(let r of[`context`,`directory`,`backends`])(!t||t===r)&&Ke(e,r,!0,n);(!t||t===`context`)&&qe(e,!0),G(e,!0)},[Ke,qe,G]),Ye=(0,X.useCallback)(()=>{o&&Je(o)},[o,Je]);(0,X.useEffect)(()=>{if(!o)return;let e=e=>{e.detail?.workspaceName&&e.detail.workspaceName!==o||Je(o,e.detail?.treeName,e.detail?.cacheInvalidated)};return window.addEventListener(`workspace:tree:refresh`,e),()=>window.removeEventListener(`workspace:tree:refresh`,e)},[o,Je]),(0,X.useEffect)(()=>{if(!o)return;let e=!1,t=()=>Rc(o).then(t=>{e||(z(t),ce(new Set(t.filter(e=>e.resyncing&&e.treePath).map(e=>e.treePath))))}).catch(()=>{});t();let n=e=>{let n=e.detail;n?.workspaceName&&n.workspaceName!==o||(!n?.treeName||n.treeName===`backends`)&&t()};return window.addEventListener(`workspace:tree:refresh`,n),()=>{e=!0,window.removeEventListener(`workspace:tree:refresh`,n)}},[o]),(0,X.useEffect)(()=>{if(!o)return;let e=[`workspace:${o}`,y?`workspace:${y}`:null].filter(Boolean),t=()=>e.forEach(e=>B.emit(`subscribe`,{channel:e})),n=B.on(`connect`,t);t();let r=Dt(o,y),i=e=>{if(e?.workspaceId&&y&&e.workspaceId!==y)return;let t=e?.treePath;t&&ce(n=>{let r=new Set(n);return e.resyncing?r.add(t):r.delete(t),r})};B.on(`backend.resync.changed`,i);let a=e=>{e?.workspaceId&&y&&e.workspaceId!==y||G(o,!0)};return B.on(`pins.changed`,a),()=>{r(),n?.(),B.off(`backend.resync.changed`,i),B.off(`pins.changed`,a)}},[o,y,G]);let[Xe,Ze]=(0,X.useState)(null),Qe=`${c.pathname}|${c.search}`;if(Qe!==Xe){Ze(Qe);let{treeName:e,path:t}=af(c.pathname),n=new URLSearchParams(c.search).get(`layerId`),r=/\/trees\/|\/path(\/|$)/.test(c.pathname)||!!n;U?W(!1):w(r||je?r?xI(e,n):C:Ne[0]),ie(t),le(t===`/`?null:t)}let{showProgress:$e}=wo();(0,X.useEffect)(()=>{o&&te($e,o)},[o,$e]);let et=Ut({workspaceId:o??void 0,treeName:bI(C),onRefresh:Ye}),tt=(0,X.useRef)(new Map);(0,X.useEffect)(()=>{if(!o)return;let e=`${o}:${C}:${re}`,t=et;t.canResyncBackend(re)&&(Date.now()-(tt.current.get(e)||0)<6e4||(tt.current.set(e,Date.now()),t.onResyncBackend?.(re).catch(()=>{})))},[o,C,re,et]);let nt=new Set(xe.map(e=>ss(e.tree,e.path))),rt=bI(C),it=(0,X.useCallback)(e=>nt.has(ss(rt,e)),[xe,rt]),at=(0,X.useCallback)(async e=>{if(!o)return;let t=xe.find(t=>ss(t.tree,t.path)===ss(rt,e));t?await gs(o,t.id):await Ss(o,e,rt),await G(o)},[o,xe,rt,G]),ot=(0,X.useCallback)(async e=>{if(o){H(t=>t.filter(t=>t.id!==e.id));try{await gs(o,e.id)}finally{await G(o)}}},[o,G]),ct=(0,X.useCallback)(async(e,t)=>{if(!o)return;let n=xe.find(t=>t.id===e);if(!n)return;let r=xe.filter(t=>t.id!==e),i=t===null?r.length:r.findIndex(e=>e.id===t);if(i===-1)return;let a=[...r.slice(0,i),n,...r.slice(i)];if(!a.every((e,t)=>e===xe[t])){H(a);try{H(await bc(o,a.map(e=>e.id)))}catch(e){throw await G(o),e}}},[o,xe,G]),lt=(0,X.useCallback)(e=>{if(!o)return;W(!0),ie(e.path),le(null);let t=of(o,e.path,e.tree);if(i){i.activateRow(`pin:${o}:${e.id}`,e.label||e.name||e.path,t);return}r(t)},[o,r,i]),dt=(0,X.useCallback)(e=>{!o||e.resolvable===!1||(W(!1),Me(!0),w(xI(e.tree)),ie(e.path),le(null),de(``),Ae.current=!0,i?.setFocus(`main`),r(of(o,e.path,e.tree)))},[o,r,i]),pt=C===`context`?T:C===`directory`?D:C===`backends`?k:null,mt=C===`context`?N:C===`directory`?ee:C===`backends`&&I;(0,X.useEffect)(()=>{if(!Ae.current||mt||C===`pins`)return;let e=we.current?.querySelector(`[data-active="true"]`);e&&(e.scrollIntoView({block:`nearest`,inline:`nearest`}),Ae.current=!1)},[C,re,pt,mt]);let ht=(0,X.useCallback)(e=>{Me(!0),w(e);let t=Ee[e];ie(t.selectedPath),le(t.contentPath),de(t.searchQuery)},[Ee]),gt=(0,X.useCallback)(e=>{ht(Yk(Ne,C,e))},[Ne,C,ht]),_t=aI(e.m2Open,gt),vt=e=>{le(null),ie(e);let t=bI(C);i?.setFocus(`main`),r(of(o,e,t))},yt=(0,X.useCallback)((e,t)=>{ie(e),le(e);let n=bI(C),a=new URLSearchParams;a.set(`layer`,`1`),t&&a.set(`layerId`,t),i?.setFocus(`main`),r(`${of(o,e,n)}?${a.toString()}`)},[o,C,r,i]),bt=(0,X.useCallback)((e,t)=>{if(o){if(i){i.openCanvas({kind:`route`,location:of(o,e,t)});return}window.dispatchEvent(new CustomEvent(`workspace:open-to-side`,{detail:{workspaceName:o,treeName:t,path:e}}))}},[o,i]),xt=(0,X.useCallback)(async e=>{if(!o)return;let t=bI(C),n=await zc(o,e,t),r=`${window.location.origin}${n.url}`;await navigator.clipboard?.writeText(r),alert(`Canvas share link copied:\n${r}`)},[o,C]),St=ue.toLowerCase().trim(),wt=St?j.filter(e=>e.name.toLowerCase().includes(St)||(e.label||``).toLowerCase().includes(St)||(e.description||``).toLowerCase().includes(St)):j;return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(LF,{title:_||o||`Workspace`,icon:x.icon||`ph:stack-fill`,accentColor:x.color,onBack:t,action:(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:()=>o&&r(Sw(o)),className:`flex items-center justify-center w-8 h-8 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Open workspace`,children:(0,Z.jsx)(Pi,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,disabled:!h,onClick:()=>{a?n(`settings`,o??null):s(`/workspaces/${o}/settings/general`)},className:`flex items-center justify-center w-8 h-8 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,title:h?`Settings`:`Workspace settings require admin access`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})]})}),(0,Z.jsx)(`div`,{..._t,className:`flex border-b border-border shrink-0 touch-pan-y`,"aria-label":`Workspace trees`,children:Ne.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>ht(e),title:`${yI[e]} — drag to reorder; the first tab opens by default`,"aria-label":yI[e],"aria-pressed":C===e,draggable:!0,onDragStart:t=>{t.dataTransfer.setData(`text/plain`,e),t.dataTransfer.effectAllowed=`move`,Re(e)},onDragEnd:Ve,onDragOver:t=>{if(!Le||Le===e)return;t.preventDefault(),t.dataTransfer.dropEffect=`move`;let n=t.currentTarget.getBoundingClientRect(),r=t.clientX<n.left+n.width/2;Be(t=>t?.id===e&&t.before===r?t:{id:e,before:r})},onDrop:e=>{e.preventDefault(),He()},className:K(`relative flex-1 flex items-center justify-center py-2 transition-colors`,C===e?`text-foreground border-b-2 border-foreground -mb-px`:`text-muted-foreground hover:text-foreground`,Le===e&&`opacity-40`,ze?.id===e&&ze.before&&`shadow-[inset_2px_0_0_0_hsl(var(--primary))]`,ze?.id===e&&!ze.before&&`shadow-[inset_-2px_0_0_0_hsl(var(--primary))]`),children:[vI[e],e===`pins`&&xe.length>0&&(0,Z.jsx)(`span`,{className:`absolute top-1 right-[calc(50%-14px)] min-w-[14px] h-[14px] px-0.5 rounded-full bg-primary text-primary-foreground text-[9px] leading-[14px] text-center font-medium`,children:xe.length})]},e))}),(0,Z.jsx)(`div`,{className:`px-2 py-1.5 border-b border-border shrink-0 shadow-elevation-2 z-10`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-md border bg-muted/40 px-2 py-1`,children:[(0,Z.jsx)(qa,{className:`w-3 h-3 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`input`,{type:`search`,name:`workspace-tree-filter`,"aria-label":`Search workspace tree`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,className:`flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground min-w-0`,placeholder:C===`layers`?`Search layers…`:C===`pins`?`Search pins…`:`Search paths…`,value:ue,onChange:e=>de(e.target.value)})]})}),(0,Z.jsx)(`div`,{ref:we,onScroll:e=>{Te.current.set(C,e.currentTarget.scrollTop)},className:`flex-1 overflow-y-auto`,children:(0,Z.jsx)(Hw,{workspaceId:o,treeName:bI(C),readOnly:!h,className:`min-h-full`,children:C===`pins`?(0,Z.jsx)(pI,{pins:xe,isLoading:Se,searchQuery:ue,activeKey:ss(l,u),onOpen:lt,onShowInTree:dt,onUnpin:ot,onMove:ct}):C===`layers`?(0,Z.jsx)(AI,{layers:wt,isLoading:R,wsName:o??``,onSelect:e=>{let t=new URLSearchParams;t.set(`layerId`,e.id),t.set(`layer`,`1`),r(`${of(o,`/`)}?${t.toString()}`)},onLock:async e=>{await Jo(o,e.id,o,`context`),Je(o)},onUnlock:async e=>{await Lc(o,e.id,o,`context`),Je(o)},onRename:async(e,t)=>{await lc(o,e.id,t,`context`),Je(o)},onDestroy:async e=>{confirm(`Destroy layer "${e.label||e.name}"? This cannot be undone.`)&&(await jo(o,e.id,`context`),Je(o))}}):(0,Z.jsx)(QF,{expansionState:Ee[C].expansion,root:pt,workspaceId:o??void 0,treeName:C,isBackendsTree:C===`backends`,onRestoreTrash:o?e=>ut(o,e):void 0,onDiscardTrash:o?e=>st(o,e):void 0,onAltSelect:i?e=>bt(e,bI(C)):void 0,selectedPath:re,contentPath:V,onSelect:vt,onShowContent:C===`context`?yt:void 0,onOpenToSide:bt,onShareCanvas:xt,onNewCanvas:o&&C!==`backends`?e=>{s(`${of(o,e,C)}?createCanvas=1`)}:void 0,isLoading:mt,rootLabel:o??void 0,searchQuery:ue,backends:ae,resyncingPaths:C===`backends`?oe:void 0,onAddRule:o&&C===`backends`?he:void 0,onAddStoreRule:o?(e,t=`store`)=>{let n=C===`backends`?(()=>{let n=On(e);return{kind:t,storeTo:n?.backend||``,storeFolder:n?.rel||``}})():{kind:t,path:`${C===`directory`?`dir`:`ctx`}:${e}`,storeFolder:t===`download`?`Downloads`:hn(e)};s(`/workspaces/${o}/settings/hooks?${Ct(n).toString()}`)}:void 0,onStoragePolicy:o&&(C===`context`||C===`directory`)?e=>_e(kN(C,e)):void 0,policyBadgeFor:be,pastedDocumentIds:fe?.documentIds,isPathPinned:it,onTogglePin:o?at:void 0,onPasteDocuments:o&&C===`backends`?async(e,t)=>{let n=Hs(e);if(!n)return!1;let r=e.split(`/`).filter(Boolean).slice(2).join(`/`),i=$e({title:`Moving…`,description:`${t.length} message(s) → ${r}`});try{let{moved:a,results:s}=await Uc(o,n.address,t,e),c=s.filter(e=>!e.ok);return c.length?i.fail({title:`${c.length} message(s) not moved`,description:c[0].error||`Move failed`,variant:`destructive`}):i.done({title:`Moved`,description:`${a} message(s) → ${r}`}),fe&&a&&(pe(null),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:null}))),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:o,path:`/imap/${n.address}`,treeName:`backends`}})),a>0}catch(e){return i.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to move messages`,variant:`destructive`}),!1}}:o?async(e,t)=>{let n=C===`directory`?`directory`:`context`,r=C===`directory`?`directory`:Tc,i=$e({title:`Pasting…`,description:`${t.length} document(s) → "${e}"`}),a=!1;try{a=await Ko(o,e,t,r,n)}catch(e){return i.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to paste documents`,variant:`destructive`}),!1}return i.done(a?{title:`Success`,description:`${t.length} document(s) pasted to "${e}"`}:void 0),a&&(fe&&(pe(null),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:null}))),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:o,path:e,treeName:r}}))),a}:void 0,...et},C)})}),me&&o&&(0,Z.jsx)(lI,{workspaceId:o,sourcePath:me,onClose:()=>he(null),onManageRules:()=>{he(null),s(`/workspaces/${o}/settings/hooks?section=rules`)}}),ge&&o&&(0,Z.jsx)(UN,{workspaceId:o,path:ge,onClose:()=>_e(null),onSaved:()=>{ye()}})]})}var wI={canvas:{label:`Canvases`,order:0},dataset:{label:`Datasets`,order:1},context:{label:`Context layers`,order:2},workspace:{label:`Workspaces`,order:3},universe:{label:`Universe`,order:4},label:{label:`Labels`,order:5},system:{label:`System`,order:6}},TI=100,EI=e=>e&&e.charAt(0).toUpperCase()+e.slice(1),DI=e=>wI[e]??{label:`${EI(e)} layers`,order:TI};function OI({type:e}){return e===`canvas`?(0,Z.jsx)(Pa,{className:`w-3.5 h-3.5 shrink-0 text-primary`,"aria-label":`Canvas`}):e===`dataset`?(0,Z.jsx)(Fa,{className:`w-3.5 h-3.5 shrink-0 text-secondary`,"aria-label":`Dataset`}):(0,Z.jsx)(vi,{className:`w-3.5 h-3.5 shrink-0 text-muted-foreground/60`,"aria-label":`Layer`})}function kI(e){let t=new Map;for(let n of e){let e=n.type||`context`,r=t.get(e);r?r.push(n):t.set(e,[n])}return[...t.entries()].map(([e,t])=>({type:e,items:t,meta:DI(e)})).sort((e,t)=>e.meta.order-t.meta.order||e.meta.label.localeCompare(t.meta.label)).map(({type:e,items:t,meta:n})=>({type:e,label:n.label,items:t}))}function AI({layers:e,isLoading:t,onSelect:n,onLock:r,onUnlock:i,onRename:a,onDestroy:o}){let[s,c]=(0,X.useState)(null),l=(0,X.useRef)(null);if((0,X.useEffect)(()=>{s&&l.current?.focus()},[s]),t)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading layers…`});if(!e.length)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`No layers found`});let u=async(e,t)=>{e.stopPropagation();try{await t()}catch(e){alert(e instanceof Error?e.message:String(e))}},d=async(e,t)=>{c(null);let n=t.trim();if(!(!n||n===e.name))try{await a(e,n)}catch(e){alert(e instanceof Error?e.message:String(e))}},f=kI(e);return(0,Z.jsx)(`div`,{className:`px-2 py-1.5 space-y-2`,children:f.map(e=>(0,Z.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,Z.jsxs)(`div`,{className:`px-1 pt-1 pb-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:[e.label,(0,Z.jsxs)(`span`,{className:`ml-1 text-muted-foreground/60`,children:[`(`,e.items.length,`)`]})]}),e.items.map(e=>(0,Z.jsxs)(`div`,{className:`group flex items-center gap-2 rounded-l-md px-2 py-1.5 text-xs bg-card shadow-elevation-1 cursor-pointer hover:bg-accent/40 transition-colors`,style:{borderRight:e.color?`4px solid ${e.color}`:`4px solid transparent`},onClick:()=>s!==e.id&&n(e),children:[(0,Z.jsx)(`div`,{className:K(`w-2 h-2 rounded-full shrink-0`,!e.color&&`bg-muted-foreground/20`),style:e.color?{backgroundColor:e.color}:void 0}),(0,Z.jsx)(OI,{type:e.type}),s===e.id?(0,Z.jsx)(`input`,{ref:l,defaultValue:e.label||e.name,className:`flex-1 bg-transparent outline-none min-w-0 font-medium border-b border-primary`,onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`&&d(e,t.target.value),t.key===`Escape`&&c(null)},onBlur:t=>d(e,t.target.value)}):(0,Z.jsx)(`span`,{className:`flex-1 truncate font-medium`,children:e.label||e.name}),e.locked&&s!==e.id&&(0,Z.jsx)(Si,{className:`w-2.5 h-2.5 shrink-0 text-warning group-hover:hidden`}),s!==e.id&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 reveal-on-hover`,children:[e.locked?(0,Z.jsx)(`button`,{type:`button`,title:`Unlock layer`,className:`p-0.5 rounded hover:bg-muted-foreground/10 text-warning hover:text-foreground touch-target`,onClick:t=>u(t,()=>i(e)),children:(0,Z.jsx)(ea,{className:`w-3 h-3`})}):(0,Z.jsx)(`button`,{type:`button`,title:`Lock layer`,className:`p-0.5 rounded hover:bg-muted-foreground/10 text-muted-foreground hover:text-foreground touch-target`,onClick:t=>u(t,()=>r(e)),children:(0,Z.jsx)(Si,{className:`w-3 h-3`})}),!e.locked&&(0,Z.jsx)(`button`,{type:`button`,title:`Rename layer`,className:`p-0.5 rounded hover:bg-muted-foreground/10 text-muted-foreground hover:text-foreground touch-target`,onClick:t=>{t.stopPropagation(),c(e.id)},children:(0,Z.jsx)(Za,{className:`w-3 h-3`})}),!e.locked&&(0,Z.jsx)(`button`,{type:`button`,title:`Destroy layer`,className:`p-0.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive touch-target`,onClick:t=>u(t,()=>o(e)),children:(0,Z.jsx)(Qr,{className:`w-3 h-3`})})]})]},e.id))]},e.type))})}function jI(){let{state:e,closeM2:t}=qC(),n=De(),r=ft(),i=vn(),a=e.selectedEntityId,[o,s]=(0,X.useState)(null),c=o?.address===a?o.workspace:null,l=c?.label||c?.name,u=se(c);(0,X.useEffect)(()=>{if(!a)return;let e=!1;return Ws(a).then(t=>{e||s({address:a,workspace:t})}).catch(()=>{}),()=>{e=!0}},[a]);let d=i.pathname.split(`/`).filter(Boolean),f=d[2]===`settings`?jD(d[3]):null,p=(0,X.useMemo)(()=>kD.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Z.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(LF,{title:`Settings: ${l||a||`Workspace`}`,icon:c?.icon||`ph:stack-fill`,accentColor:c?.color,onBack:()=>{n||!a?t():r(`/workspaces/${a}`)},action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>a&&r(`/workspaces/${a}`),className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Open workspace`,children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})})}),u?(0,Z.jsx)(eI,{items:p,activeId:f,onSelect:e=>a&&r(`/workspaces/${a}/settings/${e}`)}):(0,Z.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:c?`Workspace settings are available to owners and admins.`:`Loading workspace…`})]})}function MI(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),a=(0,X.useRef)(!1),o=(0,X.useRef)(!1),s=(0,X.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await ZD();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch agents:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,X.useCallback)(()=>{a.current=!1,s()},[s]);return(0,X.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,X.useEffect)(()=>{if(!e)return;let t=()=>B.emit(`subscribe`,{channel:`agent`}),r=()=>B.emit(`unsubscribe`,{channel:`agent`}),i=B.on(`connect`,()=>{t(),s()});t();let a=e=>{let t=e?.agent??e;t?.id&&n(e=>e.some(e=>e.id===t.id)?e:[...e,t])},o=e=>{let t=e?.agent??e;t?.id&&n(e=>e.map(e=>e.id===t.id?{...e,...t}:e))},c=e=>{let t=e,r=t?.agentId??t?.id;r&&n(e=>e.filter(e=>e.id!==r))},l=e=>{let t=e,r=t?.agentId??t?.id,i=t?.status;!r||!i||n(e=>e.map(e=>e.id===r?{...e,status:i}:e))},u=[[`agent:created`,a],[`agent.created`,a],[`agent:updated`,o],[`agent.updated`,o],[`agent:deleted`,c],[`agent.deleted`,c],[`agent:status:changed`,l],[`agent.status.changed`,l]];return u.forEach(([e,t])=>B.on(e,t)),()=>{r(),i?.(),u.forEach(([e,t])=>B.off(e,t))}},[e,s]),(0,X.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`agents:refresh`,e),()=>window.removeEventListener(`agents:refresh`,e)},[s]),{agents:t,isLoading:r,refresh:c}}function NI({status:e}){return(0,Z.jsx)(`span`,{className:K(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:e===`starting`||e===`stopping`?`bg-warning`:`bg-muted-foreground`),title:e})}function PI(){let e=aw(),{state:t,selectEntity:n,openM2:r,closeM2:i}=qC(),a=De(),{agents:o,isLoading:s,refresh:c}=MI(t.activeSection===`agents`),{showToast:l}=wo(),[u,d]=(0,X.useState)(new Set),f=ft(),p=e=>{n(e.id),r(`detail`,e.id),f(`/agents/${encodeURIComponent(e.name||e.id)}`)},m=async(e,t)=>{e.stopPropagation(),d(e=>new Set(e).add(t.id));try{await dO(t.id),c(),l({title:`Success`,description:`${t.label||t.name} started`})}catch(e){l({title:`Error`,description:e instanceof Error?e.message:`Start failed`,variant:`destructive`})}finally{d(e=>{let n=new Set(e);return n.delete(t.id),n})}},h=async(e,t)=>{e.stopPropagation(),d(e=>new Set(e).add(t.id));try{await fO(t.id),c(),l({title:`Success`,description:`${t.label||t.name} stopped`})}catch(e){l({title:`Error`,description:e instanceof Error?e.message:`Stop failed`,variant:`destructive`})}finally{d(e=>{let n=new Set(e);return n.delete(t.id),n})}};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Agents`})]}),!e.local&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{i(),f(`/agents?create=1`)},title:`Create agent`,"aria-label":`Create agent`,className:`flex items-center justify-center w-6 h-6 rounded-full bg-foreground text-background hover:opacity-80 transition-opacity`,children:(0,Z.jsx)(br,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:s&&o.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):o.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No agents found`}):(0,Z.jsx)(`div`,{className:`space-y-1.5 px-2`,children:o.map(e=>{let i=t.selectedEntityId===e.id,o=u.has(e.id);return(0,Z.jsxs)(`div`,{"data-active":i||void 0,className:K(`group relative rounded-(--card-radius) px-3 py-2.5 cursor-pointer transition-all shadow-elevation-1 hover:shadow`,i?`bg-accent shadow`:`bg-card hover:bg-accent/50`),style:{borderRight:`6px solid ${e.color||`transparent`}`},onClick:()=>p(e),children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(NI,{status:e.status}),(0,Z.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e.label||e.name})]})}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[e.status===`active`?(0,Z.jsx)(`button`,{type:`button`,disabled:o,onClick:t=>h(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-3.5 h-3.5`})}):(0,Z.jsx)(`button`,{type:`button`,disabled:o,onClick:t=>m(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),n(e.id),a?r(`settings`,e.id):f(`/agents/${encodeURIComponent(e.name||e.id)}/settings/identity`)},className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground transition-colors`,title:`Settings`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})]})]}),e.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-3.5`,children:e.description})]},e.id)})})})]})}function FI(e){return e.name?.trim()?e.name.trim():e.firstMessage?.trim()?e.firstMessage.trim():e.isExperimental?`Experimental`:e.id.slice(0,8)}function II(e){let t=new Date(e.updatedAt).toLocaleString();return e.messageCount>0?`${e.messageCount} msg${e.messageCount===1?``:`s`} • ${t}`:`Empty • ${t}`}function LI(e){return e.sessions.sessions.find(t=>t.id===e.current.sessionId||t.path===e.current.sessionFile||t.id===e.sessions.currentSessionId||t.path===e.sessions.currentSessionPath||t.isCurrent)||null}function RI(){let{state:e,closeM2:t}=qC(),n=e.selectedEntityId||``,r=ft(),{showToast:i}=wo(),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(``),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(``),{current:h,sessions:g,isLoading:_,error:v,refresh:y,create:b,select:x,rename:S,remove:C}=pM(n);(0,X.useEffect)(()=>{n&&(QD(n).then(o).catch(()=>{}),y().catch(e=>{i({title:`Error`,description:e instanceof Error?e.message:`Failed to load sessions`,variant:`destructive`})}))},[n,y,i]);let w=(0,X.useMemo)(()=>g?.sessions?g.currentSessionId?g.sessions.find(e=>e.id===g.currentSessionId)||null:g.currentSessionPath?g.sessions.find(e=>e.path===g.currentSessionPath)||null:g.sessions.find(e=>e.isCurrent)||null:null,[g]),T=a?.name||n,E=e=>e?.slug||e?.id,D=e=>{let t=typeof e==`string`?e:E(e);r(t?`/agents/${encodeURIComponent(T)}/${encodeURIComponent(t)}`:`/agents/${encodeURIComponent(T)}`)},O=async()=>{try{let e=await b({mode:`persistent`,name:l.trim()||void 0});c(!1),u(``),D(LI(e))}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to create session`,variant:`destructive`})}},k=async()=>{try{let e=await b({mode:`experimental`});D(LI(e))}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to open experimental session`,variant:`destructive`})}},A=async()=>{try{await b({mode:`incognito`}),D()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to open incognito session`,variant:`destructive`})}},j=async e=>{try{e.isExperimental?await x({mode:`experimental`}):await x({mode:`persistent`,sessionId:e.id}),D(e)}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to select session`,variant:`destructive`})}},M=async e=>{if(p.trim())try{let t=(await S(e.id,p.trim())).sessions.sessions.find(t=>t.id===e.id);f(null),m(``),w?.id===e.id&&D(t||e)}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to rename session`,variant:`destructive`})}},N=async e=>{if(!e.isExperimental&&window.confirm(`Delete session "${FI(e)}"?`))try{await C(e.id),D()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to delete session`,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(LF,{title:a?.label||a?.name||n,onBack:t,action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(`/agents/${encodeURIComponent(T)}/settings`),className:`flex h-8 w-8 items-center justify-center rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Agent settings`,children:(0,Z.jsx)(Wi,{className:`h-3.5 w-3.5`})})}),(0,Z.jsxs)(`div`,{className:`border-b border-border px-4 py-3`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-semibold`,children:`Sessions`}),(0,Z.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:g?.mode===`incognito`?`Incognito mode`:g?.mode===`experimental`?`Experimental mode`:`Persistent history`}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,variant:s?`default`:`outline`,onClick:()=>{c(e=>!e),u(``)},disabled:_,children:[(0,Z.jsx)(br,{className:`mr-1 h-3.5 w-3.5`}),`New`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:g?.mode===`experimental`?`default`:`outline`,onClick:k,disabled:_,children:[(0,Z.jsx)(Qn,{className:`mr-1 h-3.5 w-3.5`}),`Experimental`]}),(0,Z.jsx)(Y,{size:`sm`,variant:g?.mode===`incognito`?`default`:`outline`,onClick:A,disabled:_,children:`Incognito`})]})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-2`,children:[v&&(0,Z.jsx)(`div`,{className:`px-2 py-2 text-xs text-destructive`,children:v}),s&&(0,Z.jsxs)(`div`,{className:`mb-2 rounded-md border bg-muted/20 p-2`,children:[(0,Z.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`Name the new session or leave it blank.`}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:l,onChange:e=>u(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),O()),e.key===`Escape`&&(c(!1),u(``))},placeholder:`Debugging auth`,className:`h-8`}),(0,Z.jsx)(Y,{size:`sm`,onClick:O,disabled:_,children:`Create`})]})]}),g?.sessions.length?(0,Z.jsx)(`div`,{className:`space-y-1.5`,children:g.sessions.map(e=>{let t=w?.id===e.id&&g.mode!==`incognito`,n=d===e.id;return(0,Z.jsx)(`div`,{onClick:()=>j(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),j(e))},role:`button`,tabIndex:_?-1:0,className:`group w-full rounded-md border px-3 py-2 text-left transition-colors ${t?`border-foreground bg-accent`:`border-transparent hover:bg-accent/50`} ${_?`opacity-60`:``}`,children:(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsx)(`div`,{className:`min-w-0 flex-1`,children:n?(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:p,onChange:e=>m(e.target.value),onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`&&(t.preventDefault(),M(e)),t.key===`Escape`&&(f(null),m(``))},placeholder:`Session name`,className:`h-8`}),(0,Z.jsx)(Y,{size:`sm`,onClick:t=>{t.stopPropagation(),M(e)},disabled:!p.trim()||_,children:`Save`})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`truncate text-sm font-medium`,children:FI(e)}),e.isExperimental&&(0,Z.jsx)(`span`,{className:`rounded-full bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary`,children:`∞`}),e.isCurrent&&(0,Z.jsx)(`span`,{className:`rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:`Current`})]}),(0,Z.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:II(e)})]})}),!n&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 reveal-on-hover`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),f(e.id),m(e.name||FI(e))},className:`flex h-7 w-7 items-center justify-center rounded hover:bg-muted-foreground/10 text-muted-foreground touch-target`,title:`Rename`,children:(0,Z.jsx)(Gn,{className:`h-3.5 w-3.5`})}),!e.isExperimental&&(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),N(e)},className:`flex h-7 w-7 items-center justify-center rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive touch-target`,title:`Delete session`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})]})},e.id)})}):(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-sm`,children:_?`Loading sessions...`:`No persistent sessions yet.`}),(0,Z.jsx)(`div`,{className:`mt-1 text-xs`,children:"Use `New`, `Experimental`, or `Incognito`."})]})}),h?.mode===`incognito`&&(0,Z.jsx)(`div`,{className:`mt-3 rounded-md border border-dashed px-3 py-2 text-xs text-muted-foreground`,children:`Incognito session is active. It lives in memory and stays out of the session list.`})]})]})}function zI(){let{state:e,closeM2:t}=qC(),n=De(),r=ft(),i=vn(),a=e.selectedEntityId,[o,s]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!a)return;let e=!1;return QD(a).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[a]);let c=i.pathname.split(`/`).filter(Boolean),l=c[2]===`settings`?FD(c[3]):null,u=encodeURIComponent(o?.name||a||``),d=(0,X.useMemo)(()=>PD.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Z.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(LF,{title:`Settings: ${o?.label||o?.name||a||`Agent`}`,accentColor:o?.color??null,onBack:()=>{n||!u?t():r(`/agents/${u}`)},action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>u&&r(`/agents/${u}`),className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Open agent`,children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})})}),(0,Z.jsx)(eI,{items:d,activeId:l,onSelect:e=>u&&r(`/agents/${u}/settings/${e}`)})]})}function BI(){let e=vn(),{state:t}=qC(),[n,r]=(0,X.useState)(``),i=(0,X.useRef)(null);(0,X.useLayoutEffect)(()=>{let e=i.current,t=e?.querySelector(`[aria-current="page"]`);if(!e||!t)return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.top<n.top?e.scrollTop+=r.top-n.top:r.bottom>n.bottom&&(e.scrollTop+=r.bottom-n.bottom)},[e.pathname,t.user?.userType]);let a=SC.filter(e=>e.id!==`server`||t.user?.userType===`admin`).map(e=>({...e,items:e.items.filter(t=>wC(n,e.label,t.label,t.description))})).filter(e=>e.items.length);return(0,Z.jsxs)(`nav`,{"aria-label":`Settings`,className:`flex h-full flex-col`,children:[(0,Z.jsxs)(`div`,{className:`shrink-0 space-y-3 border-b border-border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Settings`})]}),(0,Z.jsx)(q,{type:`search`,name:`settings-menu-filter`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,"aria-label":`Search settings menu`,placeholder:`Find a setting…`,value:n,onChange:e=>r(e.target.value)})]}),(0,Z.jsxs)(`div`,{ref:i,className:`min-h-0 flex-1 space-y-4 overflow-y-auto p-2`,children:[a.map(t=>(0,Z.jsxs)(`section`,{"aria-label":t.label,children:[(0,Z.jsx)(`h2`,{className:`px-3 py-2 text-xs font-semibold text-muted-foreground`,children:t.label}),t.items.map(({path:t,icon:n,label:r,description:i})=>(0,Z.jsxs)(we,{to:t,"aria-current":e.pathname===t?`page`:void 0,className:K(`flex items-start gap-3 rounded-md px-3 py-2 text-left hover:bg-accent/50`,e.pathname===t&&`bg-accent`),children:[(0,Z.jsx)(n,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium`,children:r}),(0,Z.jsx)(`span`,{className:`mt-0.5 block text-xs leading-relaxed text-muted-foreground`,children:i})]})]},t))]},t.id)),!a.length&&(0,Z.jsx)(`p`,{role:`status`,className:`p-3 text-sm text-muted-foreground`,children:`No settings match. Try “cache”, “model” or “token”.`})]})]})}var VI=280;function HI(){let{state:e}=qC(),{activeSection:t,m2View:n}=e;if(t===`contexts`){if(n===`settings`)return(0,Z.jsx)(tI,{});if(n===`detail`)return(0,Z.jsx)($F,{})}if(t===`workspaces`){if(n===`settings`)return(0,Z.jsx)(jI,{});if(n===`detail`)return(0,Z.jsx)(SI,{})}if(t===`agents`){if(n===`settings`)return(0,Z.jsx)(zI,{});if(n===`detail`)return(0,Z.jsx)(RI,{})}return null}function UI(){let{state:e,closeM1:t,closeM2:n}=qC();Ae(t,e.m1Open&&!e.m2Open),Ae(n,e.m1Open&&e.m2Open);let r=De(),i=(0,X.useRef)(null),a=(0,X.useRef)(null);PF(i,e.m1Open&&!e.m2Open,e.activeSection??``),PF(a,e.m1Open&&e.m2Open,`${e.activeSection}:${e.selectedEntityId}:${e.m2View}`);let[o,s]=(0,X.useState)(VI),[c,l]=(0,X.useState)(!1),u=r&&e.m1Open;return(0,Z.jsxs)(Z.Fragment,{children:[u&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-40 bg-scrim animate-fade-in`,onClick:t,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{style:e.m1Open&&!u?{width:o}:void 0,className:K(`flex-shrink-0 overflow-hidden bg-card surface-glass`,!c&&!u&&`transition-[width] duration-normal ease-out`,e.m1Open?`rounded-[var(--panel-radius)] shadow-elevation-2`:`w-0`,u?`fixed bottom-2 left-[calc(0.5rem+var(--spacing-rail)+0.5rem)] right-2 top-2 z-40 shadow-elevation-5`:`relative`),children:[(0,Z.jsxs)(`div`,{ref:i,"data-menu-view":`list`,inert:!e.m1Open||e.m2Open,className:K(`absolute inset-0 flex flex-col transition-opacity duration-normal ease-out`,e.m2Open&&`opacity-0 pointer-events-none`),style:u?void 0:{minWidth:o},children:[e.activeSection===`contexts`&&(0,Z.jsx)(IF,{}),e.activeSection===`workspaces`&&(0,Z.jsx)(iI,{}),e.activeSection===`agents`&&(0,Z.jsx)(PI,{}),e.activeSection===`admin`&&(0,Z.jsx)(BI,{}),e.activeSection===`apps`&&(0,Z.jsx)(rw,{}),e.activeSection===`settings`&&(0,Z.jsx)(BI,{})]}),(0,Z.jsx)(`div`,{ref:a,"data-menu-view":`detail`,inert:!e.m1Open||!e.m2Open,className:K(`absolute inset-0 z-10 bg-card flex flex-col md:transition-transform md:duration-normal md:ease-out`,e.m2Open?`translate-x-0`:`translate-x-full max-md:invisible`),children:e.m2Open&&(0,Z.jsx)(HI,{})}),e.m1Open&&!u&&(0,Z.jsx)(NF,{width:o,onResize:s,onDragging:l})]})]})}function WI(e){let[t]=e.split(`/`).filter(Boolean);return!t||t===`home`||t===`share-target`}function GI(e){let[t,n]=e.split(`/`).filter(Boolean);return[`contexts`,`workspaces`,`agents`,`apps`].includes(t)&&!!n}var KI=`max-md:fixed max-md:left-2 max-md:right-2 max-md:top-2 max-md:bottom-2 max-md:z-side max-md:py-0 max-md:mr-0 max-md:rounded-(--panel-radius) max-md:shadow-elevation-5 max-md:animate-fade-in`,qI=`fixed inset-0 z-side-scrim bg-scrim animate-fade-in md:hidden`;function JI(){let e=w(),{pathname:t,search:n}=vn(),{state:r}=qC(),i=(0,X.useRef)(null);PF(i,!r.m1Open,t+n,!r.m0Open);let a=GI(t),o=WI(t),{entry:s,loading:c,error:l,close:u}=ye();return(0,Z.jsx)(`div`,{className:K(`relative flex flex-col flex-1 min-w-0`,!o&&`surface-sheet`),children:(0,Z.jsxs)(`div`,{className:`flex flex-1 min-h-0 gap-shell`,children:[(0,Z.jsx)(`main`,{ref:i,id:`content-area`,className:K(`relative flex-1 min-h-0 min-w-0 overflow-auto`,!a&&!o&&`p-page max-md:pb-rail-stack`),children:(0,Z.jsx)(Gt,{})}),(s||c||l)&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:qI,onClick:u,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{"data-reader-pane":!0,style:{"--reader-width":`${e??420}px`},className:K(`relative z-10 flex shrink-0 items-stretch py-2 mr-2 md:w-[var(--reader-width)] md:max-w-[calc(100%_-_248px)]`,KI),children:[(0,Z.jsx)(je,{edge:`left`}),(0,Z.jsx)(O,{},s?`${s.workspaceId}:${s.document.id}`:`loading`)]})]})]})})}function YI(){let{state:e,setView:t}=ol(),{pathname:n}=vn();return e.t1Open||e.addOpen||!WI(n)?null:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t(`tools`),"aria-label":`Open toolbox`,title:`Open toolbox`,className:`fixed z-50 hidden md:flex h-16 w-16 items-center justify-center rounded-full shadow-elevation-4 transition-colors bottom-fab-inset right-6 bg-foreground text-background hover:bg-foreground`,children:(0,Z.jsx)(Ci,{className:`h-7 w-7`,strokeWidth:1.75,"aria-hidden":!0})})}var XI={current:null,sessions:null,isLoading:!1,error:null};function ZI(e){return e instanceof Error?e.message:`Session request failed`}function QI({children:e}){let[t,n]=(0,X.useState)({}),r=(0,X.useCallback)((e,t)=>{n(n=>({...n,[e]:{...n[e]||XI,...t}}))},[]),i=(0,X.useCallback)((e,t)=>(r(e,{current:t.current,sessions:t.sessions,isLoading:!1,error:null}),t),[r]),a=(0,X.useCallback)(async e=>{if(e){r(e,{isLoading:!0,error:null});try{let[t,n]=await Promise.all([$D(e),eO(e)]);r(e,{current:t,sessions:n,isLoading:!1,error:null})}catch(t){throw r(e,{isLoading:!1,error:ZI(t)}),t}}},[r]),o=(0,X.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await tO(e,t))}catch(t){throw r(e,{isLoading:!1,error:ZI(t)}),t}},[i,r]),s=(0,X.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await nO(e,t))}catch(t){throw r(e,{isLoading:!1,error:ZI(t)}),t}},[i,r]),c=(0,X.useCallback)(async(e,t,n)=>{r(e,{isLoading:!0,error:null});try{return i(e,await rO(e,t,{name:n}))}catch(t){throw r(e,{isLoading:!1,error:ZI(t)}),t}},[i,r]),l=(0,X.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await iO(e,t))}catch(t){throw r(e,{isLoading:!1,error:ZI(t)}),t}},[i,r]),u=(0,X.useMemo)(()=>({getState:e=>t[e]||XI,refresh:a,create:o,select:s,rename:c,remove:l}),[t,a,o,s,c,l]);return(0,Z.jsx)(fM.Provider,{value:u,children:e})}function $I(){let e=Dl(),{closeAdd:t}=ol(),{showSuccessToast:n,showErrorToast:r}=Oo(),[i,a]=(0,X.useState)(`Untitled.txt`),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),u=!1;try{Ml(``,i.trim()),u=!0}catch{}return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`plaintext-filename`,children:`Filename`}),(0,Z.jsx)(q,{id:`plaintext-filename`,autoFocus:!0,value:i,onChange:e=>a(e.target.value)})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Content`}),(0,Z.jsx)(Zc,{kind:`text`,value:o,onChange:s,placeholder:`Write plain text…`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Creates a file in the current storage folder. Existing files are never overwritten.`}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:t,disabled:c,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:async()=>{if(!(c||!u||e?.mode!==`workspace`||e.treeName!==`backends`)){l(!0);try{let r=await bl(e.workspaceName,e.path);await Eo(e.workspaceName,{...r,key:Ml(r.key,i.trim())},new Blob([o],{type:`text/plain;charset=utf-8`}),{contentType:`text/plain;charset=utf-8`}),El(e),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`)),n(`Plaintext file created`),t()}catch(e){r(e instanceof Error?e.message:`Failed to create file`)}finally{l(!1)}}},disabled:c||!u,children:c?`Creating…`:`Create file`})]})]})}function eL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=iT(n,t.addRelateTo),o=ux(n,a.write,t.addRelateTo?`related:${t.addRelateTo.documents.map(e=>e.id).sort().join(`,`)}`:`add`),s=oT(t.activeWorkspaceName),c=!!n&&o.canSave,l=async()=>{if(n)try{let t=await o.save(n),i=await a.write(t);r(i?`Note created; some relations failed`:`Note created`),o.finish(),e()}catch(e){i(e instanceof Error?e.message:`Failed to create note`)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`note-title`,children:`Title`}),(0,Z.jsx)(q,{id:`note-title`,value:o.title,onChange:e=>o.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Body`}),(0,Z.jsx)(Zc,{kind:`markdown`,value:o.content,onChange:o.setContent,placeholder:`Write your note…`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`note-comment`,children:`Comment`}),(0,Z.jsx)(`textarea`,{id:`note-comment`,value:o.comment,onChange:e=>o.setComment(e.target.value),rows:2,placeholder:`Optional; context you can't infer from the body`,className:`flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-elevation-1 transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Z.jsx)(fT,{geotag:o.geotag,idPrefix:`note-geotag`}),(0,Z.jsx)(aT,{f:a,idPrefix:`note`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsx)($c,{...o,onRetry:o.retry}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:o.saving,children:`Close`}),(0,Z.jsx)(Y,{size:`sm`,onClick:l,disabled:!c,children:o.saving?`Saving…`:`Done`})]})]})}function tL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=FE(),o=iT(n,t.addRelateTo),s=oT(t.activeWorkspaceName),c=!!n&&a.canSave;return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`link-url`,children:`URL`}),(0,Z.jsx)(q,{id:`link-url`,value:a.url,onChange:e=>a.setUrl(e.target.value),placeholder:`https://example.com`,autoFocus:!0}),a.showUrlError&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:`Enter a valid URL, e.g. https://example.com`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`link-title`,children:`Title`}),(0,Z.jsx)(q,{id:`link-title`,value:a.title,onChange:e=>a.setTitle(e.target.value),placeholder:`Optional display title`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Z.jsx)(fT,{geotag:a.geotag,idPrefix:`link-geotag`}),(0,Z.jsx)(aT,{f:o,idPrefix:`link`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:async()=>{if(n)try{let t=await a.save(n),i=await o.write(t);r(i?`Link created; some relations failed`:`Link created`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create link`)}},disabled:!c,children:a.saving?`Saving…`:`Save link`})]})]})}function nL(e){let[t,n]=(0,X.useState)({key:``,list:[]});return(0,X.useEffect)(()=>{if(!e)return;let t=!1;return Rc(e,`github`).then(async r=>{let i=r.filter(e=>e.capabilities?.write),a=[];for(let t of i){let n=await Mc(e,`github`,t.address).catch(()=>[]);for(let e of n){if(e.writable===!1)continue;let n=e.id||e.name;a.push({driver:`github`,address:t.address,container:n,label:`GitHub: ${n}`})}}t||n({key:e,list:a})}).catch(()=>{t||n({key:e,list:[]})}),()=>{t=!0}},[e]),e&&t.key===e?t.list:[]}function rL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=ve(),o=iT(n,t.addRelateTo),s=oT(t.activeWorkspaceName),c=nL(t.activeWorkspaceName),[l,u]=(0,X.useState)(`canvas`),[d,f]=(0,X.useState)(!1),p=c.find(e=>`${e.driver}:${e.address}:${e.container}`===l),m=p?a.title.trim().length>0&&!d:!!n&&a.canSave,h=async()=>{if(p){f(!0);try{await As(t.activeWorkspaceName||``,p.driver,p.address,p.container,{title:a.title.trim(),...a.description.trim()?{description:a.description.trim()}:{},...a.tags.length?{labels:a.tags}:{}}),r(`Issue created in ${p.container}`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create issue`)}finally{f(!1)}return}if(n)try{let t=await a.save(n),i=await o.write(t);r(i?`Todo created; some relations failed`:`Todo created`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create todo`)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsx)(Oe,{...a}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`todo-comment`,children:`Comment`}),(0,Z.jsx)(`textarea`,{id:`todo-comment`,value:a.comment,onChange:e=>a.setComment(e.target.value),rows:3,placeholder:`Optional context`,className:`flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-elevation-1 transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),c.length>0&&(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`todo-destination`,children:`Save to`}),(0,Z.jsxs)(`select`,{id:`todo-destination`,value:l,onChange:e=>u(e.target.value),className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-elevation-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,children:[(0,Z.jsxs)(`option`,{value:`canvas`,children:[`Canvas: `,Ol(n)]}),c.map(e=>(0,Z.jsx)(`option`,{value:`${e.driver}:${e.address}:${e.container}`,children:e.label},`${e.driver}:${e.address}:${e.container}`))]}),p&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Creates a GitHub issue (due date, priority and status stay Canvas-side until the issue syncs back).`})]}),(0,Z.jsx)(fT,{geotag:a.geotag,idPrefix:`todo-geotag`}),!p&&(0,Z.jsx)(aT,{f:o,idPrefix:`todo`}),!p&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving||d,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:h,disabled:!m,children:a.saving||d?`Saving…`:p?`Create issue`:`Save todo`})]})]})}function iL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=pe(),o=iT(n,t.addRelateTo),s=oT(t.activeWorkspaceName),c=async()=>{if(n)try{let t=await a.save(n),i=await o.write(t);r(i?`Identity created; some relations failed`:`Identity created`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create identity`)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsx)(oe,{idPrefix:`add-identity`,workspaceName:t.activeWorkspaceName??void 0,...a,emailValid:a.emailValid}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`identity-comment`,children:`Comment`}),(0,Z.jsx)(`textarea`,{id:`identity-comment`,value:a.comment,onChange:e=>a.setComment(e.target.value),rows:3,placeholder:`How you know them, where they came from…`,className:`flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-elevation-1 transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,Z.jsx)(aT,{f:o,idPrefix:`identity`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:c,disabled:!n||!a.canSave,children:a.saving?`Saving…`:`Save identity`})]})]})}function aL(){let{closeAdd:e}=ol(),t=Dl(),{showSuccessToast:n,showErrorToast:r}=Oo(),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(!1),c=i.trim().replace(/^\/+|\/+$/g,``),l=!!t&&!!c&&!o,u=async()=>{if(!(!l||!t)){s(!0);try{let{workspaceName:r,path:i,treeName:a}=await pl(t),o=i===`/`?``:i;if(a===`backends`){let e=await bl(r,i);await Ns(r,e.driver,e.address,[[e.key,c].filter(Boolean).join(`/`)]),El(t)}else await Ys(r,`${o}/${c}`,!0,a);n(`Folder created`),e()}catch(e){r(e instanceof Error?e.message:`Failed to create folder`)}finally{s(!1)}}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`add-folder-name`,children:`Folder name`}),(0,Z.jsx)(q,{id:`add-folder-name`,value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&u()},placeholder:`e.g. projects/alpha`,autoFocus:!0}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Nested paths are created as needed. Target: `,Ol(t)]})]}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:o,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:u,disabled:!l,children:o?`Creating…`:`Create folder`})]})]})}function oL(){let{openAddPicker:e,closeAdd:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),[a,o]=(0,X.useState)(!1);return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`fixed inset-0 z-picker-scrim bg-scrim animate-fade-in md:hidden`,onClick:()=>e(),"aria-hidden":!0}),(0,Z.jsx)(`div`,{className:`fixed inset-y-0 right-0 z-picker flex items-stretch py-2 pr-2 max-md:bottom-2 max-md:left-2 max-md:top-2 max-md:py-0 max-md:pr-0 max-md:animate-fade-in`,children:(0,Z.jsx)(ae,{sizeClassName:`h-full w-[420px] max-w-full max-md:w-full max-md:shadow-elevation-5`,fixedWorkspaceName:n?.mode===`workspace`?n.workspaceName:void 0,saving:a,onConfirm:async e=>{o(!0);try{await Cl(n,e),r(`${e.length} document${e.length===1?``:`s`} added`),t()}catch(e){i(e instanceof Error?e.message:`Failed to add documents`)}finally{o(!1)}},onClose:e})})]})}function sL(){let{state:e,closeAdd:t}=ol(),{editDocument:n,editWorkspaceId:r}=e,{showSuccessToast:i,showErrorToast:a}=Oo();return!n||!r?null:(0,Z.jsx)(cL,{doc:n,workspaceId:r,onCancel:t,onSaved:t,showSuccessToast:i,showErrorToast:a},`${r}:${n.id}`)}function cL({doc:e,workspaceId:t,onCancel:n,onSaved:r,showSuccessToast:i,showErrorToast:a}){let o=Gc(e,t),s=oT(t),c=async()=>{try{await o.save(),i(`Note updated`),r()}catch(e){a(e instanceof Error?e.message:`Failed to update note`)}};return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`edit-note-title`,children:`Title`}),(0,Z.jsx)(q,{id:`edit-note-title`,value:o.title,onChange:e=>o.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-1 flex-col gap-1.5`,children:[(0,Z.jsx)(G,{children:`Body`}),(0,Z.jsx)(`div`,{className:`flex-1`,children:(0,Z.jsx)(Zc,{kind:`markdown`,value:o.content,onChange:o.setContent,placeholder:`Write your note…`})})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Z.jsx)($c,{...o,onRetry:o.save}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:n,disabled:o.saving,children:`Close`}),(0,Z.jsx)(Y,{size:`sm`,onClick:c,disabled:!o.canSave,children:o.saving?`Saving…`:`Done`})]})]})}function lL(e,t){let n=Kc(e.metadata?.features),[r,i]=(0,X.useState)(String(e.data?.label??``)),[a,o]=(0,X.useState)(n.length?n:e.data?.tags??[]),[s,c]=(0,X.useState)(!1),l=!s;async function u(){c(!0);try{let n=a.map(e=>e.trim()).filter(Boolean);await ys(t,{id:e.id,schema:e.schema,schemaVersion:e.schemaVersion,data:{...e.data,...r.trim()?{label:r.trim()}:{},tags:n},metadata:{features:Qc(a)}}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`))}finally{c(!1)}}return{url:String(e.data?.uri??e.data?.url??``),label:r,setLabel:i,tags:a,setTags:o,saving:s,canSave:l,save:u}}function uL(){let{state:e,closeAdd:t}=ol(),{editDocument:n,editWorkspaceId:r}=e,{showSuccessToast:i,showErrorToast:a}=Oo();return!n||!r?null:(0,Z.jsx)(dL,{doc:n,workspaceId:r,onCancel:t,onSaved:t,showSuccessToast:i,showErrorToast:a})}function dL({doc:e,workspaceId:t,onCancel:n,onSaved:r,showSuccessToast:i,showErrorToast:a}){let o=lL(e,t),s=oT(t);return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(G,{children:[`URL `,(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`(frozen)`})]}),(0,Z.jsx)(q,{value:o.url,disabled:!0,className:`font-mono text-xs`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`edit-link-label`,children:`Label`}),(0,Z.jsx)(q,{id:`edit-link-label`,value:o.label,onChange:e=>o.setLabel(e.target.value),placeholder:`Optional display name`,autoFocus:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:n,disabled:o.saving,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:async()=>{try{await o.save(),i(`Link updated`),r()}catch(e){a(e instanceof Error?e.message:`Failed to update link`)}},disabled:!o.canSave,children:o.saving?`Saving…`:`Save link`})]})]})}var fL=380,pL=300,mL=560,hL={message:{label:`New Message`,icon:ki},note:{label:`New Note`,icon:Da},link:{label:`New Link`,icon:Ui},todo:{label:`New Todo`,icon:pa},identity:{label:`New Identity`,icon:Hr},sketch:{label:`New Sketch`,icon:pr},plaintext:{label:`New Plaintext File`,icon:Ki},file:{label:`Add Files`,icon:Yr},photo:{label:`Photo/Video`,icon:Ur},existing:{label:`Add Existing`,icon:ua},folder:{label:`New Folder`,icon:ni}};function gL(){let{state:e,openAdd:t,openAddPicker:n,closeAdd:r}=ol();Ae(r,e.addOpen);let{addOpen:i,addKind:a,editDocument:o,addModal:s}=e,c=Dl(),l=hl(c),u=l.isBackend&&!!a&&![`file`,`photo`,`folder`,`message`,`plaintext`].includes(a),d=e.activeWorkspaceName,f=!d||!!e.addRelateTo,p=u||a===`message`&&f,m=l.isBackend?[`note`,`link`,`todo`,`identity`,`sketch`,`existing`]:[`plaintext`];f&&m.push(`message`);let h=c?.mode===`workspace`?`${c.workspaceName}:${c.treeName}:${c.path}`:c?.contextId,g=ft();(0,X.useEffect)(()=>{!i||a!==`sketch`||l.isBackend||(r(),g(DE.createUrl(c)))},[i,a,c,r,g,l.isBackend]);let _=Nn(),[v,y]=(0,X.useState)(fL),b=(0,X.useRef)(null),x=(0,X.useCallback)(e=>{e.preventDefault(),b.current={startX:e.clientX,startWidth:v};let t=e=>{if(!b.current)return;let t=b.current.startX-e.clientX,n=Math.min(mL,Math.max(pL,b.current.startWidth+t));y(n)},n=()=>{b.current=null,window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[v]);if(!i)return null;let S=!!o,C=!S&&(!a||p),w,T;S?(w=o.schema===`data/schema/note`?`Edit Note`:`Edit Link`,T=o.schema===`data/schema/note`?Da:Ui):a&&!p?(w=hL[a].label,T=hL[a].icon):(w=`Add`,T=br);let E=(0,Z.jsxs)(Z.Fragment,{children:[_&&!s&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-panel-scrim bg-scrim animate-fade-in`,onClick:r,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{style:_||s?void 0:{width:v},className:K(`flex flex-col overflow-hidden rounded-[var(--panel-radius)] border bg-card surface-glass`,s?`h-full w-full`:_?`fixed bottom-2 left-2 right-2 top-2 z-panel shadow-elevation-5 animate-fade-in`:`relative shrink-0 shadow-elevation-3`),children:[!_&&!s&&(0,Z.jsx)(`div`,{onMouseDown:x,className:`absolute left-0 top-0 bottom-0 z-10 w-1 cursor-col-resize transition-colors hover:bg-primary/20`}),(0,Z.jsxs)(`div`,{className:`flex h-[calc(3rem-1px)] shrink-0 items-center gap-2 border-b-4 px-2`,style:e.activeAccentColor?{borderBottomColor:e.activeAccentColor}:void 0,children:[(0,Z.jsx)(`button`,{type:`button`,className:`canvas-nav-button`,"aria-label":`Back one level`,onClick:()=>C||S?r():n(),children:(0,Z.jsx)(ka,{className:`h-5 w-5`})}),(0,Z.jsxs)(`span`,{className:`flex flex-1 items-center gap-2 text-sm font-medium`,children:[S?(0,Z.jsx)(Lr,{className:`h-4 w-4`}):(0,Z.jsx)(T,{className:`h-4 w-4`}),w]}),(0,Z.jsx)(`button`,{type:`button`,onClick:r,className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,"aria-label":`Close`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[S&&o.schema===`data/schema/note`&&(0,Z.jsx)(sL,{}),S&&o.schema===`data/schema/link`&&(0,Z.jsx)(uL,{}),!S&&C&&e.addRelateTo&&(0,Z.jsxs)(`p`,{className:`border-b px-4 py-2 text-xs text-muted-foreground`,children:[`The new document will be related to `,e.addRelateTo.documents.length,` selected document`,e.addRelateTo.documents.length===1?``:`s`,`.`]}),!S&&l.isBackend&&a!==`message`&&(0,Z.jsx)(`p`,{className:`border-b px-4 py-3 text-xs text-muted-foreground`,children:l.loading?`Checking storage destination…`:l.error||`Files are saved directly to this backend folder. Notes and other database documents belong in context or directory trees.`}),!S&&C&&(!l.isBackend||l.destination)&&(0,Z.jsx)(AE,{onSelect:t,omit:m}),!S&&a===`message`&&!f&&d&&(0,Z.jsx)(R,{workspaceId:d,onClose:r},d),!S&&!l.isBackend&&a===`note`&&(0,Z.jsx)(eL,{},h),!S&&!l.isBackend&&a===`link`&&(0,Z.jsx)(tL,{}),!S&&!l.isBackend&&a===`todo`&&(0,Z.jsx)(rL,{}),!S&&!l.isBackend&&a===`identity`&&(0,Z.jsx)(iL,{}),!S&&l.destination&&a===`plaintext`&&(0,Z.jsx)($I,{},h),!S&&(!l.isBackend||l.destination)&&a===`file`&&(0,Z.jsx)(wT,{},h),!S&&(!l.isBackend||l.destination)&&a===`photo`&&(0,Z.jsx)(wT,{capture:!0},h),!S&&!l.isBackend&&a===`existing`&&(0,Z.jsx)(oL,{}),!S&&(!l.isBackend||l.destination)&&a===`folder`&&(0,Z.jsx)(aL,{},h)]})]})]});return s?(0,Z.jsx)(tn,{label:w,onClose:r,children:E}):E}var _L=(0,X.createContext)(null);function vL(){return(0,X.useContext)(_L)}function yL(){let e=vL(),t=e?.notifications??[];return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-between px-4 h-12 bg-foreground shrink-0`,children:(0,Z.jsx)(`span`,{className:`text-sm font-medium text-background`,children:`Home`})}),(0,Z.jsx)(`div`,{className:`px-4 py-4 border-b border-border shrink-0`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,children:[(0,Z.jsx)(Zn,{className:`w-4 h-4`}),(0,Z.jsx)(`span`,{className:`text-xs font-mono`,children:new Date().toLocaleTimeString()})]})}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(oa,{className:`w-3.5 h-3.5 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:`Notifications`})]}),t.length>0&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 px-1.5 text-xs text-muted-foreground`,onClick:()=>void e?.clear(),title:`Clear notifications`,children:(0,Z.jsx)(Qr,{className:`w-3 h-3`})})]}),t.length===0?(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground text-center py-10 border border-dashed rounded-(--card-radius)`,children:`No notifications`}):(0,Z.jsx)(`div`,{className:`space-y-2`,children:[...t].reverse().map(e=>(0,Z.jsxs)(`div`,{className:`rounded-(--card-radius) border p-2.5`,children:[(0,Z.jsx)(`p`,{className:`text-xs whitespace-pre-wrap break-words`,children:e.text}),(0,Z.jsx)(`p`,{className:`mt-1 text-[10px] text-muted-foreground`,children:new Date(e.timestamp).toLocaleString()})]},e.id))})]})]})}function bL({status:e}){return(0,Z.jsx)(`span`,{className:K(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:e===`starting`||e===`stopping`?`bg-warning`:`bg-muted-foreground`),title:e})}function xL(){let{openAgentT2:e}=ol(),{setSection:t}=qC(),n=ft(),{agents:r,isLoading:i,refresh:a}=MI(!0),{showToast:o}=wo(),[s,c]=(0,X.useState)(new Set),l=(e,t)=>c(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r}),u=async(e,t)=>{e.stopPropagation(),l(t.id,!0);try{await dO(t.id),a()}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed`,variant:`destructive`})}finally{l(t.id,!1)}},d=async(e,t)=>{e.stopPropagation(),l(t.id,!0);try{await fO(t.id),a()}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed`,variant:`destructive`})}finally{l(t.id,!1)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Agents`})}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:i&&r.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading…`}):r.length===0?(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-12 text-muted-foreground`,children:[(0,Z.jsx)(ri,{className:`w-8 h-8 opacity-30`}),(0,Z.jsx)(`span`,{className:`text-xs`,children:`No agents yet`}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{t(`agents`),n(`/agents?create=1`)},className:`text-xs text-primary hover:underline`,children:`Create an agent`})]}):(0,Z.jsx)(`div`,{className:`space-y-1 px-2`,children:r.map(t=>{let n=s.has(t.id);return(0,Z.jsxs)(`div`,{className:`group relative px-3 py-2.5 cursor-pointer transition-colors bg-card hover:bg-accent/50`,style:{borderLeft:`6px solid ${t.color||`transparent`}`},onClick:()=>e(t.id),children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(bL,{status:t.status}),(0,Z.jsx)(`span`,{className:`text-sm font-medium flex-1 truncate`,children:t.label||t.name}),(0,Z.jsx)(`div`,{className:`flex items-center gap-0.5 shrink-0 reveal-on-hover`,children:t.status===`active`?(0,Z.jsx)(`button`,{type:`button`,disabled:n,onClick:e=>d(e,t),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-3 h-3`})}):(0,Z.jsx)(`button`,{type:`button`,disabled:n,onClick:e=>u(e,t),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50`,title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-3 h-3`})})})]}),t.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-4`,children:t.description})]},t.id)})})})]})}function SL(){let e=vL(),[t,n]=(0,X.useState)(50),r=e?.notifications??[],i=r.slice(-t).reverse();return(0,Z.jsxs)(`section`,{"aria-label":`Notification history`,className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 border-b px-4 py-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`h2`,{className:`text-sm font-semibold`,children:[`Notifications`,r.length>0&&(0,Z.jsx)(`span`,{className:`ml-2 font-normal text-muted-foreground`,children:r.length})]}),(0,Z.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`Saved on this browser`})]}),r.length>0&&(0,Z.jsxs)(Y,{variant:`ghost`,size:`sm`,onClick:()=>void e?.clear(),title:`Clear all notifications`,className:`shrink-0 gap-1.5`,children:[(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`}),`Clear all`]})]}),e?.storageError&&(0,Z.jsx)(`p`,{role:`alert`,className:`border-b px-4 py-3 text-xs text-destructive`,children:`Couldn’t access notification history in this browser.`}),e?.loading?(0,Z.jsx)(`p`,{role:`status`,className:`p-4 text-sm text-muted-foreground`,children:`Loading notifications…`}):r.length===0?(0,Z.jsxs)(`div`,{className:`flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center`,children:[(0,Z.jsx)(`div`,{className:`flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,Z.jsx)(oa,{className:`h-5 w-5 text-muted-foreground`})}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No notifications yet`})]}):(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3`,children:[(0,Z.jsx)(`ol`,{className:`space-y-2`,children:i.map(t=>{let n=t.status===`error`?er:t.status===`completed`?Sr:t.status===`started`?Zn:oa;return(0,Z.jsx)(`li`,{"data-notification-id":t.id,className:`rounded-(--card-radius) border bg-card p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(n,{"aria-hidden":!0,className:`mt-0.5 h-4 w-4 shrink-0 ${t.status===`error`?`text-destructive`:`text-muted-foreground`}`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`p`,{className:`break-words text-sm font-medium`,children:t.title}),t.text&&(0,Z.jsx)(`p`,{className:`mt-1 whitespace-pre-wrap break-words text-xs text-muted-foreground`,children:t.text}),(0,Z.jsxs)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsx)(`time`,{dateTime:t.timestamp,children:new Date(t.timestamp).toLocaleString()}),t.status===`started`&&(0,Z.jsx)(`span`,{children:` · Started`}),t.status===`completed`&&(0,Z.jsx)(`span`,{children:` · Completed`}),t.status===`error`&&(0,Z.jsx)(`span`,{children:` · Error`})]})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>void e?.remove(t.id),"aria-label":`Clear notification: ${t.title}`,title:`Clear notification`,className:`-mr-1 -mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent focus-ring touch-target`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})},t.id)})}),r.length>t&&(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,className:`mt-3 w-full`,onClick:()=>n(e=>e+50),children:`Show older notifications`})]})]})}function CL(e){if(!e)return``;if(typeof e.errorMessage==`string`&&e.errorMessage.trim())return e.errorMessage.trim();let t=e.content;return typeof t==`string`?t:Array.isArray(t)&&t.filter(e=>e?.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
|
|
58
|
-
`)||``}function
|
|
59
|
-
`);a=t.pop()??``;for(let e of t){if(!e.startsWith(`data: `))continue;let t=e.slice(6).trim();if(t===`[DONE]`)return;try{let e=JSON.parse(t);if(e.type===`chunk`)c+=e.delta||``,n(e=>{let t=[...e];return t[t.length-1]={role:`assistant`,content:c,isComplete:!1,...l?{reasoning:l}:{},...u?{metadata:u}:{}},t});else if(e.type===`thinking`)l=`${l}${e.delta||``}`.trim(),n(e=>{let t=[...e],n=t[t.length-1]?.content||c;return t[t.length-1]={role:`assistant`,content:n,isComplete:!1,...l?{reasoning:l}:{},...u?{metadata:u}:{}},t});else if(e.type===`complete`){let t=Array.isArray(e.messages)?[...e.messages].reverse().find(e=>e?.role===`assistant`):null,r=CL(t),i=BD(t)||l;u=VD(t),n(e=>{let t=[...e],n=c||t[t.length-1]?.content||``;return t[t.length-1]={role:`assistant`,content:r||n,isComplete:!0,...i?{reasoning:i}:{},...u?{metadata:u}:{}},t})}else e.type===`error`&&o(e.error)}catch{}}},onError:e=>{e.name!==`AbortError`&&o(e.message)},onComplete:()=>{n(e=>{let t=[...e],n=t[t.length-1];return n&&!n.isComplete&&(t[t.length-1]={...n,isComplete:!0}),t}),i(!1)}})}catch(e){let t=e instanceof Error?e:null;t?.name!==`AbortError`&&o(t?.message??`Stream failed`),n(e=>{let t=[...e],n=t[t.length-1];return n&&!n.isComplete&&(t[t.length-1]={...n,isComplete:!0}),t}),i(!1)}},[e,r]),sendVoice:(0,X.useCallback)(async t=>{if(!(r||!e)){o(null),i(!0),n(e=>[...e,{role:`user`,content:`🎤 Transcribing…`,isComplete:!1}]);try{let r=await vO(e,t);n(e=>{let t=[...e];return t[t.length-1]={role:`user`,content:`🎤 ${r.transcript}`,isComplete:!0},[...t,{role:`assistant`,content:r.reply,isComplete:!0}]}),r.audio&&r.audioMimeType&&new Audio(`data:${r.audioMimeType};base64,${r.audio}`).play().catch(()=>{})}catch(e){o(e instanceof Error?e.message:`Voice prompt failed`),n(e=>{let t=[...e],n=t[t.length-1];return n?.role===`user`&&!n.isComplete&&t.pop(),t})}finally{i(!1)}}},[e,r]),stop:(0,X.useCallback)(()=>{s.current?.abort(),i(!1)},[]),clear:(0,X.useCallback)(()=>{n([]),o(null)},[])}}function TL(){let[e,t]=(0,X.useState)(!1),[n,r]=(0,X.useState)(null),i=(0,X.useRef)(null),a=(0,X.useRef)([]);return{isRecording:e,recorderError:n,start:(0,X.useCallback)(async()=>{if(!i.current){if(r(null),!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){r(`Audio recording is not supported in this browser`);return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0}),n=MediaRecorder.isTypeSupported(`audio/webm;codecs=opus`)?`audio/webm;codecs=opus`:void 0,r=new MediaRecorder(e,n?{mimeType:n}:void 0);a.current=[],r.ondataavailable=e=>{e.data.size>0&&a.current.push(e.data)},r.start(),i.current=r,t(!0)}catch(e){let t=e instanceof Error?e:null;r(t?.name===`NotAllowedError`?`Microphone access denied`:t?.message??`Could not start recording`)}}},[]),stop:(0,X.useCallback)(()=>{let e=i.current;return e?new Promise(n=>{e.onstop=()=>{e.stream.getTracks().forEach(e=>e.stop()),i.current=null,t(!1);let r=e.mimeType||`audio/webm`,o=new Blob(a.current,{type:r});a.current=[],n(o.size>0?o:null)},e.stop()}):Promise.resolve(null)},[]),cancel:(0,X.useCallback)(()=>{let e=i.current;e&&(e.onstop=()=>{e.stream.getTracks().forEach(e=>e.stop())},e.stop(),i.current=null,a.current=[],t(!1))},[])}}function EL({agentId:e,onClose:t}){let[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(null),{showToast:m}=wo(),h=ul(),g=h?.state.activeContextType===`context`?h.state.activeContextId:null,_=h?.state.activeContextPath??null,v=(0,X.useRef)(null),y=(0,X.useRef)(null),{messages:b,isStreaming:x,error:S,send:C,sendVoice:w,stop:T,clear:E}=wL(e),{isRecording:D,recorderError:O,start:k,stop:A}=TL();(0,X.useEffect)(()=>{QD(e).then(r).catch(()=>{}),KD(e).then(l).catch(()=>l(null))},[e]),(0,X.useEffect)(()=>{_O().then(e=>s(!!(e.enabled&&e.stt))).catch(()=>s(!1))},[]),(0,X.useEffect)(()=>{b.length!==0&&v.current?.scrollIntoView({behavior:`smooth`})},[b]);let j=c?.binding.type===`context`&&!!g&&c?.binding.context===g,M=c?c.binding.type===`global`?`scope: global`:c.binding.type===`context`?j?`scoped to this context`:`context-bound`:`scope: ${c.binding.workspaceName||c.binding.workspace}${c.binding.type===`path`?`:${c.binding.path||`/`}`:``}`:`no canvas access`,N=async()=>{if(!g||u)return;let t=g||_;if(window.confirm(`Bind "${n?.label||n?.name||e}" to the current context (${t})? This mints a new canvas token and restarts the agent if it is running.`)){d(!0);try{let t=await qD(e,{binding:{type:`context`,context:g},permissions:[`read`,`write`]});l(t.access),p(t.token)}catch(e){m({title:`Error`,description:e instanceof Error?e.message:`Bind failed`,variant:`destructive`})}finally{d(!1)}}},P=async()=>{let e=i.trim();!e||x||(a(``),y.current?.focus(),await C(e))};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-3 h-12 border-b border-border shrink-0`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:t,className:`p-1 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Back to agents`,children:(0,Z.jsx)(ka,{className:`w-4 h-4`})}),n?.color&&(0,Z.jsx)(`span`,{className:`w-2.5 h-2.5 rounded-full shrink-0`,style:{backgroundColor:n.color}}),(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium truncate`,children:n?.label||n?.name||e}),(0,Z.jsx)(`div`,{className:`text-[10px] leading-tight text-muted-foreground truncate`,title:M,children:M})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:E,className:`p-1 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Clear chat`,children:(0,Z.jsx)(Qr,{className:`w-3.5 h-3.5`})})]}),g&&!j&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 border-b border-border bg-muted/40 text-xs shrink-0`,children:[(0,Z.jsxs)(`span`,{className:`flex-1 truncate text-muted-foreground`,title:g||_||void 0,children:[`Toolbox context: `,g||_]}),(0,Z.jsx)(`button`,{type:`button`,disabled:u,onClick:N,className:`shrink-0 rounded border border-input px-2 py-1 hover:bg-accent disabled:opacity-50`,children:u?`Binding…`:`Bind to this context`})]}),f&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 border-b border-border bg-warning/10 text-xs shrink-0`,children:[(0,Z.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`Token (shown once):`}),(0,Z.jsx)(`code`,{className:`flex-1 truncate font-mono`,children:f}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>navigator.clipboard?.writeText(f),className:`shrink-0 rounded border border-input px-2 py-1 hover:bg-accent`,children:`Copy`}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>p(null),className:`shrink-0 rounded px-1.5 py-1 hover:bg-accent`,title:`Dismiss`,children:`×`})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto px-4 py-3 space-y-3`,children:[b.length===0&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground text-center py-10`,children:n?`Chat with ${n.label||n.name}`:`Loading…`}),b.map((e,t)=>(0,Z.jsxs)(`div`,{className:K(`text-sm rounded-lg px-3 py-2 max-w-[85%] break-words`,e.role===`user`?`ml-auto bg-foreground text-background`:`mr-auto bg-muted text-foreground`),children:[(0,Z.jsx)(uM,{reasoning:e.role===`assistant`?e.reasoning:void 0,metadata:e.role===`assistant`?e.metadata:void 0,isStreaming:!e.isComplete,compact:!0}),e.role===`assistant`?(0,Z.jsx)(F,{content:e.content||(e.isComplete?``:`…`)}):(0,Z.jsx)(`span`,{className:`whitespace-pre-wrap`,children:e.content})]},t)),(S||O)&&(0,Z.jsx)(`div`,{className:`text-xs text-destructive text-center py-1`,children:S||O}),(0,Z.jsx)(`div`,{ref:v})]}),(0,Z.jsx)(`div`,{className:`p-3 border-t border-border shrink-0`,children:(0,Z.jsxs)(`div`,{className:`flex gap-2 items-end`,children:[(0,Z.jsx)(`textarea`,{ref:y,value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),P())},placeholder:`Message…`,rows:2,className:`flex-1 resize-y text-sm px-3 py-2 border border-input bg-background rounded-md focus:outline-none focus:ring-1 focus:ring-ring min-h-[38px] max-h-[120px]`}),o&&(0,Z.jsx)(`button`,{type:`button`,onClick:async()=>{if(D){let e=await A();e&&await w(e)}else x||await k()},disabled:x&&!D,className:K(`flex items-center justify-center w-9 h-9 rounded-md transition-opacity shrink-0 disabled:opacity-40`,D?`bg-destructive text-destructive-foreground hover:opacity-90 animate-pulse`:`bg-muted text-foreground hover:bg-accent`),title:D?`Stop recording and send`:`Record a voice message`,children:D?(0,Z.jsx)(Sa,{className:`w-4 h-4`}):(0,Z.jsx)(ci,{className:`w-4 h-4`})}),x?(0,Z.jsx)(`button`,{type:`button`,onClick:T,className:`flex items-center justify-center w-9 h-9 rounded-md bg-destructive text-destructive-foreground hover:opacity-90 transition-opacity shrink-0`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-4 h-4`})}):(0,Z.jsx)(`button`,{type:`button`,onClick:P,disabled:!i.trim(),className:`flex items-center justify-center w-9 h-9 rounded-md bg-foreground text-background hover:opacity-90 disabled:opacity-40 transition-opacity shrink-0`,title:`Send`,children:(0,Z.jsx)(Ia,{className:`w-4 h-4`})})]})})]})}function DL(){let{state:e,openApplet:t}=ol(),[n,r]=(0,X.useState)(`context`),i=e.appsAppletId,a=i?_C.find(e=>e.id===i):null;if(a)return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t(null),className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,"aria-label":`Back to applets`,title:`Back to applets`,children:(0,Z.jsx)(ka,{className:`h-4 w-4`})}),(0,Z.jsx)(a.icon,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:a.label})]}),(0,Z.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,Z.jsx)(a.Component,{})})]});let o=vC(n);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(`div`,{className:`flex shrink-0 border-b border-border`,children:[`context`,`global`].map(e=>(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(e),className:K(`flex-1 py-2.5 text-xs capitalize transition-colors`,n===e?`-mb-px border-b-2 border-foreground font-semibold text-foreground`:`font-medium text-muted-foreground hover:text-foreground`),children:e},e))}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3`,children:[!o.length&&(0,Z.jsxs)(`p`,{className:`py-10 text-center text-sm text-muted-foreground`,children:[`No `,n,` applets yet.`]}),(0,Z.jsx)(`div`,{className:`grid grid-cols-2 gap-2`,children:o.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>t(e.id),className:`flex min-h-[4.5rem] flex-col items-center justify-center gap-1.5 rounded-(--card-radius) border border-border bg-muted/40 p-3 text-foreground transition-colors hover:bg-muted`,title:e.description,children:[(0,Z.jsx)(e.icon,{className:`h-5 w-5 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-xs font-medium leading-none`,children:e.label})]},e.id))})]})]})}var OL=[{view:`apps`,icon:Ga,label:`Apps`},{view:`tools`,icon:Ci,label:`Filters`},{view:`agents`,icon:ri,label:`Agents`},{view:`notifications`,icon:oa,label:`Notifications`}],kL=340,AL=`toolbox:width`,jL=360,ML=48,NL=e=>{let t=typeof window<`u`?window.innerWidth:1600,n=Math.max(kL,Math.min(Math.round(t*.7),t-ML-jL));return Math.max(kL,Math.min(e,n))},PL=()=>typeof window<`u`?Math.round(window.innerWidth/2):720;function FL(){let{state:e,setView:t,closeT1:n,closeT2:r}=ol();Ae(n,e.t1Open&&!e.t2Open),Ae(r,e.t2Open);let{t1Open:i,t1View:a,t2Open:o,t2AgentId:s,activeAccentColor:c}=e,l=Nn(),[u,d]=(0,X.useState)(()=>{let e=typeof window<`u`?Number(localStorage.getItem(AL)):NaN;return Number.isFinite(e)&&e>0?e:420}),f=(0,X.useCallback)(e=>{d(e);try{localStorage.setItem(AL,String(e))}catch{}},[]),p=(0,X.useRef)(null),m=(0,X.useCallback)(e=>{e.preventDefault(),p.current={startX:e.clientX,startWidth:u};let t=e=>{if(!p.current)return;let t=NL(p.current.startWidth-(e.clientX-p.current.startX));d(t)},n=()=>{p.current=null,window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n),d(e=>{try{localStorage.setItem(AL,String(e))}catch{}return e})};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[u]),h=u>=PL()*.9;return(0,X.useEffect)(()=>{let e=()=>d(e=>NL(e));return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),!i||!a?null:(0,Z.jsxs)(Z.Fragment,{children:[l&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-panel-scrim bg-scrim animate-fade-in`,onClick:n,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{style:l?void 0:{width:u},className:K(`flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card surface-glass text-foreground`,l?`fixed bottom-2 left-2 right-2 top-2 z-panel shadow-elevation-5 animate-fade-in`:`relative shrink-0 shadow-elevation-3`),children:[!l&&(0,Z.jsx)(`div`,{onMouseDown:m,className:`absolute left-0 top-0 z-20 h-full w-1.5 cursor-col-resize hover:bg-primary/20`,title:`Drag to resize`,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{className:`flex h-[calc(3rem-1px)] shrink-0 items-center justify-between gap-1 border-b-4 px-2`,style:c?{borderBottomColor:c}:void 0,children:[(0,Z.jsx)(`div`,{className:`flex items-center gap-1`,children:OL.map(({view:e,icon:n,label:r})=>(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t(e),"aria-label":r,title:r,className:K(`flex h-10 w-11 items-center justify-center rounded-md transition-colors`,a===e?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/60 hover:text-foreground`),children:(0,Z.jsx)(n,{className:`h-4 w-4 shrink-0`})},e))}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[!l&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>f(h?420:NL(PL())),className:`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,"aria-label":h?`Shrink toolbox`:`Expand toolbox`,title:h?`Shrink toolbox`:`Expand to half screen`,children:h?(0,Z.jsx)(ei,{className:`h-4 w-4`}):(0,Z.jsx)(ba,{className:`h-4 w-4`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:n,className:`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,"aria-label":`Close toolbox`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]})]}),(0,Z.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col ${o&&s?`invisible`:``}`,children:[a===`home`&&(0,Z.jsx)(yL,{}),a===`apps`&&(0,Z.jsx)(DL,{}),a===`tools`&&(0,Z.jsx)(pC,{}),a===`agents`&&(0,Z.jsx)(xL,{}),a===`notifications`&&(0,Z.jsx)(SL,{})]}),o&&s&&(0,Z.jsx)(`div`,{className:`absolute inset-0 z-10 flex flex-col bg-background`,children:(0,Z.jsx)(EL,{agentId:s,onClose:r})})]})]})]})}function IL(){let{running:e,hasViewer:t,paused:n,snapshot:r,source:i,lastCount:a,error:o,setPaused:s,stop:c,reopen:l}=Ex();if(!e||t)return null;let u=i===`screen`?mr:i===`photo`?zn:Ur;return(0,Z.jsxs)(`div`,{className:K(`fixed right-4 w-56 overflow-hidden rounded-(--panel-radius) border border-border bg-card shadow-elevation-4 z-panel animate-fade-in`,`bottom-fab-inset md:bottom-[calc(var(--spacing-fab-inset)+5rem)]`),role:`status`,"aria-label":`Lens feed running`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:l,title:`Back to Lens`,className:`relative block w-full cursor-pointer bg-black/80 aspect-video`,children:[(0,Z.jsx)(Bx,{className:`h-full w-full`}),r&&(0,Z.jsx)(`img`,{src:r,alt:``,className:`absolute inset-0 h-full w-full bg-black object-contain`}),n&&(0,Z.jsx)(`span`,{className:`absolute inset-0 flex items-center justify-center bg-black/50 text-xs font-medium text-white`,children:`paused`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5`,children:[(0,Z.jsx)(u,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[11px] text-muted-foreground`,children:o?(0,Z.jsx)(`span`,{className:`text-destructive`,children:o}):n?`paused`:r?`${i===`photo`?`photo`:`snapshot`} · ${a??`…`} match${a===1?``:`es`}`:`live · ${a??`…`} match${a===1?``:`es`}`}),i!==`photo`&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>s(!n),"aria-label":n?`Resume Lens`:`Pause Lens`,title:n?`Resume searching`:`Pause searching (camera stays on)`,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:n?(0,Z.jsx)(Ar,{className:`h-3.5 w-3.5`}):(0,Z.jsx)(Jr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:l,"aria-label":`Reopen Lens panel`,title:`Reopen Lens`,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:(0,Z.jsx)(ba,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:c,"aria-label":`Stop Lens feed`,title:`Stop the feed`,className:`rounded p-1 text-destructive transition-colors hover:bg-destructive/10`,children:(0,Z.jsx)(Yi,{className:`h-3.5 w-3.5`})})]})]})}var LL=[`view`,`location`,`metadata`,`json`,`synapses`,`backends`];function RL(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`document`)??``,r=t.get(`workspace`);if(!r||!/^\d+$/.test(n)||!Number.isSafeInteger(Number(n))||Number(n)<=0)return null;let i=t.get(`section`);return{workspaceId:r,documentId:Number(n),section:LL.includes(i)?i:`view`,maximized:t.get(`fullscreen`)===`1`}}function zL(e){let t=new URLSearchParams({document:String(e.documentId),workspace:e.workspaceId});return e.section!==`view`&&t.set(`section`,e.section),e.maximized&&t.set(`fullscreen`,`1`),`#${t}`}function BL({children:e}){let t=vn(),n=ft(),r=(0,X.useMemo)(()=>RL(t.hash),[t.hash]),i=r?.workspaceId,a=r?.documentId,o=i&&a?JSON.stringify([i,a]):null,[s,c]=(0,X.useState)(0),[l,u]=(0,X.useState)(null),d=l?.key===o&&l?.revision===s?l:null;(0,X.useEffect)(()=>{if(!o||!i||!a||d)return;let e=!1;return xc(i,a).then(t=>{e||u({key:o,revision:s,document:t,error:t?void 0:`Document not found.`})}).catch(t=>{e||u({key:o,revision:s,document:null,error:t?.statusCode===404?`Document not found.`:`Unable to load this document.`})}),()=>{e=!0}},[o,i,a,s,d]);let f=(0,X.useCallback)((e,r)=>{u({key:JSON.stringify([r,e.id]),revision:s,document:e}),n({pathname:t.pathname,search:t.search,hash:zL({workspaceId:r,documentId:e.id,section:`view`,maximized:!1})},{state:t.state})},[n,t.pathname,t.search,t.state,s]),p=(0,X.useCallback)(()=>{r&&n({pathname:t.pathname,search:t.search,hash:``},{replace:!0,state:t.state})},[r,n,t.pathname,t.search,t.state]),m=(0,X.useCallback)((e,i)=>{r&&(u({key:JSON.stringify([i,e.id]),revision:s,document:e}),n({pathname:t.pathname,search:t.search,hash:zL({...r,workspaceId:i,documentId:e.id})},{replace:!0,state:t.state}))},[r,s,n,t.pathname,t.search,t.state]),h=(0,X.useCallback)(e=>{r&&n({pathname:t.pathname,search:t.search,hash:zL({...r,...e})},{replace:!0,state:t.state})},[r,n,t.pathname,t.search,t.state]),g=(0,X.useCallback)(()=>c(e=>e+1),[]),_=(0,X.useMemo)(()=>({entry:d?.document&&i?{document:d.document,workspaceId:i}:null,location:r,loading:!!r&&!d,error:d?.error,open:f,replace:m,close:p,update:h,retry:g}),[d,i,r,f,m,p,h,g]);return(0,Z.jsx)(ge.Provider,{value:_,children:e})}function VL({children:e}){let[t,n]=(0,X.useState)(null),r=(0,X.useCallback)((e,t)=>n({document:e,workspaceId:t}),[]),i=(0,X.useCallback)(()=>n(null),[]),a=(0,X.useMemo)(()=>({open:r,close:i}),[r,i]);return(0,Z.jsxs)(U.Provider,{value:a,children:[e,(0,Z.jsx)(Me,{document:t?.document??null,isOpen:!!t,onClose:i,workspaceId:t?.workspaceId})]})}var HL={key:`desk`,label:`Desk`,main:`/`,mainExpanded:!1,entries:[]},UL=0,WL=()=>`c${++UL}`;function GL(e,t){return e.kind===`route`&&t.kind===`route`?e.location===t.location:e.kind===`document`&&t.kind===`document`&&e.document.id===t.document.id&&e.workspaceId===t.workspaceId}function KL({children:e}){let t=vn(),n=ft(),[r,i]=(0,X.useState)([HL]),[a,o]=(0,X.useState)(0),[s,c]=(0,X.useState)(S),l=(0,X.useRef)(r),u=(0,X.useRef)(a),d=(0,X.useRef)(s);(0,X.useEffect)(()=>{l.current=r,u.current=a,d.current=s},[r,a,s]);let f=(0,X.useCallback)((e,t)=>{let n=l.current.slice();n[e]=t,l.current=n,i(n)},[]),p=(0,X.useCallback)(e=>{let t=u.current,n=l.current[t];n&&f(t,e(n))},[f]),m=t.pathname+t.search;(0,X.useEffect)(()=>{p(e=>e.main===m?e:{...e,main:m})},[m,p]);let h=(0,X.useCallback)(e=>{let t=l.current[u.current];if(!t)return;let n=t.entries.find(t=>GL(e,t));if(n){c(n.id);return}let r={...e,id:WL()},i=t.entries.findIndex(e=>e.id===d.current),a=t.entries.slice();a.splice(i>=0?i+1:0,0,r),p(e=>({...e,entries:a})),d.current=r.id,c(r.id)},[p]),g=(0,X.useCallback)((e,t)=>{h({kind:`document`,document:e,workspaceId:t})},[h]),_=(0,X.useCallback)((e,t)=>{let n=`document-preview`;p(r=>{let i=r.entries.find(e=>e.id===n),a={kind:`document`,id:n,document:e,workspaceId:t,expanded:i?.expanded};return{...r,entries:[a,...r.entries.filter(e=>e.id!==n)]}}),d.current=n,c(n)},[p]),v=(0,X.useCallback)(e=>{p(t=>({...t,entries:t.entries.filter(t=>t.id!==e)})),c(t=>t===e?S:t)},[p]),y=(0,X.useCallback)((e,t)=>{p(n=>({...n,entries:n.entries.map(n=>n.id===e&&n.kind===`route`?{...n,location:t}:n)}))},[p]),b=(0,X.useCallback)(e=>{p(t=>e===`main`?{...t,mainExpanded:!t.mainExpanded}:{...t,entries:t.entries.map(t=>t.id===e?{...t,expanded:!t.expanded}:t)})},[p]),x=(0,X.useCallback)(e=>{let t=l.current[e];t&&(u.current=e,o(e),c(S),n(t.main))},[n]),C=(0,X.useCallback)((e,t,n)=>{let r=l.current.findIndex(t=>t.key===e);if(r>=0){x(r);return}let a=[...l.current,{key:e,label:t,main:n,mainExpanded:!1,entries:[]}];l.current=a,i(a),x(a.length-1)},[x]),w=(0,X.useCallback)(e=>{x(u.current+e)},[x]),T=(0,X.useCallback)(e=>{let t=l.current.findIndex(t=>t.key===e);if(t<=0)return;let n=l.current.filter(t=>t.key!==e);l.current=n,i(n);let r=u.current;r===t?x(Math.min(t,n.length-1)):r>t&&(u.current=r-1,o(r-1))},[x]),E=(0,X.useMemo)(()=>({rows:r,activeRow:a,focus:s,setFocus:c,openCanvas:h,openDocument:g,closeCanvas:v,navigateCanvas:y,toggleExpanded:b,activateRow:C,moveRow:w,closeRow:T}),[r,a,s,h,g,v,y,b,C,w,T]),D=(0,X.useMemo)(()=>({entry:null,open:g,preview:_,close:()=>{}}),[g,_]);return(0,Z.jsx)(It.Provider,{value:E,children:(0,Z.jsx)(ge.Provider,{value:D,children:e})})}function qL(e){return Yt(typeof e==`string`?Rt(e):e)}function JL({location:e,onNavigate:t}){let n=(0,X.useMemo)(()=>{let t=Rt(e);return{pathname:t.pathname||`/`,search:t.search||``,hash:t.hash||``,state:null,key:e}},[e]),r=(0,X.useMemo)(()=>({basename:`/`,static:!1,useTransitions:void 0,future:{},navigator:{createHref:qL,go:()=>{},push:e=>t(qL(e)),replace:e=>t(qL(e))}}),[t]);return(0,Z.jsx)(mn.Provider,{value:r,children:(0,Z.jsx)(v.Provider,{value:{location:n,navigationType:We.Push},children:(0,Z.jsx)(kt.Provider,{value:{outlet:null,matches:[],isDataRoute:!1},children:(0,Z.jsx)(nt,{children:aF})})})})}var YL=`input, textarea, select, [contenteditable=""], [contenteditable="true"]`,XL=420,ZL=e=>e<=0?0:e>=1?1:e<.5?2**(20*e-10)/2:(2-2**(-20*e+10))/2;function QL(e,t,n){if(window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return e.scrollLeft=t,n?.(),()=>{};let r=e.scrollLeft,i=t-r;if(Math.abs(i)<1)return n?.(),()=>{};let a=e.style.scrollSnapType;e.style.scrollSnapType=`none`;let o=performance.now(),s=0,c=t=>{let l=Math.min(1,(t-o)/XL);e.scrollLeft=r+i*ZL(l),l<1?s=requestAnimationFrame(c):(e.style.scrollSnapType=a,n?.())};return s=requestAnimationFrame(c),()=>{cancelAnimationFrame(s),e.style.scrollSnapType=a}}function $L(e,t){let n=parseFloat(getComputedStyle(e).gap)||0,r=t.getBoundingClientRect().left-e.getBoundingClientRect().left+e.scrollLeft,i=r+t.offsetWidth,a=e.scrollLeft,o=a+e.clientWidth;return r<a?Math.max(0,r-n):i>o?i+n-e.clientWidth:a}function eR({section:e}){return e===`contexts`?(0,Z.jsx)(IF,{}):e===`workspaces`?(0,Z.jsx)(iI,{}):e===`agents`?(0,Z.jsx)(PI,{}):e===`admin`?(0,Z.jsx)(BI,{}):e===`apps`?(0,Z.jsx)(rw,{}):e===`settings`?(0,Z.jsx)(BI,{}):null}function tR(e,t,n){if(e?.kind===`document`)return Ho(e.document).title;let r=(e?.kind===`route`?e.location:t).split(/[?#]/)[0];if(r===`/settings`)return`Settings`;let i=SC.flatMap(e=>[...e.items]).find(e=>e.path===r);if(i)return i.label;let a=r.split(`/`).filter(Boolean);if(a.length===0)return`Desk`;if(a[0]===`workspaces`&&a.length===2){let e=decodeURIComponent(a[1]),t=n.find(t=>t.id===e)??n.find(t=>t.name===e);return t?.label||t?.name||`Workspace`}return decodeURIComponent(a[a.length-1])}function nR({id:e,title:t,expanded:n,focused:r,onFocus:i,onToggleExpanded:a,onClose:o,badge:s,contentHeader:c,children:l}){let u=w();return(0,Z.jsxs)(`section`,{"data-reader-pane":c?!0:void 0,style:c&&!n?{"--reader-width":`${u??420}px`,...u?{transition:`none`}:{}}:void 0,"data-strip-col":e,className:K(`strip-canvas surface-sheet relative`,n&&`strip-canvas--wide`,r&&`strip-canvas--focused`),onPointerDownCapture:()=>i(e),"aria-label":t,children:[c&&!n&&(0,Z.jsx)(je,{edge:`right`}),!c&&(0,Z.jsxs)(`header`,{className:`strip-canvas-bar`,children:[s&&(0,Z.jsx)(`span`,{className:`strip-row-label`,children:s}),(0,Z.jsx)(`span`,{className:`strip-canvas-title`,title:t,children:t}),(0,Z.jsx)(`button`,{type:`button`,className:`strip-canvas-btn`,title:n?`Card size`:`Expand to full width`,"aria-pressed":n,onClick:()=>a(e),children:n?(0,Z.jsx)(ei,{className:`size-3.5`}):(0,Z.jsx)(ba,{className:`size-3.5`})}),o&&(0,Z.jsx)(`button`,{type:`button`,className:`strip-canvas-btn`,title:s?`Close row`:`Close canvas`,onClick:()=>o(e),children:(0,Z.jsx)(vr,{className:`size-3.5`})})]}),(0,Z.jsx)(`div`,{className:`strip-canvas-body`,children:l})]})}function rR(e){return K(`relative flex-1 min-h-0 min-w-0 overflow-auto`,!GI(e)&&!WI(e)&&`p-page`)}function iR({row:e,pathname:t,rowLabel:n,onCloseRow:r,workspaces:i}){let{focus:a,setFocus:o,toggleExpanded:s,closeCanvas:c,navigateCanvas:l}=Nt(),u=(0,X.useCallback)(e=>t=>l(e,t),[l]);return(0,Z.jsxs)(Z.Fragment,{children:[t===`/`?(0,Z.jsx)(`div`,{hidden:!0,children:(0,Z.jsx)(Gt,{})}):(0,Z.jsx)(nR,{id:S,title:tR(null,t,i),expanded:e.mainExpanded,focused:a===S,onFocus:o,onToggleExpanded:s,badge:n,onClose:r,children:(0,Z.jsx)(`main`,{id:`content-area`,className:rR(t),children:(0,Z.jsx)(Gt,{})})}),e.entries.map(e=>(0,Z.jsx)(nR,{id:e.id,title:tR(e,t,i),expanded:!!e.expanded,focused:a===e.id,onFocus:o,onToggleExpanded:s,contentHeader:e.kind===`document`,onClose:c,children:e.kind===`route`?(0,Z.jsx)(`div`,{className:rR(e.location.split(`?`)[0]),children:(0,Z.jsx)(JL,{location:e.location,onNavigate:u(e.id)})}):(0,Z.jsx)(`div`,{className:`flex flex-1 min-h-0 min-w-0 items-stretch`,children:(0,Z.jsx)(O,{entry:e,onClose:()=>c(e.id),frame:{expanded:!!e.expanded,onToggleExpanded:()=>s(e.id)}})})},e.id))]})}function aR({row:e,workspaces:t}){return(0,Z.jsxs)(`div`,{className:`strip-ghost-row`,"aria-hidden":!0,children:[(0,Z.jsx)(`span`,{className:`strip-ghost-chip strip-ghost-chip--main`,children:tR(null,e.main,t)}),e.entries.map(n=>(0,Z.jsx)(`span`,{className:`strip-ghost-chip`,children:tR(n,e.main,t)},n.id))]})}function oR(){let{state:e,closeM1:t,closeM2:n}=qC(),[r,i]=(0,X.useState)(280),{rows:a,activeRow:o,focus:s,setFocus:c,moveRow:l,closeRow:u}=Nt(),{pathname:d}=vn(),{workspaces:f}=nI(d.startsWith(`/workspaces/`)||a.some(e=>e.main.startsWith(`/workspaces/`)||e.entries.some(e=>e.kind===`route`&&e.location.startsWith(`/workspaces/`)))),p=UC(),m=(0,X.useRef)(null);Ae(t,e.m1Open&&!e.m2Open),Ae(n,e.m2Open),(0,X.useLayoutEffect)(()=>{let e=m.current;if(!e)return;let t=()=>{e.style.setProperty(`--strip-w`,`${e.clientWidth}px`),e.style.setProperty(`--strip-h`,`${e.clientHeight}px`)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let h=(0,X.useRef)(e.m1Open);(0,X.useEffect)(()=>{e.m1Open&&!h.current&&!e.m2Open&&c(`m1`),h.current=e.m1Open},[e.m1Open,e.m2Open,c]);let g=(0,X.useRef)(e.m2Open);(0,X.useEffect)(()=>{e.m2Open&&!g.current&&c(`m2`),!e.m2Open&&g.current&&s===`m2`&&c(e.m1Open?`m1`:S),g.current=e.m2Open},[e.m2Open,e.m1Open,s,c]),(0,X.useEffect)(()=>{!e.m1Open&&s===`m1`&&c(S)},[e.m1Open,s,c]),(0,X.useEffect)(()=>{let e=m.current,t=e?.querySelector(`[data-strip-col="${CSS.escape(s)}"]`);if(!(!e||!t))return QL(e,$L(e,t))},[s,a,o,e.m1Open,e.m2Open]);let _=(0,X.useCallback)(()=>{let t=a[o];return[...e.m1Open?[`m1`]:[],...e.m2Open?[`m2`]:[],...d===`/`?[]:[S],...t?t.entries.map(e=>e.id):[]]},[a,o,e.m1Open,e.m2Open,d]);return(0,X.useEffect)(()=>{let e=e=>{if(e.defaultPrevented||e.isComposing||!e.key.startsWith(`Arrow`)||!WC(e,p))return;let t=e.target;if(!(t?.closest(YL)||t?.closest(`[role="dialog"]`))){if(e.key===`ArrowLeft`||e.key===`ArrowRight`){let t=_(),n=t[Math.max(0,t.indexOf(s))+(e.key===`ArrowRight`?1:-1)];if(!n)return;e.preventDefault(),c(n)}else(e.key===`ArrowUp`||e.key===`ArrowDown`)&&a.length>1&&(e.preventDefault(),l(e.key===`ArrowDown`?1:-1))}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[_,s,c,l,a.length,p]),(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`strip-shell flex h-viewport w-full overflow-hidden surface-desk gap-shell p-shell`,children:[(0,Z.jsx)(AF,{}),(0,Z.jsxs)(`div`,{ref:m,className:`strip-scroller`,style:{"--strip-menu-space":`${(e.m1Open?280:0)+(e.m2Open?r:0)}px`},children:[e.m1Open&&(0,Z.jsx)(`div`,{"data-strip-col":`m1`,className:K(`strip-col strip-menu-col`,s===`m1`&&`strip-col--focused`),onPointerDownCapture:()=>c(`m1`),children:(0,Z.jsx)(eR,{section:e.activeSection})}),e.m2Open&&(0,Z.jsxs)(`div`,{"data-strip-col":`m2`,style:{width:r,position:`relative`},className:K(`strip-col strip-menu-col`,s===`m2`&&`strip-col--focused`),onPointerDownCapture:()=>c(`m2`),children:[(0,Z.jsx)(HI,{}),(0,Z.jsx)(NF,{width:r,onResize:i})]}),(0,Z.jsx)(`div`,{className:`strip-rows`,style:{transform:`translateY(${-o*100}%)`},children:a.map((e,t)=>(0,Z.jsx)(`div`,{className:K(`strip-row`,t===o&&`strip-row--active`),children:(0,Z.jsx)(`div`,{className:`strip-row-canvases`,children:t===o?(0,Z.jsx)(iR,{row:e,workspaces:f,pathname:d,rowLabel:a.length>1?e.label:void 0,onCloseRow:t>0?()=>u(e.key):void 0}):(0,Z.jsx)(aR,{row:e,workspaces:f})})},e.key))})]}),(0,Z.jsx)(gL,{}),(0,Z.jsx)(FL,{})]}),(0,Z.jsx)(YI,{}),(0,Z.jsx)(kF,{}),(0,Z.jsx)(IL,{})]})}function sR(){let e=PC();return(0,Z.jsx)(pF,{children:(0,Z.jsx)(QI,{children:(0,Z.jsx)(fS,{children:(0,Z.jsx)(Vx,{children:(0,Z.jsx)(BL,{children:e===`strip`?(0,Z.jsx)(KL,{children:(0,Z.jsx)(VL,{children:(0,Z.jsx)(oR,{})})}):(0,Z.jsxs)(VL,{children:[(0,Z.jsxs)(`div`,{className:`flex h-viewport w-full overflow-hidden surface-desk gap-shell p-shell`,children:[(0,Z.jsx)(AF,{}),(0,Z.jsx)(UI,{}),(0,Z.jsx)(JI,{}),(0,Z.jsx)(gL,{}),(0,Z.jsx)(FL,{})]}),(0,Z.jsx)(YI,{}),(0,Z.jsx)(kF,{}),(0,Z.jsx)(IL,{})]})})})})})})}var cR=da,lR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Ii,{ref:n,className:K(`fixed top-0 right-0 z-toast flex max-h-screen w-full flex-col-reverse gap-2 p-4 sm:right-0 sm:flex-col md:max-w-[420px]`,e),...t}));lR.displayName=Ii.displayName;var uR=Qa(`group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-elevation-3 transition-all duration-normal data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full`,{variants:{variant:{default:`border bg-background`,destructive:`destructive group border-destructive bg-destructive text-destructive-foreground`}},defaultVariants:{variant:`default`}}),dR=X.forwardRef(({className:e,variant:t,...n},r)=>(0,Z.jsx)(na,{ref:r,className:K(uR({variant:t}),e),...n}));dR.displayName=na.displayName;var fR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Oa,{ref:n,className:K(`inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive`,e),...t}));fR.displayName=Oa.displayName;var pR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(wi,{ref:n,className:K(`absolute right-2 top-2 rounded-md p-1 text-foreground/50 reveal-on-hover hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:text-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive group-[.destructive]:focus:ring-offset-destructive`,e),"toast-close":``,...t,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})}));pR.displayName=wi.displayName;var mR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Vi,{ref:n,className:K(`text-sm font-semibold`,e),...t}));mR.displayName=Vi.displayName;var hR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Mi,{ref:n,className:K(`text-sm opacity-90`,e),...t}));hR.displayName=Mi.displayName;var gR=`canvas-notifications`,_R=`notifications`,vR=`canvas:notification-history`,yR,bR;function xR(){try{let e=localStorage.getItem(`authToken`);if(e){let t=eo(e),n=t.sub||t.userId||t.id||t.email;if(typeof n==`string`||typeof n==`number`)return JSON.stringify([t.iss||``,n])}}catch{}return`anonymous`}function SR(){return yR||=new Promise((e,t)=>{let n=indexedDB.open(gR,1);n.onupgradeneeded=()=>{n.result.createObjectStore(_R,{keyPath:[`account`,`id`]}).createIndex(`account`,`account`)},n.onsuccess=()=>{let t=n.result;t.onversionchange=()=>{t.close(),yR=void 0},e(t)},n.onerror=()=>t(n.error)}).catch(e=>{throw yR=void 0,e}),yR}function CR(){return!bR&&typeof BroadcastChannel<`u`&&(bR=new BroadcastChannel(vR),bR.onmessage=e=>window.dispatchEvent(new CustomEvent(vR,{detail:e.data}))),bR}function wR(e,t=!1){let n={account:e,error:t};window.dispatchEvent(new CustomEvent(vR,{detail:n})),t||CR()?.postMessage(n)}function TR(e,t){CR();let n=n=>{let r=n.detail;r?.account===e&&t(!!r.error)};return window.addEventListener(vR,n),()=>window.removeEventListener(vR,n)}async function ER(e){let t=await SR();return new Promise((n,r)=>{let i=t.transaction(_R,`readonly`),a=i.objectStore(_R).index(`account`).getAll(e);i.oncomplete=()=>n(a.result.sort((e,t)=>e.timestamp.localeCompare(t.timestamp)||e.id.localeCompare(t.id))),i.onabort=()=>r(i.error),i.onerror=()=>r(i.error)})}async function DR(e,t){try{let n=await SR();await new Promise((e,r)=>{let i=n.transaction(_R,`readwrite`);i.oncomplete=()=>e(),i.onabort=()=>r(i.error),i.onerror=()=>r(i.error),t(i.objectStore(_R))}),wR(e)}catch(t){throw wR(e,!0),t}}function OR(e,t){return DR(e,n=>{let r=n.get([e,t.id]);r.onsuccess=()=>{r.result||n.put({...t,account:e})}})}function kR(e,t,n){return DR(e,r=>{let i=r.get([e,t]);i.onsuccess=()=>{i.result&&r.put({...i.result,...n})}})}function AR(e,t){return DR(e,n=>{n.delete([e,t])})}function jR(e){return DR(e,t=>{let n=t.index(`account`).openKeyCursor(e);n.onsuccess=()=>{n.result&&(t.delete(n.result.primaryKey),n.result.continue())}})}function MR({children:e}){let[t,n]=(0,X.useState)([]),r=(0,X.useRef)(new Set),i=(0,X.useCallback)((e,t=!0)=>{if(ao(e.description)||ao(e.title))return;let i=`${e.title}:${e.description??``}`;if(t&&(e.historyId||!r.current.has(i))){let t=e.timestamp?new Date(e.timestamp):new Date;OR(xR(),{id:e.historyId||crypto.randomUUID(),title:e.title,text:e.description||``,timestamp:Number.isNaN(t.getTime())?new Date().toISOString():t.toISOString(),status:e.variant===`destructive`?`error`:`info`}).catch(()=>{})}if(r.current.has(i))return;r.current.add(i);let a=Math.random().toString(36).substring(2,9);n(t=>[...t,{...e,id:a}]),setTimeout(()=>{n(e=>e.filter(e=>e.id!==a)),r.current.delete(i)},5e3)},[]),a=(0,X.useCallback)(e=>{let t=crypto.randomUUID(),r=xR();OR(r,{id:t,title:e.title,text:e.description||``,timestamp:new Date().toISOString(),status:`started`}).catch(()=>{}),n(n=>[...n,{...e,id:t,busy:!0}]);let a=!1,o=(e,o=!1)=>{a||(a=!0,n(e=>e.filter(e=>e.id!==t)),kR(r,t,{...e?{title:e.title,text:e.description||``}:{},status:o||e?.variant===`destructive`?`error`:`completed`}).catch(()=>{}),e&&i(e,!1))};return{update:e=>{a||n(n=>n.map(n=>n.id===t?{...n,...e}:n))},done:e=>o(e),fail:e=>o(e,!0)}},[i]),o=(0,X.useMemo)(()=>({showToast:i,showProgress:a}),[i,a]);return(0,Z.jsx)(Co.Provider,{value:o,children:(0,Z.jsxs)(cR,{children:[e,t.map(e=>(0,Z.jsxs)(dR,{variant:e.variant,duration:e.busy?1/0:void 0,children:[(0,Z.jsxs)(`div`,{className:`grid gap-1`,children:[(0,Z.jsxs)(mR,{className:`flex items-center gap-2`,children:[e.busy&&(0,Z.jsx)(Ti,{className:`h-3.5 w-3.5 shrink-0 animate-spin`}),e.title]}),e.description!=null&&(0,Z.jsx)(hR,{children:e.description})]}),e.busy&&e.action&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md border px-2 py-1 text-xs hover:bg-secondary`,onClick:e.action.onClick,children:e.action.label}),!e.busy&&(0,Z.jsx)(pR,{})]},e.id)),(0,Z.jsx)(lR,{})]})})}function NR({children:e}){let[t]=(0,X.useState)(xR),[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(!1),{showToast:c}=wo();(0,X.useEffect)(()=>{let e=!0,n=0,i=async()=>{let i=++n;try{let o=await ER(t);e&&i===n&&(r(o),a(!1))}catch{e&&(s(!0),a(!1))}},o=TR(t,e=>{s(e),e||i()});return i(),()=>{e=!1,o()}},[t]),(0,X.useEffect)(()=>B.on(`notification`,e=>{let t=e;!t||![`string`,`number`].includes(typeof t.id)||typeof t.text!=`string`||!t.text||c({title:`Notification`,description:t.text,historyId:`message:${t.id}`,timestamp:typeof t.timestamp==`string`?t.timestamp:void 0})}),[c]);let l=(0,X.useCallback)(async()=>{try{await jR(t)}catch{}},[t]),u=(0,X.useCallback)(async e=>{try{await AR(t,e)}catch{}},[t]);return(0,Z.jsx)(_L.Provider,{value:{notifications:n,loading:i,storageError:o,clear:l,remove:u},children:e})}var PR=e=>`${e.workspaceName}\0${e.treeName}\0${e.path}`;function FR({children:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!0);(0,X.useEffect)(()=>{let e=!1;return uI().then(t=>{e||n(t)}).catch(()=>{e||n({})}).finally(()=>{e||i(!1)}),()=>{e=!0}},[]);let a=(0,X.useMemo)(()=>t?.home?.pinnedCanvases??[],[t]),[o]=(0,X.useState)(()=>tD(uI,dI,n)),s=(0,X.useCallback)(e=>a.some(t=>PR(t)===PR(e)),[a]),c=(0,X.useCallback)(async e=>{let t=crypto.randomUUID();await o(n=>n.some(t=>PR(t)===PR(e))?n:[...n,{id:t,...e}])},[o]),l=(0,X.useCallback)(async e=>{await o(t=>t.filter(t=>t.id!==e))},[o]),u=(0,X.useCallback)(async(e,t)=>{await o(n=>n.map(n=>n.id===e?{...n,minimized:t}:n))},[o]),d=(0,X.useCallback)(async(e,t)=>{await o(n=>{let r=n.find(t=>t.id===e);if(!r||e===t)return n;let i=n.filter(t=>t.id!==e),a=t===null?i.length:i.findIndex(e=>e.id===t);return a===-1?n:[...i.slice(0,a),r,...i.slice(a)]})},[o]),f=(0,X.useMemo)(()=>({pins:a,isLoading:r,isPinned:s,pin:c,unpin:l,movePin:d,setMinimized:u}),[a,r,s,c,l,d,u]);return(0,Z.jsx)(XT.Provider,{value:f,children:e})}var IR=(0,X.lazy)(()=>g(()=>import(`./NextShell-Byg6OtC2.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])));function LR(){let{showToast:e}=wo();return(0,X.useEffect)(()=>{so((t,n)=>{e({title:`Error`,description:n?`${t.message} (${n})`:t.message,variant:`destructive`})})},[e]),(0,X.useEffect)(()=>_F(),[]),(0,Z.jsxs)(Ye,{children:[(0,Z.jsx)(uF,{}),(0,Z.jsx)($f,{}),(0,Z.jsxs)(nt,{children:[(0,Z.jsx)(sn,{path:`/login`,element:(0,Z.jsx)(wu,{children:(0,Z.jsx)(bu,{})})}),(0,Z.jsx)(sn,{path:`/register`,element:(0,Z.jsx)(wu,{children:(0,Z.jsx)(xu,{})})}),(0,Z.jsx)(sn,{path:`/auth/google/callback`,element:(0,Z.jsx)(wu,{children:(0,Z.jsx)(Su,{})})}),(0,Z.jsx)(sn,{path:`/pub/c/:code`,element:(0,Z.jsx)(Vf,{})}),(0,Z.jsx)(sn,{path:`/next/*`,element:(0,Z.jsx)(Cu,{children:(0,Z.jsx)(X.Suspense,{fallback:null,children:(0,Z.jsx)(IR,{})})})}),(0,Z.jsx)(sn,{path:`/`,element:(0,Z.jsx)(Cu,{children:(0,Z.jsx)(NR,{children:(0,Z.jsx)(FR,{children:(0,Z.jsx)(sR,{})})})}),children:aF}),(0,Z.jsx)(sn,{path:`*`,element:(0,Z.jsx)(ht,{to:`/`,replace:!0})})]})]})}function RR(){return(0,Z.jsx)(Pk,{children:(0,Z.jsx)(MR,{children:(0,Z.jsx)(LR,{})})})}QO(),WO(),(0,Rl.createRoot)(document.getElementById(`root`)).render((0,Z.jsx)(X.StrictMode,{children:(0,Z.jsx)(RR,{})}));
|
|
55
|
+
`)}\n\nThe selected layers lose this layer's documents. This layer is unchanged.`)&&await D(n.id,Array.from(d.values()))})]}),B&&!oe&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,Z.jsxs)(`div`,{className:`px-3 py-1.5 text-[10px] text-muted-foreground italic`,children:[`This is a target. Right-click the source (`,u?.path,`) to merge/subtract`]})]})]})}function ZF({onConfirm:e,onCancel:t,placeholder:n=`folder name…`}){let r=(0,X.useRef)(null);(0,X.useEffect)(()=>{r.current?.focus()},[]);let i=()=>{let n=r.current?.value.trim()??``;n?e(n):t()};return(0,Z.jsxs)(`div`,{className:`flex min-h-11 items-center gap-2 rounded-(--card-radius) px-3 py-2.5 bg-card ring-1 ring-primary/50 shadow-elevation-3 text-sm font-medium`,children:[(0,Z.jsx)(Xa,{className:`w-4 h-4 opacity-0 shrink-0`}),(0,Z.jsx)(`input`,{ref:r,className:`flex-1 bg-transparent outline-none min-w-0 text-sm font-medium placeholder:font-normal placeholder:text-muted-foreground`,placeholder:n,onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),i()),e.key===`Escape`&&t()},onBlur:i})]})}function QF(e,t){return e===`/`?`/${t}`:`${e}/${t}`}function $F(e,t,n){let r=QF(t,e.name);return r.toLowerCase().includes(n)||(e.label||``).toLowerCase().includes(n)?!0:e.children?.some(e=>$F(e,r,n))??!1}function eI({expansionState:e,node:t,parentPath:n,depth:r,isLast:i,selectedPath:a,pendingPath:o,contentPath:s,readOnly:c,sourceLayer:l,targetLayers:u,clipboard:d,searchQuery:p,inlineCreateParent:m,onSelect:h,onAltSelect:g,selectedPaths:_,onRangeSelect:v,onShowContent:y,onCtrl:b,onCtxMenu:x,onConfirmCreate:S,onCancelCreate:C,onOpenPicker:w,styleOverrides:T,dragOverPath:E,isCopyDrag:D,onDragStart:O,onDragEnter:k,onDragOver:A,onDragLeave:j,onDragEnd:M,onDrop:N,resyncingPaths:P,policyBadgeFor:ee,removingPaths:F,accordion:I=!1,trail:te=[]}){let L=Ke(),R=QF(n,t.name),ne=ee?.(R)??null,re=T.get(R)??Qt(t),[ie,ae]=(0,X.useState)(()=>e?.get(t.id||R)??(a!==`/`&&(a===R||a.startsWith(R+`/`)))),[z,oe]=(0,X.useState)(a);if(z!==a&&(oe(a),a!==`/`&&a.startsWith(R+`/`)&&ae(!0)),(0,X.useEffect)(()=>{e?.set(t.id||R,ie)},[e,t.id,R,ie]),p&&!$F(t,n,p))return null;let se=ie||m===R||p.length>0,B=t.children&&t.children.length>0,ce=a===R||_.has(R),V=o===R,le=l?.path===R,ue=u.has(R),de=t.type===`canvas`,fe=e=>{if(e.shiftKey){v(R,e);return}if(e.ctrlKey||e.metaKey){b(R,t.id);return}if(e.altKey&&g){g(R);return}h(R)},pe=e=>{!B||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||e.target.closest(`button, input, textarea, select, a, [contenteditable="true"]`)||(e.preventDefault(),e.stopPropagation(),ae(e=>!e))},me=[...te].reverse().find(Boolean)??null,he=re.color||me,ge=I?[...te,he]:te,_e=a!==`/`&&a.startsWith(R+`/`),ve=!le&&!ue,ye=ve&&ce,be=(e,t)=>`color-mix(in oklab, ${e} ${t}%, var(--card))`,xe=e=>`color-mix(in oklab, currentColor ${e}%, transparent)`,H=Math.min(r,5),Se=se&&!!B,Ce=ve&&!ye&&!t.locked&&Se,U=Math.min(3+H*2+(_e?4:0)+(V?3:0),18),W=ye?`var(--primary)`:le?be(`var(--info)`,12):ue?be(`var(--warning)`,12):Ce?`var(--accent)`:be(`var(--muted-foreground)`,U),we=ye?`text-primary-foreground`:Ce?`text-accent-foreground`:`text-foreground`,Te=I&&se&&B&&r<GF,Ee=(0,Z.jsxs)(`div`,{"data-tree-path":R,"data-selected":_.has(R)||void 0,"data-active":ce||void 0,className:K(`group relative flex cursor-pointer select-none items-stretch overflow-hidden text-sm`,`after:pointer-events-none after:absolute after:inset-0 after:bg-foreground/0 after:transition-colors hover:after:bg-foreground/[0.07]`,we,le&&`ring-1 ring-inset ring-info/40`,ue&&!le&&`ring-1 ring-inset ring-warning/40`,E===R&&!c&&!D&&`ring-2 ring-inset ring-info`,E===R&&!c&&D&&`ring-2 ring-inset ring-success`),style:{height:WF,background:W,borderBottom:`1px solid var(--border)`,...Te?{position:`sticky`,top:r*WF,zIndex:20-r}:{}},draggable:!c&&!t.metadata?.backendTrash,onClick:fe,onDoubleClick:pe,...c?{}:L,onContextMenu:e=>{c||(e.preventDefault(),x(e,R,t))},onDragStart:e=>{c||O(R,e)},onDragEnter:e=>{c||k(R,e)},onDragOver:e=>{c||A(R,e)},onDragLeave:e=>j(R,e),onDragEnd:()=>M(),onDrop:e=>{c||N(R,e)},children:[te.length>0&&(0,Z.jsx)(`span`,{className:`flex shrink-0 gap-px`,"aria-hidden":!0,children:te.map((e,t)=>(0,Z.jsx)(`span`,{className:`w-[3px]`,style:{background:e?`color-mix(in oklab, ${e} 35%, var(--border))`:`var(--border)`}},t))}),(()=>{let e=re.color?{background:re.color}:me?{background:`color-mix(in oklab, ${me} 45%, transparent)`}:{background:xe(10)},n=(0,Z.jsx)(f,{icon:re.icon||(de?`ph:squares-four-fill`:`ph:folder-fill`),width:18,height:18,className:K(`shrink-0`,re.color?tt(re.color):ye?`text-primary-foreground`:Ce?`text-current`:`text-foreground/80`)}),r=`flex w-10 shrink-0 items-center justify-center`;return w?(0,Z.jsx)(`button`,{type:`button`,className:r,style:e,title:`Change icon`,onClick:e=>{to()||(e.stopPropagation(),w(e,R,t))},onContextMenu:e=>{e.preventDefault(),e.stopPropagation(),w(e,R,t)},children:n}):(0,Z.jsx)(`span`,{className:r,style:e,children:n})})(),(0,Z.jsx)(`span`,{className:K(`min-w-0 flex-1 self-center truncate px-2.5`,ce||_e||Se?`font-semibold`:`font-medium`),title:t.description||void 0,children:t.label||t.name}),F.has(R)&&(0,Z.jsx)(Er,{className:`mr-1 h-3.5 w-3.5 shrink-0 animate-spin self-center`,"aria-label":F.get(R)}),P?.has(R)&&(0,Z.jsx)(Er,{className:`mr-1 h-3.5 w-3.5 shrink-0 animate-spin self-center opacity-70`,"aria-label":`Indexing`}),ne&&(0,Z.jsx)(gr,{className:`mr-1 h-3 w-3 shrink-0 self-center text-muted-foreground`,"aria-label":ne,children:(0,Z.jsx)(`title`,{children:ne})}),!c&&(0,Z.jsx)(`button`,{type:`button`,className:`reveal-on-hover shrink-0 self-center rounded p-1 hover:bg-foreground/10`,onClick:e=>{e.stopPropagation(),x(e,R,t)},children:(0,Z.jsx)(ia,{className:`h-4 w-4`})}),(0,Z.jsx)(`button`,{type:`button`,className:K(`relative z-[1] flex w-12 shrink-0 cursor-pointer items-center justify-center transition-colors`,`bg-[color-mix(in_oklab,currentColor_9%,transparent)] hover:bg-[color-mix(in_oklab,currentColor_24%,transparent)] active:bg-[color-mix(in_oklab,currentColor_32%,transparent)]`,!B&&m!==R&&`invisible`),style:{borderLeft:`1px solid ${xe(16)}`},"aria-label":se?`Collapse`:`Expand`,"aria-expanded":se,title:se?`Collapse`:`Expand`,onClick:e=>{e.stopPropagation(),ae(e=>!e)},children:se?(0,Z.jsx)(qr,{className:`h-5 w-5`,strokeWidth:2.25}):(0,Z.jsx)(Xa,{className:`h-5 w-5`,strokeWidth:2.25})})]});return(0,Z.jsxs)(`div`,{className:`relative`,children:[I?Ee:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`pointer-events-none absolute top-0 w-px bg-border`,style:{left:`-${UF/2}px`,...i?{height:`1.375rem`}:{bottom:0}}}),(0,Z.jsx)(`div`,{className:`pointer-events-none absolute top-[1.375rem] h-px bg-border`,style:{left:`-${UF/2}px`,width:`${UF/2}px`}}),(0,Z.jsxs)(`div`,{"data-tree-path":R,"data-selected":_.has(R)||void 0,"data-active":ce||void 0,className:K(`group relative flex min-h-11 items-center gap-2 rounded-(--card-radius) px-3 py-2.5 cursor-pointer transition-all select-none overflow-hidden`,`shadow-elevation-3 hover:shadow-elevation-4 text-sm`,`before:absolute before:left-0 before:top-0 before:bottom-0 before:w-1.5 before:transition-colors`,le&&`ring-1 ring-info/40 bg-info/10 before:bg-info`,ue&&!le&&`ring-1 ring-warning/40 bg-warning/10 before:bg-warning`,!le&&!ue&&ce&&!t.locked&&`bg-primary/[0.08] hover:bg-primary/[0.12] before:bg-primary`,!le&&!ue&&ce&&t.locked&&`bg-warning/15 hover:bg-warning/20 before:bg-primary`,!le&&!ue&&!ce&&V&&`bg-primary/[0.03] before:bg-transparent`,!le&&!ue&&!ce&&!V&&!t.locked&&`bg-card hover:bg-primary/[0.04] before:bg-transparent`,!le&&!ue&&!ce&&t.locked&&`bg-warning/15 hover:bg-warning/20 before:bg-warning`,E===R&&!c&&!D&&`ring-2 ring-info bg-info-subtle/50`,E===R&&!c&&D&&`ring-2 ring-success bg-success-subtle/50`),style:{borderRight:re.color?`4px solid ${re.color}`:`4px solid transparent`},draggable:!c&&!t.metadata?.backendTrash,onClick:fe,onDoubleClick:pe,...c?{}:L,onContextMenu:e=>{c||(e.preventDefault(),x(e,R,t))},onDragStart:e=>{c||O(R,e)},onDragEnter:e=>{c||k(R,e)},onDragOver:e=>{c||A(R,e)},onDragLeave:e=>j(R,e),onDragEnd:()=>M(),onDrop:e=>{c||N(R,e)},children:[(0,Z.jsx)(`button`,{type:`button`,className:K(`shrink-0 text-muted-foreground hover:text-foreground`,!B&&m!==R&&`invisible`),"aria-label":se?`Collapse`:`Expand`,"aria-expanded":se,onClick:e=>{e.stopPropagation(),ae(e=>!e)},children:se?(0,Z.jsx)(qr,{className:`w-4 h-4`}):(0,Z.jsx)(Xa,{className:`w-4 h-4`})}),(()=>{let e=(0,Z.jsx)(f,{icon:re.icon||(de?`ph:squares-four-fill`:`ph:folder-fill`),width:16,height:16,color:re.color||void 0,className:K(`shrink-0`,!re.color&&(de?`text-primary`:`text-muted-foreground`))});return w?(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 rounded p-0.5 -m-0.5 hover:bg-muted-foreground/10 touch-target`,title:`Change icon`,onClick:e=>{to()||(e.stopPropagation(),w(e,R,t))},onContextMenu:e=>{e.preventDefault(),e.stopPropagation(),w(e,R,t)},children:e}):e})(),(0,Z.jsx)(`span`,{className:`flex-1 truncate font-medium`,title:t.description||void 0,children:t.label||t.name}),F.has(R)&&(0,Z.jsx)(Er,{className:`h-3.5 w-3.5 shrink-0 animate-spin`,"aria-label":F.get(R)}),P?.has(R)&&(0,Z.jsx)(Er,{className:`w-3.5 h-3.5 shrink-0 animate-spin text-muted-foreground`,"aria-label":`Indexing`}),ne&&(0,Z.jsx)(gr,{className:`w-3 h-3 shrink-0 text-muted-foreground`,"aria-label":ne,children:(0,Z.jsx)(`title`,{children:ne})}),!c&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 reveal-on-hover p-1 rounded hover:bg-muted-foreground/10 text-muted-foreground`,onClick:e=>{e.stopPropagation(),x(e,R,t)},children:(0,Z.jsx)(ia,{className:`w-4 h-4`})})]})]}),se&&(B||m===R)&&(0,Z.jsxs)(`div`,{className:I?void 0:`ml-[22px] mt-2 mb-1 space-y-1.5`,children:[m===R&&(0,Z.jsx)(ZF,{onConfirm:e=>S(R,e),onCancel:C}),t.children?.map((n,i)=>(0,Z.jsx)(eI,{node:n,expansionState:e,parentPath:R,depth:r+1,isLast:i===(t.children?.length??0)-1,selectedPath:a,pendingPath:o,contentPath:s,readOnly:c,sourceLayer:l,targetLayers:u,clipboard:d,searchQuery:p,inlineCreateParent:m,onSelect:h,onAltSelect:g,selectedPaths:_,onRangeSelect:v,onShowContent:y,onCtrl:b,onCtxMenu:x,onConfirmCreate:S,onCancelCreate:C,onOpenPicker:w,styleOverrides:T,dragOverPath:E,isCopyDrag:D,onDragStart:O,onDragEnter:k,onDragOver:A,onDragLeave:j,onDragEnd:M,onDrop:N,resyncingPaths:P,policyBadgeFor:ee,removingPaths:F,accordion:I,trail:ge},n.id||n.name))]})]})}function tI({root:e,expansionState:t,workspaceId:n,treeName:r=`context`,isBackendsTree:i=!1,onRestoreTrash:a,onDiscardTrash:o,selectedPath:s,pendingPath:c,onSelect:l,isLoading:u=!1,readOnly:d=!1,onAddRule:f,onAddStoreRule:p,onStoragePolicy:m,policyBadgeFor:h,rootLabel:g,contentPath:_,onShowContent:v,onOpenToSide:y,onAltSelect:b,onInsertPath:x,onNewCanvas:S,onShareCanvas:C,onRemovePath:w,onRenamePath:T,onMovePath:E,onCopyPath:D,onExportSubtree:O,onImportSubtree:k,onImportDocuments:A,onExportDocuments:j,pastedDocumentIds:M,onPasteDocuments:N,onLockLayer:P,onUnlockLayer:ee,onDestroyLayer:F,onMergeLayer:I,onSubtractLayer:te,onMergeDown:L,onSubtractDown:R,onResyncBackend:ne,canResyncBackend:re,onCreateBackendFolder:ie,onRenameBackendFolder:ae,onDeleteBackendFolder:z,onUpdateNode:oe,isPathPinned:se,onTogglePin:B,searchQuery:ce=``,resyncingPaths:V,backends:le}){let ue=lk(),[fe,pe]=(0,X.useState)(new Set),me=(0,X.useRef)(null),he=e=>{me.current=e,pe(new Set),l(e)},ge=(e,t)=>{t.preventDefault();let n=t.currentTarget.closest(`[data-menu-tree]`)?.querySelectorAll(`[data-tree-path]`),r=Array.from(n||[],e=>e.dataset.treePath),i=me.current||s;pe(VF(r,i,e)),me.current=r.includes(i)?i:e},[_e,ve]=(0,X.useState)(null),[ye,be]=(0,X.useState)(null),[xe,H]=(0,X.useState)(new Map),[Se,Ce]=(0,X.useState)(null),[U,W]=(0,X.useState)(new Map),we=(0,X.useRef)(new Set),Te=(0,X.useCallback)(async(e,t=!1,n=!1,a=!1)=>{if(!(i?z:w)||[...we.current].some(t=>t===e||t.startsWith(e+`/`)||e.startsWith(t+`/`)))return!1;we.current.add(e);let o=i?`Deleting from backend…`:a?`Removing documents and backend files…`:n?`Removing and purging documents…`:`Removing folder…`;W(t=>new Map(t).set(e,o));try{return i?await z(e):await w(e,r===`directory`||t,n,a)}finally{we.current.delete(e),W(t=>{let n=new Map(t);return n.delete(e),n})}},[w,z,i,r]),[Ee,De]=(0,X.useState)(null),[Oe,ke]=(0,X.useState)(new Map),[Ae,je]=(0,X.useState)(e),Me=(0,X.useRef)(new Map),Ne=(0,X.useRef)(null),[Pe,Fe]=(0,X.useState)(null);if(e!==Ae){je(e);let t=Pe;ke(t?new Map([[t.path,t.style]]):new Map)}let[Ie,Le]=(0,X.useState)(null),[Re,ze]=(0,X.useState)(null),[Be,Ve]=(0,X.useState)(!1),[He,Ue]=(0,X.useState)(!1),[We,Ge]=(0,X.useState)(!1),Ke=(0,X.useRef)(!1),G=(0,X.useRef)(null),qe=(0,X.useRef)(r),Je=(0,X.useRef)(!1),Ye=(0,X.useRef)(!1);(0,X.useEffect)(()=>{let e=e=>{ve(e.detail??null)};return window.addEventListener(`tree:path-clipboard`,e),()=>window.removeEventListener(`tree:path-clipboard`,e)},[]),(0,X.useEffect)(()=>{let e=e=>{let t=e.ctrlKey||e.altKey||Ye.current;Je.current=t,Ve(t)};return window.addEventListener(`keydown`,e),window.addEventListener(`keyup`,e),()=>{window.removeEventListener(`keydown`,e),window.removeEventListener(`keyup`,e)}},[]);let Xe=(0,X.useCallback)((e,t,n)=>{if(_t(qe.current,e)||_t(r,t))return!1;if(qe.current!==r)return!0;let i=e.endsWith(`/`)?e.slice(0,-1):e,a=t.endsWith(`/`)?t.slice(0,-1):t,o=i.substring(0,i.lastIndexOf(`/`))||`/`;return!(a.startsWith(i+`/`)||i===a||!n&&a===o)},[r]),Ze=(0,X.useCallback)((e,t)=>{if(_t(r,e)){t.preventDefault();return}G.current=e,qe.current=r,t.dataTransfer.setData(`text/plain`,e),t.dataTransfer.setData(`application/x-canvas-tree-path`,JSON.stringify({path:e,treeName:r})),t.dataTransfer.effectAllowed=`copyMove`},[r]),Qe=e=>e.ctrlKey||e.altKey||Ye.current,$e=(0,X.useCallback)((e,t)=>{if(_t(r,e))return;let n=G.current,a=Qe(t);if(a!==Je.current&&(Je.current=a,Ve(a)),n){if(!Xe(n,e,a))return}else if(JF(t)&&!qF(e,i))return;t.preventDefault(),ze(e)},[Xe,r,i]),et=(0,X.useCallback)((e,t)=>{if(_t(r,e)){t.dataTransfer.dropEffect=`none`;return}let n=Qe(t);n!==Je.current&&(Je.current=n,Ve(n));let a=G.current;if(a){if(!Xe(a,e,n)){t.dataTransfer.dropEffect=`none`;return}}else if(JF(t)&&!qF(e,i)){t.dataTransfer.dropEffect=`none`;return}t.preventDefault(),t.dataTransfer.dropEffect=n&&!i?`copy`:`move`},[Xe,r,i]),tt=(0,X.useCallback)((e,t)=>{t.currentTarget.contains(t.relatedTarget)||ze(t=>t===e?null:t)},[]),nt=(0,X.useCallback)(()=>{G.current=null,qe.current=r,Je.current=!1,Ve(!1),ze(null)},[r]),rt=(0,X.useCallback)(async(e,t)=>{if(t.preventDefault(),t.stopPropagation(),_t(r,e))return;let a=(()=>{try{return JSON.parse(t.dataTransfer.getData(`application/json`))}catch{return null}})();if(a?.type===`document`&&Array.isArray(a.documentIds)&&a.documentIds.length){if(G.current=null,Je.current=!1,Ve(!1),ze(null),de(a,n,r,e))return;if(N&&qF(e,i))try{await N(e,a.documentIds)}catch(e){alert(e instanceof Error?e.message:String(e))}return}let o=(()=>{try{return JSON.parse(t.dataTransfer.getData(`application/x-canvas-tree-path`))}catch{return null}})(),s=o?.path||t.dataTransfer.getData(`text/plain`),c=o?.treeName||qe.current||r;if(_t(c,s))return;let l=Qe(t)||Je.current;if(G.current=null,qe.current=r,Je.current=!1,Ve(!1),ze(null),!s)return;let u=t.shiftKey,d=c!==r;if(!(!d&&s===e)&&!(!d&&!Xe(s,e,l)))try{if(l&&D)await D(s,e,u,c,r);else if(!l&&E){let t=Ke.current&&!i&&!!L;await E(s,e,u,c,r,t?{mergeDown:t}:void 0)}}catch(e){alert(e instanceof Error?e.message:String(e))}},[Xe,D,E,N,n,r,i,L]),it=ce.toLowerCase().trim(),ot=(0,X.useCallback)((e,t,n)=>{e.stopPropagation(),Ce({x:e.clientX,y:e.clientY,path:t,node:n})},[]),st=(0,X.useCallback)((e,t,n)=>{e.stopPropagation(),!n.metadata?.backendTrash&&(Ne.current=null,Fe(null),De({x:e.clientX,y:e.clientY,path:t,node:n}))},[]),ct=(0,X.useCallback)(e=>{if(!Ee||!oe)return;let t=Ee.path,n={...Oe.get(t)??(Ne.current?.path===t?Ne.current.style:Qt(Ee.node)),...e};Ne.current={path:t,style:n},Fe({path:t,style:n}),ke(e=>new Map(e).set(t,n));let r=Tt(Ee.node.metadata,n),i=Me.current,a=i.get(t);a&&clearTimeout(a),i.set(t,setTimeout(()=>{i.delete(t),oe(t,{metadata:r}).catch(e=>alert(e instanceof Error?e.message:String(e)))},350))},[Ee,oe,Oe]),lt=(0,X.useCallback)((e,t)=>{ye?e===ye.path?(be(null),H(new Map)):H(n=>{let r=new Map(n);return r.has(e)?r.delete(e):r.set(e,t),r}):(be({path:e,id:t}),H(new Map))},[ye]),ut=(0,X.useCallback)(async e=>{!_e||!E||!D||_e.treeName===r&&(e===_e.path||e.startsWith(_e.path+`/`))||(_e.mode===`cut`?(await E(_e.path,e,!1,_e.treeName,r),ve(null),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:null}))):await D(_e.path,e,!0,_e.treeName,r))},[_e,E,D,r]);(0,X.useEffect)(()=>{if(d)return;let e=e=>{let t=e.target;if(t?.tagName===`INPUT`||t?.tagName===`TEXTAREA`||e.key!==`F6`)return;if(e.preventDefault(),_e?.mode===`cut`){ut(s);return}let n={mode:`cut`,path:s,treeName:r};ve(n),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:n}))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[_e,ut,d,s,r]);let dt=(0,X.useCallback)(async(e,t)=>{Le(null);let n=e===`/`?`/${t}`:`${e}/${t}`;try{KF(e,i)&&ie?await ie(e,t)&&l(n):x&&await x(n,!0)&&l(n)}catch(e){alert(e instanceof Error?e.message:String(e))}},[x,ie,l,i]),ft=(0,X.useCallback)(()=>{Le(null)},[]),pt=(0,X.useCallback)((e,t)=>{let n={mode:t,path:e,treeName:r};ve(n),window.dispatchEvent(new CustomEvent(`tree:path-clipboard`,{detail:n}))},[r]),mt=(0,X.useCallback)(t=>{if(d||An(t.target)||s&&_t(r,s))return;if(at(t,`Mod+V`)){M?.length&&N&&s&&qF(s,i)?(t.preventDefault(),N(s,M).catch(()=>{})):_e&&s&&(t.preventDefault(),ut(s).catch(e=>alert(e instanceof Error?e.message:String(e))));return}if(s&&s!==`/`&&(at(t,`Mod+C`)||!i&&at(t,`Mod+X`))){t.preventDefault(),pt(s,t.key.toLowerCase()===`x`?`cut`:`copy`);return}if((i?!z||!Dc(s||``,le):!w)||t.key!==`Delete`&&t.key!==`Backspace`||!s||s===`/`)return;t.preventDefault();let n=xs(e,s);if(!i&&n?.locked){alert(`"${s}" is locked`);return}confirm(i?`Delete "${s}" and its contents from this backend?`:`Remove "${s}"${r===`directory`?` and all children`:``}?`)&&Te(s,!1).catch(e=>alert(e instanceof Error?e.message:String(e)))},[d,w,z,Te,s,e,M,N,_e,ut,i,pt,r,le]),ht=(0,X.useCallback)(()=>{Ue(e=>{let t=!e;return Ye.current=t,Je.current=t,Ve(t),t})},[]);if(u)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading tree…`});if(!e)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`No tree available`});let gt=ye||xe.size>0,vt={expansionState:t,accordion:ue,selectedPath:s,pendingPath:c,contentPath:_,readOnly:d,sourceLayer:ye,targetLayers:xe,clipboard:_e,searchQuery:it,inlineCreateParent:Ie,onSelect:he,onAltSelect:b,selectedPaths:fe,onRangeSelect:ge,onShowContent:v,onCtrl:lt,onCtxMenu:ot,onConfirmCreate:dt,onCancelCreate:ft,onOpenPicker:oe?st:void 0,styleOverrides:Oe,dragOverPath:Re,isCopyDrag:Be,onDragStart:Ze,onDragEnter:$e,onDragOver:et,onDragLeave:tt,onDragEnd:nt,onDrop:rt,resyncingPaths:V,backends:le,policyBadgeFor:i?void 0:h,removingPaths:U};return(0,Z.jsxs)(`div`,{"data-menu-tree":!0,className:`px-3 py-2 space-y-1.5 outline-none min-h-full`,tabIndex:0,onKeyDown:mt,onContextMenu:t=>{t.defaultPrevented||d||(t.preventDefault(),ot(t,`/`,e))},children:[U.size>0&&(0,Z.jsx)(`div`,{role:`status`,"aria-live":`polite`,className:`space-y-1 rounded-md border bg-muted/50 p-2 text-xs`,children:[...U].map(([e,t])=>(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(Er,{className:`mt-0.5 h-3.5 w-3.5 shrink-0 animate-spin`,"aria-hidden":`true`}),(0,Z.jsxs)(`span`,{className:`min-w-0`,children:[(0,Z.jsx)(`span`,{className:`block`,children:t}),(0,Z.jsx)(`span`,{className:`block truncate text-muted-foreground`,title:e,children:e})]})]},e))}),!d&&(0,Z.jsxs)(`div`,{className:`flex items-center justify-end px-1 pb-0.5 text-[10px]`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:ht,title:`Toggle drag-drop mode (or hold Ctrl / Alt while dragging)`,className:K(`px-2 py-0.5 rounded-full border transition-colors select-none`,He?`border-success bg-success/15 text-success dark:text-success`:`border-border text-muted-foreground hover:bg-muted`),children:He?`Drag → Copy`:`Drag → Move`}),L&&!i&&!He&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>Ge(e=>(Ke.current=!e,!e)),title:`When moving a layer, also merge it into its new ancestors so the new path lists its documents`,className:K(`ml-1 px-2 py-0.5 rounded-full border transition-colors select-none`,We?`border-info bg-info/15 text-info dark:text-info`:`border-border text-muted-foreground hover:bg-muted`),children:We?`+ merge down`:`merge down: off`})]}),gt&&(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-1 pb-1 text-[10px] text-muted-foreground`,children:[(0,Z.jsx)(`span`,{children:ye?`Source: ${ye.path} · ${xe.size} target(s)`:`Select source with ⌃-click`}),(0,Z.jsx)(`button`,{type:`button`,className:`hover:text-foreground underline`,onClick:()=>{be(null),H(new Map)},children:`clear`})]}),(0,Z.jsxs)(`div`,{"data-active":s===`/`&&!_||void 0,className:K(`group relative flex min-h-11 items-center gap-2 rounded-(--card-radius) px-3 py-2.5 cursor-pointer transition-all select-none`,`shadow-elevation-3 hover:shadow-elevation-4 text-sm`,s===`/`&&!_?`bg-primary/[0.06]`:`bg-card hover:bg-primary/[0.04]`,Re===`/`&&!d&&!Be&&`ring-2 ring-info bg-info-subtle/50`,Re===`/`&&!d&&Be&&`ring-2 ring-success bg-success-subtle/50`),style:{borderRight:`4px solid transparent`},onClick:()=>he(`/`),onDragEnter:e=>{d||$e(`/`,e)},onDragOver:e=>{d||et(`/`,e)},onDragLeave:e=>tt(`/`,e),onDrop:e=>{d||rt(`/`,e)},onContextMenu:e=>{!d&&x&&(e.preventDefault(),Ce({x:e.clientX,y:e.clientY,path:`/`,node:{id:``,name:`/`,label:`/`,type:`root`,description:``,color:null,locked:!1,children:[]}}))},children:[(0,Z.jsx)(qr,{className:`w-4 h-4 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{className:`flex-1 font-medium truncate`,children:[`/ `,g&&(0,Z.jsxs)(`span`,{className:`text-muted-foreground font-normal`,children:[`[`,g,`]`]})]}),!d&&x&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 reveal-on-hover p-1 rounded hover:bg-muted-foreground/10 text-muted-foreground`,onClick:e=>{e.stopPropagation(),Ce({x:e.clientX,y:e.clientY,path:`/`,node:{id:``,name:`/`,label:`/`,type:`root`,description:``,color:null,locked:!1,children:[]}})},children:(0,Z.jsx)(ia,{className:`w-4 h-4`})})]}),(0,Z.jsxs)(`div`,{className:ue?`mt-1.5 border-t border-border/60`:`ml-[22px] mt-1.5 space-y-1.5`,children:[Ie===`/`&&(0,Z.jsx)(ZF,{onConfirm:e=>dt(`/`,e),onCancel:ft}),e.children?.map((t,n)=>(0,Z.jsx)(eI,{node:t,parentPath:`/`,depth:0,isLast:n===(e.children?.length??0)-1,...vt},t.id||t.name)),!e.children?.length&&Ie!==`/`&&(0,Z.jsx)(`div`,{className:`px-2 py-1.5 text-xs text-muted-foreground`,children:`Empty tree`})]}),Se&&fe.size>1&&fe.has(Se.path)?(0,Z.jsxs)(Dn,{x:Se.x,y:Se.y,onClose:()=>Ce(null),className:`min-w-44 rounded-md border bg-popover p-1 shadow-elevation-3`,children:[(0,Z.jsxs)(`div`,{className:`px-3 py-1.5 text-xs text-muted-foreground`,children:[fe.size,` folders selected`]}),(0,Z.jsx)(`button`,{type:`button`,className:`block w-full px-3 py-1.5 text-left text-xs hover:bg-accent`,onClick:()=>{navigator.clipboard?.writeText([...fe].join(`
|
|
56
|
+
`)),Ce(null)},children:`Copy paths`}),!d&&!i&&w&&(0,Z.jsx)(`button`,{type:`button`,className:`block w-full px-3 py-1.5 text-left text-xs text-destructive hover:bg-accent`,onClick:()=>{Ce(null);let e=HF(fe);confirm(`Remove ${fe.size} selected folders and their children?\n${e.join(`
|
|
57
|
+
`)}`)&&(async()=>{for(let t of e)await Te(t,!0);pe(new Set)})().catch(e=>alert(e instanceof Error?e.message:String(e)))},children:`Remove folders…`}),(0,Z.jsx)(`button`,{type:`button`,className:`block w-full px-3 py-1.5 text-left text-xs hover:bg-accent`,onClick:()=>{pe(new Set),Ce(null)},children:`Clear selection`})]}):Se&&(0,Z.jsx)(XF,{x:Se.x,y:Se.y,node:Se.node,path:Se.path,isBackendsTree:i,backends:le,isDirectoryTree:r===`directory`,onClose:()=>Ce(null),onShowContent:Se.node.metadata?.backendTrash?l:v,onRestoreTrash:d?void 0:a,onDiscardTrash:d?void 0:o,onOpenToSide:y?e=>y(e,r):void 0,sourceLayer:ye,targetLayers:xe,clipboard:_e,onStartInlineCreate:e=>Le(e),onChangeIcon:oe?()=>st({clientX:Se.x,clientY:Se.y,stopPropagation:()=>{}},Se.path,Se.node):void 0,onNewCanvas:S,onShareCanvas:C,onImportDocuments:d?void 0:A,onExportDocuments:j,onExportSubtree:O,onImportSubtree:d?void 0:k,onRemove:!d&&w&&![...U.keys()].some(e=>e===Se.path||e.startsWith(Se.path+`/`)||Se.path.startsWith(e+`/`))?Te:void 0,onRename:d?void 0:T,onLock:d?void 0:P,onUnlock:d?void 0:ee,onDestroy:d?void 0:F,onMerge:d?void 0:I,onSubtract:d?void 0:te,onMergeDown:d?void 0:L,onSubtractDown:d?void 0:R,canResyncBackend:re,onResyncBackend:ne,onAddRule:f,onAddStoreRule:p,onStoragePolicy:!d&&!i?m:void 0,onRenameBackendFolder:ae,onDeleteBackendFolder:!d&&z&&![...U.keys()].some(e=>e===Se.path||e.startsWith(Se.path+`/`)||Se.path.startsWith(e+`/`))?e=>Te(e,!0):void 0,onCopy:e=>pt(e,`copy`),onCut:e=>pt(e,`cut`),onPaste:ut,pastedDocumentIds:M,onPasteDocuments:N,isPinned:se?se(Se.path):!1,onTogglePin:B?()=>B(Se.path,Se.node):void 0}),Ee&&oe&&(0,Z.jsx)(dw,{x:Ee.x,y:Ee.y,current:Oe.get(Ee.path)??Qt(Ee.node),onChange:ct,onClose:()=>De(null)})]})}function nI(){let{state:e,closeM2:t,closeM1:n,closeM0:r,openM2:i}=qC(),a=De(),o=ft(),s=e.selectedEntityId,{showToast:c}=wo(),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)(),[_,v]=(0,X.useState)(``),[y,b]=(0,X.useState)(`/`),[x,S]=(0,X.useState)(null),[w,T]=(0,X.useState)(!1),[E,D]=(0,X.useState)(null),[O,k]=(0,X.useState)(!1),A=(0,X.useCallback)(async e=>{T(!0);try{let t=await yl(e);f(t),D(null)}catch(e){D(e instanceof Error?e.message:`Failed to load the tree`)}finally{T(!1)}},[]);(0,X.useEffect)(()=>{if(!s)return;let e=s,t=!1;async function n(){try{let n=await Tl(e);if(t)return;u(n),m(n.url||``),g(void 0),v(``),S(null),b(n.path||`/`),T(!0);try{let n=await yl(e);t||(f(n),D(null))}catch(e){t||D(e instanceof Error?e.message:`Failed to load the tree`)}finally{t||T(!1)}}catch{t||c({title:`Error`,description:`Failed to load context`,variant:`destructive`})}}n();let r=t=>{t.detail?.contextId===e&&n()};return window.addEventListener(`contexts:refresh`,r),()=>{t=!0,window.removeEventListener(`contexts:refresh`,r)}},[s,c]);let j=Ut({contextId:s??void 0,onRefresh:()=>{s&&A(s)}}),M=e=>{g(void 0),S(e),m(l?.workspaceName?`${l.workspaceName}://${e.replace(/^\//,``)}`:e)},N=l!=null&&(p.trim()!==(l.url||``)||h!==void 0);return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(BF,{title:s||`Context`,icon:l?.icon||`ph:stack-fill`,accentColor:l?.color,onBack:t,action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{s&&(a?i(`settings`,s):o(`/contexts/${s}/settings/general`))},className:`flex items-center justify-center w-8 h-8 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Settings`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})}),(0,Z.jsxs)(`div`,{className:`p-3 border-b border-border shrink-0`,children:[(0,Z.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-1.5 font-medium uppercase tracking-wide`,children:`Context URL`}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(C,{presentation:`breadcrumbs`,value:p,fixedWorkspaceName:l?.workspaceName,pickerTitle:`Switch context to…`,onPickTarget:(e,t)=>{m(`${t.workspaceName}://${e.replace(/^\/+/,``)}`),g(t.treeName),S(null)},onChange:e=>{m(e),S(h?null:`/`+e.replace(/^.*?:\/\//,``).replace(/^\/+/,``))},disabled:O,className:`min-w-0 flex-1`,inputClassName:K(`text-xs transition-colors`,N&&`border-warning/60 bg-warning/10`),placeholder:`workspace://path`}),(0,Z.jsx)(Y,{size:`sm`,className:`h-9 px-2 text-xs shrink-0`,onClick:async()=>{if(!s)return;let e=s;k(!0);try{await sl(e,p,void 0,h);let t=await Tl(e);u(t),m(t.url||``),b(t.path||`/`),S(null),g(void 0),window.dispatchEvent(new CustomEvent(`contexts:refresh`)),await A(e),c({title:`Saved`,description:`Context URL updated`}),window.matchMedia(`(max-width: 767px)`).matches&&(n(),r())}catch(e){c({title:`Error`,description:e instanceof Error?e.message:`Save failed`,variant:`destructive`})}finally{k(!1)}},disabled:O||!N,children:O?`…`:`Set`})]})]}),h&&(0,Z.jsxs)(`p`,{className:`px-3 py-1 text-xs text-muted-foreground`,children:[`Destination tree: `,h,` · press Set to apply`]}),(0,Z.jsx)(`div`,{className:`px-3 py-2 border-b shrink-0`,children:(0,Z.jsx)(q,{type:`search`,name:`context-tree-filter`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,"aria-label":`Search context tree`,placeholder:`Search paths…`,value:_,onChange:e=>v(e.target.value),className:`h-7 text-xs`})}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[(0,Z.jsxs)(`div`,{className:`text-[10px] text-muted-foreground px-3 pt-2 pb-1 font-medium uppercase tracking-wide shrink-0`,children:[l?.workspaceName||`Workspace`,` · `,d?.type===`directory`?`directory`:`context`,` tree`]}),E&&!d&&(0,Z.jsx)(`p`,{className:`px-3 pb-1 text-xs text-destructive`,children:E}),(0,Z.jsx)(tI,{root:d,workspaceId:l?.workspaceName,searchQuery:_,selectedPath:y,pendingPath:x,onSelect:M,isLoading:w,rootLabel:l?.workspaceName,...j})]})]})}function rI({items:e,activeId:t,onSelect:n}){let[r,i]=(0,X.useState)(``),a=e.filter(e=>wC(r,e.label,e.description||``));return(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:(0,Z.jsxs)(`div`,{className:`space-y-1 px-2`,children:[(0,Z.jsx)(q,{type:`search`,name:`settings-section-filter`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,"aria-label":`Search settings sections`,placeholder:`Find a setting…`,className:`mb-3`,value:r,onChange:e=>i(e.target.value)}),!a.length&&(0,Z.jsx)(`p`,{role:`status`,className:`p-3 text-sm text-muted-foreground`,children:`No matching settings.`}),a.map(e=>{let r=e.id===t;return(0,Z.jsxs)(`button`,{type:`button`,"aria-current":r?`page`:void 0,onClick:()=>n(e.id),className:K(`flex w-full items-center gap-2.5 rounded-md px-3 py-2 text-left transition-colors`,r?`bg-accent text-foreground`:`text-muted-foreground hover:bg-accent/50 hover:text-foreground`),children:[(0,Z.jsx)(`span`,{className:K(`shrink-0`,r?`text-foreground`:`text-muted-foreground`),children:e.icon}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium text-foreground`,children:e.label}),e.description&&(0,Z.jsx)(`span`,{className:`mt-1 block text-xs leading-relaxed text-muted-foreground`,children:e.description})]}),(0,Z.jsx)(Xa,{className:K(`h-3.5 w-3.5 shrink-0`,r?`opacity-100`:`opacity-0`)})]},e.id)})]})})}function iI(){let{state:e,closeM2:t}=qC(),n=De(),r=ft(),i=vn(),a=e.selectedEntityId,[o,s]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!a)return;let e=!1;return Tl(a).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[a]);let c=i.pathname.split(`/`).filter(Boolean),l=c[2]===`settings`?ND(c[3]):null,u=a?`/contexts/${a}`:null,d=(0,X.useMemo)(()=>MD.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Z.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(BF,{title:`Settings: ${o?.name||a||`Context`}`,icon:o?.icon||`ph:stack-fill`,accentColor:o?.color??null,onBack:()=>u&&!n?r(u):t(),action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>u&&r(u),className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Open context`,children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})})}),(0,Z.jsx)(rI,{items:d,activeId:l,onSelect:e=>a&&r(`/contexts/${a}/settings/${e}`)})]})}function aI(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),a=(0,X.useRef)(!1),o=(0,X.useRef)(!1),s=(0,X.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await Uo();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch workspaces:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,X.useCallback)(()=>{a.current=!1,s()},[s]);return(0,X.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,X.useEffect)(()=>{if(!e)return;let t=()=>B.emit(`subscribe`,{channel:`workspace`}),r=()=>B.emit(`unsubscribe`,{channel:`workspace`}),i=B.on(`connect`,()=>{t(),s()});t();let a=e=>{let t=e,r=t?.workspaceId??t?.id,i=t?.status;!r||!i||n(e=>e.map(e=>e.id===r?{...e,status:i}:e))},o=e=>{let t=e?.workspace??e;t?.id&&n(e=>e.some(e=>e.id===t.id)?e:[...e,t])},c=e=>{let t=e,r=t?.workspaceId??t?.id;r&&n(e=>e.filter(e=>e.id!==r))},l=[[`workspaces.scanned`,e=>{let t=e?.report;t&&(t.discovered.length||t.adopted.length||t.updated.length||t.missing.length)&&s()}],[`workspace:status:changed`,a],[`workspace.status.changed`,a],[`workspace:created`,o],[`workspace.created`,o],[`workspace:deleted`,c],[`workspace.deleted`,c]];return l.forEach(([e,t])=>B.on(e,t)),()=>{r(),i?.(),l.forEach(([e,t])=>B.off(e,t))}},[e,s]),(0,X.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`workspaces:refresh`,e),()=>{window.removeEventListener(`workspaces:refresh`,e)}},[s]),{workspaces:(0,X.useMemo)(()=>Pw(t),[t]),isLoading:r,refresh:c}}function oI({status:e}){return(0,Z.jsx)(`span`,{className:K(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:`bg-muted-foreground`),title:e})}function sI(){let[e,t]=(0,X.useState)(null),n=aw(),{state:r,selectEntity:i,openM2:a,closeM2:o}=qC(),s=De(),{workspaces:c,isLoading:l}=aI(r.activeSection===`workspaces`),{showToast:u}=wo(),d=ft(),[p,m]=(0,X.useState)(new Set),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(new Map),y=(0,X.useRef)(new Map),[b,x]=(0,X.useState)(null),S=b&&b.base===c?b.order:c,{rowProps:C,handleProps:w,draggingIndex:T,insertLineClass:E}=Lw((e,t)=>{let n=Fw(S,e,t);x({base:c,order:n}),Iw(n,(e,t)=>Pc(ow(e),{order:t})).then(({failed:e})=>{window.dispatchEvent(new CustomEvent(`workspaces:refresh`)),e&&u({title:`Partial reorder`,description:`${e} workspace(s) could not be reordered`,variant:`destructive`})})}),D=e=>_.get(ow(e))??{icon:e.icon??void 0,color:e.color??void 0},O=(e,t,n)=>{let r={...t,...n};v(t=>new Map(t).set(e,r));let i=y.current,a=i.get(e);a&&clearTimeout(a),i.set(e,setTimeout(()=>{i.delete(e);let t={icon:r.icon??null};r.color&&(t.color=r.color),Pc(e,t).then(()=>window.dispatchEvent(new CustomEvent(`workspaces:refresh`))).catch(e=>u({title:`Error`,description:e instanceof Error?e.message:`Update failed`,variant:`destructive`}))},350))},k=e=>{i(ow(e)),a(`detail`,ow(e)),!s&&xw(ow(e))&&d(Sw(ow(e)))},A=async(e,t)=>{e.stopPropagation(),m(e=>new Set(e).add(ow(t)));try{await Ks(ow(t)),u({title:`Success`,description:`${t.label||t.name} started`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Start failed`,variant:`destructive`})}finally{m(e=>{let n=new Set(e);return n.delete(ow(t)),n})}},j=async(e,t)=>{e.stopPropagation(),m(e=>new Set(e).add(ow(t)));try{await hc(ow(t)),u({title:`Success`,description:`${t.label||t.name} stopped`}),window.dispatchEvent(new CustomEvent(`workspaces:refresh`))}catch(e){u({title:`Error`,description:e instanceof Error?e.message:`Stop failed`,variant:`destructive`})}finally{m(e=>{let n=new Set(e);return n.delete(ow(t)),n})}};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,onContextMenu:e=>{e.defaultPrevented||n.local||e.target.closest(`[data-workspace-row]`)||(e.preventDefault(),t({x:e.clientX,y:e.clientY}))},children:[e&&(0,Z.jsx)(Dn,{...e,onClose:()=>t(null),className:`rounded-md border bg-popover p-1 shadow-elevation-3`,children:(0,Z.jsx)(`button`,{type:`button`,className:`px-3 py-1.5 text-xs hover:bg-accent`,onClick:()=>{t(null),o(),d(`/workspaces?create=1`)},children:`Create workspace…`})}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Workspaces`})]}),!n.local&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{o(),d(`/workspaces?create=1`)},title:`Create workspace`,"aria-label":`Create workspace`,className:`flex items-center justify-center w-6 h-6 rounded-full bg-foreground text-background hover:opacity-80 transition-opacity`,children:(0,Z.jsx)(br,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:l&&c.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):c.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No workspaces found`}):(0,Z.jsx)(`div`,{className:`space-y-1.5 px-2`,children:S.map((e,t)=>{let n=r.selectedEntityId===ow(e),o=se(e),c=p.has(ow(e)),l=e.status!==`active`,u=D(e),m=Jt(u.color);return(0,Z.jsxs)(`div`,{"data-workspace-row":!0,...C(t),"data-active":n||void 0,className:K(`group relative rounded-(--card-radius) py-2.5 pl-3 pr-7 transition-all shadow-elevation-1`,n?`bg-accent shadow cursor-pointer hover:shadow`:l?`bg-card opacity-60 cursor-not-allowed`:`bg-card hover:bg-accent/50 cursor-pointer hover:shadow`,E(t,S.length),T===t&&`opacity-60`),onClick:()=>{l||k(e)},children:[(0,Z.jsx)(`button`,{type:`button`,...w(t),title:`Drag to reorder`,"aria-label":`Drag to reorder`,className:K(`absolute inset-y-0 right-0 flex w-4 cursor-grab items-center justify-center rounded-r-(--card-radius) active:cursor-grabbing`,!m&&`bg-muted`),style:m?{backgroundColor:m}:void 0,children:(0,Z.jsx)(Un,{className:K(`h-3.5 w-3.5`,tt(m))})}),(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`button`,{type:`button`,title:o?`Change icon`:`Workspace appearance requires admin access`,onClick:t=>{!o||to()||(t.stopPropagation(),g({x:Math.min(t.clientX,window.innerWidth-290),y:Math.min(t.clientY,window.innerHeight-360),name:ow(e)}))},onContextMenu:t=>{o&&(t.preventDefault(),t.stopPropagation(),g({x:Math.min(t.clientX,window.innerWidth-290),y:Math.min(t.clientY,window.innerHeight-360),name:ow(e)}))},className:`shrink-0 rounded p-0.5 hover:bg-muted-foreground/10 touch-target`,children:(0,Z.jsx)(f,{icon:u.icon||`ph:stack-fill`,width:18,height:18,color:m,className:K(!m&&`text-muted-foreground`)})}),(0,Z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(oI,{status:e.status}),(0,Z.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e.label||e.name})]})}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[e.status===`active`?(0,Z.jsx)(`button`,{type:`button`,disabled:c,onClick:t=>j(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-3.5 h-3.5`})}):(0,Z.jsx)(`button`,{type:`button`,disabled:c,onClick:t=>A(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),i(ow(e)),s?a(`settings`,ow(e)):d(`/workspaces/${ow(e)}/settings/general`)},className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,disabled:!o,title:o?`Settings`:`Workspace settings require admin access`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})]})]}),e.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-3.5`,children:e.description}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 mt-1 pl-3.5`,children:[e.host&&(0,Z.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.host}),e.ownerEmail&&(0,Z.jsx)(`span`,{className:`text-[10px] text-muted-foreground truncate`,children:e.ownerEmail})]})]},e.id||e.name)})})}),h&&(()=>{let e=c.find(e=>ow(e)===h.name);if(!e)return null;let t=D(e);return(0,Z.jsx)(dw,{x:h.x,y:h.y,current:t,onChange:e=>O(h.name,t,e),onClose:()=>g(null)})})()]})}function cI(e,t){let n=(0,X.useRef)(null),r=(0,X.useRef)(0);return(0,X.useEffect)(()=>{if(!e)return;let n=e=>{if(e.defaultPrevented||e.repeat||e.isComposing||e.getModifierState(`AltGraph`))return;let n=e.target;if(n instanceof Element&&n.closest(`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role="textbox"], [role="dialog"], [role="alertdialog"]`)||document.querySelector(`[aria-modal="true"], dialog[open]`))return;let r=Yk(e);if(!r)return;let i=qk(),a=r===i.previousTree?-1:+(r===i.nextTree);a&&(e.preventDefault(),t(a))};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[e,t]),{onTouchStart(e){r.current=0,n.current=e.touches.length===1?{x:e.touches[0].clientX,y:e.touches[0].clientY}:null},onTouchMove(e){e.touches.length!==1&&(n.current=null)},onTouchCancel(){n.current=null},onTouchEnd(i){if(!n.current||!e)return;let a=i.changedTouches[0],o=Zk(a.clientX-n.current.x,a.clientY-n.current.y);n.current=null,o&&(r.current=Date.now()+500,i.stopPropagation(),t(o))},onClickCapture(e){Date.now()<r.current&&(e.preventDefault(),e.stopPropagation(),r.current=0)}}}function lI(e,t,n,r=!1){if(!t.startsWith(`/`)||!n.length)throw Error(`Choose a source folder and at least one destination.`);let i=new Map;for(let e of n){if(![`context`,`directory`].includes(e.tree)||!e.path.startsWith(`/`))throw Error(`Choose a context or directory destination.`);if(e.path.includes(`{{`))throw Error(`Auto-Link destinations cannot contain {{ template markers.`);i.set(`${e.tree}:${e.path}`,e)}return{id:e,enabled:!0,description:`Auto-Link backends:${t} → ${[...i.keys()].join(`, `)}`,cascade:!0,when:{event:[`document.inserted`,`document.updated`,`document.linked`],...r?{path:`backends:${t}`}:{pathExact:`backends:${t}`}},then:[...i.values()].map(e=>({action:`link`,paths:[`${e.tree===`context`?`ctx`:`dir`}:${e.path}`],...r?{recursive:!0}:{}}))}}function uI(e,t,n,r=!1,i=`forward`,a=`copy`,o,s){let c=lI(e,t,n,r);if(i===`forward`)return[c];if(a===`move`&&!s?.trim())throw Error(`Choose the source backend whose copy should be moved.`);if(r&&n.some(e=>e.tree===`context`))throw Error(`Recursive storage requires a directory source. Context paths can store files in a fixed backend folder.`);let l=t.split(`/`).filter(Boolean);if(l.length<2||t.includes(`{{`)||l.some(e=>e===`.`||e===`..`))throw Error(`Choose a backend folder with a valid storage address.`);if(!o)throw Error(`Choose a writable backend folder.`);let u=o.address,d=o.key,f=[...new Map(n.map(e=>[`${e.tree}:${e.path}`,e])).values()],p={id:`${e}-reverse`,enabled:!0,description:`Auto-Link ${f.map(e=>`${e.tree}:${e.path}`).join(`, `)} → backends:${t} (${a})`,cascade:!1,when:{event:[`document.inserted`,`document.linked`],[r?`path`:`pathExact`]:f.map(e=>`${e.tree}:${e.path}`)},then:[{action:`store`,to:u,folder:d,mode:a,...a===`move`?{from:s.trim()}:{},autoLink:!0,onConflict:`error`,...r?{recursive:!0}:{}}]};return i===`both`?[c,p]:[p]}function dI(e,t){let n=nl(e,t);if(t.find(e=>e.driver===n.driver&&e.address===n.address)?.capabilities.paths!==!0)throw Error(`This backend has not reported support for folder paths. Choose a writable storage folder to copy or move files here.`);return n}function fI({workspaceId:e,sourcePath:t,onClose:n,onManageRules:r}){let[i,a]=(0,X.useState)([]),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(`forward`),u=c===`forward`||!i.some(e=>e.tree===`context`),[d,f]=(0,X.useState)(`copy`),[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)([]),[_,v]=(0,X.useState)(!0),[b,x]=(0,X.useState)(!1),[S,C]=(0,X.useState)(!0),[w]=(0,X.useState)(()=>`autolink-${crypto.randomUUID()}`),[T,E]=(0,X.useState)(!1),[D,O]=(0,X.useState)(``),{showToast:k,showProgress:A}=wo(),j=()=>{T||n()},M=_?`Checking whether this backend can receive files…`:``;if(!_)try{dI(t,h)}catch(e){M=e instanceof Error?e.message:`Choose a writable storage folder.`}let N=e=>{l(e),e!==`forward`&&(C(!1),i.some(e=>e.tree===`context`)&&x(!1))},P=e=>`${e.replace(/\/+$/,``)}/${b?`Subfolder/`:``}example.pdf`;return(0,X.useEffect)(()=>{let t=!1;return Rc(e).then(e=>{t||g(e)}).catch(()=>{t||O(`Could not load storage backends. Reopen Autolink to retry.`)}).finally(()=>{t||v(!1)}),()=>{t=!0}},[e]),(0,Z.jsx)(tn,{label:o?`Choose virtual paths`:`Autolink documents`,onClose:o?()=>s(!1):j,children:o?(0,Z.jsx)(y,{fixedWorkspaceName:e,tabs:c!==`forward`&&b?[`directory`]:[`context`,`directory`],initialTab:c===`forward`?void 0:`directory`,title:`Choose virtual paths`,confirmLabel:`Add paths`,sizeClassName:`h-full w-full rounded-none border-0 shadow-none`,onClose:()=>s(!1),onConfirm:(e,t)=>{c!==`forward`&&t.treeType===`context`&&x(!1),a(n=>{let r=[...n];for(let n of e)r.some(e=>e.tree===t.treeType&&e.path===n)||r.push({tree:t.treeType,path:n});return r}),s(!1)}}):(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 border-b p-5`,children:[(0,Z.jsxs)(`h2`,{className:`flex items-center gap-2 text-lg font-semibold`,children:[(0,Z.jsx)(Ri,{className:`h-5 w-5`}),`Autolink documents`]}),(0,Z.jsx)(`button`,{type:`button`,onClick:j,disabled:T,"aria-label":`Close`,className:`p-1 disabled:opacity-40`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 space-y-5 overflow-y-auto p-5`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Current backend folder`}),(0,Z.jsxs)(`p`,{className:`mt-1 break-words text-sm`,children:[`backends:`,t]})]}),(0,Z.jsxs)(`fieldset`,{disabled:T,className:`space-y-2 text-sm`,children:[(0,Z.jsx)(`label`,{className:`block font-medium`,htmlFor:`autolink-direction`,children:`Direction`}),(0,Z.jsxs)(`select`,{id:`autolink-direction`,className:`w-full rounded-md border bg-background p-2`,value:c,onChange:e=>N(e.target.value),children:[(0,Z.jsx)(`option`,{value:`forward`,children:`Backend → virtual folders (link)`}),(0,Z.jsx)(`option`,{value:`reverse`,disabled:!!M,children:`Virtual folders → backend (Copy/Move)`}),(0,Z.jsx)(`option`,{value:`both`,disabled:!!M,children:`Both directions`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:c===`forward`?`Link documents from this backend folder into the selected virtual folders. Files stay where they are.`:`When a document is added or explicitly linked to a selected virtual folder, ${d} its file to the current backend folder.${c===`both`?` Documents arriving on the backend are also linked into the virtual folders.`:``}`}),M&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_?M:`Reverse mapping unavailable: ${M}`}),c!==`forward`&&(0,Z.jsxs)(`div`,{className:`space-y-2 rounded-lg border p-3`,children:[(0,Z.jsx)(`label`,{className:`block font-medium`,htmlFor:`autolink-operation`,children:`File operation`}),(0,Z.jsxs)(`select`,{id:`autolink-operation`,className:`w-full rounded-md border bg-background p-2`,value:d,onChange:e=>f(e.target.value),children:[(0,Z.jsx)(`option`,{value:`copy`,children:`Copy files to this backend`}),(0,Z.jsx)(`option`,{value:`move`,children:`Move files to this backend`})]}),d===`copy`&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Keep the source file and its virtual-folder links.`}),d===`move`&&(0,Z.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,Z.jsx)(`label`,{className:`block`,htmlFor:`autolink-source-backend`,children:`Move files from`}),(0,Z.jsxs)(`select`,{id:`autolink-source-backend`,className:`w-full rounded-md border bg-background p-2`,value:p,onChange:e=>m(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:`Choose a source backend…`}),h.filter(e=>e.kind===`storage`&&e.enabled&&e.config?.readOnly!==!0).map(e=>(0,Z.jsx)(`option`,{value:e.address,children:e.address},e.address))]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Move the file from this source backend after it has been stored at the destination. Virtual-folder links stay in place. Files missing from this source are skipped; multiple source copies require Copy instead.`})]})]})]}),(0,Z.jsxs)(`div`,{className:`space-y-2`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-medium`,children:c===`reverse`?`Watch virtual folders`:`Virtual folders`}),i.map((e,t)=>(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 rounded-lg border p-2 text-sm`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.tree===`context`?`Context tree`:`Directory tree`}),(0,Z.jsx)(`p`,{className:`break-words`,children:e.path})]}),(0,Z.jsx)(`button`,{type:`button`,"aria-label":`Remove ${e.tree}:${e.path}`,disabled:T,onClick:()=>a(e=>e.filter((e,n)=>n!==t)),children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]},`${e.tree}:${e.path}`)),(0,Z.jsxs)(Y,{variant:`outline`,size:`sm`,disabled:T,onClick:()=>s(!0),children:[(0,Z.jsx)(br,{className:`mr-1 h-4 w-4`}),`Add virtual path…`]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:c===`forward`?`Choose the virtual folders where backend documents should appear.`:`Choose a Directory tree folder to watch for newly added documents. Its files will be stored in the current backend folder.`})]}),(0,Z.jsxs)(`fieldset`,{disabled:T,className:`space-y-3 text-sm`,children:[(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:b,disabled:!u,onChange:e=>x(e.target.checked),className:`mt-1`}),`Include subfolders and recreate their path in the destination`]}),!u&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Context membership has no single folder path. To preserve subfolders on a backend, choose a directory source. Context paths store files directly in the selected backend folder.`}),(0,Z.jsxs)(`label`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,checked:S,onChange:e=>C(e.target.checked),className:`mt-1`}),`Apply to existing documents`]})]}),!!i.length&&(0,Z.jsxs)(`div`,{className:`space-y-3 rounded-lg border bg-muted/30 p-3 text-sm`,"aria-label":`Mapping preview`,children:[(0,Z.jsx)(`h3`,{className:`font-medium`,children:`Example result`}),i.map(e=>(0,Z.jsxs)(`div`,{className:`space-y-2 break-all text-xs`,children:[c!==`reverse`&&(0,Z.jsxs)(`p`,{children:[(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Link `}),`backends:`,P(t),(0,Z.jsx)(`br`,{}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`Into `}),e.tree===`context`?`ctx`:`dir`,`:`,P(e.path)]}),c!==`forward`&&(0,Z.jsxs)(`p`,{children:[(0,Z.jsxs)(`span`,{className:`text-muted-foreground`,children:[d===`move`?`Move`:`Copy`,` `]}),e.tree===`context`?`ctx`:`dir`,`:`,P(e.path),(0,Z.jsx)(`br`,{}),(0,Z.jsx)(`span`,{className:`text-muted-foreground`,children:`To `}),`backends:`,P(t)]})]},`preview:${e.tree}:${e.path}`)),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:b?`The selected folders are the roots. Only the subfolder path beneath each root is recreated at its destination.`:`Only direct folder contents are included.`})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[S?`Existing matching documents are processed in the background on the server once enabled.`:c===`forward`?`Future backend arrivals and updates are linked automatically.`:`Newly added or explicitly linked virtual-folder documents are processed automatically.`,` `,c===`both`&&`Both directions creates two rules in workspace Rules. `,`Removing rules keeps existing files and links. Renames and deletions are not synchronized. Filename conflicts stop the transfer without overwriting.`]}),D&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:D})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2 border-t p-3`,children:[(0,Z.jsx)(Y,{variant:`ghost`,disabled:T,onClick:r,children:`Manage rules`}),(0,Z.jsx)(Y,{disabled:T||!i.length||c!==`forward`&&(!!M||d===`move`&&!p),onClick:async()=>{if(!T){E(!0),O(``);try{let r=c===`forward`?void 0:dI(t,await Rc(e)),a=uI(w,t,i,b,c,d,r,p);await Je(e,a),S?V(A,e,a.map(e=>e.id)):k({title:`Autolink enabled`,description:`Future documents are linked automatically.`}),n()}catch(e){O(e instanceof Error?e.message:`Could not configure Auto-Link`)}finally{E(!1)}}},children:T?`Saving…`:`Enable Autolink`})]})]})})}async function pI(){return await J.get(`${yo}/users/me/config/webui`)??{}}async function mI(e){return await J.put(`${yo}/users/me/config/webui`,e)??e}var hI=`application/x-canvas-workspace-pin`;function gI({pins:e,isLoading:t,searchQuery:n=``,activeKey:r,onOpen:i,onShowInTree:a,onUnpin:o,onMove:s}){let[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(null),p=n.toLowerCase().trim(),m=p?e.filter(e=>(e.label||e.name||``).toLowerCase().includes(p)||e.path.toLowerCase().includes(p)||(e.description||``).toLowerCase().includes(p)):e,h=()=>{l(null),d(null)},g=async()=>{let t=u,n=c;if(h(),!n||!t||t.id===n)return;let r=t.id;if(t.id&&!t.before&&(r=e[e.findIndex(e=>e.id===t.id)+1]?.id??null),r!==n)try{await s(n,r)}catch(e){alert(e instanceof Error?e.message:String(e))}};return t&&!e.length?(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading pins…`}):e.length?m.length?(0,Z.jsx)(`div`,{className:`p-2 flex flex-col gap-2`,onDragOver:e=>{c&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`)},onDrop:e=>{e.preventDefault(),c&&!u&&d({id:null,before:!1}),g()},children:m.map(e=>{let t=e.resolvable===!1,n=Jt(e.color),s=e.icon||(e.type===`canvas`?`ph:squares-four-fill`:`ph:folder-fill`),m=r===ss(e.tree,e.path),_=u?.id===e.id&&u.before,v=u?.id===e.id&&!u.before;return(0,Z.jsxs)(`div`,{role:`button`,tabIndex:0,"data-active":m||void 0,draggable:!p,onDragStart:t=>{t.dataTransfer.setData(hI,e.id),t.dataTransfer.setData(`text/plain`,e.path),t.dataTransfer.effectAllowed=`move`,l(e.id)},onDragEnd:h,onDragOver:t=>{if(!c||c===e.id)return;t.preventDefault(),t.stopPropagation(),t.dataTransfer.dropEffect=`move`;let n=t.currentTarget.getBoundingClientRect(),r=t.clientY<n.top+n.height/2;d(t=>t?.id===e.id&&t.before===r?t:{id:e.id,before:r})},onDrop:e=>{e.preventDefault(),e.stopPropagation(),g()},onClick:()=>{t||i(e)},onKeyDown:n=>{n.target===n.currentTarget&&(n.key===`Enter`||n.key===` `)&&!t&&(n.preventDefault(),i(e))},title:t?`${e.path} — folder no longer exists`:`Open ${e.tree}:${e.path}`,className:K(`group relative flex items-stretch gap-2.5 rounded-(--card-radius) border bg-card shadow-elevation-1 text-left transition-colors`,t?`opacity-70 cursor-default`:`cursor-pointer hover:bg-accent/40`,m&&`ring-1 ring-primary/60`,c===e.id&&`opacity-40`,_&&`border-t-2 border-t-primary`,v&&`border-b-2 border-b-primary`),style:{borderLeft:`5px solid ${n??`transparent`}`},children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-center w-12 shrink-0 rounded-l-[5px] my-0 self-stretch`,style:n?{backgroundColor:`${n}22`}:void 0,children:t?(0,Z.jsx)(dr,{className:`w-5 h-5 text-warning`}):(0,Z.jsx)(f,{icon:s,width:22,height:22,color:n,className:K(!n&&(e.type===`canvas`?`text-primary`:`text-muted-foreground`))})}),(0,Z.jsxs)(`div`,{className:`flex flex-col min-w-0 flex-1 py-2 pr-1`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-semibold leading-tight truncate`,children:e.label||e.name||e.path.split(`/`).pop()}),e.locked&&(0,Z.jsx)(Si,{className:`w-3 h-3 shrink-0 text-warning`})]}),(0,Z.jsxs)(`span`,{className:`text-[11px] text-muted-foreground truncate leading-tight font-mono mt-0.5`,children:[e.tree,`:`,e.path]}),e.description&&(0,Z.jsx)(`span`,{className:`text-[11px] text-muted-foreground/80 truncate leading-tight mt-1`,children:e.description}),t&&(0,Z.jsx)(`span`,{className:`text-[11px] text-warning leading-tight mt-1`,children:`Folder no longer exists`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col items-center justify-between py-1.5 pr-1.5 shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Z.jsx)(`button`,{type:`button`,disabled:t,onClick:t=>{t.stopPropagation(),a(e)},title:`Show in tree`,"aria-label":`Show in tree`,className:`flex items-center justify-center w-6 h-6 rounded text-muted-foreground reveal-on-hover focus-visible:opacity-100 hover:bg-accent hover:text-foreground transition-colors disabled:opacity-40 disabled:cursor-default`,children:(0,Z.jsx)(rr,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:async t=>{t.stopPropagation();try{await o(e)}catch(e){alert(e instanceof Error?e.message:String(e))}},title:`Unpin`,"aria-label":`Unpin`,className:`flex items-center justify-center w-6 h-6 rounded text-muted-foreground reveal-on-hover hover:bg-destructive/10 hover:text-destructive transition-colors`,children:(0,Z.jsx)(ur,{className:`w-3.5 h-3.5`})})]}),!p&&(0,Z.jsx)(Un,{className:`w-3.5 h-3.5 text-muted-foreground/50 cursor-grab active:cursor-grabbing`,"aria-hidden":!0})]})]},e.id)})}):(0,Z.jsxs)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:[`No pins match “`,n,`”`]}):(0,Z.jsxs)(`div`,{className:`px-3 py-6 text-xs text-muted-foreground text-center space-y-1`,children:[(0,Z.jsx)(`p`,{children:`No pinned folders yet.`}),(0,Z.jsxs)(`p`,{className:`text-muted-foreground/70`,children:[`Right-click a folder in the context, directory or backends tree and choose `,(0,Z.jsx)(`span`,{className:`font-medium`,children:`Pin`}),`.`]})]})}var _I=()=>({selectedPath:`/`,contentPath:null,searchQuery:``,expansion:new Map}),vI=[`pins`,`context`,`layers`,`directory`,`backends`],yI=e=>typeof e==`string`&&vI.includes(e),bI=e=>{let t=Array.isArray(e)?e.filter(yI).filter((e,t,n)=>n.indexOf(e)===t):[];return[...t,...vI.filter(e=>!t.includes(e))]},xI={pins:(0,Z.jsx)(tr,{className:`w-3.5 h-3.5`}),context:(0,Z.jsx)(or,{className:`w-3.5 h-3.5`}),layers:(0,Z.jsx)(vi,{className:`w-3.5 h-3.5`}),directory:(0,Z.jsx)(rr,{className:`w-3.5 h-3.5`}),backends:(0,Z.jsx)(Fa,{className:`w-3.5 h-3.5`})},SI={pins:`Pins`,context:`Context tree`,layers:`Context layers`,directory:`Directory tree`,backends:`Backends tree`},CI=e=>e===`directory`||e===`backends`?e:Tc,wI=(e,t)=>t?`layers`:e===`directory`?`directory`:e===`backends`?`backends`:`context`;function TI(){let{state:e}=qC();return e.selectedEntityId?(0,Z.jsx)(eT,{workspaceName:e.selectedEntityId,children:(0,Z.jsx)(EI,{},e.selectedEntityId)}):null}function EI(){let{state:e,closeM2:t,openM2:n,navigateFromMenu:r}=qC(),i=Nt(),a=De(),o=e.selectedEntityId,s=ft(),c=vn(),{treeName:l,path:u}=af(c.pathname),d=new URLSearchParams(c.search).get(`layer`)===`1`,f=new URLSearchParams(c.search).get(`layerId`),p=/\/trees\/|\/path(\/|$)/.test(c.pathname)||!!f,m=p?wI(l,f):vI[0],[h,g]=(0,X.useState)(!1),[_,v]=(0,X.useState)(null),[y,b]=(0,X.useState)(null),[x,S]=(0,X.useState)({icon:null,color:null}),[C,w]=(0,X.useState)(m),[T,E]=(0,X.useState)(null),[D,O]=(0,X.useState)(null),[k,A]=(0,X.useState)(null),[j,M]=(0,X.useState)([]),[N,P]=(0,X.useState)(!1),[ee,F]=(0,X.useState)(!1),[I,L]=(0,X.useState)(!1),[R,ne]=(0,X.useState)(!1),[re,ie]=(0,X.useState)(u),[ae,z]=(0,X.useState)([]),[oe,ce]=(0,X.useState)(new Set),[V,le]=(0,X.useState)(d&&u!==`/`?u:null),[ue,de]=(0,X.useState)(``),[fe,pe]=(0,X.useState)(null),[me,he]=(0,X.useState)(null),[ge,_e]=(0,X.useState)(null),{policies:ve,refresh:ye}=tP(o),be=(0,X.useCallback)(e=>{if(C!==`context`&&C!==`directory`||!ve.length)return null;let t=VN(ve,C,e);return t.length?`Storage policy targets: ${HN(t)} (see Settings for transfer status)`:null},[C,ve]),[xe,H]=(0,X.useState)([]),[Se,Ce]=(0,X.useState)(!1),[U,W]=(0,X.useState)(!1),we=(0,X.useRef)(null),Te=(0,X.useRef)(new Map),[Ee,Oe]=(0,X.useState)(()=>Object.fromEntries(vI.map(e=>[e,_I()])));(0,X.useLayoutEffect)(()=>{we.current&&(we.current.scrollTop=Te.current.get(C)??0)},[C]);let ke=Ee[C];(ke.selectedPath!==re||ke.contentPath!==V||ke.searchQuery!==ue)&&Oe({...Ee,[C]:{...ke,selectedPath:re,contentPath:V,searchQuery:ue}});let Ae=(0,X.useRef)(!1),[je,Me]=(0,X.useState)(!1),[Ne,Pe]=(0,X.useState)(vI),Fe=!p;(0,X.useEffect)(()=>{let e=!1;return pI().then(t=>{if(e)return;let n=bI(t?.m2?.tabOrder);Pe(n),Fe&&w(e=>e===vI[0]?n[0]:e)}).catch(()=>{}),()=>{e=!0}},[]);let Ie=(0,X.useCallback)(async e=>{let t=Ne;Pe(e);try{let t=await pI();await mI({...t,m2:{...t.m2,tabOrder:e}})}catch{Pe(t)}},[Ne]),[Le,Re]=(0,X.useState)(null),[ze,Be]=(0,X.useState)(null),Ve=()=>{Re(null),Be(null)},He=()=>{if(Le&&ze&&Le!==ze.id){let e=Ne.filter(e=>e!==Le),t=e.indexOf(ze.id);t>=0&&(e.splice(ze.before?t:t+1,0,Le),e.some((e,t)=>e!==Ne[t])&&Ie(e))}Ve()};(0,X.useEffect)(()=>{let e=e=>pe(e.detail??null);return window.addEventListener(`documents:clipboard`,e),()=>window.removeEventListener(`documents:clipboard`,e)},[]);let[Ue,We]=(0,X.useState)(u);u!==Ue&&(We(u),ie(u));let Ge=(0,X.useRef)(new Map),Ke=(0,X.useCallback)(async(e,t,n=!1,r=!1)=>{let i=Symbol();Ge.current.set(t,i);let a=()=>Ge.current.get(t)===i,o=t===`context`?P:t===`directory`?F:L,s=t===`context`?E:t===`directory`?O:A;n||o(!0);try{n&&!r&&Ms(e,t);let i=await _c(e,t);a()&&s(i)}catch{}finally{a()&&o(!1)}},[]),G=(0,X.useCallback)(async(e,t=!1)=>{let n=Symbol();Ge.current.set(`pins`,n);let r=()=>Ge.current.get(`pins`)===n;t||Ce(!0);try{let t=await rc(e);r()&&H(t)}catch{}finally{r()&&Ce(!1)}},[]),qe=(0,X.useCallback)(async(e,t=!1)=>{let n=Symbol();Ge.current.set(`layers`,n);let r=()=>Ge.current.get(`layers`)===n;t||ne(!0);try{let t=await zo(e,`context`);r()&&M(t)}catch{}finally{r()&&ne(!1)}},[]);(0,X.useEffect)(()=>{if(!o)return;let e=o,t=!1,n=Ge.current;async function r(){Ws(e).then(e=>{t||(v(e.label||e.name),g(se(e)),b(e.id||null),S({icon:e.icon??null,color:e.color??null}))}).catch(()=>{}),await Promise.all([Ke(e,`context`),Ke(e,`directory`),Ke(e,`backends`),qe(e),G(e)])}return r(),()=>{t=!0,n.clear()}},[o,Ke,qe,G]);let Je=(0,X.useCallback)((e,t,n=!1)=>{for(let r of[`context`,`directory`,`backends`])(!t||t===r)&&Ke(e,r,!0,n);(!t||t===`context`)&&qe(e,!0),G(e,!0)},[Ke,qe,G]),Ye=(0,X.useCallback)(()=>{o&&Je(o)},[o,Je]);(0,X.useEffect)(()=>{if(!o)return;let e=e=>{e.detail?.workspaceName&&e.detail.workspaceName!==o||Je(o,e.detail?.treeName,e.detail?.cacheInvalidated)};return window.addEventListener(`workspace:tree:refresh`,e),()=>window.removeEventListener(`workspace:tree:refresh`,e)},[o,Je]),(0,X.useEffect)(()=>{if(!o)return;let e=!1,t=()=>Rc(o).then(t=>{e||(z(t),ce(new Set(t.filter(e=>e.resyncing&&e.treePath).map(e=>e.treePath))))}).catch(()=>{});t();let n=e=>{let n=e.detail;n?.workspaceName&&n.workspaceName!==o||(!n?.treeName||n.treeName===`backends`)&&t()};return window.addEventListener(`workspace:tree:refresh`,n),()=>{e=!0,window.removeEventListener(`workspace:tree:refresh`,n)}},[o]),(0,X.useEffect)(()=>{if(!o)return;let e=[`workspace:${o}`,y?`workspace:${y}`:null].filter(Boolean),t=()=>e.forEach(e=>B.emit(`subscribe`,{channel:e})),n=B.on(`connect`,t);t();let r=Dt(o,y),i=e=>{if(e?.workspaceId&&y&&e.workspaceId!==y)return;let t=e?.treePath;t&&ce(n=>{let r=new Set(n);return e.resyncing?r.add(t):r.delete(t),r})};B.on(`backend.resync.changed`,i);let a=e=>{e?.workspaceId&&y&&e.workspaceId!==y||G(o,!0)};return B.on(`pins.changed`,a),()=>{r(),n?.(),B.off(`backend.resync.changed`,i),B.off(`pins.changed`,a)}},[o,y,G]);let[Xe,Ze]=(0,X.useState)(null),Qe=`${c.pathname}|${c.search}`;if(Qe!==Xe){Ze(Qe);let{treeName:e,path:t}=af(c.pathname),n=new URLSearchParams(c.search).get(`layerId`),r=/\/trees\/|\/path(\/|$)/.test(c.pathname)||!!n;U?W(!1):w(r||je?r?wI(e,n):C:Ne[0]),ie(t),le(t===`/`?null:t)}let{showProgress:$e}=wo();(0,X.useEffect)(()=>{o&&te($e,o)},[o,$e]);let et=Ut({workspaceId:o??void 0,treeName:CI(C),onRefresh:Ye}),tt=(0,X.useRef)(new Map);(0,X.useEffect)(()=>{if(!o)return;let e=`${o}:${C}:${re}`,t=et;t.canResyncBackend(re)&&(Date.now()-(tt.current.get(e)||0)<6e4||(tt.current.set(e,Date.now()),t.onResyncBackend?.(re).catch(()=>{})))},[o,C,re,et]);let nt=new Set(xe.map(e=>ss(e.tree,e.path))),rt=CI(C),it=(0,X.useCallback)(e=>nt.has(ss(rt,e)),[xe,rt]),at=(0,X.useCallback)(async e=>{if(!o)return;let t=xe.find(t=>ss(t.tree,t.path)===ss(rt,e));t?await gs(o,t.id):await Ss(o,e,rt),await G(o)},[o,xe,rt,G]),ot=(0,X.useCallback)(async e=>{if(o){H(t=>t.filter(t=>t.id!==e.id));try{await gs(o,e.id)}finally{await G(o)}}},[o,G]),ct=(0,X.useCallback)(async(e,t)=>{if(!o)return;let n=xe.find(t=>t.id===e);if(!n)return;let r=xe.filter(t=>t.id!==e),i=t===null?r.length:r.findIndex(e=>e.id===t);if(i===-1)return;let a=[...r.slice(0,i),n,...r.slice(i)];if(!a.every((e,t)=>e===xe[t])){H(a);try{H(await bc(o,a.map(e=>e.id)))}catch(e){throw await G(o),e}}},[o,xe,G]),lt=(0,X.useCallback)(e=>{if(!o)return;W(!0),ie(e.path),le(null);let t=of(o,e.path,e.tree);if(i){i.activateRow(`pin:${o}:${e.id}`,e.label||e.name||e.path,t);return}r(t)},[o,r,i]),dt=(0,X.useCallback)(e=>{!o||e.resolvable===!1||(W(!1),Me(!0),w(wI(e.tree)),ie(e.path),le(null),de(``),Ae.current=!0,i?.setFocus(`main`),r(of(o,e.path,e.tree)))},[o,r,i]),pt=C===`context`?T:C===`directory`?D:C===`backends`?k:null,mt=C===`context`?N:C===`directory`?ee:C===`backends`&&I;(0,X.useEffect)(()=>{if(!Ae.current||mt||C===`pins`)return;let e=we.current?.querySelector(`[data-active="true"]`);e&&(e.scrollIntoView({block:`nearest`,inline:`nearest`}),Ae.current=!1)},[C,re,pt,mt]);let ht=(0,X.useCallback)(e=>{Me(!0),w(e);let t=Ee[e];ie(t.selectedPath),le(t.contentPath),de(t.searchQuery)},[Ee]),gt=(0,X.useCallback)(e=>{ht(Xk(Ne,C,e))},[Ne,C,ht]),_t=cI(e.m2Open,gt),vt=e=>{le(null),ie(e);let t=CI(C);i?.setFocus(`main`),r(of(o,e,t))},yt=(0,X.useCallback)((e,t)=>{ie(e),le(e);let n=CI(C),a=new URLSearchParams;a.set(`layer`,`1`),t&&a.set(`layerId`,t),i?.setFocus(`main`),r(`${of(o,e,n)}?${a.toString()}`)},[o,C,r,i]),bt=(0,X.useCallback)((e,t)=>{if(o){if(i){i.openCanvas({kind:`route`,location:of(o,e,t)});return}window.dispatchEvent(new CustomEvent(`workspace:open-to-side`,{detail:{workspaceName:o,treeName:t,path:e}}))}},[o,i]),xt=(0,X.useCallback)(async e=>{if(!o)return;let t=CI(C),n=await zc(o,e,t),r=`${window.location.origin}${n.url}`;await navigator.clipboard?.writeText(r),alert(`Canvas share link copied:\n${r}`)},[o,C]),St=ue.toLowerCase().trim(),wt=St?j.filter(e=>e.name.toLowerCase().includes(St)||(e.label||``).toLowerCase().includes(St)||(e.description||``).toLowerCase().includes(St)):j;return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(BF,{title:_||o||`Workspace`,icon:x.icon||`ph:stack-fill`,accentColor:x.color,onBack:t,action:(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:()=>o&&r(Sw(o)),className:`flex items-center justify-center w-8 h-8 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Open workspace`,children:(0,Z.jsx)(Pi,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,disabled:!h,onClick:()=>{a?n(`settings`,o??null):s(`/workspaces/${o}/settings/general`)},className:`flex items-center justify-center w-8 h-8 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,title:h?`Settings`:`Workspace settings require admin access`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})]})}),(0,Z.jsx)(`div`,{..._t,className:`flex border-b border-border shrink-0 touch-pan-y`,"aria-label":`Workspace trees`,children:Ne.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>ht(e),title:`${SI[e]} — drag to reorder; the first tab opens by default`,"aria-label":SI[e],"aria-pressed":C===e,draggable:!0,onDragStart:t=>{t.dataTransfer.setData(`text/plain`,e),t.dataTransfer.effectAllowed=`move`,Re(e)},onDragEnd:Ve,onDragOver:t=>{if(!Le||Le===e)return;t.preventDefault(),t.dataTransfer.dropEffect=`move`;let n=t.currentTarget.getBoundingClientRect(),r=t.clientX<n.left+n.width/2;Be(t=>t?.id===e&&t.before===r?t:{id:e,before:r})},onDrop:e=>{e.preventDefault(),He()},className:K(`relative flex-1 flex items-center justify-center py-2 transition-colors`,C===e?`text-foreground border-b-2 border-foreground -mb-px`:`text-muted-foreground hover:text-foreground`,Le===e&&`opacity-40`,ze?.id===e&&ze.before&&`shadow-[inset_2px_0_0_0_hsl(var(--primary))]`,ze?.id===e&&!ze.before&&`shadow-[inset_-2px_0_0_0_hsl(var(--primary))]`),children:[xI[e],e===`pins`&&xe.length>0&&(0,Z.jsx)(`span`,{className:`absolute top-1 right-[calc(50%-14px)] min-w-[14px] h-[14px] px-0.5 rounded-full bg-primary text-primary-foreground text-[9px] leading-[14px] text-center font-medium`,children:xe.length})]},e))}),(0,Z.jsx)(`div`,{className:`px-2 py-1.5 border-b border-border shrink-0 shadow-elevation-2 z-10`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-md border bg-muted/40 px-2 py-1`,children:[(0,Z.jsx)(qa,{className:`w-3 h-3 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`input`,{type:`search`,name:`workspace-tree-filter`,"aria-label":`Search workspace tree`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,className:`flex-1 bg-transparent text-xs outline-none placeholder:text-muted-foreground min-w-0`,placeholder:C===`layers`?`Search layers…`:C===`pins`?`Search pins…`:`Search paths…`,value:ue,onChange:e=>de(e.target.value)})]})}),(0,Z.jsx)(`div`,{ref:we,onScroll:e=>{Te.current.set(C,e.currentTarget.scrollTop)},className:`flex-1 overflow-y-auto`,children:(0,Z.jsx)(Hw,{workspaceId:o,treeName:CI(C),readOnly:!h,className:`min-h-full`,children:C===`pins`?(0,Z.jsx)(gI,{pins:xe,isLoading:Se,searchQuery:ue,activeKey:ss(l,u),onOpen:lt,onShowInTree:dt,onUnpin:ot,onMove:ct}):C===`layers`?(0,Z.jsx)(NI,{layers:wt,isLoading:R,wsName:o??``,onSelect:e=>{let t=new URLSearchParams;t.set(`layerId`,e.id),t.set(`layer`,`1`),r(`${of(o,`/`)}?${t.toString()}`)},onLock:async e=>{await Jo(o,e.id,o,`context`),Je(o)},onUnlock:async e=>{await Lc(o,e.id,o,`context`),Je(o)},onRename:async(e,t)=>{await lc(o,e.id,t,`context`),Je(o)},onDestroy:async e=>{confirm(`Destroy layer "${e.label||e.name}"? This cannot be undone.`)&&(await jo(o,e.id,`context`),Je(o))}}):(0,Z.jsx)(tI,{expansionState:Ee[C].expansion,root:pt,workspaceId:o??void 0,treeName:C,isBackendsTree:C===`backends`,onRestoreTrash:o?e=>ut(o,e):void 0,onDiscardTrash:o?e=>st(o,e):void 0,onAltSelect:i?e=>bt(e,CI(C)):void 0,selectedPath:re,contentPath:V,onSelect:vt,onShowContent:C===`context`?yt:void 0,onOpenToSide:bt,onShareCanvas:xt,onNewCanvas:o&&C!==`backends`?e=>{s(`${of(o,e,C)}?createCanvas=1`)}:void 0,isLoading:mt,rootLabel:o??void 0,searchQuery:ue,backends:ae,resyncingPaths:C===`backends`?oe:void 0,onAddRule:o&&C===`backends`?he:void 0,onAddStoreRule:o?(e,t=`store`)=>{let n=C===`backends`?(()=>{let n=On(e);return{kind:t,storeTo:n?.backend||``,storeFolder:n?.rel||``}})():{kind:t,path:`${C===`directory`?`dir`:`ctx`}:${e}`,storeFolder:t===`download`?`Downloads`:hn(e)};s(`/workspaces/${o}/settings/hooks?${Ct(n).toString()}`)}:void 0,onStoragePolicy:o&&(C===`context`||C===`directory`)?e=>_e(MN(C,e)):void 0,policyBadgeFor:be,pastedDocumentIds:fe?.documentIds,isPathPinned:it,onTogglePin:o?at:void 0,onPasteDocuments:o&&C===`backends`?async(e,t)=>{let n=Hs(e);if(!n)return!1;let r=e.split(`/`).filter(Boolean).slice(2).join(`/`),i=$e({title:`Moving…`,description:`${t.length} message(s) → ${r}`});try{let{moved:a,results:s}=await Uc(o,n.address,t,e),c=s.filter(e=>!e.ok);return c.length?i.fail({title:`${c.length} message(s) not moved`,description:c[0].error||`Move failed`,variant:`destructive`}):i.done({title:`Moved`,description:`${a} message(s) → ${r}`}),fe&&a&&(pe(null),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:null}))),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:o,path:`/imap/${n.address}`,treeName:`backends`}})),a>0}catch(e){return i.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to move messages`,variant:`destructive`}),!1}}:o?async(e,t)=>{let n=C===`directory`?`directory`:`context`,r=C===`directory`?`directory`:Tc,i=$e({title:`Pasting…`,description:`${t.length} document(s) → "${e}"`}),a=!1;try{a=await Ko(o,e,t,r,n)}catch(e){return i.fail({title:`Error`,description:e instanceof Error?e.message:`Failed to paste documents`,variant:`destructive`}),!1}return i.done(a?{title:`Success`,description:`${t.length} document(s) pasted to "${e}"`}:void 0),a&&(fe&&(pe(null),window.dispatchEvent(new CustomEvent(`documents:clipboard`,{detail:null}))),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`,{detail:{workspaceName:o,path:e,treeName:r}}))),a}:void 0,...et},C)})}),me&&o&&(0,Z.jsx)(fI,{workspaceId:o,sourcePath:me,onClose:()=>he(null),onManageRules:()=>{he(null),s(`/workspaces/${o}/settings/hooks?section=rules`)}}),ge&&o&&(0,Z.jsx)(KN,{workspaceId:o,path:ge,onClose:()=>_e(null),onSaved:()=>{ye()}})]})}var DI={canvas:{label:`Canvases`,order:0},dataset:{label:`Datasets`,order:1},context:{label:`Context layers`,order:2},workspace:{label:`Workspaces`,order:3},universe:{label:`Universe`,order:4},label:{label:`Labels`,order:5},system:{label:`System`,order:6}},OI=100,kI=e=>e&&e.charAt(0).toUpperCase()+e.slice(1),AI=e=>DI[e]??{label:`${kI(e)} layers`,order:OI};function jI({type:e}){return e===`canvas`?(0,Z.jsx)(Pa,{className:`w-3.5 h-3.5 shrink-0 text-primary`,"aria-label":`Canvas`}):e===`dataset`?(0,Z.jsx)(Fa,{className:`w-3.5 h-3.5 shrink-0 text-secondary`,"aria-label":`Dataset`}):(0,Z.jsx)(vi,{className:`w-3.5 h-3.5 shrink-0 text-muted-foreground/60`,"aria-label":`Layer`})}function MI(e){let t=new Map;for(let n of e){let e=n.type||`context`,r=t.get(e);r?r.push(n):t.set(e,[n])}return[...t.entries()].map(([e,t])=>({type:e,items:t,meta:AI(e)})).sort((e,t)=>e.meta.order-t.meta.order||e.meta.label.localeCompare(t.meta.label)).map(({type:e,items:t,meta:n})=>({type:e,label:n.label,items:t}))}function NI({layers:e,isLoading:t,onSelect:n,onLock:r,onUnlock:i,onRename:a,onDestroy:o}){let[s,c]=(0,X.useState)(null),l=(0,X.useRef)(null);if((0,X.useEffect)(()=>{s&&l.current?.focus()},[s]),t)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`Loading layers…`});if(!e.length)return(0,Z.jsx)(`div`,{className:`px-3 py-3 text-xs text-muted-foreground`,children:`No layers found`});let u=async(e,t)=>{e.stopPropagation();try{await t()}catch(e){alert(e instanceof Error?e.message:String(e))}},d=async(e,t)=>{c(null);let n=t.trim();if(!(!n||n===e.name))try{await a(e,n)}catch(e){alert(e instanceof Error?e.message:String(e))}},f=MI(e);return(0,Z.jsx)(`div`,{className:`px-2 py-1.5 space-y-2`,children:f.map(e=>(0,Z.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,Z.jsxs)(`div`,{className:`px-1 pt-1 pb-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:[e.label,(0,Z.jsxs)(`span`,{className:`ml-1 text-muted-foreground/60`,children:[`(`,e.items.length,`)`]})]}),e.items.map(e=>(0,Z.jsxs)(`div`,{className:`group flex items-center gap-2 rounded-l-md px-2 py-1.5 text-xs bg-card shadow-elevation-1 cursor-pointer hover:bg-accent/40 transition-colors`,style:{borderRight:e.color?`4px solid ${e.color}`:`4px solid transparent`},onClick:()=>s!==e.id&&n(e),children:[(0,Z.jsx)(`div`,{className:K(`w-2 h-2 rounded-full shrink-0`,!e.color&&`bg-muted-foreground/20`),style:e.color?{backgroundColor:e.color}:void 0}),(0,Z.jsx)(jI,{type:e.type}),s===e.id?(0,Z.jsx)(`input`,{ref:l,defaultValue:e.label||e.name,className:`flex-1 bg-transparent outline-none min-w-0 font-medium border-b border-primary`,onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`&&d(e,t.target.value),t.key===`Escape`&&c(null)},onBlur:t=>d(e,t.target.value)}):(0,Z.jsx)(`span`,{className:`flex-1 truncate font-medium`,children:e.label||e.name}),e.locked&&s!==e.id&&(0,Z.jsx)(Si,{className:`w-2.5 h-2.5 shrink-0 text-warning group-hover:hidden`}),s!==e.id&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 reveal-on-hover`,children:[e.locked?(0,Z.jsx)(`button`,{type:`button`,title:`Unlock layer`,className:`p-0.5 rounded hover:bg-muted-foreground/10 text-warning hover:text-foreground touch-target`,onClick:t=>u(t,()=>i(e)),children:(0,Z.jsx)(ea,{className:`w-3 h-3`})}):(0,Z.jsx)(`button`,{type:`button`,title:`Lock layer`,className:`p-0.5 rounded hover:bg-muted-foreground/10 text-muted-foreground hover:text-foreground touch-target`,onClick:t=>u(t,()=>r(e)),children:(0,Z.jsx)(Si,{className:`w-3 h-3`})}),!e.locked&&(0,Z.jsx)(`button`,{type:`button`,title:`Rename layer`,className:`p-0.5 rounded hover:bg-muted-foreground/10 text-muted-foreground hover:text-foreground touch-target`,onClick:t=>{t.stopPropagation(),c(e.id)},children:(0,Z.jsx)(Za,{className:`w-3 h-3`})}),!e.locked&&(0,Z.jsx)(`button`,{type:`button`,title:`Destroy layer`,className:`p-0.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive touch-target`,onClick:t=>u(t,()=>o(e)),children:(0,Z.jsx)(Qr,{className:`w-3 h-3`})})]})]},e.id))]},e.type))})}function PI(){let{state:e,closeM2:t}=qC(),n=De(),r=ft(),i=vn(),a=e.selectedEntityId,[o,s]=(0,X.useState)(null),c=o?.address===a?o.workspace:null,l=c?.label||c?.name,u=se(c);(0,X.useEffect)(()=>{if(!a)return;let e=!1;return Ws(a).then(t=>{e||s({address:a,workspace:t})}).catch(()=>{}),()=>{e=!0}},[a]);let d=i.pathname.split(`/`).filter(Boolean),f=d[2]===`settings`?jD(d[3]):null,p=(0,X.useMemo)(()=>kD.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Z.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(BF,{title:`Settings: ${l||a||`Workspace`}`,icon:c?.icon||`ph:stack-fill`,accentColor:c?.color,onBack:()=>{n||!a?t():r(`/workspaces/${a}`)},action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>a&&r(`/workspaces/${a}`),className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Open workspace`,children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})})}),u?(0,Z.jsx)(rI,{items:p,activeId:f,onSelect:e=>a&&r(`/workspaces/${a}/settings/${e}`)}):(0,Z.jsx)(`p`,{className:`p-4 text-sm text-muted-foreground`,children:c?`Workspace settings are available to owners and admins.`:`Loading workspace…`})]})}function FI(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),a=(0,X.useRef)(!1),o=(0,X.useRef)(!1),s=(0,X.useCallback)(async()=>{if(!o.current){o.current=!0,i(!0);try{let e=await ZD();n(e||[]),a.current=!0}catch(e){console.error(`Failed to fetch agents:`,e)}finally{o.current=!1,i(!1)}}},[]),c=(0,X.useCallback)(()=>{a.current=!1,s()},[s]);return(0,X.useEffect)(()=>{e&&!a.current&&s()},[e,s]),(0,X.useEffect)(()=>{if(!e)return;let t=()=>B.emit(`subscribe`,{channel:`agent`}),r=()=>B.emit(`unsubscribe`,{channel:`agent`}),i=B.on(`connect`,()=>{t(),s()});t();let a=e=>{let t=e?.agent??e;t?.id&&n(e=>e.some(e=>e.id===t.id)?e:[...e,t])},o=e=>{let t=e?.agent??e;t?.id&&n(e=>e.map(e=>e.id===t.id?{...e,...t}:e))},c=e=>{let t=e,r=t?.agentId??t?.id;r&&n(e=>e.filter(e=>e.id!==r))},l=e=>{let t=e,r=t?.agentId??t?.id,i=t?.status;!r||!i||n(e=>e.map(e=>e.id===r?{...e,status:i}:e))},u=[[`agent:created`,a],[`agent.created`,a],[`agent:updated`,o],[`agent.updated`,o],[`agent:deleted`,c],[`agent.deleted`,c],[`agent:status:changed`,l],[`agent.status.changed`,l]];return u.forEach(([e,t])=>B.on(e,t)),()=>{r(),i?.(),u.forEach(([e,t])=>B.off(e,t))}},[e,s]),(0,X.useEffect)(()=>{let e=()=>{a.current=!1,s()};return window.addEventListener(`agents:refresh`,e),()=>window.removeEventListener(`agents:refresh`,e)},[s]),{agents:t,isLoading:r,refresh:c}}function II({status:e}){return(0,Z.jsx)(`span`,{className:K(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:e===`starting`||e===`stopping`?`bg-warning`:`bg-muted-foreground`),title:e})}function LI(){let e=aw(),{state:t,selectEntity:n,openM2:r,closeM2:i}=qC(),a=De(),{agents:o,isLoading:s,refresh:c}=FI(t.activeSection===`agents`),{showToast:l}=wo(),[u,d]=(0,X.useState)(new Set),f=ft(),p=e=>{n(e.id),r(`detail`,e.id),f(`/agents/${encodeURIComponent(e.name||e.id)}`)},m=async(e,t)=>{e.stopPropagation(),d(e=>new Set(e).add(t.id));try{await dO(t.id),c(),l({title:`Success`,description:`${t.label||t.name} started`})}catch(e){l({title:`Error`,description:e instanceof Error?e.message:`Start failed`,variant:`destructive`})}finally{d(e=>{let n=new Set(e);return n.delete(t.id),n})}},h=async(e,t)=>{e.stopPropagation(),d(e=>new Set(e).add(t.id));try{await fO(t.id),c(),l({title:`Success`,description:`${t.label||t.name} stopped`})}catch(e){l({title:`Error`,description:e instanceof Error?e.message:`Stop failed`,variant:`destructive`})}finally{d(e=>{let n=new Set(e);return n.delete(t.id),n})}};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Agents`})]}),!e.local&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{i(),f(`/agents?create=1`)},title:`Create agent`,"aria-label":`Create agent`,className:`flex items-center justify-center w-6 h-6 rounded-full bg-foreground text-background hover:opacity-80 transition-opacity`,children:(0,Z.jsx)(br,{className:`w-3.5 h-3.5`})})]}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:s&&o.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading...`}):o.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`No agents found`}):(0,Z.jsx)(`div`,{className:`space-y-1.5 px-2`,children:o.map(e=>{let i=t.selectedEntityId===e.id,o=u.has(e.id);return(0,Z.jsxs)(`div`,{"data-active":i||void 0,className:K(`group relative rounded-(--card-radius) px-3 py-2.5 cursor-pointer transition-all shadow-elevation-1 hover:shadow`,i?`bg-accent shadow`:`bg-card hover:bg-accent/50`),style:{borderRight:`6px solid ${e.color||`transparent`}`},onClick:()=>p(e),children:[(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Z.jsx)(II,{status:e.status}),(0,Z.jsx)(`span`,{className:`text-sm font-medium truncate`,children:e.label||e.name})]})}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[e.status===`active`?(0,Z.jsx)(`button`,{type:`button`,disabled:o,onClick:t=>h(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-3.5 h-3.5`})}):(0,Z.jsx)(`button`,{type:`button`,disabled:o,onClick:t=>m(t,e),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50 transition-colors`,title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-3.5 h-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),n(e.id),a?r(`settings`,e.id):f(`/agents/${encodeURIComponent(e.name||e.id)}/settings/identity`)},className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground transition-colors`,title:`Settings`,children:(0,Z.jsx)(Wi,{className:`w-3.5 h-3.5`})})]})]}),e.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-3.5`,children:e.description})]},e.id)})})})]})}function RI(e){return e.name?.trim()?e.name.trim():e.firstMessage?.trim()?e.firstMessage.trim():e.isExperimental?`Experimental`:e.id.slice(0,8)}function zI(e){let t=new Date(e.updatedAt).toLocaleString();return e.messageCount>0?`${e.messageCount} msg${e.messageCount===1?``:`s`} • ${t}`:`Empty • ${t}`}function BI(e){return e.sessions.sessions.find(t=>t.id===e.current.sessionId||t.path===e.current.sessionFile||t.id===e.sessions.currentSessionId||t.path===e.sessions.currentSessionPath||t.isCurrent)||null}function VI(){let{state:e,closeM2:t}=qC(),n=e.selectedEntityId||``,r=ft(),{showToast:i}=wo(),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),[l,u]=(0,X.useState)(``),[d,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(``),{current:h,sessions:g,isLoading:_,error:v,refresh:y,create:b,select:x,rename:S,remove:C}=gM(n);(0,X.useEffect)(()=>{n&&(QD(n).then(o).catch(()=>{}),y().catch(e=>{i({title:`Error`,description:e instanceof Error?e.message:`Failed to load sessions`,variant:`destructive`})}))},[n,y,i]);let w=(0,X.useMemo)(()=>g?.sessions?g.currentSessionId?g.sessions.find(e=>e.id===g.currentSessionId)||null:g.currentSessionPath?g.sessions.find(e=>e.path===g.currentSessionPath)||null:g.sessions.find(e=>e.isCurrent)||null:null,[g]),T=a?.name||n,E=e=>e?.slug||e?.id,D=e=>{let t=typeof e==`string`?e:E(e);r(t?`/agents/${encodeURIComponent(T)}/${encodeURIComponent(t)}`:`/agents/${encodeURIComponent(T)}`)},O=async()=>{try{let e=await b({mode:`persistent`,name:l.trim()||void 0});c(!1),u(``),D(BI(e))}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to create session`,variant:`destructive`})}},k=async()=>{try{let e=await b({mode:`experimental`});D(BI(e))}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to open experimental session`,variant:`destructive`})}},A=async()=>{try{await b({mode:`incognito`}),D()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to open incognito session`,variant:`destructive`})}},j=async e=>{try{e.isExperimental?await x({mode:`experimental`}):await x({mode:`persistent`,sessionId:e.id}),D(e)}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to select session`,variant:`destructive`})}},M=async e=>{if(p.trim())try{let t=(await S(e.id,p.trim())).sessions.sessions.find(t=>t.id===e.id);f(null),m(``),w?.id===e.id&&D(t||e)}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to rename session`,variant:`destructive`})}},N=async e=>{if(!e.isExperimental&&window.confirm(`Delete session "${RI(e)}"?`))try{await C(e.id),D()}catch(e){i({title:`Error`,description:e instanceof Error?e.message:`Failed to delete session`,variant:`destructive`})}};return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(BF,{title:a?.label||a?.name||n,onBack:t,action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(`/agents/${encodeURIComponent(T)}/settings`),className:`flex h-8 w-8 items-center justify-center rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Agent settings`,children:(0,Z.jsx)(Wi,{className:`h-3.5 w-3.5`})})}),(0,Z.jsxs)(`div`,{className:`border-b border-border px-4 py-3`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-semibold`,children:`Sessions`}),(0,Z.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:g?.mode===`incognito`?`Incognito mode`:g?.mode===`experimental`?`Experimental mode`:`Persistent history`}),(0,Z.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[(0,Z.jsxs)(Y,{size:`sm`,variant:s?`default`:`outline`,onClick:()=>{c(e=>!e),u(``)},disabled:_,children:[(0,Z.jsx)(br,{className:`mr-1 h-3.5 w-3.5`}),`New`]}),(0,Z.jsxs)(Y,{size:`sm`,variant:g?.mode===`experimental`?`default`:`outline`,onClick:k,disabled:_,children:[(0,Z.jsx)(Qn,{className:`mr-1 h-3.5 w-3.5`}),`Experimental`]}),(0,Z.jsx)(Y,{size:`sm`,variant:g?.mode===`incognito`?`default`:`outline`,onClick:A,disabled:_,children:`Incognito`})]})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-2`,children:[v&&(0,Z.jsx)(`div`,{className:`px-2 py-2 text-xs text-destructive`,children:v}),s&&(0,Z.jsxs)(`div`,{className:`mb-2 rounded-md border bg-muted/20 p-2`,children:[(0,Z.jsx)(`div`,{className:`mb-2 text-xs text-muted-foreground`,children:`Name the new session or leave it blank.`}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:l,onChange:e=>u(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),O()),e.key===`Escape`&&(c(!1),u(``))},placeholder:`Debugging auth`,className:`h-8`}),(0,Z.jsx)(Y,{size:`sm`,onClick:O,disabled:_,children:`Create`})]})]}),g?.sessions.length?(0,Z.jsx)(`div`,{className:`space-y-1.5`,children:g.sessions.map(e=>{let t=w?.id===e.id&&g.mode!==`incognito`,n=d===e.id;return(0,Z.jsx)(`div`,{onClick:()=>j(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),j(e))},role:`button`,tabIndex:_?-1:0,className:`group w-full rounded-md border px-3 py-2 text-left transition-colors ${t?`border-foreground bg-accent`:`border-transparent hover:bg-accent/50`} ${_?`opacity-60`:``}`,children:(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,Z.jsx)(`div`,{className:`min-w-0 flex-1`,children:n?(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(q,{value:p,onChange:e=>m(e.target.value),onClick:e=>e.stopPropagation(),onKeyDown:t=>{t.key===`Enter`&&(t.preventDefault(),M(e)),t.key===`Escape`&&(f(null),m(``))},placeholder:`Session name`,className:`h-8`}),(0,Z.jsx)(Y,{size:`sm`,onClick:t=>{t.stopPropagation(),M(e)},disabled:!p.trim()||_,children:`Save`})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`truncate text-sm font-medium`,children:RI(e)}),e.isExperimental&&(0,Z.jsx)(`span`,{className:`rounded-full bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary`,children:`∞`}),e.isCurrent&&(0,Z.jsx)(`span`,{className:`rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground`,children:`Current`})]}),(0,Z.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground`,children:zI(e)})]})}),!n&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5 reveal-on-hover`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),f(e.id),m(e.name||RI(e))},className:`flex h-7 w-7 items-center justify-center rounded hover:bg-muted-foreground/10 text-muted-foreground touch-target`,title:`Rename`,children:(0,Z.jsx)(Gn,{className:`h-3.5 w-3.5`})}),!e.isExperimental&&(0,Z.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),N(e)},className:`flex h-7 w-7 items-center justify-center rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive touch-target`,title:`Delete session`,children:(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`})})]})]})},e.id)})}):(0,Z.jsx)(`div`,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`text-sm`,children:_?`Loading sessions...`:`No persistent sessions yet.`}),(0,Z.jsx)(`div`,{className:`mt-1 text-xs`,children:"Use `New`, `Experimental`, or `Incognito`."})]})}),h?.mode===`incognito`&&(0,Z.jsx)(`div`,{className:`mt-3 rounded-md border border-dashed px-3 py-2 text-xs text-muted-foreground`,children:`Incognito session is active. It lives in memory and stays out of the session list.`})]})]})}function HI(){let{state:e,closeM2:t}=qC(),n=De(),r=ft(),i=vn(),a=e.selectedEntityId,[o,s]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!a)return;let e=!1;return QD(a).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[a]);let c=i.pathname.split(`/`).filter(Boolean),l=c[2]===`settings`?FD(c[3]):null,u=encodeURIComponent(o?.name||a||``),d=(0,X.useMemo)(()=>PD.map(({id:e,label:t,description:n,icon:r})=>({id:e,label:t,description:n,icon:(0,Z.jsx)(r,{className:`h-4 w-4`})})),[]);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(BF,{title:`Settings: ${o?.label||o?.name||a||`Agent`}`,accentColor:o?.color??null,onBack:()=>{n||!u?t():r(`/agents/${u}`)},action:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>u&&r(`/agents/${u}`),className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground`,title:`Open agent`,children:(0,Z.jsx)(Pi,{className:`h-3.5 w-3.5`})})}),(0,Z.jsx)(rI,{items:d,activeId:l,onSelect:e=>u&&r(`/agents/${u}/settings/${e}`)})]})}function UI(){let e=vn(),{state:t}=qC(),[n,r]=(0,X.useState)(``),i=(0,X.useRef)(null);(0,X.useLayoutEffect)(()=>{let e=i.current,t=e?.querySelector(`[aria-current="page"]`);if(!e||!t)return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.top<n.top?e.scrollTop+=r.top-n.top:r.bottom>n.bottom&&(e.scrollTop+=r.bottom-n.bottom)},[e.pathname,t.user?.userType]);let a=SC.filter(e=>e.id!==`server`||t.user?.userType===`admin`).map(e=>({...e,items:e.items.filter(t=>wC(n,e.label,t.label,t.description))})).filter(e=>e.items.length);return(0,Z.jsxs)(`nav`,{"aria-label":`Settings`,className:`flex h-full flex-col`,children:[(0,Z.jsxs)(`div`,{className:`shrink-0 space-y-3 border-b border-border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center`,children:[(0,Z.jsx)(XC,{}),(0,Z.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Settings`})]}),(0,Z.jsx)(q,{type:`search`,name:`settings-menu-filter`,autoComplete:`off`,"data-lpignore":`true`,"data-1p-ignore":`true`,"aria-label":`Search settings menu`,placeholder:`Find a setting…`,value:n,onChange:e=>r(e.target.value)})]}),(0,Z.jsxs)(`div`,{ref:i,className:`min-h-0 flex-1 space-y-4 overflow-y-auto p-2`,children:[a.map(t=>(0,Z.jsxs)(`section`,{"aria-label":t.label,children:[(0,Z.jsx)(`h2`,{className:`px-3 py-2 text-xs font-semibold text-muted-foreground`,children:t.label}),t.items.map(({path:t,icon:n,label:r,description:i})=>(0,Z.jsxs)(we,{to:t,"aria-current":e.pathname===t?`page`:void 0,className:K(`flex items-start gap-3 rounded-md px-3 py-2 text-left hover:bg-accent/50`,e.pathname===t&&`bg-accent`),children:[(0,Z.jsx)(n,{className:`mt-0.5 h-4 w-4 shrink-0 text-muted-foreground`}),(0,Z.jsxs)(`span`,{children:[(0,Z.jsx)(`span`,{className:`block text-sm font-medium`,children:r}),(0,Z.jsx)(`span`,{className:`mt-0.5 block text-xs leading-relaxed text-muted-foreground`,children:i})]})]},t))]},t.id)),!a.length&&(0,Z.jsx)(`p`,{role:`status`,className:`p-3 text-sm text-muted-foreground`,children:`No settings match. Try “cache”, “model” or “token”.`})]})]})}var WI=280;function GI(){let{state:e}=qC(),{activeSection:t,m2View:n}=e;if(t===`contexts`){if(n===`settings`)return(0,Z.jsx)(iI,{});if(n===`detail`)return(0,Z.jsx)(nI,{})}if(t===`workspaces`){if(n===`settings`)return(0,Z.jsx)(PI,{});if(n===`detail`)return(0,Z.jsx)(TI,{})}if(t===`agents`){if(n===`settings`)return(0,Z.jsx)(HI,{});if(n===`detail`)return(0,Z.jsx)(VI,{})}return null}function KI(){let{state:e,closeM1:t,closeM2:n}=qC();Ae(t,e.m1Open&&!e.m2Open),Ae(n,e.m1Open&&e.m2Open);let r=De(),i=(0,X.useRef)(null),a=(0,X.useRef)(null);LF(i,e.m1Open&&!e.m2Open,e.activeSection??``),LF(a,e.m1Open&&e.m2Open,`${e.activeSection}:${e.selectedEntityId}:${e.m2View}`);let[o,s]=(0,X.useState)(WI),[c,l]=(0,X.useState)(!1),u=r&&e.m1Open;return(0,Z.jsxs)(Z.Fragment,{children:[u&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-40 bg-scrim animate-fade-in`,onClick:t,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{style:e.m1Open&&!u?{width:o}:void 0,className:K(`flex-shrink-0 overflow-hidden bg-card surface-glass`,!c&&!u&&`transition-[width] duration-normal ease-out`,e.m1Open?`rounded-[var(--panel-radius)] shadow-elevation-2`:`w-0`,u?`fixed bottom-2 left-[calc(0.5rem+var(--spacing-rail)+0.5rem)] right-2 top-2 z-40 shadow-elevation-5`:`relative`),children:[(0,Z.jsxs)(`div`,{ref:i,"data-menu-view":`list`,inert:!e.m1Open||e.m2Open,className:K(`absolute inset-0 flex flex-col transition-opacity duration-normal ease-out`,e.m2Open&&`opacity-0 pointer-events-none`),style:u?void 0:{minWidth:o},children:[e.activeSection===`contexts`&&(0,Z.jsx)(zF,{}),e.activeSection===`workspaces`&&(0,Z.jsx)(sI,{}),e.activeSection===`agents`&&(0,Z.jsx)(LI,{}),e.activeSection===`admin`&&(0,Z.jsx)(UI,{}),e.activeSection===`apps`&&(0,Z.jsx)(rw,{}),e.activeSection===`settings`&&(0,Z.jsx)(UI,{})]}),(0,Z.jsx)(`div`,{ref:a,"data-menu-view":`detail`,inert:!e.m1Open||!e.m2Open,className:K(`absolute inset-0 z-10 bg-card flex flex-col md:transition-transform md:duration-normal md:ease-out`,e.m2Open?`translate-x-0`:`translate-x-full max-md:invisible`),children:e.m2Open&&(0,Z.jsx)(GI,{})}),e.m1Open&&!u&&(0,Z.jsx)(IF,{width:o,onResize:s,onDragging:l})]})]})}function qI(e){let[t]=e.split(`/`).filter(Boolean);return!t||t===`home`||t===`share-target`}function JI(e){let[t,n]=e.split(`/`).filter(Boolean);return[`contexts`,`workspaces`,`agents`,`apps`].includes(t)&&!!n}var YI=`max-md:fixed max-md:left-2 max-md:right-2 max-md:top-2 max-md:bottom-2 max-md:z-side max-md:py-0 max-md:mr-0 max-md:rounded-(--panel-radius) max-md:shadow-elevation-5 max-md:animate-fade-in`,XI=`fixed inset-0 z-side-scrim bg-scrim animate-fade-in md:hidden`;function ZI(){let e=w(),{pathname:t,search:n}=vn(),{state:r}=qC(),i=(0,X.useRef)(null);LF(i,!r.m1Open,t+n,!r.m0Open);let a=JI(t),o=qI(t),{entry:s,loading:c,error:l,close:u}=ye();return(0,Z.jsx)(`div`,{className:K(`relative flex flex-col flex-1 min-w-0`,!o&&`surface-sheet`),children:(0,Z.jsxs)(`div`,{className:`flex flex-1 min-h-0 gap-shell`,children:[(0,Z.jsx)(`main`,{ref:i,id:`content-area`,className:K(`relative flex-1 min-h-0 min-w-0 overflow-auto`,!a&&!o&&`p-page max-md:pb-rail-stack`),children:(0,Z.jsx)(Gt,{})}),(s||c||l)&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:XI,onClick:u,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{"data-reader-pane":!0,style:{"--reader-width":`${e??420}px`},className:K(`relative z-10 flex shrink-0 items-stretch py-2 mr-2 md:w-[var(--reader-width)] md:max-w-[calc(100%_-_248px)]`,YI),children:[(0,Z.jsx)(je,{edge:`left`}),(0,Z.jsx)(O,{},s?`${s.workspaceId}:${s.document.id}`:`loading`)]})]})]})})}function QI(){let{state:e,setView:t}=ol(),{pathname:n}=vn();return e.t1Open||e.addOpen||!qI(n)?null:(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t(`tools`),"aria-label":`Open toolbox`,title:`Open toolbox`,className:`fixed z-50 hidden md:flex h-16 w-16 items-center justify-center rounded-full shadow-elevation-4 transition-colors bottom-fab-inset right-6 bg-foreground text-background hover:bg-foreground`,children:(0,Z.jsx)(Ci,{className:`h-7 w-7`,strokeWidth:1.75,"aria-hidden":!0})})}var $I={current:null,sessions:null,isLoading:!1,error:null};function eL(e){return e instanceof Error?e.message:`Session request failed`}function tL({children:e}){let[t,n]=(0,X.useState)({}),r=(0,X.useCallback)((e,t)=>{n(n=>({...n,[e]:{...n[e]||$I,...t}}))},[]),i=(0,X.useCallback)((e,t)=>(r(e,{current:t.current,sessions:t.sessions,isLoading:!1,error:null}),t),[r]),a=(0,X.useCallback)(async e=>{if(e){r(e,{isLoading:!0,error:null});try{let[t,n]=await Promise.all([$D(e),eO(e)]);r(e,{current:t,sessions:n,isLoading:!1,error:null})}catch(t){throw r(e,{isLoading:!1,error:eL(t)}),t}}},[r]),o=(0,X.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await tO(e,t))}catch(t){throw r(e,{isLoading:!1,error:eL(t)}),t}},[i,r]),s=(0,X.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await nO(e,t))}catch(t){throw r(e,{isLoading:!1,error:eL(t)}),t}},[i,r]),c=(0,X.useCallback)(async(e,t,n)=>{r(e,{isLoading:!0,error:null});try{return i(e,await rO(e,t,{name:n}))}catch(t){throw r(e,{isLoading:!1,error:eL(t)}),t}},[i,r]),l=(0,X.useCallback)(async(e,t)=>{r(e,{isLoading:!0,error:null});try{return i(e,await iO(e,t))}catch(t){throw r(e,{isLoading:!1,error:eL(t)}),t}},[i,r]),u=(0,X.useMemo)(()=>({getState:e=>t[e]||$I,refresh:a,create:o,select:s,rename:c,remove:l}),[t,a,o,s,c,l]);return(0,Z.jsx)(hM.Provider,{value:u,children:e})}function nL(){let e=Dl(),{closeAdd:t}=ol(),{showSuccessToast:n,showErrorToast:r}=Oo(),[i,a]=(0,X.useState)(`Untitled.txt`),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),u=!1;try{Ml(``,i.trim()),u=!0}catch{}return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`plaintext-filename`,children:`Filename`}),(0,Z.jsx)(q,{id:`plaintext-filename`,autoFocus:!0,value:i,onChange:e=>a(e.target.value)})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Content`}),(0,Z.jsx)(Zc,{kind:`text`,value:o,onChange:s,placeholder:`Write plain text…`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Creates a file in the current storage folder. Existing files are never overwritten.`}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:t,disabled:c,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:async()=>{if(!(c||!u||e?.mode!==`workspace`||e.treeName!==`backends`)){l(!0);try{let r=await bl(e.workspaceName,e.path);await Eo(e.workspaceName,{...r,key:Ml(r.key,i.trim())},new Blob([o],{type:`text/plain;charset=utf-8`}),{contentType:`text/plain;charset=utf-8`}),El(e),window.dispatchEvent(new CustomEvent(`workspace:tree:refresh`)),n(`Plaintext file created`),t()}catch(e){r(e instanceof Error?e.message:`Failed to create file`)}finally{l(!1)}}},disabled:c||!u,children:c?`Creating…`:`Create file`})]})]})}function rL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=iT(n,t.addRelateTo),o=ux(n,a.write,t.addRelateTo?`related:${t.addRelateTo.documents.map(e=>e.id).sort().join(`,`)}`:`add`),s=oT(t.activeWorkspaceName),c=!!n&&o.canSave,l=async()=>{if(n)try{let t=await o.save(n),i=await a.write(t);r(i?`Note created; some relations failed`:`Note created`),o.finish(),e()}catch(e){i(e instanceof Error?e.message:`Failed to create note`)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`note-title`,children:`Title`}),(0,Z.jsx)(q,{id:`note-title`,value:o.title,onChange:e=>o.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Body`}),(0,Z.jsx)(Zc,{kind:`markdown`,value:o.content,onChange:o.setContent,placeholder:`Write your note…`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`note-comment`,children:`Comment`}),(0,Z.jsx)(`textarea`,{id:`note-comment`,value:o.comment,onChange:e=>o.setComment(e.target.value),rows:2,placeholder:`Optional; context you can't infer from the body`,className:`flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-elevation-1 transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Z.jsx)(fT,{geotag:o.geotag,idPrefix:`note-geotag`}),(0,Z.jsx)(aT,{f:a,idPrefix:`note`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsx)($c,{...o,onRetry:o.retry}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:o.saving,children:`Close`}),(0,Z.jsx)(Y,{size:`sm`,onClick:l,disabled:!c,children:o.saving?`Saving…`:`Done`})]})]})}function iL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=FE(),o=iT(n,t.addRelateTo),s=oT(t.activeWorkspaceName),c=!!n&&a.canSave;return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`link-url`,children:`URL`}),(0,Z.jsx)(q,{id:`link-url`,value:a.url,onChange:e=>a.setUrl(e.target.value),placeholder:`https://example.com`,autoFocus:!0}),a.showUrlError&&(0,Z.jsx)(`p`,{className:`text-xs text-destructive`,children:`Enter a valid URL, e.g. https://example.com`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`link-title`,children:`Title`}),(0,Z.jsx)(q,{id:`link-title`,value:a.title,onChange:e=>a.setTitle(e.target.value),placeholder:`Optional display title`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Z.jsx)(fT,{geotag:a.geotag,idPrefix:`link-geotag`}),(0,Z.jsx)(aT,{f:o,idPrefix:`link`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:async()=>{if(n)try{let t=await a.save(n),i=await o.write(t);r(i?`Link created; some relations failed`:`Link created`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create link`)}},disabled:!c,children:a.saving?`Saving…`:`Save link`})]})]})}function aL(e){let[t,n]=(0,X.useState)({key:``,list:[]});return(0,X.useEffect)(()=>{if(!e)return;let t=!1;return Rc(e,`github`).then(async r=>{let i=r.filter(e=>e.capabilities?.write),a=[];for(let t of i){let n=await Mc(e,`github`,t.address).catch(()=>[]);for(let e of n){if(e.writable===!1)continue;let n=e.id||e.name;a.push({driver:`github`,address:t.address,container:n,label:`GitHub: ${n}`})}}t||n({key:e,list:a})}).catch(()=>{t||n({key:e,list:[]})}),()=>{t=!0}},[e]),e&&t.key===e?t.list:[]}function oL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=ve(),o=iT(n,t.addRelateTo),s=oT(t.activeWorkspaceName),c=aL(t.activeWorkspaceName),[l,u]=(0,X.useState)(`canvas`),[d,f]=(0,X.useState)(!1),p=c.find(e=>`${e.driver}:${e.address}:${e.container}`===l),m=p?a.title.trim().length>0&&!d:!!n&&a.canSave,h=async()=>{if(p){f(!0);try{await As(t.activeWorkspaceName||``,p.driver,p.address,p.container,{title:a.title.trim(),...a.description.trim()?{description:a.description.trim()}:{},...a.tags.length?{labels:a.tags}:{}}),r(`Issue created in ${p.container}`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create issue`)}finally{f(!1)}return}if(n)try{let t=await a.save(n),i=await o.write(t);r(i?`Todo created; some relations failed`:`Todo created`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create todo`)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsx)(Oe,{...a}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`todo-comment`,children:`Comment`}),(0,Z.jsx)(`textarea`,{id:`todo-comment`,value:a.comment,onChange:e=>a.setComment(e.target.value),rows:3,placeholder:`Optional context`,className:`flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-elevation-1 transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),c.length>0&&(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`todo-destination`,children:`Save to`}),(0,Z.jsxs)(`select`,{id:`todo-destination`,value:l,onChange:e=>u(e.target.value),className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-elevation-1 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,children:[(0,Z.jsxs)(`option`,{value:`canvas`,children:[`Canvas: `,Ol(n)]}),c.map(e=>(0,Z.jsx)(`option`,{value:`${e.driver}:${e.address}:${e.container}`,children:e.label},`${e.driver}:${e.address}:${e.container}`))]}),p&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Creates a GitHub issue (due date, priority and status stay Canvas-side until the issue syncs back).`})]}),(0,Z.jsx)(fT,{geotag:a.geotag,idPrefix:`todo-geotag`}),!p&&(0,Z.jsx)(aT,{f:o,idPrefix:`todo`}),!p&&(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving||d,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:h,disabled:!m,children:a.saving||d?`Saving…`:p?`Create issue`:`Save todo`})]})]})}function sL(){let{closeAdd:e,state:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),a=pe(),o=iT(n,t.addRelateTo),s=oT(t.activeWorkspaceName),c=async()=>{if(n)try{let t=await a.save(n),i=await o.write(t);r(i?`Identity created; some relations failed`:`Identity created`),e()}catch(e){i(e instanceof Error?e.message:`Failed to create identity`)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsx)(oe,{idPrefix:`add-identity`,workspaceName:t.activeWorkspaceName??void 0,...a,emailValid:a.emailValid}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:a.tags,onChange:a.setTags,suggestions:s})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`identity-comment`,children:`Comment`}),(0,Z.jsx)(`textarea`,{id:`identity-comment`,value:a.comment,onChange:e=>a.setComment(e.target.value),rows:3,placeholder:`How you know them, where they came from…`,className:`flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-elevation-1 transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,Z.jsx)(aT,{f:o,idPrefix:`identity`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:Ol(n)}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:a.saving,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:c,disabled:!n||!a.canSave,children:a.saving?`Saving…`:`Save identity`})]})]})}function cL(){let{closeAdd:e}=ol(),t=Dl(),{showSuccessToast:n,showErrorToast:r}=Oo(),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(!1),c=i.trim().replace(/^\/+|\/+$/g,``),l=!!t&&!!c&&!o,u=async()=>{if(!(!l||!t)){s(!0);try{let{workspaceName:r,path:i,treeName:a}=await pl(t),o=i===`/`?``:i;if(a===`backends`){let e=await bl(r,i);await Ns(r,e.driver,e.address,[[e.key,c].filter(Boolean).join(`/`)]),El(t)}else await Ys(r,`${o}/${c}`,!0,a);n(`Folder created`),e()}catch(e){r(e instanceof Error?e.message:`Failed to create folder`)}finally{s(!1)}}};return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`add-folder-name`,children:`Folder name`}),(0,Z.jsx)(q,{id:`add-folder-name`,value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&u()},placeholder:`e.g. projects/alpha`,autoFocus:!0}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Nested paths are created as needed. Target: `,Ol(t)]})]}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:e,disabled:o,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:u,disabled:!l,children:o?`Creating…`:`Create folder`})]})]})}function lL(){let{openAddPicker:e,closeAdd:t}=ol(),n=Dl(),{showSuccessToast:r,showErrorToast:i}=Oo(),[a,o]=(0,X.useState)(!1);return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`fixed inset-0 z-picker-scrim bg-scrim animate-fade-in md:hidden`,onClick:()=>e(),"aria-hidden":!0}),(0,Z.jsx)(`div`,{className:`fixed inset-y-0 right-0 z-picker flex items-stretch py-2 pr-2 max-md:bottom-2 max-md:left-2 max-md:top-2 max-md:py-0 max-md:pr-0 max-md:animate-fade-in`,children:(0,Z.jsx)(ae,{sizeClassName:`h-full w-[420px] max-w-full max-md:w-full max-md:shadow-elevation-5`,fixedWorkspaceName:n?.mode===`workspace`?n.workspaceName:void 0,saving:a,onConfirm:async e=>{o(!0);try{await Cl(n,e),r(`${e.length} document${e.length===1?``:`s`} added`),t()}catch(e){i(e instanceof Error?e.message:`Failed to add documents`)}finally{o(!1)}},onClose:e})})]})}function uL(){let{state:e,closeAdd:t}=ol(),{editDocument:n,editWorkspaceId:r}=e,{showSuccessToast:i,showErrorToast:a}=Oo();return!n||!r?null:(0,Z.jsx)(dL,{doc:n,workspaceId:r,onCancel:t,onSaved:t,showSuccessToast:i,showErrorToast:a},`${r}:${n.id}`)}function dL({doc:e,workspaceId:t,onCancel:n,onSaved:r,showSuccessToast:i,showErrorToast:a}){let o=Gc(e,t),s=oT(t),c=async()=>{try{await o.save(),i(`Note updated`),r()}catch(e){a(e instanceof Error?e.message:`Failed to update note`)}};return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`edit-note-title`,children:`Title`}),(0,Z.jsx)(q,{id:`edit-note-title`,value:o.title,onChange:e=>o.setTitle(e.target.value),placeholder:`Optional; defaults to today's date`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-1 flex-col gap-1.5`,children:[(0,Z.jsx)(G,{children:`Body`}),(0,Z.jsx)(`div`,{className:`flex-1`,children:(0,Z.jsx)(Zc,{kind:`markdown`,value:o.content,onChange:o.setContent,placeholder:`Write your note…`})})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Z.jsx)($c,{...o,onRetry:o.save}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:n,disabled:o.saving,children:`Close`}),(0,Z.jsx)(Y,{size:`sm`,onClick:c,disabled:!o.canSave,children:o.saving?`Saving…`:`Done`})]})]})}function fL(e,t){let n=Kc(e.metadata?.features),[r,i]=(0,X.useState)(String(e.data?.label??``)),[a,o]=(0,X.useState)(n.length?n:e.data?.tags??[]),[s,c]=(0,X.useState)(!1),l=!s;async function u(){c(!0);try{let n=a.map(e=>e.trim()).filter(Boolean);await ys(t,{id:e.id,schema:e.schema,schemaVersion:e.schemaVersion,data:{...e.data,...r.trim()?{label:r.trim()}:{},tags:n},metadata:{features:Qc(a)}}),window.dispatchEvent(new CustomEvent(`workspace:documents:refresh`))}finally{c(!1)}}return{url:String(e.data?.uri??e.data?.url??``),label:r,setLabel:i,tags:a,setTags:o,saving:s,canSave:l,save:u}}function pL(){let{state:e,closeAdd:t}=ol(),{editDocument:n,editWorkspaceId:r}=e,{showSuccessToast:i,showErrorToast:a}=Oo();return!n||!r?null:(0,Z.jsx)(mL,{doc:n,workspaceId:r,onCancel:t,onSaved:t,showSuccessToast:i,showErrorToast:a})}function mL({doc:e,workspaceId:t,onCancel:n,onSaved:r,showSuccessToast:i,showErrorToast:a}){let o=fL(e,t),s=oT(t);return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(G,{children:[`URL `,(0,Z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`(frozen)`})]}),(0,Z.jsx)(q,{value:o.url,disabled:!0,className:`font-mono text-xs`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{htmlFor:`edit-link-label`,children:`Label`}),(0,Z.jsx)(q,{id:`edit-link-label`,value:o.label,onChange:e=>o.setLabel(e.target.value),placeholder:`Optional display name`,autoFocus:!0})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(G,{children:`Tags`}),(0,Z.jsx)(Be,{tags:o.tags,onChange:o.setTags,suggestions:s})]}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Z.jsx)(Y,{variant:`outline`,size:`sm`,onClick:n,disabled:o.saving,children:`Cancel`}),(0,Z.jsx)(Y,{size:`sm`,onClick:async()=>{try{await o.save(),i(`Link updated`),r()}catch(e){a(e instanceof Error?e.message:`Failed to update link`)}},disabled:!o.canSave,children:o.saving?`Saving…`:`Save link`})]})]})}var hL=380,gL=300,_L=560,vL={message:{label:`New Message`,icon:ki},note:{label:`New Note`,icon:Da},link:{label:`New Link`,icon:Ui},todo:{label:`New Todo`,icon:pa},identity:{label:`New Identity`,icon:Hr},sketch:{label:`New Sketch`,icon:pr},plaintext:{label:`New Plaintext File`,icon:Ki},file:{label:`Add Files`,icon:Yr},photo:{label:`Photo/Video`,icon:Ur},existing:{label:`Add Existing`,icon:ua},folder:{label:`New Folder`,icon:ni}};function yL(){let{state:e,openAdd:t,openAddPicker:n,closeAdd:r}=ol();Ae(r,e.addOpen);let{addOpen:i,addKind:a,editDocument:o,addModal:s}=e,c=Dl(),l=hl(c),u=l.isBackend&&!!a&&![`file`,`photo`,`folder`,`message`,`plaintext`].includes(a),d=e.activeWorkspaceName,f=!d||!!e.addRelateTo,p=u||a===`message`&&f,m=l.isBackend?[`note`,`link`,`todo`,`identity`,`sketch`,`existing`]:[`plaintext`];f&&m.push(`message`);let h=c?.mode===`workspace`?`${c.workspaceName}:${c.treeName}:${c.path}`:c?.contextId,g=ft();(0,X.useEffect)(()=>{!i||a!==`sketch`||l.isBackend||(r(),g(DE.createUrl(c)))},[i,a,c,r,g,l.isBackend]);let _=Nn(),[v,y]=(0,X.useState)(hL),b=(0,X.useRef)(null),x=(0,X.useCallback)(e=>{e.preventDefault(),b.current={startX:e.clientX,startWidth:v};let t=e=>{if(!b.current)return;let t=b.current.startX-e.clientX,n=Math.min(_L,Math.max(gL,b.current.startWidth+t));y(n)},n=()=>{b.current=null,window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n)};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[v]);if(!i)return null;let S=!!o,C=!S&&(!a||p),w,T;S?(w=o.schema===`data/schema/note`?`Edit Note`:`Edit Link`,T=o.schema===`data/schema/note`?Da:Ui):a&&!p?(w=vL[a].label,T=vL[a].icon):(w=`Add`,T=br);let E=(0,Z.jsxs)(Z.Fragment,{children:[_&&!s&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-panel-scrim bg-scrim animate-fade-in`,onClick:r,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{style:_||s?void 0:{width:v},className:K(`flex flex-col overflow-hidden rounded-[var(--panel-radius)] border bg-card surface-glass`,s?`h-full w-full`:_?`fixed bottom-2 left-2 right-2 top-2 z-panel shadow-elevation-5 animate-fade-in`:`relative shrink-0 shadow-elevation-3`),children:[!_&&!s&&(0,Z.jsx)(`div`,{onMouseDown:x,className:`absolute left-0 top-0 bottom-0 z-10 w-1 cursor-col-resize transition-colors hover:bg-primary/20`}),(0,Z.jsxs)(`div`,{className:`flex h-[calc(3rem-1px)] shrink-0 items-center gap-2 border-b-4 px-2`,style:e.activeAccentColor?{borderBottomColor:e.activeAccentColor}:void 0,children:[(0,Z.jsx)(`button`,{type:`button`,className:`canvas-nav-button`,"aria-label":`Back one level`,onClick:()=>C||S?r():n(),children:(0,Z.jsx)(ka,{className:`h-5 w-5`})}),(0,Z.jsxs)(`span`,{className:`flex flex-1 items-center gap-2 text-sm font-medium`,children:[S?(0,Z.jsx)(Lr,{className:`h-4 w-4`}):(0,Z.jsx)(T,{className:`h-4 w-4`}),w]}),(0,Z.jsx)(`button`,{type:`button`,onClick:r,className:`flex h-8 w-8 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,"aria-label":`Close`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[S&&o.schema===`data/schema/note`&&(0,Z.jsx)(uL,{}),S&&o.schema===`data/schema/link`&&(0,Z.jsx)(pL,{}),!S&&C&&e.addRelateTo&&(0,Z.jsxs)(`p`,{className:`border-b px-4 py-2 text-xs text-muted-foreground`,children:[`The new document will be related to `,e.addRelateTo.documents.length,` selected document`,e.addRelateTo.documents.length===1?``:`s`,`.`]}),!S&&l.isBackend&&a!==`message`&&(0,Z.jsx)(`p`,{className:`border-b px-4 py-3 text-xs text-muted-foreground`,children:l.loading?`Checking storage destination…`:l.error||`Files are saved directly to this backend folder. Notes and other database documents belong in context or directory trees.`}),!S&&C&&(!l.isBackend||l.destination)&&(0,Z.jsx)(AE,{onSelect:t,omit:m}),!S&&a===`message`&&!f&&d&&(0,Z.jsx)(R,{workspaceId:d,onClose:r},d),!S&&!l.isBackend&&a===`note`&&(0,Z.jsx)(rL,{},h),!S&&!l.isBackend&&a===`link`&&(0,Z.jsx)(iL,{}),!S&&!l.isBackend&&a===`todo`&&(0,Z.jsx)(oL,{}),!S&&!l.isBackend&&a===`identity`&&(0,Z.jsx)(sL,{}),!S&&l.destination&&a===`plaintext`&&(0,Z.jsx)(nL,{},h),!S&&(!l.isBackend||l.destination)&&a===`file`&&(0,Z.jsx)(wT,{},h),!S&&(!l.isBackend||l.destination)&&a===`photo`&&(0,Z.jsx)(wT,{capture:!0},h),!S&&!l.isBackend&&a===`existing`&&(0,Z.jsx)(lL,{}),!S&&(!l.isBackend||l.destination)&&a===`folder`&&(0,Z.jsx)(cL,{},h)]})]})]});return s?(0,Z.jsx)(tn,{label:w,onClose:r,children:E}):E}var bL=(0,X.createContext)(null);function xL(){return(0,X.useContext)(bL)}function SL(){let e=xL(),t=e?.notifications??[];return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-between px-4 h-12 bg-foreground shrink-0`,children:(0,Z.jsx)(`span`,{className:`text-sm font-medium text-background`,children:`Home`})}),(0,Z.jsx)(`div`,{className:`px-4 py-4 border-b border-border shrink-0`,children:(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,children:[(0,Z.jsx)(Zn,{className:`w-4 h-4`}),(0,Z.jsx)(`span`,{className:`text-xs font-mono`,children:new Date().toLocaleTimeString()})]})}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto p-4`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(oa,{className:`w-3.5 h-3.5 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:`Notifications`})]}),t.length>0&&(0,Z.jsx)(Y,{size:`sm`,variant:`ghost`,className:`h-6 px-1.5 text-xs text-muted-foreground`,onClick:()=>void e?.clear(),title:`Clear notifications`,children:(0,Z.jsx)(Qr,{className:`w-3 h-3`})})]}),t.length===0?(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground text-center py-10 border border-dashed rounded-(--card-radius)`,children:`No notifications`}):(0,Z.jsx)(`div`,{className:`space-y-2`,children:[...t].reverse().map(e=>(0,Z.jsxs)(`div`,{className:`rounded-(--card-radius) border p-2.5`,children:[(0,Z.jsx)(`p`,{className:`text-xs whitespace-pre-wrap break-words`,children:e.text}),(0,Z.jsx)(`p`,{className:`mt-1 text-[10px] text-muted-foreground`,children:new Date(e.timestamp).toLocaleString()})]},e.id))})]})]})}function CL({status:e}){return(0,Z.jsx)(`span`,{className:K(`inline-block w-2 h-2 rounded-full shrink-0`,e===`active`?`bg-success`:e===`error`?`bg-destructive`:e===`starting`||e===`stopping`?`bg-warning`:`bg-muted-foreground`),title:e})}function wL(){let{openAgentT2:e}=ol(),{setSection:t}=qC(),n=ft(),{agents:r,isLoading:i,refresh:a}=FI(!0),{showToast:o}=wo(),[s,c]=(0,X.useState)(new Set),l=(e,t)=>c(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r}),u=async(e,t)=>{e.stopPropagation(),l(t.id,!0);try{await dO(t.id),a()}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed`,variant:`destructive`})}finally{l(t.id,!1)}},d=async(e,t)=>{e.stopPropagation(),l(t.id,!0);try{await fO(t.id),a()}catch(e){o({title:`Error`,description:e instanceof Error?e.message:`Failed`,variant:`destructive`})}finally{l(t.id,!1)}};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsx)(`div`,{className:`flex items-center justify-between px-4 h-12 border-b border-border shrink-0`,children:(0,Z.jsx)(`span`,{className:`text-sm font-semibold`,children:`Agents`})}),(0,Z.jsx)(`div`,{className:`flex-1 overflow-y-auto py-2`,children:i&&r.length===0?(0,Z.jsx)(`div`,{className:`px-4 py-3 text-xs text-muted-foreground`,children:`Loading…`}):r.length===0?(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-12 text-muted-foreground`,children:[(0,Z.jsx)(ri,{className:`w-8 h-8 opacity-30`}),(0,Z.jsx)(`span`,{className:`text-xs`,children:`No agents yet`}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>{t(`agents`),n(`/agents?create=1`)},className:`text-xs text-primary hover:underline`,children:`Create an agent`})]}):(0,Z.jsx)(`div`,{className:`space-y-1 px-2`,children:r.map(t=>{let n=s.has(t.id);return(0,Z.jsxs)(`div`,{className:`group relative px-3 py-2.5 cursor-pointer transition-colors bg-card hover:bg-accent/50`,style:{borderLeft:`6px solid ${t.color||`transparent`}`},onClick:()=>e(t.id),children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(CL,{status:t.status}),(0,Z.jsx)(`span`,{className:`text-sm font-medium flex-1 truncate`,children:t.label||t.name}),(0,Z.jsx)(`div`,{className:`flex items-center gap-0.5 shrink-0 reveal-on-hover`,children:t.status===`active`?(0,Z.jsx)(`button`,{type:`button`,disabled:n,onClick:e=>d(e,t),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-3 h-3`})}):(0,Z.jsx)(`button`,{type:`button`,disabled:n,onClick:e=>u(e,t),className:`flex items-center justify-center w-6 h-6 rounded hover:bg-muted-foreground/10 text-muted-foreground disabled:opacity-50`,title:`Start`,children:(0,Z.jsx)(Ar,{className:`w-3 h-3`})})})]}),t.description&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground truncate mt-0.5 pl-4`,children:t.description})]},t.id)})})})]})}function TL(){let e=xL(),[t,n]=(0,X.useState)(50),r=e?.notifications??[],i=r.slice(-t).reverse();return(0,Z.jsxs)(`section`,{"aria-label":`Notification history`,className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-3 border-b px-4 py-3`,children:[(0,Z.jsxs)(`div`,{children:[(0,Z.jsxs)(`h2`,{className:`text-sm font-semibold`,children:[`Notifications`,r.length>0&&(0,Z.jsx)(`span`,{className:`ml-2 font-normal text-muted-foreground`,children:r.length})]}),(0,Z.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:`Saved on this browser`})]}),r.length>0&&(0,Z.jsxs)(Y,{variant:`ghost`,size:`sm`,onClick:()=>void e?.clear(),title:`Clear all notifications`,className:`shrink-0 gap-1.5`,children:[(0,Z.jsx)(Qr,{className:`h-3.5 w-3.5`}),`Clear all`]})]}),e?.storageError&&(0,Z.jsx)(`p`,{role:`alert`,className:`border-b px-4 py-3 text-xs text-destructive`,children:`Couldn’t access notification history in this browser.`}),e?.loading?(0,Z.jsx)(`p`,{role:`status`,className:`p-4 text-sm text-muted-foreground`,children:`Loading notifications…`}):r.length===0?(0,Z.jsxs)(`div`,{className:`flex flex-1 flex-col items-center justify-center gap-3 p-8 text-center`,children:[(0,Z.jsx)(`div`,{className:`flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,Z.jsx)(oa,{className:`h-5 w-5 text-muted-foreground`})}),(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No notifications yet`})]}):(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3`,children:[(0,Z.jsx)(`ol`,{className:`space-y-2`,children:i.map(t=>{let n=t.status===`error`?er:t.status===`completed`?Sr:t.status===`started`?Zn:oa;return(0,Z.jsx)(`li`,{"data-notification-id":t.id,className:`rounded-(--card-radius) border bg-card p-3`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,Z.jsx)(n,{"aria-hidden":!0,className:`mt-0.5 h-4 w-4 shrink-0 ${t.status===`error`?`text-destructive`:`text-muted-foreground`}`}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`p`,{className:`break-words text-sm font-medium`,children:t.title}),t.text&&(0,Z.jsx)(`p`,{className:`mt-1 whitespace-pre-wrap break-words text-xs text-muted-foreground`,children:t.text}),(0,Z.jsxs)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:[(0,Z.jsx)(`time`,{dateTime:t.timestamp,children:new Date(t.timestamp).toLocaleString()}),t.status===`started`&&(0,Z.jsx)(`span`,{children:` · Started`}),t.status===`completed`&&(0,Z.jsx)(`span`,{children:` · Completed`}),t.status===`error`&&(0,Z.jsx)(`span`,{children:` · Error`})]})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>void e?.remove(t.id),"aria-label":`Clear notification: ${t.title}`,title:`Clear notification`,className:`-mr-1 -mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent focus-ring touch-target`,children:(0,Z.jsx)(vr,{className:`h-3.5 w-3.5`})})]})},t.id)})}),r.length>t&&(0,Z.jsx)(Y,{variant:`ghost`,size:`sm`,className:`mt-3 w-full`,onClick:()=>n(e=>e+50),children:`Show older notifications`})]})]})}function EL(e){if(!e)return``;if(typeof e.errorMessage==`string`&&e.errorMessage.trim())return e.errorMessage.trim();let t=e.content;return typeof t==`string`?t:Array.isArray(t)&&t.filter(e=>e?.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
|
|
58
|
+
`)||``}function DL(e){let[t,n]=(0,X.useState)([]),[r,i]=(0,X.useState)(!1),[a,o]=(0,X.useState)(null),s=(0,X.useRef)(null),[c,l]=(0,X.useState)(e);return c!==e&&(l(e),e||n([])),(0,X.useEffect)(()=>{let t=!1;if(e)return $D(e).then(e=>{t||n(e.messages.map(e=>({role:e.role,content:e.content,isComplete:!0,...e.metadata?.reasoning?{reasoning:e.metadata.reasoning}:{},...e.metadata?{metadata:e.metadata}:{}})))}).catch(()=>{t||n([])}),()=>{t=!0}},[e]),{messages:t,isStreaming:r,error:a,send:(0,X.useCallback)(async t=>{if(r||!t.trim()||!e)return;o(null),n(e=>[...e,{role:`user`,content:t,isComplete:!0},{role:`assistant`,content:``,isComplete:!1}]),i(!0);try{await dO(e)}catch(e){let t=e instanceof Error?e.message:void 0;if(!t?.includes(`not active`)&&!t?.includes(`already`)){o(t??`Failed to start agent`),i(!1);return}}s.current=new AbortController;let a=``,c=``,l=``,u;try{await J.stream(`${yo}/agents/${e}/prompt/stream`,{message:t},{signal:s.current.signal,onChunk:e=>{a+=e;let t=a.split(`
|
|
59
|
+
`);a=t.pop()??``;for(let e of t){if(!e.startsWith(`data: `))continue;let t=e.slice(6).trim();if(t===`[DONE]`)return;try{let e=JSON.parse(t);if(e.type===`chunk`)c+=e.delta||``,n(e=>{let t=[...e];return t[t.length-1]={role:`assistant`,content:c,isComplete:!1,...l?{reasoning:l}:{},...u?{metadata:u}:{}},t});else if(e.type===`thinking`)l=`${l}${e.delta||``}`.trim(),n(e=>{let t=[...e],n=t[t.length-1]?.content||c;return t[t.length-1]={role:`assistant`,content:n,isComplete:!1,...l?{reasoning:l}:{},...u?{metadata:u}:{}},t});else if(e.type===`complete`){let t=Array.isArray(e.messages)?[...e.messages].reverse().find(e=>e?.role===`assistant`):null,r=EL(t),i=BD(t)||l;u=VD(t),n(e=>{let t=[...e],n=c||t[t.length-1]?.content||``;return t[t.length-1]={role:`assistant`,content:r||n,isComplete:!0,...i?{reasoning:i}:{},...u?{metadata:u}:{}},t})}else e.type===`error`&&o(e.error)}catch{}}},onError:e=>{e.name!==`AbortError`&&o(e.message)},onComplete:()=>{n(e=>{let t=[...e],n=t[t.length-1];return n&&!n.isComplete&&(t[t.length-1]={...n,isComplete:!0}),t}),i(!1)}})}catch(e){let t=e instanceof Error?e:null;t?.name!==`AbortError`&&o(t?.message??`Stream failed`),n(e=>{let t=[...e],n=t[t.length-1];return n&&!n.isComplete&&(t[t.length-1]={...n,isComplete:!0}),t}),i(!1)}},[e,r]),sendVoice:(0,X.useCallback)(async t=>{if(!(r||!e)){o(null),i(!0),n(e=>[...e,{role:`user`,content:`🎤 Transcribing…`,isComplete:!1}]);try{let r=await vO(e,t);n(e=>{let t=[...e];return t[t.length-1]={role:`user`,content:`🎤 ${r.transcript}`,isComplete:!0},[...t,{role:`assistant`,content:r.reply,isComplete:!0}]}),r.audio&&r.audioMimeType&&new Audio(`data:${r.audioMimeType};base64,${r.audio}`).play().catch(()=>{})}catch(e){o(e instanceof Error?e.message:`Voice prompt failed`),n(e=>{let t=[...e],n=t[t.length-1];return n?.role===`user`&&!n.isComplete&&t.pop(),t})}finally{i(!1)}}},[e,r]),stop:(0,X.useCallback)(()=>{s.current?.abort(),i(!1)},[]),clear:(0,X.useCallback)(()=>{n([]),o(null)},[])}}function OL(){let[e,t]=(0,X.useState)(!1),[n,r]=(0,X.useState)(null),i=(0,X.useRef)(null),a=(0,X.useRef)([]);return{isRecording:e,recorderError:n,start:(0,X.useCallback)(async()=>{if(!i.current){if(r(null),!navigator.mediaDevices?.getUserMedia||typeof MediaRecorder>`u`){r(`Audio recording is not supported in this browser`);return}try{let e=await navigator.mediaDevices.getUserMedia({audio:!0}),n=MediaRecorder.isTypeSupported(`audio/webm;codecs=opus`)?`audio/webm;codecs=opus`:void 0,r=new MediaRecorder(e,n?{mimeType:n}:void 0);a.current=[],r.ondataavailable=e=>{e.data.size>0&&a.current.push(e.data)},r.start(),i.current=r,t(!0)}catch(e){let t=e instanceof Error?e:null;r(t?.name===`NotAllowedError`?`Microphone access denied`:t?.message??`Could not start recording`)}}},[]),stop:(0,X.useCallback)(()=>{let e=i.current;return e?new Promise(n=>{e.onstop=()=>{e.stream.getTracks().forEach(e=>e.stop()),i.current=null,t(!1);let r=e.mimeType||`audio/webm`,o=new Blob(a.current,{type:r});a.current=[],n(o.size>0?o:null)},e.stop()}):Promise.resolve(null)},[]),cancel:(0,X.useCallback)(()=>{let e=i.current;e&&(e.onstop=()=>{e.stream.getTracks().forEach(e=>e.stop())},e.stop(),i.current=null,a.current=[],t(!1))},[])}}function kL({agentId:e,onClose:t}){let[n,r]=(0,X.useState)(null),[i,a]=(0,X.useState)(``),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(null),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)(null),{showToast:m}=wo(),h=ul(),g=h?.state.activeContextType===`context`?h.state.activeContextId:null,_=h?.state.activeContextPath??null,v=(0,X.useRef)(null),y=(0,X.useRef)(null),{messages:b,isStreaming:x,error:S,send:C,sendVoice:w,stop:T,clear:E}=DL(e),{isRecording:D,recorderError:O,start:k,stop:A}=OL();(0,X.useEffect)(()=>{QD(e).then(r).catch(()=>{}),KD(e).then(l).catch(()=>l(null))},[e]),(0,X.useEffect)(()=>{_O().then(e=>s(!!(e.enabled&&e.stt))).catch(()=>s(!1))},[]),(0,X.useEffect)(()=>{b.length!==0&&v.current?.scrollIntoView({behavior:`smooth`})},[b]);let j=c?.binding.type===`context`&&!!g&&c?.binding.context===g,M=c?c.binding.type===`global`?`scope: global`:c.binding.type===`context`?j?`scoped to this context`:`context-bound`:`scope: ${c.binding.workspaceName||c.binding.workspace}${c.binding.type===`path`?`:${c.binding.path||`/`}`:``}`:`no canvas access`,N=async()=>{if(!g||u)return;let t=g||_;if(window.confirm(`Bind "${n?.label||n?.name||e}" to the current context (${t})? This mints a new canvas token and restarts the agent if it is running.`)){d(!0);try{let t=await qD(e,{binding:{type:`context`,context:g},permissions:[`read`,`write`]});l(t.access),p(t.token)}catch(e){m({title:`Error`,description:e instanceof Error?e.message:`Bind failed`,variant:`destructive`})}finally{d(!1)}}},P=async()=>{let e=i.trim();!e||x||(a(``),y.current?.focus(),await C(e))};return(0,Z.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-3 h-12 border-b border-border shrink-0`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:t,className:`p-1 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Back to agents`,children:(0,Z.jsx)(ka,{className:`w-4 h-4`})}),n?.color&&(0,Z.jsx)(`span`,{className:`w-2.5 h-2.5 rounded-full shrink-0`,style:{backgroundColor:n.color}}),(0,Z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,Z.jsx)(`div`,{className:`text-sm font-medium truncate`,children:n?.label||n?.name||e}),(0,Z.jsx)(`div`,{className:`text-[10px] leading-tight text-muted-foreground truncate`,title:M,children:M})]}),(0,Z.jsx)(`button`,{type:`button`,onClick:E,className:`p-1 rounded hover:bg-accent/50 text-muted-foreground hover:text-foreground transition-colors`,title:`Clear chat`,children:(0,Z.jsx)(Qr,{className:`w-3.5 h-3.5`})})]}),g&&!j&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 border-b border-border bg-muted/40 text-xs shrink-0`,children:[(0,Z.jsxs)(`span`,{className:`flex-1 truncate text-muted-foreground`,title:g||_||void 0,children:[`Toolbox context: `,g||_]}),(0,Z.jsx)(`button`,{type:`button`,disabled:u,onClick:N,className:`shrink-0 rounded border border-input px-2 py-1 hover:bg-accent disabled:opacity-50`,children:u?`Binding…`:`Bind to this context`})]}),f&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-2 border-b border-border bg-warning/10 text-xs shrink-0`,children:[(0,Z.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`Token (shown once):`}),(0,Z.jsx)(`code`,{className:`flex-1 truncate font-mono`,children:f}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>navigator.clipboard?.writeText(f),className:`shrink-0 rounded border border-input px-2 py-1 hover:bg-accent`,children:`Copy`}),(0,Z.jsx)(`button`,{type:`button`,onClick:()=>p(null),className:`shrink-0 rounded px-1.5 py-1 hover:bg-accent`,title:`Dismiss`,children:`×`})]}),(0,Z.jsxs)(`div`,{className:`flex-1 overflow-y-auto px-4 py-3 space-y-3`,children:[b.length===0&&(0,Z.jsx)(`div`,{className:`text-xs text-muted-foreground text-center py-10`,children:n?`Chat with ${n.label||n.name}`:`Loading…`}),b.map((e,t)=>(0,Z.jsxs)(`div`,{className:K(`text-sm rounded-lg px-3 py-2 max-w-[85%] break-words`,e.role===`user`?`ml-auto bg-foreground text-background`:`mr-auto bg-muted text-foreground`),children:[(0,Z.jsx)(pM,{reasoning:e.role===`assistant`?e.reasoning:void 0,metadata:e.role===`assistant`?e.metadata:void 0,isStreaming:!e.isComplete,compact:!0}),e.role===`assistant`?(0,Z.jsx)(F,{content:e.content||(e.isComplete?``:`…`)}):(0,Z.jsx)(`span`,{className:`whitespace-pre-wrap`,children:e.content})]},t)),(S||O)&&(0,Z.jsx)(`div`,{className:`text-xs text-destructive text-center py-1`,children:S||O}),(0,Z.jsx)(`div`,{ref:v})]}),(0,Z.jsx)(`div`,{className:`p-3 border-t border-border shrink-0`,children:(0,Z.jsxs)(`div`,{className:`flex gap-2 items-end`,children:[(0,Z.jsx)(`textarea`,{ref:y,value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),P())},placeholder:`Message…`,rows:2,className:`flex-1 resize-y text-sm px-3 py-2 border border-input bg-background rounded-md focus:outline-none focus:ring-1 focus:ring-ring min-h-[38px] max-h-[120px]`}),o&&(0,Z.jsx)(`button`,{type:`button`,onClick:async()=>{if(D){let e=await A();e&&await w(e)}else x||await k()},disabled:x&&!D,className:K(`flex items-center justify-center w-9 h-9 rounded-md transition-opacity shrink-0 disabled:opacity-40`,D?`bg-destructive text-destructive-foreground hover:opacity-90 animate-pulse`:`bg-muted text-foreground hover:bg-accent`),title:D?`Stop recording and send`:`Record a voice message`,children:D?(0,Z.jsx)(Sa,{className:`w-4 h-4`}):(0,Z.jsx)(ci,{className:`w-4 h-4`})}),x?(0,Z.jsx)(`button`,{type:`button`,onClick:T,className:`flex items-center justify-center w-9 h-9 rounded-md bg-destructive text-destructive-foreground hover:opacity-90 transition-opacity shrink-0`,title:`Stop`,children:(0,Z.jsx)(Sa,{className:`w-4 h-4`})}):(0,Z.jsx)(`button`,{type:`button`,onClick:P,disabled:!i.trim(),className:`flex items-center justify-center w-9 h-9 rounded-md bg-foreground text-background hover:opacity-90 disabled:opacity-40 transition-opacity shrink-0`,title:`Send`,children:(0,Z.jsx)(Ia,{className:`w-4 h-4`})})]})})]})}function AL(){let{state:e,openApplet:t}=ol(),[n,r]=(0,X.useState)(`context`),i=e.appsAppletId,a=i?_C.find(e=>e.id===i):null;if(a)return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5`,children:[(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t(null),className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,"aria-label":`Back to applets`,title:`Back to applets`,children:(0,Z.jsx)(ka,{className:`h-4 w-4`})}),(0,Z.jsx)(a.icon,{className:`h-4 w-4 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:a.label})]}),(0,Z.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,Z.jsx)(a.Component,{})})]});let o=vC(n);return(0,Z.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,Z.jsx)(`div`,{className:`flex shrink-0 border-b border-border`,children:[`context`,`global`].map(e=>(0,Z.jsx)(`button`,{type:`button`,onClick:()=>r(e),className:K(`flex-1 py-2.5 text-xs capitalize transition-colors`,n===e?`-mb-px border-b-2 border-foreground font-semibold text-foreground`:`font-medium text-muted-foreground hover:text-foreground`),children:e},e))}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-3`,children:[!o.length&&(0,Z.jsxs)(`p`,{className:`py-10 text-center text-sm text-muted-foreground`,children:[`No `,n,` applets yet.`]}),(0,Z.jsx)(`div`,{className:`grid grid-cols-2 gap-2`,children:o.map(e=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>t(e.id),className:`flex min-h-[4.5rem] flex-col items-center justify-center gap-1.5 rounded-(--card-radius) border border-border bg-muted/40 p-3 text-foreground transition-colors hover:bg-muted`,title:e.description,children:[(0,Z.jsx)(e.icon,{className:`h-5 w-5 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`text-xs font-medium leading-none`,children:e.label})]},e.id))})]})]})}var jL=[{view:`apps`,icon:Ga,label:`Apps`},{view:`tools`,icon:Ci,label:`Filters`},{view:`agents`,icon:ri,label:`Agents`},{view:`notifications`,icon:oa,label:`Notifications`}],ML=340,NL=`toolbox:width`,PL=360,FL=48,IL=e=>{let t=typeof window<`u`?window.innerWidth:1600,n=Math.max(ML,Math.min(Math.round(t*.7),t-FL-PL));return Math.max(ML,Math.min(e,n))},LL=()=>typeof window<`u`?Math.round(window.innerWidth/2):720;function RL(){let{state:e,setView:t,closeT1:n,closeT2:r}=ol();Ae(n,e.t1Open&&!e.t2Open),Ae(r,e.t2Open);let{t1Open:i,t1View:a,t2Open:o,t2AgentId:s,activeAccentColor:c}=e,l=Nn(),[u,d]=(0,X.useState)(()=>{let e=typeof window<`u`?Number(localStorage.getItem(NL)):NaN;return Number.isFinite(e)&&e>0?e:420}),f=(0,X.useCallback)(e=>{d(e);try{localStorage.setItem(NL,String(e))}catch{}},[]),p=(0,X.useRef)(null),m=(0,X.useCallback)(e=>{e.preventDefault(),p.current={startX:e.clientX,startWidth:u};let t=e=>{if(!p.current)return;let t=IL(p.current.startWidth-(e.clientX-p.current.startX));d(t)},n=()=>{p.current=null,window.removeEventListener(`mousemove`,t),window.removeEventListener(`mouseup`,n),d(e=>{try{localStorage.setItem(NL,String(e))}catch{}return e})};window.addEventListener(`mousemove`,t),window.addEventListener(`mouseup`,n)},[u]),h=u>=LL()*.9;return(0,X.useEffect)(()=>{let e=()=>d(e=>IL(e));return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),!i||!a?null:(0,Z.jsxs)(Z.Fragment,{children:[l&&(0,Z.jsx)(`div`,{className:`fixed inset-0 z-panel-scrim bg-scrim animate-fade-in`,onClick:n,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{style:l?void 0:{width:u},className:K(`flex flex-col overflow-hidden rounded-(--panel-radius) border bg-card surface-glass text-foreground`,l?`fixed bottom-2 left-2 right-2 top-2 z-panel shadow-elevation-5 animate-fade-in`:`relative shrink-0 shadow-elevation-3`),children:[!l&&(0,Z.jsx)(`div`,{onMouseDown:m,className:`absolute left-0 top-0 z-20 h-full w-1.5 cursor-col-resize hover:bg-primary/20`,title:`Drag to resize`,"aria-hidden":!0}),(0,Z.jsxs)(`div`,{className:`flex h-[calc(3rem-1px)] shrink-0 items-center justify-between gap-1 border-b-4 px-2`,style:c?{borderBottomColor:c}:void 0,children:[(0,Z.jsx)(`div`,{className:`flex items-center gap-1`,children:jL.map(({view:e,icon:n,label:r})=>(0,Z.jsx)(`button`,{type:`button`,onClick:()=>t(e),"aria-label":r,title:r,className:K(`flex h-10 w-11 items-center justify-center rounded-md transition-colors`,a===e?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/60 hover:text-foreground`),children:(0,Z.jsx)(n,{className:`h-4 w-4 shrink-0`})},e))}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[!l&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>f(h?420:IL(LL())),className:`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,"aria-label":h?`Shrink toolbox`:`Expand toolbox`,title:h?`Shrink toolbox`:`Expand to half screen`,children:h?(0,Z.jsx)(ei,{className:`h-4 w-4`}):(0,Z.jsx)(ba,{className:`h-4 w-4`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:n,className:`rounded p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground touch-target`,"aria-label":`Close toolbox`,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})})]})]}),(0,Z.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col ${o&&s?`invisible`:``}`,children:[a===`home`&&(0,Z.jsx)(SL,{}),a===`apps`&&(0,Z.jsx)(AL,{}),a===`tools`&&(0,Z.jsx)(pC,{}),a===`agents`&&(0,Z.jsx)(wL,{}),a===`notifications`&&(0,Z.jsx)(TL,{})]}),o&&s&&(0,Z.jsx)(`div`,{className:`absolute inset-0 z-10 flex flex-col bg-background`,children:(0,Z.jsx)(kL,{agentId:s,onClose:r})})]})]})]})}function zL(){let{running:e,hasViewer:t,paused:n,snapshot:r,source:i,lastCount:a,error:o,setPaused:s,stop:c,reopen:l}=Ex();if(!e||t)return null;let u=i===`screen`?mr:i===`photo`?zn:Ur;return(0,Z.jsxs)(`div`,{className:K(`fixed right-4 w-56 overflow-hidden rounded-(--panel-radius) border border-border bg-card shadow-elevation-4 z-panel animate-fade-in`,`bottom-fab-inset md:bottom-[calc(var(--spacing-fab-inset)+5rem)]`),role:`status`,"aria-label":`Lens feed running`,children:[(0,Z.jsxs)(`button`,{type:`button`,onClick:l,title:`Back to Lens`,className:`relative block w-full cursor-pointer bg-black/80 aspect-video`,children:[(0,Z.jsx)(Bx,{className:`h-full w-full`}),r&&(0,Z.jsx)(`img`,{src:r,alt:``,className:`absolute inset-0 h-full w-full bg-black object-contain`}),n&&(0,Z.jsx)(`span`,{className:`absolute inset-0 flex items-center justify-center bg-black/50 text-xs font-medium text-white`,children:`paused`})]}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5`,children:[(0,Z.jsx)(u,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-[11px] text-muted-foreground`,children:o?(0,Z.jsx)(`span`,{className:`text-destructive`,children:o}):n?`paused`:r?`${i===`photo`?`photo`:`snapshot`} · ${a??`…`} match${a===1?``:`es`}`:`live · ${a??`…`} match${a===1?``:`es`}`}),i!==`photo`&&(0,Z.jsx)(`button`,{type:`button`,onClick:()=>s(!n),"aria-label":n?`Resume Lens`:`Pause Lens`,title:n?`Resume searching`:`Pause searching (camera stays on)`,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:n?(0,Z.jsx)(Ar,{className:`h-3.5 w-3.5`}):(0,Z.jsx)(Jr,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:l,"aria-label":`Reopen Lens panel`,title:`Reopen Lens`,className:`rounded p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground`,children:(0,Z.jsx)(ba,{className:`h-3.5 w-3.5`})}),(0,Z.jsx)(`button`,{type:`button`,onClick:c,"aria-label":`Stop Lens feed`,title:`Stop the feed`,className:`rounded p-1 text-destructive transition-colors hover:bg-destructive/10`,children:(0,Z.jsx)(Yi,{className:`h-3.5 w-3.5`})})]})]})}var BL=[`view`,`location`,`metadata`,`json`,`synapses`,`backends`];function VL(e){let t=new URLSearchParams(e.replace(/^#/,``)),n=t.get(`document`)??``,r=t.get(`workspace`);if(!r||!/^\d+$/.test(n)||!Number.isSafeInteger(Number(n))||Number(n)<=0)return null;let i=t.get(`section`);return{workspaceId:r,documentId:Number(n),section:BL.includes(i)?i:`view`,maximized:t.get(`fullscreen`)===`1`}}function HL(e){let t=new URLSearchParams({document:String(e.documentId),workspace:e.workspaceId});return e.section!==`view`&&t.set(`section`,e.section),e.maximized&&t.set(`fullscreen`,`1`),`#${t}`}function UL({children:e}){let t=vn(),n=ft(),r=(0,X.useMemo)(()=>VL(t.hash),[t.hash]),i=r?.workspaceId,a=r?.documentId,o=i&&a?JSON.stringify([i,a]):null,[s,c]=(0,X.useState)(0),[l,u]=(0,X.useState)(null),d=l?.key===o&&l?.revision===s?l:null;(0,X.useEffect)(()=>{if(!o||!i||!a||d)return;let e=!1;return xc(i,a).then(t=>{e||u({key:o,revision:s,document:t,error:t?void 0:`Document not found.`})}).catch(t=>{e||u({key:o,revision:s,document:null,error:t?.statusCode===404?`Document not found.`:`Unable to load this document.`})}),()=>{e=!0}},[o,i,a,s,d]);let f=(0,X.useCallback)((e,r)=>{u({key:JSON.stringify([r,e.id]),revision:s,document:e}),n({pathname:t.pathname,search:t.search,hash:HL({workspaceId:r,documentId:e.id,section:`view`,maximized:!1})},{state:t.state})},[n,t.pathname,t.search,t.state,s]),p=(0,X.useCallback)(()=>{r&&n({pathname:t.pathname,search:t.search,hash:``},{replace:!0,state:t.state})},[r,n,t.pathname,t.search,t.state]),m=(0,X.useCallback)((e,i)=>{r&&(u({key:JSON.stringify([i,e.id]),revision:s,document:e}),n({pathname:t.pathname,search:t.search,hash:HL({...r,workspaceId:i,documentId:e.id})},{replace:!0,state:t.state}))},[r,s,n,t.pathname,t.search,t.state]),h=(0,X.useCallback)(e=>{r&&n({pathname:t.pathname,search:t.search,hash:HL({...r,...e})},{replace:!0,state:t.state})},[r,n,t.pathname,t.search,t.state]),g=(0,X.useCallback)(()=>c(e=>e+1),[]),_=(0,X.useMemo)(()=>({entry:d?.document&&i?{document:d.document,workspaceId:i}:null,location:r,loading:!!r&&!d,error:d?.error,open:f,replace:m,close:p,update:h,retry:g}),[d,i,r,f,m,p,h,g]);return(0,Z.jsx)(ge.Provider,{value:_,children:e})}function WL({children:e}){let[t,n]=(0,X.useState)(null),r=(0,X.useCallback)((e,t)=>n({document:e,workspaceId:t}),[]),i=(0,X.useCallback)(()=>n(null),[]),a=(0,X.useMemo)(()=>({open:r,close:i}),[r,i]);return(0,Z.jsxs)(U.Provider,{value:a,children:[e,(0,Z.jsx)(Me,{document:t?.document??null,isOpen:!!t,onClose:i,workspaceId:t?.workspaceId})]})}var GL={key:`desk`,label:`Desk`,main:`/`,mainExpanded:!1,entries:[]},KL=0,qL=()=>`c${++KL}`;function JL(e,t){return e.kind===`route`&&t.kind===`route`?e.location===t.location:e.kind===`document`&&t.kind===`document`&&e.document.id===t.document.id&&e.workspaceId===t.workspaceId}function YL({children:e}){let t=vn(),n=ft(),[r,i]=(0,X.useState)([GL]),[a,o]=(0,X.useState)(0),[s,c]=(0,X.useState)(S),l=(0,X.useRef)(r),u=(0,X.useRef)(a),d=(0,X.useRef)(s);(0,X.useEffect)(()=>{l.current=r,u.current=a,d.current=s},[r,a,s]);let f=(0,X.useCallback)((e,t)=>{let n=l.current.slice();n[e]=t,l.current=n,i(n)},[]),p=(0,X.useCallback)(e=>{let t=u.current,n=l.current[t];n&&f(t,e(n))},[f]),m=t.pathname+t.search;(0,X.useEffect)(()=>{p(e=>e.main===m?e:{...e,main:m})},[m,p]);let h=(0,X.useCallback)(e=>{let t=l.current[u.current];if(!t)return;let n=t.entries.find(t=>JL(e,t));if(n){c(n.id);return}let r={...e,id:qL()},i=t.entries.findIndex(e=>e.id===d.current),a=t.entries.slice();a.splice(i>=0?i+1:0,0,r),p(e=>({...e,entries:a})),d.current=r.id,c(r.id)},[p]),g=(0,X.useCallback)((e,t)=>{h({kind:`document`,document:e,workspaceId:t})},[h]),_=(0,X.useCallback)((e,t)=>{let n=`document-preview`;p(r=>{let i=r.entries.find(e=>e.id===n),a={kind:`document`,id:n,document:e,workspaceId:t,expanded:i?.expanded};return{...r,entries:[a,...r.entries.filter(e=>e.id!==n)]}}),d.current=n,c(n)},[p]),v=(0,X.useCallback)(e=>{p(t=>({...t,entries:t.entries.filter(t=>t.id!==e)})),c(t=>t===e?S:t)},[p]),y=(0,X.useCallback)((e,t)=>{p(n=>({...n,entries:n.entries.map(n=>n.id===e&&n.kind===`route`?{...n,location:t}:n)}))},[p]),b=(0,X.useCallback)(e=>{p(t=>e===`main`?{...t,mainExpanded:!t.mainExpanded}:{...t,entries:t.entries.map(t=>t.id===e?{...t,expanded:!t.expanded}:t)})},[p]),x=(0,X.useCallback)(e=>{let t=l.current[e];t&&(u.current=e,o(e),c(S),n(t.main))},[n]),C=(0,X.useCallback)((e,t,n)=>{let r=l.current.findIndex(t=>t.key===e);if(r>=0){x(r);return}let a=[...l.current,{key:e,label:t,main:n,mainExpanded:!1,entries:[]}];l.current=a,i(a),x(a.length-1)},[x]),w=(0,X.useCallback)(e=>{x(u.current+e)},[x]),T=(0,X.useCallback)(e=>{let t=l.current.findIndex(t=>t.key===e);if(t<=0)return;let n=l.current.filter(t=>t.key!==e);l.current=n,i(n);let r=u.current;r===t?x(Math.min(t,n.length-1)):r>t&&(u.current=r-1,o(r-1))},[x]),E=(0,X.useMemo)(()=>({rows:r,activeRow:a,focus:s,setFocus:c,openCanvas:h,openDocument:g,closeCanvas:v,navigateCanvas:y,toggleExpanded:b,activateRow:C,moveRow:w,closeRow:T}),[r,a,s,h,g,v,y,b,C,w,T]),D=(0,X.useMemo)(()=>({entry:null,open:g,preview:_,close:()=>{}}),[g,_]);return(0,Z.jsx)(It.Provider,{value:E,children:(0,Z.jsx)(ge.Provider,{value:D,children:e})})}function XL(e){return Yt(typeof e==`string`?Rt(e):e)}function ZL({location:e,onNavigate:t}){let n=(0,X.useMemo)(()=>{let t=Rt(e);return{pathname:t.pathname||`/`,search:t.search||``,hash:t.hash||``,state:null,key:e}},[e]),r=(0,X.useMemo)(()=>({basename:`/`,static:!1,useTransitions:void 0,future:{},navigator:{createHref:XL,go:()=>{},push:e=>t(XL(e)),replace:e=>t(XL(e))}}),[t]);return(0,Z.jsx)(mn.Provider,{value:r,children:(0,Z.jsx)(v.Provider,{value:{location:n,navigationType:We.Push},children:(0,Z.jsx)(kt.Provider,{value:{outlet:null,matches:[],isDataRoute:!1},children:(0,Z.jsx)(nt,{children:cF})})})})}var QL=`input, textarea, select, [contenteditable=""], [contenteditable="true"]`,$L=420,eR=e=>e<=0?0:e>=1?1:e<.5?2**(20*e-10)/2:(2-2**(-20*e+10))/2;function tR(e,t,n){if(window.matchMedia(`(prefers-reduced-motion: reduce)`).matches)return e.scrollLeft=t,n?.(),()=>{};let r=e.scrollLeft,i=t-r;if(Math.abs(i)<1)return n?.(),()=>{};let a=e.style.scrollSnapType;e.style.scrollSnapType=`none`;let o=performance.now(),s=0,c=t=>{let l=Math.min(1,(t-o)/$L);e.scrollLeft=r+i*eR(l),l<1?s=requestAnimationFrame(c):(e.style.scrollSnapType=a,n?.())};return s=requestAnimationFrame(c),()=>{cancelAnimationFrame(s),e.style.scrollSnapType=a}}function nR(e,t){let n=parseFloat(getComputedStyle(e).gap)||0,r=t.getBoundingClientRect().left-e.getBoundingClientRect().left+e.scrollLeft,i=r+t.offsetWidth,a=e.scrollLeft,o=a+e.clientWidth;return r<a?Math.max(0,r-n):i>o?i+n-e.clientWidth:a}function rR({section:e}){return e===`contexts`?(0,Z.jsx)(zF,{}):e===`workspaces`?(0,Z.jsx)(sI,{}):e===`agents`?(0,Z.jsx)(LI,{}):e===`admin`?(0,Z.jsx)(UI,{}):e===`apps`?(0,Z.jsx)(rw,{}):e===`settings`?(0,Z.jsx)(UI,{}):null}function iR(e,t,n){if(e?.kind===`document`)return Ho(e.document).title;let r=(e?.kind===`route`?e.location:t).split(/[?#]/)[0];if(r===`/settings`)return`Settings`;let i=SC.flatMap(e=>[...e.items]).find(e=>e.path===r);if(i)return i.label;let a=r.split(`/`).filter(Boolean);if(a.length===0)return`Desk`;if(a[0]===`workspaces`&&a.length===2){let e=decodeURIComponent(a[1]),t=n.find(t=>t.id===e)??n.find(t=>t.name===e);return t?.label||t?.name||`Workspace`}return decodeURIComponent(a[a.length-1])}function aR({id:e,title:t,expanded:n,focused:r,onFocus:i,onToggleExpanded:a,onClose:o,badge:s,contentHeader:c,children:l}){let u=w();return(0,Z.jsxs)(`section`,{"data-reader-pane":c?!0:void 0,style:c&&!n?{"--reader-width":`${u??420}px`,...u?{transition:`none`}:{}}:void 0,"data-strip-col":e,className:K(`strip-canvas surface-sheet relative`,n&&`strip-canvas--wide`,r&&`strip-canvas--focused`),onPointerDownCapture:()=>i(e),"aria-label":t,children:[c&&!n&&(0,Z.jsx)(je,{edge:`right`}),!c&&(0,Z.jsxs)(`header`,{className:`strip-canvas-bar`,children:[s&&(0,Z.jsx)(`span`,{className:`strip-row-label`,children:s}),(0,Z.jsx)(`span`,{className:`strip-canvas-title`,title:t,children:t}),(0,Z.jsx)(`button`,{type:`button`,className:`strip-canvas-btn`,title:n?`Card size`:`Expand to full width`,"aria-pressed":n,onClick:()=>a(e),children:n?(0,Z.jsx)(ei,{className:`size-3.5`}):(0,Z.jsx)(ba,{className:`size-3.5`})}),o&&(0,Z.jsx)(`button`,{type:`button`,className:`strip-canvas-btn`,title:s?`Close row`:`Close canvas`,onClick:()=>o(e),children:(0,Z.jsx)(vr,{className:`size-3.5`})})]}),(0,Z.jsx)(`div`,{className:`strip-canvas-body`,children:l})]})}function oR(e){return K(`relative flex-1 min-h-0 min-w-0 overflow-auto`,!JI(e)&&!qI(e)&&`p-page`)}function sR({row:e,pathname:t,rowLabel:n,onCloseRow:r,workspaces:i}){let{focus:a,setFocus:o,toggleExpanded:s,closeCanvas:c,navigateCanvas:l}=Nt(),u=(0,X.useCallback)(e=>t=>l(e,t),[l]);return(0,Z.jsxs)(Z.Fragment,{children:[t===`/`?(0,Z.jsx)(`div`,{hidden:!0,children:(0,Z.jsx)(Gt,{})}):(0,Z.jsx)(aR,{id:S,title:iR(null,t,i),expanded:e.mainExpanded,focused:a===S,onFocus:o,onToggleExpanded:s,badge:n,onClose:r,children:(0,Z.jsx)(`main`,{id:`content-area`,className:oR(t),children:(0,Z.jsx)(Gt,{})})}),e.entries.map(e=>(0,Z.jsx)(aR,{id:e.id,title:iR(e,t,i),expanded:!!e.expanded,focused:a===e.id,onFocus:o,onToggleExpanded:s,contentHeader:e.kind===`document`,onClose:c,children:e.kind===`route`?(0,Z.jsx)(`div`,{className:oR(e.location.split(`?`)[0]),children:(0,Z.jsx)(ZL,{location:e.location,onNavigate:u(e.id)})}):(0,Z.jsx)(`div`,{className:`flex flex-1 min-h-0 min-w-0 items-stretch`,children:(0,Z.jsx)(O,{entry:e,onClose:()=>c(e.id),frame:{expanded:!!e.expanded,onToggleExpanded:()=>s(e.id)}})})},e.id))]})}function cR({row:e,workspaces:t}){return(0,Z.jsxs)(`div`,{className:`strip-ghost-row`,"aria-hidden":!0,children:[(0,Z.jsx)(`span`,{className:`strip-ghost-chip strip-ghost-chip--main`,children:iR(null,e.main,t)}),e.entries.map(n=>(0,Z.jsx)(`span`,{className:`strip-ghost-chip`,children:iR(n,e.main,t)},n.id))]})}function lR(){let{state:e,closeM1:t,closeM2:n}=qC(),[r,i]=(0,X.useState)(280),{rows:a,activeRow:o,focus:s,setFocus:c,moveRow:l,closeRow:u}=Nt(),{pathname:d}=vn(),{workspaces:f}=aI(d.startsWith(`/workspaces/`)||a.some(e=>e.main.startsWith(`/workspaces/`)||e.entries.some(e=>e.kind===`route`&&e.location.startsWith(`/workspaces/`)))),p=UC(),m=(0,X.useRef)(null);Ae(t,e.m1Open&&!e.m2Open),Ae(n,e.m2Open),(0,X.useLayoutEffect)(()=>{let e=m.current;if(!e)return;let t=()=>{e.style.setProperty(`--strip-w`,`${e.clientWidth}px`),e.style.setProperty(`--strip-h`,`${e.clientHeight}px`)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let h=(0,X.useRef)(e.m1Open);(0,X.useEffect)(()=>{e.m1Open&&!h.current&&!e.m2Open&&c(`m1`),h.current=e.m1Open},[e.m1Open,e.m2Open,c]);let g=(0,X.useRef)(e.m2Open);(0,X.useEffect)(()=>{e.m2Open&&!g.current&&c(`m2`),!e.m2Open&&g.current&&s===`m2`&&c(e.m1Open?`m1`:S),g.current=e.m2Open},[e.m2Open,e.m1Open,s,c]),(0,X.useEffect)(()=>{!e.m1Open&&s===`m1`&&c(S)},[e.m1Open,s,c]),(0,X.useEffect)(()=>{let e=m.current,t=e?.querySelector(`[data-strip-col="${CSS.escape(s)}"]`);if(!(!e||!t))return tR(e,nR(e,t))},[s,a,o,e.m1Open,e.m2Open]);let _=(0,X.useCallback)(()=>{let t=a[o];return[...e.m1Open?[`m1`]:[],...e.m2Open?[`m2`]:[],...d===`/`?[]:[S],...t?t.entries.map(e=>e.id):[]]},[a,o,e.m1Open,e.m2Open,d]);return(0,X.useEffect)(()=>{let e=e=>{if(e.defaultPrevented||e.isComposing||!e.key.startsWith(`Arrow`)||!WC(e,p))return;let t=e.target;if(!(t?.closest(QL)||t?.closest(`[role="dialog"]`))){if(e.key===`ArrowLeft`||e.key===`ArrowRight`){let t=_(),n=t[Math.max(0,t.indexOf(s))+(e.key===`ArrowRight`?1:-1)];if(!n)return;e.preventDefault(),c(n)}else(e.key===`ArrowUp`||e.key===`ArrowDown`)&&a.length>1&&(e.preventDefault(),l(e.key===`ArrowDown`?1:-1))}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[_,s,c,l,a.length,p]),(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`strip-shell flex h-viewport w-full overflow-hidden surface-desk gap-shell p-shell`,children:[(0,Z.jsx)(NF,{}),(0,Z.jsxs)(`div`,{ref:m,className:`strip-scroller`,style:{"--strip-menu-space":`${(e.m1Open?280:0)+(e.m2Open?r:0)}px`},children:[e.m1Open&&(0,Z.jsx)(`div`,{"data-strip-col":`m1`,className:K(`strip-col strip-menu-col`,s===`m1`&&`strip-col--focused`),onPointerDownCapture:()=>c(`m1`),children:(0,Z.jsx)(rR,{section:e.activeSection})}),e.m2Open&&(0,Z.jsxs)(`div`,{"data-strip-col":`m2`,style:{width:r,position:`relative`},className:K(`strip-col strip-menu-col`,s===`m2`&&`strip-col--focused`),onPointerDownCapture:()=>c(`m2`),children:[(0,Z.jsx)(GI,{}),(0,Z.jsx)(IF,{width:r,onResize:i})]}),(0,Z.jsx)(`div`,{className:`strip-rows`,style:{transform:`translateY(${-o*100}%)`},children:a.map((e,t)=>(0,Z.jsx)(`div`,{className:K(`strip-row`,t===o&&`strip-row--active`),children:(0,Z.jsx)(`div`,{className:`strip-row-canvases`,children:t===o?(0,Z.jsx)(sR,{row:e,workspaces:f,pathname:d,rowLabel:a.length>1?e.label:void 0,onCloseRow:t>0?()=>u(e.key):void 0}):(0,Z.jsx)(cR,{row:e,workspaces:f})})},e.key))})]}),(0,Z.jsx)(yL,{}),(0,Z.jsx)(RL,{})]}),(0,Z.jsx)(QI,{}),(0,Z.jsx)(MF,{}),(0,Z.jsx)(zL,{})]})}function uR(){let e=PC();return(0,Z.jsx)(gF,{children:(0,Z.jsx)(tL,{children:(0,Z.jsx)(fS,{children:(0,Z.jsx)(Vx,{children:(0,Z.jsx)(UL,{children:e===`strip`?(0,Z.jsx)(YL,{children:(0,Z.jsx)(WL,{children:(0,Z.jsx)(lR,{})})}):(0,Z.jsxs)(WL,{children:[(0,Z.jsxs)(`div`,{className:`flex h-viewport w-full overflow-hidden surface-desk gap-shell p-shell`,children:[(0,Z.jsx)(NF,{}),(0,Z.jsx)(KI,{}),(0,Z.jsx)(ZI,{}),(0,Z.jsx)(yL,{}),(0,Z.jsx)(RL,{})]}),(0,Z.jsx)(QI,{}),(0,Z.jsx)(MF,{}),(0,Z.jsx)(zL,{})]})})})})})})}var dR=da,fR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Ii,{ref:n,className:K(`fixed top-0 right-0 z-toast flex max-h-screen w-full flex-col-reverse gap-2 p-4 sm:right-0 sm:flex-col md:max-w-[420px]`,e),...t}));fR.displayName=Ii.displayName;var pR=Qa(`group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-elevation-3 transition-all duration-normal data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full`,{variants:{variant:{default:`border bg-background`,destructive:`destructive group border-destructive bg-destructive text-destructive-foreground`}},defaultVariants:{variant:`default`}}),mR=X.forwardRef(({className:e,variant:t,...n},r)=>(0,Z.jsx)(na,{ref:r,className:K(pR({variant:t}),e),...n}));mR.displayName=na.displayName;var hR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Oa,{ref:n,className:K(`inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive`,e),...t}));hR.displayName=Oa.displayName;var gR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(wi,{ref:n,className:K(`absolute right-2 top-2 rounded-md p-1 text-foreground/50 reveal-on-hover hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:text-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive group-[.destructive]:focus:ring-offset-destructive`,e),"toast-close":``,...t,children:(0,Z.jsx)(vr,{className:`h-4 w-4`})}));gR.displayName=wi.displayName;var _R=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Vi,{ref:n,className:K(`text-sm font-semibold`,e),...t}));_R.displayName=Vi.displayName;var vR=X.forwardRef(({className:e,...t},n)=>(0,Z.jsx)(Mi,{ref:n,className:K(`text-sm opacity-90`,e),...t}));vR.displayName=Mi.displayName;var yR=`canvas-notifications`,bR=`notifications`,xR=`canvas:notification-history`,SR,CR;function wR(){try{let e=localStorage.getItem(`authToken`);if(e){let t=eo(e),n=t.sub||t.userId||t.id||t.email;if(typeof n==`string`||typeof n==`number`)return JSON.stringify([t.iss||``,n])}}catch{}return`anonymous`}function TR(){return SR||=new Promise((e,t)=>{let n=indexedDB.open(yR,1);n.onupgradeneeded=()=>{n.result.createObjectStore(bR,{keyPath:[`account`,`id`]}).createIndex(`account`,`account`)},n.onsuccess=()=>{let t=n.result;t.onversionchange=()=>{t.close(),SR=void 0},e(t)},n.onerror=()=>t(n.error)}).catch(e=>{throw SR=void 0,e}),SR}function ER(){return!CR&&typeof BroadcastChannel<`u`&&(CR=new BroadcastChannel(xR),CR.onmessage=e=>window.dispatchEvent(new CustomEvent(xR,{detail:e.data}))),CR}function DR(e,t=!1){let n={account:e,error:t};window.dispatchEvent(new CustomEvent(xR,{detail:n})),t||ER()?.postMessage(n)}function OR(e,t){ER();let n=n=>{let r=n.detail;r?.account===e&&t(!!r.error)};return window.addEventListener(xR,n),()=>window.removeEventListener(xR,n)}async function kR(e){let t=await TR();return new Promise((n,r)=>{let i=t.transaction(bR,`readonly`),a=i.objectStore(bR).index(`account`).getAll(e);i.oncomplete=()=>n(a.result.sort((e,t)=>e.timestamp.localeCompare(t.timestamp)||e.id.localeCompare(t.id))),i.onabort=()=>r(i.error),i.onerror=()=>r(i.error)})}async function AR(e,t){try{let n=await TR();await new Promise((e,r)=>{let i=n.transaction(bR,`readwrite`);i.oncomplete=()=>e(),i.onabort=()=>r(i.error),i.onerror=()=>r(i.error),t(i.objectStore(bR))}),DR(e)}catch(t){throw DR(e,!0),t}}function jR(e,t){return AR(e,n=>{let r=n.get([e,t.id]);r.onsuccess=()=>{r.result||n.put({...t,account:e})}})}function MR(e,t,n){return AR(e,r=>{let i=r.get([e,t]);i.onsuccess=()=>{i.result&&r.put({...i.result,...n})}})}function NR(e,t){return AR(e,n=>{n.delete([e,t])})}function PR(e){return AR(e,t=>{let n=t.index(`account`).openKeyCursor(e);n.onsuccess=()=>{n.result&&(t.delete(n.result.primaryKey),n.result.continue())}})}function FR({children:e}){let[t,n]=(0,X.useState)([]),r=(0,X.useRef)(new Set),i=(0,X.useCallback)((e,t=!0)=>{if(ao(e.description)||ao(e.title))return;let i=`${e.title}:${e.description??``}`;if(t&&(e.historyId||!r.current.has(i))){let t=e.timestamp?new Date(e.timestamp):new Date;jR(wR(),{id:e.historyId||crypto.randomUUID(),title:e.title,text:e.description||``,timestamp:Number.isNaN(t.getTime())?new Date().toISOString():t.toISOString(),status:e.variant===`destructive`?`error`:`info`}).catch(()=>{})}if(r.current.has(i))return;r.current.add(i);let a=Math.random().toString(36).substring(2,9);n(t=>[...t,{...e,id:a}]),setTimeout(()=>{n(e=>e.filter(e=>e.id!==a)),r.current.delete(i)},5e3)},[]),a=(0,X.useCallback)(e=>{let t=crypto.randomUUID(),r=wR();jR(r,{id:t,title:e.title,text:e.description||``,timestamp:new Date().toISOString(),status:`started`}).catch(()=>{}),n(n=>[...n,{...e,id:t,busy:!0}]);let a=!1,o=(e,o=!1)=>{a||(a=!0,n(e=>e.filter(e=>e.id!==t)),MR(r,t,{...e?{title:e.title,text:e.description||``}:{},status:o||e?.variant===`destructive`?`error`:`completed`}).catch(()=>{}),e&&i(e,!1))};return{update:e=>{a||n(n=>n.map(n=>n.id===t?{...n,...e}:n))},done:e=>o(e),fail:e=>o(e,!0)}},[i]),o=(0,X.useMemo)(()=>({showToast:i,showProgress:a}),[i,a]);return(0,Z.jsx)(Co.Provider,{value:o,children:(0,Z.jsxs)(dR,{children:[e,t.map(e=>(0,Z.jsxs)(mR,{variant:e.variant,duration:e.busy?1/0:void 0,children:[(0,Z.jsxs)(`div`,{className:`grid gap-1`,children:[(0,Z.jsxs)(_R,{className:`flex items-center gap-2`,children:[e.busy&&(0,Z.jsx)(Ti,{className:`h-3.5 w-3.5 shrink-0 animate-spin`}),e.title]}),e.description!=null&&(0,Z.jsx)(vR,{children:e.description})]}),e.busy&&e.action&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 rounded-md border px-2 py-1 text-xs hover:bg-secondary`,onClick:e.action.onClick,children:e.action.label}),!e.busy&&(0,Z.jsx)(gR,{})]},e.id)),(0,Z.jsx)(fR,{})]})})}function IR({children:e}){let[t]=(0,X.useState)(wR),[n,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(!0),[o,s]=(0,X.useState)(!1),{showToast:c}=wo();(0,X.useEffect)(()=>{let e=!0,n=0,i=async()=>{let i=++n;try{let o=await kR(t);e&&i===n&&(r(o),a(!1))}catch{e&&(s(!0),a(!1))}},o=OR(t,e=>{s(e),e||i()});return i(),()=>{e=!1,o()}},[t]),(0,X.useEffect)(()=>B.on(`notification`,e=>{let t=e;!t||![`string`,`number`].includes(typeof t.id)||typeof t.text!=`string`||!t.text||c({title:`Notification`,description:t.text,historyId:`message:${t.id}`,timestamp:typeof t.timestamp==`string`?t.timestamp:void 0})}),[c]);let l=(0,X.useCallback)(async()=>{try{await PR(t)}catch{}},[t]),u=(0,X.useCallback)(async e=>{try{await NR(t,e)}catch{}},[t]);return(0,Z.jsx)(bL.Provider,{value:{notifications:n,loading:i,storageError:o,clear:l,remove:u},children:e})}var LR=e=>`${e.workspaceName}\0${e.treeName}\0${e.path}`;function RR({children:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(!0);(0,X.useEffect)(()=>{let e=!1;return pI().then(t=>{e||n(t)}).catch(()=>{e||n({})}).finally(()=>{e||i(!1)}),()=>{e=!0}},[]);let a=(0,X.useMemo)(()=>t?.home?.pinnedCanvases??[],[t]),[o]=(0,X.useState)(()=>tD(pI,mI,n)),s=(0,X.useCallback)(e=>a.some(t=>LR(t)===LR(e)),[a]),c=(0,X.useCallback)(async e=>{let t=crypto.randomUUID();await o(n=>n.some(t=>LR(t)===LR(e))?n:[...n,{id:t,...e}])},[o]),l=(0,X.useCallback)(async e=>{await o(t=>t.filter(t=>t.id!==e))},[o]),u=(0,X.useCallback)(async(e,t)=>{await o(n=>n.map(n=>n.id===e?{...n,minimized:t}:n))},[o]),d=(0,X.useCallback)(async(e,t)=>{await o(n=>{let r=n.find(t=>t.id===e);if(!r||e===t)return n;let i=n.filter(t=>t.id!==e),a=t===null?i.length:i.findIndex(e=>e.id===t);return a===-1?n:[...i.slice(0,a),r,...i.slice(a)]})},[o]),f=(0,X.useMemo)(()=>({pins:a,isLoading:r,isPinned:s,pin:c,unpin:l,movePin:d,setMinimized:u}),[a,r,s,c,l,d,u]);return(0,Z.jsx)(XT.Provider,{value:f,children:e})}var zR=(0,X.lazy)(()=>g(()=>import(`./NextShell-Byg6OtC2.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])));function BR(){let{showToast:e}=wo();return(0,X.useEffect)(()=>{so((t,n)=>{e({title:`Error`,description:n?`${t.message} (${n})`:t.message,variant:`destructive`})})},[e]),(0,X.useEffect)(()=>bF(),[]),(0,Z.jsxs)(Ye,{children:[(0,Z.jsx)(pF,{}),(0,Z.jsx)($f,{}),(0,Z.jsxs)(nt,{children:[(0,Z.jsx)(sn,{path:`/login`,element:(0,Z.jsx)(wu,{children:(0,Z.jsx)(bu,{})})}),(0,Z.jsx)(sn,{path:`/register`,element:(0,Z.jsx)(wu,{children:(0,Z.jsx)(xu,{})})}),(0,Z.jsx)(sn,{path:`/auth/google/callback`,element:(0,Z.jsx)(wu,{children:(0,Z.jsx)(Su,{})})}),(0,Z.jsx)(sn,{path:`/pub/c/:code`,element:(0,Z.jsx)(Vf,{})}),(0,Z.jsx)(sn,{path:`/next/*`,element:(0,Z.jsx)(Cu,{children:(0,Z.jsx)(X.Suspense,{fallback:null,children:(0,Z.jsx)(zR,{})})})}),(0,Z.jsx)(sn,{path:`/`,element:(0,Z.jsx)(Cu,{children:(0,Z.jsx)(IR,{children:(0,Z.jsx)(RR,{children:(0,Z.jsx)(uR,{})})})}),children:cF}),(0,Z.jsx)(sn,{path:`*`,element:(0,Z.jsx)(ht,{to:`/`,replace:!0})})]})]})}function VR(){return(0,Z.jsx)(Fk,{children:(0,Z.jsx)(FR,{children:(0,Z.jsx)(BR,{})})})}$O(),GO(),(0,Rl.createRoot)(document.getElementById(`root`)).render((0,Z.jsx)(X.StrictMode,{children:(0,Z.jsx)(VR,{})}));
|